deal better with stale contents.xml file in local directory

This commit is contained in:
David Rose 2010-07-01 17:17:29 +00:00
parent 955b03dff9
commit 79d2e645d8
2 changed files with 21 additions and 9 deletions

View File

@ -802,7 +802,8 @@ class AppRunner(DirectObject):
self.readConfigXml()
def addPackageInfo(self, name, platform, version, hostUrl, hostDir = None):
def addPackageInfo(self, name, platform, version, hostUrl, hostDir = None,
recurse = False):
""" Called by the browser for each one of the "required"
packages that were preloaded before starting the application.
If for some reason the package isn't already downloaded, this
@ -830,6 +831,11 @@ class AppRunner(DirectObject):
platform = None
package = host.getPackage(name, version, platform = platform)
if not package:
if not recurse:
# Maybe the contents.xml file isn't current. Re-fetch it.
if host.redownloadContentsFile(self.http):
return self.addPackageInfo(name, platform, version, hostUrl, hostDir = hostDir, recurse = True)
message = "Couldn't find %s %s on %s" % (name, version, hostUrl)
raise OSError, message

View File

@ -106,10 +106,13 @@ class HostInfo:
# https-protected hostUrl, it will be the cleartext channel.
self.downloadUrlPrefix = self.hostUrlPrefix
def downloadContentsFile(self, http, redownload = False):
def downloadContentsFile(self, http, redownload = False,
hashVal = None):
""" Downloads the contents.xml file for this particular host,
synchronously, and then reads it. Returns true on success,
false on failure. """
false on failure. If hashVal is not None, it should be a
HashVal object, which will be filled with the hash from the
new contents.xml file."""
if self.hasCurrentContentsFile():
# We've already got one.
@ -159,6 +162,8 @@ class HostInfo:
f = open(tempFilename.toOsSpecific(), 'wb')
f.write(rf.getData())
f.close()
if hashVal:
hashVal.hashString(rf.getData())
if not self.readContentsFile(tempFilename, freshDownload = True):
self.notify.warning("Failure reading %s" % (url))
@ -192,14 +197,15 @@ class HostInfo:
# Now download it again.
self.hasContentsFile = False
if not self.downloadContentsFile(http, redownload = True):
hv2 = HashVal()
if not self.downloadContentsFile(http, redownload = True,
hashVal = hv2):
return False
hv2 = HashVal()
filename = Filename(self.hostDir, 'contents.xml')
hv2.hashFile(filename)
if hv1 != hv2:
if hv2 == HashVal():
self.notify.info("%s didn't actually redownload." % (url))
return False
elif hv1 != hv2:
self.notify.info("%s has changed." % (url))
return True
else: