mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 16:31:02 +03:00
59 lines
1.6 KiB
Python
59 lines
1.6 KiB
Python
|
# Copyright 2016 Facebook Inc.
|
||
|
#
|
||
|
# Locate and load arcanist configuration for a project
|
||
|
|
||
|
import errno
|
||
|
import json
|
||
|
import os
|
||
|
from mercurial import (
|
||
|
cmdutil,
|
||
|
error
|
||
|
)
|
||
|
|
||
|
cmdtable = {}
|
||
|
command = cmdutil.command(cmdtable)
|
||
|
|
||
|
class ArcConfigError(Exception):
|
||
|
pass
|
||
|
|
||
|
def _load_file(filename):
|
||
|
try:
|
||
|
with open(filename, 'r') as f:
|
||
|
return json.loads(f.read())
|
||
|
except IOError as ex:
|
||
|
if ex.errno == errno.ENOENT:
|
||
|
return None
|
||
|
raise
|
||
|
|
||
|
def load_for_path(path):
|
||
|
homedir = os.getenv('HOME')
|
||
|
if not homedir:
|
||
|
raise ArcConfigError('$HOME environment variable not found')
|
||
|
|
||
|
# Use their own file as a basis
|
||
|
userconfig = _load_file(os.path.join(homedir, '.arcrc')) or {}
|
||
|
|
||
|
# Walk up the path and augment with an .arcconfig if we find it,
|
||
|
# terminating the search at that point.
|
||
|
path = os.path.abspath(path)
|
||
|
while len(path) > 1:
|
||
|
config = _load_file(os.path.join(path, '.arcconfig'))
|
||
|
if config is not None:
|
||
|
userconfig.update(config)
|
||
|
# Return the located path too, as we need this for figuring
|
||
|
# out where we are relative to the fbsource root.
|
||
|
userconfig['_arcconfig_path'] = path
|
||
|
return userconfig
|
||
|
path = os.path.dirname(path)
|
||
|
|
||
|
raise ArcConfigError('no .arcconfig found')
|
||
|
|
||
|
@command('debugarcconfig')
|
||
|
def debugarcconfig(ui, repo, *args, **opts):
|
||
|
""" exists purely for testing and diagnostic purposes """
|
||
|
try:
|
||
|
config = load_for_path(repo.root)
|
||
|
ui.write(json.dumps(config, sort_keys=True), '\n')
|
||
|
except ArcConfigError as ex:
|
||
|
raise error.Abort(str(ex))
|