subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From phi...@apache.org
Subject svn commit: r1080529 - in /subversion/trunk: notes/http-and-webdav/ subversion/include/ subversion/libsvn_ra_neon/ subversion/libsvn_ra_serf/ subversion/mod_dav_svn/ subversion/mod_dav_svn/posts/
Date Fri, 11 Mar 2011 11:26:38 GMT
Author: philip
Date: Fri Mar 11 11:26:37 2011
New Revision: 1080529

URL: http://svn.apache.org/viewvc?rev=1080529&view=rev
Log:
Extend Subversion's v2 HTTP protocol to include URIs that allow the
client to define the transaction name visible on the wire.

If the client sends, or a proxy injects, an SVN-VTxn-Name header with
the POST request it defines the transaction name to be returned to the
client in the POST response.  If the client recieves the new
SVN-VTxn-Name header it uses that name in the new URIs in the requests
that make up the commit.

By default the client will not send the new header.

* subversion/include/svn_dav.h
  (SVN_DAV_VTXN_STUB_HEADER, SVN_DAV_VTXN_ROOT_STUB_HEADER,
   SVN_DAV_VTXN_NAME_HEADER): New.

* subversion/mod_dav_svn/dav_svn.h
  (struct dav_svn_root): Add vtxn_name member.
  (dav_svn__get_vtxn_stub, dav_svn__get_vtxn_root_stub): New.

* subversion/mod_dav_svn/mod_dav_svn.c
  (dav_svn__get_vtxn_stub, dav_svn__get_vtxn_root_stub): New.

* subversion/mod_dav_svn/posts/create_txn.c
  (dav_svn__post_create_txn): Get vtxn_name from header, store
   vtxn_name:txn_name mapping in the activity database, send vtxn
   header.

* subversion/mod_dav_svn/version.c
  (get_option): Add vtxn stub and vtxn root stub headers.
  (merge): Delete vtxn_name:txn_name mapping after commit.

* subversion/mod_dav_svn/repos.c
  (parse_vtxnstub_uri, parse_vtxnroot_uri): New.
  (special_subdirs): Add vtxn and vtxr.
  (remove_resource): Delete mapping when aborting the transaction.

* subversion/libsvn_ra_serf/ra_serf.h
  (struct svn_ra_serf__session_t): Add vtxn_stub and vtxn_root_stub.

* subversion/libsvn_ra_serf/commit.c
  (setup_post_headers): New.
  (post_headers_iterator_callback): Handle vtxn name header.
  (open_root): Set header_delegate.

* subversion/libsvn_ra_serf/options.c
  (capabilities_headers_iterator_callback): Support vtxn stub and
   vtxn root stub headers.

* subversion/libsvn_ra_neon/ra_neon.h
  (struct svn_ra_neon__session_t): Add vtxn_stub and vtxn_root_stub.

* subversion/libsvn_ra_neon/options.c
  (parse_capabilities): Support vtxn stub and vtxn root stub headers.

* notes/http-and-webdav/http-protocol-v2.txt: Update.

Modified:
    subversion/trunk/notes/http-and-webdav/http-protocol-v2.txt
    subversion/trunk/subversion/include/svn_dav.h
    subversion/trunk/subversion/libsvn_ra_neon/options.c
    subversion/trunk/subversion/libsvn_ra_neon/ra_neon.h
    subversion/trunk/subversion/libsvn_ra_serf/commit.c
    subversion/trunk/subversion/libsvn_ra_serf/options.c
    subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h
    subversion/trunk/subversion/mod_dav_svn/dav_svn.h
    subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c
    subversion/trunk/subversion/mod_dav_svn/posts/create_txn.c
    subversion/trunk/subversion/mod_dav_svn/repos.c
    subversion/trunk/subversion/mod_dav_svn/version.c

Modified: subversion/trunk/notes/http-and-webdav/http-protocol-v2.txt
URL: http://svn.apache.org/viewvc/subversion/trunk/notes/http-and-webdav/http-protocol-v2.txt?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/notes/http-and-webdav/http-protocol-v2.txt (original)
+++ subversion/trunk/notes/http-and-webdav/http-protocol-v2.txt Fri Mar 11 11:26:37 2011
@@ -128,6 +128,14 @@ PHASE 1 IN DETAIL
        Various read- and write-type requests can be issued against
        these resources (MKCOL, PUT, PROPFIND, PROPPATCH, GET, etc.).
 
+     - alternate transaction resource (!svn/vtxn/VTXN-NAME)
+       alternate transaction root resource (!svn/vtxr/VTXN-NAME/[PATH])
+
+       Alternative names for the transaction based on a virtual, or
+       visible, name supplied by the client when the transaction
+       was created.  The client supplied name is optional, if not
+       supplied these resource names are not valid.
+
  * Opening an RA session:
 
    ra_serf will send an OPTIONS request when creating a new
@@ -144,6 +152,8 @@ PHASE 1 IN DETAIL
      SVN-Rev-Root-Stub:  /REPOS-ROOT/!svn/rvr
      SVN-Txn-Stub:  /REPOS-ROOT/!svn/txn
      SVN-Txn-Root-Stub:  /REPOS-ROOT/!svn/txr
+     SVN-VTxn-Stub:  /REPOS-ROOT/!svn/vtxn
+     SVN-VTxn-Root-Stub:  /REPOS-ROOT/!svn/vtxr
 
    The presence of these new stubs (which can be appended to by the
    client to create full-fledged resource URLs) tells ra_serf that
@@ -220,11 +230,17 @@ PHASE 1 IN DETAIL
 
        - no more need to "discover" the activity URI;  !svn/act/ is gone.
 
-       - client no longer creates an activity UUID itself.
+       - client no longer needs to create an activity UUID itself.
 
        - instead, POST returns the name of the transaction it created,
-         which can then be appended to the transaction stub and
-         transaction root stub as necessary.
+         as TXN-NAME, which can then be appended to the transaction
+         stub and transaction root stub as necessary.
+
+       - if the client does choose to supply a UUID with the POST
+         request then the POST returns that UUID as VTXN-NAME, instead of
+         returning TXN-NAME, and the client then uses that with the
+         alternate transaction stub and transaction root stub in subsequent
+         requests.
 
      - Once the commit transaction is created, the client is free to
        send write requests against transaction resources it constructs

Modified: subversion/trunk/subversion/include/svn_dav.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_dav.h?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_dav.h (original)
+++ subversion/trunk/subversion/include/svn_dav.h Fri Mar 11 11:26:37 2011
@@ -133,6 +133,11 @@ extern "C" {
  * from a "txn root").  (HTTP protocol v2 only)  */
 #define SVN_DAV_TXN_STUB_HEADER "SVN-Txn-Stub"
 
+/** Companion to @c SVN_DAV_TXN_STUB_HEADER, used when a POST request
+ *  returns @c SVN_DAV_VTXN_NAME_HEADER in response to a client
+ *  supplied name.  (HTTP protocol v2 only)  */
+#define SVN_DAV_VTXN_STUB_HEADER "SVN-VTxn-Stub"
+
 /** This header provides an opaque URI which represents the root
  * directory of a Subversion transaction (revision-in-progress),
  * similar to the concept of a "txn root" in the libsvn_fs API.  The
@@ -141,6 +146,11 @@ extern "C" {
  * protocol v2 only)  */
 #define SVN_DAV_TXN_ROOT_STUB_HEADER "SVN-Txn-Root-Stub"
 
+/** Companion to @c SVN_DAV_TXN_ROOT_STUB_HEADER, used when a POST
+ *  request returns @c SVN_DAV_VTXN_NAME_HEADER in response to a
+ *  client supplied name.  (HTTP protocol v2 only)  */
+#define SVN_DAV_VTXN_ROOT_STUB_HEADER "SVN-VTxn-Root-Stub"
+
 /** This header is used in the POST response to tell the client the
  * name of the Subversion transaction created by the request.  It can
  * then be appended to the transaction stub and transaction root stub
@@ -148,6 +158,12 @@ extern "C" {
  * transaction.  (HTTP protocol v2 only)  */
 #define SVN_DAV_TXN_NAME_HEADER "SVN-Txn-Name"
 
+/** This header is used in the POST request, to pass a client supplied
+ * alternative transaction name to the server, and in the the POST
+ * response, to tell the client that the alternative transaction
+ * resource names should be used.  (HTTP protocol v2 only)  */
+#define SVN_DAV_VTXN_NAME_HEADER "SVN-VTxn-Name"
+
 /**
  * @name Fulltext MD5 headers
  *

Modified: subversion/trunk/subversion/libsvn_ra_neon/options.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_neon/options.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_neon/options.c (original)
+++ subversion/trunk/subversion/libsvn_ra_neon/options.c Fri Mar 11 11:26:37 2011
@@ -253,6 +253,14 @@ parse_capabilities(ne_request *req,
     {
       ras->txn_stub = apr_pstrdup(ras->pool, val);
     }
+  if ((val = ne_get_response_header(req, SVN_DAV_VTXN_ROOT_STUB_HEADER)))
+    {
+      ras->vtxn_root_stub = apr_pstrdup(ras->pool, val);
+    }
+  if ((val = ne_get_response_header(req, SVN_DAV_VTXN_STUB_HEADER)))
+    {
+      ras->vtxn_stub = apr_pstrdup(ras->pool, val);
+    }
 }
 
 

Modified: subversion/trunk/subversion/libsvn_ra_neon/ra_neon.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_neon/ra_neon.h?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_neon/ra_neon.h (original)
+++ subversion/trunk/subversion/libsvn_ra_neon/ra_neon.h Fri Mar 11 11:26:37 2011
@@ -146,6 +146,8 @@ typedef struct svn_ra_neon__session_t {
   const char *rev_root_stub;    /* for accessing REV/PATH pairs */
   const char *txn_stub;         /* for accessing transactions (i.e. txnprops) */
   const char *txn_root_stub;    /* for accessing TXN/PATH pairs */
+  const char *vtxn_stub;        /* for accessing transactions (i.e. txnprops) */
+  const char *vtxn_root_stub;   /* for accessing TXN/PATH pairs */
 
   /*** End HTTP v2 stuff ***/
 

Modified: subversion/trunk/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/commit.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/commit.c Fri Mar 11 11:26:37 2011
@@ -1115,6 +1115,21 @@ setup_copy_dir_headers(serf_bucket_t *he
 }
 
 static svn_error_t *
+setup_post_headers(serf_bucket_t *headers,
+                   void *baton,
+                   apr_pool_t *pool)
+{
+#ifdef SVN_SERF_SEND_VTXN_NAME
+  /* Enable this to exercise the VTXN-NAME code based on a client
+     supplied transaction name. */
+  serf_bucket_headers_set(headers, SVN_DAV_VTXN_NAME_HEADER,
+                          svn_uuid_generate(pool));
+#endif
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 setup_delete_headers(serf_bucket_t *headers,
                      void *baton,
                      apr_pool_t *pool)
@@ -1228,6 +1243,18 @@ post_headers_iterator_callback(void *bat
       prc_cc->txn_root_url =
         svn_path_url_add_component2(sess->txn_root_stub, val, prc_cc->pool);
     }
+
+  if (svn_cstring_casecmp(key, SVN_DAV_VTXN_NAME_HEADER) == 0)
+    {
+      /* Build out vtxn and vtxn-root URLs using the vtxn name we're
+         given, and store the whole lot of it in the commit context.  */
+      prc_cc->txn_name = apr_pstrdup(prc_cc->pool, val);
+      prc_cc->txn_url =
+        svn_path_url_add_component2(sess->vtxn_stub, val, prc_cc->pool);
+      prc_cc->txn_root_url =
+        svn_path_url_add_component2(sess->vtxn_root_stub, val, prc_cc->pool);
+    }
+
   return 0;
 }
 
@@ -1282,6 +1309,8 @@ open_root(void *edit_baton,
       handler->body_type = SVN_SKEL_MIME_TYPE;
       handler->body_delegate = create_txn_post_body;
       handler->body_delegate_baton = NULL;
+      handler->header_delegate = setup_post_headers;
+      handler->header_delegate_baton = NULL;
       handler->path = ctx->session->me_resource;
       handler->conn = ctx->session->conns[0];
       handler->session = ctx->session;

Modified: subversion/trunk/subversion/libsvn_ra_serf/options.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/options.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/options.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/options.c Fri Mar 11 11:26:37 2011
@@ -373,6 +373,14 @@ capabilities_headers_iterator_callback(v
         {
           orc->session->txn_root_stub = apr_pstrdup(orc->session->pool, val);
         }
+      else if (svn_cstring_casecmp(key, SVN_DAV_VTXN_STUB_HEADER) == 0)
+        {
+          orc->session->vtxn_stub = apr_pstrdup(orc->session->pool, val);
+        }
+      else if (svn_cstring_casecmp(key, SVN_DAV_VTXN_ROOT_STUB_HEADER) == 0)
+        {
+          orc->session->vtxn_root_stub = apr_pstrdup(orc->session->pool, val);
+        }
       else if (svn_cstring_casecmp(key, SVN_DAV_REPOS_UUID_HEADER) == 0)
         {
           orc->session->uuid = apr_pstrdup(orc->session->pool, val);

Modified: subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h Fri Mar 11 11:26:37 2011
@@ -197,6 +197,8 @@ struct svn_ra_serf__session_t {
   const char *rev_root_stub;    /* for accessing REV/PATH pairs */
   const char *txn_stub;         /* for accessing transactions (i.e. txnprops) */
   const char *txn_root_stub;    /* for accessing TXN/PATH pairs */
+  const char *vtxn_stub;        /* for accessing transactions (i.e. txnprops) */
+  const char *vtxn_root_stub;   /* for accessing TXN/PATH pairs */
 
   /*** End HTTP v2 stuff ***/
 

Modified: subversion/trunk/subversion/mod_dav_svn/dav_svn.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/dav_svn.h?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/dav_svn.h (original)
+++ subversion/trunk/subversion/mod_dav_svn/dav_svn.h Fri Mar 11 11:26:37 2011
@@ -202,6 +202,15 @@ typedef struct dav_svn_root {
   */
   const char *txn_name;
 
+  /* The optional vtxn name supplied by an HTTPv2 client and
+     used in subsequent requests.  This may be NULL if the client
+     is not using a vtxn name.
+
+     PRIVATE resources that directly represent either a txn or
+     txn-root use this field.
+  */
+  const char *vtxn_name;
+
   /* If the root is part of a transaction, this contains the FS's transaction
      handle. It may be NULL if this root corresponds to a specific revision.
      It may also be NULL if we have not opened the transaction yet.
@@ -392,6 +401,12 @@ const char *dav_svn__get_txn_stub(reques
 /* For accessing transaction properties (typically "!svn/txr") */
 const char *dav_svn__get_txn_root_stub(request_rec *r);
 
+/* For accessing transaction resources (typically "!svn/vtxn") */
+const char *dav_svn__get_vtxn_stub(request_rec *r);
+
+/* For accessing transaction properties (typically "!svn/vtxr") */
+const char *dav_svn__get_vtxn_root_stub(request_rec *r);
+
 
 /*** activity.c ***/
 

Modified: subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/mod_dav_svn.c Fri Mar 11 11:26:37 2011
@@ -626,6 +626,22 @@ dav_svn__get_txn_root_stub(request_rec *
 }
 
 
+const char *
+dav_svn__get_vtxn_stub(request_rec *r)
+{
+  return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxn",
+                     (char *)NULL);
+}
+
+
+const char *
+dav_svn__get_vtxn_root_stub(request_rec *r)
+{
+  return apr_pstrcat(r->pool, dav_svn__get_special_uri(r), "/vtxr",
+                     (char *)NULL);
+}
+
+
 svn_boolean_t
 dav_svn__get_autoversioning_flag(request_rec *r)
 {

Modified: subversion/trunk/subversion/mod_dav_svn/posts/create_txn.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/posts/create_txn.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/posts/create_txn.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/posts/create_txn.c Fri Mar 11 11:26:37 2011
@@ -37,6 +37,7 @@ dav_svn__post_create_txn(const dav_resou
                          ap_filter_t *output)
 {
   const char *txn_name;
+  const char *vtxn_name;
   dav_error *derr;
   request_rec *r = resource->info->r;
 
@@ -47,7 +48,20 @@ dav_svn__post_create_txn(const dav_resou
 
   /* Build a "201 Created" response with header that tells the
      client our new transaction's name. */
-  apr_table_set(r->headers_out, SVN_DAV_TXN_NAME_HEADER, txn_name);
+  vtxn_name =  apr_table_get(r->headers_in, SVN_DAV_VTXN_NAME_HEADER);
+  if (vtxn_name && vtxn_name[0])
+    {
+      /* If the client supplied a vtxn name then store a mapping from
+         the client name to the FS transaction name in the activity
+         database. */
+      if ((derr  = dav_svn__store_activity(resource->info->repos,
+                                           vtxn_name, txn_name)))
+        return derr;
+      apr_table_set(r->headers_out, SVN_DAV_VTXN_NAME_HEADER, vtxn_name);
+    }
+  else
+    apr_table_set(r->headers_out, SVN_DAV_TXN_NAME_HEADER, txn_name);
+
   r->status = HTTP_CREATED;
 
   return NULL;

Modified: subversion/trunk/subversion/mod_dav_svn/repos.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/repos.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/repos.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/repos.c Fri Mar 11 11:26:37 2011
@@ -491,6 +491,24 @@ parse_txnstub_uri(dav_resource_combined 
   return FALSE;
 }
 
+static int
+parse_vtxnstub_uri(dav_resource_combined *comb,
+                   const char *path,
+                   const char *label,
+                   int use_checked_in)
+{
+  /* format: !svn/vtxn/TXN_NAME */
+
+  if (parse_txnstub_uri(comb, path, label, use_checked_in))
+    return TRUE;
+
+  comb->priv.root.vtxn_name = comb->priv.root.txn_name;
+  comb->priv.root.txn_name = dav_svn__get_txn(comb->priv.repos,
+                                              comb->priv.root.vtxn_name);
+
+  return FALSE;
+}
+
 
 static int
 parse_txnroot_uri(dav_resource_combined *comb,
@@ -541,6 +559,24 @@ parse_txnroot_uri(dav_resource_combined 
   return FALSE;
 }
 
+static int
+parse_vtxnroot_uri(dav_resource_combined *comb,
+                   const char *path,
+                   const char *label,
+                   int use_checked_in)
+{
+  /* format: !svn/vtxr/TXN_NAME/[PATH] */
+
+  if (parse_txnroot_uri(comb, path, label, use_checked_in))
+    return TRUE;
+
+  comb->priv.root.vtxn_name = comb->priv.root.txn_name;
+  comb->priv.root.txn_name = dav_svn__get_txn(comb->priv.repos,
+                                              comb->priv.root.vtxn_name);
+
+  return FALSE;
+}
+
 
 static int
 parse_wrk_baseline_uri(dav_resource_combined *comb,
@@ -621,6 +657,8 @@ static const struct special_defn
   { "rvr", parse_revroot_uri, 1, TRUE, DAV_SVN_RESTYPE_REVROOT_COLLECTION },
   { "txn", parse_txnstub_uri, 1, FALSE, DAV_SVN_RESTYPE_TXN_COLLECTION},
   { "txr", parse_txnroot_uri, 1, TRUE, DAV_SVN_RESTYPE_TXNROOT_COLLECTION},
+  { "vtxn", parse_vtxnstub_uri, 1, FALSE, DAV_SVN_RESTYPE_TXN_COLLECTION},
+  { "vtxr", parse_vtxnroot_uri, 1, TRUE, DAV_SVN_RESTYPE_TXNROOT_COLLECTION},
 
   { NULL } /* sentinel */
 };
@@ -3783,11 +3821,13 @@ remove_resource(dav_resource *resource, 
   if (resource->type == DAV_RESOURCE_TYPE_PRIVATE
       && resource->info->restype == DAV_SVN_RESTYPE_TXN_COLLECTION)
     {
-      /* We'll assume that no activity was created to map to this
-         transaction.  */
-      return dav_svn__abort_txn(resource->info->repos,
-                                resource->info->root.txn_name,
-                                resource->pool);
+      if (resource->info->root.vtxn_name)
+        return dav_svn__delete_activity(resource->info->repos,
+                                        resource->info->root.vtxn_name);
+      else
+        return dav_svn__abort_txn(resource->info->repos,
+                                  resource->info->root.txn_name,
+                                  resource->pool);
     }
 
   /* ### note that the parent was checked out at some point, and this

Modified: subversion/trunk/subversion/mod_dav_svn/version.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/mod_dav_svn/version.c?rev=1080529&r1=1080528&r2=1080529&view=diff
==============================================================================
--- subversion/trunk/subversion/mod_dav_svn/version.c (original)
+++ subversion/trunk/subversion/mod_dav_svn/version.c Fri Mar 11 11:26:37 2011
@@ -250,6 +250,12 @@ get_option(const dav_resource *resource,
       apr_table_set(r->headers_out, SVN_DAV_TXN_STUB_HEADER,
                     apr_pstrcat(resource->pool, repos_root_uri, "/",
                                 dav_svn__get_txn_stub(r), (char *)NULL));
+      apr_table_set(r->headers_out, SVN_DAV_VTXN_ROOT_STUB_HEADER,
+                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                                dav_svn__get_vtxn_root_stub(r), (char *)NULL));
+      apr_table_set(r->headers_out, SVN_DAV_VTXN_STUB_HEADER,
+                    apr_pstrcat(resource->pool, repos_root_uri, "/",
+                                dav_svn__get_vtxn_stub(r), (char *)NULL));
     }
 
   return NULL;
@@ -1427,6 +1433,12 @@ merge(dav_resource *target,
           svn_error_clear(serr);
           serr = SVN_NO_ERROR;
         }
+
+      /* HTTPv2 doesn't send DELETE after a successful MERGE so if
+         using the optional vtxn name mapping then delete it here. */
+      if (source->info->root.vtxn_name)
+        dav_svn__delete_activity(source->info->repos,
+                                 source->info->root.vtxn_name);
     }
   else
     {



Mime
View raw message