# HG changeset patch # User Idan Kamara # Date 2011-04-11 18:44:22 # Node ID cff56a0ed18ec3d2f7816eccc6ef4ad9ebf3430d # Parent 155d2e17884e2a364ded68657b0185122273bb3c 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 --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1225,14 +1225,15 @@ class localrepository(repo.repository): 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 --git a/tests/test-diff-issue2761.t b/tests/test-diff-issue2761.t new file mode 100644 --- /dev/null +++ b/tests/test-diff-issue2761.t @@ -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 --git a/tests/test-mq-qdiff.t b/tests/test-mq-qdiff.t --- a/tests/test-mq-qdiff.t +++ b/tests/test-mq-qdiff.t @@ -163,4 +163,13 @@ qdiff preserve existing git flag: $ 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