12daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#!/usr/bin/env python 22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# 32daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# Copyright (C) 2011 Google Inc. All rights reserved. 42daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# 52daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# Redistribution and use in source and binary forms, with or without 62daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# modification, are permitted provided that the following conditions are 72daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# met: 82daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# 92daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# * Redistributions of source code must retain the above copyright 102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# notice, this list of conditions and the following disclaimer. 112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# * Redistributions in binary form must reproduce the above 122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# copyright notice, this list of conditions and the following disclaimer 132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# in the documentation and/or other materials provided with the 142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# distribution. 152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# * Neither the name of Google Inc. nor the names of its 162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# contributors may be used to endorse or promote products derived from 172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# this software without specific prior written permission. 182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# 192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# 312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# This script replaces calls to importScripts with script sources 332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch# in input script file and dumps result into output script file. 342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochfrom cStringIO import StringIO 362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochimport os.path 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochimport re 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochimport sys 402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochdef main(argv): 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if len(argv) < 3: 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch print('usage: %s inputFile importsDir outputFile' % argv[0]) 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return 1 472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inputFileName = argv[1] 492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch importsDir = argv[2] 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputFileName = argv[3] 512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inputFile = open(inputFileName, 'r') 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inputScript = inputFile.read() 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch inputFile.close() 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch def replace(match): 572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch importFileName = match.group(1) 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch fullPath = os.path.join(importsDir, importFileName) 592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if not os.access(fullPath, os.F_OK): 602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch raise Exception('File %s referenced in %s not found on any source paths, ' 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 'check source tree for consistency' % 622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch (importFileName, inputFileName)) 632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch importFile = open(fullPath, 'r') 642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch importScript = importFile.read() 652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch importFile.close() 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return importScript 672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputScript = re.sub(r'importScripts\([\'"]([^\'"]+)[\'"]\)', replace, inputScript) 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputFile = open(outputFileName, 'w') 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputFile.write(outputScript) 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputFile.close() 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch # Touch output file directory to make sure that Xcode will copy 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch # modified resource files. 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch if sys.platform == 'darwin': 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch outputDirName = os.path.dirname(outputFileName) 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch os.utime(outputDirName, None) 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochif __name__ == '__main__': 812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch sys.exit(main(sys.argv)) 82