Adds bot_update to depot_tools.
This CL imports the bot_update script, along with the bot_update and gclient recipe modules from build. This should allow for recipes to run on swarming. Also moves the recipe stuff into the infra folder. bot_update has been modified. See full diff at https://paste.googleplex.com/4969207737352192 TBR=phajdan.jr@chromium.org BUG= Review URL: https://codereview.chromium.org/1641363002 git-svn-id: svn://svn.chromium.org/chrome/trunk/tools/depot_tools@298490 0039d316-1c4b-4281-b951-d872f2087c98changes/01/332501/1
parent
259b9f2305
commit
816d1ec60f
@ -0,0 +1 @@
|
||||
martiniss@chromium.org
|
@ -0,0 +1,27 @@
|
||||
from recipe_engine.recipe_api import Property
|
||||
|
||||
DEPS = [
|
||||
'gclient',
|
||||
'recipe_engine/json',
|
||||
'recipe_engine/path',
|
||||
'recipe_engine/platform',
|
||||
'recipe_engine/properties',
|
||||
'recipe_engine/python',
|
||||
'recipe_engine/raw_io',
|
||||
'rietveld',
|
||||
'recipe_engine/step',
|
||||
]
|
||||
|
||||
PROPERTIES = {
|
||||
'deps_revision_overrides': Property(default={}),
|
||||
'event_patchSet_ref': Property(param_name="event_patchSet_ref", default=None),
|
||||
'issue': Property(default=None),
|
||||
'fail_patch': Property(default=False),
|
||||
'failure_type': Property(default=None),
|
||||
'parent_got_revision': Property(default=None),
|
||||
'patchset': Property(default=None),
|
||||
'patch_url': Property(default=None),
|
||||
'rietveld': Property(default=None),
|
||||
'repository': Property(default=None),
|
||||
'revision': Property(default=None),
|
||||
}
|
@ -0,0 +1,280 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
|
||||
"""Recipe module to ensure a checkout is consistant on a bot."""
|
||||
|
||||
from recipe_engine import recipe_api
|
||||
|
||||
|
||||
# This is just for testing, to indicate if a master is using a Git scheduler
|
||||
# or not.
|
||||
SVN_MASTERS = (
|
||||
'experimental.svn',
|
||||
)
|
||||
|
||||
|
||||
def jsonish_to_python(spec, is_top=False):
|
||||
"""Turn a json spec into a python parsable object.
|
||||
|
||||
This exists because Gclient specs, while resembling json, is actually
|
||||
ingested using a python "eval()". Therefore a bit of plumming is required
|
||||
to turn our newly constructed Gclient spec into a gclient-readable spec.
|
||||
"""
|
||||
ret = ''
|
||||
if is_top: # We're the 'top' level, so treat this dict as a suite.
|
||||
ret = '\n'.join(
|
||||
'%s = %s' % (k, jsonish_to_python(spec[k])) for k in sorted(spec)
|
||||
)
|
||||
else:
|
||||
if isinstance(spec, dict):
|
||||
ret += '{'
|
||||
ret += ', '.join(
|
||||
"%s: %s" % (repr(str(k)), jsonish_to_python(spec[k]))
|
||||
for k in sorted(spec)
|
||||
)
|
||||
ret += '}'
|
||||
elif isinstance(spec, list):
|
||||
ret += '['
|
||||
ret += ', '.join(jsonish_to_python(x) for x in spec)
|
||||
ret += ']'
|
||||
elif isinstance(spec, basestring):
|
||||
ret = repr(str(spec))
|
||||
else:
|
||||
ret = repr(spec)
|
||||
return ret
|
||||
|
||||
|
||||
class BotUpdateApi(recipe_api.RecipeApi):
|
||||
|
||||
def __init__(self, deps_revision_overrides, issue, event_patchSet_ref,
|
||||
fail_patch, failure_type, parent_got_revision, patchset,
|
||||
patch_url, rietveld, repository, revision, *args, **kwargs):
|
||||
# I love my properties
|
||||
self._deps_revision_overrides = deps_revision_overrides
|
||||
self._issue = issue
|
||||
self._event_patchSet_ref = event_patchSet_ref
|
||||
self._fail_patch = fail_patch
|
||||
self._failure_type = failure_type
|
||||
self._parent_got_revision = parent_got_revision
|
||||
self._patchset = patchset
|
||||
self._patch_url = patch_url
|
||||
self._rietveld = rietveld
|
||||
self._repository = repository
|
||||
self._revision = revision
|
||||
|
||||
self._properties = {}
|
||||
super(BotUpdateApi, self).__init__(*args, **kwargs)
|
||||
|
||||
def __call__(self, name, cmd, **kwargs):
|
||||
"""Wrapper for easy calling of bot_update."""
|
||||
assert isinstance(cmd, (list, tuple))
|
||||
bot_update_path = self.resource('bot_update.py')
|
||||
kwargs.setdefault('infra_step', True)
|
||||
return self.m.python(name, bot_update_path, cmd, **kwargs)
|
||||
|
||||
@property
|
||||
def properties(self):
|
||||
return self._properties
|
||||
|
||||
def ensure_checkout(self, gclient_config=None, suffix=None,
|
||||
patch=True, update_presentation=True,
|
||||
force=False, patch_root=None, no_shallow=False,
|
||||
with_branch_heads=False, refs=None,
|
||||
patch_project_roots=None, patch_oauth2=False,
|
||||
output_manifest=True, clobber=False,
|
||||
root_solution_revision=None, **kwargs):
|
||||
refs = refs or []
|
||||
# We can re-use the gclient spec from the gclient module, since all the
|
||||
# data bot_update needs is already configured into the gclient spec.
|
||||
cfg = gclient_config or self.m.gclient.c
|
||||
spec_string = jsonish_to_python(cfg.as_jsonish(), True)
|
||||
|
||||
# Construct our bot_update command. This basically be inclusive of
|
||||
# everything required for bot_update to know:
|
||||
root = patch_root
|
||||
if root is None:
|
||||
root = cfg.solutions[0].name
|
||||
additional = self.m.rietveld.calculate_issue_root(patch_project_roots)
|
||||
if additional:
|
||||
root = self.m.path.join(root, additional)
|
||||
|
||||
if patch:
|
||||
issue = self._issue
|
||||
patchset = self._patchset
|
||||
patch_url = self._patch_url
|
||||
gerrit_repo = self._repository
|
||||
gerrit_ref = self._event_patchSet_ref
|
||||
else:
|
||||
# The trybot recipe sometimes wants to de-apply the patch. In which case
|
||||
# we pretend the issue/patchset/patch_url never existed.
|
||||
issue = patchset = patch_url = email_file = key_file = None
|
||||
gerrit_repo = gerrit_ref = None
|
||||
|
||||
# Issue and patchset must come together.
|
||||
if issue:
|
||||
assert patchset
|
||||
if patchset:
|
||||
assert issue
|
||||
if patch_url:
|
||||
# If patch_url is present, bot_update will actually ignore issue/ps.
|
||||
issue = patchset = None
|
||||
|
||||
# The gerrit_ref and gerrit_repo must be together or not at all. If one is
|
||||
# missing, clear both of them.
|
||||
if not gerrit_ref or not gerrit_repo:
|
||||
gerrit_repo = gerrit_ref = None
|
||||
assert (gerrit_ref != None) == (gerrit_repo != None)
|
||||
|
||||
# Point to the oauth2 auth files if specified.
|
||||
# These paths are where the bots put their credential files.
|
||||
if patch_oauth2:
|
||||
email_file = self.m.path['build'].join(
|
||||
'site_config', '.rietveld_client_email')
|
||||
key_file = self.m.path['build'].join(
|
||||
'site_config', '.rietveld_secret_key')
|
||||
else:
|
||||
email_file = key_file = None
|
||||
|
||||
rev_map = {}
|
||||
if self.m.gclient.c:
|
||||
rev_map = self.m.gclient.c.got_revision_mapping.as_jsonish()
|
||||
|
||||
flags = [
|
||||
# 1. What do we want to check out (spec/root/rev/rev_map).
|
||||
['--spec', spec_string],
|
||||
['--root', root],
|
||||
['--revision_mapping_file', self.m.json.input(rev_map)],
|
||||
|
||||
# 2. How to find the patch, if any (issue/patchset/patch_url).
|
||||
['--issue', issue],
|
||||
['--patchset', patchset],
|
||||
['--patch_url', patch_url],
|
||||
['--rietveld_server', self._rietveld],
|
||||
['--gerrit_repo', gerrit_repo],
|
||||
['--gerrit_ref', gerrit_ref],
|
||||
['--apply_issue_email_file', email_file],
|
||||
['--apply_issue_key_file', key_file],
|
||||
|
||||
# 3. Hookups to JSON output back into recipes.
|
||||
['--output_json', self.m.json.output()],]
|
||||
|
||||
|
||||
# Collect all fixed revisions to simulate them in the json output.
|
||||
# Fixed revision are the explicit input revisions of bot_update.py, i.e.
|
||||
# every command line parameter "--revision name@value".
|
||||
fixed_revisions = {}
|
||||
|
||||
revisions = {}
|
||||
for solution in cfg.solutions:
|
||||
if solution.revision:
|
||||
revisions[solution.name] = solution.revision
|
||||
elif solution == cfg.solutions[0]:
|
||||
revisions[solution.name] = (
|
||||
self._parent_got_revision or
|
||||
self._revision or
|
||||
'HEAD')
|
||||
if self.m.gclient.c and self.m.gclient.c.revisions:
|
||||
revisions.update(self.m.gclient.c.revisions)
|
||||
if cfg.solutions and root_solution_revision:
|
||||
revisions[cfg.solutions[0].name] = root_solution_revision
|
||||
# Allow for overrides required to bisect into rolls.
|
||||
revisions.update(self._deps_revision_overrides)
|
||||
for name, revision in sorted(revisions.items()):
|
||||
fixed_revision = self.m.gclient.resolve_revision(revision)
|
||||
if fixed_revision:
|
||||
fixed_revisions[name] = fixed_revision
|
||||
flags.append(['--revision', '%s@%s' % (name, fixed_revision)])
|
||||
|
||||
# Add extra fetch refspecs.
|
||||
for ref in refs:
|
||||
flags.append(['--refs', ref])
|
||||
|
||||
# Filter out flags that are None.
|
||||
cmd = [item for flag_set in flags
|
||||
for item in flag_set if flag_set[1] is not None]
|
||||
|
||||
if clobber:
|
||||
cmd.append('--clobber')
|
||||
if no_shallow:
|
||||
cmd.append('--no_shallow')
|
||||
if output_manifest:
|
||||
cmd.append('--output_manifest')
|
||||
if with_branch_heads or cfg.with_branch_heads:
|
||||
cmd.append('--with_branch_heads')
|
||||
|
||||
# Inject Json output for testing.
|
||||
# TODO(martinis, hinoka) remove me
|
||||
git_mode = True
|
||||
first_sln = cfg.solutions[0].name
|
||||
step_test_data = lambda: self.test_api.output_json(
|
||||
root, first_sln, rev_map, git_mode, force,
|
||||
self._fail_patch,
|
||||
output_manifest=output_manifest, fixed_revisions=fixed_revisions)
|
||||
|
||||
# Add suffixes to the step name, if specified.
|
||||
name = 'bot_update'
|
||||
if not patch:
|
||||
name += ' (without patch)'
|
||||
if suffix:
|
||||
name += ' - %s' % suffix
|
||||
|
||||
# Ah hah! Now that everything is in place, lets run bot_update!
|
||||
try:
|
||||
# 87 and 88 are the 'patch failure' codes for patch download and patch
|
||||
# apply, respectively. We don't actually use the error codes, and instead
|
||||
# rely on emitted json to determine cause of failure.
|
||||
self(name, cmd, step_test_data=step_test_data,
|
||||
ok_ret=(0, 87, 88), **kwargs)
|
||||
finally:
|
||||
step_result = self.m.step.active_result
|
||||
self._properties = step_result.json.output.get('properties', {})
|
||||
|
||||
if update_presentation:
|
||||
# Set properties such as got_revision.
|
||||
for prop_name, prop_value in self.properties.iteritems():
|
||||
step_result.presentation.properties[prop_name] = prop_value
|
||||
# Add helpful step description in the step UI.
|
||||
if 'step_text' in step_result.json.output:
|
||||
step_text = step_result.json.output['step_text']
|
||||
step_result.presentation.step_text = step_text
|
||||
# Add log line output.
|
||||
if 'log_lines' in step_result.json.output:
|
||||
for log_name, log_lines in step_result.json.output['log_lines']:
|
||||
step_result.presentation.logs[log_name] = log_lines.splitlines()
|
||||
|
||||
# Set the "checkout" path for the main solution.
|
||||
# This is used by the Chromium module to figure out where to look for
|
||||
# the checkout.
|
||||
# If there is a patch failure, emit another step that said things failed.
|
||||
if step_result.json.output.get('patch_failure'):
|
||||
return_code = step_result.json.output.get('patch_apply_return_code')
|
||||
if return_code == 3:
|
||||
# This is download failure, hence an infra failure.
|
||||
# Sadly, python.failing_step doesn't support kwargs.
|
||||
self.m.python.inline(
|
||||
'Patch failure',
|
||||
('import sys;'
|
||||
'print "Patch download failed. See bot_update step for details";'
|
||||
'sys.exit(1)'),
|
||||
infra_step=True,
|
||||
step_test_data=lambda: self.m.raw_io.test_api.output(
|
||||
'Patch download failed. See bot_update step for details',
|
||||
retcode=1)
|
||||
)
|
||||
else:
|
||||
# This is actual patch failure.
|
||||
step_result.presentation.properties['failure_type'] = 'PATCH_FAILURE'
|
||||
self.m.python.failing_step(
|
||||
'Patch failure', 'Check the bot_update step for details')
|
||||
|
||||
# bot_update actually just sets root to be the folder name of the
|
||||
# first solution.
|
||||
if step_result.json.output['did_run']:
|
||||
co_root = step_result.json.output['root']
|
||||
cwd = kwargs.get('cwd', self.m.path['slave_build'])
|
||||
if 'checkout' not in self.m.path:
|
||||
self.m.path['checkout'] = cwd.join(*co_root.split(self.m.path.sep))
|
||||
|
||||
return step_result
|
@ -0,0 +1,46 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@abc"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update (without patch)",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"abc\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,53 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--output_manifest"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"manifest\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"repository\": \"https://fake.org/src.git\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--with_branch_heads"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update - with branch heads",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--clobber"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--no_shallow"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,46 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@revision"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"revision\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,48 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--refs",
|
||||
"+refs/change/1/2/333"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,50 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--apply_issue_email_file",
|
||||
"[BUILD]/site_config/.rietveld_client_email",
|
||||
"--apply_issue_key_file",
|
||||
"[BUILD]/site_config/.rietveld_secret_key",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,48 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--patch_url",
|
||||
"http://src.chromium.org/foo/bar",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,50 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--patch_url",
|
||||
"http://src.chromium.org/foo/bar",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"step returned non-zero exit code: 1",
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@STEP_EXCEPTION@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"reason": "Infra Failure: Step('bot_update') returned 1",
|
||||
"status_code": 1
|
||||
}
|
||||
]
|
@ -0,0 +1,72 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--patch_url",
|
||||
"http://src.chromium.org/foo/bar",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"log_lines\": [@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ [@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch error\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"Patch failed to apply\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ ]@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ ], @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_apply_return_code\": 1, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@STEP_LOG_LINE@patch error@Patch failed to apply@@@",
|
||||
"@@@STEP_LOG_END@patch error@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@failure_type@\"PATCH_FAILURE\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"import sys; sys.exit(1)"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "Patch failure",
|
||||
"~followup_annotations": [
|
||||
"step returned non-zero exit code: 1",
|
||||
"@@@STEP_TEXT@Check the bot_update step for details@@@",
|
||||
"@@@STEP_FAILURE@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"reason": "Step('Patch failure') failed with return_code 1",
|
||||
"status_code": 1
|
||||
}
|
||||
]
|
@ -0,0 +1,72 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--patch_url",
|
||||
"http://src.chromium.org/foo/bar",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"log_lines\": [@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ [@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch error\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"Patch failed to apply\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ ]@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ ], @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_apply_return_code\": 3, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@STEP_LOG_LINE@patch error@Patch failed to apply@@@",
|
||||
"@@@STEP_LOG_END@patch error@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"import sys;print \"Patch download failed. See bot_update step for details\";sys.exit(1)"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "Patch failure",
|
||||
"~followup_annotations": [
|
||||
"step returned non-zero exit code: 1",
|
||||
"@@@STEP_LOG_LINE@python.inline@import sys;print \"Patch download failed. See bot_update step for details\";sys.exit(1)@@@",
|
||||
"@@@STEP_LOG_END@python.inline@@@",
|
||||
"@@@STEP_EXCEPTION@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"reason": "Infra Failure: Step('Patch failure') returned 1",
|
||||
"status_code": 1
|
||||
}
|
||||
]
|
@ -0,0 +1,51 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_MODULE[depot_tools.bot_update]/resources/bot_update.py",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn.chromium.org/chrome/trunk/src'}]",
|
||||
"--root",
|
||||
"src/v8",
|
||||
"--revision_mapping_file",
|
||||
"{\"src\": \"got_cr_revision\"}",
|
||||
"--patch_url",
|
||||
"http://src.chromium.org/foo/bar",
|
||||
"--output_json",
|
||||
"/path/to/tmp/json",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--revision",
|
||||
"src/v8@abc"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "bot_update",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_TEXT@Some step text@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"did_run\": true, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"fixed_revisions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src\": \"HEAD\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/v8\": \"abc\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_failure\": false, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"patch_root\": \"src/v8\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"properties\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"got_cr_revision_cp\": \"refs/heads/master@{#170242}\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"root\": \"src\", @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"step_text\": \"Some step text\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision@\"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_cr_revision_cp@\"refs/heads/master@{#170242}\"@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,107 @@
|
||||
# Copyright 2014 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.recipe_api import Property
|
||||
|
||||
DEPS = [
|
||||
'bot_update',
|
||||
'gclient',
|
||||
'recipe_engine/path',
|
||||
'recipe_engine/properties',
|
||||
]
|
||||
|
||||
PROPERTIES = {
|
||||
'clobber': Property(default=False, kind=bool),
|
||||
'no_shallow': Property(default=False, kind=bool),
|
||||
'oauth2': Property(default=False, kind=bool),
|
||||
'output_manifest': Property(default=False, kind=bool),
|
||||
'patch': Property(default=True, kind=bool),
|
||||
'refs': Property(default=[]),
|
||||
'revision': Property(default=None),
|
||||
'revisions': Property(default={}),
|
||||
'root_solution_revision': Property(default=None),
|
||||
'suffix': Property(default=None),
|
||||
'with_branch_heads': Property(default=False, kind=bool),
|
||||
}
|
||||
|
||||
def RunSteps(api, clobber, no_shallow, oauth2, output_manifest, patch, refs,
|
||||
revision, revisions, root_solution_revision, suffix,
|
||||
with_branch_heads):
|
||||
api.gclient.use_mirror = True
|
||||
|
||||
src_cfg = api.gclient.make_config()
|
||||
soln = src_cfg.solutions.add()
|
||||
soln.name = 'src'
|
||||
soln.url = 'svn://svn.chromium.org/chrome/trunk/src'
|
||||
soln.revision = revision
|
||||
api.gclient.c = src_cfg
|
||||
api.gclient.c.revisions = revisions
|
||||
api.gclient.c.got_revision_mapping['src'] = 'got_cr_revision'
|
||||
|
||||
api.bot_update.ensure_checkout(no_shallow=no_shallow,
|
||||
patch=patch,
|
||||
with_branch_heads=with_branch_heads,
|
||||
output_manifest=output_manifest,
|
||||
refs=refs, patch_oauth2=oauth2,
|
||||
clobber=clobber,
|
||||
root_solution_revision=root_solution_revision,
|
||||
suffix=suffix)
|
||||
|
||||
|
||||
def GenTests(api):
|
||||
yield api.test('basic') + api.properties(
|
||||
patch=False,
|
||||
revision='abc'
|
||||
)
|
||||
yield api.test('basic_with_branch_heads') + api.properties(
|
||||
with_branch_heads=True,
|
||||
suffix='with branch heads'
|
||||
)
|
||||
yield api.test('basic_output_manifest') + api.properties(
|
||||
output_manifest=True,
|
||||
)
|
||||
yield api.test('tryjob') + api.properties(
|
||||
issue=12345,
|
||||
patchset=654321,
|
||||
patch_url='http://src.chromium.org/foo/bar'
|
||||
)
|
||||
yield api.test('trychange') + api.properties(
|
||||
refs=['+refs/change/1/2/333'],
|
||||
)
|
||||
yield api.test('trychange_oauth2') + api.properties(
|
||||
oauth2=True,
|
||||
)
|
||||
yield api.test('tryjob_fail') + api.properties(
|
||||
issue=12345,
|
||||
patchset=654321,
|
||||
patch_url='http://src.chromium.org/foo/bar',
|
||||
) + api.step_data('bot_update', retcode=1)
|
||||
yield api.test('tryjob_fail_patch') + api.properties(
|
||||
issue=12345,
|
||||
patchset=654321,
|
||||
patch_url='http://src.chromium.org/foo/bar',
|
||||
fail_patch='apply',
|
||||
) + api.step_data('bot_update', retcode=88)
|
||||
yield api.test('tryjob_fail_patch_download') + api.properties(
|
||||
issue=12345,
|
||||
patchset=654321,
|
||||
patch_url='http://src.chromium.org/foo/bar',
|
||||
fail_patch='download'
|
||||
) + api.step_data('bot_update', retcode=87)
|
||||
yield api.test('no_shallow') + api.properties(
|
||||
no_shallow=True
|
||||
)
|
||||
yield api.test('clobber') + api.properties(
|
||||
clobber=True
|
||||
)
|
||||
yield api.test('reset_root_solution_revision') + api.properties(
|
||||
root_solution_revision='revision',
|
||||
)
|
||||
yield api.test('tryjob_v8') + api.properties(
|
||||
issue=12345,
|
||||
patchset=654321,
|
||||
patch_url='http://src.chromium.org/foo/bar',
|
||||
patch_project='v8',
|
||||
revisions={'src/v8': 'abc'}
|
||||
)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,74 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
import hashlib
|
||||
import os
|
||||
import struct
|
||||
import sys
|
||||
from recipe_engine import recipe_test_api
|
||||
|
||||
|
||||
class BotUpdateTestApi(recipe_test_api.RecipeTestApi):
|
||||
def output_json(self, root, first_sln, revision_mapping, git_mode,
|
||||
force=False, fail_patch=False, output_manifest=False,
|
||||
fixed_revisions=None):
|
||||
"""Deterministically synthesize json.output test data for gclient's
|
||||
--output-json option.
|
||||
"""
|
||||
active = True
|
||||
|
||||
output = {
|
||||
'did_run': active,
|
||||
'patch_failure': False
|
||||
}
|
||||
|
||||
# Add in extra json output if active.
|
||||
if active:
|
||||
properties = {
|
||||
property_name: self.gen_revision(project_name, git_mode)
|
||||
for project_name, property_name in revision_mapping.iteritems()
|
||||
}
|
||||
properties.update({
|
||||
'%s_cp' % property_name: ('refs/heads/master@{#%s}' %
|
||||
self.gen_revision(project_name, False))
|
||||
for project_name, property_name in revision_mapping.iteritems()
|
||||
})
|
||||
|
||||
output.update({
|
||||
'patch_root': root or first_sln,
|
||||
'root': first_sln,
|
||||
'properties': properties,
|
||||
'step_text': 'Some step text'
|
||||
})
|
||||
|
||||
if output_manifest:
|
||||
output.update({
|
||||
'manifest': {
|
||||
project_name: {
|
||||
'repository': 'https://fake.org/%s.git' % project_name,
|
||||
'revision': self.gen_revision(project_name, git_mode),
|
||||
}
|
||||
for project_name in revision_mapping
|
||||
}
|
||||
})
|
||||
|
||||
if fixed_revisions:
|
||||
output['fixed_revisions'] = fixed_revisions
|
||||
|
||||
if fail_patch:
|
||||
output['log_lines'] = [('patch error', 'Patch failed to apply'),]
|
||||
output['patch_failure'] = True
|
||||
output['patch_apply_return_code'] = 1
|
||||
if fail_patch == 'download':
|
||||
output['patch_apply_return_code'] = 3
|
||||
return self.m.json.output(output)
|
||||
|
||||
@staticmethod
|
||||
def gen_revision(project, GIT_MODE):
|
||||
"""Hash project to bogus deterministic revision values."""
|
||||
h = hashlib.sha1(project)
|
||||
if GIT_MODE:
|
||||
return h.hexdigest()
|
||||
else:
|
||||
return struct.unpack('!I', h.digest()[:4])[0] % 300000
|
@ -0,0 +1 @@
|
||||
DEPS = []
|
@ -0,0 +1,12 @@
|
||||
# Copyright (c) 2015 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.
|
||||
|
||||
"""Entry point for interacting with depot_tools from recipes."""
|
||||
|
||||
from recipe_engine import recipe_api
|
||||
|
||||
class DepotToolsApi(recipe_api.RecipeApi):
|
||||
@property
|
||||
def gclient_py(self):
|
||||
return self.package_resource('gclient.py')
|
@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"--help"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient help"
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,14 @@
|
||||
# Copyright (c) 2015 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.
|
||||
|
||||
DEPS = [
|
||||
'recipe_engine/python',
|
||||
'depot_tools',
|
||||
]
|
||||
|
||||
def RunSteps(api):
|
||||
api.python('gclient help', api.depot_tools.gclient_py, ['--help'])
|
||||
|
||||
def GenTests(api):
|
||||
yield api.test('basic')
|
@ -0,0 +1,10 @@
|
||||
DEPS = [
|
||||
'recipe_engine/json',
|
||||
'recipe_engine/path',
|
||||
'recipe_engine/platform',
|
||||
'recipe_engine/properties',
|
||||
'recipe_engine/python',
|
||||
'recipe_engine/step',
|
||||
'hacky_tryserver_detection',
|
||||
'depot_tools',
|
||||
]
|
@ -0,0 +1,309 @@
|
||||
# Copyright 2013 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 recipe_api
|
||||
|
||||
|
||||
class RevisionResolver(object):
|
||||
"""Resolves the revision based on build properties."""
|
||||
|
||||
def resolve(self, properties): # pragma: no cover
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
class RevisionFallbackChain(RevisionResolver):
|
||||
"""Specify that a given project's sync revision follows the fallback chain."""
|
||||
def __init__(self, default=None):
|
||||
self._default = default
|
||||
|
||||
def resolve(self, properties):
|
||||
"""Resolve the revision via the revision fallback chain.
|
||||
|
||||
If the given revision was set using the revision_fallback_chain() function,
|
||||
this function will follow the chain, looking at relevant build properties
|
||||
until it finds one set or reaches the end of the chain and returns the
|
||||
default. If the given revision was not set using revision_fallback_chain(),
|
||||
this function just returns it as-is.
|
||||
"""
|
||||
return (properties.get('parent_got_revision') or
|
||||
properties.get('orig_revision') or
|
||||
properties.get('revision') or
|
||||
self._default)
|
||||
|
||||
|
||||
def jsonish_to_python(spec, is_top=False):
|
||||
ret = ''
|
||||
if is_top: # We're the 'top' level, so treat this dict as a suite.
|
||||
ret = '\n'.join(
|
||||
'%s = %s' % (k, jsonish_to_python(spec[k])) for k in sorted(spec)
|
||||
)
|
||||
else:
|
||||
if isinstance(spec, dict):
|
||||
ret += '{'
|
||||
ret += ', '.join(
|
||||
"%s: %s" % (repr(str(k)), jsonish_to_python(spec[k]))
|
||||
for k in sorted(spec)
|
||||
)
|
||||
ret += '}'
|
||||
elif isinstance(spec, list):
|
||||
ret += '['
|
||||
ret += ', '.join(jsonish_to_python(x) for x in spec)
|
||||
ret += ']'
|
||||
elif isinstance(spec, basestring):
|
||||
ret = repr(str(spec))
|
||||
else:
|
||||
ret = repr(spec)
|
||||
return ret
|
||||
|
||||
class GclientApi(recipe_api.RecipeApi):
|
||||
# Singleton object to indicate to checkout() that we should run a revert if
|
||||
# we detect that we're on the tryserver.
|
||||
RevertOnTryserver = object()
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super(GclientApi, self).__init__(**kwargs)
|
||||
self.USE_MIRROR = None
|
||||
self._spec_alias = None
|
||||
|
||||
def __call__(self, name, cmd, infra_step=True, **kwargs):
|
||||
"""Wrapper for easy calling of gclient steps."""
|
||||
assert isinstance(cmd, (list, tuple))
|
||||
prefix = 'gclient '
|
||||
if self.spec_alias:
|
||||
prefix = ('[spec: %s] ' % self.spec_alias) + prefix
|
||||
|
||||
return self.m.python(prefix + name,
|
||||
self.m.depot_tools.gclient_py,
|
||||
cmd,
|
||||
infra_step=infra_step,
|
||||
**kwargs)
|
||||
|
||||
@property
|
||||
def use_mirror(self):
|
||||
"""Indicates if gclient will use mirrors in its configuration."""
|
||||
if self.USE_MIRROR is None:
|
||||
self.USE_MIRROR = self.m.properties.get('use_mirror', True)
|
||||
return self.USE_MIRROR
|
||||
|
||||
@use_mirror.setter
|
||||
def use_mirror(self, val): # pragma: no cover
|
||||
self.USE_MIRROR = val
|
||||
|
||||
@property
|
||||
def spec_alias(self):
|
||||
"""Optional name for the current spec for step naming."""
|
||||
return self._spec_alias
|
||||
|
||||
@spec_alias.setter
|
||||
def spec_alias(self, name):
|
||||
self._spec_alias = name
|
||||
|
||||
@spec_alias.deleter
|
||||
def spec_alias(self):
|
||||
self._spec_alias = None
|
||||
|
||||
def get_config_defaults(self):
|
||||
ret = {
|
||||
'USE_MIRROR': self.use_mirror
|
||||
}
|
||||
ret['CACHE_DIR'] = self.m.path['root'].join('git_cache')
|
||||
return ret
|
||||
|
||||
def resolve_revision(self, revision):
|
||||
if hasattr(revision, 'resolve'):
|
||||
return revision.resolve(self.m.properties)
|
||||
return revision
|
||||
|
||||
def sync(self, cfg, with_branch_heads=False, **kwargs):
|
||||
revisions = []
|
||||
for i, s in enumerate(cfg.solutions):
|
||||
if s.safesync_url: # prefer safesync_url in gclient mode
|
||||
continue
|
||||
if i == 0 and s.revision is None:
|
||||
s.revision = RevisionFallbackChain()
|
||||
|
||||
if s.revision is not None and s.revision != '':
|
||||
fixed_revision = self.resolve_revision(s.revision)
|
||||
if fixed_revision:
|
||||
revisions.extend(['--revision', '%s@%s' % (s.name, fixed_revision)])
|
||||
|
||||
for name, revision in sorted(cfg.revisions.items()):
|
||||
fixed_revision = self.resolve_revision(revision)
|
||||
if fixed_revision:
|
||||
revisions.extend(['--revision', '%s@%s' % (name, fixed_revision)])
|
||||
|
||||
test_data_paths = set(cfg.got_revision_mapping.keys() +
|
||||
[s.name for s in cfg.solutions])
|
||||
step_test_data = lambda: (
|
||||
self.test_api.output_json(test_data_paths, cfg.GIT_MODE))
|
||||
try:
|
||||
if not cfg.GIT_MODE:
|
||||
args = ['sync', '--nohooks', '--force', '--verbose']
|
||||
if cfg.delete_unversioned_trees:
|
||||
args.append('--delete_unversioned_trees')
|
||||
if with_branch_heads:
|
||||
args.append('--with_branch_heads')
|
||||
self('sync', args + revisions + ['--output-json', self.m.json.output()],
|
||||
step_test_data=step_test_data,
|
||||
**kwargs)
|
||||
else:
|
||||
# clean() isn't used because the gclient sync flags passed in checkout()
|
||||
# do much the same thing, and they're more correct than doing a separate
|
||||
# 'gclient revert' because it makes sure the other args are correct when
|
||||
# a repo was deleted and needs to be re-cloned (notably
|
||||
# --with_branch_heads), whereas 'revert' uses default args for clone
|
||||
# operations.
|
||||
#
|
||||
# TODO(mmoss): To be like current official builders, this step could
|
||||
# just delete the whole <slave_name>/build/ directory and start each
|
||||
# build from scratch. That might be the least bad solution, at least
|
||||
# until we have a reliable gclient method to produce a pristine working
|
||||
# dir for git-based builds (e.g. maybe some combination of 'git
|
||||
# reset/clean -fx' and removing the 'out' directory).
|
||||
j = '-j2' if self.m.platform.is_win else '-j8'
|
||||
args = ['sync', '--verbose', '--with_branch_heads', '--nohooks', j,
|
||||
'--reset', '--force', '--upstream', '--no-nag-max']
|
||||
if cfg.delete_unversioned_trees:
|
||||
args.append('--delete_unversioned_trees')
|
||||
self('sync', args + revisions +
|
||||
['--output-json', self.m.json.output()],
|
||||
step_test_data=step_test_data,
|
||||
**kwargs)
|
||||
finally:
|
||||
result = self.m.step.active_result
|
||||
data = result.json.output
|
||||
for path, info in data['solutions'].iteritems():
|
||||
# gclient json paths always end with a slash
|
||||
path = path.rstrip('/')
|
||||
if path in cfg.got_revision_mapping:
|
||||
propname = cfg.got_revision_mapping[path]
|
||||
result.presentation.properties[propname] = info['revision']
|
||||
|
||||
return result
|
||||
|
||||
def inject_parent_got_revision(self, gclient_config=None, override=False):
|
||||
"""Match gclient config to build revisions obtained from build_properties.
|
||||
|
||||
Args:
|
||||
gclient_config (gclient config object) - The config to manipulate. A value
|
||||
of None manipulates the module's built-in config (self.c).
|
||||
override (bool) - If True, will forcibly set revision and custom_vars
|
||||
even if the config already contains values for them.
|
||||
"""
|
||||
cfg = gclient_config or self.c
|
||||
|
||||
for prop, custom_var in cfg.parent_got_revision_mapping.iteritems():
|
||||
val = str(self.m.properties.get(prop, ''))
|
||||
# TODO(infra): Fix coverage.
|
||||
if val: # pragma: no cover
|
||||
# Special case for 'src', inject into solutions[0]
|
||||
if custom_var is None:
|
||||
# This is not covered because we are deprecating this feature and
|
||||
# it is no longer used by the public recipes.
|
||||
if cfg.solutions[0].revision is None or override: # pragma: no cover
|
||||
cfg.solutions[0].revision = val
|
||||
else:
|
||||
if custom_var not in cfg.solutions[0].custom_vars or override:
|
||||
cfg.solutions[0].custom_vars[custom_var] = val
|
||||
|
||||
def checkout(self, gclient_config=None, revert=RevertOnTryserver,
|
||||
inject_parent_got_revision=True, with_branch_heads=False,
|
||||
**kwargs):
|
||||
"""Return a step generator function for gclient checkouts."""
|
||||
cfg = gclient_config or self.c
|
||||
assert cfg.complete()
|
||||
|
||||
if revert is self.RevertOnTryserver:
|
||||
revert = self.m.hacky_tryserver_detection.is_tryserver
|
||||
|
||||
if inject_parent_got_revision:
|
||||
self.inject_parent_got_revision(cfg, override=True)
|
||||
|
||||
spec_string = jsonish_to_python(cfg.as_jsonish(), True)
|
||||
|
||||
self('setup', ['config', '--spec', spec_string], **kwargs)
|
||||
|
||||
sync_step = None
|
||||
try:
|
||||
if not cfg.GIT_MODE:
|
||||
try:
|
||||
if revert:
|
||||
self.revert(**kwargs)
|
||||
finally:
|
||||
sync_step = self.sync(cfg, with_branch_heads=with_branch_heads,
|
||||
**kwargs)
|
||||
else:
|
||||
sync_step = self.sync(cfg, with_branch_heads=with_branch_heads,
|
||||
**kwargs)
|
||||
|
||||
cfg_cmds = [
|
||||
('user.name', 'local_bot'),
|
||||
('user.email', 'local_bot@example.com'),
|
||||
]
|
||||
for var, val in cfg_cmds:
|
||||
name = 'recurse (git config %s)' % var
|
||||
self(name, ['recurse', 'git', 'config', var, val], **kwargs)
|
||||
|
||||
finally:
|
||||
cwd = kwargs.get('cwd', self.m.path['slave_build'])
|
||||
if 'checkout' not in self.m.path:
|
||||
self.m.path['checkout'] = cwd.join(
|
||||
*cfg.solutions[0].name.split(self.m.path.sep))
|
||||
|
||||
return sync_step
|
||||
|
||||
def revert(self, **kwargs):
|
||||
"""Return a gclient_safe_revert step."""
|
||||
# Not directly calling gclient, so don't use self().
|
||||
alias = self.spec_alias
|
||||
prefix = '%sgclient ' % (('[spec: %s] ' % alias) if alias else '')
|
||||
|
||||
return self.m.python(prefix + 'revert',
|
||||
self.m.path['build'].join('scripts', 'slave', 'gclient_safe_revert.py'),
|
||||
['.', self.m.path['depot_tools'].join('gclient',
|
||||
platform_ext={'win': '.bat'})],
|
||||
infra_step=True,
|
||||
**kwargs
|
||||
)
|
||||
|
||||
def runhooks(self, args=None, name='runhooks', **kwargs):
|
||||
args = args or []
|
||||
assert isinstance(args, (list, tuple))
|
||||
return self(
|
||||
name, ['runhooks'] + list(args), infra_step=False, **kwargs)
|
||||
|
||||
@property
|
||||
def is_blink_mode(self):
|
||||
""" Indicates wether the caller is to use the Blink config rather than the
|
||||
Chromium config. This may happen for one of two reasons:
|
||||
1. The builder is configured to always use TOT Blink. (factory property
|
||||
top_of_tree_blink=True)
|
||||
2. A try job comes in that applies to the Blink tree. (patch_project is
|
||||
blink)
|
||||
"""
|
||||
return (
|
||||
self.m.properties.get('top_of_tree_blink') or
|
||||
self.m.properties.get('patch_project') == 'blink')
|
||||
|
||||
def break_locks(self):
|
||||
"""Remove all index.lock files. If a previous run of git crashed, bot was
|
||||
reset, etc... we might end up with leftover index.lock files.
|
||||
"""
|
||||
self.m.python.inline(
|
||||
'cleanup index.lock',
|
||||
"""
|
||||
import os, sys
|
||||
|
||||
build_path = sys.argv[1]
|
||||
if os.path.exists(build_path):
|
||||
for (path, dir, files) in os.walk(build_path):
|
||||
for cur_file in files:
|
||||
if cur_file.endswith('index.lock'):
|
||||
path_to_file = os.path.join(path, cur_file)
|
||||
print 'deleting %s' % path_to_file
|
||||
os.remove(path_to_file)
|
||||
""",
|
||||
args=[self.m.path['slave_build']],
|
||||
infra_step=True,
|
||||
)
|
@ -0,0 +1,80 @@
|
||||
# Copyright 2013 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.
|
||||
|
||||
import types
|
||||
|
||||
from recipe_engine.config import config_item_context, ConfigGroup, BadConf
|
||||
from recipe_engine.config import ConfigList, Dict, Single, Static, Set, List
|
||||
|
||||
from . import api as gclient_api
|
||||
|
||||
|
||||
def BaseConfig(USE_MIRROR=True, GIT_MODE=False, CACHE_DIR=None,
|
||||
PATCH_PROJECT=None, BUILDSPEC_VERSION=None,
|
||||
**_kwargs):
|
||||
deps = '.DEPS.git' if GIT_MODE else 'DEPS'
|
||||
cache_dir = str(CACHE_DIR) if GIT_MODE and CACHE_DIR else None
|
||||
return ConfigGroup(
|
||||
solutions = ConfigList(
|
||||
lambda: ConfigGroup(
|
||||
name = Single(basestring),
|
||||
url = Single(basestring),
|
||||
deps_file = Single(basestring, empty_val=deps, required=False,
|
||||
hidden=False),
|
||||
managed = Single(bool, empty_val=True, required=False, hidden=False),
|
||||
custom_deps = Dict(value_type=(basestring, types.NoneType)),
|
||||
custom_vars = Dict(value_type=basestring),
|
||||
safesync_url = Single(basestring, required=False),
|
||||
|
||||
revision = Single(
|
||||
(basestring, gclient_api.RevisionResolver),
|
||||
required=False, hidden=True),
|
||||
)
|
||||
),
|
||||
deps_os = Dict(value_type=basestring),
|
||||
hooks = List(basestring),
|
||||
target_os = Set(basestring),
|
||||
target_os_only = Single(bool, empty_val=False, required=False),
|
||||
cache_dir = Static(cache_dir, hidden=False),
|
||||
|
||||
# If supplied, use this as the source root (instead of the first solution's
|
||||
# checkout).
|
||||
src_root = Single(basestring, required=False, hidden=True),
|
||||
|
||||
# Maps 'solution' -> build_property
|
||||
got_revision_mapping = Dict(hidden=True),
|
||||
|
||||
# Addition revisions we want to pass in. For now theres a duplication
|
||||
# of code here of setting custom vars AND passing in --revision. We hope
|
||||
# to remove custom vars later.
|
||||
revisions = Dict(
|
||||
value_type=(basestring, gclient_api.RevisionResolver),
|
||||
hidden=True),
|
||||
|
||||
# TODO(iannucci): HACK! The use of None here to indicate that we apply this
|
||||
# to the solution.revision field is really terrible. I mostly blame
|
||||
# gclient.
|
||||
# Maps 'parent_build_property' -> 'custom_var_name'
|
||||
# Maps 'parent_build_property' -> None
|
||||
# If value is None, the property value will be applied to
|
||||
# solutions[0].revision. Otherwise, it will be applied to
|
||||
# solutions[0].custom_vars['custom_var_name']
|
||||
parent_got_revision_mapping = Dict(hidden=True),
|
||||
delete_unversioned_trees = Single(bool, empty_val=True, required=False),
|
||||
|
||||
# Check out refs/branch-heads.
|
||||
# TODO (machenbach): Only implemented for bot_update atm.
|
||||
with_branch_heads = Single(
|
||||
bool,
|
||||
empty_val=False,
|
||||
required=False,
|
||||
hidden=True),
|
||||
|
||||
GIT_MODE = Static(bool(GIT_MODE)),
|
||||
USE_MIRROR = Static(bool(USE_MIRROR)),
|
||||
PATCH_PROJECT = Static(str(PATCH_PROJECT), hidden=True),
|
||||
BUILDSPEC_VERSION= Static(BUILDSPEC_VERSION, hidden=True),
|
||||
)
|
||||
|
||||
config_ctx = config_item_context(BaseConfig)
|
@ -0,0 +1,157 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = '[ROOT]/git_cache'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--verbose",
|
||||
"--with_branch_heads",
|
||||
"--nohooks",
|
||||
"-j8",
|
||||
"--reset",
|
||||
"--force",
|
||||
"--upstream",
|
||||
"--no-nag-max",
|
||||
"--delete_unversioned_trees",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.name",
|
||||
"local_bot"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.name)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.email",
|
||||
"local_bot@example.com"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.email)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'WebKit', 'safesync_url': 'https://blink-status.appspot.com/lkgr', 'url': 'svn://svn.chromium.org/blink/trunk'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--nohooks",
|
||||
"--force",
|
||||
"--verbose",
|
||||
"--delete_unversioned_trees",
|
||||
"--with_branch_heads",
|
||||
"--revision",
|
||||
"third_party/WebKit@123",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"WebKit/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 241198@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/blatley/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 248087@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_blatley_revision@248087@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"\nimport os, sys\n\nbuild_path = sys.argv[1]\nif os.path.exists(build_path):\n for (path, dir, files) in os.walk(build_path):\n for cur_file in files:\n if cur_file.endswith('index.lock'):\n path_to_file = os.path.join(path, cur_file)\n print 'deleting %s' % path_to_file\n os.remove(path_to_file)\n",
|
||||
"[SLAVE_BUILD]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "cleanup index.lock",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@import os, sys@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@build_path = sys.argv[1]@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@if os.path.exists(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for (path, dir, files) in os.walk(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for cur_file in files:@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ if cur_file.endswith('index.lock'):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ path_to_file = os.path.join(path, cur_file)@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ print 'deleting %s' % path_to_file@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ os.remove(path_to_file)@@@",
|
||||
"@@@STEP_LOG_END@python.inline@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"runhooks"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient runhooks"
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,159 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = '[ROOT]/git_cache'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--verbose",
|
||||
"--with_branch_heads",
|
||||
"--nohooks",
|
||||
"-j8",
|
||||
"--reset",
|
||||
"--force",
|
||||
"--upstream",
|
||||
"--no-nag-max",
|
||||
"--delete_unversioned_trees",
|
||||
"--revision",
|
||||
"src@abc",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.name",
|
||||
"local_bot"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.name)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.email",
|
||||
"local_bot@example.com"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.email)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'WebKit', 'safesync_url': 'https://blink-status.appspot.com/lkgr', 'url': 'svn://svn.chromium.org/blink/trunk'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--nohooks",
|
||||
"--force",
|
||||
"--verbose",
|
||||
"--delete_unversioned_trees",
|
||||
"--with_branch_heads",
|
||||
"--revision",
|
||||
"third_party/WebKit@123",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"WebKit/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 241198@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/blatley/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 248087@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_blatley_revision@248087@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"\nimport os, sys\n\nbuild_path = sys.argv[1]\nif os.path.exists(build_path):\n for (path, dir, files) in os.walk(build_path):\n for cur_file in files:\n if cur_file.endswith('index.lock'):\n path_to_file = os.path.join(path, cur_file)\n print 'deleting %s' % path_to_file\n os.remove(path_to_file)\n",
|
||||
"[SLAVE_BUILD]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "cleanup index.lock",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@import os, sys@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@build_path = sys.argv[1]@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@if os.path.exists(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for (path, dir, files) in os.walk(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for cur_file in files:@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ if cur_file.endswith('index.lock'):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ path_to_file = os.path.join(path, cur_file)@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ print 'deleting %s' % path_to_file@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ os.remove(path_to_file)@@@",
|
||||
"@@@STEP_LOG_END@python.inline@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"runhooks"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient runhooks"
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,170 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = '[ROOT]/git_cache'\nsolutions = [{'deps_file': '.DEPS.git', 'managed': True, 'name': 'src', 'url': 'https://chromium.googlesource.com/chromium/src.git'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--verbose",
|
||||
"--with_branch_heads",
|
||||
"--nohooks",
|
||||
"-j8",
|
||||
"--reset",
|
||||
"--force",
|
||||
"--upstream",
|
||||
"--no-nag-max",
|
||||
"--delete_unversioned_trees",
|
||||
"--revision",
|
||||
"src@HEAD",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": \"f27fede2220bcd326aee3e86ddfd4ebd0fe58cb9\"@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.name",
|
||||
"local_bot"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.name)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"recurse",
|
||||
"git",
|
||||
"config",
|
||||
"user.email",
|
||||
"local_bot@example.com"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient recurse (git config user.email)"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"config",
|
||||
"--spec",
|
||||
"cache_dir = None\nsolutions = [{'deps_file': 'DEPS', 'managed': True, 'name': 'WebKit', 'safesync_url': 'https://blink-status.appspot.com/lkgr', 'url': 'svn://svn.chromium.org/blink/trunk'}]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient setup"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"[BUILD]/scripts/slave/gclient_safe_revert.py",
|
||||
".",
|
||||
"[DEPOT_TOOLS]/gclient"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient revert"
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"sync",
|
||||
"--nohooks",
|
||||
"--force",
|
||||
"--verbose",
|
||||
"--delete_unversioned_trees",
|
||||
"--with_branch_heads",
|
||||
"--revision",
|
||||
"third_party/WebKit@123",
|
||||
"--output-json",
|
||||
"/path/to/tmp/json"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]/src/third_party",
|
||||
"name": "[spec: WebKit] gclient sync",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"solutions\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"WebKit/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 241198@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }, @@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"src/blatley/\": {@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ \"revision\": 248087@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||
"@@@STEP_LOG_END@json.output@@@",
|
||||
"@@@SET_BUILD_PROPERTY@got_blatley_revision@248087@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"\nimport os, sys\n\nbuild_path = sys.argv[1]\nif os.path.exists(build_path):\n for (path, dir, files) in os.walk(build_path):\n for cur_file in files:\n if cur_file.endswith('index.lock'):\n path_to_file = os.path.join(path, cur_file)\n print 'deleting %s' % path_to_file\n os.remove(path_to_file)\n",
|
||||
"[SLAVE_BUILD]"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "cleanup index.lock",
|
||||
"~followup_annotations": [
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@import os, sys@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@build_path = sys.argv[1]@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@if os.path.exists(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for (path, dir, files) in os.walk(build_path):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ for cur_file in files:@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ if cur_file.endswith('index.lock'):@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ path_to_file = os.path.join(path, cur_file)@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ print 'deleting %s' % path_to_file@@@",
|
||||
"@@@STEP_LOG_LINE@python.inline@ os.remove(path_to_file)@@@",
|
||||
"@@@STEP_LOG_END@python.inline@@@"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cmd": [
|
||||
"python",
|
||||
"-u",
|
||||
"RECIPE_PACKAGE[depot_tools]/gclient.py",
|
||||
"runhooks"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "gclient runhooks"
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,51 @@
|
||||
# Copyright 2013 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.
|
||||
|
||||
DEPS = [
|
||||
'gclient',
|
||||
'recipe_engine/path',
|
||||
'recipe_engine/properties',
|
||||
]
|
||||
|
||||
def RunSteps(api):
|
||||
src_cfg = api.gclient.make_config(GIT_MODE=True)
|
||||
soln = src_cfg.solutions.add()
|
||||
soln.name = 'src'
|
||||
soln.url = 'https://chromium.googlesource.com/chromium/src.git'
|
||||
soln.revision = api.properties.get('revision')
|
||||
src_cfg.parent_got_revision_mapping['parent_got_revision'] = 'got_revision'
|
||||
api.gclient.c = src_cfg
|
||||
api.gclient.checkout()
|
||||
|
||||
api.gclient.spec_alias = 'WebKit'
|
||||
bl_cfg = api.gclient.make_config()
|
||||
soln = bl_cfg.solutions.add()
|
||||
soln.name = 'WebKit'
|
||||
soln.url = 'svn://svn.chromium.org/blink/trunk'
|
||||
bl_cfg.revisions['third_party/WebKit'] = '123'
|
||||
|
||||
# Use safesync url for lkgr.
|
||||
soln.safesync_url = 'https://blink-status.appspot.com/lkgr'
|
||||
|
||||
bl_cfg.got_revision_mapping['src/blatley'] = 'got_blatley_revision'
|
||||
api.gclient.checkout(
|
||||
gclient_config=bl_cfg,
|
||||
with_branch_heads=True,
|
||||
cwd=api.path['slave_build'].join('src', 'third_party'))
|
||||
|
||||
api.gclient.break_locks()
|
||||
|
||||
del api.gclient.spec_alias
|
||||
|
||||
api.gclient.runhooks()
|
||||
|
||||
assert not api.gclient.is_blink_mode
|
||||
|
||||
|
||||
def GenTests(api):
|
||||
yield api.test('basic')
|
||||
|
||||
yield api.test('revision') + api.properties(revision='abc')
|
||||
|
||||
yield api.test('tryserver') + api.properties.tryserver()
|
@ -0,0 +1,37 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
import hashlib
|
||||
|
||||
from recipe_engine import recipe_test_api
|
||||
|
||||
class GclientTestApi(recipe_test_api.RecipeTestApi):
|
||||
def output_json(self, projects, git_mode=False):
|
||||
"""Deterministically synthesize json.output test data for gclient's
|
||||
--output-json option.
|
||||
|
||||
Args:
|
||||
projects - a list of project paths (e.g. ['src', 'src/dependency'])
|
||||
git_mode - Return git hashes instead of svn revs.
|
||||
"""
|
||||
# TODO(iannucci): Account for parent_got_revision_mapping. Right now the
|
||||
# synthesized json output from this method will always use
|
||||
# gen_revision(project), but if parent_got_revision and its ilk are
|
||||
# specified, we should use those values instead.
|
||||
return self.m.json.output({
|
||||
'solutions': dict(
|
||||
(p+'/', {'revision': self.gen_revision(p, git_mode)})
|
||||
for p in projects
|
||||
)
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def gen_revision(project, GIT_MODE):
|
||||
"""Hash project to bogus deterministic revision values."""
|
||||
h = hashlib.sha1(project)
|
||||
if GIT_MODE:
|
||||
return h.hexdigest()
|
||||
else:
|
||||
import struct
|
||||
return struct.unpack('!I', h.digest()[:4])[0] % 300000
|
@ -0,0 +1,7 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
DEPS = [
|
||||
'recipe_engine/properties',
|
||||
]
|
@ -0,0 +1,46 @@
|
||||
# Copyright 2014 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 recipe_api
|
||||
|
||||
PATCH_STORAGE_GIT = 'git'
|
||||
|
||||
class HackyTryserverDetectionApi(recipe_api.RecipeApi):
|
||||
@property
|
||||
def patch_url(self):
|
||||
"""Reads patch_url property and corrects it if needed."""
|
||||
url = self.m.properties.get('patch_url')
|
||||
return url
|
||||
|
||||
@property
|
||||
def is_tryserver(self):
|
||||
"""Returns true iff we can apply_issue or patch."""
|
||||
return (self.can_apply_issue or self.is_patch_in_svn or
|
||||
self.is_patch_in_git or self.is_gerrit_issue)
|
||||
|
||||
@property
|
||||
def can_apply_issue(self):
|
||||
"""Returns true iff the properties exist to apply_issue from rietveld."""
|
||||
return (self.m.properties.get('rietveld')
|
||||
and 'issue' in self.m.properties
|
||||
and 'patchset' in self.m.properties)
|
||||
|
||||
@property
|
||||
def is_gerrit_issue(self):
|
||||
"""Returns true iff the properties exist to match a Gerrit issue."""
|
||||
return ('event.patchSet.ref' in self.m.properties and
|
||||
'event.change.url' in self.m.properties and
|
||||
'event.change.id' in self.m.properties)
|
||||
|
||||
@property
|
||||
def is_patch_in_svn(self):
|
||||
"""Returns true iff the properties exist to patch from a patch URL."""
|
||||
return self.patch_url
|
||||
|
||||
@property
|
||||
def is_patch_in_git(self):
|
||||
return (self.m.properties.get('patch_storage') == PATCH_STORAGE_GIT and
|
||||
self.m.properties.get('patch_repo_url') and
|
||||
self.m.properties.get('patch_ref'))
|
||||
|
@ -0,0 +1,15 @@
|
||||
[
|
||||
{
|
||||
"cmd": [
|
||||
"echo",
|
||||
"False"
|
||||
],
|
||||
"cwd": "[SLAVE_BUILD]",
|
||||
"name": "am i a tryserver?"
|
||||
},
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,17 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
DEPS = [
|
||||
'recipe_engine/step',
|
||||
'hacky_tryserver_detection',
|
||||
]
|
||||
|
||||
|
||||
def RunSteps(api):
|
||||
api.step(
|
||||
"am i a tryserver?", ['echo', api.hacky_tryserver_detection.is_tryserver])
|
||||
|
||||
|
||||
def GenTests(api):
|
||||
yield api.test('basic')
|
@ -0,0 +1,4 @@
|
||||
DEPS = [
|
||||
'recipe_engine/path',
|
||||
'recipe_engine/properties',
|
||||
]
|
@ -0,0 +1,45 @@
|
||||
# Copyright 2013 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.
|
||||
|
||||
import urlparse
|
||||
|
||||
from recipe_engine import recipe_api
|
||||
|
||||
class RietveldApi(recipe_api.RecipeApi):
|
||||
def calculate_issue_root(self, extra_patch_project_roots=None):
|
||||
"""Returns path where a patch should be applied to based on "patch_project".
|
||||
|
||||
Maps Rietveld's "patch_project" to a path of directories relative to
|
||||
api.gclient.c.solutions[0].name which describe where to place the patch.
|
||||
|
||||
Args:
|
||||
extra_patch_project_roots: Dict mapping project names to relative roots.
|
||||
|
||||
Returns:
|
||||
Relative path or empty string if patch_project is not set or path for a
|
||||
given is unknown.
|
||||
"""
|
||||
# Property 'patch_project' is set by Rietveld, 'project' is set by git-try
|
||||
# when TRYSERVER_PROJECT is present in codereview.settings.
|
||||
patch_project = (self.m.properties.get('patch_project') or
|
||||
self.m.properties.get('project'))
|
||||
|
||||
# Please avoid adding projects into this hard-coded list unless your project
|
||||
# CLs are being run by multiple recipes. Instead pass patch_project_roots to
|
||||
# ensure_checkout.
|
||||
patch_project_roots = {
|
||||
'angle/angle': ['third_party', 'angle'],
|
||||
'blink': ['third_party', 'WebKit'],
|
||||
'v8': ['v8'],
|
||||
'luci-py': ['luci'],
|
||||
'recipes-py': ['recipes-py'],
|
||||
}
|
||||
|
||||
# Make sure to update common projects (above) with extra projects (and not
|
||||
# vice versa, so that recipes can override default values if needed.
|
||||
if extra_patch_project_roots:
|
||||
patch_project_roots.update(extra_patch_project_roots)
|
||||
|
||||
path_parts = patch_project_roots.get(patch_project)
|
||||
return self.m.path.join(*path_parts) if path_parts else ''
|
@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"name": "$result",
|
||||
"recipe_result": null,
|
||||
"status_code": 0
|
||||
}
|
||||
]
|
@ -0,0 +1,16 @@
|
||||
# Copyright 2014 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.
|
||||
|
||||
DEPS = [
|
||||
'recipe_engine/path',
|
||||
'rietveld',
|
||||
]
|
||||
|
||||
def RunSteps(api):
|
||||
api.path['checkout'] = api.path['slave_build']
|
||||
api.rietveld.calculate_issue_root({'project': ['']})
|
||||
|
||||
|
||||
def GenTests(api):
|
||||
yield api.test('basic')
|
Loading…
Reference in New Issue