hgext/obsolescencehacks/__init__.py (45 lines of code) (raw):
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
"""Change behavior of obsolescence."""
import os
import pwd
from mercurial import (
configitems,
error,
obsolete,
pycompat,
registrar,
)
testedwith = b"4.4 4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.9"
minimumhgversion = b"4.4"
configtable = {}
configitem = registrar.configitem(configtable)
configitem(
b"obshacks", b"obsolescenceexchangeusers", default=configitems.dynamicdefault
)
configitem(b"obshacks", b"userfromenv", default=configitems.dynamicdefault)
def enableevolutionexchange(repo):
"""Enable obsolescence markers exchange if conditions are met."""
ui = repo.ui
# Nothing to do if obsolescence isn't enabled at all.
opts = (obsolete.createmarkersopt, obsolete.allowunstableopt, obsolete.exchangeopt)
if not any(obsolete.isenabled(repo, opt) for opt in opts):
return
features = set(ui.configlist(b"experimental", b"evolution"))
# Nothing to do if already enabled.
if b"all" in features or obsolete.exchangeopt in features:
return
# Enable exchange if the current user is in the allow list.
exchangeusers = ui.configlist(b"obshacks", b"obsolescenceexchangeusers", [])
if not exchangeusers:
return
# Some tests can't change the uid, so allow a test mode where the user
# comes from USER.
if ui.configbool(b"obshacks", b"userfromenv", False):
user = ui.environ.get(b"USER")
else:
try:
user = pycompat.bytestr(pwd.getpwuid(os.getuid()).pw_name)
except KeyError:
raise error.Abort(b"unable to resolve process user name")
if user not in exchangeusers:
return
ui.setconfig(
b"experimental",
b"evolution.%s" % obsolete.exchangeopt,
True,
source=b"obshacksext",
)
def reposetup(ui, repo):
enableevolutionexchange(repo)