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