svn_error_t * svn_repos_fs_change_rev_prop3(svn_repos_t *repos, svn_revnum_t rev, const char *author, const char *name, const svn_string_t *new_value, svn_boolean_t use_pre_revprop_change_hook, svn_boolean_t use_post_revprop_change_hook, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *pool) { svn_string_t *old_value; svn_repos_revision_access_level_t readability; char action; SVN_ERR(svn_repos_check_revision_access(&readability, repos, rev, authz_read_func, authz_read_baton, pool)); if (readability == svn_repos_revision_access_full) { SVN_ERR(validate_prop(name, new_value, pool)); SVN_ERR(svn_fs_revision_prop(&old_value, repos->fs, rev, name, pool)); if (! new_value) action = 'D'; else if (! old_value) action = 'A'; else action = 'M'; if (use_pre_revprop_change_hook) SVN_ERR(svn_repos__hooks_pre_revprop_change(repos, rev, author, name, new_value, action, pool)); SVN_ERR(svn_fs_change_rev_prop(repos->fs, rev, name, new_value, pool)); if (use_post_revprop_change_hook) SVN_ERR(svn_repos__hooks_post_revprop_change(repos, rev, author, name, old_value, action, pool)); } 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_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) { svn_repos_revision_access_level_t readability; SVN_ERR(svn_repos_check_revision_access(&readability, repos, rev, authz_read_func, authz_read_baton, pool)); if (readability == svn_repos_revision_access_none) { /* Return an empty hash. */ *table_p = apr_hash_make(pool); } else if (readability == svn_repos_revision_access_partial) { 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_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) { svn_repos_revision_access_level_t readability; SVN_ERR(svn_repos_check_revision_access(&readability, repos, rev, authz_read_func, authz_read_baton, pool)); if (readability == svn_repos_revision_access_none) { /* Property? What property? */ *value_p = NULL; } else if (readability == svn_repos_revision_access_partial) { /* 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_change_rev_prop4(svn_repos_t *repos, svn_revnum_t rev, const char *author, const char *name, const svn_string_t *const *old_value_p, const svn_string_t *new_value, svn_boolean_t use_pre_revprop_change_hook, svn_boolean_t use_post_revprop_change_hook, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *pool) { svn_repos_revision_access_level_t readability; SVN_ERR(svn_repos_check_revision_access(&readability, repos, rev, authz_read_func, authz_read_baton, pool)); if (readability == svn_repos_revision_access_full) { const svn_string_t *old_value; char action; apr_hash_t *hooks_env; SVN_ERR(svn_repos__validate_prop(name, new_value, pool)); /* Fetch OLD_VALUE for svn_fs_change_rev_prop2(). */ if (old_value_p) { old_value = *old_value_p; } else { /* Get OLD_VALUE anyway, in order for ACTION and OLD_VALUE arguments * to the hooks to be accurate. */ svn_string_t *old_value2; SVN_ERR(svn_fs_revision_prop(&old_value2, repos->fs, rev, name, pool)); old_value = old_value2; } /* Prepare ACTION. */ if (! new_value) action = 'D'; else if (! old_value) action = 'A'; else action = 'M'; /* Parse the hooks-env file (if any, and if to be used). */ if (use_pre_revprop_change_hook || use_post_revprop_change_hook) SVN_ERR(svn_repos__parse_hooks_env(&hooks_env, repos->hooks_env_path, pool, pool)); /* ### currently not passing the old_value to hooks */ if (use_pre_revprop_change_hook) SVN_ERR(svn_repos__hooks_pre_revprop_change(repos, hooks_env, rev, author, name, new_value, action, pool)); SVN_ERR(svn_fs_change_rev_prop2(repos->fs, rev, name, &old_value, new_value, pool)); if (use_post_revprop_change_hook) SVN_ERR(svn_repos__hooks_post_revprop_change(repos, hooks_env, rev, author, name, old_value, action, pool)); } 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; }