1#!/usr/bin/env python 2# 3# Copyright 2014 The Chromium Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6"""Archives a set of files.""" 7 8import argparse 9import os 10import sys 11import zipfile 12 13from util import build_utils 14 15 16def main(args): 17 args = build_utils.ExpandFileArgs(args) 18 parser = argparse.ArgumentParser(args) 19 parser.add_argument('--input-files', help='GN-list of files to zip.') 20 parser.add_argument( 21 '--input-files-base-dir', 22 help='Paths in the archive will be relative to this directory') 23 parser.add_argument('--input-zips', help='GN-list of zips to merge.') 24 parser.add_argument( 25 '--input-zips-excluded-globs', 26 help='GN-list of globs for paths to exclude.') 27 parser.add_argument('--output', required=True, help='Path to output archive.') 28 compress_group = parser.add_mutually_exclusive_group() 29 compress_group.add_argument( 30 '--compress', action='store_true', help='Compress entries') 31 compress_group.add_argument( 32 '--no-compress', 33 action='store_false', 34 dest='compress', 35 help='Do not compress entries') 36 build_utils.AddDepfileOption(parser) 37 options = parser.parse_args(args) 38 39 with build_utils.AtomicOutput(options.output) as f: 40 with zipfile.ZipFile(f.name, 'w') as out_zip: 41 depfile_deps = None 42 if options.input_files: 43 files = build_utils.ParseGnList(options.input_files) 44 build_utils.DoZip( 45 files, 46 out_zip, 47 base_dir=options.input_files_base_dir, 48 compress_fn=lambda _: options.compress) 49 50 if options.input_zips: 51 files = build_utils.ParseGnList(options.input_zips) 52 depfile_deps = files 53 path_transform = None 54 if options.input_zips_excluded_globs: 55 globs = build_utils.ParseGnList(options.input_zips_excluded_globs) 56 path_transform = ( 57 lambda p: None if build_utils.MatchesGlob(p, globs) else p) 58 build_utils.MergeZips( 59 out_zip, 60 files, 61 path_transform=path_transform, 62 compress=options.compress) 63 64 # Depfile used only by dist_jar(). 65 if options.depfile: 66 build_utils.WriteDepfile( 67 options.depfile, options.output, inputs=depfile_deps, add_pydeps=False) 68 69 70if __name__ == '__main__': 71 main(sys.argv[1:]) 72