OLD | NEW |
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2013 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 """Set of operations/utilities related to checking out the depot, and | 5 """Set of operations/utilities related to checking out the depot, and |
6 outputting annotations on the buildbot waterfall. These are intended to be | 6 outputting annotations on the buildbot waterfall. These are intended to be |
7 used by the bisection scripts.""" | 7 used by the bisection scripts.""" |
8 | 8 |
9 import errno | 9 import errno |
10 import os | 10 import os |
11 import shutil | 11 import shutil |
12 import subprocess | 12 import subprocess |
| 13 import sys |
13 | 14 |
14 | 15 |
15 GCLIENT_SPEC = """ | 16 GCLIENT_SPEC = """ |
16 solutions = [ | 17 solutions = [ |
17 { "name" : "src", | 18 { "name" : "src", |
18 "url" : "https://chromium.googlesource.com/chromium/src.git", | 19 "url" : "https://chromium.googlesource.com/chromium/src.git", |
19 "deps_file" : ".DEPS.git", | 20 "deps_file" : ".DEPS.git", |
20 "managed" : True, | 21 "managed" : True, |
21 "custom_deps" : { | 22 "custom_deps" : { |
22 "src/data/page_cycler": "https://chrome-internal.googlesource.com/" + | 23 "src/data/page_cycler": "https://chrome-internal.googlesource.com/" + |
23 "chrome/data/page_cycler/.git", | 24 "chrome/data/page_cycler/.git", |
24 "src/tools/perf/data": "https://chrome-internal.googlesource.com/" + | 25 "src/tools/perf/data": "https://chrome-internal.googlesource.com/" + |
25 "chrome/tools/perf/data/.git", | 26 "chrome/tools/perf/data/.git", |
26 "src/v8_bleeding_edge": "git://github.com/v8/v8.git", | 27 "src/v8_bleeding_edge": "git://github.com/v8/v8.git", |
27 }, | 28 }, |
28 "safesync_url": "", | 29 "safesync_url": "", |
29 }, | 30 }, |
30 ] | 31 ] |
31 """ | 32 """ |
32 GCLIENT_SPEC = ''.join([l for l in GCLIENT_SPEC.splitlines()]) | 33 GCLIENT_SPEC = ''.join([l for l in GCLIENT_SPEC.splitlines()]) |
| 34 GCLIENT_SPEC_ANDROID = GCLIENT_SPEC + "\ntarget_os = ['android']" |
33 FILE_DEPS_GIT = '.DEPS.git' | 35 FILE_DEPS_GIT = '.DEPS.git' |
34 | 36 |
35 REPO_PARAMS = [ | 37 REPO_PARAMS = [ |
36 'https://chrome-internal.googlesource.com/chromeos/manifest-internal/', | 38 'https://chrome-internal.googlesource.com/chromeos/manifest-internal/', |
37 '--repo-url', | 39 '--repo-url', |
38 'https://git.chromium.org/external/repo.git' | 40 'https://git.chromium.org/external/repo.git' |
39 ] | 41 ] |
40 | 42 |
41 REPO_SYNC_COMMAND = 'git checkout -f $(git rev-list --max-count=1 '\ | 43 REPO_SYNC_COMMAND = 'git checkout -f $(git rev-list --max-count=1 '\ |
42 '--before=%d remotes/m/master)' | 44 '--before=%d remotes/m/master)' |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 params: Unix timestamp to sync to. | 137 params: Unix timestamp to sync to. |
136 | 138 |
137 Returns: | 139 Returns: |
138 The return code of the call. | 140 The return code of the call. |
139 """ | 141 """ |
140 repo_sync = REPO_SYNC_COMMAND % timestamp | 142 repo_sync = REPO_SYNC_COMMAND % timestamp |
141 cmd = ['forall', '-c', REPO_SYNC_COMMAND % timestamp] | 143 cmd = ['forall', '-c', REPO_SYNC_COMMAND % timestamp] |
142 return RunRepo(cmd) | 144 return RunRepo(cmd) |
143 | 145 |
144 | 146 |
145 def RunGClientAndCreateConfig(): | 147 def RunGClientAndCreateConfig(opts): |
146 """Runs gclient and creates a config containing both src and src-internal. | 148 """Runs gclient and creates a config containing both src and src-internal. |
147 | 149 |
| 150 Args: |
| 151 opts: The options parsed from the command line through parse_args(). |
| 152 |
148 Returns: | 153 Returns: |
149 The return code of the call. | 154 The return code of the call. |
150 """ | 155 """ |
| 156 spec = GCLIENT_SPEC |
| 157 if opts.target_platform == 'android': |
| 158 spec = GCLIENT_SPEC_ANDROID |
| 159 |
151 return_code = RunGClient( | 160 return_code = RunGClient( |
152 ['config', '--spec=%s' % GCLIENT_SPEC, '--git-deps']) | 161 ['config', '--spec=%s' % spec, '--git-deps']) |
153 return return_code | 162 return return_code |
154 | 163 |
155 | 164 |
156 def IsDepsFileBlink(): | 165 def IsDepsFileBlink(): |
157 """Reads .DEPS.git and returns whether or not we're using blink. | 166 """Reads .DEPS.git and returns whether or not we're using blink. |
158 | 167 |
159 Returns: | 168 Returns: |
160 True if blink, false if webkit. | 169 True if blink, false if webkit. |
161 """ | 170 """ |
162 locals = {'Var': lambda _: locals["vars"][_], | 171 locals = {'Var': lambda _: locals["vars"][_], |
(...skipping 20 matching lines...) Expand all Loading... |
183 | 192 |
184 def RunGClientAndSync(reset): | 193 def RunGClientAndSync(reset): |
185 """Runs gclient and does a normal sync. | 194 """Runs gclient and does a normal sync. |
186 | 195 |
187 Args: | 196 Args: |
188 reset: Whether to reset any changes to the depot. | 197 reset: Whether to reset any changes to the depot. |
189 | 198 |
190 Returns: | 199 Returns: |
191 The return code of the call. | 200 The return code of the call. |
192 """ | 201 """ |
193 params = ['sync', '--verbose'] | 202 params = ['sync', '--verbose', '--nohooks'] |
194 if reset: | 203 if reset: |
195 params.extend(['--reset', '--force', '--delete_unversioned_trees']) | 204 params.extend(['--reset', '--force', '--delete_unversioned_trees']) |
196 return RunGClient(params) | 205 return RunGClient(params) |
197 | 206 |
198 | 207 |
199 def SetupGitDepot(output_buildbot_annotations, reset): | 208 def SetupGitDepot(opts, reset): |
200 """Sets up the depot for the bisection. The depot will be located in a | 209 """Sets up the depot for the bisection. The depot will be located in a |
201 subdirectory called 'bisect'. | 210 subdirectory called 'bisect'. |
202 | 211 |
203 Args: | 212 Args: |
| 213 opts: The options parsed from the command line through parse_args(). |
204 reset: Whether to reset any changes to the depot. | 214 reset: Whether to reset any changes to the depot. |
205 | 215 |
206 Returns: | 216 Returns: |
207 True if gclient successfully created the config file and did a sync, False | 217 True if gclient successfully created the config file and did a sync, False |
208 otherwise. | 218 otherwise. |
209 """ | 219 """ |
210 name = 'Setting up Bisection Depot' | 220 name = 'Setting up Bisection Depot' |
211 | 221 |
212 if output_buildbot_annotations: | 222 if opts.output_buildbot_annotations: |
213 OutputAnnotationStepStart(name) | 223 OutputAnnotationStepStart(name) |
214 | 224 |
215 passed = False | 225 passed = False |
216 | 226 |
217 if not RunGClientAndCreateConfig(): | 227 if not RunGClientAndCreateConfig(opts): |
218 passed_deps_check = True | 228 passed_deps_check = True |
219 if os.path.isfile(os.path.join('src', FILE_DEPS_GIT)): | 229 if os.path.isfile(os.path.join('src', FILE_DEPS_GIT)): |
220 cwd = os.getcwd() | 230 cwd = os.getcwd() |
221 os.chdir('src') | 231 os.chdir('src') |
222 if not IsDepsFileBlink(): | 232 if not IsDepsFileBlink(): |
223 passed_deps_check = RemoveThirdPartyWebkitDirectory() | 233 passed_deps_check = RemoveThirdPartyWebkitDirectory() |
224 else: | 234 else: |
225 passed_deps_check = True | 235 passed_deps_check = True |
226 os.chdir(cwd) | 236 os.chdir(cwd) |
227 | 237 |
228 if passed_deps_check and not RunGClientAndSync(reset): | 238 if passed_deps_check and not RunGClientAndSync(reset): |
229 passed = True | 239 passed = True |
230 | 240 |
231 if output_buildbot_annotations: | 241 if opts.output_buildbot_annotations: |
232 print | 242 print |
233 OutputAnnotationStepClosed() | 243 OutputAnnotationStepClosed() |
234 | 244 |
235 return passed | 245 return passed |
236 | 246 |
237 | 247 |
238 def SetupCrosRepo(): | 248 def SetupCrosRepo(): |
239 """Sets up cros repo for bisecting chromeos. | 249 """Sets up cros repo for bisecting chromeos. |
240 | 250 |
241 Returns: | 251 Returns: |
(...skipping 12 matching lines...) Expand all Loading... |
254 passed = False | 264 passed = False |
255 | 265 |
256 if not RunRepo(cmd): | 266 if not RunRepo(cmd): |
257 if not RunRepo(['sync']): | 267 if not RunRepo(['sync']): |
258 passed = True | 268 passed = True |
259 os.chdir(cwd) | 269 os.chdir(cwd) |
260 | 270 |
261 return passed | 271 return passed |
262 | 272 |
263 | 273 |
| 274 def SetupAndroidBuildEnvironment(opts): |
| 275 """Sets up the android build environment. |
| 276 |
| 277 Args: |
| 278 opts: The options parsed from the command line through parse_args(). |
| 279 path_to_file: Path to the bisect script's directory. |
| 280 |
| 281 Returns: |
| 282 True if successful. |
| 283 """ |
| 284 path_to_file = os.path.join('build', 'android', 'envsetup.sh') |
| 285 proc = subprocess.Popen(['bash', '-c', 'source %s && env' % path_to_file], |
| 286 stdout=subprocess.PIPE, |
| 287 stderr=subprocess.PIPE, |
| 288 cwd='src') |
| 289 (out, _) = proc.communicate() |
| 290 |
| 291 for line in out.splitlines(): |
| 292 (k, _, v) = line.partition('=') |
| 293 os.environ[k] = v |
| 294 return not proc.returncode |
| 295 |
| 296 |
| 297 def SetupPlatformBuildEnvironment(opts): |
| 298 """Performs any platform specific setup. |
| 299 |
| 300 Args: |
| 301 opts: The options parsed from the command line through parse_args(). |
| 302 path_to_file: Path to the bisect script's directory. |
| 303 |
| 304 Returns: |
| 305 True if successful. |
| 306 """ |
| 307 if opts.target_platform == 'android': |
| 308 return SetupAndroidBuildEnvironment(opts) |
| 309 elif opts.target_platform == 'cros': |
| 310 return SetupCrosRepo() |
| 311 |
| 312 return False |
| 313 |
| 314 |
264 def CreateBisectDirectoryAndSetupDepot(opts, reset=False): | 315 def CreateBisectDirectoryAndSetupDepot(opts, reset=False): |
265 """Sets up a subdirectory 'bisect' and then retrieves a copy of the depot | 316 """Sets up a subdirectory 'bisect' and then retrieves a copy of the depot |
266 there using gclient. | 317 there using gclient. |
267 | 318 |
268 Args: | 319 Args: |
269 opts: The options parsed from the command line through parse_args(). | 320 opts: The options parsed from the command line through parse_args(). |
270 reset: Whether to reset any changes to the depot. | 321 reset: Whether to reset any changes to the depot. |
271 | 322 |
272 Returns: | 323 Returns: |
273 Returns 0 on success, otherwise 1. | 324 Returns 0 on success, otherwise 1. |
274 """ | 325 """ |
275 if not CreateAndChangeToSourceDirectory(opts.working_directory): | 326 if not CreateAndChangeToSourceDirectory(opts.working_directory): |
276 print 'Error: Could not create bisect directory.' | 327 print 'Error: Could not create bisect directory.' |
277 print | 328 print |
278 return 1 | 329 return 1 |
279 | 330 |
280 if not SetupGitDepot(opts.output_buildbot_annotations, reset): | 331 if not SetupGitDepot(opts, reset): |
281 print 'Error: Failed to grab source.' | 332 print 'Error: Failed to grab source.' |
282 print | 333 print |
283 return 1 | 334 return 1 |
284 | 335 |
285 return 0 | 336 return 0 |
OLD | NEW |