[git] Add ls_remote to git recipe module
Call `git ls-remote` to determine the head revision for a branch, or the revision for a tag. The method is useful for bots which do not require a checkout. Bug: none Change-Id: Ibc01d1fb9c2714bd4d719159dbdaf3d7684ea1e9 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/6012563 Reviewed-by: Michael Achenbach <machenbach@chromium.org> Commit-Queue: Alexander Schulze <alexschulze@chromium.org> Reviewed-by: Gavin Mak <gavinmak@google.com>changes/63/6012563/6
parent
1538c996af
commit
c22f4dc74f
@ -0,0 +1,104 @@
|
||||
# Copyright 2024 The Chromium Authors. All rights reserved.
|
||||
# Use of this source code is governed by a BSD-style license that can be
|
||||
# found in the LICENSE file.
|
||||
|
||||
from recipe_engine import post_process as post
|
||||
|
||||
DEPS = [
|
||||
'recipe_engine/json',
|
||||
'recipe_engine/properties',
|
||||
'recipe_engine/raw_io',
|
||||
'recipe_engine/step',
|
||||
'git',
|
||||
]
|
||||
|
||||
REPO_URL = 'https://chromium.googlesource.com/v8/v8'
|
||||
|
||||
|
||||
def RunSteps(api):
|
||||
url = api.properties.get('url', REPO_URL)
|
||||
ref = api.properties.get('ref', 'main')
|
||||
tags = api.properties.get('tags', True)
|
||||
branches = api.properties.get('branches', True)
|
||||
|
||||
result = api.git.ls_remote(url, ref, tags=tags, branches=branches)
|
||||
api.step.empty('revision', step_text=result)
|
||||
|
||||
|
||||
def GenTests(api):
|
||||
|
||||
def mock_ls_remote(ref, revision_refs, retcode=None):
|
||||
lines = [f"{revision}\t{ref}" for revision, ref in revision_refs] + ['']
|
||||
|
||||
return api.step_data(
|
||||
f'Retrieve revision for {ref}',
|
||||
api.raw_io.stream_output_text(
|
||||
'\n'.join(lines),
|
||||
retcode=retcode or 0,
|
||||
stream='stdout',
|
||||
),
|
||||
)
|
||||
|
||||
def test(name, cmd, *checks, **kwargs):
|
||||
ref = cmd[-1]
|
||||
|
||||
return api.test(
|
||||
name,
|
||||
api.post_process(
|
||||
post.StepCommandEquals,
|
||||
f'Retrieve revision for {ref}',
|
||||
cmd,
|
||||
),
|
||||
*checks,
|
||||
api.post_process(post.DropExpectation),
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
yield test(
|
||||
'basic',
|
||||
['git', 'ls-remote', '-t', '-b', REPO_URL, 'main'],
|
||||
mock_ls_remote('main', [('badc0ffee0ded', 'refs/heads/main')]),
|
||||
api.post_process(
|
||||
post.StepTextEquals,
|
||||
'revision',
|
||||
'badc0ffee0ded',
|
||||
),
|
||||
)
|
||||
|
||||
yield test(
|
||||
'no-tags',
|
||||
['git', 'ls-remote', '-b', REPO_URL, 'main'],
|
||||
api.properties(tags=False),
|
||||
mock_ls_remote('main', [('badc0ffee0ded', 'refs/heads/main')]),
|
||||
)
|
||||
|
||||
yield test(
|
||||
'no-branches',
|
||||
['git', 'ls-remote', '-t', REPO_URL, 'main'],
|
||||
api.properties(branches=False),
|
||||
mock_ls_remote('main', [('badc0ffee0ded', 'refs/heads/main')]),
|
||||
)
|
||||
|
||||
yield test(
|
||||
'multiple-refs',
|
||||
['git', 'ls-remote', '-t', '-b', REPO_URL, '13.3.19'],
|
||||
api.properties(ref='13.3.19'),
|
||||
mock_ls_remote('13.3.19', [
|
||||
('badc0ffee0ded', 'refs/heads/13.3.19'),
|
||||
('c001c001c001d', 'refs/tags/13.3.19'),
|
||||
]),
|
||||
api.post_process(post.StatusFailure),
|
||||
api.post_process(post.SummaryMarkdown,
|
||||
"Multiple remote refs found for 13.3.19"),
|
||||
status='FAILURE',
|
||||
)
|
||||
|
||||
yield test(
|
||||
'no-refs',
|
||||
['git', 'ls-remote', '-t', '-b', REPO_URL, '13.3'],
|
||||
api.properties(ref='13.3'),
|
||||
mock_ls_remote('13.3', []),
|
||||
api.post_process(post.StatusFailure),
|
||||
api.post_process(post.SummaryMarkdown, "No remote ref found for 13.3"),
|
||||
status='FAILURE',
|
||||
)
|
Loading…
Reference in New Issue