[PATCH 1 of 1] localrepo: don't add deleted files to list of modified/added files (issue2761)

Idan Kamara idankk86 at gmail.com
Mon Apr 11 13:45:18 CDT 2011


# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1302547462 -10800
# Node ID 51f44c91f9762314f5e711de3423425917dfff55
# Parent  c315ffc13a25c2795067201d9b3f65c8ff6ed079
localrepo: don't add deleted files to list of modified/added files (issue2761)

If a file is deleted (rm, not 'hg rm') from the working dir
an attempt to run 'hg diff -r X', with the file being present in X will
cause an abort.

We didn't check if the file has been deleted from the working dir
and later on tried to open it to compare with the one from X, causing the abort.

This fix adds that check. Consequently, no output will be returned.

diff -r c315ffc13a25 -r 51f44c91f976 mercurial/localrepo.py
--- a/mercurial/localrepo.py	Sun Apr 10 11:30:53 2011 +0300
+++ b/mercurial/localrepo.py	Mon Apr 11 21:44:22 2011 +0300
@@ -1225,14 +1225,15 @@
             modified, added, clean = [], [], []
             for fn in mf2:
                 if fn in mf1:
-                    if (mf1.flags(fn) != mf2.flags(fn) or
-                        (mf1[fn] != mf2[fn] and
-                         (mf2[fn] or ctx1[fn].cmp(ctx2[fn])))):
+                    if (fn not in deleted and
+                        (mf1.flags(fn) != mf2.flags(fn) or
+                         (mf1[fn] != mf2[fn] and
+                          (mf2[fn] or ctx1[fn].cmp(ctx2[fn]))))):
                         modified.append(fn)
                     elif listclean:
                         clean.append(fn)
                     del mf1[fn]
-                else:
+                elif fn not in deleted:
                     added.append(fn)
             removed = mf1.keys()
 
diff -r c315ffc13a25 -r 51f44c91f976 tests/test-diff-issue2761.t
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-diff-issue2761.t	Mon Apr 11 21:44:22 2011 +0300
@@ -0,0 +1,23 @@
+Test issue2761
+
+  $ hg init
+
+  $ touch to-be-deleted
+  $ hg add
+  adding to-be-deleted
+  $ hg ci -m first
+  $ echo a > to-be-deleted
+  $ hg ci -m second
+  $ rm to-be-deleted
+  $ hg diff -r 0
+
+Same issue, different code path
+
+  $ hg up -C
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ touch doesnt-exist-in-1
+  $ hg add
+  adding doesnt-exist-in-1
+  $ hg ci -m third
+  $ rm doesnt-exist-in-1
+  $ hg diff -r 1
diff -r c315ffc13a25 -r 51f44c91f976 tests/test-mq-qdiff.t
--- a/tests/test-mq-qdiff.t	Sun Apr 10 11:30:53 2011 +0300
+++ b/tests/test-mq-qdiff.t	Mon Apr 11 21:44:22 2011 +0300
@@ -163,4 +163,13 @@
   $ hg qdiff --stat
    lines |  7 +++++--
    1 files changed, 5 insertions(+), 2 deletions(-)
+  $ hg qrefresh
 
+qdiff when file deleted (but not removed) in working dir:
+
+  $ hg qnew deleted-file
+  $ echo a > newfile
+  $ hg add newfile
+  $ hg qrefresh
+  $ rm newfile
+  $ hg qdiff


More information about the Mercurial-devel mailing list