| #!/usr/bin/env python |
| # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Script that reads omahaproxy and gsutil to determine a version of the |
| sdk_tools bundle to use. |
| |
| Please note the differences between this script and update_nacl_manifest.py: |
| |
| update_sdktools.py is run by a SDK-team developer to assist in updating to a |
| new sdk_tools bundle. A file on the developer's hard drive is modified, and |
| must be checked in for the new sdk_tools bundle to be used. |
| |
| update_nacl_manifest.py is customarily run by a cron job, and does not check in |
| any changes. Instead it modifies the manifest file in cloud storage.""" |
| |
| |
| import argparse |
| import collections |
| import difflib |
| import json |
| import re |
| import sys |
| import urllib2 |
| |
| from manifest_util import DownloadAndComputeHash, DictToJSON |
| from update_nacl_manifest import RealDelegate |
| |
| |
| SDK_TOOLS_DESCRIPTION_FORMAT = 'Native Client SDK Tools, revision %d' |
| BUCKET_PATH = 'nativeclient-mirror/nacl/nacl_sdk/' |
| GS_BUCKET_PATH = 'gs://' + BUCKET_PATH |
| HTTPS_BUCKET_PATH = 'https://storage.googleapis.com/' + BUCKET_PATH |
| |
| |
| def GetSdkToolsUrl(revision): |
| return HTTPS_BUCKET_PATH + 'trunk.%d/sdk_tools.tgz' % revision |
| |
| |
| def GetTrunkRevisions(delegate): |
| urls = delegate.GsUtil_ls(GS_BUCKET_PATH) |
| revisions = [] |
| for url in urls: |
| m = re.match(GS_BUCKET_PATH + 'trunk\.(\d+)', url) |
| if m: |
| revisions.append((int(m.group(1)), url)) |
| return sorted(revisions) |
| |
| |
| def FindMostRecentSdkTools(delegate): |
| for revision, url in reversed(GetTrunkRevisions(delegate)): |
| sdktools_url = url + 'sdk_tools.tgz' |
| if delegate.GsUtil_ls(sdktools_url): |
| return revision, sdktools_url |
| return None |
| |
| |
| def JsonLoadFromString(json_string): |
| if sys.version_info > (2, 7): |
| return json.loads(json_string, object_pairs_hook=collections.OrderedDict) |
| else: |
| return json.loads(json_string) |
| |
| |
| def GetBundleByName(bundles, name): |
| for bundle in bundles: |
| if bundle['name'] == name: |
| return bundle |
| return None |
| |
| |
| def UpdateSdkToolsBundle(sdk_tools_bundle, revision, url, sha1, size): |
| sdk_tools_bundle['description'] = SDK_TOOLS_DESCRIPTION_FORMAT % revision |
| sdk_tools_bundle['revision'] = revision |
| # Update archive for each OS |
| for archive in sdk_tools_bundle['archives']: |
| archive['url'] = url |
| archive['checksum']['sha1'] = sha1 |
| archive['size'] = size |
| |
| |
| def UpdateManifest(manifest, revision): |
| sdk_tools_bundle = GetBundleByName(manifest['bundles'], 'sdk_tools') |
| url = GetSdkToolsUrl(revision) |
| sha1, size = DownloadAndComputeHash(urllib2.urlopen(url)) |
| UpdateSdkToolsBundle(sdk_tools_bundle, revision, url, sha1, size) |
| |
| |
| def UpdateManifestFileToRevision(filename, revision): |
| with open(filename) as stream: |
| manifest_string = stream.read() |
| |
| manifest = JsonLoadFromString(manifest_string) |
| UpdateManifest(manifest, revision) |
| new_manifest_string = DictToJSON(manifest) |
| |
| diff_string = ''.join(difflib.unified_diff(manifest_string.splitlines(1), |
| new_manifest_string.splitlines(1))) |
| |
| print 'diff %s' % filename |
| print diff_string |
| print |
| |
| with open(filename, 'w') as stream: |
| stream.write(new_manifest_string) |
| |
| |
| def main(args): |
| parser = argparse.ArgumentParser(description=__doc__) |
| parser.add_argument('-r', '--revision', |
| help='set revision manually, rather than using the latest version') |
| options = parser.parse_args(args) |
| |
| # TODO(binji): http://crbug.com/169047. Rename RealDelegate to something else. |
| delegate = RealDelegate() |
| if not options.revision: |
| revision, _ = FindMostRecentSdkTools(delegate) |
| else: |
| revision = int(options.revision) |
| |
| UpdateManifestFileToRevision('json/naclsdk_manifest0.json', revision) |
| UpdateManifestFileToRevision('json/naclsdk_manifest2.json', revision) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main(sys.argv[1:])) |