uisetup: add fromsvn() and svnrev() revsets.

This commit is contained in:
Dan Villiom Podlaski Christiansen 2010-10-05 16:26:19 +02:00
parent 02dcb2eece
commit 04eaea5235
4 changed files with 94 additions and 1 deletions

View File

@ -40,6 +40,13 @@ try:
except ImportError: except ImportError:
templatekw = None templatekw = None
try:
from mercurial import revset
# force demandimport to load revset
revset.methods
except ImportError:
revset = None
import svncommands import svncommands
import util import util
import svnrepo import svnrepo
@ -142,6 +149,9 @@ def uisetup(ui):
if templatekw: if templatekw:
templatekw.keywords.update(util.templatekeywords) templatekw.keywords.update(util.templatekeywords)
if revset:
revset.symbols.update(util.revsets)
def reposetup(ui, repo): def reposetup(ui, repo):
if repo.local(): if repo.local():
svnrepo.generate_repo_class(ui, repo) svnrepo.generate_repo_class(ui, repo)

View File

@ -57,7 +57,7 @@ only convert the latest revision; later pulls will convert all revisions
following the first. Please note that this only works for single-directory following the first. Please note that this only works for single-directory
clones. clones.
Displaying Subversion revisions Finding and displaying Subversion revisions
------------------------------------------- -------------------------------------------
For revealing the relationship between Mercurial changesets and Subversion For revealing the relationship between Mercurial changesets and Subversion
@ -69,6 +69,16 @@ repository. An example::
$ hg log --template='{rev}:{node|short} {author|user}\nsvn: {svnrev}\n' $ hg log --template='{rev}:{node|short} {author|user}\nsvn: {svnrev}\n'
For finding changesets from Subversion, hgsubversion extends revsets to provide
two new selectors: ``fromsvn()`` and ``svnrev()``. (Revsets were introduced in
Mercurial 1.6 and are accepted by several Mercurial commands for specifying
revisions. See ``hg help revsets`` for details.) You can use ``fromsvn()`` to
select all changesets that originate from Subversion, and ``svnrev(REV)`` to
match changesets that originate in a specific Subversion revision. For example::
$ hg log -r 'fromsvn()'
$ hg log -r 'svnrev(500)'
Support for externals Support for externals
--------------------- ---------------------

View File

@ -3,10 +3,15 @@ import os
import urllib import urllib
from mercurial import cmdutil from mercurial import cmdutil
from mercurial import error
from mercurial import hg from mercurial import hg
from mercurial import node from mercurial import node
from mercurial import util as hgutil from mercurial import util as hgutil
try:
from mercurial import revset
except ImportError:
pass
b_re = re.compile(r'^\+\+\+ b\/([^\n]*)', re.MULTILINE) b_re = re.compile(r'^\+\+\+ b\/([^\n]*)', re.MULTILINE)
a_re = re.compile(r'^--- a\/([^\n]*)', re.MULTILINE) a_re = re.compile(r'^--- a\/([^\n]*)', re.MULTILINE)
@ -198,3 +203,35 @@ templatekeywords = {
'svnpath': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnpath')), 'svnpath': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnpath')),
'svnuuid': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnuuid')), 'svnuuid': (lambda repo, ctx, templ, **a: _templatehelper(ctx, 'svnuuid')),
} }
def revset_fromsvn(repo, subset, x):
args = revset.getargs(x, 0, 0, "fromsvn takes no arguments")
def matches(r):
convertinfo = repo[r].extra().get('convert_revision', '')
return convertinfo[:4] == 'svn:'
return [r for r in subset if matches(r)]
def revset_svnrev(repo, subset, x):
args = revset.getargs(x, 1, 1, "svnrev takes one argument")
rev = revset.getstring(args[0],
"the argument to svnrev() must be a number")
try:
rev = int(rev)
except ValueError:
raise error.ParseError("the argument to svnrev() must be a number")
def matches(r):
convertinfo = repo[r].extra().get('convert_revision', '')
if convertinfo[:4] != 'svn:':
return False
return int(convertinfo[40:].rsplit('@', 1)[-1]) == rev
return [r for r in subset if matches(r)]
revsets = {
'fromsvn': revset_fromsvn,
'svnrev': revset_svnrev,
}

View File

@ -3,6 +3,7 @@ import test_util
import unittest import unittest
from mercurial import commands from mercurial import commands
from mercurial import error
from mercurial import ui from mercurial import ui
try: try:
from mercurial import templatekw from mercurial import templatekw
@ -10,6 +11,11 @@ try:
except ImportError: except ImportError:
templatekw = None templatekw = None
try:
from mercurial import revset
revset.methods
except ImportError:
revset = None
class CapturingUI(ui.ui): class CapturingUI(ui.ui):
@ -43,6 +49,36 @@ class TestLogKeywords(test_util.TestBase):
'1:df2126f7-00ab-4d49-b42c-7e981dde0bcf ' '1:df2126f7-00ab-4d49-b42c-7e981dde0bcf '
'2: ')) '2: '))
if templatekw and revset:
def test_svn_revsets(self):
repo = self._load_fixture_and_fetch('two_revs.svndump')
# we want one commit that isn't from Subversion
self.commitchanges([('foo', 'foo', 'frobnicate\n')])
defaults = {'date': None, 'rev': ['fromsvn()'], 'user': None}
ui = CapturingUI()
commands.log(ui, repo, template='{rev}:{svnrev} ', **defaults)
self.assertEqual(ui._output, '0:2 1:3 ')
defaults = {'date': None, 'rev': ['svnrev(2)'], 'user': None}
ui = CapturingUI()
commands.log(ui, repo, template='{rev}:{svnrev} ', **defaults)
self.assertEqual(ui._output, '0:2 ')
defaults = {'date': None, 'rev': ['fromsvn(1)'], 'user': None}
self.assertRaises(error.ParseError,
commands.log, self.ui(), repo,
template='{rev}:{svnrev} ', **defaults)
defaults = {'date': None, 'rev': ['svnrev(1, 2)'], 'user': None}
self.assertRaises(error.ParseError,
commands.log, self.ui(), repo,
template='{rev}:{svnrev} ', **defaults)
def suite(): def suite():
all = [unittest.TestLoader().loadTestsFromTestCase(TestLogKeywords),] all = [unittest.TestLoader().loadTestsFromTestCase(TestLogKeywords),]