mirror of
https://chromium.googlesource.com/chromium/tools/depot_tools.git
synced 2026-01-11 18:51:29 +00:00
roll-dep: Add support for gclient root various levels above.
In some cases, gclient root is not the parent directory, it might be two levels above. This fixes it by asking gclient for the real root directory. Bug: 760633 Change-Id: I82d754f1c53259a111a74628f784d1bc461c18ef Reviewed-on: https://chromium-review.googlesource.com/999971 Reviewed-by: Aaron Gable <agable@chromium.org> Commit-Queue: Edward Lesmes <ehmaldonado@chromium.org>
This commit is contained in:
committed by
Commit Bot
parent
411041f9be
commit
3f277fc747
@@ -5,4 +5,6 @@ Once upon a time, a budding web browser dev team needed a CI system.
|
||||
All they had was one poor machine under a desk, and its name was Batty,
|
||||
the Build and Test Yeti.
|
||||
|
||||
Then suddenly,
|
||||
|
||||
😒
|
||||
|
||||
44
roll_dep.py
44
roll_dep.py
@@ -70,6 +70,10 @@ def should_show_log(upstream_url):
|
||||
return True
|
||||
|
||||
|
||||
def get_gclient_root():
|
||||
return check_output(['gclient', 'root']).strip()
|
||||
|
||||
|
||||
def get_deps(root):
|
||||
"""Returns the path and the content of the DEPS file."""
|
||||
deps_path = os.path.join(root, 'DEPS')
|
||||
@@ -129,7 +133,8 @@ def calculate_roll(full_dir, dependency, gclient_dict, roll_to):
|
||||
fetching the dependency via git.
|
||||
"""
|
||||
if dependency not in gclient_dict['deps']:
|
||||
raise Error('%s is not in the "deps" section of the DEPS file.')
|
||||
raise Error(
|
||||
'%s is not in the "deps" section of the DEPS file.' % dependency)
|
||||
|
||||
head = None
|
||||
if isinstance(gclient_dict['deps'][dependency], basestring):
|
||||
@@ -138,7 +143,7 @@ def calculate_roll(full_dir, dependency, gclient_dict, roll_to):
|
||||
and 'url' in gclient_dict['deps'][dependency]):
|
||||
_, _, head = gclient_dict['deps'][dependency]['url'].partition('@')
|
||||
else:
|
||||
raise Error('%s is not a valid git dependency.')
|
||||
raise Error('%s is not a valid git dependency.' % dependency)
|
||||
|
||||
if not head:
|
||||
raise Error('%s is unpinned.' % dependency)
|
||||
@@ -159,29 +164,21 @@ def gen_commit_msg(logs, cmdline, rolls, reviewers, bug):
|
||||
return commit_msg
|
||||
|
||||
|
||||
def get_full_dir(root, dependency, is_relative):
|
||||
"""Return the full path to the dependency."""
|
||||
root_dir = root
|
||||
if not is_relative:
|
||||
root_dir = os.path.dirname(root_dir)
|
||||
return os.path.normpath(os.path.join(root_dir, dependency))
|
||||
|
||||
|
||||
def finalize(commit_msg, deps_path, deps_content, rolls, is_relative):
|
||||
def finalize(commit_msg, deps_path, deps_content, rolls, is_relative, root_dir):
|
||||
"""Edits the DEPS file, commits it, then uploads a CL."""
|
||||
print('Commit message:')
|
||||
print('\n'.join(' ' + i for i in commit_msg.splitlines()))
|
||||
|
||||
with open(deps_path, 'wb') as f:
|
||||
f.write(deps_content)
|
||||
root = os.path.dirname(deps_path)
|
||||
check_call(['git', 'add', 'DEPS'], cwd=root)
|
||||
check_call(['git', 'commit', '--quiet', '-m', commit_msg], cwd=root)
|
||||
current_dir = os.path.dirname(deps_path)
|
||||
check_call(['git', 'add', 'DEPS'], cwd=current_dir)
|
||||
check_call(['git', 'commit', '--quiet', '-m', commit_msg], cwd=current_dir)
|
||||
|
||||
# Pull the dependency to the right revision. This is surprising to users
|
||||
# otherwise.
|
||||
for dependency, (_head, roll_to) in sorted(rolls.iteritems()):
|
||||
full_dir = get_full_dir(root, dependency, is_relative)
|
||||
full_dir = os.path.normpath(os.path.join(root_dir, dependency))
|
||||
check_call(['git', 'checkout', '--quiet', roll_to], cwd=full_dir)
|
||||
|
||||
|
||||
@@ -226,21 +223,24 @@ def main():
|
||||
if not '@' in r:
|
||||
reviewers[i] = r + '@chromium.org'
|
||||
|
||||
root = os.getcwd()
|
||||
gclient_root = get_gclient_root()
|
||||
current_dir = os.getcwd()
|
||||
dependencies = sorted(d.rstrip('/').rstrip('\\') for d in args.dep_path)
|
||||
cmdline = 'roll-dep ' + ' '.join(dependencies) + ''.join(
|
||||
' --key ' + k for k in args.key)
|
||||
try:
|
||||
if not args.ignore_dirty_tree and not is_pristine(root):
|
||||
raise Error('Ensure %s is clean first (no non-merged commits).' % root)
|
||||
if not args.ignore_dirty_tree and not is_pristine(current_dir):
|
||||
raise Error(
|
||||
'Ensure %s is clean first (no non-merged commits).' % current_dir)
|
||||
# First gather all the information without modifying anything, except for a
|
||||
# git fetch.
|
||||
deps_path, deps_content = get_deps(root)
|
||||
deps_path, deps_content = get_deps(current_dir)
|
||||
gclient_dict = gclient_eval.Parse(deps_content, True, True, deps_path)
|
||||
is_relative = gclient_dict.get('use_relative_paths', False)
|
||||
root_dir = current_dir if is_relative else gclient_root
|
||||
rolls = {}
|
||||
for dependency in dependencies:
|
||||
full_dir = get_full_dir(root, dependency, is_relative)
|
||||
full_dir = os.path.normpath(os.path.join(root_dir, dependency))
|
||||
if not os.path.isdir(full_dir):
|
||||
raise Error('Directory not found: %s (%s)' % (dependency, full_dir))
|
||||
head, roll_to = calculate_roll(
|
||||
@@ -256,7 +256,7 @@ def main():
|
||||
|
||||
logs = []
|
||||
for dependency, (head, roll_to) in sorted(rolls.iteritems()):
|
||||
full_dir = get_full_dir(root, dependency, is_relative)
|
||||
full_dir = os.path.normpath(os.path.join(root_dir, dependency))
|
||||
log = generate_commit_message(
|
||||
full_dir, dependency, head, roll_to, args.no_log, args.log_limit)
|
||||
logs.append(log)
|
||||
@@ -265,7 +265,7 @@ def main():
|
||||
deps_content = gclient_eval.RenderDEPSFile(gclient_dict)
|
||||
|
||||
commit_msg = gen_commit_msg(logs, cmdline, rolls, reviewers, args.bug)
|
||||
finalize(commit_msg, deps_path, deps_content, rolls, is_relative)
|
||||
finalize(commit_msg, deps_path, deps_content, rolls, is_relative, root_dir)
|
||||
except Error as e:
|
||||
sys.stderr.write('error: %s\n' % e)
|
||||
return 2 if isinstance(e, AlreadyRolledError) else 1
|
||||
|
||||
Reference in New Issue
Block a user