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;