def main(ctrl, opts, reloadchannels=True): if reloadchannels: ctrl.reloadChannels() cache = ctrl.getCache() if not opts.args: packages = cache.getPackages()[:] else: packages = {} for arg in opts.args: ratio, results, suggestions = ctrl.search(arg, addprovides=False) if not results: if suggestions: dct = {} for r, obj in suggestions: if isinstance(obj, Package): dct[obj] = True else: dct.update(dct.fromkeys(obj.packages, True)) raise Error, _("'%s' matches no packages. " "Suggestions:\n%s") % \ (arg, "\n".join([" "+str(x) for x in dct])) else: raise Error, _("'%s' matches no packages") % arg else: for obj in results: if isinstance(obj, Package): packages[obj] = True else: packages.update(dict.fromkeys(obj.packages, True)) packages = packages.keys() if opts.installed: packages = [pkg for pkg in packages if pkg.installed] whoprovides = [] for name in opts.provides: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for prv in cache.getProvides(): if p.match(prv.name): whoprovides.append(Provides(prv.name, version)) else: whoprovides.append(Provides(name, version)) whorequires = [] for name in opts.requires: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for req in cache.getRequires(): if p.match(req.name): whorequires.append(Provides(req.name, version)) else: whorequires.append(Provides(name, version)) whoupgrades = [] for name in opts.upgrades: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for upg in cache.getUpgrades(): if p.match(upg.name): whoupgrades.append(Provides(upg.name, version)) else: whoupgrades.append(Provides(name, version)) whoconflicts = [] for name in opts.conflicts: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for cnf in cache.getConflicts(): if p.match(cnf.name): whoconflicts.append(Provides(cnf.name, version)) else: whoconflicts.append(Provides(name, version)) if whoprovides or whorequires or whoupgrades or whoconflicts: newpackages = {} for whoprv in whoprovides: for prv in cache.getProvides(whoprv.name): if not whoprv.version or prv.name == prv.version: for pkg in prv.packages: if pkg in packages: newpackages[pkg] = True for whoreq in whorequires: for req in cache.getRequires(whoreq.name): if req.matches(whoreq): for pkg in req.packages: if pkg in packages: newpackages[pkg] = True for whoupg in whoupgrades: for upg in cache.getUpgrades(whoupg.name): if upg.matches(whoupg): for pkg in upg.packages: if pkg in packages: newpackages[pkg] = True for whocnf in whoconflicts: for cnf in cache.getConflicts(whocnf.name): if cnf.matches(whocnf): for pkg in cnf.packages: if pkg in packages: newpackages[pkg] = True packages = newpackages.keys() hasname = [] for token in opts.name: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hasname.append(re.compile(token, re.I)) hassummary = [] for token in opts.summary: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hassummary.append(re.compile(token, re.I)) hasdescription = [] for token in opts.description: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hasdescription.append(re.compile(token, re.I)) haspath = [] for token in opts.path: token = fnmatch.translate(token).replace(r"\ ", " ") haspath.append(re.compile(token, re.I)) hasurl = [] for token in opts.url: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") hasurl.append(re.compile(token, re.I)) if hasname or hassummary or hasdescription or haspath: newpackages = {} needsinfo = hassummary or hasdescription or haspath or hasurl for pkg in cache.getPackages(): if hasname: for pattern in hasname: if pattern.search(pkg.name): newpackages[pkg] = True if needsinfo: info = pkg.loaders.keys()[0].getInfo(pkg) if hassummary: for pattern in hassummary: if pattern.search(info.getSummary()): newpackages[pkg] = True if hasdescription: for pattern in hasdescription: if pattern.search(info.getDescription()): newpackages[pkg] = True if haspath: for pattern in haspath: for path in info.getPathList(): if pattern.match(path): newpackages[pkg] = True if hasurl: for pattern in hasurl: for url in info.getReferenceURLs(): if pattern.match(url): newpackages[pkg] = True packages = newpackages.keys() format = opts.format.lower() + "output" for attr, value in globals().items(): if attr.lower() == format: output = value(opts) break else: raise Error, "Output format unknown" output.startGrabOutput() output.start() packages.sort() for pkg in packages: output.showPackage(pkg) if pkg.provides and (opts.show_provides or whoprovides): pkg.provides.sort() first = True for prv in pkg.provides: if whoprovides: for whoprv in whoprovides: if (prv.name == whoprv.name and (not whoprv.version or prv.version == whoprv.version)): break else: continue output.showProvides(pkg, prv) if opts.show_requiredby and prv.requiredby: for req in prv.requiredby: req.packages.sort() for reqpkg in req.packages: if opts.installed and not reqpkg.installed: continue output.showRequiredBy(pkg, prv, req, reqpkg) if opts.show_upgradedby and prv.upgradedby: for upg in prv.upgradedby: upg.packages.sort() for upgpkg in upg.packages: if opts.installed and not upgpkg.installed: continue output.showUpgradedBy(pkg, prv, upg, upgpkg) if opts.show_conflictedby and prv.conflictedby: for cnf in prv.conflictedby: cnf.packages.sort() for cnfpkg in cnf.packages: if cnfpkg is pkg: continue if opts.installed and not cnfpkg.installed: continue output.showConflictedBy(pkg, prv, cnf, cnfpkg) if pkg.requires and (opts.show_requires or opts.show_prerequires): pkg.requires.sort() first = True for req in pkg.requires: if opts.show_prerequires and not isinstance(req, PreRequires): continue if whorequires: matchnames = req.getMatchNames() for whoreq in whorequires: if whoreq.name in matchnames and req.matches(whoreq): break else: continue output.showRequires(pkg, req) if opts.show_providedby and req.providedby: for prv in req.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showRequiresProvidedBy( pkg, req, prv, prvpkg) if pkg.upgrades and opts.show_upgrades: pkg.upgrades.sort() first = True for upg in pkg.upgrades: if whoupgrades: matchnames = upg.getMatchNames() for whoupg in whoupgrades: if whoupg.name in matchnames and upg.matches(whoupg): break else: continue output.showUpgrades(pkg, upg) if opts.show_providedby and upg.providedby: for prv in upg.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showUpgradesProvidedBy( pkg, upg, prv, prvpkg) if pkg.conflicts and opts.show_conflicts: pkg.conflicts.sort() first = True for cnf in pkg.conflicts: if whoconflicts: matchnames = cnf.getMatchNames() for whocnf in whoconflicts: if whocnf.name in matchnames and cnf.matches(whocnf): break else: continue output.showConflicts(pkg, cnf) if opts.show_providedby and cnf.providedby: for prv in cnf.providedby: prv.packages.sort() for prvpkg in prv.packages: if prvpkg is pkg: continue if opts.installed and not prvpkg.installed: continue output.showConflictsProvidedBy( pkg, upg, prv, prvpkg) output.end() output.stopGrabOutput()
def main(ctrl, opts, reloadchannels=True): if sysconf.get("auto-update"): from smart.commands import update updateopts = update.parse_options([]) update.main(ctrl, updateopts) else: if reloadchannels: ctrl.reloadChannels() cache = ctrl.getCache() if not opts.args: packages = cache.getPackages()[:] else: packages = {} for arg in opts.args: ratio, results, suggestions = ctrl.search(arg, addprovides=False) if not results: if suggestions: dct = {} for r, obj in suggestions: if isinstance(obj, Package): dct[obj] = True else: dct.update(dct.fromkeys(obj.packages, True)) raise Error, _("'%s' matches no packages. " "Suggestions:\n%s") % \ (arg, "\n".join([" "+str(x) for x in dct])) else: raise Error, _("'%s' matches no packages") % arg else: for obj in results: if isinstance(obj, Package): packages[obj] = True else: packages.update(dict.fromkeys(obj.packages, True)) packages = packages.keys() if opts.installed or opts.dupes or opts.leaves or opts.orphans: packages = [pkg for pkg in packages if pkg.installed] if opts.dupes: dupes = [] for pkg in packages: dupe = False for prv in cache.getProvides(pkg.name): for prvpkg in prv.packages: if prvpkg == pkg: continue if prvpkg.installed: dupe = True if dupe: dupes.append(pkg) packages = dupes if opts.leaves: leaves = [] for pkg in packages: leaf = True for prv in pkg.provides: for req in prv.requiredby: for reqpkg in req.packages: if reqpkg.installed: leaf = False if leaf: leaves.append(pkg) packages = leaves if opts.orphans: orphans = [] for pkg in packages: orphan = True for loader in pkg.loaders: if not loader.getInstalled(): orphan = False if orphan: orphans.append(pkg) packages = orphans if opts.newest: newest = {} for pkg in packages: if pkg.name in newest: if pkg > newest[pkg.name]: newest[pkg.name] = pkg else: newest[pkg.name] = pkg packages = [pkg for pkg in packages if pkg == newest[pkg.name]] whoprovides = [] for name in opts.provides: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for prv in cache.getProvides(): if p.match(prv.name): whoprovides.append(Provides(prv.name, version)) else: whoprovides.append(Provides(name, version)) whorequires = [] for name in opts.requires: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for req in cache.getRequires(): if p.match(req.name): whorequires.append(Provides(req.name, version)) else: whorequires.append(Provides(name, version)) whoupgrades = [] for name in opts.upgrades: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for upg in cache.getUpgrades(): if p.match(upg.name): whoupgrades.append(Provides(upg.name, version)) else: whoupgrades.append(Provides(name, version)) whoconflicts = [] for name in opts.conflicts: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for cnf in cache.getConflicts(): if p.match(cnf.name): whoconflicts.append(Provides(cnf.name, version)) else: whoconflicts.append(Provides(name, version)) if whoprovides or whorequires or whoupgrades or whoconflicts: newpackages = {} for whoprv in whoprovides: for prv in cache.getProvides(whoprv.name): if not whoprv.version or prv.name == prv.version: for pkg in prv.packages: if pkg in packages: newpackages[pkg] = True for whoreq in whorequires: for req in cache.getRequires(whoreq.name): if req.matches(whoreq): for pkg in req.packages: if pkg in packages: newpackages[pkg] = True for whoupg in whoupgrades: for upg in cache.getUpgrades(whoupg.name): if upg.matches(whoupg): for pkg in upg.packages: if pkg in packages: newpackages[pkg] = True for whocnf in whoconflicts: for cnf in cache.getConflicts(whocnf.name): if cnf.matches(whocnf): for pkg in cnf.packages: if pkg in packages: newpackages[pkg] = True packages = newpackages.keys() def sh2re(pattern, stripeol=True, joinspace=True): """ Convert the shell-style pattern to a regular expression. """ pattern = fnmatch.translate(pattern) if stripeol: if pattern.endswith("$"): pattern = pattern[:-1] elif pattern.endswith('\Z(?ms)'): pattern = pattern[:-7] pattern = pattern.replace(r"\ ", " ") if joinspace: pattern = r"\s+".join(pattern.split()) return re.compile(pattern, re.I) hasname = [] for token in opts.name: hasname.append(sh2re(token)) hasgroup = [] for token in opts.group: hasgroup.append(sh2re(token)) haschannel = [] for token in opts.channel: haschannel.append(token) hasflag = [] for token in opts.flag: hasflag.append(token) hassummary = [] for token in opts.summary: hassummary.append(sh2re(token)) hasdescription = [] for token in opts.description: hasdescription.append(sh2re(token)) haspath = [] for token in opts.path: haspath.append(sh2re(token, stripeol=False, joinspace=False)) hasurl = [] for token in opts.url: haspath.append(sh2re(token, joinspace=False)) if hasname or hasgroup or hassummary or hasdescription or haspath or hasurl: newpackages = {} needsinfo = hasgroup or hassummary or hasdescription or haspath or hasurl for pkg in cache.getPackages(): if hasname: for pattern in hasname: if pattern.search(pkg.name): newpackages[pkg] = True if needsinfo: info = pkg.loaders.keys()[0].getInfo(pkg) if hasgroup: for pattern in hasgroup: if pattern.search(info.getGroup()): newpackages[pkg] = True if hassummary: for pattern in hassummary: if pattern.search(info.getSummary()): newpackages[pkg] = True if hasdescription: for pattern in hasdescription: if pattern.search(info.getDescription()): newpackages[pkg] = True if haspath: for pattern in haspath: for path in info.getPathList(): if pattern.match(path): newpackages[pkg] = True if hasurl: for pattern in hasurl: for url in info.getReferenceURLs(): if pattern.match(url): newpackages[pkg] = True if hasflag and not (hasname or needsinfo): for flag in hasflag: if pkgconf.testFlag(flag, pkg): newpackages[pkg] = True elif hasflag and pkg in newpackages: for flag in hasflag: if not pkgconf.testFlag(flag, pkg): del newpackages[pkg] break packages = newpackages.keys() if haschannel: newpackages = {} for pkg in packages: for loader in pkg.loaders: alias = loader.getChannel().getAlias() if alias in haschannel: newpackages[pkg] = True packages = newpackages.keys() if hasflag: newpackages = {} for pkg in packages: for flag in hasflag: if pkgconf.testFlag(flag, pkg): newpackages[pkg] = True packages = newpackages.keys() format = opts.format.lower()+"output" for attr, value in globals().items(): if attr.lower() == format: output = value(opts) break else: raise Error, "Output format unknown" output.setPackageCount(len(packages)) output.startGrabOutput() output.start() packages.sort() for pkg in packages: output.showPackage(pkg) if pkg.provides and (opts.show_provides or whoprovides): pkg.provides.sort() first = True for prv in pkg.provides: if whoprovides: for whoprv in whoprovides: if (prv.name == whoprv.name and (not whoprv.version or prv.version == whoprv.version)): break else: continue output.showProvides(pkg, prv) if opts.show_requiredby and prv.requiredby: for req in prv.requiredby: req.packages.sort() for reqpkg in req.packages: if opts.installed and not reqpkg.installed: continue output.showRequiredBy(pkg, prv, req, reqpkg) if opts.show_upgradedby and prv.upgradedby: for upg in prv.upgradedby: upg.packages.sort() for upgpkg in upg.packages: if opts.installed and not upgpkg.installed: continue output.showUpgradedBy(pkg, prv, upg, upgpkg) if opts.show_conflictedby and prv.conflictedby: for cnf in prv.conflictedby: cnf.packages.sort() for cnfpkg in cnf.packages: if cnfpkg is pkg: continue if opts.installed and not cnfpkg.installed: continue output.showConflictedBy(pkg, prv, cnf, cnfpkg) if pkg.requires and (opts.show_requires or opts.show_prerequires or whorequires): pkg.requires.sort() first = True for req in pkg.requires: if opts.show_prerequires and not isinstance(req, PreRequires): continue if whorequires: matchnames = req.getMatchNames() for whoreq in whorequires: if whoreq.name in matchnames and req.matches(whoreq): break else: continue output.showRequires(pkg, req) if opts.show_providedby and req.providedby: for prv in req.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showRequiresProvidedBy(pkg, req, prv, prvpkg) if pkg.recommends and (opts.show_recommends): pkg.recommends.sort() first = True for req in pkg.recommends: output.showRecommends(pkg, req) if opts.show_providedby and req.providedby: for prv in req.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showRecommendsProvidedBy(pkg, req, prv, prvpkg) if pkg.upgrades and (opts.show_upgrades or whoupgrades): pkg.upgrades.sort() first = True for upg in pkg.upgrades: if whoupgrades: matchnames = upg.getMatchNames() for whoupg in whoupgrades: if whoupg.name in matchnames and upg.matches(whoupg): break else: continue output.showUpgrades(pkg, upg) if opts.show_providedby and upg.providedby: for prv in upg.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showUpgradesProvidedBy(pkg, upg, prv, prvpkg) if pkg.conflicts and (opts.show_conflicts or whoconflicts): pkg.conflicts.sort() first = True for cnf in pkg.conflicts: if whoconflicts: matchnames = cnf.getMatchNames() for whocnf in whoconflicts: if whocnf.name in matchnames and cnf.matches(whocnf): break else: continue output.showConflicts(pkg, cnf) if opts.show_providedby and cnf.providedby: for prv in cnf.providedby: prv.packages.sort() for prvpkg in prv.packages: if prvpkg is pkg: continue if opts.installed and not prvpkg.installed: continue output.showConflictsProvidedBy(pkg, upg, prv, prvpkg) output.end() output.stopGrabOutput()
def main(ctrl, opts, reloadchannels=True): if reloadchannels: ctrl.reloadChannels() cache = ctrl.getCache() if not opts.args: packages = cache.getPackages()[:] else: packages = {} for arg in opts.args: ratio, results, suggestions = ctrl.search(arg, addprovides=False) if not results: if suggestions: dct = {} for r, obj in suggestions: if isinstance(obj, Package): dct[obj] = True else: dct.update(dct.fromkeys(obj.packages, True)) raise Error, _("'%s' matches no packages. " "Suggestions:\n%s") % \ (arg, "\n".join([" "+str(x) for x in dct])) else: raise Error, _("'%s' matches no packages") % arg else: for obj in results: if isinstance(obj, Package): packages[obj] = True else: packages.update(dict.fromkeys(obj.packages, True)) packages = packages.keys() if opts.installed: packages = [pkg for pkg in packages if pkg.installed] whoprovides = [] for name in opts.provides: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for prv in cache.getProvides(): if p.match(prv.name): whoprovides.append(Provides(prv.name, version)) else: whoprovides.append(Provides(name, version)) whorequires = [] for name in opts.requires: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for req in cache.getRequires(): if p.match(req.name): whorequires.append(Provides(req.name, version)) else: whorequires.append(Provides(name, version)) whoupgrades = [] for name in opts.upgrades: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for upg in cache.getUpgrades(): if p.match(upg.name): whoupgrades.append(Provides(upg.name, version)) else: whoupgrades.append(Provides(name, version)) whoconflicts = [] for name in opts.conflicts: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for cnf in cache.getConflicts(): if p.match(cnf.name): whoconflicts.append(Provides(cnf.name, version)) else: whoconflicts.append(Provides(name, version)) if whoprovides or whorequires or whoupgrades or whoconflicts: newpackages = {} for whoprv in whoprovides: for prv in cache.getProvides(whoprv.name): if not whoprv.version or prv.name == prv.version: for pkg in prv.packages: if pkg in packages: newpackages[pkg] = True for whoreq in whorequires: for req in cache.getRequires(whoreq.name): if req.matches(whoreq): for pkg in req.packages: if pkg in packages: newpackages[pkg] = True for whoupg in whoupgrades: for upg in cache.getUpgrades(whoupg.name): if upg.matches(whoupg): for pkg in upg.packages: if pkg in packages: newpackages[pkg] = True for whocnf in whoconflicts: for cnf in cache.getConflicts(whocnf.name): if cnf.matches(whocnf): for pkg in cnf.packages: if pkg in packages: newpackages[pkg] = True packages = newpackages.keys() hasname = [] for token in opts.name: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hasname.append(re.compile(token, re.I)) hassummary = [] for token in opts.summary: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hassummary.append(re.compile(token, re.I)) hasdescription = [] for token in opts.description: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") token = r"\s+".join(token.split()) hasdescription.append(re.compile(token, re.I)) haspath = [] for token in opts.path: token = fnmatch.translate(token).replace(r"\ ", " ") haspath.append(re.compile(token, re.I)) hasurl = [] for token in opts.url: token = fnmatch.translate(token)[:-1].replace(r"\ ", " ") hasurl.append(re.compile(token, re.I)) if hasname or hassummary or hasdescription or haspath: newpackages = {} needsinfo = hassummary or hasdescription or haspath or hasurl for pkg in cache.getPackages(): if hasname: for pattern in hasname: if pattern.search(pkg.name): newpackages[pkg] = True if needsinfo: info = pkg.loaders.keys()[0].getInfo(pkg) if hassummary: for pattern in hassummary: if pattern.search(info.getSummary()): newpackages[pkg] = True if hasdescription: for pattern in hasdescription: if pattern.search(info.getDescription()): newpackages[pkg] = True if haspath: for pattern in haspath: for path in info.getPathList(): if pattern.match(path): newpackages[pkg] = True if hasurl: for pattern in hasurl: for url in info.getReferenceURLs(): if pattern.match(url): newpackages[pkg] = True packages = newpackages.keys() format = opts.format.lower()+"output" for attr, value in globals().items(): if attr.lower() == format: output = value(opts) break else: raise Error, "Output format unknown" output.startGrabOutput() output.start() packages.sort() for pkg in packages: output.showPackage(pkg) if pkg.provides and (opts.show_provides or whoprovides): pkg.provides.sort() first = True for prv in pkg.provides: if whoprovides: for whoprv in whoprovides: if (prv.name == whoprv.name and (not whoprv.version or prv.version == whoprv.version)): break else: continue output.showProvides(pkg, prv) if opts.show_requiredby and prv.requiredby: for req in prv.requiredby: req.packages.sort() for reqpkg in req.packages: if opts.installed and not reqpkg.installed: continue output.showRequiredBy(pkg, prv, req, reqpkg) if opts.show_upgradedby and prv.upgradedby: for upg in prv.upgradedby: upg.packages.sort() for upgpkg in upg.packages: if opts.installed and not upgpkg.installed: continue output.showUpgradedBy(pkg, prv, upg, upgpkg) if opts.show_conflictedby and prv.conflictedby: for cnf in prv.conflictedby: cnf.packages.sort() for cnfpkg in cnf.packages: if cnfpkg is pkg: continue if opts.installed and not cnfpkg.installed: continue output.showConflictedBy(pkg, prv, cnf, cnfpkg) if pkg.requires and (opts.show_requires or opts.show_prerequires or whorequires): pkg.requires.sort() first = True for req in pkg.requires: if opts.show_prerequires and not isinstance(req, PreRequires): continue if whorequires: matchnames = req.getMatchNames() for whoreq in whorequires: if whoreq.name in matchnames and req.matches(whoreq): break else: continue output.showRequires(pkg, req) if opts.show_providedby and req.providedby: for prv in req.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showRequiresProvidedBy(pkg, req, prv, prvpkg) if pkg.upgrades and (opts.show_upgrades or whoupgrades): pkg.upgrades.sort() first = True for upg in pkg.upgrades: if whoupgrades: matchnames = upg.getMatchNames() for whoupg in whoupgrades: if whoupg.name in matchnames and upg.matches(whoupg): break else: continue output.showUpgrades(pkg, upg) if opts.show_providedby and upg.providedby: for prv in upg.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showUpgradesProvidedBy(pkg, upg, prv, prvpkg) if pkg.conflicts and (opts.show_conflicts or whoconflicts): pkg.conflicts.sort() first = True for cnf in pkg.conflicts: if whoconflicts: matchnames = cnf.getMatchNames() for whocnf in whoconflicts: if whocnf.name in matchnames and cnf.matches(whocnf): break else: continue output.showConflicts(pkg, cnf) if opts.show_providedby and cnf.providedby: for prv in cnf.providedby: prv.packages.sort() for prvpkg in prv.packages: if prvpkg is pkg: continue if opts.installed and not prvpkg.installed: continue output.showConflictsProvidedBy(pkg, upg, prv, prvpkg) output.end() output.stopGrabOutput()
def main(ctrl, opts, reloadchannels=True): if sysconf.get("auto-update"): from smart.commands import update updateopts = update.parse_options([]) update.main(ctrl, updateopts) else: if reloadchannels: ctrl.reloadChannels() cache = ctrl.getCache() if not opts.args: packages = cache.getPackages()[:] else: packages = {} for arg in opts.args: ratio, results, suggestions = ctrl.search(arg, addprovides=False) if not results: if suggestions: dct = {} for r, obj in suggestions: if isinstance(obj, Package): dct[obj] = True else: dct.update(dct.fromkeys(obj.packages, True)) raise Error, _("'%s' matches no packages. " "Suggestions:\n%s") % \ (arg, "\n".join([" "+str(x) for x in dct])) else: raise Error, _("'%s' matches no packages") % arg else: for obj in results: if isinstance(obj, Package): packages[obj] = True else: packages.update(dict.fromkeys(obj.packages, True)) packages = packages.keys() if opts.installed or opts.dupes or opts.leaves or opts.orphans: packages = [pkg for pkg in packages if pkg.installed] if opts.dupes: dupes = [] for pkg in packages: dupe = False for prv in cache.getProvides(pkg.name): for prvpkg in prv.packages: if prvpkg == pkg: continue if prvpkg.installed: dupe = True if dupe: dupes.append(pkg) packages = dupes if opts.leaves: leaves = [] for pkg in packages: leaf = True for prv in pkg.provides: for req in prv.requiredby: for reqpkg in req.packages: if reqpkg.installed: leaf = False if leaf: leaves.append(pkg) packages = leaves if opts.orphans: orphans = [] for pkg in packages: orphan = True for loader in pkg.loaders: if not loader.getInstalled(): orphan = False if orphan: orphans.append(pkg) packages = orphans if opts.newest: newest = {} for pkg in packages: if pkg.name in newest: if pkg > newest[pkg.name]: newest[pkg.name] = pkg else: newest[pkg.name] = pkg packages = [pkg for pkg in packages if pkg == newest[pkg.name]] whoprovides = [] for name in opts.provides: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for prv in cache.getProvides(): if p.match(prv.name): whoprovides.append(Provides(prv.name, version)) else: whoprovides.append(Provides(name, version)) whorequires = [] for name in opts.requires: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for req in cache.getRequires(): if p.match(req.name): whorequires.append(Provides(req.name, version)) else: whorequires.append(Provides(name, version)) whoupgrades = [] for name in opts.upgrades: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for upg in cache.getUpgrades(): if p.match(upg.name): whoupgrades.append(Provides(upg.name, version)) else: whoupgrades.append(Provides(name, version)) whoconflicts = [] for name in opts.conflicts: if '=' in name: name, version = name.split('=') else: version = None if isGlob(name): p = re.compile(fnmatch.translate(name), re.I) for cnf in cache.getConflicts(): if p.match(cnf.name): whoconflicts.append(Provides(cnf.name, version)) else: whoconflicts.append(Provides(name, version)) if whoprovides or whorequires or whoupgrades or whoconflicts: newpackages = {} for whoprv in whoprovides: for prv in cache.getProvides(whoprv.name): if not whoprv.version or prv.name == prv.version: for pkg in prv.packages: if pkg in packages: newpackages[pkg] = True for whoreq in whorequires: for req in cache.getRequires(whoreq.name): if req.matches(whoreq): for pkg in req.packages: if pkg in packages: newpackages[pkg] = True for whoupg in whoupgrades: for upg in cache.getUpgrades(whoupg.name): if upg.matches(whoupg): for pkg in upg.packages: if pkg in packages: newpackages[pkg] = True for whocnf in whoconflicts: for cnf in cache.getConflicts(whocnf.name): if cnf.matches(whocnf): for pkg in cnf.packages: if pkg in packages: newpackages[pkg] = True packages = newpackages.keys() def sh2re(pattern, stripeol=True, joinspace=True): """ Convert the shell-style pattern to a regular expression. """ pattern = fnmatch.translate(pattern) if stripeol: if pattern.endswith("$"): pattern = pattern[:-1] elif pattern.endswith('\Z(?ms)'): pattern = pattern[:-7] pattern = pattern.replace(r"\ ", " ") if joinspace: pattern = r"\s+".join(pattern.split()) return re.compile(pattern, re.I) hasname = [] for token in opts.name: hasname.append(sh2re(token)) hasgroup = [] for token in opts.group: hasgroup.append(sh2re(token)) haschannel = [] for token in opts.channel: haschannel.append(token) hasflag = [] for token in opts.flag: hasflag.append(token) hassummary = [] for token in opts.summary: hassummary.append(sh2re(token)) hasdescription = [] for token in opts.description: hasdescription.append(sh2re(token)) haspath = [] for token in opts.path: haspath.append(sh2re(token, stripeol=False, joinspace=False)) hasurl = [] for token in opts.url: haspath.append(sh2re(token, joinspace=False)) if hasname or hasgroup or hassummary or hasdescription or haspath or hasurl: newpackages = {} needsinfo = hasgroup or hassummary or hasdescription or haspath or hasurl for pkg in cache.getPackages(): if hasname: for pattern in hasname: if pattern.search(pkg.name): newpackages[pkg] = True if needsinfo: info = pkg.loaders.keys()[0].getInfo(pkg) if hasgroup: for pattern in hasgroup: if pattern.search(info.getGroup()): newpackages[pkg] = True if hassummary: for pattern in hassummary: if pattern.search(info.getSummary()): newpackages[pkg] = True if hasdescription: for pattern in hasdescription: if pattern.search(info.getDescription()): newpackages[pkg] = True if haspath: for pattern in haspath: for path in info.getPathList(): if pattern.match(path): newpackages[pkg] = True if hasurl: for pattern in hasurl: for url in info.getReferenceURLs(): if pattern.match(url): newpackages[pkg] = True if hasflag and not (hasname or needsinfo): for flag in hasflag: if pkgconf.testFlag(flag, pkg): newpackages[pkg] = True elif hasflag and pkg in newpackages: for flag in hasflag: if not pkgconf.testFlag(flag, pkg): del newpackages[pkg] break packages = newpackages.keys() if haschannel: newpackages = {} for pkg in packages: for loader in pkg.loaders: alias = loader.getChannel().getAlias() if alias in haschannel: newpackages[pkg] = True packages = newpackages.keys() if hasflag: newpackages = {} for pkg in packages: for flag in hasflag: if pkgconf.testFlag(flag, pkg): newpackages[pkg] = True packages = newpackages.keys() format = opts.format.lower() + "output" for attr, value in globals().items(): if attr.lower() == format: output = value(opts) break else: raise Error, "Output format unknown" output.setPackageCount(len(packages)) output.startGrabOutput() output.start() packages.sort() for pkg in packages: output.showPackage(pkg) if pkg.provides and (opts.show_provides or whoprovides): pkg.provides.sort() first = True for prv in pkg.provides: if whoprovides: for whoprv in whoprovides: if (prv.name == whoprv.name and (not whoprv.version or prv.version == whoprv.version)): break else: continue output.showProvides(pkg, prv) if opts.show_requiredby and prv.requiredby: for req in prv.requiredby: req.packages.sort() for reqpkg in req.packages: if opts.installed and not reqpkg.installed: continue output.showRequiredBy(pkg, prv, req, reqpkg) if opts.show_upgradedby and prv.upgradedby: for upg in prv.upgradedby: upg.packages.sort() for upgpkg in upg.packages: if opts.installed and not upgpkg.installed: continue output.showUpgradedBy(pkg, prv, upg, upgpkg) if opts.show_conflictedby and prv.conflictedby: for cnf in prv.conflictedby: cnf.packages.sort() for cnfpkg in cnf.packages: if cnfpkg is pkg: continue if opts.installed and not cnfpkg.installed: continue output.showConflictedBy(pkg, prv, cnf, cnfpkg) if pkg.requires and (opts.show_requires or opts.show_prerequires or whorequires): pkg.requires.sort() first = True for req in pkg.requires: if opts.show_prerequires and not isinstance(req, PreRequires): continue if whorequires: matchnames = req.getMatchNames() for whoreq in whorequires: if whoreq.name in matchnames and req.matches(whoreq): break else: continue output.showRequires(pkg, req) if opts.show_providedby and req.providedby: for prv in req.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showRequiresProvidedBy( pkg, req, prv, prvpkg) if pkg.upgrades and (opts.show_upgrades or whoupgrades): pkg.upgrades.sort() first = True for upg in pkg.upgrades: if whoupgrades: matchnames = upg.getMatchNames() for whoupg in whoupgrades: if whoupg.name in matchnames and upg.matches(whoupg): break else: continue output.showUpgrades(pkg, upg) if opts.show_providedby and upg.providedby: for prv in upg.providedby: prv.packages.sort() for prvpkg in prv.packages: if opts.installed and not prvpkg.installed: continue output.showUpgradesProvidedBy( pkg, upg, prv, prvpkg) if pkg.conflicts and (opts.show_conflicts or whoconflicts): pkg.conflicts.sort() first = True for cnf in pkg.conflicts: if whoconflicts: matchnames = cnf.getMatchNames() for whocnf in whoconflicts: if whocnf.name in matchnames and cnf.matches(whocnf): break else: continue output.showConflicts(pkg, cnf) if opts.show_providedby and cnf.providedby: for prv in cnf.providedby: prv.packages.sort() for prvpkg in prv.packages: if prvpkg is pkg: continue if opts.installed and not prvpkg.installed: continue output.showConflictsProvidedBy( pkg, upg, prv, prvpkg) output.end() output.stopGrabOutput()