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
7# TODO(brettw) bug 582594: merge this with build/android/gn/zip.py and update
8# callers to use the existing template rather than invoking this directly.
9
10"""Archives a set of files.
11"""
12
13import optparse
14import os
15import sys
16import zipfile
17
18sys.path.append(os.path.join(os.path.dirname(__file__),
19                             os.pardir, os.pardir, os.pardir, os.pardir,
20                             "build"))
21import gn_helpers
22
23def DoZip(inputs, link_inputs, zip_inputs, output, base_dir):
24  files = []
25  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
26    for f in inputs:
27      file_name = os.path.relpath(f, base_dir)
28      files.append(file_name)
29      outfile.write(f, file_name)
30    for f in link_inputs:
31      realf = os.path.realpath(f)  # Resolve symlinks.
32      file_name = os.path.relpath(realf, base_dir)
33      files.append(file_name)
34      outfile.write(realf, file_name)
35    for zf_name in zip_inputs:
36      with zipfile.ZipFile(zf_name, 'r') as zf:
37        for f in zf.namelist():
38          if f not in files:
39            files.append(f)
40            with zf.open(f) as zff:
41              outfile.writestr(f, zff.read())
42
43
44def main():
45  parser = optparse.OptionParser()
46
47  parser.add_option('--inputs',
48      help='GN format list of files to archive.')
49  parser.add_option('--link-inputs',
50      help='GN-format list of files to archive. Symbolic links are resolved.')
51  parser.add_option('--zip-inputs',
52      help='GN-format list of zip files to re-archive.')
53  parser.add_option('--output', help='Path to output archive.')
54  parser.add_option('--base-dir',
55                    help='If provided, the paths in the archive will be '
56                    'relative to this directory', default='.')
57
58  options, _ = parser.parse_args()
59
60  inputs = []
61  if (options.inputs):
62    parser = gn_helpers.GNValueParser(options.inputs)
63    inputs = parser.ParseList()
64
65  link_inputs = []
66  if options.link_inputs:
67    parser = gn_helpers.GNValueParser(options.link_inputs)
68    link_inputs = parser.ParseList()
69
70  zip_inputs = []
71  if options.zip_inputs:
72    parser = gn_helpers.GNValueParser(options.zip_inputs)
73    zip_inputs = parser.ParseList()
74
75  output = options.output
76  base_dir = options.base_dir
77
78  DoZip(inputs, link_inputs, zip_inputs, output, base_dir)
79
80if __name__ == '__main__':
81  sys.exit(main())
82