Ejemplo n.º 1
0
    def _createRepositoryTroveSet(self, repos, g, csTroveSet=None):
        if csTroveSet is None:
            path = []
        else:
            path = [csTroveSet]

        repos = troveset.SearchSourceTroveSet(searchsource.NetworkSearchSource(
            repos, [], self.cfg.flavor),
                                              graph=g)
        path.append(repos)

        return CMLSearchPath(path, graph=g)
Ejemplo n.º 2
0
    def __init__(self, cfg, repos, db, changeSetList=[]):
        self.db = db
        g = ModelGraph()
        self.cfg = cfg

        if changeSetList:
            csTroveSource = trovesource.ChangesetFilesTroveSource(
                self.db, storeDeps=True)
            csTroveSource.addChangeSets(changeSetList)
            csSearchSource = searchsource.SearchSource(csTroveSource,
                                                       self.cfg.flavor)
            csTroveSet = troveset.SearchSourceTroveSet(csSearchSource, graph=g)
        else:
            csTroveSet = None

        reposTroveSet = self._createRepositoryTroveSet(repos,
                                                       g,
                                                       csTroveSet=csTroveSet)
        dbTroveSet = self._createDatabaseTroveSet(db, g, csTroveSet=csTroveSet)

        modelgraph.AbstractModelCompiler.__init__(self, cfg.flavor, repos, g,
                                                  reposTroveSet, dbTroveSet)
Ejemplo n.º 3
0
    def augment(self, model, totalSearchSet, finalTroveSet):
        collections = set()
        for op in model.modelOps:
            if isinstance(op, model.SearchOperation):
                continue

            for troveTup in op:
                name = troveTup[0]
                if (isinstance(op, model.OfferTroveOperation)
                        or trove.troveIsComponent(name)):
                    collections.add(name.split(':')[0])
                elif trove.troveIsGroup(name):
                    collections.add(name)

        # this represents the path from "search" lines
        newSearchPath = []
        rebuildTotalSearchSet = False
        # the "total search" searches the current troveset first, then the
        # search path. we only reset this when an operation changed the
        # working troveset in a way which would affect later operations,
        # after searchTroveSet chagnes
        # changed the current troveset in a way which a

        # finalTroveSet is the current working set of what's been selected
        # so far

        for op in model.modelOps:
            if isinstance(op, model.SearchOperation):
                partialTup = op.item
                if isinstance(partialTup, versions.Label):
                    newSearchTroveSet = troveset.SearchSourceTroveSet(
                        searchsource.NetworkSearchSource(
                            self.repos, [partialTup], self.flavor),
                        graph=self.g)
                    newSearchSet = newSearchTroveSet
                elif partialTup[0] is not None:
                    newSearchSet = self.reposTroveSet.find(partialTup)
                else:
                    assert (0)

                newSearchPath.insert(0, newSearchSet)
                rebuildTotalSearchSet = True
                continue

            searchSpecs = []
            localSpecs = []
            for troveSpec in op:
                if (troveSpec.version is not None
                        and troveSpec.version[0] == '/'):
                    try:
                        verObj = versions.VersionFromString(troveSpec.version)
                        if verObj.isInLocalNamespace():
                            localSpecs.append(troveSpec)
                            continue

                    except (errors.VersionStringError, errors.ParseError):
                        pass

                searchSpecs.append(troveSpec)

            if isinstance(op, model.EraseTroveOperation):
                eraseMatches = self._splitFind(self.EraseFindAction,
                                               finalTroveSet, searchSpecs, op)

                finalTroveSet = finalTroveSet._action(
                    eraseMatches,
                    ActionClass=self.RemoveAction,
                    index=op.getLocation())
                continue

            if isinstance(op, model.IncludeOperation):
                # we need a complete total search set to pass into the sub
                # ops, since they have their compilation deferred
                rebuildTotalSearchSet = True

            if rebuildTotalSearchSet:
                totalSearchSet = self.SearchPathTroveSet(newSearchPath +
                                                         [totalSearchSet],
                                                         graph=self.g)
                newSearchPath = []
                rebuildTotalSearchSet = False

            searchMatches = self._splitFind(self.FindAction, totalSearchSet,
                                            searchSpecs, op)
            localMatches = self._splitFind(self.FindAction, self.dbTroveSet,
                                           localSpecs, op)

            if searchMatches and localMatches:
                matches = searchMatches._action(localMatches,
                                                ActionClass=self.UnionAction,
                                                index=op.getLocation())
            elif searchMatches:
                matches = searchMatches
            else:
                matches = localMatches

            if isinstance(op, model.IncludeOperation):
                assert (not localMatches)
                finalTroveSet = finalTroveSet._action(
                    matches,
                    totalSearchSet,
                    compiler=self,
                    ActionClass=self.IncludeAction,
                    SearchPathClass=self.SearchPathTroveSet)
                totalSearchSet = finalTroveSet.finalSearchSet
                continue
            elif isinstance(op, model.InstallTroveOperation):
                finalTroveSet = finalTroveSet._action(
                    matches,
                    ActionClass=self.UnionAction,
                    index=op.getLocation())
            elif isinstance(op, model.PatchTroveOperation):
                finalTroveSet = finalTroveSet._action(
                    matches,
                    ActionClass=self.PatchAction,
                    index=op.getLocation())
            elif isinstance(op, model.UpdateTroveOperation):
                finalTroveSet = finalTroveSet._action(
                    matches,
                    ActionClass=self.UpdateAction,
                    index=op.getLocation())
            elif isinstance(op, model.OfferTroveOperation):
                finalTroveSet = finalTroveSet._action(
                    matches,
                    ActionClass=self.OptionalAction,
                    index=op.getLocation())
            else:
                assert (0)

            newSearchPath.insert(0, matches)

            for troveSpec in op:
                if troveSpec.name in collections:
                    rebuildTotalSearchSet = True
                    break

        if newSearchPath:
            totalSearchSet = self.SearchPathTroveSet(newSearchPath +
                                                     [totalSearchSet],
                                                     graph=self.g)

        finalTroveSet.searchPath = totalSearchSet

        return finalTroveSet