Index: native_client_sdk/src/build_tools/update_nacl_manifest.py |
diff --git a/native_client_sdk/src/build_tools/update_nacl_manifest.py b/native_client_sdk/src/build_tools/update_nacl_manifest.py |
index 9f2a09a526ea9263fff48da6e278a4d58a990728..b624e23be46537b073d39693e1f6c48fd1658ab8 100755 |
--- a/native_client_sdk/src/build_tools/update_nacl_manifest.py |
+++ b/native_client_sdk/src/build_tools/update_nacl_manifest.py |
@@ -167,9 +167,10 @@ class Delegate(object): |
class RealDelegate(Delegate): |
- def __init__(self, dryrun=False, gsutil=None): |
+ def __init__(self, dryrun=False, gsutil=None, verbose=False): |
super(RealDelegate, self).__init__() |
self.dryrun = dryrun |
+ self.verbose = verbose |
if gsutil: |
self.gsutil = gsutil |
else: |
@@ -181,7 +182,7 @@ class RealDelegate(Delegate): |
sdk_json_string = sdk_stream.read() |
manifest = manifest_util.SDKManifest() |
- manifest.LoadDataFromString(sdk_json_string) |
+ manifest.LoadDataFromString(sdk_json_string, add_missing_info=True) |
return manifest |
def GetHistory(self): |
@@ -212,6 +213,7 @@ class RealDelegate(Delegate): |
def GsUtil_cp(self, src, dest, stdin=None): |
"""See Delegate.GsUtil_cp""" |
if self.dryrun: |
+ self.Trace("Skipping upload: %s -> %s" % (src, dest)) |
return |
# -p ensures we keep permissions when copying "in-the-cloud". |
@@ -220,6 +222,10 @@ class RealDelegate(Delegate): |
def Print(self, *args): |
sys.stdout.write(' '.join(map(str, args)) + '\n') |
+ def Trace(self, *args): |
+ if self.verbose: |
+ self.Print(*args) |
+ |
def _RunGsUtil(self, stdin, *args): |
"""Run gsutil as a subprocess. |
@@ -230,16 +236,20 @@ class RealDelegate(Delegate): |
Returns: |
The stdout from the process.""" |
cmd = [self.gsutil] + list(args) |
+ self.Trace("Running: %s" % str(cmd)) |
if stdin: |
stdin_pipe = subprocess.PIPE |
else: |
stdin_pipe = None |
- process = subprocess.Popen(cmd, stdin=stdin_pipe, stdout=subprocess.PIPE, |
- stderr=subprocess.PIPE) |
- stdout, stderr = process.communicate(stdin) |
+ try: |
+ process = subprocess.Popen(cmd, stdin=stdin_pipe, stdout=subprocess.PIPE, |
+ stderr=subprocess.PIPE) |
+ stdout, stderr = process.communicate(stdin) |
+ except OSError as e: |
+ raise manifest_util.Error("Unable to run '%s': %s" % (cmd[0], str(e))) |
- if process.returncode != 0: |
+ if process.returncode: |
sys.stderr.write(stderr) |
raise subprocess.CalledProcessError(process.returncode, ' '.join(cmd)) |
return stdout |
@@ -518,6 +528,19 @@ class Updater(object): |
Args: |
manifest: The new manifest to upload. |
""" |
+ if self.delegate.dryrun: |
+ name = MANIFEST_BASENAME + ".new" |
+ self.delegate.Print("Writing new manifest: %s" % name) |
+ with open(name, 'w') as f: |
+ f.write(manifest.GetDataAsString()) |
+ stdout = self.delegate.GsUtil_cat(GS_SDK_MANIFEST) |
+ |
+ online = MANIFEST_BASENAME + ".online" |
+ self.delegate.Print("Writing online manifest: %s" % online) |
+ with open(online, 'w') as f: |
+ f.write(stdout) |
+ os.system('diff -u %s %s' % (online, name)) |
+ |
timestamp_manifest_path = GS_MANIFEST_BACKUP_DIR + \ |
GetTimestampManifestName() |
self.delegate.GsUtil_cp('-', timestamp_manifest_path, |
@@ -597,14 +620,15 @@ class CapturedFile(object): |
def main(args): |
parser = optparse.OptionParser() |
- parser.add_option('--gsutil', help='path to gsutil', dest='gsutil', |
- default=None) |
- parser.add_option('--mailfrom', help='email address of sender', |
- dest='mailfrom', default=None) |
- parser.add_option('--mailto', help='send error mails to...', dest='mailto', |
- default=[], action='append') |
- parser.add_option('--dryrun', help='don\'t upload the manifest.', |
- dest='dryrun', action='store_true', default=False) |
+ parser.add_option('--gsutil', help='path to gsutil.') |
+ parser.add_option('-d', '--debug', help='run in debug mode.', |
+ action='store_true') |
+ parser.add_option('--mailfrom', help='email address of sender.') |
+ parser.add_option('--mailto', help='send error mails to...', action='append') |
+ parser.add_option('-n', '--dryrun', help="don't upload the manifest.", |
+ action='store_true') |
+ parser.add_option('-v', '--verbose', help='print more diagnotic messages.', |
+ action='store_true') |
options, args = parser.parse_args(args[1:]) |
if (options.mailfrom is None) != (not options.mailto): |
@@ -618,18 +642,25 @@ def main(args): |
sys.stderr = CapturedFile(sys.stderr) |
try: |
- delegate = RealDelegate(dryrun=options.dryrun, gsutil=options.gsutil) |
- Run(delegate, ('mac', 'win', 'linux')) |
- except Exception: |
- if options.mailfrom and options.mailto: |
- traceback.print_exc() |
- scriptname = os.path.basename(sys.argv[0]) |
- subject = '[%s] Failed to update manifest' % (scriptname,) |
- text = '%s failed.\n\nSTDERR:\n%s\n' % (scriptname, sys.stderr.getvalue()) |
- SendMail(options.mailfrom, options.mailto, subject, text) |
- sys.exit(1) |
- else: |
+ try: |
+ delegate = RealDelegate(options.dryrun, options.gsutil, options.verbose) |
+ Run(delegate, ('mac', 'win', 'linux')) |
+ except Exception: |
+ if options.mailfrom and options.mailto: |
+ traceback.print_exc() |
+ scriptname = os.path.basename(sys.argv[0]) |
+ subject = '[%s] Failed to update manifest' % (scriptname,) |
+ text = '%s failed.\n\nSTDERR:\n%s\n' % (scriptname, |
+ sys.stderr.getvalue()) |
+ SendMail(options.mailfrom, options.mailto, subject, text) |
+ sys.exit(1) |
+ else: |
+ raise |
+ except manifest_util.Error as e: |
+ if options.debug: |
raise |
+ print e |
+ sys.exit(1) |
if __name__ == '__main__': |