OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 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 """Downloads and unpacks a toolchain for building on Windows. The contents are | 6 """Downloads and unpacks a toolchain for building on Windows. The contents are |
7 matched by sha1 which will be updated when the toolchain is updated. | 7 matched by sha1 which will be updated when the toolchain is updated. |
8 | 8 |
9 Having a toolchain script in depot_tools means that it's not versioned | 9 Having a toolchain script in depot_tools means that it's not versioned |
10 directly with the source code. That is, if the toolchain is upgraded, but | 10 directly with the source code. That is, if the toolchain is upgraded, but |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 | 104 |
105 matches = len(file_list) == len(timestamps_data['files']) | 105 matches = len(file_list) == len(timestamps_data['files']) |
106 if matches: | 106 if matches: |
107 for disk, cached in zip(file_list, timestamps_data['files']): | 107 for disk, cached in zip(file_list, timestamps_data['files']): |
108 if disk != cached[0] or os.stat(disk).st_mtime != cached[1]: | 108 if disk != cached[0] or os.stat(disk).st_mtime != cached[1]: |
109 matches = False | 109 matches = False |
110 break | 110 break |
111 if matches: | 111 if matches: |
112 return timestamps_data['sha1'] | 112 return timestamps_data['sha1'] |
113 | 113 |
| 114 # Make long hangs when updating the toolchain less mysterious. |
| 115 print 'Calculating hash of toolchain in %s. Please wait...' % root |
| 116 sys.stdout.flush() |
114 digest = hashlib.sha1() | 117 digest = hashlib.sha1() |
115 for path in file_list: | 118 for path in file_list: |
116 digest.update(str(path).replace('/', '\\')) | 119 digest.update(str(path).replace('/', '\\')) |
117 with open(path, 'rb') as f: | 120 with open(path, 'rb') as f: |
118 digest.update(f.read()) | 121 digest.update(f.read()) |
119 return digest.hexdigest() | 122 return digest.hexdigest() |
120 | 123 |
121 | 124 |
122 def SaveTimestampsAndHash(root, sha1): | 125 def SaveTimestampsAndHash(root, sha1): |
123 """Saves timestamps and the final hash to be able to early-out more quickly | 126 """Saves timestamps and the final hash to be able to early-out more quickly |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 | 289 |
287 installer = os.path.join(abs_target_dir, "installers", installer_name) | 290 installer = os.path.join(abs_target_dir, "installers", installer_name) |
288 command = r'wusa.exe /quiet "%s"' % installer | 291 command = r'wusa.exe /quiet "%s"' % installer |
289 print 'Running %s' % command | 292 print 'Running %s' % command |
290 | 293 |
291 try: | 294 try: |
292 subprocess.check_call(command) | 295 subprocess.check_call(command) |
293 # Trap OSError instead of WindowsError so pylint will succeed on Linux. | 296 # Trap OSError instead of WindowsError so pylint will succeed on Linux. |
294 except OSError as e: | 297 except OSError as e: |
295 if e.winerror == 740: # The requested operation requires elevation | 298 if e.winerror == 740: # The requested operation requires elevation |
296 print | 299 print 'Elevation required. You can manually install this update:' |
297 print '-'*80 | |
298 print | |
299 print 'Elevation required. You must manually install this update:' | |
300 print ' %s' % installer | 300 print ' %s' % installer |
301 print | 301 return |
302 print '-'*80 | |
303 print | |
304 raise Exception('Elevation required. You must manually install %s' % | |
305 installer) | |
306 raise e | 302 raise e |
307 | 303 |
308 | 304 |
309 def main(): | 305 def main(): |
310 parser = optparse.OptionParser(description=sys.modules[__name__].__doc__) | 306 parser = optparse.OptionParser(description=sys.modules[__name__].__doc__) |
311 parser.add_option('--output-json', metavar='FILE', | 307 parser.add_option('--output-json', metavar='FILE', |
312 help='write information about toolchain to FILE') | 308 help='write information about toolchain to FILE') |
313 parser.add_option('--force', action='store_true', | 309 parser.add_option('--force', action='store_true', |
314 help='force script to run on non-Windows hosts') | 310 help='force script to run on non-Windows hosts') |
315 options, args = parser.parse_args() | 311 options, args = parser.parse_args() |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 options.output_json) | 422 options.output_json) |
427 | 423 |
428 if os.environ.get('GYP_MSVS_VERSION') == '2015': | 424 if os.environ.get('GYP_MSVS_VERSION') == '2015': |
429 InstallUniversalCRTIfNeeded(abs_target_dir) | 425 InstallUniversalCRTIfNeeded(abs_target_dir) |
430 | 426 |
431 return 0 | 427 return 0 |
432 | 428 |
433 | 429 |
434 if __name__ == '__main__': | 430 if __name__ == '__main__': |
435 sys.exit(main()) | 431 sys.exit(main()) |
OLD | NEW |