Allow using `git cl cherry-pick` in a non-git environment.

This includes:
- adding `--host` parameter to `git-cl cherry-pick`
- adding `GetCommitMessage` to gerrit_util to be able to switch from `git show` used to get the commit message for a change

Bug: b/391547354
Change-Id: I9af227a78af5aaa1bdc98fc2520d98b413f0f3ed
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6180633
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
Commit-Queue: Gennady Tsitovich <gtsitovich@google.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
changes/33/6180633/15
Gennady Tsitovich 3 months ago committed by LUCI CQ
parent 49e10123de
commit 45716abe5c

@ -4568,13 +4568,9 @@ def _create_commit_message(orig_message, bug=None):
def CMDcherry_pick(parser, args): def CMDcherry_pick(parser, args):
"""Upload a chain of cherry picks to Gerrit. """Upload a chain of cherry picks to Gerrit.
This must be run inside the git repo you're trying to make changes to. This should either be run inside the git repo you're trying to make changes
to or "--host" should be provided.
""" """
if gclient_utils.IsEnvCog():
print('cherry-pick command is not supported in non-git environment',
file=sys.stderr)
return 1
parser.add_option('--branch', help='Gerrit branch, e.g. refs/heads/main') parser.add_option('--branch', help='Gerrit branch, e.g. refs/heads/main')
parser.add_option('--bug', parser.add_option('--bug',
help='Bug to add to the description of each change.') help='Bug to add to the description of each change.')
@ -4582,16 +4578,36 @@ def CMDcherry_pick(parser, args):
type='int', type='int',
help='The parent change of the first cherry-pick CL, ' help='The parent change of the first cherry-pick CL, '
'i.e. the start of the CL chain.') 'i.e. the start of the CL chain.')
parser.add_option('--host',
default=None,
help='Gerrit host, needed in case the command is used in '
'a non-git environment.')
options, args = parser.parse_args(args) options, args = parser.parse_args(args)
host = None
if options.host:
try:
host = urllib.parse.urlparse(host).hostname
except ValueError as e:
print(f'Unable to parse host: {host}. Error: {e}', file=sys.stderr)
return 1
else:
try:
host = Changelist().GetGerritHost()
except subprocess2.CalledProcessError:
pass
if not host:
print('Unable to determine host. cherry-pick command is not supported\n'
'in non-git environment without "--host" provided',
file=sys.stderr)
return 1
if not options.branch: if not options.branch:
parser.error('Branch is required.') parser.error('Branch is required.')
if not args: if not args:
parser.error('No revisions to cherry pick.') parser.error('No revisions to cherry pick.')
# TODO(b/341792235): Consider using GetCommitMessage after b/362567930 is
# fixed so this command can be run outside of a git workspace.
host = Changelist().GetGerritHost()
change_ids_to_message = {} change_ids_to_message = {}
change_ids_to_commit = {} change_ids_to_commit = {}
@ -4601,16 +4617,20 @@ def CMDcherry_pick(parser, args):
# unique. Gerrit will error with "Multiple changes found" if we use a # unique. Gerrit will error with "Multiple changes found" if we use a
# non-unique ID. Instead, query Gerrit with the hash and verify it # non-unique ID. Instead, query Gerrit with the hash and verify it
# corresponds to a unique CL. # corresponds to a unique CL.
changes = gerrit_util.QueryChanges(host, [('commit', commit)]) changes = gerrit_util.QueryChanges(
host=host,
params=[('commit', commit)],
o_params=['CURRENT_REVISION', 'CURRENT_COMMIT'],
)
if not changes: if not changes:
raise RuntimeError(f'No changes found for {commit}.') raise RuntimeError(f'No changes found for {commit}.')
if len(changes) > 1: if len(changes) > 1:
raise RuntimeError(f'Multiple changes found for {commit}.') raise RuntimeError(f'Multiple changes found for {commit}.')
change_id = changes[0]['id'] change = changes[0]
change_id = change['id']
message = change['revisions'][commit]['commit']['message']
change_ids_to_commit[change_id] = commit change_ids_to_commit[change_id] = commit
message = git_common.run('show', '-s', '--format=%B', commit).strip()
change_ids_to_message[change_id] = message change_ids_to_message[change_id] = message
print(f'Creating chain of {len(change_ids_to_message)} cherry pick(s)...') print(f'Creating chain of {len(change_ids_to_message)} cherry pick(s)...')

Loading…
Cancel
Save