build-webapp.py revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file. 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""Creates a directory with with the unpacked contents of the remoting webapp. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)The directory will contain a copy-of or a link-to to all remoting webapp 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)resources. This includes HTML/JS and any plugin binaries. The script also 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)massages resulting files appropriately with host plugin data. Finally, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)a zip archive for all of the above is produced. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)""" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Python 2.5 compatibility 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from __future__ import with_statement 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import platform 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import re 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import shutil 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import subprocess 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import zipfile 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Update the module path, assuming that this script is in src/remoting/webapp, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# and that the google_api_keys module is in src/google_apis. Note that 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# sys.path[0] refers to the directory containing this script. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.path.append( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.path.abspath(os.path.join(sys.path[0], '../../google_apis'))) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import google_api_keys 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def findAndReplace(filepath, findString, replaceString): 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Does a search and replace on the contents of a file.""" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldFilename = os.path.basename(filepath) + '.old' 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldFilepath = os.path.join(os.path.dirname(filepath), oldFilename) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.rename(filepath, oldFilepath) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with open(oldFilepath) as input: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with open(filepath, 'w') as output: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for s in input: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) output.write(s.replace(findString, replaceString)) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.remove(oldFilepath) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def createZip(zip_path, directory): 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Creates a zipfile at zip_path for the given directory.""" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zipfile_base = os.path.splitext(os.path.basename(zip_path))[0] 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zip = zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (root, dirs, files) in os.walk(directory): 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for f in files: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) full_path = os.path.join(root, f) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rel_path = os.path.relpath(full_path, directory) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zip.write(full_path, os.path.join(zipfile_base, rel_path)) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zip.close() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def buildWebApp(buildtype, version, mimetype, destination, zip_path, plugin, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files, locales): 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """Does the main work of building the webapp directory and zipfile. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Args: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buildtype: the type of build ("Official" or "Dev") 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mimetype: A string with mimetype of plugin. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination: A string with path to directory where the webapp will be 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) written. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) zipfile: A string with path to the zipfile to create containing the 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents of |destination|. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin: A string with path to the binary plugin for this webapp. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files: An array of strings listing the paths for resources to include 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) in this webapp. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locales: An array of strings listing locales, which are copied, along 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) with their directory structure from the _locales directory down. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) """ 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Ensure a fresh directory. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.rmtree(destination) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) except OSError: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if os.path.exists(destination): 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pass 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.mkdir(destination, 0775) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Use symlinks on linux and mac for faster compile/edit cycle. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # On Windows Vista platform.system() can return 'Microsoft' with some 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # versions of Python, see http://bugs.python.org/issue1082 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # should_symlink = platform.system() not in ['Windows', 'Microsoft'] 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(ajwong): Pending decision on http://crbug.com/27185 we may not be 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # able to load symlinked resources. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) should_symlink = False 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Copy all the files. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for current_file in files: 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination_file = os.path.join(destination, os.path.basename(current_file)) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination_dir = os.path.dirname(destination_file) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if not os.path.exists(destination_dir): 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.makedirs(destination_dir, 0775) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if should_symlink: 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # TODO(ajwong): Detect if we're vista or higher. Then use win32file 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # to create a symlink in that case. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) targetname = os.path.relpath(os.path.realpath(current_file), 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.path.realpath(destination_file)) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.symlink(targetname, destination_file) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copy2(current_file, destination_file) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Copy all the locales, preserving directory structure 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination_locales = os.path.join(destination, "_locales") 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.mkdir(destination_locales , 0775) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locale_dir = "/_locales/" 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for current_locale in locales: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos = current_locale.find(locale_dir) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pos == -1): 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise Exception("Missing locales directory in " + current_locale) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subtree = current_locale[pos + len(locale_dir):] 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pos = subtree.find("/") 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (pos == -1): 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) raise Exception("Malformed locale: " + current_locale) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locale_id = subtree[:pos] 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) messages = subtree[pos+1:] 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination_dir = os.path.join(destination_locales, locale_id) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) destination_file = os.path.join(destination_dir, messages) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) os.mkdir(destination_dir, 0775) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copy2(current_locale, destination_file) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Create fake plugin files to appease the manifest checker. 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # It requires that if there is a plugin listed in the manifest that 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # there be a file in the plugin with that name. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names = [ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'remoting_host_plugin.dll', # Windows 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'remoting_host_plugin.plugin', # Mac 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'libremoting_host_plugin.ia32.so', # Linux 32 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'libremoting_host_plugin.x64.so' # Linux 64 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ] 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pluginName = os.path.basename(plugin) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for name in names: 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if name != pluginName: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path = os.path.join(destination, name) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f = open(path, 'w') 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.write("placeholder for %s" % (name)) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f.close() 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Copy the plugin. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pluginName = os.path.basename(plugin) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) newPluginPath = os.path.join(destination, pluginName) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if os.path.isdir(plugin): 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # On Mac we have a directory. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copytree(plugin, newPluginPath) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shutil.copy2(plugin, newPluginPath) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Strip the linux build. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((platform.system() == 'Linux') and (buildtype == 'Official')): 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subprocess.call(["strip", newPluginPath]) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Set the version number in the manifest version. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'manifest.json'), 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'FULL_APP_VERSION', 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Set the correct mimetype. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'plugin_settings.js'), 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'HOST_PLUGIN_MIMETYPE', 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mimetype) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Set the correct OAuth2 redirect URL. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) baseUrl = ( 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'https://chromoting-oauth.talkgadget.google.com/' 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 'talkgadget/oauth/chrome-remote-desktop') 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buildtype == 'Official'): 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJs = ( 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'" + baseUrl + "/rel/' + chrome.i18n.getMessage('@@extension_id')") 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJson = baseUrl + '/rel/*' 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJs = "'" + baseUrl + "/dev'" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJson = baseUrl + '/dev*' 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'plugin_settings.js'), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'OAUTH2_REDIRECT_URL'", 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJs) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'manifest.json'), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "OAUTH2_REDIRECT_URL", 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oauth2RedirectUrlJson) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Set the correct API keys. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apiClientId = google_api_keys.GetClientID('REMOTING') 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) apiClientSecret = google_api_keys.GetClientSecret('REMOTING') 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'plugin_settings.js'), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'API_CLIENT_ID'", 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'" + apiClientId + "'") 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) findAndReplace(os.path.join(destination, 'plugin_settings.js'), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'API_CLIENT_SECRET'", 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "'" + apiClientSecret + "'") 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) # Make the zipfile. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) createZip(zip_path, destination) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main(): 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if len(sys.argv) < 7: 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) print ('Usage: build-webapp.py ' 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<build-type> <version> <mime-type> <dst> <zip-path> <plugin> ' 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) '<other files...> --locales <locales...>') 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reading_locales = False 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files = [] 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locales = [] 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for arg in sys.argv[7:]: 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if arg == "--locales": 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reading_locales = True; 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elif reading_locales: 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) locales.append(arg) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else: 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) files.append(arg) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buildWebApp(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.argv[6], files, locales) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__': 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys.exit(main()) 229