Пример #1
0
    def _getPackages(self, script):
        parts = script.parts
        # Generating list of all classes
        allClasses = {}
        for part in parts.values():
            for classId in part.deps:
                allClasses[classId] = True

        # Check for each class which part is using it;
        # create a package for each set of classes which
        # are used by the same combination of parts;
        # track how many parts are using a particular package
        packages = {}
        for classId in allClasses.keys():
            pkgId     = 0

            for part in parts.values():
                if classId in part.deps:
                    pkgId     |= part.bit_mask

            if not packages.has_key(pkgId):
                package            = Package(pkgId)
                packages[pkgId]    = package

            packages[pkgId].classes.append(classId)

        # Which packages does a part use - and vice versa
        for package in packages.values():
            for part in parts.values():
                if package.id & part.bit_mask:
                    #part.packages.append(package.id)
                    part.packages.append(package)
                    #package.parts.append(part.name)
                    package.parts.append(part)
                    
            package.part_count = len(package.parts)

        # Sorting packages of parts
        for part in parts.values():
            #part.packageIdsSorted = self._sortPackages([x.id for x in part.packages], packages)
            ## re-map sorting to part.packages
            #packObjs = []
            #for pkgId in part.packageIdsSorted:
            #    packObjs.append(packages[pkgId])
            #part.packages = packObjs
            self._sortPartPackages(part)

        # Register dependencies between Packages
        for package in packages.values():
            # get all direct deps of this package
            allDeps = set(())
            for classId in package.classes:
                classDeps   = self._depLoader.getCombinedDeps(classId, script.variants)
                loadDeps    = set(x.name for x in classDeps['load'])
                allDeps.update(loadDeps)

            # record the other packages in which these dependencies are located
            for classId in allDeps:
                for otherpackage in packages.values():
                    if otherpackage != package and classId in otherpackage.classes:
                        #print "-- package %s adding dependent package %s" % (package.id, otherpackage.id)
                        package.packageDeps.add(otherpackage)
         
        return packages