xref: /aosp_15_r20/external/libchrome/mojo/public/tools/gn/zip.py (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker#!/usr/bin/env python
2*635a8641SAndroid Build Coastguard Worker#
3*635a8641SAndroid Build Coastguard Worker# Copyright 2014 The Chromium Authors. All rights reserved.
4*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
5*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file.
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker# TODO(brettw) bug 582594: merge this with build/android/gn/zip.py and update
8*635a8641SAndroid Build Coastguard Worker# callers to use the existing template rather than invoking this directly.
9*635a8641SAndroid Build Coastguard Worker
10*635a8641SAndroid Build Coastguard Worker"""Archives a set of files.
11*635a8641SAndroid Build Coastguard Worker"""
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard Workerimport optparse
14*635a8641SAndroid Build Coastguard Workerimport os
15*635a8641SAndroid Build Coastguard Workerimport sys
16*635a8641SAndroid Build Coastguard Workerimport zipfile
17*635a8641SAndroid Build Coastguard Worker
18*635a8641SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__),
19*635a8641SAndroid Build Coastguard Worker                             os.pardir, os.pardir, os.pardir, os.pardir,
20*635a8641SAndroid Build Coastguard Worker                             "build"))
21*635a8641SAndroid Build Coastguard Workerimport gn_helpers
22*635a8641SAndroid Build Coastguard Worker
23*635a8641SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__),
24*635a8641SAndroid Build Coastguard Worker                             os.pardir, os.pardir, os.pardir, os.pardir,
25*635a8641SAndroid Build Coastguard Worker                             'build', 'android', 'gyp'))
26*635a8641SAndroid Build Coastguard Workerfrom util import build_utils
27*635a8641SAndroid Build Coastguard Worker
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Workerdef DoZip(inputs, link_inputs, zip_inputs, output, base_dir):
30*635a8641SAndroid Build Coastguard Worker  files = []
31*635a8641SAndroid Build Coastguard Worker  with zipfile.ZipFile(output, 'w', zipfile.ZIP_DEFLATED) as outfile:
32*635a8641SAndroid Build Coastguard Worker    for f in inputs:
33*635a8641SAndroid Build Coastguard Worker      file_name = os.path.relpath(f, base_dir)
34*635a8641SAndroid Build Coastguard Worker      files.append(file_name)
35*635a8641SAndroid Build Coastguard Worker      build_utils.AddToZipHermetic(outfile, file_name, f)
36*635a8641SAndroid Build Coastguard Worker    for f in link_inputs:
37*635a8641SAndroid Build Coastguard Worker      realf = os.path.realpath(f)  # Resolve symlinks.
38*635a8641SAndroid Build Coastguard Worker      file_name = os.path.relpath(realf, base_dir)
39*635a8641SAndroid Build Coastguard Worker      files.append(file_name)
40*635a8641SAndroid Build Coastguard Worker      build_utils.AddToZipHermetic(outfile, file_name, realf)
41*635a8641SAndroid Build Coastguard Worker    for zf_name in zip_inputs:
42*635a8641SAndroid Build Coastguard Worker      with zipfile.ZipFile(zf_name, 'r') as zf:
43*635a8641SAndroid Build Coastguard Worker        for f in zf.namelist():
44*635a8641SAndroid Build Coastguard Worker          if f not in files:
45*635a8641SAndroid Build Coastguard Worker            files.append(f)
46*635a8641SAndroid Build Coastguard Worker            build_utils.AddToZipHermetic(outfile, f, data=zf.read(f))
47*635a8641SAndroid Build Coastguard Worker
48*635a8641SAndroid Build Coastguard Worker
49*635a8641SAndroid Build Coastguard Workerdef main():
50*635a8641SAndroid Build Coastguard Worker  parser = optparse.OptionParser()
51*635a8641SAndroid Build Coastguard Worker
52*635a8641SAndroid Build Coastguard Worker  parser.add_option('--inputs',
53*635a8641SAndroid Build Coastguard Worker      help='GN format list of files to archive.')
54*635a8641SAndroid Build Coastguard Worker  parser.add_option('--link-inputs',
55*635a8641SAndroid Build Coastguard Worker      help='GN-format list of files to archive. Symbolic links are resolved.')
56*635a8641SAndroid Build Coastguard Worker  parser.add_option('--zip-inputs',
57*635a8641SAndroid Build Coastguard Worker      help='GN-format list of zip files to re-archive.')
58*635a8641SAndroid Build Coastguard Worker  parser.add_option('--output', help='Path to output archive.')
59*635a8641SAndroid Build Coastguard Worker  parser.add_option('--base-dir',
60*635a8641SAndroid Build Coastguard Worker                    help='If provided, the paths in the archive will be '
61*635a8641SAndroid Build Coastguard Worker                    'relative to this directory', default='.')
62*635a8641SAndroid Build Coastguard Worker
63*635a8641SAndroid Build Coastguard Worker  options, _ = parser.parse_args()
64*635a8641SAndroid Build Coastguard Worker
65*635a8641SAndroid Build Coastguard Worker  inputs = []
66*635a8641SAndroid Build Coastguard Worker  if (options.inputs):
67*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser(options.inputs)
68*635a8641SAndroid Build Coastguard Worker    inputs = parser.ParseList()
69*635a8641SAndroid Build Coastguard Worker
70*635a8641SAndroid Build Coastguard Worker  link_inputs = []
71*635a8641SAndroid Build Coastguard Worker  if options.link_inputs:
72*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser(options.link_inputs)
73*635a8641SAndroid Build Coastguard Worker    link_inputs = parser.ParseList()
74*635a8641SAndroid Build Coastguard Worker
75*635a8641SAndroid Build Coastguard Worker  zip_inputs = []
76*635a8641SAndroid Build Coastguard Worker  if options.zip_inputs:
77*635a8641SAndroid Build Coastguard Worker    parser = gn_helpers.GNValueParser(options.zip_inputs)
78*635a8641SAndroid Build Coastguard Worker    zip_inputs = parser.ParseList()
79*635a8641SAndroid Build Coastguard Worker
80*635a8641SAndroid Build Coastguard Worker  output = options.output
81*635a8641SAndroid Build Coastguard Worker  base_dir = options.base_dir
82*635a8641SAndroid Build Coastguard Worker
83*635a8641SAndroid Build Coastguard Worker  DoZip(inputs, link_inputs, zip_inputs, output, base_dir)
84*635a8641SAndroid Build Coastguard Worker
85*635a8641SAndroid Build Coastguard Workerif __name__ == '__main__':
86*635a8641SAndroid Build Coastguard Worker  sys.exit(main())
87