| 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 """Utility functions used by the bisect tool. | 5 """Utility functions used by the bisect tool. |
| 6 | 6 |
| 7 This includes functions related to checking out the depot and outputting | 7 This includes functions related to checking out the depot and outputting |
| 8 annotations for the Buildbot waterfall. | 8 annotations for the Buildbot waterfall. |
| 9 """ | 9 """ |
| 10 | 10 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 'managed': True, | 58 'managed': True, |
| 59 'custom_deps': {}, | 59 'custom_deps': {}, |
| 60 'safesync_url': '', | 60 'safesync_url': '', |
| 61 }, | 61 }, |
| 62 ] | 62 ] |
| 63 GCLIENT_SPEC_ANDROID = "\ntarget_os = ['android']" | 63 GCLIENT_SPEC_ANDROID = "\ntarget_os = ['android']" |
| 64 GCLIENT_CUSTOM_DEPS_V8 = {'src/v8_bleeding_edge': 'git://github.com/v8/v8.git'} | 64 GCLIENT_CUSTOM_DEPS_V8 = {'src/v8_bleeding_edge': 'git://github.com/v8/v8.git'} |
| 65 FILE_DEPS_GIT = '.DEPS.git' | 65 FILE_DEPS_GIT = '.DEPS.git' |
| 66 FILE_DEPS = 'DEPS' | 66 FILE_DEPS = 'DEPS' |
| 67 | 67 |
| 68 REPO_SYNC_COMMAND = ('git checkout -f $(git rev-list --max-count=1 ' |
| 69 '--before=%d remotes/m/master)') |
| 70 |
| 71 # Paths to CrOS-related files. |
| 72 # WARNING(qyearsley, 2014-08-15): These haven't been tested recently. |
| 73 CROS_SDK_PATH = os.path.join('..', 'cros', 'chromite', 'bin', 'cros_sdk') |
| 74 CROS_TEST_KEY_PATH = os.path.join( |
| 75 '..', 'cros', 'chromite', 'ssh_keys', 'testing_rsa') |
| 76 CROS_SCRIPT_KEY_PATH = os.path.join( |
| 77 '..', 'cros', 'src', 'scripts', 'mod_for_test_scripts', 'ssh_keys', |
| 78 'testing_rsa') |
| 79 |
| 68 REPO_PARAMS = [ | 80 REPO_PARAMS = [ |
| 69 'https://chrome-internal.googlesource.com/chromeos/manifest-internal/', | 81 'https://chrome-internal.googlesource.com/chromeos/manifest-internal/', |
| 70 '--repo-url', | 82 '--repo-url', |
| 71 'https://git.chromium.org/external/repo.git' | 83 'https://git.chromium.org/external/repo.git' |
| 72 ] | 84 ] |
| 73 | 85 |
| 74 REPO_SYNC_COMMAND = ('git checkout -f $(git rev-list --max-count=1 ' | |
| 75 '--before=%d remotes/m/master)') | |
| 76 | |
| 77 ORIGINAL_ENV = {} | |
| 78 | |
| 79 | 86 |
| 80 def OutputAnnotationStepStart(name): | 87 def OutputAnnotationStepStart(name): |
| 81 """Outputs annotation to signal the start of a step to a trybot. | 88 """Outputs annotation to signal the start of a step to a trybot. |
| 82 | 89 |
| 83 Args: | 90 Args: |
| 84 name: The name of the step. | 91 name: The name of the step. |
| 85 """ | 92 """ |
| 86 print | 93 print |
| 87 print '@@@SEED_STEP %s@@@' % name | 94 print '@@@SEED_STEP %s@@@' % name |
| 88 print '@@@STEP_CURSOR %s@@@' % name | 95 print '@@@STEP_CURSOR %s@@@' % name |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 params: A list of parameters to pass to gclient. | 197 params: A list of parameters to pass to gclient. |
| 191 cwd: Working directory to run from. | 198 cwd: Working directory to run from. |
| 192 | 199 |
| 193 Returns: | 200 Returns: |
| 194 The return code of the call. | 201 The return code of the call. |
| 195 """ | 202 """ |
| 196 cmd = ['gclient'] + params | 203 cmd = ['gclient'] + params |
| 197 return _SubprocessCall(cmd, cwd=cwd) | 204 return _SubprocessCall(cmd, cwd=cwd) |
| 198 | 205 |
| 199 | 206 |
| 207 def SetupCrosRepo(): |
| 208 """Sets up CrOS repo for bisecting ChromeOS. |
| 209 |
| 210 Returns: |
| 211 True if successful, False otherwise. |
| 212 """ |
| 213 cwd = os.getcwd() |
| 214 try: |
| 215 os.mkdir('cros') |
| 216 except OSError as e: |
| 217 if e.errno != errno.EEXIST: # EEXIST means the directory already exists. |
| 218 return False |
| 219 os.chdir('cros') |
| 220 |
| 221 cmd = ['init', '-u'] + REPO_PARAMS |
| 222 |
| 223 passed = False |
| 224 |
| 225 if not _RunRepo(cmd): |
| 226 if not _RunRepo(['sync']): |
| 227 passed = True |
| 228 os.chdir(cwd) |
| 229 |
| 230 return passed |
| 231 |
| 232 |
| 200 def _RunRepo(params): | 233 def _RunRepo(params): |
| 201 """Runs CrOS repo command with specified parameters. | 234 """Runs CrOS repo command with specified parameters. |
| 202 | 235 |
| 203 Args: | 236 Args: |
| 204 params: A list of parameters to pass to gclient. | 237 params: A list of parameters to pass to gclient. |
| 205 | 238 |
| 206 Returns: | 239 Returns: |
| 207 The return code of the call (zero indicates success). | 240 The return code of the call (zero indicates success). |
| 208 """ | 241 """ |
| 209 cmd = ['repo'] + params | 242 cmd = ['repo'] + params |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 if not RunGClientAndSync(): | 409 if not RunGClientAndSync(): |
| 377 passed = True | 410 passed = True |
| 378 | 411 |
| 379 if opts.output_buildbot_annotations: | 412 if opts.output_buildbot_annotations: |
| 380 print | 413 print |
| 381 OutputAnnotationStepClosed() | 414 OutputAnnotationStepClosed() |
| 382 | 415 |
| 383 return passed | 416 return passed |
| 384 | 417 |
| 385 | 418 |
| 386 def SetupCrosRepo(): | |
| 387 """Sets up CrOS repo for bisecting ChromeOS. | |
| 388 | |
| 389 Returns: | |
| 390 True if successful, False otherwise. | |
| 391 """ | |
| 392 cwd = os.getcwd() | |
| 393 try: | |
| 394 os.mkdir('cros') | |
| 395 except OSError as e: | |
| 396 if e.errno != errno.EEXIST: # EEXIST means the directory already exists. | |
| 397 return False | |
| 398 os.chdir('cros') | |
| 399 | |
| 400 cmd = ['init', '-u'] + REPO_PARAMS | |
| 401 | |
| 402 passed = False | |
| 403 | |
| 404 if not _RunRepo(cmd): | |
| 405 if not _RunRepo(['sync']): | |
| 406 passed = True | |
| 407 os.chdir(cwd) | |
| 408 | |
| 409 return passed | |
| 410 | |
| 411 | |
| 412 def CopyAndSaveOriginalEnvironmentVars(): | |
| 413 """Makes a copy of the current environment variables. | |
| 414 | |
| 415 Before making a copy of the environment variables and setting a global | |
| 416 variable, this function unsets a certain set of environment variables. | |
| 417 """ | |
| 418 # TODO: Waiting on crbug.com/255689, will remove this after. | |
| 419 vars_to_remove = [ | |
| 420 'CHROME_SRC', | |
| 421 'CHROMIUM_GYP_FILE', | |
| 422 'GYP_CROSSCOMPILE', | |
| 423 'GYP_DEFINES', | |
| 424 'GYP_GENERATORS', | |
| 425 'GYP_GENERATOR_FLAGS', | |
| 426 'OBJCOPY', | |
| 427 ] | |
| 428 for key in os.environ: | |
| 429 if 'ANDROID' in key: | |
| 430 vars_to_remove.append(key) | |
| 431 for key in vars_to_remove: | |
| 432 if os.environ.has_key(key): | |
| 433 del os.environ[key] | |
| 434 | |
| 435 global ORIGINAL_ENV | |
| 436 ORIGINAL_ENV = os.environ.copy() | |
| 437 | |
| 438 | |
| 439 def SetupAndroidBuildEnvironment(opts, path_to_src=None): | |
| 440 """Sets up the android build environment. | |
| 441 | |
| 442 Args: | |
| 443 opts: The options parsed from the command line through parse_args(). | |
| 444 path_to_src: Path to the src checkout. | |
| 445 | |
| 446 Returns: | |
| 447 True if successful. | |
| 448 """ | |
| 449 # Revert the environment variables back to default before setting them up | |
| 450 # with envsetup.sh. | |
| 451 env_vars = os.environ.copy() | |
| 452 for k, _ in env_vars.iteritems(): | |
| 453 del os.environ[k] | |
| 454 for k, v in ORIGINAL_ENV.iteritems(): | |
| 455 os.environ[k] = v | |
| 456 | |
| 457 envsetup_path = os.path.join('build', 'android', 'envsetup.sh') | |
| 458 proc = subprocess.Popen(['bash', '-c', 'source %s && env' % envsetup_path], | |
| 459 stdout=subprocess.PIPE, | |
| 460 stderr=subprocess.PIPE, | |
| 461 cwd=path_to_src) | |
| 462 out, _ = proc.communicate() | |
| 463 | |
| 464 for line in out.splitlines(): | |
| 465 k, _, v = line.partition('=') | |
| 466 os.environ[k] = v | |
| 467 | |
| 468 # envsetup.sh no longer sets OS=android in GYP_DEFINES environment variable. | |
| 469 # (See http://crrev.com/170273005). So, we set this variable explicitly here | |
| 470 # in order to build Chrome on Android. | |
| 471 if 'GYP_DEFINES' not in os.environ: | |
| 472 os.environ['GYP_DEFINES'] = 'OS=android' | |
| 473 else: | |
| 474 os.environ['GYP_DEFINES'] += ' OS=android' | |
| 475 | |
| 476 if opts.use_goma: | |
| 477 os.environ['GYP_DEFINES'] += ' use_goma=1' | |
| 478 return not proc.returncode | |
| 479 | |
| 480 | |
| 481 def SetupPlatformBuildEnvironment(opts): | |
| 482 """Performs any platform-specific setup. | |
| 483 | |
| 484 Args: | |
| 485 opts: The options parsed from the command line through parse_args(). | |
| 486 | |
| 487 Returns: | |
| 488 True if successful. | |
| 489 """ | |
| 490 if 'android' in opts.target_platform: | |
| 491 CopyAndSaveOriginalEnvironmentVars() | |
| 492 return SetupAndroidBuildEnvironment(opts) | |
| 493 elif opts.target_platform == 'cros': | |
| 494 return SetupCrosRepo() | |
| 495 | |
| 496 return True | |
| 497 | |
| 498 | |
| 499 def CheckIfBisectDepotExists(opts): | 419 def CheckIfBisectDepotExists(opts): |
| 500 """Checks if the bisect directory already exists. | 420 """Checks if the bisect directory already exists. |
| 501 | 421 |
| 502 Args: | 422 Args: |
| 503 opts: The options parsed from the command line through parse_args(). | 423 opts: The options parsed from the command line through parse_args(). |
| 504 | 424 |
| 505 Returns: | 425 Returns: |
| 506 Returns True if it exists. | 426 Returns True if it exists. |
| 507 """ | 427 """ |
| 508 path_to_dir = os.path.join(opts.working_directory, 'bisect', 'src') | 428 path_to_dir = os.path.join(opts.working_directory, 'bisect', 'src') |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 return sys.platform.startswith('linux') | 590 return sys.platform.startswith('linux') |
| 671 | 591 |
| 672 | 592 |
| 673 def IsMacHost(): | 593 def IsMacHost(): |
| 674 """Checks whether or not the script is running on Mac. | 594 """Checks whether or not the script is running on Mac. |
| 675 | 595 |
| 676 Returns: | 596 Returns: |
| 677 True if running on Mac. | 597 True if running on Mac. |
| 678 """ | 598 """ |
| 679 return sys.platform.startswith('darwin') | 599 return sys.platform.startswith('darwin') |
| OLD | NEW |