From b2e2877d89bb6306c723b1441398da75fb90d206 Mon Sep 17 00:00:00 2001 From: David Rose Date: Tue, 22 Dec 2009 15:02:20 +0000 Subject: [PATCH] allow HostInfo.getPackages() to return all platforms; fix some other package-referencing issues --- direct/src/p3d/HostInfo.py | 12 +++-- direct/src/p3d/Packager.py | 89 ++++++++++++++++++++++++-------------- direct/src/p3d/packp3d.py | 7 +++ 3 files changed, 73 insertions(+), 35 deletions(-) diff --git a/direct/src/p3d/HostInfo.py b/direct/src/p3d/HostInfo.py index 974a3c4913..56b1412adf 100644 --- a/direct/src/p3d/HostInfo.py +++ b/direct/src/p3d/HostInfo.py @@ -351,9 +351,15 @@ class HostInfo: if name and pn != name: continue - package = self.getPackage(pn, version, platform = platform) - if package: - packages.append(package) + if platform is None: + for p2 in platforms: + package = self.getPackage(pn, version, platform = p2) + if package: + packages.append(package) + else: + package = self.getPackage(pn, version, platform = platform) + if package: + packages.append(package) return packages diff --git a/direct/src/p3d/Packager.py b/direct/src/p3d/Packager.py index bbc92109be..60a77c5ac4 100644 --- a/direct/src/p3d/Packager.py +++ b/direct/src/p3d/Packager.py @@ -2310,13 +2310,17 @@ class Packager: package = self.packages.get((packageName, platform or self.platform, version, host), None) if package: return package - + # Look on the searchlist. for dirname in self.installSearch: package = self.__scanPackageDir(dirname, packageName, platform or self.platform, version, host, requires = requires) if not package: package = self.__scanPackageDir(dirname, packageName, platform, version, host, requires = requires) + if package and host and package.host != host: + # Wrong host. + package = None + if package: break @@ -2385,7 +2389,7 @@ class Packager: self.__sortImportPackages(packages) for package in packages: - if package and self.__packageIsValid(package, requires): + if package and self.__packageIsValid(package, requires, platform): return package return None @@ -2404,38 +2408,45 @@ class Packager: if not host.readContentsFile(): if not host.downloadContentsFile(appRunner.http): return None - - package = host.getPackage(packageName, version, platform = platform) - if not package and not version: + + packageInfos = [] + packageInfo = host.getPackage(packageName, version, platform = platform) + if not packageInfo and not version: # No explicit version is specified, first fallback: look # for the compiled-in version. - package = host.getPackage(packageName, PandaSystem.getPackageVersionString(), platform = platform) + packageInfo = host.getPackage(packageName, PandaSystem.getPackageVersionString(), platform = platform) - if not package and not version: + if not packageInfo and not version: # No explicit version is specified, second fallback: get # the highest-numbered version available. - packages = host.getPackages(packageName, platform = platform) - self.__sortPackageInfos(packages) - for p in packages: - if p and self.__packageIsValid(p, requires): - package = p - break - - if not package or not package.importDescFile: - return None + packageInfos = host.getPackages(packageName, platform = platform) + self.__sortPackageInfos(packageInfos) - # Now we've retrieved a PackageInfo. Get the import desc file - # from it. - filename = Filename(host.hostDir, 'imports/' + package.importDescFile.basename) - if not appRunner.freshenFile(host, package.importDescFile, filename): - self.notify.error("Couldn't download import file.") - return None + if packageInfo and not packageInfos: + packageInfos = [packageInfo] - # Now that we have the import desc file, use it to load one of - # our Package objects. - package = self.Package('', self) - if package.readImportDescFile(filename): - return package + for packageInfo in packageInfos: + if not packageInfo or not packageInfo.importDescFile: + continue + + # Now we've retrieved a PackageInfo. Get the import desc file + # from it. + filename = Filename(host.hostDir, 'imports/' + packageInfo.importDescFile.basename) + if not appRunner.freshenFile(host, packageInfo.importDescFile, filename): + self.notify.error("Couldn't download import file.") + continue + + # Now that we have the import desc file, use it to load one of + # our Package objects. + package = self.Package('', self) + if not package.readImportDescFile(filename): + continue + + if self.__packageIsValid(package, requires, platform): + return package + + # Couldn't find a suitable package. + return None def __sortImportPackages(self, packages): """ Given a list of Packages read from *.import.xml filenames, @@ -2491,20 +2502,25 @@ class Packager: return tuple(words) - def __packageIsValid(self, package, requires): + def __packageIsValid(self, package, requires, platform): """ Returns true if the package is valid, meaning it can be imported without conflicts with existing packages already required (such as different versions of panda3d). """ + if package.platform and package.platform != platform: + # Incorrect platform. + return False + if not requires: + # No other restrictions. return True # Really, we only check the panda3d package. The other # packages will list this as a dependency, and this is all # that matters. - panda1 = self.__findPackageInList('panda3d', [package] + package.requires) - panda2 = self.__findPackageInList('panda3d', requires) + panda1 = self.__findPackageInRequires('panda3d', [package] + package.requires) + panda2 = self.__findPackageInRequires('panda3d', requires) if not panda1 or not panda2: return True @@ -2512,13 +2528,22 @@ class Packager: if panda1.version == panda2.version: return True + print 'Rejecting package %s, version "%s": depends on %s, version "%s" instead of version "%s"' % ( + package.packageName, package.version, + panda1.packageName, panda1.version, panda2.version) return False - def __findPackageInList(self, packageName, list): - """ Returns the first package with the indicated name in the list. """ + def __findPackageInRequires(self, packageName, list): + """ Returns the first package with the indicated name in the + list of packages, or in the list of packages required by the + packages in the list. """ + for package in list: if package.packageName == packageName: return package + p2 = self.__findPackageInRequires(packageName, package.requires) + if p2: + return p2 return None diff --git a/direct/src/p3d/packp3d.py b/direct/src/p3d/packp3d.py index c58ddc0b12..5edc5164bc 100755 --- a/direct/src/p3d/packp3d.py +++ b/direct/src/p3d/packp3d.py @@ -191,6 +191,13 @@ def makePackedApp(args): try: packager.setup() packager.beginPackage(appBase, p3dApplication = True) + + # Pre-require panda3d, to give a less-confusing error message + # if one of our requirements pulls in a wrong version of + # panda3d. + if 'panda3d' not in map(lambda t: t[0], requires): + packager.do_require('panda3d') + for name, version, host in requires: packager.do_require(name, version = version, host = host)