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