Home | History | Annotate | Download | only in gn
      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 
     13 import optparse
     14 import os
     15 import sys
     16 import zipfile
     17 
     18 sys.path.append(os.path.join(os.path.dirname(__file__),
     19                              os.pardir, os.pardir, os.pardir, os.pardir,
     20                              "build"))
     21 import gn_helpers
     22 
     23 def 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 
     44 def 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 
     80 if __name__ == '__main__':
     81   sys.exit(main())
     82