Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 import argparse | 6 import argparse |
| 7 import glob | 7 import glob |
| 8 import os | 8 import os |
| 9 import subprocess | 9 import subprocess |
| 10 import sys | 10 import sys |
| 11 import tempfile | 11 import tempfile |
| 12 import time | 12 import time |
| 13 import zipfile | 13 import zipfile |
| 14 | 14 |
| 15 import mopy.gn as gn | 15 import mopy.gn as gn |
| 16 from mopy.config import Config | 16 from mopy.config import Config |
| 17 from mopy.paths import Paths | 17 from mopy.paths import Paths |
| 18 from mopy.version import Version | 18 from mopy.version import Version |
| 19 | 19 |
| 20 BLACKLISTED_APPS = [ | 20 BLACKLISTED_APPS = [ |
| 21 # The network service apps are not produced out of the Mojo repo, but may | 21 # The network service apps are not produced out of the Mojo repo, but may |
| 22 # be present in the build dir. | 22 # be present in the build dir. |
| 23 "network_service.mojo", | 23 "network_service.mojo", |
| 24 "network_service_apptests.mojo", | 24 "network_service_apptests.mojo", |
| 25 ] | 25 ] |
| 26 | 26 |
| 27 WHILTELISTED_FILES = [ | |
| 28 # These are files other than *.mojo files which are part of our binary | |
| 29 # artifact scheme. | |
| 30 "obj/mojo/dart/apptest/apptest.dartzip", | |
| 31 ] | |
| 32 | |
| 33 | |
| 27 def target(config): | 34 def target(config): |
| 28 return config.target_os + "-" + config.target_cpu | 35 return config.target_os + "-" + config.target_cpu |
| 29 | 36 |
| 37 | |
| 30 def find_apps_to_upload(build_dir): | 38 def find_apps_to_upload(build_dir): |
| 31 apps = [] | 39 apps = [] |
| 32 for path in glob.glob(build_dir + "/*"): | 40 for path in glob.glob(build_dir + "/*"): |
| 33 if not os.path.isfile(path): | 41 if not os.path.isfile(path): |
| 34 continue | 42 continue |
| 35 _, ext = os.path.splitext(path) | 43 _, ext = os.path.splitext(path) |
| 36 if ext != '.mojo': | 44 if ext != '.mojo': |
| 37 continue | 45 continue |
| 38 if os.path.basename(path) in BLACKLISTED_APPS: | 46 if os.path.basename(path) in BLACKLISTED_APPS: |
| 39 continue | 47 continue |
| 40 apps.append(path) | 48 apps.append(path) |
| 41 return apps | 49 return apps |
| 42 | 50 |
| 51 | |
| 52 def find_whitelisted_files(build_dir): | |
| 53 existing_files = [] | |
| 54 for path in WHILTELISTED_FILES: | |
| 55 joined_path = os.path.join(build_dir, path) | |
| 56 if os.path.isfile(joined_path): | |
| 57 existing_files.append(joined_path) | |
| 58 return existing_files | |
| 59 | |
| 60 | |
| 43 def upload(config, source, dest, dry_run): | 61 def upload(config, source, dest, dry_run): |
| 44 paths = Paths(config) | 62 paths = Paths(config) |
| 45 sys.path.insert(0, os.path.join(paths.src_root, "tools")) | 63 sys.path.insert(0, os.path.join(paths.src_root, "tools")) |
| 46 # pylint: disable=F0401 | 64 # pylint: disable=F0401 |
| 47 import find_depot_tools | 65 import find_depot_tools |
| 48 | 66 |
| 49 depot_tools_path = find_depot_tools.add_depot_tools_to_path() | 67 depot_tools_path = find_depot_tools.add_depot_tools_to_path() |
| 50 gsutil_exe = os.path.join(depot_tools_path, "third_party", "gsutil", "gsutil") | 68 gsutil_exe = os.path.join(depot_tools_path, "third_party", "gsutil", "gsutil") |
| 51 | 69 |
| 52 if dry_run: | 70 if dry_run: |
| 53 print str([gsutil_exe, "cp", source, dest]) | 71 print str([gsutil_exe, "cp", source, dest]) |
| 54 else: | 72 else: |
| 55 subprocess.check_call([gsutil_exe, "cp", source, dest]) | 73 subprocess.check_call([gsutil_exe, "cp", source, dest]) |
| 56 | 74 |
| 75 | |
| 57 def upload_shell(config, dry_run, verbose): | 76 def upload_shell(config, dry_run, verbose): |
| 58 paths = Paths(config) | 77 paths = Paths(config) |
| 59 zipfile_name = target(config) | 78 zipfile_name = target(config) |
| 60 version = Version().version | 79 version = Version().version |
| 61 | 80 |
| 62 # Upload the binary. | 81 # Upload the binary. |
| 63 # TODO(blundell): Change this to be in the same structure as the LATEST files, | 82 # TODO(blundell): Change this to be in the same structure as the LATEST files, |
| 64 # e.g., gs://mojo/shell/linux-x64/<version>/shell.zip. | 83 # e.g., gs://mojo/shell/linux-x64/<version>/shell.zip. |
| 65 dest = "gs://mojo/shell/" + version + "/" + zipfile_name + ".zip" | 84 dest = "gs://mojo/shell/" + version + "/" + zipfile_name + ".zip" |
| 66 with tempfile.NamedTemporaryFile() as zip_file: | 85 with tempfile.NamedTemporaryFile() as zip_file: |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 78 zipinfo.date_time = time.gmtime(os.path.getmtime(shell_path)) | 97 zipinfo.date_time = time.gmtime(os.path.getmtime(shell_path)) |
| 79 if verbose: | 98 if verbose: |
| 80 print "zipping %s" % shell_path | 99 print "zipping %s" % shell_path |
| 81 z.writestr(zipinfo, shell_binary.read()) | 100 z.writestr(zipinfo, shell_binary.read()) |
| 82 upload(config, zip_file.name, dest, dry_run) | 101 upload(config, zip_file.name, dest, dry_run) |
| 83 | 102 |
| 84 # Update the LATEST file to contain the version of the new binary. | 103 # Update the LATEST file to contain the version of the new binary. |
| 85 latest_file = "gs://mojo/shell/%s/LATEST" % target(config) | 104 latest_file = "gs://mojo/shell/%s/LATEST" % target(config) |
| 86 write_file_to_gs(version, latest_file, config, dry_run) | 105 write_file_to_gs(version, latest_file, config, dry_run) |
| 87 | 106 |
| 107 | |
| 88 def upload_app(app_binary_path, config, dry_run): | 108 def upload_app(app_binary_path, config, dry_run): |
| 89 app_binary_name = os.path.basename(app_binary_path) | 109 app_binary_name = os.path.basename(app_binary_path) |
| 90 app_name, _ = os.path.splitext(app_binary_name) | 110 app_name, _ = os.path.splitext(app_binary_name) |
| 91 version = Version().version | 111 version = Version().version |
| 92 app_location_in_gs = ("mojo/services/" + target(config) + "/" + version + | 112 app_location_in_gs = ("mojo/services/" + target(config) + "/" + version + |
| 93 "/" + app_binary_name) | 113 "/" + app_binary_name) |
| 94 gsutil_app_location = "gs://" + app_location_in_gs | 114 gsutil_app_location = "gs://" + app_location_in_gs |
| 95 https_app_location = "https://storage.googleapis.com/" + app_location_in_gs | 115 https_app_location = "https://storage.googleapis.com/" + app_location_in_gs |
| 96 | 116 |
| 97 # Upload the new binary. | 117 # Upload the new binary. |
| 98 upload(config, app_binary_path, gsutil_app_location, dry_run) | 118 upload(config, app_binary_path, gsutil_app_location, dry_run) |
| 99 | 119 |
| 100 # Update the app's location file to point to the new binary. | 120 # Update the app's location file to point to the new binary. |
| 101 app_location_file = ("gs://mojo/services/" + target(config) + "/" + | 121 app_location_file = ("gs://mojo/services/" + target(config) + "/" + |
| 102 app_name + "_location") | 122 app_name + "_location") |
| 103 write_file_to_gs(https_app_location, app_location_file, config, dry_run) | 123 write_file_to_gs(https_app_location, app_location_file, config, dry_run) |
| 104 | 124 |
| 125 | |
| 126 def upload_file(file_path, config, dry_run): | |
| 127 file_binary_name = os.path.basename(file_path) | |
| 128 version = Version().version | |
| 129 file_location_in_gs = ("mojo/services/" + target(config) + "/" + version + | |
| 130 "/" + file_binary_name) | |
| 131 gsutil_file_location = "gs://" + file_location_in_gs | |
|
tonyg
2015/03/05 00:03:23
Would be nice to factor out a helper for building
| |
| 132 | |
| 133 # Upload the new binary. | |
| 134 upload(config, file_path, gsutil_file_location, dry_run) | |
| 135 | |
| 136 | |
| 105 def write_file_to_gs(file_contents, dest, config, dry_run): | 137 def write_file_to_gs(file_contents, dest, config, dry_run): |
| 106 with tempfile.NamedTemporaryFile() as temp_version_file: | 138 with tempfile.NamedTemporaryFile() as temp_version_file: |
| 107 temp_version_file.write(file_contents) | 139 temp_version_file.write(file_contents) |
| 108 temp_version_file.flush() | 140 temp_version_file.flush() |
| 109 upload(config, temp_version_file.name, dest, dry_run) | 141 upload(config, temp_version_file.name, dest, dry_run) |
| 110 | 142 |
| 143 | |
| 111 def main(): | 144 def main(): |
| 112 parser = argparse.ArgumentParser(description="Upload binaries for apps and " | 145 parser = argparse.ArgumentParser(description="Upload binaries for apps and " |
| 113 "the Mojo shell to google storage (by default on Linux, but this can be " | 146 "the Mojo shell to google storage (by default on Linux, but this can be " |
| 114 "changed via options).") | 147 "changed via options).") |
| 115 parser.add_argument("-n", "--dry_run", help="Dry run, do not actually "+ | 148 parser.add_argument("-n", "--dry_run", help="Dry run, do not actually "+ |
| 116 "upload", action="store_true") | 149 "upload", action="store_true") |
| 117 parser.add_argument("-v", "--verbose", help="Verbose mode", | 150 parser.add_argument("-v", "--verbose", help="Verbose mode", |
| 118 action="store_true") | 151 action="store_true") |
| 119 parser.add_argument("--android", | 152 parser.add_argument("--android", |
| 120 action="store_true", | 153 action="store_true", |
| 121 help="Upload the shell and apps for Android") | 154 help="Upload the shell and apps for Android") |
| 122 args = parser.parse_args() | 155 args = parser.parse_args() |
| 123 | 156 |
| 124 target_os = Config.OS_LINUX | 157 target_os = Config.OS_LINUX |
| 125 if args.android: | 158 if args.android: |
| 126 target_os = Config.OS_ANDROID | 159 target_os = Config.OS_ANDROID |
| 127 config = Config(target_os=target_os, is_debug=False) | 160 config = Config(target_os=target_os, is_debug=False) |
| 128 upload_shell(config, args.dry_run, args.verbose) | 161 upload_shell(config, args.dry_run, args.verbose) |
| 129 | 162 |
| 130 apps_to_upload = find_apps_to_upload( | 163 build_directory = gn.BuildDirectoryForConfig(config, Paths(config).src_root) |
| 131 gn.BuildDirectoryForConfig(config, Paths(config).src_root)) | 164 apps_to_upload = find_apps_to_upload(build_directory) |
| 132 for app in apps_to_upload: | 165 for app in apps_to_upload: |
| 133 upload_app(app, config, args.dry_run) | 166 upload_app(app, config, args.dry_run) |
| 134 | 167 |
| 168 files_to_upload = find_whitelisted_files(build_directory) | |
| 169 for file_to_upload in files_to_upload: | |
| 170 upload_file(file_to_upload, config, args.dry_run) | |
| 171 | |
| 135 return 0 | 172 return 0 |
| 136 | 173 |
| 137 if __name__ == "__main__": | 174 if __name__ == "__main__": |
| 138 sys.exit(main()) | 175 sys.exit(main()) |
| OLD | NEW |