diff options
Diffstat (limited to 'llvm_tools/git.py')
-rwxr-xr-x | llvm_tools/git.py | 189 |
1 files changed, 96 insertions, 93 deletions
diff --git a/llvm_tools/git.py b/llvm_tools/git.py index 22c7002a..0f56aa0d 100755 --- a/llvm_tools/git.py +++ b/llvm_tools/git.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright 2020 The Chromium OS Authors. All rights reserved. +# Copyright 2020 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Git helper functions.""" -from __future__ import print_function import collections import os @@ -14,122 +13,126 @@ import re import subprocess import tempfile -CommitContents = collections.namedtuple('CommitContents', ['url', 'cl_number']) + +CommitContents = collections.namedtuple("CommitContents", ["url", "cl_number"]) def InChroot(): - """Returns True if currently in the chroot.""" - return 'CROS_WORKON_SRCROOT' in os.environ + """Returns True if currently in the chroot.""" + return "CROS_WORKON_SRCROOT" in os.environ def VerifyOutsideChroot(): - """Checks whether the script invoked was executed in the chroot. + """Checks whether the script invoked was executed in the chroot. - Raises: - AssertionError: The script was run inside the chroot. - """ + Raises: + AssertionError: The script was run inside the chroot. + """ - assert not InChroot(), 'Script should be run outside the chroot.' + assert not InChroot(), "Script should be run outside the chroot." def CreateBranch(repo, branch): - """Creates a branch in the given repo. + """Creates a branch in the given repo. - Args: - repo: The absolute path to the repo. - branch: The name of the branch to create. + Args: + repo: The absolute path to the repo. + branch: The name of the branch to create. - Raises: - ValueError: Failed to create a repo in that directory. - """ + Raises: + ValueError: Failed to create a repo in that directory. + """ - if not os.path.isdir(repo): - raise ValueError('Invalid directory path provided: %s' % repo) + if not os.path.isdir(repo): + raise ValueError("Invalid directory path provided: %s" % repo) - subprocess.check_output(['git', '-C', repo, 'reset', 'HEAD', '--hard']) + subprocess.check_output(["git", "-C", repo, "reset", "HEAD", "--hard"]) - subprocess.check_output(['repo', 'start', branch], cwd=repo) + subprocess.check_output(["repo", "start", branch], cwd=repo) def DeleteBranch(repo, branch): - """Deletes a branch in the given repo. + """Deletes a branch in the given repo. - Args: - repo: The absolute path of the repo. - branch: The name of the branch to delete. + Args: + repo: The absolute path of the repo. + branch: The name of the branch to delete. - Raises: - ValueError: Failed to delete the repo in that directory. - """ + Raises: + ValueError: Failed to delete the repo in that directory. + """ - if not os.path.isdir(repo): - raise ValueError('Invalid directory path provided: %s' % repo) + if not os.path.isdir(repo): + raise ValueError("Invalid directory path provided: %s" % repo) - subprocess.check_output(['git', '-C', repo, 'checkout', 'cros/main']) + subprocess.check_output(["git", "-C", repo, "checkout", "cros/main"]) - subprocess.check_output(['git', '-C', repo, 'reset', 'HEAD', '--hard']) + subprocess.check_output(["git", "-C", repo, "reset", "HEAD", "--hard"]) - subprocess.check_output(['git', '-C', repo, 'branch', '-D', branch]) + subprocess.check_output(["git", "-C", repo, "branch", "-D", branch]) def UploadChanges(repo, branch, commit_messages, reviewers=None, cc=None): - """Uploads the changes in the specifed branch of the given repo for review. - - Args: - repo: The absolute path to the repo where changes were made. - branch: The name of the branch to upload. - commit_messages: A string of commit message(s) (i.e. '[message]' - of the changes made. - reviewers: A list of reviewers to add to the CL. - cc: A list of contributors to CC about the CL. - - Returns: - A nametuple that has two (key, value) pairs, where the first pair is the - Gerrit commit URL and the second pair is the change list number. - - Raises: - ValueError: Failed to create a commit or failed to upload the - changes for review. - """ - - if not os.path.isdir(repo): - raise ValueError('Invalid path provided: %s' % repo) - - # Create a git commit. - with tempfile.NamedTemporaryFile(mode='w+t') as f: - f.write('\n'.join(commit_messages)) - f.flush() - - subprocess.check_output(['git', 'commit', '-F', f.name], cwd=repo) - - # Upload the changes for review. - git_args = [ - 'repo', - 'upload', - '--yes', - f'--reviewers={",".join(reviewers)}' if reviewers else '--ne', - '--no-verify', - f'--br={branch}', - ] - - if cc: - git_args.append(f'--cc={",".join(cc)}') - - out = subprocess.check_output( - git_args, - stderr=subprocess.STDOUT, - cwd=repo, - encoding='utf-8', - ) - - print(out) - - found_url = re.search( - r'https://chromium-review.googlesource.com/c/' - r'chromiumos/overlays/chromiumos-overlay/\+/([0-9]+)', out.rstrip()) - - if not found_url: - raise ValueError('Failed to find change list URL.') - - return CommitContents( - url=found_url.group(0), cl_number=int(found_url.group(1))) + """Uploads the changes in the specifed branch of the given repo for review. + + Args: + repo: The absolute path to the repo where changes were made. + branch: The name of the branch to upload. + commit_messages: A string of commit message(s) (i.e. '[message]' + of the changes made. + reviewers: A list of reviewers to add to the CL. + cc: A list of contributors to CC about the CL. + + Returns: + A nametuple that has two (key, value) pairs, where the first pair is the + Gerrit commit URL and the second pair is the change list number. + + Raises: + ValueError: Failed to create a commit or failed to upload the + changes for review. + """ + + if not os.path.isdir(repo): + raise ValueError("Invalid path provided: %s" % repo) + + # Create a git commit. + with tempfile.NamedTemporaryFile(mode="w+t") as f: + f.write("\n".join(commit_messages)) + f.flush() + + subprocess.check_output(["git", "commit", "-F", f.name], cwd=repo) + + # Upload the changes for review. + git_args = [ + "repo", + "upload", + "--yes", + f'--reviewers={",".join(reviewers)}' if reviewers else "--ne", + "--no-verify", + f"--br={branch}", + ] + + if cc: + git_args.append(f'--cc={",".join(cc)}') + + out = subprocess.check_output( + git_args, + stderr=subprocess.STDOUT, + cwd=repo, + encoding="utf-8", + ) + + print(out) + + found_url = re.search( + r"https://chromium-review.googlesource.com/c/" + r"chromiumos/overlays/chromiumos-overlay/\+/([0-9]+)", + out.rstrip(), + ) + + if not found_url: + raise ValueError("Failed to find change list URL.") + + return CommitContents( + url=found_url.group(0), cl_number=int(found_url.group(1)) + ) |