Mercurial > hgsubversion
diff diff_cmd.py @ 100:91ce18fa0375
Add a diff command that behaves kind of like svn diff.
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Fri, 21 Nov 2008 16:15:23 -0600 |
parents | |
children | 40474f6c1f84 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/diff_cmd.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python +import re + +from mercurial import patch + +import util +import hg_delta_editor + +b_re = re.compile(r'^\+\+\+ b\/([^\n]*)', re.MULTILINE) +a_re = re.compile(r'^--- a\/([^\n]*)', re.MULTILINE) +devnull_re = re.compile(r'^([-+]{3}) /dev/null', re.MULTILINE) +header_re = re.compile(r'^diff --git .* b\/(.*)', re.MULTILINE) +newfile_devnull_re = re.compile(r'^--- /dev/null\n\+\+\+ b/([^\n]*)', + re.MULTILINE) +def filterdiff(diff, base_revision): + diff = newfile_devnull_re.sub(r'--- \1\t(revision 0)' '\n' + r'+++ \1\t(working copy)', + diff) + diff = a_re.sub(r'--- \1'+ ('\t(revision %d)' % base_revision), diff) + diff = b_re.sub(r'+++ \1' + '\t(working copy)', diff) + diff = devnull_re.sub(r'\1 /dev/null' '\t(working copy)', diff) + + diff = header_re.sub(r'Index: \1' + '\n' + ('=' * 67), diff) + return diff + + +@util.register_subcommand('diff') +def diff_command(ui, repo, hg_repo_path, **opts): + """Show a diff of the most recent revision against its parent from svn. + """ + hge = hg_delta_editor.HgChangeReceiver(hg_repo_path, + ui_=ui) + svn_commit_hashes = dict(zip(hge.revmap.itervalues(), + hge.revmap.iterkeys())) + o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes) + parent = repo.parents()[0] + if o_r: + parent = repo[o_r[-1]].parents()[0] + base_rev, _junk = svn_commit_hashes[parent.node()] + it = patch.diff(repo, parent.node(), None, + opts=patch.diffopts(ui, opts)) + ui.write(filterdiff(''.join(it), base_rev))