diff hgext/mq.py @ 7566:5f7e3f17aece

mq: drop copy records when refreshing regular patches (issue1441) Copy information was saved in a common loop, then refined in a git-only block. The problem was the latter did filter out renames occuring in the current patch and irrelevant to commit. In the non-git case, copy records still existed in the dirstate, referencing removed files, making the commit to fail. Git and non-git copy handling paths are now separated for simplicity. Reported by Gary Bernhardt
author Patrick Mezard <pmezard@gmail.com>
date Sun, 04 Jan 2009 21:32:40 +0100
parents 1d5ecaa47abb
children 12df451ce205 49355875c805
line wrap: on
line diff
--- a/hgext/mq.py	Sun Jan 04 19:10:42 2009 +0100
+++ b/hgext/mq.py	Sun Jan 04 21:32:40 2009 +0100
@@ -1190,17 +1190,16 @@
                     patchf.write(chunk)
 
                 try:
-                    copies = {}
-                    for dst in a:
-                        src = repo.dirstate.copied(dst)
-                        # during qfold, the source file for copies may
-                        # be removed. Treat this as a simple add.
-                        if src is not None and src in repo.dirstate:
-                            copies.setdefault(src, []).append(dst)
-                        repo.dirstate.add(dst)
-                    # remember the copies between patchparent and tip
-                    # this may be slow, so don't do it if we're not tracking copies
                     if self.diffopts().git:
+                        copies = {}
+                        for dst in a:
+                            src = repo.dirstate.copied(dst)
+                            # during qfold, the source file for copies may
+                            # be removed. Treat this as a simple add.
+                            if src is not None and src in repo.dirstate:
+                                copies.setdefault(src, []).append(dst)
+                            repo.dirstate.add(dst)
+                        # remember the copies between patchparent and tip
                         for dst in aaa:
                             f = repo.file(dst)
                             src = f.renamed(man[dst])
@@ -1211,9 +1210,15 @@
                             # we can't copy a file created by the patch itself
                             if dst in copies:
                                 del copies[dst]
-                    for src, dsts in copies.iteritems():
-                        for dst in dsts:
-                            repo.dirstate.copy(src, dst)
+                        for src, dsts in copies.iteritems():
+                            for dst in dsts:
+                                repo.dirstate.copy(src, dst)
+                    else:
+                        for dst in a:
+                            repo.dirstate.add(dst)
+                        # Drop useless copy information
+                        for f in list(repo.dirstate.copies()):
+                            repo.dirstate.copy(None, f)
                     for f in r:
                         repo.dirstate.remove(f)
                     # if the patch excludes a modified file, mark that