Mercurial > hgsubversion
view diff_cmd.py @ 120:f508c1fa19a5
hg_delta_editor: do not assume branches are copied from trunk by default
Here is what happen in jquery repository:
- kelvin-dev branch is created in r1617 with an empty directory for the
datePicker plugin
- commits are done
- datePicker plugin is merged in trunk
Before the fix, the converter assumed the initial empty commit had for parent
some other commit of trunk, therefore adding all its files, which was wrong.
And we ended with 'alignDemo.html' in converted trunk@5946 while it was not in
the source revision.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Sat, 29 Nov 2008 11:25:01 -0600 |
parents | 91ce18fa0375 |
children | 40474f6c1f84 |
line wrap: on
line source
#!/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))