Author: danielsh
Date: Fri Jul 23 19:13:52 2010
New Revision: 967212

URL: http://svn.apache.org/viewvc?rev=967212&view=rev
Log:
On the 'atomic-revprop' branch:

Implement atomic revprop changes support in libsvn_repos.

* subversion/include/svn_repos.h
  (svn_repos_fs_change_rev_prop4):  New.
  (svn_repos_fs_change_rev_prop3):  Deprecate.

* subversion/libsvn_repos/deprecated.c
  (svn_repos_fs_change_rev_prop3):
    Reimplement as wrapper around svn_repos_fs_change_rev_prop3().

* subversion/libsvn_repos/fs-wrap.c
  (svn_repos_fs_change_rev_prop3):  Rename to svn_repos_fs_change_rev_prop4().
  (svn_repos_fs_change_rev_prop4):
    Add OLD_VALUE_P parameter and, if supplied, pass it to the FS layer.

Modified:
    subversion/branches/atomic-revprop/subversion/include/svn_repos.h
    subversion/branches/atomic-revprop/subversion/libsvn_repos/deprecated.c
    subversion/branches/atomic-revprop/subversion/libsvn_repos/fs-wrap.c

Modified: subversion/branches/atomic-revprop/subversion/include/svn_repos.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/include/svn_repos.h?rev=967212&r1=967211&r2=967212&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/include/svn_repos.h (original)
+++ subversion/branches/atomic-revprop/subversion/include/svn_repos.h Fri Jul 
23 19:13:52 2010
@@ -1994,28 +1994,55 @@ svn_repos_fs_get_locks(apr_hash_t **lock
 /** @} */
 
 /**
- * Like svn_fs_change_rev_prop(), but validate the name and value of the
+ * Like svn_fs_change_rev_prop2(), but validate the name and value of the
  * property and invoke the @a repos's pre- and post-revprop-change hooks
  * around the change as specified by @a use_pre_revprop_change_hook and
  * @a use_post_revprop_change_hook (respectively).
  *
  * @a rev is the revision whose property to change, @a name is the
  * name of the property, and @a new_value is the new value of the
- * property.   @a author is the authenticated username of the person
+ * property.   If @a old_value_p is not @c NULL, then @a *old_value_p
+ * is the expected current (preexisting) value of the property (or @c NULL
+ * for "unset").  @a author is the authenticated username of the person
  * changing the property value, or NULL if not available.
  *
  * If @a authz_read_func is non-NULL, then use it (with @a
  * authz_read_baton) to validate the changed-paths associated with @a
  * rev.  If the revision contains any unreadable changed paths, then
- * return SVN_ERR_AUTHZ_UNREADABLE.
+ * return #SVN_ERR_AUTHZ_UNREADABLE.
  *
  * Validate @a name and @a new_value like the same way
  * svn_repos_fs_change_node_prop() does.
  *
  * Use @a pool for temporary allocations.
  *
+ * @since New in 1.7.
+ */
+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);
+
+/**
+ * Similar to svn_repos_fs_change_rev_prop3(), but with @a old_value_p always
+ * set to @c NULL.  (In other words, it is similar to
+ * svn_fs_change_rev_prop().)
+ *
+ * @deprecated Provided for backward compatibility with the 1.6 API.
  * @since New in 1.5.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_repos_fs_change_rev_prop3(svn_repos_t *repos,
                               svn_revnum_t rev,

Modified: 
subversion/branches/atomic-revprop/subversion/libsvn_repos/deprecated.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_repos/deprecated.c?rev=967212&r1=967211&r2=967212&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_repos/deprecated.c 
(original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_repos/deprecated.c Fri 
Jul 23 19:13:52 2010
@@ -328,6 +328,26 @@ svn_repos_replay(svn_fs_root_t *root,
 
 /*** From fs-wrap.c ***/
 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)
+{
+  return svn_repos_fs_change_rev_prop4(repos, rev, author, name, NULL,
+                                       new_value,
+                                       use_pre_revprop_change_hook,
+                                       use_post_revprop_change_hook,
+                                       authz_read_func,
+                                       authz_read_baton, pool);
+}
+
+svn_error_t *
 svn_repos_fs_change_rev_prop2(svn_repos_t *repos,
                               svn_revnum_t rev,
                               const char *author,

Modified: subversion/branches/atomic-revprop/subversion/libsvn_repos/fs-wrap.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/atomic-revprop/subversion/libsvn_repos/fs-wrap.c?rev=967212&r1=967211&r2=967212&view=diff
==============================================================================
--- subversion/branches/atomic-revprop/subversion/libsvn_repos/fs-wrap.c 
(original)
+++ subversion/branches/atomic-revprop/subversion/libsvn_repos/fs-wrap.c Fri 
Jul 23 19:13:52 2010
@@ -263,10 +263,11 @@ svn_repos_fs_change_txn_prop(svn_fs_txn_
 
 
 svn_error_t *
-svn_repos_fs_change_rev_prop3(svn_repos_t *repos,
+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,
@@ -274,7 +275,6 @@ svn_repos_fs_change_rev_prop3(svn_repos_
                               void *authz_read_baton,
                               apr_pool_t *pool)
 {
-  svn_string_t *old_value;
   svn_repos_revision_access_level_t readability;
   char action;
 
@@ -284,9 +284,26 @@ svn_repos_fs_change_rev_prop3(svn_repos_
 
   if (readability == svn_repos_revision_access_full)
     {
+      const svn_string_t *old_value;
+
       SVN_ERR(validate_prop(name, new_value, pool));
-      SVN_ERR(svn_fs_revision_prop(&old_value, repos->fs, rev, name, 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)
@@ -294,12 +311,13 @@ svn_repos_fs_change_rev_prop3(svn_repos_
       else
         action = 'M';
 
+      /* ### currently not passing the old_value to hooks */
       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_prop2(repos->fs, rev, name, NULL, 
-                                      new_value, 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, rev, author,  name,


Reply via email to