mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
defa69c1d8
Summary: There was a change in core mercurial b319e3173a9534a2b7750b69ef446a803c3145ff that catches all exception from uisetup and extsetup. Let's throw subclass of BaseException in this case. Test Plan: arc unit Reviewers: #mercurial, mjpieters Reviewed By: mjpieters Subscribers: mjpieters, medson, #sourcecontrol Differential Revision: https://phabricator.intern.facebook.com/D5236650 Signature: t1:5236650:1497363414:9bbde3cabb696bb77a7ffddcb576923e5743c993
84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
# extorder.py - dependencies for extensions
|
|
#
|
|
# Copyright 2015 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.
|
|
"""
|
|
loading order for extensions.
|
|
|
|
In the extorder section of your hgrc you can define order of extension loading.
|
|
For example:
|
|
[extorder]
|
|
extension1 = extension3, extension4
|
|
extension2 = extension1
|
|
|
|
This will cause the extension1 to be loaded after 3 and 4. Also extension2 will
|
|
be loaded after extension1.
|
|
|
|
Also there are two special configs in this section: 'preferlast' and
|
|
'preferfirst'. Those are lists of extensions which prefer to be loaded first or
|
|
last. But these are not guaranteed -- normal dependencies have higher priority.
|
|
|
|
Please not that this extension modifies only order of loading extensions. It
|
|
will not load them for you
|
|
"""
|
|
|
|
from mercurial import extensions
|
|
try:
|
|
from mercurial import chgserver
|
|
except ImportError:
|
|
from hgext import chgserver
|
|
chgserver._configsections.append('extorder')
|
|
|
|
testedwith = 'ships-with-fb-hgext'
|
|
|
|
class MercurialExtOrderException(BaseException):
|
|
'''Special exception to bypass upstream exception catching
|
|
|
|
Upstream mercurial catches all Exception from uisetup or extsetup - see
|
|
ea1c2eb7abd341c84422f489af75bccb02622671. We need to throw something that is
|
|
subclass of BaseException to actually abort the program if extension order
|
|
is incorrect. That's why this class exists.
|
|
'''
|
|
pass
|
|
|
|
def uisetup(ui):
|
|
|
|
deps = {}
|
|
preferlast = []
|
|
preferfirst = []
|
|
|
|
for item, _v in ui.configitems('extorder'):
|
|
val = ui.configlist('extorder', item)
|
|
if item == 'preferlast':
|
|
preferlast.extend(val)
|
|
elif item == 'preferfirst':
|
|
preferfirst.extend(val)
|
|
else:
|
|
deps[item] = val
|
|
|
|
exts = list(extensions._order)
|
|
for e in preferfirst + preferlast:
|
|
exts.remove(e)
|
|
unvisited = preferfirst + exts + preferlast
|
|
|
|
temp = set()
|
|
order = list()
|
|
|
|
def visit(n):
|
|
if n in temp:
|
|
raise MercurialExtOrderException(
|
|
"extorder: conflicting extension order")
|
|
elif n in unvisited:
|
|
temp.add(n)
|
|
for m in deps.get(n, []):
|
|
visit(m)
|
|
unvisited.remove(n)
|
|
temp.remove(n)
|
|
order.append(n)
|
|
while len(unvisited) > 0:
|
|
visit(unvisited[0])
|
|
|
|
extensions._order = order
|