view diff_cmd.py @ 218:a360ddc97719

branches: change handling again, but this time a little less magic. This change means that files located in the actual branches directory will now be wholly ignored. If we want to handle those correctly, it will take a reasonably large amount of work and probably a configuration flag. Also, any non-related paths outside of branches/trunk will be explicitly ignored, which is similar to the somewhat accidental pre-branch-refactor behavior. Finally, any unrelated files located as children of branches will cause the directory in branches to be used as the branch - not, as recently was the case, the directory immediately containing that file.
author Augie Fackler <durin42@gmail.com>
date Sat, 28 Mar 2009 16:38:57 -0500
parents 57355b0e7bd1
children
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


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()))
    parent = repo.parents()[0]
    o_r = util.outgoing_revisions(ui, repo, hge, svn_commit_hashes, parent.node())
    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={'git': True,
                                                  'show_function': False,
                                                  'ignore_all_space': False,
                                                  'ignore_space_change': False,
                                                  'ignore_blank_lines': False,
                                                  'unified': True,
                                                  'text': False,
                                                  }))
    ui.write(filterdiff(''.join(it), base_rev))
diff_command = util.register_subcommand('diff')(diff_command)