| Index: remoting/webapp/build-webapp.py
|
| diff --git a/remoting/webapp/build-webapp.py b/remoting/webapp/build-webapp.py
|
| index df934f83b929701b5ec014b7efbaabe9c41eaa65..c03b16d8eee121f37ca00bea8f9c9516f388c25b 100755
|
| --- a/remoting/webapp/build-webapp.py
|
| +++ b/remoting/webapp/build-webapp.py
|
| @@ -61,36 +61,47 @@ def replaceString(destination, placeholder, value):
|
| "'" + placeholder + "'", "'" + value + "'")
|
|
|
|
|
| -def processJinjaTemplate(input_file, output_file, context):
|
| +def processJinjaTemplate(input_file, include_paths, output_file, context):
|
| jinja2_path = os.path.normpath(
|
| os.path.join(os.path.abspath(__file__),
|
| '../../../third_party/jinja2'))
|
| sys.path.append(os.path.split(jinja2_path)[0])
|
| import jinja2
|
| (template_path, template_name) = os.path.split(input_file)
|
| - env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_path))
|
| + include_paths = [template_path] + include_paths
|
| + env = jinja2.Environment(loader=jinja2.FileSystemLoader(include_paths))
|
| template = env.get_template(template_name)
|
| rendered = template.render(context)
|
| io.open(output_file, 'w', encoding='utf-8').write(rendered)
|
|
|
|
|
| -
|
| def buildWebApp(buildtype, version, destination, zip_path,
|
| - manifest_template, webapp_type, files, locales):
|
| + manifest_template, webapp_type, app_id, app_name,
|
| + app_description, files, locales, jinja_paths,
|
| + service_environment):
|
| """Does the main work of building the webapp directory and zipfile.
|
|
|
| Args:
|
| - buildtype: the type of build ("Official" or "Dev").
|
| + buildtype: the type of build ("Official", "Release" or "Dev").
|
| destination: A string with path to directory where the webapp will be
|
| written.
|
| zipfile: A string with path to the zipfile to create containing the
|
| contents of |destination|.
|
| manifest_template: jinja2 template file for manifest.
|
| - webapp_type: webapp type ("v1", "v2" or "v2_pnacl").
|
| + webapp_type: webapp type ("v1", "v2", "v2_pnacl" or "app_remoting").
|
| + app_id: A string with the Remoting Application Id (only used for app
|
| + remoting webapps). If supplied, it defaults to using the
|
| + test API server.
|
| + app_name: A string with the name of the application.
|
| + app_description: A string with the description of the application.
|
| files: An array of strings listing the paths for resources to include
|
| in this webapp.
|
| locales: An array of strings listing locales, which are copied, along
|
| with their directory structure from the _locales directory down.
|
| + jinja_paths: An array of paths to search for {%include} directives in
|
| + addition to the directory containing the manifest template.
|
| + service_environment: Used to point the webApp to one of the
|
| + dev/test/staging/prod environments
|
| """
|
| # Ensure a fresh directory.
|
| try:
|
| @@ -102,6 +113,9 @@ def buildWebApp(buildtype, version, destination, zip_path,
|
| pass
|
| os.mkdir(destination, 0775)
|
|
|
| + if buildtype != "Official" and buildtype != "Release" and buildtype != "Dev":
|
| + raise Exception("Unknown buildtype: " + buildtype);
|
| +
|
| # Use symlinks on linux and mac for faster compile/edit cycle.
|
| #
|
| # On Windows Vista platform.system() can return 'Microsoft' with some
|
| @@ -150,6 +164,7 @@ def buildWebApp(buildtype, version, destination, zip_path,
|
| raise Exception("Unknown extension: " + current_locale);
|
|
|
| # Set client plugin type.
|
| + # TODO(wez): Use 'native' in app_remoting until b/17441659 is resolved.
|
| client_plugin = 'pnacl' if webapp_type == 'v2_pnacl' else 'native'
|
| findAndReplace(os.path.join(destination, 'plugin_settings.js'),
|
| "'CLIENT_PLUGIN_TYPE'", "'" + client_plugin + "'")
|
| @@ -161,12 +176,80 @@ def buildWebApp(buildtype, version, destination, zip_path,
|
| 'OAUTH2_API_HOST', 'https://www.googleapis.com')
|
| directoryApiHost = os.environ.get(
|
| 'DIRECTORY_API_HOST', 'https://www.googleapis.com')
|
| +
|
| + if webapp_type == 'app_remoting':
|
| + appRemotingApiHost = os.environ.get(
|
| + 'APP_REMOTING_API_HOST', None)
|
| + appRemotingApplicationId = os.environ.get(
|
| + 'APP_REMOTING_APPLICATION_ID', None)
|
| +
|
| + # Release/Official builds are special because they are what we will upload
|
| + # to the web store. The checks below will validate that prod builds are
|
| + # being generated correctly (no overrides) and with the correct buildtype.
|
| + # They also verify that folks are not accidentally building dev/test/staging
|
| + # apps for release (no impersonation) instead of dev.
|
| + if service_environment == "prod" and buildtype == "Dev":
|
| + raise Exception("Prod environment cannot be built for 'dev' builds");
|
| +
|
| + if buildtype != "Dev":
|
| + if service_environment != "prod":
|
| + raise Exception("Invalid service_environment targeted for "
|
| + + buildtype + ": " + service_environment);
|
| + if "out/Release" not in destination:
|
| + raise Exception("Prod builds must be placed in the out/Release folder");
|
| + if app_id != None:
|
| + raise Exception("Cannot pass in an app_id for "
|
| + + buildtype + " builds: " + service_environment);
|
| + if appRemotingApiHost != None:
|
| + raise Exception("Cannot set APP_REMOTING_API_HOST env var for "
|
| + + buildtype + " builds");
|
| + if appRemotingApplicationId != None:
|
| + raise Exception("Cannot set APP_REMOTING_APPLICATION_ID env var for "
|
| + + buildtype + " builds");
|
| +
|
| + # If an Application ID was set (either from service_environment variable or
|
| + # from a command line argument), hardcode it, otherwise get it at runtime.
|
| + effectiveAppId = appRemotingApplicationId or app_id
|
| + if effectiveAppId:
|
| + appRemotingApplicationId = "'" + effectiveAppId + "'"
|
| + else:
|
| + appRemotingApplicationId = "chrome.i18n.getMessage('@@extension_id')"
|
| + findAndReplace(os.path.join(destination, 'plugin_settings.js'),
|
| + "'APP_REMOTING_APPLICATION_ID'", appRemotingApplicationId)
|
| +
|
| oauth2BaseUrl = oauth2AccountsHost + '/o/oauth2'
|
| oauth2ApiBaseUrl = oauth2ApiHost + '/oauth2'
|
| directoryApiBaseUrl = directoryApiHost + '/chromoting/v1'
|
| +
|
| + if webapp_type == 'app_remoting':
|
| + # Set the apiary endpoint and then set the endpoint version
|
| + if not appRemotingApiHost:
|
| + if service_environment == "prod":
|
| + appRemotingApiHost = 'https://www.googleapis.com'
|
| + else:
|
| + appRemotingApiHost = 'https://www-googleapis-test.sandbox.google.com'
|
| +
|
| + if service_environment == "dev":
|
| + appRemotingServicePath = '/appremoting/v1beta1_dev'
|
| + elif service_environment == "test":
|
| + appRemotingServicePath = '/appremoting/v1beta1'
|
| + elif service_environment == "staging":
|
| + appRemotingServicePath = '/appremoting/v1beta1_staging'
|
| + elif service_environment == "prod":
|
| + appRemotingServicePath = '/appremoting/v1beta1'
|
| + else:
|
| + raise Exception("Unknown service environment: " + service_environment);
|
| + appRemotingApiBaseUrl = appRemotingApiHost + appRemotingServicePath
|
| + else:
|
| + appRemotingApiBaseUrl = ''
|
| +
|
| replaceString(destination, 'OAUTH2_BASE_URL', oauth2BaseUrl)
|
| replaceString(destination, 'OAUTH2_API_BASE_URL', oauth2ApiBaseUrl)
|
| replaceString(destination, 'DIRECTORY_API_BASE_URL', directoryApiBaseUrl)
|
| + if webapp_type == 'app_remoting':
|
| + replaceString(destination, 'APP_REMOTING_API_BASE_URL',
|
| + appRemotingApiBaseUrl)
|
| +
|
| # Substitute hosts in the manifest's CSP list.
|
| # Ensure we list the API host only once if it's the same for multiple APIs.
|
| googleApiHosts = ' '.join(set([oauth2ApiHost, directoryApiHost]))
|
| @@ -194,7 +277,7 @@ def buildWebApp(buildtype, version, destination, zip_path,
|
| oauth2RedirectPath = '/talkgadget/oauth/chrome-remote-desktop'
|
| oauth2RedirectBaseUrlJs = oauth2RedirectHostJs + oauth2RedirectPath
|
| oauth2RedirectBaseUrlJson = oauth2RedirectHostJson + oauth2RedirectPath
|
| - if buildtype == 'Official':
|
| + if buildtype != 'Dev':
|
| oauth2RedirectUrlJs = ("'" + oauth2RedirectBaseUrlJs +
|
| "/rel/' + chrome.i18n.getMessage('@@extension_id')")
|
| oauth2RedirectUrlJson = oauth2RedirectBaseUrlJson + '/rel/*'
|
| @@ -230,30 +313,35 @@ def buildWebApp(buildtype, version, destination, zip_path,
|
| replaceString(destination, "API_CLIENT_ID", apiClientId)
|
| replaceString(destination, "API_CLIENT_SECRET", apiClientSecret)
|
|
|
| - # Use a consistent extension id for unofficial builds.
|
| - if buildtype != 'Official':
|
| + # Use a consistent extension id for dev builds.
|
| + if buildtype == 'Dev':
|
| manifestKey = '"key": "remotingdevbuild",'
|
| else:
|
| manifestKey = ''
|
|
|
| # Generate manifest.
|
| - context = {
|
| - 'webapp_type': webapp_type,
|
| - 'FULL_APP_VERSION': version,
|
| - 'MANIFEST_KEY_FOR_UNOFFICIAL_BUILD': manifestKey,
|
| - 'OAUTH2_REDIRECT_URL': oauth2RedirectUrlJson,
|
| - 'TALK_GADGET_HOST': talkGadgetHostJson,
|
| - 'THIRD_PARTY_AUTH_REDIRECT_URL': thirdPartyAuthUrlJson,
|
| - 'REMOTING_IDENTITY_API_CLIENT_ID': apiClientIdV2,
|
| - 'OAUTH2_BASE_URL': oauth2BaseUrl,
|
| - 'OAUTH2_API_BASE_URL': oauth2ApiBaseUrl,
|
| - 'DIRECTORY_API_BASE_URL': directoryApiBaseUrl,
|
| - 'OAUTH2_ACCOUNTS_HOST': oauth2AccountsHost,
|
| - 'GOOGLE_API_HOSTS': googleApiHosts,
|
| - }
|
| - processJinjaTemplate(manifest_template,
|
| - os.path.join(destination, 'manifest.json'),
|
| - context)
|
| + if manifest_template:
|
| + context = {
|
| + 'webapp_type': webapp_type,
|
| + 'FULL_APP_VERSION': version,
|
| + 'MANIFEST_KEY_FOR_UNOFFICIAL_BUILD': manifestKey,
|
| + 'OAUTH2_REDIRECT_URL': oauth2RedirectUrlJson,
|
| + 'TALK_GADGET_HOST': talkGadgetHostJson,
|
| + 'THIRD_PARTY_AUTH_REDIRECT_URL': thirdPartyAuthUrlJson,
|
| + 'REMOTING_IDENTITY_API_CLIENT_ID': apiClientIdV2,
|
| + 'OAUTH2_BASE_URL': oauth2BaseUrl,
|
| + 'OAUTH2_API_BASE_URL': oauth2ApiBaseUrl,
|
| + 'DIRECTORY_API_BASE_URL': directoryApiBaseUrl,
|
| + 'APP_REMOTING_API_BASE_URL': appRemotingApiBaseUrl,
|
| + 'OAUTH2_ACCOUNTS_HOST': oauth2AccountsHost,
|
| + 'GOOGLE_API_HOSTS': googleApiHosts,
|
| + 'APP_NAME': app_name,
|
| + 'APP_DESCRIPTION': app_description,
|
| + }
|
| + processJinjaTemplate(manifest_template,
|
| + jinja_paths,
|
| + os.path.join(destination, 'manifest.json'),
|
| + context)
|
|
|
| # Make the zipfile.
|
| createZip(zip_path, destination)
|
| @@ -266,22 +354,54 @@ def main():
|
| print ('Usage: build-webapp.py '
|
| '<build-type> <version> <dst> <zip-path> <manifest_template> '
|
| '<webapp_type> <other files...> '
|
| - '[--locales <locales...>]')
|
| + '--app_name <name> '
|
| + '--app_description <description> '
|
| + '[--appid <appid>] '
|
| + '[--locales <locales...>] '
|
| + '[--jinja_paths <paths...>] '
|
| + '[--service_environment <service_environment>]')
|
| return 1
|
|
|
| arg_type = ''
|
| files = []
|
| locales = []
|
| + jinja_paths = []
|
| + app_id = None
|
| + app_name = None
|
| + app_description = None
|
| + service_environment = ''
|
| +
|
| for arg in sys.argv[7:]:
|
| - if arg in ['--locales']:
|
| + if arg in ['--locales',
|
| + '--jinja_paths',
|
| + '--appid',
|
| + '--app_name',
|
| + '--app_description',
|
| + '--service_environment']:
|
| arg_type = arg
|
| elif arg_type == '--locales':
|
| locales.append(arg)
|
| + elif arg_type == '--jinja_paths':
|
| + jinja_paths.append(arg)
|
| + elif arg_type == '--appid':
|
| + app_id = arg
|
| + arg_type = ''
|
| + elif arg_type == '--app_name':
|
| + app_name = arg
|
| + arg_type = ''
|
| + elif arg_type == '--app_description':
|
| + app_description = arg
|
| + arg_type = ''
|
| + elif arg_type == '--service_environment':
|
| + service_environment = arg
|
| + arg_type = ''
|
| else:
|
| files.append(arg)
|
|
|
| return buildWebApp(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4],
|
| - sys.argv[5], sys.argv[6], files, locales)
|
| + sys.argv[5], sys.argv[6], app_id, app_name,
|
| + app_description, files, locales, jinja_paths,
|
| + service_environment)
|
|
|
|
|
| if __name__ == '__main__':
|
|
|