From 168794a0f348bb4d1e29a091bcbd39a220918054 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Thu, 19 Jul 2007 01:09:12 +0000 Subject: Replaced usage of urlopen.read(), which isn't guaranteed to return all of the downloaded bytes, with urlopen.readlines(), which (I believe) does have that guarantee. This should fix the rash of mysteriously-failing prebuilds. In the process, added some better error messaging about whether the local template has the parse error, or the master on the network. Also some reorganization. Reviewed by Tess and Leyla. --- scripts/template_verifier.py | 48 +++++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 18 deletions(-) (limited to 'scripts') diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py index 980ceb8df8..67728d73d8 100755 --- a/scripts/template_verifier.py +++ b/scripts/template_verifier.py @@ -23,35 +23,38 @@ import sys import urllib from indra.ipc import compatibility +from indra.ipc import tokenstream from indra.ipc import llmessage -def die(msg): - print >>sys.stderr, msg - sys.exit(1) - -MESSAGE_TEMPLATE = 'message_template.msg' - -PRODUCTION_ACCEPTABLE = (compatibility.Same, compatibility.Newer) -DEVELOPMENT_ACCEPTABLE = ( - compatibility.Same, compatibility.Newer, - compatibility.Older, compatibility.Mixed) - def getstatusall(command): """ Like commands.getstatusoutput, but returns stdout and stderr separately(to get around "killed by signal 15" getting included as part of the file). Also, works on Windows.""" (input, out, err) = os.popen3(command, 't') - input.close() # send no input to the command + status = input.close() # send no input to the command output = out.read() error = err.read() - out.close() - status = err.close() # the status comes from the *last* pipe you close + status = out.close() + status = err.close() # the status comes from the *last* pipe that is closed return status, output, error def getstatusoutput(command): status, output, error = getstatusall(command) return status, output + +def die(msg): + print >>sys.stderr, msg + sys.exit(1) + +MESSAGE_TEMPLATE = 'message_template.msg' + +PRODUCTION_ACCEPTABLE = (compatibility.Same, compatibility.Newer) +DEVELOPMENT_ACCEPTABLE = ( + compatibility.Same, compatibility.Newer, + compatibility.Older, compatibility.Mixed) + + def compare(base, current, mode): """Compare the current template against the base template using the given 'mode' strictness: @@ -65,9 +68,18 @@ def compare(base, current, mode): Returns a tuple of (bool, Compatibility) Return True if they are compatible in this mode, False if not. """ - base = llmessage.parseTemplateString(base) - current = llmessage.parseTemplateString(current) - + try: + base = llmessage.parseTemplateString(base) + except tokenstream.ParseError, e: + print "Error parsing master message template -- this might be a network problem, try again" + raise e + + try: + current = llmessage.parseTemplateString(current) + except tokenstream.ParseError, e: + print "Error parsing local message template" + raise e + compat = current.compatibleWithBase(base) if mode == 'production': acceptable = PRODUCTION_ACCEPTABLE @@ -126,7 +138,7 @@ http://wiki.secondlife.com/wiki/Template_verifier.py # fetch the master from the url (default or supplied) if master is None: - master = urllib.urlopen(options.master_url).read() + master = ''.join(urllib.urlopen(options.master_url).readlines()) # fetch the template for this build if current is None: -- cgit v1.2.3