Merge with default stable
authorChristian Ebert <blacktrash@gmx.net>
Thu, 02 Dec 2010 09:44:01 +0100
branchstable
changeset 869 d196d4ba75ef
parent 866 d51c3fd4e34a (current diff)
parent 868 16cfcb56859a (diff)
child 872 67aaf09289bb
Merge with default
--- a/hgkw/keyword.py	Mon Nov 22 18:15:58 2010 +0100
+++ b/hgkw/keyword.py	Thu Dec 02 09:44:01 2010 +0100
@@ -86,7 +86,7 @@
 from mercurial import localrepo, match, patch, templatefilters, templater, util
 from mercurial.hgweb import webcommands
 from mercurial.i18n import _
-import re, shutil, tempfile
+import os, re, shutil, tempfile
 
 commands.optionalrepo += ' kwdemo'
 
@@ -570,17 +570,31 @@
     def kw_copy(orig, ui, repo, pats, opts, rename=False):
         '''Wraps cmdutil.copy so that copy/rename destinations do not
         contain expanded keywords.
-        Note that the source may also be a symlink as:
+        Note that the source of a regular file destination may also be a
+        symlink:
         hg cp sym x                -> x is symlink
         cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
-        '''
+        For the latter we have to follow the symlink to find out whether its
+        target is configured for expansion and we therefore must unexpand the
+        keywords in the destination.'''
         orig(ui, repo, pats, opts, rename)
         if opts.get('dry_run'):
             return
         wctx = repo[None]
+        cwd = repo.getcwd()
+
+        def haskwsource(dest):
+            '''Returns true if dest is a regular file and configured for
+            expansion or a symlink which points to a file configured for
+            expansion. '''
+            source = repo.dirstate.copied(dest)
+            if 'l' in wctx.flags(source):
+                source = util.canonpath(repo.root, cwd,
+                                        os.path.realpath(source))
+            return kwt.match(source)
+
         candidates = [f for f in repo.dirstate.copies() if
-                      kwt.match(repo.dirstate.copied(f)) and
-                      not 'l' in wctx.flags(f)]
+                      not 'l' in wctx.flags(f) and haskwsource(f)]
         kwt.overwrite(wctx, candidates, False, False)
 
     def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
--- a/tests/test-keyword.t	Mon Nov 22 18:15:58 2010 +0100
+++ b/tests/test-keyword.t	Thu Dec 02 09:44:01 2010 +0100
@@ -553,7 +553,8 @@
   $ hg forget i
   $ rm i
 
-cp symlink (becomes regular file), and hg copy after
+cp symlink file; hg cp -A symlink file (part1)
+- copied symlink points to kwfile: overwrite
 
   $ cp sym i
   $ ls -l i
@@ -602,6 +603,26 @@
   $ hg update --clean
   0 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
+cp symlink file; hg cp -A symlink file (part2)
+- copied symlink points to kw ignored file: do not overwrite
+
+  $ cat a > i
+  $ ln -s i symignored
+  $ hg commit -Am 'fake expansion in ignored and symlink' i symignored
+  $ cp symignored x
+  $ hg copy --after --verbose symignored x
+  copying symignored to x
+  $ head -n 1 x
+  expand $Id: a,v ef63ca68695b 1970/01/01 00:00:00 user $
+  $ hg forget x
+  $ rm x
+
+  $ hg rollback
+  rolling back to revision 1 (undo commit)
+  $ hg update --clean
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ rm i symignored
+
 Custom keywordmaps as argument to kwdemo
 
   $ hg --quiet kwdemo "Xinfo = {author}: {desc}"