| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 | 5 |
| 6 """Recipe module to ensure a checkout is consistant on a bot.""" | 6 """Recipe module to ensure a checkout is consistant on a bot.""" |
| 7 | 7 |
| 8 from recipe_engine import recipe_api | 8 from recipe_engine import recipe_api |
| 9 | 9 |
| 10 | 10 |
| 11 # This is just for testing, to indicate if a master is using a Git scheduler | 11 # This is just for testing, to indicate if a master is using a Git scheduler |
| 12 # or not. | 12 # or not. |
| 13 SVN_MASTERS = ( | 13 SVN_MASTERS = ( |
| 14 'experimental.svn', | 14 'experimental.svn', |
| 15 ) | 15 ) |
| 16 | 16 |
| 17 | 17 |
| 18 def jsonish_to_python(spec, is_top=False): | |
| 19 """Turn a json spec into a python parsable object. | |
| 20 | |
| 21 This exists because Gclient specs, while resembling json, is actually | |
| 22 ingested using a python "eval()". Therefore a bit of plumming is required | |
| 23 to turn our newly constructed Gclient spec into a gclient-readable spec. | |
| 24 """ | |
| 25 ret = '' | |
| 26 if is_top: # We're the 'top' level, so treat this dict as a suite. | |
| 27 ret = '\n'.join( | |
| 28 '%s = %s' % (k, jsonish_to_python(spec[k])) for k in sorted(spec) | |
| 29 ) | |
| 30 else: | |
| 31 if isinstance(spec, dict): | |
| 32 ret += '{' | |
| 33 ret += ', '.join( | |
| 34 "%s: %s" % (repr(str(k)), jsonish_to_python(spec[k])) | |
| 35 for k in sorted(spec) | |
| 36 ) | |
| 37 ret += '}' | |
| 38 elif isinstance(spec, list): | |
| 39 ret += '[' | |
| 40 ret += ', '.join(jsonish_to_python(x) for x in spec) | |
| 41 ret += ']' | |
| 42 elif isinstance(spec, basestring): | |
| 43 ret = repr(str(spec)) | |
| 44 else: | |
| 45 ret = repr(spec) | |
| 46 return ret | |
| 47 | |
| 48 | |
| 49 class BotUpdateApi(recipe_api.RecipeApi): | 18 class BotUpdateApi(recipe_api.RecipeApi): |
| 50 | 19 |
| 51 def __init__(self, mastername, buildername, slavename, issue, patchset, | 20 def __init__(self, mastername, buildername, slavename, issue, patchset, |
| 52 patch_url, repository, gerrit_ref, rietveld, revision, | 21 patch_url, repository, gerrit_ref, rietveld, revision, |
| 53 parent_got_revision, deps_revision_overrides, fail_patch, | 22 parent_got_revision, deps_revision_overrides, fail_patch, |
| 54 *args, **kwargs): | 23 *args, **kwargs): |
| 55 self._mastername = mastername | 24 self._mastername = mastername |
| 56 self._buildername = buildername | 25 self._buildername = buildername |
| 57 self._slavename = slavename | 26 self._slavename = slavename |
| 58 self._issue = issue | 27 self._issue = issue |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 the 'rietveld' property. | 69 the 'rietveld' property. |
| 101 issue: The rietveld issue number to use. If omitted, will infer from | 70 issue: The rietveld issue number to use. If omitted, will infer from |
| 102 the 'issue' property. | 71 the 'issue' property. |
| 103 patchset: The rietveld issue patchset to use. If omitted, will infer from | 72 patchset: The rietveld issue patchset to use. If omitted, will infer from |
| 104 the 'patchset' property. | 73 the 'patchset' property. |
| 105 """ | 74 """ |
| 106 refs = refs or [] | 75 refs = refs or [] |
| 107 # We can re-use the gclient spec from the gclient module, since all the | 76 # We can re-use the gclient spec from the gclient module, since all the |
| 108 # data bot_update needs is already configured into the gclient spec. | 77 # data bot_update needs is already configured into the gclient spec. |
| 109 cfg = gclient_config or self.m.gclient.c | 78 cfg = gclient_config or self.m.gclient.c |
| 110 spec_string = jsonish_to_python(cfg.as_jsonish(), True) | |
| 111 | 79 |
| 112 # Used by bot_update to determine if we want to run or not. | 80 # Used by bot_update to determine if we want to run or not. |
| 113 master = self._mastername | 81 master = self._mastername |
| 114 builder = self._buildername | 82 builder = self._buildername |
| 115 slave = self._slavename | 83 slave = self._slavename |
| 116 | 84 |
| 117 # Construct our bot_update command. This basically be inclusive of | 85 # Construct our bot_update command. This basically be inclusive of |
| 118 # everything required for bot_update to know: | 86 # everything required for bot_update to know: |
| 119 root = patch_root | 87 root = patch_root |
| 120 if root is None: | 88 if root is None: |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 130 |
| 163 rev_map = cfg.got_revision_mapping.as_jsonish() | 131 rev_map = cfg.got_revision_mapping.as_jsonish() |
| 164 | 132 |
| 165 flags = [ | 133 flags = [ |
| 166 # 1. Do we want to run? (master/builder/slave). | 134 # 1. Do we want to run? (master/builder/slave). |
| 167 ['--master', master], | 135 ['--master', master], |
| 168 ['--builder', builder], | 136 ['--builder', builder], |
| 169 ['--slave', slave], | 137 ['--slave', slave], |
| 170 | 138 |
| 171 # 2. What do we want to check out (spec/root/rev/rev_map). | 139 # 2. What do we want to check out (spec/root/rev/rev_map). |
| 172 ['--spec', spec_string], | 140 ['--spec', self.m.gclient.config_to_pythonish(cfg)], |
| 173 ['--root', root], | 141 ['--root', root], |
| 174 ['--revision_mapping_file', self.m.json.input(rev_map)], | 142 ['--revision_mapping_file', self.m.json.input(rev_map)], |
| 175 ['--git-cache-dir', cfg.cache_dir], | 143 ['--git-cache-dir', cfg.cache_dir], |
| 176 | 144 |
| 177 # 3. How to find the patch, if any (issue/patchset/patch_url). | 145 # 3. How to find the patch, if any (issue/patchset/patch_url). |
| 178 ['--issue', issue], | 146 ['--issue', issue], |
| 179 ['--patchset', patchset], | 147 ['--patchset', patchset], |
| 180 ['--patch_url', patch_url], | 148 ['--patch_url', patch_url], |
| 181 ['--rietveld_server', rietveld or self._rietveld], | 149 ['--rietveld_server', rietveld or self._rietveld], |
| 182 ['--gerrit_repo', gerrit_repo], | 150 ['--gerrit_repo', gerrit_repo], |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 | 268 |
| 301 # bot_update actually just sets root to be the folder name of the | 269 # bot_update actually just sets root to be the folder name of the |
| 302 # first solution. | 270 # first solution. |
| 303 if step_result.json.output['did_run']: | 271 if step_result.json.output['did_run']: |
| 304 co_root = step_result.json.output['root'] | 272 co_root = step_result.json.output['root'] |
| 305 cwd = kwargs.get('cwd', self.m.path['slave_build']) | 273 cwd = kwargs.get('cwd', self.m.path['slave_build']) |
| 306 if 'checkout' not in self.m.path: | 274 if 'checkout' not in self.m.path: |
| 307 self.m.path['checkout'] = cwd.join(*co_root.split(self.m.path.sep)) | 275 self.m.path['checkout'] = cwd.join(*co_root.split(self.m.path.sep)) |
| 308 | 276 |
| 309 return step_result | 277 return step_result |
| OLD | NEW |