# HG changeset patch # User mpm@selenic.com # Date 1120195698 28800 # Node ID 411e05b04ffaeb62f490a3b50fc9ddd414777022 # Parent c15b4bc0a11cd0d89a35f96b75cff47cc67f17d5 Propagate file list through dodiff -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Propagate file list through dodiff This speeds up operations like 'hg diff Makefile'. Previously it would walk the entire directory tree looking for changes. Now it will only stat Makefile. Further, if Makefile appears untouched, it will skip reading the manifest. manifest hash: ab22a70a5511ed2d7a647f2cd15d129a88dccabf -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCxNRyywK+sNU5EO8RAgb6AKC2TzWmRjNsWq0Q9Pa+ppCZ6Y+pdwCfdHUA UHu024/2Wt6C6WZ5vcWfPbo= =E35L -----END PGP SIGNATURE----- diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -32,19 +32,24 @@ def relpath(repo, args): return [ util.pconvert(os.path.normpath(os.path.join(p, x))) for x in args ] return args -def dodiff(ui, repo, path, files = None, node1 = None, node2 = None): +def dodiff(ui, repo, files = None, node1 = None, node2 = None): def date(c): return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) + (c, a, d, u) = repo.changes(None, node1, files) + if files: + c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) + + if not c and not a and not d: + return + if node2: change = repo.changelog.read(node2) mmap2 = repo.manifest.read(change[0]) - (c, a, d, u) = repo.changes(node1, node2) def read(f): return repo.file(f).read(mmap2[f]) date2 = date(change) else: date2 = time.asctime() - (c, a, d, u) = repo.changes(None, node1, path) if not node1: node1 = repo.dirstate.parents()[0] def read(f): return repo.wfile(f).read() @@ -59,9 +64,6 @@ def dodiff(ui, repo, path, files = None, mmap = repo.manifest.read(change[0]) date1 = date(change) - if files: - c, a, d = map(lambda x: filterfiles(files, x), (c, a, d)) - for f in c: to = None if f in mmap: @@ -411,7 +413,7 @@ def diff(ui, repo, *files, **opts): else: files = relpath(repo, [""]) - dodiff(ui, repo, os.getcwd(), files, *revs) + dodiff(ui, repo, files, *revs) def export(ui, repo, changeset): """dump the changeset header and diffs for a revision""" @@ -428,7 +430,7 @@ def export(ui, repo, changeset): print change[4].rstrip() print - dodiff(ui, repo, "", None, prev, node) + dodiff(ui, repo, None, prev, node) def forget(ui, repo, file, *files): """don't add the specified files on the next commit""" @@ -645,7 +647,7 @@ def status(ui, repo): R = removed ? = not tracked''' - (c, a, d, u) = repo.changes(None, None, os.getcwd()) + (c, a, d, u) = repo.changes(None, None) (c, a, d, u) = map(lambda x: relfilter(repo, x), (c, a, d, u)) for f in c: print "C", f diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -306,6 +306,7 @@ class dirstate: # recursive generator of all files listed def walk(files): for f in uniq(files): + f = os.path.join(self.root, f) if os.path.isdir(f): for dir, subdirs, fl in os.walk(f): d = dir[len(self.root) + 1:] @@ -691,7 +692,7 @@ class localrepository: self.dirstate.update(new, "n") self.dirstate.forget(remove) - def changes(self, node1, node2, *files): + def changes(self, node1, node2, files=None): # changed, added, deleted, unknown c, a, d, u, mf1 = [], [], [], [], None