|
|
|
@ -245,6 +245,15 @@ def branches(*args):
|
|
|
|
|
yield line.split()[-1]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def run_with_retcode(*cmd, **kwargs):
|
|
|
|
|
"""Run a command but only return the status code."""
|
|
|
|
|
try:
|
|
|
|
|
run(*cmd, **kwargs)
|
|
|
|
|
return 0
|
|
|
|
|
except subprocess2.CalledProcessError as cpe:
|
|
|
|
|
return cpe.returncode
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def config(option, default=None):
|
|
|
|
|
try:
|
|
|
|
|
return run('config', '--get', option) or default
|
|
|
|
@ -322,16 +331,24 @@ def get_or_create_merge_base(branch, parent=None):
|
|
|
|
|
If parent is supplied, it's used instead of calling upstream(branch).
|
|
|
|
|
"""
|
|
|
|
|
base = branch_config(branch, 'base')
|
|
|
|
|
parent = parent or upstream(branch)
|
|
|
|
|
actual_merge_base = run('merge-base', parent, branch)
|
|
|
|
|
|
|
|
|
|
def is_ancestor(a, b):
|
|
|
|
|
return run_with_retcode('merge-base', '--is-ancestor', a, b) == 0
|
|
|
|
|
|
|
|
|
|
if base:
|
|
|
|
|
try:
|
|
|
|
|
run('merge-base', '--is-ancestor', base, branch)
|
|
|
|
|
logging.debug('Found pre-set merge-base for %s: %s', branch, base)
|
|
|
|
|
except subprocess2.CalledProcessError:
|
|
|
|
|
if not is_ancestor(base, branch):
|
|
|
|
|
logging.debug('Found WRONG pre-set merge-base for %s: %s', branch, base)
|
|
|
|
|
base = None
|
|
|
|
|
elif is_ancestor(base, actual_merge_base):
|
|
|
|
|
logging.debug('Found OLD pre-set merge-base for %s: %s', branch, base)
|
|
|
|
|
base = None
|
|
|
|
|
else:
|
|
|
|
|
logging.debug('Found pre-set merge-base for %s: %s', branch, base)
|
|
|
|
|
|
|
|
|
|
if not base:
|
|
|
|
|
base = run('merge-base', parent or upstream(branch), branch)
|
|
|
|
|
base = actual_merge_base
|
|
|
|
|
manual_merge_base(branch, base)
|
|
|
|
|
|
|
|
|
|
return base
|
|
|
|
|