Refactor git_common config and die

R=iannucci@chromium.org
BUG=376099

Review-Url: https://codereview.chromium.org/2075603002
This commit is contained in:
agable
2016-06-21 07:47:00 -07:00
committed by Commit bot
parent a0e5cc40f0
commit 7aa2ddd81d
5 changed files with 56 additions and 41 deletions

View File

@@ -281,6 +281,10 @@ def once(function):
## Git functions ## Git functions
def die(message, *args):
print >> sys.stderr, textwrap.dedent(message % args)
sys.exit(1)
def blame(filename, revision=None, porcelain=False, *_args): def blame(filename, revision=None, porcelain=False, *_args):
command = ['blame'] command = ['blame']
@@ -293,23 +297,14 @@ def blame(filename, revision=None, porcelain=False, *_args):
def branch_config(branch, option, default=None): def branch_config(branch, option, default=None):
return config('branch.%s.%s' % (branch, option), default=default) return get_config('branch.%s.%s' % (branch, option), default=default)
def config_regexp(pattern):
if IS_WIN: # pragma: no cover
# this madness is because we call git.bat which calls git.exe which calls
# bash.exe (or something to that effect). Each layer divides the number of
# ^'s by 2.
pattern = pattern.replace('^', '^' * 8)
return run('config', '--get-regexp', pattern).splitlines()
def branch_config_map(option): def branch_config_map(option):
"""Return {branch: <|option| value>} for all branches.""" """Return {branch: <|option| value>} for all branches."""
try: try:
reg = re.compile(r'^branch\.(.*)\.%s$' % option) reg = re.compile(r'^branch\.(.*)\.%s$' % option)
lines = config_regexp(reg.pattern) lines = get_config_regexp(reg.pattern)
return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)} return {reg.match(k).group(1): v for k, v in (l.split() for l in lines)}
except subprocess2.CalledProcessError: except subprocess2.CalledProcessError:
return {} return {}
@@ -319,23 +314,22 @@ def branches(*args):
NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached')
key = 'depot-tools.branch-limit' key = 'depot-tools.branch-limit'
limit = 20 limit = get_config_int(key, 20)
try:
limit = int(config(key, limit))
except ValueError:
pass
raw_branches = run('branch', *args).splitlines() raw_branches = run('branch', *args).splitlines()
num = len(raw_branches) num = len(raw_branches)
if num > limit:
print >> sys.stderr, textwrap.dedent("""\
Your git repo has too many branches (%d/%d) for this tool to work well.
You may adjust this limit by running: if num > limit:
die("""\
Your git repo has too many branches (%d/%d) for this tool to work well.
You may adjust this limit by running:
git config %s <new_limit> git config %s <new_limit>
""" % (num, limit, key))
sys.exit(1) You may also try cleaning up your old branches by running:
git cl archive
""", num, limit, key)
for line in raw_branches: for line in raw_branches:
if line.startswith(NO_BRANCH): if line.startswith(NO_BRANCH):
@@ -343,20 +337,37 @@ def branches(*args):
yield line.split()[-1] yield line.split()[-1]
def config(option, default=None): def get_config(option, default=None):
try: try:
return run('config', '--get', option) or default return run('config', '--get', option) or default
except subprocess2.CalledProcessError: except subprocess2.CalledProcessError:
return default return default
def config_list(option): def get_config_int(option, default=0):
assert isinstance(default, int)
try:
return int(get_config(option, default))
except ValueError:
return default
def get_config_list(option):
try: try:
return run('config', '--get-all', option).split() return run('config', '--get-all', option).split()
except subprocess2.CalledProcessError: except subprocess2.CalledProcessError:
return [] return []
def get_config_regexp(pattern):
if IS_WIN: # pragma: no cover
# this madness is because we call git.bat which calls git.exe which calls
# bash.exe (or something to that effect). Each layer divides the number of
# ^'s by 2.
pattern = pattern.replace('^', '^' * 8)
return run('config', '--get-regexp', pattern).splitlines()
def current_branch(): def current_branch():
try: try:
return run('rev-parse', '--abbrev-ref', 'HEAD') return run('rev-parse', '--abbrev-ref', 'HEAD')
@@ -567,7 +578,7 @@ def repo_root():
def root(): def root():
return config('depot-tools.upstream', 'origin/master') return get_config('depot-tools.upstream', 'origin/master')
@contextlib.contextmanager @contextlib.contextmanager

View File

@@ -18,7 +18,7 @@ import sys
import subprocess2 import subprocess2
from git_common import current_branch, branches, tags, config_list, GIT_EXE from git_common import current_branch, branches, tags, get_config_list, GIT_EXE
from git_common import get_or_create_merge_base, root from git_common import get_or_create_merge_base, root
from third_party import colorama from third_party import colorama
@@ -38,7 +38,7 @@ RESET = colorama.Fore.RESET + colorama.Back.RESET + colorama.Style.RESET_ALL
BRIGHT_RED = '\x1b[1;31m' BRIGHT_RED = '\x1b[1;31m'
def main(argv): def main(argv):
map_extra = config_list('depot_tools.map_extra') map_extra = get_config_list('depot_tools.map_extra')
fmt = '%C(red bold)%h%x09%Creset%C(green)%d%Creset %C(yellow)%ad%Creset ~ %s' fmt = '%C(red bold)%h%x09%Creset%C(green)%d%Creset %C(yellow)%ad%Creset ~ %s'
log_proc = subprocess2.Popen( log_proc = subprocess2.Popen(
[GIT_EXE, 'log', '--graph', '--branches', '--tags', root(), [GIT_EXE, 'log', '--graph', '--branches', '--tags', root(),

View File

@@ -31,8 +31,8 @@ def find_return_branch_workdir():
These values may persist across multiple invocations of rebase-update, if These values may persist across multiple invocations of rebase-update, if
rebase-update runs into a conflict mid-way. rebase-update runs into a conflict mid-way.
""" """
return_branch = git.config(STARTING_BRANCH_KEY) return_branch = git.get_config(STARTING_BRANCH_KEY)
workdir = git.config(STARTING_WORKDIR_KEY) workdir = git.get_config(STARTING_WORKDIR_KEY)
if not return_branch: if not return_branch:
workdir = os.getcwd() workdir = os.getcwd()
git.set_config(STARTING_WORKDIR_KEY, workdir) git.set_config(STARTING_WORKDIR_KEY, workdir)
@@ -49,7 +49,7 @@ def fetch_remotes(branch_tree):
remotes = set() remotes = set()
tag_set = git.tags() tag_set = git.tags()
fetchspec_map = {} fetchspec_map = {}
all_fetchspec_configs = git.config_regexp(r'^remote\..*\.fetch') all_fetchspec_configs = git.get_config_regexp(r'^remote\..*\.fetch')
for fetchspec_config in all_fetchspec_configs: for fetchspec_config in all_fetchspec_configs:
key, _, fetchspec = fetchspec_config.partition(' ') key, _, fetchspec = fetchspec_config.partition(' ')
dest_spec = fetchspec.partition(':')[2] dest_spec = fetchspec.partition(':')[2]

View File

@@ -11,7 +11,7 @@ import subprocess2
import git_common as git import git_common as git
def main(args): def main(args):
default_args = git.config_list('depot-tools.upstream-diff.default-args') default_args = git.get_config_list('depot-tools.upstream-diff.default-args')
args = default_args + args args = default_args + args
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()

View File

@@ -415,26 +415,29 @@ class GitMutableFunctionsTest(git_test_utils.GitRepoReadWriteTestBase,
def testConfig(self): def testConfig(self):
self.repo.git('config', '--add', 'happy.derpies', 'food') self.repo.git('config', '--add', 'happy.derpies', 'food')
self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), self.assertEquals(self.repo.run(self.gc.get_config_list, 'happy.derpies'),
['food']) ['food'])
self.assertEquals(self.repo.run(self.gc.config_list, 'sad.derpies'), []) self.assertEquals(self.repo.run(self.gc.get_config_list, 'sad.derpies'), [])
self.repo.git('config', '--add', 'happy.derpies', 'cat') self.repo.git('config', '--add', 'happy.derpies', 'cat')
self.assertEquals(self.repo.run(self.gc.config_list, 'happy.derpies'), self.assertEquals(self.repo.run(self.gc.get_config_list, 'happy.derpies'),
['food', 'cat']) ['food', 'cat'])
self.assertEquals('cat', self.repo.run(self.gc.config, 'dude.bob', 'cat')) self.assertEquals('cat', self.repo.run(self.gc.get_config, 'dude.bob',
'cat'))
self.repo.run(self.gc.set_config, 'dude.bob', 'dog') self.repo.run(self.gc.set_config, 'dude.bob', 'dog')
self.assertEquals('dog', self.repo.run(self.gc.config, 'dude.bob', 'cat')) self.assertEquals('dog', self.repo.run(self.gc.get_config, 'dude.bob',
'cat'))
self.repo.run(self.gc.del_config, 'dude.bob') self.repo.run(self.gc.del_config, 'dude.bob')
# This should work without raising an exception # This should work without raising an exception
self.repo.run(self.gc.del_config, 'dude.bob') self.repo.run(self.gc.del_config, 'dude.bob')
self.assertEquals('cat', self.repo.run(self.gc.config, 'dude.bob', 'cat')) self.assertEquals('cat', self.repo.run(self.gc.get_config, 'dude.bob',
'cat'))
self.assertEquals('origin/master', self.repo.run(self.gc.root)) self.assertEquals('origin/master', self.repo.run(self.gc.root))
@@ -559,10 +562,11 @@ class GitMutableStructuredTest(git_test_utils.GitRepoReadWriteTestBase,
) )
self.assertEqual( self.assertEqual(
self.repo['B'], self.repo.run(self.gc.config, 'branch.branch_K.base') self.repo['B'], self.repo.run(self.gc.get_config, 'branch.branch_K.base')
) )
self.assertEqual( self.assertEqual(
'branch_G', self.repo.run(self.gc.config, 'branch.branch_K.base-upstream') 'branch_G', self.repo.run(self.gc.get_config,
'branch.branch_K.base-upstream')
) )
# deadbeef is a bad hash, so this will result in repo['B'] # deadbeef is a bad hash, so this will result in repo['B']
@@ -588,8 +592,8 @@ class GitMutableStructuredTest(git_test_utils.GitRepoReadWriteTestBase,
self.repo.run(self.gc.remove_merge_base, 'branch_K') self.repo.run(self.gc.remove_merge_base, 'branch_K')
self.repo.run(self.gc.remove_merge_base, 'branch_L') self.repo.run(self.gc.remove_merge_base, 'branch_L')
self.assertEqual(None, self.assertEqual(None, self.repo.run(self.gc.get_config,
self.repo.run(self.gc.config, 'branch.branch_K.base')) 'branch.branch_K.base'))
self.assertEqual({}, self.repo.run(self.gc.branch_config_map, 'base')) self.assertEqual({}, self.repo.run(self.gc.branch_config_map, 'base'))