mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
uisetup: add fromsvn() and svnrev() revsets.
This commit is contained in:
parent
02dcb2eece
commit
04eaea5235
@ -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)
|
||||||
|
@ -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
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
}
|
||||||
|
@ -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),]
|
||||||
|
Loading…
Reference in New Issue
Block a user