| Index: remoting/host/installer/build-installer-archive.py
|
| ===================================================================
|
| --- remoting/host/installer/build-installer-archive.py (revision 134709)
|
| +++ remoting/host/installer/build-installer-archive.py (working copy)
|
| @@ -71,30 +71,45 @@
|
| zip.close()
|
|
|
|
|
| -def remapSrcFile(dst_root, src_root, src_file):
|
| +def remapSrcFile(dst_root, src_roots, src_file):
|
| """Calculates destination file path and creates directory.
|
|
|
| - The |src_root| prefix is stripped from |src_file| before
|
| + Any matching |src_roots| prefix is stripped from |src_file| before
|
| appending to |dst_root|.
|
|
|
| For example, given:
|
| - dst_root = /output
|
| - src_root = host/installer/mac
|
| - src_file = host/installer/mac/Scripts/keystone_install.sh
|
| + dst_root = '/output'
|
| + src_roots = ['host/installer/mac']
|
| + src_file = 'host/installer/mac/Scripts/keystone_install.sh'
|
| The final calculated path is:
|
| - /output/Scripts/keystone_install.sh
|
| + '/output/Scripts/keystone_install.sh'
|
|
|
| + The |src_file| must match one of the |src_roots| prefixes. If there are no
|
| + matches, then an error is reported.
|
| +
|
| + If multiple |src_roots| match, then only the first match is applied. Because
|
| + of this, if you have roots that share a common prefix, the longest string
|
| + should be first in this array.
|
| +
|
| Args:
|
| dst_root: Target directory where files are copied.
|
| - src_root: Path prefix which is stripped of |src_file| before appending
|
| - it to the |dst_root|.
|
| + src_roots: Array of path prefixes which will be stripped of |src_file|
|
| + (if they match) before appending it to the |dst_root|.
|
| src_file: Source file to be copied.
|
| Returns:
|
| Full path to destination file in |dst_root|.
|
| """
|
| # Strip of directory prefix.
|
| - if src_file.startswith(src_root):
|
| - src_file = src_file[len(src_root):]
|
| + found_root = False
|
| + for root in src_roots:
|
| + if src_file.startswith(root):
|
| + src_file = src_file[len(root):]
|
| + found_root = True
|
| + break
|
| +
|
| + if not found_root:
|
| + error('Unable to match prefix for %s' % src_file)
|
| +
|
| dst_file = os.path.join(dst_root, src_file)
|
| # Make sure target directory exists.
|
| dst_dir = os.path.dirname(dst_file)
|
| @@ -151,14 +166,15 @@
|
| shutil.copytree(src_dir, os.path.join(out_zip_dir, base_dir_name))
|
|
|
|
|
| -def buildHostArchive(temp_dir, zip_path, source_files_root, source_files,
|
| +def buildHostArchive(temp_dir, zip_path, source_file_roots, source_files,
|
| gen_files, gen_files_dst, defs):
|
| """Builds a zip archive with the files needed to build the installer.
|
|
|
| Args:
|
| temp_dir: Temporary dir used to build up the contents for the archive.
|
| zip_path: Full path to the zip file to create.
|
| - source_files_root: Path prefix to strip off |files| when adding to archive.
|
| + source_file_roots: Array of path prefixes to strip off |files| when adding
|
| + to the archive.
|
| source_files: The array of files to add to archive. The path structure is
|
| preserved (except for the |files_root| prefix).
|
| gen_files: Full path to binaries to add to archive.
|
| @@ -169,18 +185,18 @@
|
| cleanDir(temp_dir)
|
|
|
| for f in source_files:
|
| - dst_file = remapSrcFile(temp_dir, source_files_root, f)
|
| + dst_file = remapSrcFile(temp_dir, source_file_roots, f)
|
| base_file = os.path.basename(f)
|
| (base, ext) = os.path.splitext(f)
|
| if ext == '.zip':
|
| - copyZipIntoArchive(temp_dir, source_files_root, f)
|
| + copyZipIntoArchive(temp_dir, source_file_roots, f)
|
| elif ext in ['.sh', '.packproj', '.plist']:
|
| copyFileWithDefs(f, dst_file, defs)
|
| else:
|
| - shutil.copy2(src_file, dst_file)
|
| + shutil.copy2(f, dst_file)
|
|
|
| for bs, bd in zip(gen_files, gen_files_dst):
|
| - dst_file = remapSrcFile(temp_dir, source_files_root, bd)
|
| + dst_file = os.path.join(temp_dir, bd)
|
| if os.path.isdir(bs):
|
| shutil.copytree(bs, dst_file)
|
| else:
|
| @@ -190,14 +206,15 @@
|
|
|
|
|
| def error(msg):
|
| - sys.stderr.write('ERROR: %s' % msg)
|
| + sys.stderr.write('ERROR: %s\n' % msg)
|
| sys.exit(1)
|
|
|
|
|
| def usage():
|
| """Display basic usage information."""
|
| print ('Usage: %s\n'
|
| - ' <temp-dir> <zip-path> <files-root-dir>\n'
|
| + ' <temp-dir> <zip-path>\n'
|
| + ' --source-file-roots <list of roots to strip off source files...>\n'
|
| ' --source-files <list of source files...>\n'
|
| ' --generated-files <list of generated target files...>\n'
|
| ' --generated-files-dst <dst for each generated file...>\n'
|
| @@ -206,21 +223,23 @@
|
|
|
|
|
| def main():
|
| - if len(sys.argv) < 3:
|
| + if len(sys.argv) < 2:
|
| usage()
|
| error('Too few arguments')
|
|
|
| temp_dir = sys.argv[1]
|
| zip_path = sys.argv[2]
|
| - source_files_root = sys.argv[3]
|
|
|
| arg_mode = ''
|
| + source_file_roots = []
|
| source_files = []
|
| generated_files = []
|
| generated_files_dst = []
|
| definitions = []
|
| - for arg in sys.argv[4:]:
|
| - if arg == '--source-files':
|
| + for arg in sys.argv[3:]:
|
| + if arg == '--source-file-roots':
|
| + arg_mode = 'src-roots'
|
| + elif arg == '--source-files':
|
| arg_mode = 'files'
|
| elif arg == '--generated-files':
|
| arg_mode = 'gen-src'
|
| @@ -229,6 +248,8 @@
|
| elif arg == '--defs':
|
| arg_mode = 'defs'
|
|
|
| + elif arg_mode == 'src-roots':
|
| + source_file_roots.append(arg)
|
| elif arg_mode == 'files':
|
| source_files.append(arg)
|
| elif arg_mode == 'gen-src':
|
| @@ -245,17 +266,22 @@
|
| if len(source_files) == 0 and len(generated_files) == 0:
|
| error('At least one input file must be specified.')
|
|
|
| - # Ensure that source_files_root ends with a directory separator.
|
| - if source_files_root[-1:] != os.sep:
|
| - source_files_root += os.sep
|
| + # Ensure that each path in source_file_roots ends with a directory separator.
|
| + for root in source_file_roots:
|
| + if root[-1:] != os.sep:
|
| + error('Each source-file-root should end with a "\": %s' % root)
|
|
|
| + # Sort roots to ensure the longest one is first. See comment in remapSrcFile
|
| + # for why this is necessary.
|
| + source_file_roots.sort(key=len, reverse=True)
|
| +
|
| # Verify that the 2 generated_files arrays have the same number of elements.
|
| if len(generated_files) != len(generated_files_dst):
|
| error('len(--generated-files) != len(--generated-files-dst)')
|
|
|
| defs = buildDefDictionary(definitions)
|
|
|
| - result = buildHostArchive(temp_dir, zip_path, source_files_root,
|
| + result = buildHostArchive(temp_dir, zip_path, source_file_roots,
|
| source_files, generated_files, generated_files_dst,
|
| defs)
|
|
|
|
|