# HG changeset patch # User mpm@selenic.com # Date 1120245849 28800 # Node ID cdddf4652aec9288c223d4783621fe406edcf02e # Parent f9ad1a2c72eb8e77b7931aec22ac20a83e507819 Fix dodiff/changes -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Fix dodiff/changes dodiff was failing to pass both nodes to changes changes was comparing things backwards, resulting in added/deleted confusion in dodiff changes was deleting things from cached manifests, use copy() changes now sorts output lists manifest hash: 6ad972b0895b9d855e246efef49c2ebd943946b3 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCxZhZywK+sNU5EO8RApZWAJ9mYv1zc7IjXPIMwbVsfroQs8jfBACgn7R7 rTqLTTyIkM1OpL/ebnMtCOY= =VcIr -----END PGP SIGNATURE----- diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -37,7 +37,7 @@ def dodiff(ui, repo, files = None, node1 def date(c): return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) - (c, a, d, u) = repo.changes(None, node1, files) + (c, a, d, u) = repo.changes(node1, node2, files) if files: c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -95,7 +95,7 @@ class manifest(revlog): def read(self, node): if node == nullid: return {} # don't upset local cache if self.mapcache and self.mapcache[0] == node: - return self.mapcache[1].copy() + return self.mapcache[1] text = self.revision(node) map = {} flag = {} @@ -687,7 +687,7 @@ class localrepository: def changes(self, node1, node2, files=None): # changed, added, deleted, unknown - c, a, d, u, mf1 = [], [], [], [], None + c, a, d, u, mf2 = [], [], [], [], None def fcmp(fn, mf): t1 = self.wfile(fn).read() @@ -695,48 +695,54 @@ class localrepository: return cmp(t1, t2) # are we comparing the working directory? - if not node1: + if not node2: l, c, a, d, u = self.dirstate.changes(files, self.ignore) # are we comparing working dir against its parent? - if not node2: + if not node1: if l: # do a full compare of any files that might have changed change = self.changelog.read(self.dirstate.parents()[0]) - mf1 = self.manifest.read(change[0]) + mf2 = self.manifest.read(change[0]) for f in l: - if fcmp(f, mf1): + if fcmp(f, mf2): c.append(f) + + for l in c, a, d, u: + l.sort() + return (c, a, d, u) # are we comparing working dir against non-tip? # generate a pseudo-manifest for the working dir - if not node1: - if not mf1: + if not node2: + if not mf2: change = self.changelog.read(self.dirstate.parents()[0]) - mf1 = self.manifest.read(change[0]) + mf2 = self.manifest.read(change[0]).copy() for f in a + c + l: - mf1[f] = "" + mf2[f] = "" for f in d: - if f in mf1: del mf1[f] + if f in mf2: del mf2[f] else: - change = self.changelog.read(node1) - mf1 = self.manifest.read(change[0]) + change = self.changelog.read(node2) + mf2 = self.manifest.read(change[0]) - change = self.changelog.read(node2) - mf2 = self.manifest.read(change[0]) + change = self.changelog.read(node1) + mf1 = self.manifest.read(change[0]).copy() for fn in mf2: if mf1.has_key(fn): if mf1[fn] != mf2[fn]: - if mf1[fn] != "" or fcmp(fn, mf2): + if mf2[fn] != "" or fcmp(fn, mf1): c.append(fn) del mf1[fn] else: a.append(fn) d = mf1.keys() - d.sort() + + for l in c, a, d, u: + l.sort() return (c, a, d, u) diff --git a/tests/test-diffdir.out b/tests/test-diffdir.out --- a/tests/test-diffdir.out +++ b/tests/test-diffdir.out @@ -8,3 +8,8 @@ diff -r 3903775176ed b +++ b/b @@ -0,0 +1,1 @@ +123 +diff -r 3903775176ed b +--- /dev/null ++++ b/b +@@ -0,0 +1,1 @@ ++123 diff --git a/tests/test-tags.out b/tests/test-tags.out --- a/tests/test-tags.out +++ b/tests/test-tags.out @@ -43,5 +43,5 @@ c8edf04160c7 tip + hg id c8edf04160c7+b9154636be93+ tip + hg status +C .hgtags C a -C .hgtags