| OLD | NEW |
| 1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2012 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 basic operations/utilities that are used by the build. """ | 5 """ Set of basic operations/utilities that are used by the build. """ |
| 6 | 6 |
| 7 import copy | 7 import copy |
| 8 import errno | 8 import errno |
| 9 import fnmatch | 9 import fnmatch |
| 10 import glob | 10 import glob |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 if not os.path.isdir(dest_dir): | 468 if not os.path.isdir(dest_dir): |
| 469 raise PathNotFound('Unable to find dir %s' % dest_dir) | 469 raise PathNotFound('Unable to find dir %s' % dest_dir) |
| 470 src_file = os.path.basename(src_path) | 470 src_file = os.path.basename(src_path) |
| 471 if dest_fn: | 471 if dest_fn: |
| 472 shutil.copy(src_path, os.path.join(dest_dir, dest_fn)) | 472 shutil.copy(src_path, os.path.join(dest_dir, dest_fn)) |
| 473 else: | 473 else: |
| 474 shutil.copy(src_path, os.path.join(dest_dir, src_file)) | 474 shutil.copy(src_path, os.path.join(dest_dir, src_file)) |
| 475 | 475 |
| 476 | 476 |
| 477 def MakeZip(output_dir, archive_name, file_list, file_relative_dir, | 477 def MakeZip(output_dir, archive_name, file_list, file_relative_dir, |
| 478 raise_error=True, remove_archive_directory=True): | 478 raise_error=True, remove_archive_directory=True, replacements=None): |
| 479 """Packs files into a new zip archive. | 479 """Packs files into a new zip archive. |
| 480 | 480 |
| 481 Files are first copied into a directory within the output_dir named for | 481 Files are first copied into a directory within the output_dir named for |
| 482 the archive_name, which will be created if necessary and emptied if it | 482 the archive_name, which will be created if necessary and emptied if it |
| 483 already exists. The files are then then packed using archive names | 483 already exists. The files are then then packed using archive names |
| 484 relative to the output_dir. That is, if the zipfile is unpacked in place, | 484 relative to the output_dir. That is, if the zipfile is unpacked in place, |
| 485 it will create a directory identical to the new archiev_name directory, in | 485 it will create a directory identical to the new archiev_name directory, in |
| 486 the output_dir. The zip file will be named as the archive_name, plus | 486 the output_dir. The zip file will be named as the archive_name, plus |
| 487 '.zip'. | 487 '.zip'. |
| 488 | 488 |
| 489 Args: | 489 Args: |
| 490 output_dir: Absolute path to the directory in which the archive is to | 490 output_dir: Absolute path to the directory in which the archive is to |
| 491 be created. | 491 be created. |
| 492 archive_dir: Subdirectory of output_dir holding files to be added to | 492 archive_dir: Subdirectory of output_dir holding files to be added to |
| 493 the new zipfile. | 493 the new zipfile. |
| 494 file_list: List of paths to files or subdirectories, relative to the | 494 file_list: List of paths to files or subdirectories, relative to the |
| 495 file_relative_dir. | 495 file_relative_dir. |
| 496 file_relative_dir: Absolute path to the directory containing the files | 496 file_relative_dir: Absolute path to the directory containing the files |
| 497 and subdirectories in the file_list. | 497 and subdirectories in the file_list. |
| 498 raise_error: Whether to raise a PathNotFound error if one of the files in | 498 raise_error: Whether to raise a PathNotFound error if one of the files in |
| 499 the list is not found. | 499 the list is not found. |
| 500 remove_archive_directory: Whether to remove the archive staging directory | 500 remove_archive_directory: Whether to remove the archive staging directory |
| 501 before copying files over to it. | 501 before copying files over to it. |
| 502 replacements: A list of fun(path) -> path functions. For each file |
| 503 to add, transform the path with each function in replacements in order, |
| 504 and read data from the resulting file instead. i.e. foo.exe could actually |
| 505 contain data from foo.asan.exe. |
| 502 | 506 |
| 503 Returns: | 507 Returns: |
| 504 A tuple consisting of (archive_dir, zip_file_path), where archive_dir | 508 A tuple consisting of (archive_dir, zip_file_path), where archive_dir |
| 505 is the full path to the newly created archive_name subdirectory. | 509 is the full path to the newly created archive_name subdirectory. |
| 506 | 510 |
| 507 Raises: | 511 Raises: |
| 508 PathNotFound if any of the files in the list is not found, unless | 512 PathNotFound if any of the files in the list is not found, unless |
| 509 raise_error is False, in which case the error will be ignored. | 513 raise_error is False, in which case the error will be ignored. |
| 510 """ | 514 """ |
| 511 | 515 |
| 512 # Collect files into the archive directory. | 516 # Collect files into the archive directory. |
| 513 archive_dir = os.path.join(output_dir, archive_name) | 517 archive_dir = os.path.join(output_dir, archive_name) |
| 514 if remove_archive_directory and os.path.exists(archive_dir): | 518 if remove_archive_directory and os.path.exists(archive_dir): |
| 515 # Move it even if it's not a directory as expected. This can happen with | 519 # Move it even if it's not a directory as expected. This can happen with |
| 516 # FILES.cfg archive creation where we create an archive staging directory | 520 # FILES.cfg archive creation where we create an archive staging directory |
| 517 # that is the same name as the ultimate archive name. | 521 # that is the same name as the ultimate archive name. |
| 518 if not os.path.isdir(archive_dir): | 522 if not os.path.isdir(archive_dir): |
| 519 print 'Moving old "%s" file to create same name directory.' % archive_dir | 523 print 'Moving old "%s" file to create same name directory.' % archive_dir |
| 520 previous_archive_file = '%s.old' % archive_dir | 524 previous_archive_file = '%s.old' % archive_dir |
| 521 MoveFile(archive_dir, previous_archive_file) | 525 MoveFile(archive_dir, previous_archive_file) |
| 522 else: | 526 else: |
| 523 RemoveDirectory(archive_dir) | 527 RemoveDirectory(archive_dir) |
| 524 MaybeMakeDirectory(archive_dir) | 528 MaybeMakeDirectory(archive_dir) |
| 525 for needed_file in file_list: | 529 for needed_file in file_list: |
| 526 needed_file = needed_file.rstrip() | 530 needed_file = needed_file.rstrip() |
| 527 # These paths are relative to the file_relative_dir. We need to copy | 531 # These paths are relative to the file_relative_dir. We need to copy |
| 528 # them over maintaining the relative directories, where applicable. | 532 # them over maintaining the relative directories, where applicable. |
| 529 src_path = os.path.join(file_relative_dir, needed_file) | 533 src_path = os.path.join(file_relative_dir, needed_file) |
| 534 new_src_path = src_path |
| 535 for func in (replacements or []): |
| 536 new_src_path = func(src_path) |
| 537 if new_src_path is None: |
| 538 print 'Skipping %s' % src_path |
| 539 continue |
| 540 if new_src_path != src_path: |
| 541 print 'Replacing contents of %s with %s' % (src_path, new_src_path) |
| 542 src_path = new_src_path |
| 530 dirname, basename = os.path.split(needed_file) | 543 dirname, basename = os.path.split(needed_file) |
| 531 try: | 544 try: |
| 532 if os.path.isdir(src_path): | 545 if os.path.isdir(src_path): |
| 533 shutil.copytree(src_path, os.path.join(archive_dir, needed_file), | 546 shutil.copytree(src_path, os.path.join(archive_dir, needed_file), |
| 534 symlinks=True) | 547 symlinks=True) |
| 535 elif dirname != '' and basename != '': | 548 elif dirname != '' and basename != '': |
| 536 dest_dir = os.path.join(archive_dir, dirname) | 549 dest_dir = os.path.join(archive_dir, dirname) |
| 537 MaybeMakeDirectory(dest_dir) | 550 MaybeMakeDirectory(dest_dir) |
| 538 CopyFileToDir(src_path, dest_dir) | 551 CopyFileToDir(src_path, dest_dir, basename) |
| 539 else: | 552 else: |
| 540 CopyFileToDir(src_path, archive_dir) | 553 CopyFileToDir(src_path, archive_dir, basename) |
| 541 except PathNotFound: | 554 except PathNotFound: |
| 542 if raise_error: | 555 if raise_error: |
| 543 raise | 556 raise |
| 544 | 557 |
| 545 # Pack the zip file. | 558 # Pack the zip file. |
| 546 output_file = '%s.zip' % archive_dir | 559 output_file = '%s.zip' % archive_dir |
| 547 previous_file = '%s_old.zip' % archive_dir | 560 previous_file = '%s_old.zip' % archive_dir |
| 548 MoveFile(output_file, previous_file) | 561 MoveFile(output_file, previous_file) |
| 549 # On Windows we use the python zip module; on Linux and Mac, we use the zip | 562 # On Windows we use the python zip module; on Linux and Mac, we use the zip |
| 550 # command as it will handle links and file bits (executable). Which is much | 563 # command as it will handle links and file bits (executable). Which is much |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1117 conn.close() | 1130 conn.close() |
| 1118 | 1131 |
| 1119 return rev, 'ok' | 1132 return rev, 'ok' |
| 1120 | 1133 |
| 1121 | 1134 |
| 1122 def AbsoluteCanonicalPath(*path): | 1135 def AbsoluteCanonicalPath(*path): |
| 1123 """Return the most canonical path Python can provide.""" | 1136 """Return the most canonical path Python can provide.""" |
| 1124 | 1137 |
| 1125 file_path = os.path.join(*path) | 1138 file_path = os.path.join(*path) |
| 1126 return os.path.realpath(os.path.abspath(os.path.expanduser(file_path))) | 1139 return os.path.realpath(os.path.abspath(os.path.expanduser(file_path))) |
| OLD | NEW |