OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Performance Test Bisect Tool | 6 """Performance Test Bisect Tool |
7 | 7 |
8 This script bisects a series of changelists using binary search. It starts at | 8 This script bisects a series of changelists using binary search. It starts at |
9 a bad revision where a performance metric has regressed, and asks for a last | 9 a bad revision where a performance metric has regressed, and asks for a last |
10 known-good revision. It will then binary search across this revision range by | 10 known-good revision. It will then binary search across this revision range by |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
515 | 515 |
516 # This is copied from Chromium's project build/scripts/common/chromium_utils.py. | 516 # This is copied from Chromium's project build/scripts/common/chromium_utils.py. |
517 def ExtractZip(filename, output_dir, verbose=True): | 517 def ExtractZip(filename, output_dir, verbose=True): |
518 """ Extract the zip archive in the output directory.""" | 518 """ Extract the zip archive in the output directory.""" |
519 MaybeMakeDirectory(output_dir) | 519 MaybeMakeDirectory(output_dir) |
520 | 520 |
521 # On Linux and Mac, we use the unzip command as it will | 521 # On Linux and Mac, we use the unzip command as it will |
522 # handle links and file bits (executable), which is much | 522 # handle links and file bits (executable), which is much |
523 # easier then trying to do that with ZipInfo options. | 523 # easier then trying to do that with ZipInfo options. |
524 # | 524 # |
| 525 # The Mac Version of unzip unfortunately does not support Zip64, whereas |
| 526 # the python module does, so we have to fallback to the python zip module |
| 527 # on Mac if the filesize is greater than 4GB. |
| 528 # |
525 # On Windows, try to use 7z if it is installed, otherwise fall back to python | 529 # On Windows, try to use 7z if it is installed, otherwise fall back to python |
526 # zip module and pray we don't have files larger than 512MB to unzip. | 530 # zip module and pray we don't have files larger than 512MB to unzip. |
527 unzip_cmd = None | 531 unzip_cmd = None |
528 if IsMac() or IsLinux(): | 532 if ((IsMac() and os.path.getsize(filename) < 4 * 1024 * 1024 * 1024) |
| 533 or IsLinux()): |
529 unzip_cmd = ['unzip', '-o'] | 534 unzip_cmd = ['unzip', '-o'] |
530 elif IsWindows() and os.path.exists('C:\\Program Files\\7-Zip\\7z.exe'): | 535 elif IsWindows() and os.path.exists('C:\\Program Files\\7-Zip\\7z.exe'): |
531 unzip_cmd = ['C:\\Program Files\\7-Zip\\7z.exe', 'x', '-y'] | 536 unzip_cmd = ['C:\\Program Files\\7-Zip\\7z.exe', 'x', '-y'] |
532 | 537 |
533 if unzip_cmd: | 538 if unzip_cmd: |
534 # Make sure path is absolute before changing directories. | 539 # Make sure path is absolute before changing directories. |
535 filepath = os.path.abspath(filename) | 540 filepath = os.path.abspath(filename) |
536 saved_dir = os.getcwd() | 541 saved_dir = os.getcwd() |
537 os.chdir(output_dir) | 542 os.chdir(output_dir) |
538 command = unzip_cmd + [filepath] | 543 command = unzip_cmd + [filepath] |
539 result = RunProcess(command) | 544 result = RunProcess(command) |
540 os.chdir(saved_dir) | 545 os.chdir(saved_dir) |
541 if result: | 546 if result: |
542 raise IOError('unzip failed: %s => %s' % (str(command), result)) | 547 raise IOError('unzip failed: %s => %s' % (str(command), result)) |
543 else: | 548 else: |
544 assert IsWindows() | 549 assert IsWindows() or IsMac() |
545 zf = zipfile.ZipFile(filename) | 550 zf = zipfile.ZipFile(filename) |
546 for name in zf.namelist(): | 551 for name in zf.namelist(): |
547 if verbose: | 552 if verbose: |
548 print 'Extracting %s' % name | 553 print 'Extracting %s' % name |
549 zf.extract(name, output_dir) | 554 zf.extract(name, output_dir) |
| 555 if IsMac(): |
| 556 # Restore permission bits. |
| 557 os.chmod(os.path.join(output_dir, name), |
| 558 zf.getinfo(name).external_attr >> 16L) |
550 | 559 |
551 | 560 |
552 def RunProcess(command): | 561 def RunProcess(command): |
553 """Runs an arbitrary command. | 562 """Runs an arbitrary command. |
554 | 563 |
555 If output from the call is needed, use RunProcessAndRetrieveOutput instead. | 564 If output from the call is needed, use RunProcessAndRetrieveOutput instead. |
556 | 565 |
557 Args: | 566 Args: |
558 command: A list containing the command and args to execute. | 567 command: A list containing the command and args to execute. |
559 | 568 |
(...skipping 3344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3904 # The perf dashboard scrapes the "results" step in order to comment on | 3913 # The perf dashboard scrapes the "results" step in order to comment on |
3905 # bugs. If you change this, please update the perf dashboard as well. | 3914 # bugs. If you change this, please update the perf dashboard as well. |
3906 bisect_utils.OutputAnnotationStepStart('Results') | 3915 bisect_utils.OutputAnnotationStepStart('Results') |
3907 print 'Error: %s' % e.message | 3916 print 'Error: %s' % e.message |
3908 if opts.output_buildbot_annotations: | 3917 if opts.output_buildbot_annotations: |
3909 bisect_utils.OutputAnnotationStepClosed() | 3918 bisect_utils.OutputAnnotationStepClosed() |
3910 return 1 | 3919 return 1 |
3911 | 3920 |
3912 if __name__ == '__main__': | 3921 if __name__ == '__main__': |
3913 sys.exit(main()) | 3922 sys.exit(main()) |
OLD | NEW |