Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 #!/usr/bin/env python | |
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 3 # Use of this source code is governed by a BSD-style license that can be | |
| 4 # found in the LICENSE file. | |
| 5 | |
| 6 """Script that reads omahaproxy and gsutil to determine a version of the | |
| 7 sdk_tools bundle to use. | |
| 8 | |
| 9 Please note the differences between this script and update_nacl_manifest.py: | |
| 10 | |
| 11 update_sdktools.py is run by a SDK-team developer to assist in updating to a | |
| 12 new sdk_tools bundle. A file on the developer's hard drive is modified, and | |
| 13 must be checked in for the new sdk_tools bundle to be used. | |
| 14 | |
| 15 update_nacl_manifest.py is customarily run by a cron job, and does not check in | |
| 16 any changes. Instead it modifies the manifest file in commondatastorage.""" | |
| 17 | |
| 18 | |
| 19 import collections | |
| 20 import difflib | |
| 21 import json | |
| 22 from manifest_util import DownloadAndComputeHash | |
| 23 import optparse | |
| 24 import re | |
| 25 import sys | |
| 26 from update_nacl_manifest import RealDelegate | |
|
noelallen1
2013/01/08 23:22:57
optional seperate CL: The name RealDelegate is un
binji
2013/01/09 19:13:25
Added TODO with bug# below.
| |
| 27 import urllib2 | |
| 28 | |
| 29 | |
| 30 SDK_TOOLS_DESCRIPTION_FORMAT = 'Native Client SDK Tools, revision %d' | |
| 31 BUCKET_PATH = 'nativeclient-mirror/nacl/nacl_sdk/' | |
| 32 GS_BUCKET_PATH = 'gs://' + BUCKET_PATH | |
| 33 HTTPS_BUCKET_PATH = 'https://commondatastorage.googleapis.com/' + BUCKET_PATH | |
| 34 | |
| 35 | |
| 36 def GetSdkToolsUrl(revision): | |
| 37 return HTTPS_BUCKET_PATH + 'trunk.%d/sdk_tools.tgz' % revision | |
| 38 | |
| 39 | |
| 40 def GetTrunkRevisions(delegate): | |
| 41 urls = delegate.GsUtil_ls(GS_BUCKET_PATH) | |
| 42 revisions = [] | |
| 43 for url in urls: | |
| 44 m = re.match(GS_BUCKET_PATH + 'trunk\.(\d+)', url) | |
| 45 if m: | |
| 46 revisions.append((int(m.group(1)), url)) | |
| 47 return sorted(revisions) | |
| 48 | |
| 49 | |
| 50 def FindMostRecentSdkTools(delegate): | |
|
noelallen1
2013/01/08 23:22:57
Why is this called MostRecentSdkTools? I don't se
binji
2013/01/09 19:13:25
Done.
| |
| 51 for revision, url in reversed(GetTrunkRevisions(delegate)): | |
| 52 if delegate.GsUtil_ls(url): | |
| 53 return revision, url | |
| 54 return None | |
| 55 | |
| 56 | |
| 57 def JsonLoadFromString(json_string): | |
| 58 if sys.version_info > (2, 7): | |
| 59 return json.loads(json_string, object_pairs_hook=collections.OrderedDict) | |
| 60 else: | |
| 61 return json.loads(json_string) | |
| 62 | |
| 63 | |
| 64 def GetBundleByName(bundles, name): | |
| 65 for bundle in bundles: | |
| 66 if bundle['name'] == name: | |
| 67 return bundle | |
| 68 return None | |
| 69 | |
| 70 | |
| 71 def UpdateSdkToolsBundle(sdk_tools_bundle, revision, url, sha1, size): | |
| 72 sdk_tools_bundle['description'] = SDK_TOOLS_DESCRIPTION_FORMAT % revision | |
| 73 sdk_tools_bundle['revision'] = revision | |
| 74 # Update archive for each OS | |
| 75 for archive in sdk_tools_bundle['archives']: | |
| 76 archive['url'] = url | |
| 77 archive['checksum']['sha1'] = sha1 | |
| 78 archive['size'] = size | |
| 79 | |
| 80 | |
| 81 def UpdateManifest(manifest, revision): | |
| 82 sdk_tools_bundle = GetBundleByName(manifest['bundles'], 'sdk_tools') | |
| 83 url = GetSdkToolsUrl(revision) | |
| 84 sha1, size = DownloadAndComputeHash(urllib2.urlopen(url)) | |
| 85 UpdateSdkToolsBundle(sdk_tools_bundle, revision, url, sha1, size) | |
| 86 | |
| 87 | |
| 88 def UpdateManifestFileToRevision(filename, revision): | |
| 89 with open(filename) as stream: | |
| 90 manifest_string = stream.read() | |
| 91 | |
| 92 manifest = JsonLoadFromString(manifest_string) | |
| 93 UpdateManifest(manifest, revision) | |
| 94 new_manifest_string = json.dumps(manifest, indent=2) | |
| 95 | |
| 96 diff_string = ''.join(difflib.unified_diff(manifest_string.splitlines(1), | |
| 97 new_manifest_string.splitlines(1))) | |
| 98 | |
| 99 print 'diff %s' % filename | |
|
noelallen1
2013/01/08 23:22:57
Did you mean to print this, or is this just diagno
binji
2013/01/09 19:13:25
I think it is useful output, but I can hide it beh
| |
| 100 print diff_string | |
| 101 print | |
| 102 | |
| 103 with open(filename, 'w') as stream: | |
| 104 stream.write(new_manifest_string) | |
| 105 | |
| 106 | |
| 107 def main(args): | |
| 108 parser = optparse.OptionParser() | |
| 109 parser.add_option('-r', '--revision', | |
| 110 help='set revision manually, rather than using the latest version') | |
| 111 options, _ = parser.parse_args(args[1:]) | |
| 112 | |
|
noelallen1
2013/01/08 23:22:57
nit: assert args = 0 instead of silently dropping
binji
2013/01/09 19:13:25
Done.
| |
| 113 delegate = RealDelegate() | |
| 114 if not options.revision: | |
| 115 revision, _ = FindMostRecentSdkTools(delegate) | |
| 116 else: | |
| 117 revision = int(options.revision) | |
| 118 | |
| 119 UpdateManifestFileToRevision('json/naclsdk_manifest0.json', revision) | |
| 120 UpdateManifestFileToRevision('json/naclsdk_manifest2.json', revision) | |
| 121 | |
| 122 | |
| 123 if __name__ == '__main__': | |
| 124 sys.exit(main(sys.argv)) | |
| OLD | NEW |