# HG changeset patch # User mpm@selenic.com # Date 1125205457 25200 # Node ID 30ab5b8ee8ec937bef9d9fc85ffbad0f0ddb4185 # Parent 0cdd73b0767c19646c9770f46cf7aeef59f361e4 fix some rename/copy bugs - delete copy information when we update dirstate hg was keeping the copy state and marking things as copied on multiple commits - files that are renamed should have no parents if you do a rename/copy to an existing file, it should not be marked as descending from its previous revisions. - remove spurious print from filelog.renamed - add some more copy tests diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py --- a/mercurial/dirstate.py +++ b/mercurial/dirstate.py @@ -141,6 +141,8 @@ class dirstate: st_size = kw.get('st_size', s.st_size) st_mtime = kw.get('st_mtime', s.st_mtime) self.map[f] = (state, s.st_mode, st_size, st_mtime) + if self.copies.has_key(f): + del self.copies[f] def forget(self, files): if not files: return diff --git a/mercurial/filelog.py b/mercurial/filelog.py --- a/mercurial/filelog.py +++ b/mercurial/filelog.py @@ -59,7 +59,6 @@ class filelog(revlog): def renamed(self, node): if 0 and self.parents(node)[0] != nullid: - print "shortcut" return False m = self.readmeta(node) if m and m.has_key("copy"): diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -329,16 +329,18 @@ class localrepository: self.ui.warn("trouble committing %s!\n" % f) raise + r = self.file(f) + meta = {} cp = self.dirstate.copied(f) if cp: meta["copy"] = cp meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid))) self.ui.debug(" %s: copy %s:%s\n" % (f, cp, meta["copyrev"])) - - r = self.file(f) - fp1 = m1.get(f, nullid) - fp2 = m2.get(f, nullid) + fp1, fp2 = nullid, nullid + else: + fp1 = m1.get(f, nullid) + fp2 = m2.get(f, nullid) # is the same revision on two branches of a merge? if fp2 == fp1: diff --git a/tests/test-copy2 b/tests/test-copy2 new file mode 100755 --- /dev/null +++ b/tests/test-copy2 @@ -0,0 +1,41 @@ +#!/bin/sh + +hg init +echo foo > foo +hg add foo +hg commit -m1 -d"0 0" + +echo "# should show copy" +cp foo bar +hg copy foo bar +hg debugstate + +echo "# shouldn't show copy" +hg commit -m2 -d"0 0" +hg debugstate + +echo "# should match" +hg debugindex .hg/data/foo.i +hg debugrename bar + +echo bleah > foo +echo quux > bar +hg commit -m3 -d"0 0" + +echo "# should not be renamed" +hg debugrename bar + +cp foo bar +hg copy foo bar +echo "# should show copy" +hg debugstate +hg commit -m3 -d"0 0" + +echo "# should show no parents for tip" +hg debugindex .hg/data/bar.i +echo "# should match" +hg debugindex .hg/data/foo.i +hg debugrename bar + +echo "# should show no copies" +hg debugstate \ No newline at end of file diff --git a/tests/test-copy2.out b/tests/test-copy2.out new file mode 100644 --- /dev/null +++ b/tests/test-copy2.out @@ -0,0 +1,34 @@ +# should show copy +a 644 4 08/28/05 05:00:19 bar +n 644 4 08/28/05 05:00:19 foo + +foo -> bar +# shouldn't show copy +n 644 4 08/28/05 05:00:19 bar +n 644 4 08/28/05 05:00:19 foo + +# should match + rev offset length base linkrev nodeid p1 p2 + 0 0 5 0 0 2ed2a3912a0b 000000000000 000000000000 +renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd +# should not be renamed +not renamed +# should show copy +n 644 5 08/28/05 05:00:19 bar +n 644 6 08/28/05 05:00:19 foo + +foo -> bar +# should show no parents for tip + rev offset length base linkrev nodeid p1 p2 + 0 0 69 0 1 6ca237634e1f 000000000000 000000000000 + 1 69 6 1 2 7a1ff8e75f5b 6ca237634e1f 000000000000 + 2 75 82 1 3 243dfe60f3d9 000000000000 000000000000 +# should match + rev offset length base linkrev nodeid p1 p2 + 0 0 5 0 0 2ed2a3912a0b 000000000000 000000000000 + 1 5 7 1 2 dd12c926cf16 2ed2a3912a0b 000000000000 +renamed from foo:dd12c926cf165e3eb4cf87b084955cb617221c17 +# should show no copies +n 644 6 08/28/05 05:00:19 bar +n 644 6 08/28/05 05:00:19 foo +