Mercurial > hgsubversion
changeset 707:cb32d90f915e
templatekw: clean up implementation & test; add help.
The core logic is cleaned up and moved to the wrappers module. The
test made to test that it works with original Mercurial changesets, is
cleaned up so that it can be more easily extended in the
future. Finally, documentation is added for the feature.
author | Dan Villiom Podlaski Christiansen <danchr@gmail.com> |
---|---|
date | Wed, 29 Sep 2010 18:04:26 +0200 |
parents | 1f1a3a6730c1 |
children | f28c6d5d73fd |
files | hgsubversion/__init__.py hgsubversion/help/subversion.rst hgsubversion/util.py tests/test_template_keywords.py |
diffstat | 4 files changed, 51 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/hgsubversion/__init__.py +++ b/hgsubversion/__init__.py @@ -139,32 +139,8 @@ def uisetup(ui): else: help.helptable = help.helptable + entries - -def _get_svnmeta(ctx): - """Returns a dictionary with parsed convert_revision or None.""" - unparsed = ctx.extra().get('convert_revision', '') - if unparsed.startswith('svn:'): - unparsed = unparsed[4:] # remove "svn:" - return {'svnuuid': unparsed[:36], - 'svnpath': unparsed[36:].rsplit('@', 1)[0], - 'svnrev': unparsed[36:].rsplit('@', 1)[-1]} - return None - - -def _show_tpl_kw(ctx, kw): - convinfo = _get_svnmeta(ctx) - if convinfo is None: - return '' - return convinfo.get(kw, '') - - -if templatekw: - templatekw.keywords.update({ - 'svnrev': lambda repo, ctx, templ, **a: _show_tpl_kw(ctx, 'svnrev'), - 'svnpath': lambda repo, ctx, templ, **a: _show_tpl_kw(ctx, 'svnpath'), - 'svnuuid': lambda repo, ctx, templ, **a: _show_tpl_kw(ctx, 'svnuuid'), - }) - + if templatekw: + templatekw.keywords.update(util.templatekeywords) def reposetup(ui, repo): if repo.local():
--- a/hgsubversion/help/subversion.rst +++ b/hgsubversion/help/subversion.rst @@ -56,6 +56,18 @@ option with the HEAD argument causes the latest revision; later pulls will convert all revisions following the first. Please note that this only works for single-directory clones. +Displaying Subversion revisions +------------------------------------------- + +For revealing the relationship between Mercurial changesets and Subversion +revisions, hgsubversion provides three keywords, available when using Mercurial +1.5 or later. The "svnrev" keyword is expanded to the original Subversion +revision number. "svnpath" is the path within the repository that the changeset +represents, and "svnuuid" is the Universally Unique Identifier of the Subversion +repository. An example:: + + $ hg log --template='{rev}:{node|short} {author|user}\nsvn: {svnrev}\n' + Support for externals -----------------------------
--- a/hgsubversion/util.py +++ b/hgsubversion/util.py @@ -174,3 +174,27 @@ def issamefile(parentctx, childctx, f): return False # parentctx is not an ancestor of childctx, files are unrelated return False + +def _templatehelper(ctx, kw): + ''' + Helper function for displaying information about converted changesets. + ''' + convertinfo = ctx.extra().get('convert_revision', '') + + if not convertinfo or not convertinfo.startswith('svn:'): + return '' + + if kw == 'svnuuid': + return convertinfo[4:40] + elif kw == 'svnpath': + return convertinfo[40:].rsplit('@', 1)[0] + elif kw == 'svnrev': + return convertinfo[40:].rsplit('@', 1)[-1] + else: + raise hgutil.Abort('unrecognized hgsubversion keyword %s' % kw) + +templatekeywords = { + 'svnrev': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnrev')), + 'svnpath': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnpath')), + 'svnuuid': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnuuid')), +}
--- a/tests/test_template_keywords.py +++ b/tests/test_template_keywords.py @@ -20,28 +20,29 @@ class CapturingUI(ui.ui): def write(self, msg, *args, **kwds): self._output += msg -if templatekw: - class TestLogKeywords(test_util.TestBase): - +class TestLogKeywords(test_util.TestBase): + if templatekw: def test_svn_keywords(self): defaults = {'date': None, 'rev': None, 'user': None} repo = self._load_fixture_and_fetch('two_revs.svndump') + + # we want one commit that isn't from Subversion + self.commitchanges([('foo', 'foo', 'frobnicate\n')]) + ui = CapturingUI() commands.log(ui, repo, template='{rev}:{svnrev} ', **defaults) - self.assertEqual(ui._output, '0:2 1:3 ') + self.assertEqual(ui._output, '0:2 1:3 2: ') ui = CapturingUI() commands.log(ui, repo, template='{rev}:{svnpath} ', **defaults) - self.assertEqual(ui._output, '0:/trunk 1:/trunk ') + self.assertEqual(ui._output, '0:/trunk 1:/trunk 2: ') ui = CapturingUI() commands.log(ui, repo, template='{rev}:{svnuuid} ', **defaults) self.assertEqual(ui._output, ('0:df2126f7-00ab-4d49-b42c-7e981dde0bcf ' - '1:df2126f7-00ab-4d49-b42c-7e981dde0bcf ')) + '1:df2126f7-00ab-4d49-b42c-7e981dde0bcf ' + '2: ')) - def suite(): - all = [unittest.TestLoader().loadTestsFromTestCase(TestLogKeywords),] - return unittest.TestSuite(all) -else: - def suite(): - return unittest.TestSuite([]) +def suite(): + all = [unittest.TestLoader().loadTestsFromTestCase(TestLogKeywords),] + return unittest.TestSuite(all)