sapling/edenscm/hgext/phabdiff.py
Jun Wu 9dc21f8d0b codemod: import from the edenscm package
Summary:
D13853115 adds `edenscm/` to `sys.path` and code still uses `import mercurial`.
That has nasty problems if both `import mercurial` and
`import edenscm.mercurial` are used, because Python would think `mercurial.foo`
and `edenscm.mercurial.foo` are different modules so code like
`try: ... except mercurial.error.Foo: ...`, or `isinstance(x, mercurial.foo.Bar)`
would fail to handle the `edenscm.mercurial` version. There are also some
module-level states (ex. `extensions._extensions`) that would cause trouble if
they have multiple versions in a single process.

Change imports to use the `edenscm` so ideally the `mercurial` is no longer
imported at all. Add checks in extensions.py to catch unexpected extensions
importing modules from the old (wrong) locations when running tests.

Reviewed By: phillco

Differential Revision: D13868981

fbshipit-source-id: f4e2513766957fd81d85407994f7521a08e4de48
2019-01-29 17:25:32 -08:00

66 lines
2.0 KiB
Python

# phabdiff.py
#
# Copyright 2013 Facebook, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
import re
from edenscm.mercurial import cmdutil, registrar, templatekw
from edenscm.mercurial.node import hex
from .extlib.phabricator import diffprops
templatekeyword = registrar.templatekeyword()
@templatekeyword("phabdiff")
def showphabdiff(repo, ctx, templ, **args):
"""String. Return the phabricator diff id for a given hg rev."""
descr = ctx.description()
revision = diffprops.parserevfromcommitmsg(descr)
return "D" + revision if revision else ""
@templatekeyword("tasks")
def showtasks(**args):
"""String. Return the tasks associated with given hg rev."""
tasks = []
descr = args["ctx"].description()
match = re.search("(Tasks?|Task ID):(.*)", descr)
if match:
tasks = re.findall("\d+", match.group(0))
return templatekw.showlist("task", tasks, args)
@templatekeyword("singlepublicbase")
def singlepublicbase(repo, ctx, templ, **args):
"""String. Return the public base commit hash."""
base = repo.revs("last(::%d - not public())", ctx.rev())
if len(base):
return hex(repo[base.first()].node())
return ""
@templatekeyword("reviewers")
def showreviewers(repo, ctx, templ, **args):
"""String. Return the phabricator diff id for a given hg rev."""
if ctx.node() is None:
# working copy - use committemplate.reviewers, which can be found at
# templ.t.cache.
props = templ.cache
reviewersconfig = props.get("reviewers")
if reviewersconfig:
return cmdutil.rendertemplate(repo.ui, reviewersconfig, props)
else:
return None
else:
reviewers = []
descr = ctx.description()
match = re.search("Reviewers:(.*)", descr)
if match:
reviewers = filter(None, re.split("[\s,]", match.group(1)))
return templatekw.showlist("reviewer", reviewers, args)