diff --git a/contrib/hgit b/contrib/hgit --- a/contrib/hgit +++ b/contrib/hgit @@ -10,7 +10,7 @@ import time, sys, signal from mercurial import hg, mdiff, fancyopts, commands, ui -def difftree(args, repo): +def difftree(args, ui, repo): def __difftree(repo, files = None, node1 = None, node2 = None): def date(c): return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) @@ -61,7 +61,7 @@ def difftree(args, repo): revs.append(repo.lookup(args[1])) args = args[2:] if doptions['patch']: - commands.dodiff(repo, "", args, *revs) + commands.dodiff(ui, repo, "", args, *revs) else: __difftree(repo, args, *revs) @@ -236,10 +236,10 @@ signal.signal(signal.SIGTERM, catchterm) repo = hg.repository(ui = u) if cmd == "diff-tree": - difftree(args, repo) + difftree(args, u, repo) elif cmd == "cat-file": - catfile(args, ui, repo) + catfile(args, u, repo) elif cmd == "rev-tree": revtree(args, repo) diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -32,7 +32,7 @@ def relpath(repo, args): return [ os.path.normpath(os.path.join(p, x)) for x in args ] return args -def dodiff(repo, path, files = None, node1 = None, node2 = None): +def dodiff(ui, repo, path, files = None, node1 = None, node2 = None): def date(c): return time.asctime(time.gmtime(float(c[2].split(' ')[0]))) @@ -49,6 +49,12 @@ def dodiff(repo, path, files = None, nod node1 = repo.dirstate.parents()[0] def read(f): return file(os.path.join(repo.root, f)).read() + if ui.quiet: + r = None + else: + hexfunc = ui.verbose and hg.hex or hg.short + r = [hexfunc(node) for node in [node1, node2] if node] + change = repo.changelog.read(node1) mmap = repo.manifest.read(change[0]) date1 = date(change) @@ -61,15 +67,15 @@ def dodiff(repo, path, files = None, nod if f in mmap: to = repo.file(f).read(mmap[f]) tn = read(f) - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) + sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) for f in a: to = None tn = read(f) - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) + sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) for f in d: to = repo.file(f).read(mmap[f]) tn = None - sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f)) + sys.stdout.write(mdiff.unidiff(to, date1, tn, date2, f, r)) def show_changeset(ui, repo, rev=0, changenode=None, filelog=None): """show a single changeset or file revision""" @@ -290,7 +296,7 @@ def diff(ui, repo, *files, **opts): revs = [] if opts['rev']: revs = map(lambda x: repo.lookup(x), opts['rev']) - + if len(revs) > 2: self.ui.warn("too many revisions to diff\n") sys.exit(1) @@ -300,7 +306,7 @@ def diff(ui, repo, *files, **opts): else: files = relpath(repo, [""]) - dodiff(repo, os.getcwd(), files, *revs) + dodiff(ui, repo, os.getcwd(), files, *revs) def export(ui, repo, changeset): """dump the changeset header and diffs for a revision""" @@ -316,8 +322,8 @@ def export(ui, repo, changeset): print "# Parent %s" % hg.hex(other) print change[4].rstrip() print - - dodiff(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""" diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -8,7 +8,8 @@ import difflib, struct from mercurial.mpatch import * -def unidiff(a, ad, b, bd, fn): +def unidiff(a, ad, b, bd, fn, r=None): + if not a and not b: return "" if a == None: @@ -36,6 +37,10 @@ def unidiff(a, ad, b, bd, fn): if l[ln][-1] != '\n': l[ln] += "\n\ No newline at end of file\n" + if r: + l.insert(0, "diff %s %s\n" % + (' '.join(["-r %s" % rev for rev in r]), fn)) + return "".join(l) def textdiff(a, b): diff --git a/tests/test-up-local-change.out b/tests/test-up-local-change.out --- a/tests/test-up-local-change.out +++ b/tests/test-up-local-change.out @@ -12,6 +12,7 @@ + echo abc + hg diff + sed 's/\(\(---\|+++\).*\)\t.*/\1/' +diff -r c19d34741b0a a --- a/a +++ b/a @@ -1,1 +1,1 @@ @@ -65,6 +66,7 @@ 1 + hg diff + sed 's/\(\(---\|+++\).*\)\t.*/\1/' +diff -r 1e71731e6fbb a --- a/a +++ b/a @@ -1,1 +1,1 @@