def _addNewFiles(self, cs, trove, pathDict, existingTrove): existingPaths = {} if existingTrove: for pathId, path, fileId, fileVer in existingTrove.iterFileList(): existingPaths[path] = (fileId, pathId, fileVer) self._removeOldPathIds(trove) for path, fileObj in pathDict.iteritems(): if path in existingPaths: oldFileId, pathId, oldFileVer = existingPaths[path] else: pathId = makePathId() oldFileId = oldFileVer = None f = fileObj.get(pathId) f.flags.isSource(set=True) newFileId = f.fileId() if oldFileId == newFileId: newFileVer = oldFileVer else: newFileVer = trove.getVersion() cs.addFile(None, newFileId, f.freeze()) contentType = changeset.ChangedFileTypes.file contents = hasattr(fileObj, 'contents') and fileObj.contents if contents: cs.addFileContents(pathId, newFileId, contentType, contents, cfgFile=f.flags.isConfig()) trove.addFile(pathId, path, newFileVer, newFileId)
def _filterBuildReqsByVersionStr(versionStr, troves): if not versionStr: return troves versionMatches = [] if versionStr.find("@") == -1: if versionStr.find(":") == -1: log.warning("Deprecated buildreq format. Use " " foo=:tag, not foo=tag") versionStr = ":" + versionStr for trove in troves: labels = trove.getVersion().iterLabels() if versionStr[0] == ":": branchTag = versionStr[1:] branchTags = [x.getLabel() for x in labels] if branchTag in branchTags: versionMatches.append(trove) else: # versionStr must begin with an @ branchNames = [] for label in labels: branchNames.append("@%s:%s" % (label.getNamespace(), label.getLabel())) if versionStr in branchNames: versionMatches.append(trove) return versionMatches
def _filterBuildReqsByVersionStr(versionStr, troves): if not versionStr: return troves versionMatches = [] if versionStr.find('@') == -1: if versionStr.find(':') == -1: log.warning('Deprecated buildreq format. Use ' ' foo=:tag, not foo=tag') versionStr = ':' + versionStr for trove in troves: labels = trove.getVersion().iterLabels() if versionStr[0] == ':': branchTag = versionStr[1:] branchTags = [x.getLabel() for x in labels] if branchTag in branchTags: versionMatches.append(trove) else: # versionStr must begin with an @ branchNames = [] for label in labels: branchNames.append( '@%s:%s' % (label.getNamespace(), label.getLabel())) if versionStr in branchNames: versionMatches.append(trove) return versionMatches
def _addNewFiles(self, cs, trove, pathDict, existingTrove): existingPaths = {} if existingTrove: for pathId, path, fileId, fileVer in existingTrove.iterFileList(): existingPaths[path] = (fileId, pathId, fileVer) self._removeOldPathIds(trove) for path, fileObj in pathDict.iteritems(): if path in existingPaths: oldFileId, pathId, oldFileVer = existingPaths[path] else: pathId = makePathId() oldFileId = oldFileVer = None f = fileObj.get(pathId) f.flags.isSource(set = True) newFileId = f.fileId() if oldFileId == newFileId: newFileVer = oldFileVer else: newFileVer = trove.getVersion() cs.addFile(None, newFileId, f.freeze()) contentType = changeset.ChangedFileTypes.file contents = hasattr(fileObj, 'contents') and fileObj.contents if contents: cs.addFileContents(pathId, newFileId, contentType, contents, cfgFile = f.flags.isConfig()) trove.addFile(pathId, path, newFileVer, newFileId)
def getAllLabelsFromTroves(self, troveSpecs): """ Return the set of labels referenced by a number of troves. @param troveTups: List of trovespec tuples to inspect @type troveTups: C{[troveSpecTuple]} @rtype: C{set} """ repos = self._getRepositoryClient() fetchTups = self._findTrovesFlattened(troveSpecs) labels = set() for trove in repos.getTroves(fetchTups, withFiles=False): labels.add(trove.getVersion().trailingLabel()) for subTroveTup in trove.iterTroveList(strongRefs=True, weakRefs=True): labels.add(subTroveTup[1].trailingLabel()) return set(x.asString() for x in labels)
def formatInfo(self, trove): """ returns iterator of format lines about this local trove """ # TODO: it'd be nice if this were set up to do arbitrary # formats... n, v, f = trove.getName(), trove.getVersion(), trove.getFlavor() dcfg = self.dcfg troveSource = dcfg.getTroveSource() sourceName = trove.getSourceName() sourceTrove = None if sourceName: try: sourceVer = v.getSourceVersion() if sourceVer.isOnLocalHost(): sourceVer = sourceVer.parentVersion() sourceTrove = troveSource.getTrove( sourceName, sourceVer, deps.Flavor(), withFiles = False) # FIXME: all trove sources should return TroveMissing # on failed getTrove calls except errors.TroveMissing: pass except errors.InsufficientPermission: pass elif n.endswith(':source'): sourceTrove = trove if trove.getBuildTime(): buildTime = time.strftime("%c", time.localtime(trove.getBuildTime())) else: buildTime = "(unknown)" if trove.getSize() is not None: size = "%s" % trove.getSize() else: size = "(unknown)" yield "%-30s %s" % \ (("Name : %s" % trove.getName(), ("Build time: %s" % buildTime))) if dcfg.fullVersions: yield "Version : %s" %v yield "Label : %s" % v.branch().label().asString() else: yield "%-30s %s" % \ (("Version : %s" % v.trailingRevision().asString()), ("Label : %s" % v.branch().label().asString())) yield '%-30s' % ("Size : %s" % size) if hasattr(troveSource, 'trovesArePinned'): yield "Pinned : %s" % troveSource.trovesArePinned( [ (n, v, f) ])[0] commitTime = v.trailingRevision().timeStamp if commitTime: commitTime = time.strftime("%c", time.localtime(commitTime)) else: commitTime = '(unknown)' if not trove.getBuildTime() or log.getVerbosity() <= log.DEBUG: yield "Committed : " + commitTime yield "%-30s" % ("Flavor : %s" % deps.formatFlavor(f)) if trove.getInstallTime(): yield 'Installed : %s' % (time.strftime("%c", time.localtime(trove.getInstallTime()))) imageGroup = trove.troveInfo.imageGroup() if imageGroup is not None: yield 'Image Group: %s' % bool(imageGroup) for ln in self.formatMetadata(trove): yield ln if sourceTrove: if not n.endswith(':source'): yield 'Source : %s' % trove.getSourceName() cl = sourceTrove.getChangeLog() if cl: yield "Change log: %s (%s)" % (cl.getName(), cl.getContact()) lines = cl.getMessage().split("\n")[:-1] for l in lines: yield " " + l if log.getVerbosity() <= log.DEBUG: yield "%-30s %s" % (("Incomp. : %s" % bool(trove.troveInfo.incomplete())), ("TroveVer : %s" % trove.troveInfo.troveVersion())) yield "%-30s" % (("Clone of : %s" % trove.troveInfo.clonedFrom())) subPackages = set(trove.troveInfo.subPackages()) subPackages.discard(trove.getName()) if subPackages: yield "%-30s" % (("Siblings : %s" % (' '.join(sorted(subPackages))))) yield "%-30s" % (("Conary version : %s" % trove.troveInfo.conaryVersion()))
def formatInfo(self, trove): """ returns iterator of format lines about this local trove """ # TODO: it'd be nice if this were set up to do arbitrary # formats... n, v, f = trove.getName(), trove.getVersion(), trove.getFlavor() dcfg = self.dcfg troveSource = dcfg.getTroveSource() sourceName = trove.getSourceName() sourceTrove = None if sourceName: try: sourceVer = v.getSourceVersion() if sourceVer.isOnLocalHost(): sourceVer = sourceVer.parentVersion() sourceTrove = troveSource.getTrove(sourceName, sourceVer, deps.Flavor(), withFiles=False) # FIXME: all trove sources should return TroveMissing # on failed getTrove calls except errors.TroveMissing: pass except errors.InsufficientPermission: pass elif n.endswith(':source'): sourceTrove = trove if trove.getBuildTime(): buildTime = time.strftime("%c", time.localtime(trove.getBuildTime())) else: buildTime = "(unknown)" if trove.getSize() is not None: size = "%s" % trove.getSize() else: size = "(unknown)" yield "%-30s %s" % \ (("Name : %s" % trove.getName(), ("Build time: %s" % buildTime))) if dcfg.fullVersions: yield "Version : %s" % v yield "Label : %s" % v.branch().label().asString() else: yield "%-30s %s" % \ (("Version : %s" % v.trailingRevision().asString()), ("Label : %s" % v.branch().label().asString())) yield '%-30s' % ("Size : %s" % size) if hasattr(troveSource, 'trovesArePinned'): yield "Pinned : %s" % troveSource.trovesArePinned([(n, v, f) ])[0] yield "%-30s" % ("Flavor : %s" % deps.formatFlavor(f)) if trove.getInstallTime(): yield 'Installed : %s' % (time.strftime( "%c", time.localtime(trove.getInstallTime()))) imageGroup = trove.troveInfo.imageGroup() if imageGroup is not None: yield 'Image Group: %s' % bool(imageGroup) for ln in self.formatMetadata(trove): yield ln if sourceTrove: if not n.endswith(':source'): yield 'Source : %s' % trove.getSourceName() cl = sourceTrove.getChangeLog() if cl: yield "Change log: %s (%s)" % (cl.getName(), cl.getContact()) lines = cl.getMessage().split("\n")[:-1] for l in lines: yield " " + l if log.getVerbosity() <= log.DEBUG: yield "%-30s %s" % ( ("Incomp. : %s" % bool(trove.troveInfo.incomplete())), ("TroveVer : %s" % trove.troveInfo.troveVersion())) yield "%-30s" % (("Clone of : %s" % trove.troveInfo.clonedFrom())) yield "%-30s" % ( ("Conary version : %s" % trove.troveInfo.conaryVersion()))
def addSourceTrovesToGraph(self, sourceTroves): sourceTroves = [ x for x in sourceTroves if not x.isFailed() ] [ self.depGraph.addNode(trove) for trove in sourceTroves ] for trove in sourceTroves: if trove.isPrepOnly(): continue for package in trove.getDerivedPackages(): self.trovesByPackage.setdefault(package, []).append(trove) for trove in sourceTroves: try: if trove.isPrimaryTrove(): self.hasPrimaryTroves = True trove.addBuildRequirements(trove.cfg.defaultBuildReqs) if trove.isPrepOnly(): continue for buildReq in trove.getBuildRequirementSpecs(): self._addReq(trove, buildReq, False) for crossReq in trove.getCrossRequirementSpecs(): self._addReq(trove, crossReq, True) except Exception, err: errMsg = 'Error adding buildreqs to %s: %s: %s' % (trove.getName(), err.__class__.__name__, err) failureReason = failure.LoadFailed(errMsg, traceback.format_exc()) trove.troveFailed(failureReason) # We can't continue the build now raise errors.RmakeError, errMsg, sys.exc_info()[2] # if're loading something that we're also building # then we should make sure that we build the thing with the # loadInstalled line secondly for loadSpec, sourceTup in trove.iterAllLoadedSpecs(): name, label, flavor = loadSpec providingTroves = self.trovesByPackage.get(name, []) for provTrove in providingTroves: if provTrove.getVersion() != sourceTup[1]: continue elif self._flavorsMatch(trove.getFlavor(), provTrove.getFlavor(), flavor, False): # FIXME: we really shouldn't allow loadInstalled # loops to occur. It means that we're building # two recipes that loadInstall each other which # means that we can't even trust the buildReqs # specified for each. self.dependsOn(trove, provTrove, (False, loadSpec)) else: self.rejectDep(trove, provTrove, False) # If we have multiple groups that are building w/ the same # name and version, we send them to be built together. if trove.isGroupRecipe(): name, version = trove.getName(), trove.getVersion() if (name, version) not in self.groupsByNameVersion: self.groupsByNameVersion[name, version] = [] self.groupsByNameVersion[name, version].append(trove) # Troves like groups, redirects, etc, have requirements # that control when they can be built. for sourceTup in trove.getDelayedRequirements(): name, version, flavor = sourceTup package = name.split(':')[0] providingTroves = self.trovesByPackage.get(package, []) for provTrove in providingTroves: if provTrove.getVersion() != sourceTup[1]: continue if (flavor is None or provTrove.getFlavor().toStrongFlavor().satisfies( flavor.toStrongFlavor())): self.dependsOn(trove, provTrove, (False, (name, version, flavor)))