📄 fs-wrap.c
字号:
else /* rev is either unreadable or only partially readable */ { return svn_error_createf (SVN_ERR_AUTHZ_UNREADABLE, NULL, _("Write denied: not authorized to read all of revision %ld"), rev); } return SVN_NO_ERROR;}svn_error_t *svn_repos_fs_change_rev_prop(svn_repos_t *repos, svn_revnum_t rev, const char *author, const char *name, const svn_string_t *new_value, apr_pool_t *pool){ return svn_repos_fs_change_rev_prop2(repos, rev, author, name, new_value, NULL, NULL, pool); } svn_error_t *svn_repos_fs_revision_prop(svn_string_t **value_p, svn_repos_t *repos, svn_revnum_t rev, const char *propname, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *pool){ int readability = rev_readable; if (authz_read_func) SVN_ERR(get_readability(&readability, repos->fs, rev, authz_read_func, authz_read_baton, pool)); if (readability == rev_unreadable) { /* Property? What property? */ *value_p = NULL; } else if (readability == rev_partially_readable) { /* Only svn:author and svn:date are fetchable. */ if ((strncmp(propname, SVN_PROP_REVISION_AUTHOR, strlen(SVN_PROP_REVISION_AUTHOR)) != 0) && (strncmp(propname, SVN_PROP_REVISION_DATE, strlen(SVN_PROP_REVISION_DATE)) != 0)) *value_p = NULL; else SVN_ERR(svn_fs_revision_prop(value_p, repos->fs, rev, propname, pool)); } else /* wholly readable revision */ { SVN_ERR(svn_fs_revision_prop(value_p, repos->fs, rev, propname, pool)); } return SVN_NO_ERROR;}svn_error_t *svn_repos_fs_revision_proplist(apr_hash_t **table_p, svn_repos_t *repos, svn_revnum_t rev, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *pool){ int readability = rev_readable; if (authz_read_func) SVN_ERR(get_readability(&readability, repos->fs, rev, authz_read_func, authz_read_baton, pool)); if (readability == rev_unreadable) { /* Return an empty hash. */ *table_p = apr_hash_make(pool); } else if (readability == rev_partially_readable) { apr_hash_t *tmphash; svn_string_t *value; /* Produce two property hashtables, both in POOL. */ SVN_ERR(svn_fs_revision_proplist(&tmphash, repos->fs, rev, pool)); *table_p = apr_hash_make(pool); /* If they exist, we only copy svn:author and svn:date into the 'real' hashtable being returned. */ value = apr_hash_get(tmphash, SVN_PROP_REVISION_AUTHOR, APR_HASH_KEY_STRING); if (value) apr_hash_set(*table_p, SVN_PROP_REVISION_AUTHOR, APR_HASH_KEY_STRING, value); value = apr_hash_get(tmphash, SVN_PROP_REVISION_DATE, APR_HASH_KEY_STRING); if (value) apr_hash_set(*table_p, SVN_PROP_REVISION_DATE, APR_HASH_KEY_STRING, value); } else /* wholly readable revision */ { SVN_ERR(svn_fs_revision_proplist(table_p, repos->fs, rev, pool)); } return SVN_NO_ERROR;}svn_error_t *svn_repos_fs_lock(svn_lock_t **lock, svn_repos_t *repos, const char *path, const char *token, const char *comment, svn_boolean_t is_dav_comment, apr_time_t expiration_date, svn_revnum_t current_rev, svn_boolean_t steal_lock, apr_pool_t *pool){ svn_error_t *err; svn_fs_access_t *access_ctx = NULL; const char *username = NULL; apr_array_header_t *paths; /* Setup an array of paths in anticipation of the ra layers handling multiple locks in one request (1.3 most likely). This is only used by svn_repos__hooks_post_lock. */ paths = apr_array_make(pool, 1, sizeof(const char *)); APR_ARRAY_PUSH(paths, const char *) = path; SVN_ERR(svn_fs_get_access(&access_ctx, repos->fs)); if (access_ctx) SVN_ERR(svn_fs_access_get_username(&username, access_ctx)); if (! username) return svn_error_createf (SVN_ERR_FS_NO_USER, NULL, "Cannot lock path '%s', no authenticated username available.", path); /* Run pre-lock hook. This could throw error, preventing svn_fs_lock() from happening. */ SVN_ERR(svn_repos__hooks_pre_lock(repos, path, username, pool)); /* Lock. */ SVN_ERR(svn_fs_lock(lock, repos->fs, path, token, comment, is_dav_comment, expiration_date, current_rev, steal_lock, pool)); /* Run post-lock hook. */ if ((err = svn_repos__hooks_post_lock(repos, paths, username, pool))) return svn_error_create (SVN_ERR_REPOS_POST_LOCK_HOOK_FAILED, err, "Lock succeeded, but post-lock hook failed"); return SVN_NO_ERROR;}svn_error_t *svn_repos_fs_unlock(svn_repos_t *repos, const char *path, const char *token, svn_boolean_t break_lock, apr_pool_t *pool){ svn_error_t *err; svn_fs_access_t *access_ctx = NULL; const char *username = NULL; /* Setup an array of paths in anticipation of the ra layers handling multiple locks in one request (1.3 most likely). This is only used by svn_repos__hooks_post_lock. */ apr_array_header_t *paths = apr_array_make(pool, 1, sizeof(const char *)); APR_ARRAY_PUSH(paths, const char *) = path; SVN_ERR(svn_fs_get_access(&access_ctx, repos->fs)); if (access_ctx) SVN_ERR(svn_fs_access_get_username(&username, access_ctx)); if (! break_lock && ! username) return svn_error_createf (SVN_ERR_FS_NO_USER, NULL, _("Cannot unlock path '%s', no authenticated username available"), path); /* Run pre-unlock hook. This could throw error, preventing svn_fs_unlock() from happening. */ SVN_ERR(svn_repos__hooks_pre_unlock(repos, path, username, pool)); /* Unlock. */ SVN_ERR(svn_fs_unlock(repos->fs, path, token, break_lock, pool)); /* Run post-unlock hook. */ if ((err = svn_repos__hooks_post_unlock(repos, paths, username, pool))) return svn_error_create (SVN_ERR_REPOS_POST_UNLOCK_HOOK_FAILED, err, _("Unlock succeeded, but post-unlock hook failed")); return SVN_NO_ERROR;}struct get_locks_baton_t{ svn_fs_t *fs; svn_fs_root_t *head_root; svn_repos_authz_func_t authz_read_func; void *authz_read_baton; apr_hash_t *locks;};/* This implements the svn_fs_get_locks_callback_t interface. */static svn_error_t *get_locks_callback(void *baton, svn_lock_t *lock, apr_pool_t *pool){ struct get_locks_baton_t *b = baton; svn_boolean_t readable = TRUE; apr_pool_t *hash_pool = apr_hash_pool_get(b->locks); /* If there's auth to deal with, deal with it. */ if (b->authz_read_func) { SVN_ERR(b->authz_read_func(&readable, b->head_root, lock->path, b->authz_read_baton, pool)); } /* If we can read this lock path, add the lock to the return hash. */ if (readable) apr_hash_set(b->locks, apr_pstrdup(hash_pool, lock->path), APR_HASH_KEY_STRING, svn_lock_dup(lock, hash_pool)); return SVN_NO_ERROR;}svn_error_t *svn_repos_fs_get_locks(apr_hash_t **locks, svn_repos_t *repos, const char *path, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *pool){ apr_hash_t *all_locks = apr_hash_make(pool); svn_revnum_t head_rev; struct get_locks_baton_t baton; /* Locks are always said to apply to HEAD revision, so we'll check to see if locked-paths are readable in HEAD as well. */ SVN_ERR(svn_fs_youngest_rev(&head_rev, repos->fs, pool)); /* Populate our callback baton. */ baton.fs = repos->fs; baton.locks = all_locks; baton.authz_read_func = authz_read_func; baton.authz_read_baton = authz_read_baton; SVN_ERR(svn_fs_revision_root(&(baton.head_root), repos->fs, head_rev, pool)); /* Get all the locks. */ SVN_ERR(svn_fs_get_locks(repos->fs, path, get_locks_callback, &baton, pool)); *locks = baton.locks; return SVN_NO_ERROR;}/* * vim:ts=4:sw=4:expandtab:tw=80:fo=tcroq * vim:isk=a-z,A-Z,48-57,_,.,-,> * vim:cino=>1s,e0,n0,f0,{.5s,}0,^-.5s,=.5s,t0,+1s,c3,(0,u0,\:0 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -