Author: breser
Date: Thu Mar 28 05:09:45 2013
New Revision: 1461955

URL: http://svn.apache.org/r1461955
Log:
Merge r947833 from trunk.

Dealt with conflicts in deadprops.c since the save_value function
has been refactored.

Modified:
    subversion/branches/1.6.x-r947833/   (props changed)
    subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/dav_svn.h
    subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/deadprops.c

Propchange: subversion/branches/1.6.x-r947833/
------------------------------------------------------------------------------
  Merged /subversion/trunk:r947833

Modified: subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/dav_svn.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/dav_svn.h?rev=1461955&r1=1461954&r2=1461955&view=diff
==============================================================================
--- subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/dav_svn.h 
(original)
+++ subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/dav_svn.h Thu Mar 
28 05:09:45 2013
@@ -254,6 +254,9 @@ struct dav_resource_private {
      interface (ie: /path/to/item?p=PEGREV]? */
   svn_boolean_t pegged;
 
+  /* Cache any revprop change error */
+  svn_error_t *revprop_error;
+
   /* Pool to allocate temporary data from */
   apr_pool_t *pool;
 };

Modified: subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/deadprops.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/deadprops.c?rev=1461955&r1=1461954&r2=1461955&view=diff
==============================================================================
--- subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/deadprops.c 
(original)
+++ subversion/branches/1.6.x-r947833/subversion/mod_dav_svn/deadprops.c Thu 
Mar 28 05:09:45 2013
@@ -49,8 +49,7 @@ struct dav_db {
 
 
 struct dav_deadprop_rollback {
-  dav_prop_name name;
-  svn_string_t value;
+  int dummy;
 };
 
 
@@ -170,6 +169,14 @@ save_value(dav_db *db, const dav_prop_na
            db->authz_read_baton,
            db->resource->pool);
 
+        /* mod_dav doesn't handle the returned error very well, it
+           generates its own generic error that will be returned to
+           the client.  Cache the detailed error here so that it can
+           be returned a second time when the rollback mechanism
+           triggers. */
+        if (serr)
+          db->resource->info->revprop_error = svn_error_dup(serr);
+
         /* Tell the logging subsystem about the revprop change. */
         dav_svn__operational_log(db->resource->info,
                                  svn_log__change_rev_prop(
@@ -598,19 +605,14 @@ db_get_rollback(dav_db *db,
                 const dav_prop_name *name,
                 dav_deadprop_rollback **prollback)
 {
-  dav_error *err;
-  dav_deadprop_rollback *ddp;
-  svn_string_t *propval;
-
-  if ((err = get_value(db, name, &propval)) != NULL)
-    return err;
+  /* This gets called by mod_dav in preparation for a revprop change.
+     mod_dav_svn doesn't need to make any changes during rollback, but
+     we want the rollback mechanism to trigger.  Making changes in
+     response to post-revprop-change hook errors would be positively
+     wrong. */
 
-  ddp = apr_palloc(db->p, sizeof(*ddp));
-  ddp->name = *name;
-  ddp->value.data = propval ? propval->data : NULL;
-  ddp->value.len = propval ? propval->len : 0;
+  *prollback = apr_palloc(db->p, sizeof(dav_deadprop_rollback));
 
-  *prollback = ddp;
   return NULL;
 }
 
@@ -618,12 +620,20 @@ db_get_rollback(dav_db *db,
 static dav_error *
 db_apply_rollback(dav_db *db, dav_deadprop_rollback *rollback)
 {
-  if (rollback->value.data == NULL)
-    {
-      return db_remove(db, &rollback->name);
-    }
+  dav_error *derr;
+
+  if (! db->resource->info->revprop_error)
+    return NULL;
+  
+  /* Returning the original revprop change error here will cause this
+     detailed error to get returned to the client in preference to the
+     more generic error created by mod_dav. */
+  derr = dav_svn__convert_err(db->resource->info->revprop_error,
+                              HTTP_INTERNAL_SERVER_ERROR, NULL,
+                              db->resource->pool);
+  db->resource->info->revprop_error = NULL;
 
-  return save_value(db, &rollback->name, &rollback->value);
+  return derr;
 }
 
 


Reply via email to