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