| Index: native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
|
| diff --git a/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py b/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
|
| index c5351ff982c4342457232cf402dd86b337db0093..14aac81892fd6186cd852f77983c36b70586ea05 100755
|
| --- a/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
|
| +++ b/native_client_sdk/src/build_tools/sdk_tools/sdk_update_main.py
|
| @@ -35,11 +35,13 @@ this utility can download as as subdirectory into the SDK.
|
|
|
| Commands:
|
| help [command] - Get either general or command-specific help
|
| + info - Displays information about a bundle
|
| list - Lists the available bundles
|
| update/install - Updates/installs bundles in the SDK
|
| sources - Manage external package sources
|
|
|
| Example Usage:
|
| + naclsdk info pepper_canary
|
| naclsdk list
|
| naclsdk update --force pepper_17
|
| naclsdk install recommended
|
| @@ -360,33 +362,111 @@ class SDKConfig(object):
|
| # Commands
|
|
|
|
|
| +def Info(options, argv, config):
|
| + '''Usage: %prof [global_options] info [options] bundle_names...
|
| +
|
| + Displays information about a SDK bundle.'''
|
| +
|
| + DebugPrint("Running List command with: %s, %s" %(options, argv))
|
| +
|
| + parser = optparse.OptionParser(usage=Info.__doc__)
|
| + (info_options, args) = parser.parse_args(argv)
|
| +
|
| + if not args:
|
| + parser.print_help()
|
| + return
|
| +
|
| + manifest = LoadManifestFromURLs([options.manifest_url] + config.GetSources())
|
| + valid_bundles = [bundle.name for bundle in manifest.GetBundles()]
|
| + valid_args = set(args) & set(valid_bundles)
|
| + invalid_args = set(args) - valid_args
|
| + if invalid_args:
|
| + InfoPrint('Unknown bundle(s): %s\n' % (', '.join(invalid_args)))
|
| +
|
| + for bundle_name in args:
|
| + if bundle_name not in valid_args:
|
| + continue
|
| +
|
| + bundle = manifest.GetBundle(bundle_name)
|
| +
|
| + InfoPrint('%s' % bundle.name)
|
| + for key, value in bundle.iteritems():
|
| + if key == manifest_util.ARCHIVES_KEY:
|
| + archive = bundle.GetHostOSArchive()
|
| + InfoPrint(' Archive:')
|
| + for archive_key, archive_value in archive.iteritems():
|
| + InfoPrint(' %s: %s' % (archive_key, archive_value))
|
| + elif key not in (manifest_util.ARCHIVES_KEY, manifest_util.NAME_KEY):
|
| + InfoPrint(' %s: %s' % (key, value))
|
| + InfoPrint('')
|
| +
|
| +
|
| def List(options, argv, config):
|
| - '''Usage: %prog [options] list
|
| + '''Usage: %prog [global_options] list [options]
|
|
|
| Lists the available SDK bundles that are available for download.'''
|
| - def PrintBundles(bundles):
|
| - for bundle in bundles:
|
| - InfoPrint(' %s' % bundle.name)
|
| - for key, value in bundle.iteritems():
|
| - if key not in (manifest_util.ARCHIVES_KEY, manifest_util.NAME_KEY):
|
| - InfoPrint(' %s: %s' % (key, value))
|
| +
|
| + def PrintBundle(local_bundle, bundle, needs_update, display_revisions):
|
| + installed = local_bundle is not None
|
| + # If bundle is None, there is no longer a remote bundle with this name.
|
| + if bundle is None:
|
| + bundle = local_bundle
|
| +
|
| + if display_revisions:
|
| + if needs_update:
|
| + revision = ' (r%s -> r%s)' % (local_bundle.revision, bundle.revision)
|
| + else:
|
| + revision = ' (r%s)' % (bundle.revision,)
|
| + else:
|
| + revision = ''
|
| +
|
| + InfoPrint(' %s%s %s (%s)%s' % (
|
| + 'I' if installed else ' ',
|
| + '*' if needs_update else ' ',
|
| + bundle.name,
|
| + bundle.stability,
|
| + revision))
|
| +
|
|
|
| DebugPrint("Running List command with: %s, %s" %(options, argv))
|
|
|
| parser = optparse.OptionParser(usage=List.__doc__)
|
| + parser.add_option(
|
| + '-r', '--revision', dest='revision',
|
| + default=False, action='store_true',
|
| + help='display revision numbers')
|
| (list_options, args) = parser.parse_args(argv)
|
| +
|
| manifest = LoadManifestFromURLs([options.manifest_url] + config.GetSources())
|
| - InfoPrint('Available bundles:')
|
| - PrintBundles(manifest.GetBundles())
|
| - # Print the local information.
|
| manifest_path = os.path.join(options.user_data_dir, options.manifest_filename)
|
| local_manifest = LoadFromFile(manifest_path, manifest_util.SDKManifest())
|
| - InfoPrint('\nCurrently installed bundles:')
|
| - PrintBundles(local_manifest.GetBundles())
|
| +
|
| + any_bundles_need_update = False
|
| + InfoPrint('Bundles:')
|
| + InfoPrint(' I: installed\n *: update available\n')
|
| + for bundle in manifest.GetBundles():
|
| + local_bundle = local_manifest.GetBundle(bundle.name)
|
| + installed = local_bundle is not None
|
| + needs_update = local_bundle and local_manifest.BundleNeedsUpdate(bundle)
|
| + if needs_update:
|
| + any_bundles_need_update = True
|
| +
|
| + PrintBundle(local_bundle, bundle, needs_update, list_options.revision)
|
| +
|
| + if not any_bundles_need_update:
|
| + InfoPrint('\nAll installed bundles are up-to-date.')
|
| +
|
| + local_only_bundles = set([b.name for b in local_manifest.GetBundles()])
|
| + local_only_bundles -= set([b.name for b in manifest.GetBundles()])
|
| + if local_only_bundles:
|
| + InfoPrint('\nBundles installed locally that are not available remotely:')
|
| + for bundle_name in local_only_bundles:
|
| + local_bundle = local_manifest.GetBundle(bundle_name)
|
| + PrintBundle(local_bundle, None, False, list_options.revision)
|
|
|
|
|
| def Update(options, argv, config):
|
| - '''Usage: %prog [options] update [target]
|
| + '''Usage: %prog [global_options] update [options] [target]
|
|
|
| Updates the Native Client SDK to a specified version. By default, this
|
| command updates all the recommended components. The update process works
|
| @@ -498,7 +578,7 @@ def Update(options, argv, config):
|
| InfoPrint('%s is already up-to-date.' % bundle.name)
|
|
|
| def Sources(options, argv, config):
|
| - '''Usage: %prog [options] sources [--list,--add URL,--remove URL]
|
| + '''Usage: %prog [global_options] sources [options] [--list,--add URL,--remove URL]
|
|
|
| Manage additional package sources. URL should point to a valid package
|
| manifest file for download.
|
| @@ -545,9 +625,13 @@ def Sources(options, argv, config):
|
|
|
| def main(argv):
|
| '''Main entry for the sdk_update utility'''
|
| - parser = optparse.OptionParser(usage=GLOBAL_HELP)
|
| + parser = optparse.OptionParser(usage=GLOBAL_HELP, add_help_option=False)
|
| DEFAULT_SDK_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
| + # Manually add help options so we can ignore it when auto-updating.
|
| + parser.add_option(
|
| + '-h', '--help', dest='help', action='store_true',
|
| + help='show this help message and exit')
|
| parser.add_option(
|
| '-U', '--manifest-url', dest='manifest_url',
|
| default='https://commondatastorage.googleapis.com/nativeclient-mirror/'
|
| @@ -590,6 +674,7 @@ def main(argv):
|
|
|
|
|
| COMMANDS = {
|
| + 'info': Info,
|
| 'list': List,
|
| 'update': Update,
|
| 'install': Update,
|
| @@ -633,6 +718,9 @@ def main(argv):
|
| print "Need to supply a command"
|
| PrintHelpAndExit()
|
|
|
| + if options.help:
|
| + PrintHelpAndExit()
|
| +
|
| def DefaultHandler(unused_options=None, unused_args=None, unused_config=None):
|
| print "Unknown Command: %s" % args[0]
|
| PrintHelpAndExit()
|
|
|