blob: 7b612041a94e3f355ed847a46b983831c9b169a0 [file] [log] [blame]
# Copyright 2016 The Fuchsia 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 recipe_api
class JiriApi(recipe_api.RecipeApi):
"""JiriApi provides support for Jiri managed checkouts."""
def __init__(self, *args, **kwargs):
super(JiriApi, self).__init__(*args, **kwargs)
self._jiri_executable = None
def __call__(self, *args, **kwargs):
"""Return a jiri command step."""
assert self._jiri_executable
name = kwargs.pop('name', 'jiri ' + args[0])
jiri_cmd = [self._jiri_executable]
return self.m.step(name, jiri_cmd + list(args), **kwargs)
def ensure_jiri(self, version=None):
with self.m.step.nest('ensure_jiri'):
with self.m.context(infra_steps=True):
jiri_package = ('fuchsia/tools/jiri/%s' %
self.m.cipd.platform_suffix())
cipd_dir = self.m.path['start_dir'].join('cipd', 'jiri')
self.m.cipd.ensure(cipd_dir,
{jiri_package: version or 'stable'})
self._jiri_executable = cipd_dir.join('jiri')
return self._jiri_executable
@property
def jiri(self):
return self._jiri_executable
def init(self, dir=None, **kwargs):
cmd = [
'init',
'-analytics-opt=false',
'-rewrite-sso-to-https=true',
'-cache', self.m.path['cache'].join('git'),
'-shared',
]
if dir:
cmd.append(dir)
return self(*cmd, **kwargs)
def project(self, projects, test_data=None):
cmd = [
'project',
'-json-output', self.m.json.output(),
] + projects
if test_data is None:
test_data = [{
"name": p,
"path": "/path/to/" + p,
"remote": "https://fuchsia.googlesource.com/" + p,
"revision": "c22471f4e3f842ae18dd9adec82ed9eb78ed1127",
"current_branch": "",
"branches": [ "(HEAD detached at c22471f)" ]
} for p in projects]
return self(*cmd, step_test_data=lambda: self.test_api.project(test_data))
def update(self, gc=False, run_hooks=True, snapshot=None, local_manifest=False, **kwargs):
cmd = [
'update',
'-autoupdate=false',
]
if gc:
cmd.append('-gc=true')
if local_manifest:
cmd.append('-local-manifest=true')
if not run_hooks:
cmd.append('-run-hooks=false')
if snapshot is not None:
cmd.append(snapshot)
return self(*cmd, **kwargs)
def run_hooks(self, local_manifest=False):
cmd = ['run-hooks']
if local_manifest:
cmd.append('-local-manifest=true')
return self(*cmd)
def clean(self, all=False, **kwargs):
cmd = [
'project',
'-clean-all' if all else '-clean',
]
kwargs.setdefault('name', 'jiri project clean')
return self(*cmd, **kwargs)
def import_manifest(self, manifest, remote, name=None, overwrite=False, **kwargs):
cmd = [ 'import' ]
if name:
cmd.extend(['-name', name])
if overwrite:
cmd.extend(['-overwrite=true'])
cmd.extend([manifest, remote])
return self(*cmd, **kwargs)
def edit_manifest(self, manifest, projects=None, imports=None, **kwargs):
cmd = [ 'edit' ]
if imports:
for i in imports:
if type(i) is str:
cmd.extend(['-import', i])
elif type(i) is tuple:
cmd.extend(['-import', '%s=%s' % i])
if projects:
for p in projects:
if type(p) is str:
cmd.extend(['-project', p])
elif type(p) is tuple:
cmd.extend(['-project', '%s=%s' % p])
cmd.extend([manifest])
return self(*cmd, **kwargs)
def patch(self, ref, host=None, delete=False, force=False, rebase=False,
**kwargs):
cmd = [ 'patch' ]
if host:
cmd.extend(['-host', host])
if delete:
cmd.extend(['-delete=true'])
if force:
cmd.extend(['-force=true'])
if rebase: # pragma: no cover
cmd.extend(['-rebase=true'])
cmd.extend([ref])
return self(*cmd, **kwargs)
def snapshot(self, file=None, test_data=None, **kwargs):
cmd = [
'snapshot',
self.m.raw_io.output(name='snapshot', leak_to=file),
]
if test_data is None:
test_data = self.test_api.example_snapshot
step = self(*cmd, step_test_data=lambda: self.test_api.snapshot(test_data), **kwargs)
return step.raw_io.output
def source_manifest(self, file=None, test_data=None, **kwargs):
cmd = [
'source-manifest',
self.m.json.output(name='source manifest', leak_to=file),
]
if test_data is None:
test_data = self.test_api.example_source_manifest
step = self(*cmd, step_test_data=lambda: self.test_api.source_manifest(test_data), **kwargs)
return step.json.output
def checkout(self, manifest, remote, patch_ref=None, patch_gerrit_url=None, project=None):
self.init()
self.import_manifest(manifest, remote, project)
self.update(run_hooks=False)
if patch_ref:
self.patch(patch_ref, host=patch_gerrit_url, rebase=True)
self.run_hooks()
manifest = self.source_manifest()
self.m.source_manifest.set_json_manifest('checkout', manifest)