Index: git_common.py |
diff --git a/git_common.py b/git_common.py |
index b7626e8a3ed4d81434443ef15e427c2cae2bf89a..e7244790aceaad29e04f9a8ff43349c7fe5aaab0 100644 |
--- a/git_common.py |
+++ b/git_common.py |
@@ -281,6 +281,10 @@ def once(function): |
## Git functions |
+def die(message, *args): |
+ print >> sys.stderr, textwrap.dedent(message % args) |
+ sys.exit(1) |
+ |
def blame(filename, revision=None, porcelain=False, *_args): |
command = ['blame'] |
@@ -293,23 +297,14 @@ def blame(filename, revision=None, porcelain=False, *_args): |
def branch_config(branch, option, default=None): |
- return 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() |
+ return get_config('branch.%s.%s' % (branch, option), default=default) |
def branch_config_map(option): |
"""Return {branch: <|option| value>} for all branches.""" |
try: |
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)} |
except subprocess2.CalledProcessError: |
return {} |
@@ -319,23 +314,22 @@ def branches(*args): |
NO_BRANCH = ('* (no branch', '* (detached', '* (HEAD detached') |
key = 'depot-tools.branch-limit' |
- limit = 20 |
- try: |
- limit = int(config(key, limit)) |
- except ValueError: |
- pass |
+ limit = get_config_int(key, 20) |
raw_branches = run('branch', *args).splitlines() |
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. |
+ die("""\ |
+ Your git repo has too many branches (%d/%d) for this tool to work well. |
- You may adjust this limit by running: |
+ You may adjust this limit by running: |
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: |
if line.startswith(NO_BRANCH): |
@@ -343,20 +337,37 @@ def branches(*args): |
yield line.split()[-1] |
-def config(option, default=None): |
+def get_config(option, default=None): |
try: |
return run('config', '--get', option) or default |
except subprocess2.CalledProcessError: |
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: |
return run('config', '--get-all', option).split() |
except subprocess2.CalledProcessError: |
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(): |
try: |
return run('rev-parse', '--abbrev-ref', 'HEAD') |
@@ -567,7 +578,7 @@ def repo_root(): |
def root(): |
- return config('depot-tools.upstream', 'origin/master') |
+ return get_config('depot-tools.upstream', 'origin/master') |
@contextlib.contextmanager |