Author: rhuijben
Date: Wed Dec 19 15:33:47 2012
New Revision: 1423887

URL: http://svn.apache.org/viewvc?rev=1423887&view=rev
Log:
* subversion/svn/copy-cmd.c
  (svn_cl__copy): Resolve issue #3606, by trying to undo a partial
    canonicalization before the final step for the issue case.

Modified:
    subversion/trunk/subversion/svn/copy-cmd.c

Modified: subversion/trunk/subversion/svn/copy-cmd.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/svn/copy-cmd.c?rev=1423887&r1=1423886&r2=1423887&view=diff
==============================================================================
--- subversion/trunk/subversion/svn/copy-cmd.c (original)
+++ subversion/trunk/subversion/svn/copy-cmd.c Wed Dec 19 15:33:47 2012
@@ -65,10 +65,46 @@ svn_cl__copy(apr_getopt_t *os,
       const char *target = APR_ARRAY_IDX(targets, i, const char *);
       svn_client_copy_source_t *source = apr_palloc(pool, sizeof(*source));
       const char *src;
+      svn_error_t *err;
       svn_opt_revision_t *peg_revision = apr_palloc(pool,
                                                     sizeof(*peg_revision));
 
-      SVN_ERR(svn_opt_parse_path(peg_revision, &src, target, pool));
+      err = svn_opt_parse_path(peg_revision, &src, target, pool);
+
+      if (err && err->apr_err == SVN_ERR_BAD_FILENAME)
+        {
+          /* Issue #3606: 'svn cp .@HEAD target' gives
+             svn: '@HEAD' is just a peg revision. Maybe try '@HEAD@' instead? 
+
+             This is caused by a first round of canonicalization in
+             svn_cl__args_to_target_array_print_reserved(). Undo that in an
+             attempt to fix this issue without revving many apis.
+           */
+          if (*target == '@')
+            {
+              svn_error_t *err2;
+
+              err2 = svn_opt_parse_path(peg_revision, &src,
+                                        apr_pstrcat(pool, ".", target,
+                                                    (const char *)NULL), pool);
+
+              if (err2)
+                {
+                  /* Fix attempt failed; return original error */
+                  svn_error_clear(err2);
+                }
+              else
+                {
+                  /* Error resolved. Use path */
+                  svn_error_clear(err);
+                  err = NULL;
+                }
+            }
+
+          if (err)
+              return svn_error_trace(err);
+        }
+
       source->path = src;
       source->revision = &(opt_state->start_revision);
       source->peg_revision = peg_revision;


Reply via email to