sapling/hgext3rd/gitrevset.py
Jun Wu 8a3a99ba21 hgext: move single file extensions to hgext3rd
Summary:
Be a better citizen under system python path.

Fix all tests issues and change setup.py to use glob pattern to include
all extensions.

Test Plan:
Run tests and `make local`.
Also build and install the package and run `hg sl` in major repos.

Reviewers: #mercurial, ttung, rmcelroy

Reviewed By: rmcelroy

Subscribers: rmcelroy, durham, mjpieters

Differential Revision: https://phabricator.intern.facebook.com/D3534311

Signature: t1:3534311:1468275426:fe122646c8bd6c541e1889e73e9df28f86747ff2
2016-07-08 13:15:42 +01:00

75 lines
2.4 KiB
Python

# gitrevset.py
#
# Copyright 2014 Facebook, Inc.
"""map a git hash to a Mercurial hash:
$ hg log -r 'gitnode($HASH)'
$ hg id -r 'gitnode($HASH)'
shortversion:
$ hg log -r 'g$HASH'
$ hg id -r 'g$HASH'
"""
from mercurial import extensions
from mercurial import error
from mercurial import hg
from mercurial import templatekw
from mercurial import revset
from mercurial.i18n import _
import re
githashre = re.compile('g([0-9a-fA-F]{40,40})')
def showgitnode(repo, ctx, templ, **args):
"""Return the git revision corresponding to a given hg rev"""
peerpath = repo.ui.expandpath('default')
# sshing can cause junk 'remote: ...' output to stdout, so we need to
# redirect it temporarily so automation can parse the result easily.
oldfout = repo.ui.fout
try:
repo.baseui.fout = repo.ui.ferr
remoterepo = hg.peer(repo, {}, peerpath)
remoterev = remoterepo.lookup('_gitlookup_hg_%s' % ctx.hex())
except error.RepoError:
# templates are expected to return an empty string when no data exists
return ''
finally:
repo.baseui.fout = oldfout
return remoterev.encode('hex')
def gitnode(repo, subset, x):
"""``gitnode(id)``
Return the hg revision corresponding to a given git rev."""
l = revset.getargs(x, 1, 1, _("id requires one argument"))
n = revset.getstring(l[0], _("id requires a string"))
peerpath = repo.ui.expandpath('default')
# sshing can cause junk 'remote: ...' output to stdout, so we need to
# redirect it temporarily so automation can parse the result easily.
oldfout = repo.ui.fout
try:
repo.baseui.fout = repo.ui.ferr
remoterepo = hg.peer(repo, {}, peerpath)
remoterev = remoterepo.lookup('_gitlookup_git_%s' % n)
finally:
repo.baseui.fout = oldfout
rn = repo[remoterev].rev()
return subset.filter(lambda r: r == rn)
def overridestringset(orig, repo, subset, x):
m = githashre.match(x)
if m is not None:
return gitnode(repo, subset, ('string', m.group(1)))
return orig(repo, subset, x)
def extsetup(ui):
templatekw.keywords['gitnode'] = showgitnode
revset.symbols['gitnode'] = gitnode
extensions.wrapfunction(revset, 'stringset', overridestringset)
revset.symbols['stringset'] = revset.stringset
revset.methods['string'] = revset.stringset
revset.methods['symbol'] = revset.stringset