defer packageDir until it is known

This commit is contained in:
David Rose 2009-12-03 20:49:22 +00:00
parent 8f83de634f
commit 1f4cbbb0e8

View File

@ -58,15 +58,13 @@ class PackageInfo:
self.solo = solo
self.asMirror = asMirror
self.packageDir = Filename(host.hostDir, self.packageName)
if self.packageVersion:
self.packageDir = Filename(self.packageDir, self.packageVersion)
# This will be active while we are in the middle of a download
# cycle.
self.http = None
if self.asMirror:
# The server directory contains the platform name, though
# the client directory doesn't.
if self.platform:
self.packageDir = Filename(self.packageDir, self.platform)
# This will be filled in when the host's contents.xml file is
# read.
self.packageDir = None
# These will be filled in by HostInfo when the package is read
# from contents.xml.
@ -96,6 +94,30 @@ class PackageInfo:
# meaning it's been added to the paths and all.
self.installed = False
def getPackageDir(self):
""" Returns the directory in which this package is installed.
This may not be known until the host's contents.xml file has
been downloaded, which informs us of the host's own install
directory. """
if not self.packageDir:
if not self.host.hasContentsFile:
if not self.host.readContentsFile():
self.host.downloadContentsFile(self.http)
# Derive the packageDir from the hostDir.
self.packageDir = Filename(self.host.hostDir, self.packageName)
if self.packageVersion:
self.packageDir = Filename(self.packageDir, self.packageVersion)
if self.asMirror:
# The server directory contains the platform name, though
# the client directory doesn't.
if self.platform:
self.packageDir = Filename(self.packageDir, self.platform)
return self.packageDir
def getDownloadEffort(self):
""" Returns the relative amount of effort it will take to
download this package. The units are meaningless, except
@ -146,8 +168,8 @@ class PackageInfo:
return True
if not self.hasDescFile:
filename = Filename(self.packageDir, self.descFileBasename)
if self.descFile.quickVerify(self.packageDir, pathname = filename):
filename = Filename(self.getPackageDir(), self.descFileBasename)
if self.descFile.quickVerify(self.getPackageDir(), pathname = filename):
if self.__readDescFile():
# Successfully read. We don't need to call
# checkArchiveStatus again, since readDescFile()
@ -192,7 +214,7 @@ class PackageInfo:
assert token == self.stepComplete
filename = Filename(self.packageDir, self.descFileBasename)
filename = Filename(self.getPackageDir(), self.descFileBasename)
# Now that we've written the desc file, make it read-only.
os.chmod(filename.toOsSpecific(), 0444)
@ -221,7 +243,7 @@ class PackageInfo:
self.hasPackage = True
return True
filename = Filename(self.packageDir, self.descFileBasename)
filename = Filename(self.getPackageDir(), self.descFileBasename)
if not hasattr(PandaModules, 'TiXmlDocument'):
return False
@ -332,12 +354,12 @@ class PackageInfo:
# If the uncompressed archive file is good, that's all we'll
# need to do.
self.uncompressedArchive.actualFile = None
if self.uncompressedArchive.quickVerify(self.packageDir):
if self.uncompressedArchive.quickVerify(self.getPackageDir()):
self.installPlans = [planA]
return
# Maybe the compressed archive file is good.
if self.compressedArchive.quickVerify(self.packageDir):
if self.compressedArchive.quickVerify(self.getPackageDir()):
uncompressSize = self.uncompressedArchive.size
step = self.InstallStep(self.__uncompressArchive, uncompressSize, self.uncompressFactor)
planA = [step] + planA
@ -362,11 +384,11 @@ class PackageInfo:
# Now look for patches. Start with the md5 hash from the
# uncompressedArchive file we have on disk, and see if we can
# find a patch chain from this file to our target.
pathname = Filename(self.packageDir, self.uncompressedArchive.filename)
pathname = Filename(self.getPackageDir(), self.uncompressedArchive.filename)
fileSpec = self.uncompressedArchive.actualFile
if fileSpec is None and pathname.exists():
fileSpec = FileSpec()
fileSpec.fromFile(self.packageDir, self.uncompressedArchive.filename)
fileSpec.fromFile(self.getPackageDir(), self.uncompressedArchive.filename)
plan = None
if fileSpec:
plan = self.__findPatchChain(fileSpec)
@ -410,7 +432,7 @@ class PackageInfo:
# Get a list of all of the files in the directory, so we can
# remove files that don't belong.
contents = self.__scanDirectoryRecursively(self.packageDir)
contents = self.__scanDirectoryRecursively(self.getPackageDir())
self.__removeFileFromList(contents, self.descFileBasename)
self.__removeFileFromList(contents, self.compressedArchive.filename)
if not self.asMirror:
@ -425,25 +447,25 @@ class PackageInfo:
# something (e.g. case insensitivity).
for filename in contents:
print "Removing %s" % (filename)
pathname = Filename(self.packageDir, filename)
pathname = Filename(self.getPackageDir(), filename)
pathname.unlink()
if self.asMirror:
return self.compressedArchive.quickVerify(self.packageDir)
return self.compressedArchive.quickVerify(self.getPackageDir())
allExtractsOk = True
if not self.uncompressedArchive.quickVerify(self.packageDir):
if not self.uncompressedArchive.quickVerify(self.getPackageDir()):
#print "File is incorrect: %s" % (self.uncompressedArchive.filename)
allExtractsOk = False
if allExtractsOk:
# OK, the uncompressed archive is good; that means there
# shouldn't be a compressed archive file here.
pathname = Filename(self.packageDir, self.compressedArchive.filename)
pathname = Filename(self.getPackageDir(), self.compressedArchive.filename)
pathname.unlink()
for file in self.extracts:
if not file.quickVerify(self.packageDir):
if not file.quickVerify(self.getPackageDir()):
#print "File is incorrect: %s" % (file.filename)
allExtractsOk = False
break
@ -537,7 +559,7 @@ class PackageInfo:
from direct.p3d.PatchMaker import PatchMaker
patchMaker = PatchMaker(self.packageDir)
patchMaker = PatchMaker(self.getPackageDir())
patchChain = patchMaker.getPatchChainToCurrent(self.descFileBasename, fileSpec)
if patchChain is None:
# No path.
@ -613,7 +635,7 @@ class PackageInfo:
if not filename:
filename = fileSpec.filename
targetPathname = Filename(self.packageDir, filename)
targetPathname = Filename(self.getPackageDir(), filename)
targetPathname.setBinary()
channel = self.http.makeChannel(False)
@ -661,7 +683,7 @@ class PackageInfo:
if not channel.isValid():
print "Failed to download %s" % (url)
elif not fileSpec.fullVerify(self.packageDir, pathname = targetPathname):
elif not fileSpec.fullVerify(self.getPackageDir(), pathname = targetPathname):
print "After downloading, %s incorrect" % (Filename(fileSpec.filename).getBasename())
else:
# Success!
@ -687,8 +709,8 @@ class PackageInfo:
operation. Returns one of stepComplete, stepFailed, or
restartDownload. """
origPathname = Filename(self.packageDir, self.uncompressedArchive.filename)
patchPathname = Filename(self.packageDir, patchfile.file.filename)
origPathname = Filename(self.getPackageDir(), self.uncompressedArchive.filename)
patchPathname = Filename(self.getPackageDir(), patchfile.file.filename)
result = Filename.temporary('', 'patch_')
print "Patching %s with %s" % (origPathname, patchPathname)
@ -721,8 +743,8 @@ class PackageInfo:
archive. Returns one of stepComplete, stepFailed, or
restartDownload. """
sourcePathname = Filename(self.packageDir, self.compressedArchive.filename)
targetPathname = Filename(self.packageDir, self.uncompressedArchive.filename)
sourcePathname = Filename(self.getPackageDir(), self.compressedArchive.filename)
targetPathname = Filename(self.getPackageDir(), self.uncompressedArchive.filename)
targetPathname.unlink()
print "Uncompressing %s to %s" % (sourcePathname, targetPathname)
decompressor = Decompressor()
@ -741,7 +763,7 @@ class PackageInfo:
step.bytesDone = totalBytes
self.__updateStepProgress(step)
if not self.uncompressedArchive.quickVerify(self.packageDir):
if not self.uncompressedArchive.quickVerify(self.getPackageDir()):
print "after uncompressing, %s still incorrect" % (
self.uncompressedArchive.filename)
return self.stepFailed
@ -763,7 +785,7 @@ class PackageInfo:
self.hasPackage = True
return self.stepComplete
mfPathname = Filename(self.packageDir, self.uncompressedArchive.filename)
mfPathname = Filename(self.getPackageDir(), self.uncompressedArchive.filename)
print "Unpacking %s" % (mfPathname)
mf = Multifile()
if not mf.openRead(mfPathname):
@ -779,14 +801,14 @@ class PackageInfo:
allExtractsOk = False
continue
targetPathname = Filename(self.packageDir, file.filename)
targetPathname = Filename(self.getPackageDir(), file.filename)
targetPathname.unlink()
if not mf.extractSubfile(i, targetPathname):
print "Couldn't extract: %s" % (file.filename)
allExtractsOk = False
continue
if not file.quickVerify(self.packageDir):
if not file.quickVerify(self.getPackageDir()):
print "After extracting, still incorrect: %s" % (file.filename)
allExtractsOk = False
continue
@ -814,14 +836,14 @@ class PackageInfo:
return True
assert self not in appRunner.installedPackages
mfPathname = Filename(self.packageDir, self.uncompressedArchive.filename)
mfPathname = Filename(self.getPackageDir(), self.uncompressedArchive.filename)
mf = Multifile()
if not mf.openRead(mfPathname):
print "Couldn't open %s" % (mfPathname)
return False
# We mount it under its actual location on disk.
root = self.packageDir.cStr()
root = self.getPackageDir().cStr()
vfs = VirtualFileSystem.getGlobalPtr()
vfs.mount(mf, root, vfs.MFReadOnly)
@ -830,7 +852,7 @@ class PackageInfo:
# there. We have to take a bit of care to check if it's
# already there, since there can be some ambiguity in
# os-specific path strings.
osRoot = self.packageDir.toOsSpecific()
osRoot = self.getPackageDir().toOsSpecific()
foundOnPath = False
for p in sys.path:
if osRoot == p:
@ -849,7 +871,7 @@ class PackageInfo:
# Put it on the model-path, too. We do this indiscriminantly,
# because the Panda3D runtime won't be adding things to the
# model-path, so it shouldn't be already there.
getModelPath().appendDirectory(self.packageDir)
getModelPath().appendDirectory(self.getPackageDir())
# Set the environment variable to reference the package root.
envvar = '%s_ROOT' % (self.packageName.upper())
@ -857,7 +879,7 @@ class PackageInfo:
# Now that the environment variable is set, read all of the
# prc files in the package.
appRunner.loadMultifilePrcFiles(mf, self.packageDir)
appRunner.loadMultifilePrcFiles(mf, self.getPackageDir())
# Also, find any toplevel Python packages, and add these as
# shared packages. This will allow different packages