Beispiel #1
0
def main(ctrl, opts):

    # Argument check
    if not opts.args:
        raise Error, _("no package(s) given")

    if opts.attempt:
        sysconf.set("attempt-install", True, soft=True)

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    urls = []
    for arg in opts.args[:]:
        if (os.path.isfile(arg) and '/' in arg or ctrl.checkPackageFile(arg)):
            ctrl.addFileChannel(arg)
            opts.args.remove(arg)
        elif ":/" in arg:
            urls.append(arg)
    if urls:
        succ, fail = ctrl.downloadURLs(urls,
                                       _("packages"),
                                       targetdir=os.getcwd())
        if fail:
            raise Error, _("Failed to download packages:\n") + \
                         "\n".join(["    %s: %s" % (url, fail[url])
                                    for url in fail])
        for url, file in succ.items():
            ctrl.addFileChannel(file)
            opts.args.remove(url)
    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    for channel in ctrl.getFileChannels():
        for loader in channel.getLoaders():
            for pkg in loader.getPackages():
                if pkg.installed:
                    raise Error, _("%s is already installed") % pkg
                trans.enqueue(pkg, INSTALL)

    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        dct[obj] = True
                    else:
                        dct.update(dict.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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            installed = False
            names = {}
            for obj in results:
                for pkg in obj.packages:
                    if pkg.installed:
                        iface.info(
                            _("%s (for %s) is already installed") % (pkg, arg))
                        installed = True
                        break
                    else:
                        pkgs.append(pkg)
                        names[pkg.name] = True
                else:
                    continue
                break
            if installed:
                continue
            if len(names) == 2 and sysconf.get("rpm-strict-multilib"):
                from smart.backends.rpm.rpmver import splitarch
                # two packages with the same version but different arch, pick best
                if splitarch(pkgs[0].version)[0] == splitarch(
                        pkgs[1].version)[0]:
                    pkg = max(pkgs[0], pkgs[1])
                    names.pop(pkg.name)
                    pkgs.remove(pkg)
            if len(names) > 1:
                raise Error, _("There are multiple matches for '%s':\n%s") % \
                              (arg, "\n".join(["    "+str(x) for x in pkgs]))

        if len(pkgs) > 1:
            sortUpgrades(pkgs)

        names = {}
        for pkg in pkgs:
            names.setdefault(pkg.name, []).append(pkg)
        for name in names:
            pkg = names[name][0]
            if pkg.installed:
                iface.info(_("%s is already installed") % pkg)
            else:
                trans.enqueue(pkg, INSTALL)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()
    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, install=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #2
0
def main(ctrl, opts):

    # Argument check
    if not opts.args:
        raise Error, _("no package(s) given")

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyRemove)
    policy = trans.getPolicy()

    if opts.auto:
        rmcs = ctrl.markAndSweep()
        confirm = not opts.yes
        ctrl.commitChangeSet(rmcs, confirm=confirm)
    
    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        if obj.installed:
                            dct[obj] = True
                    else:
                        for pkg in obj.packages:
                            if pkg.installed:
                                dct[pkg] = True
                if not dct:
                    del suggestions[:]
            if suggestions:
                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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            for obj in results:
                for pkg in obj.packages:
                    pkgs.append(pkg)

        found = False
        for pkg in pkgs:
            if pkg.installed:
                found = True
                trans.enqueue(pkg, REMOVE)
            else:
                policy.setLocked(pkg, True)
        if not found:
            iface.warning(_("'%s' matches no installed packages") % arg)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()
    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, remove=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #3
0
def main(ctrl, opts):

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if opts.update:
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()

    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyUpgrade)

    if opts.args:

        for arg in opts.args:

            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            if obj.installed:
                                dct[obj] = True
                        else:
                            for pkg in obj.packages:
                                if pkg.installed:
                                    dct[pkg] = True
                    if not dct:
                        del suggestions[:]
                if suggestions:
                    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

            foundany = False
            foundinstalled = False
            for obj in results:
                if isinstance(obj, Package):
                    if obj.installed:
                        trans.enqueue(obj, UPGRADE)
                        foundinstalled = True
                    foundany = True
            if not foundany:
                for obj in results:
                    if not isinstance(obj, Package):
                        for pkg in obj.packages:
                            if pkg.installed:
                                foundinstalled = True
                                trans.enqueue(pkg, UPGRADE)
                            foundany = True
            if not foundinstalled:
                iface.warning(_("'%s' matches no installed packages") % arg)
    else:
        for pkg in cache.getPackages():
            if pkg.installed:
                trans.enqueue(pkg, UPGRADE)

    iface.showStatus(_("Computing transaction..."))
    trans.run()

    if trans and opts.check or opts.check_update:
        checkfile = os.path.expanduser("~/.smart/upgradecheck")
        if os.path.isfile(checkfile):
            file = open(checkfile)
            checkstate = cPickle.load(file)
            file.close()
        else:
            checkstate = None
        changeset = trans.getChangeSet()
        state = changeset.getPersistentState()
        if opts.check_update:
            dirname = os.path.dirname(checkfile)
            if not os.path.isdir(dirname):
                os.makedirs(dirname)
            file = open(checkfile, "w")
            cPickle.dump(state, file, 2)
            file.close()
        if not state:
            iface.showStatus(_("No interesting upgrades available."))
            return 2
        elif checkstate:
            for entry in state:
                if checkstate.get(entry) != state[entry]:
                    break
            else:
                iface.showStatus(_("There are pending upgrades!"))
                return 1
        iface.showStatus(_("There are new upgrades available!"))
    elif not trans:
        iface.showStatus(_("No interesting upgrades available."))
    else:
        iface.hideStatus()
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, install=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #4
0
def main(ctrl, opts, reloadchannels=True):

    # Argument check
    opts.check_args_of_option("channels", 1)

    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 opts.all:
        relateset = dict.fromkeys(cache.getPackages(), True)
    else:
        relateset = {}
        if opts.available:
            for pkg in cache.getPackages():
                if not pkg.installed:
                    relateset[pkg] = True
                else:
                    for loader in pkg.loaders:
                        if not loader.getInstalled():
                            relateset[pkg] = True
                            break

        if opts.channels:
            aliases = opts.channels.split(",")
            notfound = []
            disabled = []
            channels = sysconf.get("channels", ())
            for alias in aliases:
                if alias not in channels:
                    notfound.append(alias)
                elif channels[alias].get("disabled"):
                    disabled.append(alias)
            if notfound:
                raise Error, _("Channels not found: %s") % ", ".join(notfound)
            elif disabled:
                iface.warning(_("Channels are disabled: %s") % \
                              ", ".join(disabled))
            for pkg in cache.getPackages():
                for loader in pkg.loaders:
                    if loader.getChannel().getAlias() in opts.channels:
                        relateset[pkg] = True
                        break

        if opts.installed or not opts.channels and not opts.available:
            for pkg in cache.getPackages():
                if pkg.installed:
                    relateset[pkg] = True

    if opts.args:
        checkset = {}
        for arg in opts.args:
            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            checkset.update(dct)
    else:
        checkset = relateset

    return not checkPackages(cache, checkset, relateset, report=True)
Beispiel #5
0
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()
Beispiel #6
0
def main(ctrl, opts):

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    if opts.args:
        pkgs = {}
        for arg in opts.args:
            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            pkgs.update(dct)
        pkgs = pkgs.keys()
    else:
        pkgs = cache.getPackages()
    for pkg in pkgs:
        trans.enqueue(pkg, FIX)
    iface.showStatus(_("Computing transaction..."))
    trans.run()
    if not trans:
        iface.showStatus(_("No problems to resolve!"))
    else:
        iface.hideStatus()
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #7
0
def main(ctrl, opts):

    # Argument check
    opts.check_args_of_option("target", 1)
    opts.check_args_of_option("output", 1)
    opts.check_args_of_option("from_urls", -1)
    opts.check_args_of_option("from_metalink", -1)
    if not opts.args and not opts.from_metalink and not opts.from_urls:
        raise Error, _("no package(s) given")

    packages = []
    if opts.args:
        if sysconf.get("auto-update"):
            from smart.commands import update
            updateopts = update.parse_options([])
            update.main(ctrl, updateopts)
        else:
            ctrl.reloadChannels()
        cache = ctrl.getCache()
        packages = {}
        for arg in opts.args:

            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            pkgs = []

            for obj in results:
                if isinstance(obj, Package):
                    pkgs.append(obj)

            if not pkgs:
                installed = False
                names = {}
                for obj in results:
                    for pkg in obj.packages:
                        if pkg.installed:
                            iface.warning(
                                _("%s (for %s) is already installed") %
                                (pkg, arg))
                            installed = True
                            break
                        else:
                            pkgs.append(pkg)
                            names[pkg.name] = True
                    else:
                        continue
                    break
                if installed:
                    continue
                if len(names) > 1:
                    raise Error, _("There are multiple matches for '%s':\n%s") % \
                                  (arg, "\n".join(["    "+str(x) for x in pkgs]))

            if len(pkgs) > 1:
                sortUpgrades(pkgs)

            names = {}
            for pkg in pkgs:
                names.setdefault(pkg.name, []).append(pkg)
            for name in names:
                packages[names[name][0]] = True

        packages = packages.keys()

        if opts.urls:
            ctrl.dumpURLs(packages)
        elif opts.metalink:
            ctrl.dumpMetalink(packages)
        else:
            ctrl.downloadPackages(packages, targetdir=opts.target)
            if opts.pack:
                ctrl.packPackages(packages, targetdir=opts.target, \
                                            outputname=opts.output)

    elif opts.from_urls:
        urls = []
        for arg in opts.from_urls:
            if ":/" in arg:
                urls.append(arg)
            elif os.path.isfile(arg):
                line = open(arg).readline()
                if line.startswith('<?xml'):  # assume XML is metalink
                    ctrl.downloadMetalink(arg,
                                          _("Metalink"),
                                          targetdir=opts.target)
                    continue
                urls.extend([x.strip() for x in open(arg)])
            else:
                raise Error, _("Argument is not a file nor url: %s") % arg
        if urls:
            ctrl.downloadURLs(urls, _("URLs"), targetdir=opts.target)
    elif opts.from_metalink:
        for arg in opts.from_metalink:
            ctrl.downloadMetalink(arg, _("Metalink"), targetdir=opts.target)
Beispiel #8
0
def main(ctrl, opts):

    # Argument check
    opts.check_args_of_option("target", 1)
    opts.check_args_of_option("output", 1)
    opts.check_args_of_option("from_urls", -1)
    opts.check_args_of_option("from_metalink", -1)
    if not opts.args and not opts.from_metalink and not opts.from_urls:
        raise Error, _("no package(s) given")

    packages = []
    if opts.args:
        if sysconf.get("auto-update"):
            from smart.commands import update
            updateopts = update.parse_options([])
            update.main(ctrl, updateopts)
        else:
            ctrl.reloadChannels()
        cache = ctrl.getCache()
        packages = {}
        for arg in opts.args:

            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            pkgs = []

            for obj in results:
                if isinstance(obj, Package):
                    pkgs.append(obj)

            if not pkgs:
                installed = False
                names = {}
                for obj in results:
                    for pkg in obj.packages:
                        if pkg.installed:
                            iface.warning(_("%s (for %s) is already installed")
                                          % (pkg, arg))
                            installed = True
                            break
                        else:
                            pkgs.append(pkg)
                            names[pkg.name] = True
                    else:
                        continue
                    break
                if installed:
                    continue
                if len(names) > 1:
                    raise Error, _("There are multiple matches for '%s':\n%s") % \
                                  (arg, "\n".join(["    "+str(x) for x in pkgs]))

            if len(pkgs) > 1:
                sortUpgrades(pkgs)

            names = {}
            for pkg in pkgs:
                names.setdefault(pkg.name, []).append(pkg)
            for name in names:
                packages[names[name][0]] = True

        packages = packages.keys()

        if opts.urls:
            ctrl.dumpURLs(packages)
        elif opts.metalink:
            ctrl.dumpMetalink(packages)
        else:
            ctrl.downloadPackages(packages, targetdir=opts.target)
            if opts.pack:
                ctrl.packPackages(packages, targetdir=opts.target, \
                                            outputname=opts.output)

    elif opts.from_urls:
        urls = []
        for arg in opts.from_urls:
            if ":/" in arg:
                urls.append(arg)
            elif os.path.isfile(arg):
                line = open(arg).readline()
                if line.startswith('<?xml'): # assume XML is metalink
                    ctrl.downloadMetalink(arg, _("Metalink"), targetdir=opts.target)
                    continue
                urls.extend([x.strip() for x in open(arg)])
            else:
                raise Error, _("Argument is not a file nor url: %s") % arg
        if urls:
            ctrl.downloadURLs(urls, _("URLs"), targetdir=opts.target)
    elif opts.from_metalink:
        for arg in opts.from_metalink:
            ctrl.downloadMetalink(arg, _("Metalink"), targetdir=opts.target)
Beispiel #9
0
def main(ctrl, opts):

    # Argument check
    opts.check_args_of_option("flag", 1)

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if opts.update or sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()

    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyUpgrade)

    if opts.args:

        for arg in opts.args:

            op = UPGRADE
            if arg.startswith('+'):
                arg = arg[1:]
                op = INSTALL
            if arg.startswith('-'):
                arg = arg[1:]
                op = REMOVE

            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            if obj.installed or op == INSTALL:
                                dct[obj] = True
                        else:
                            for pkg in obj.packages:
                                if pkg.installed or op == INSTALL:
                                    dct[pkg] = True
                    if not dct:
                        del suggestions[:]
                if suggestions:
                    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

            foundany = False
            foundinstalled = False
            for obj in results:
                if isinstance(obj, Package):
                    if (obj.installed or op == INSTALL) and (not opts.flag or pkgconf.testFlag(opts.flag, obj)):
                        trans.enqueue(obj, op)
                        foundinstalled = obj.installed
                    foundany = True
            if not foundany:
                for obj in results:
                    if not isinstance(obj, Package):
                        for pkg in obj.packages:
                            if (pkg.installed or op == INSTALL) and (not opts.flag or pkgconf.testFlag(opts.flag, pkg)):
                                foundinstalled = pkg.installed
                                trans.enqueue(pkg, op)
                            foundany = True
            if not foundinstalled and op != INSTALL:
                iface.warning(_("'%s' matches no installed packages") % arg)
    else:
        for pkg in cache.getPackages():
            if pkg.installed and (not opts.flag or pkgconf.testFlag(opts.flag, pkg)):
                trans.enqueue(pkg, UPGRADE)

    iface.showStatus(_("Computing transaction..."))
    trans.run()

    if trans and opts.check or opts.check_update:
        checkfile = os.path.expanduser("~/.smart/upgradecheck")
        if os.path.isfile(checkfile):
            file = open(checkfile)
            checkstate = cPickle.load(file)
            file.close()
        else:
            checkstate = None
        changeset = trans.getChangeSet()
        state = changeset.getPersistentState()
        if opts.check_update:
            dirname = os.path.dirname(checkfile)
            if not os.path.isdir(dirname):
                os.makedirs(dirname)
            file = open(checkfile, "w")
            cPickle.dump(state, file, 2)
            file.close()
        if not state:
            iface.showStatus(_("No interesting upgrades available."))
            return 2
        elif checkstate:
            for entry in state:
                if checkstate.get(entry) != state[entry]:
                    break
            else:
                iface.showStatus(_("There are pending upgrades!"))
                return 1
        iface.showStatus(_("There are new upgrades available!"))
    elif not trans:
        iface.showStatus(_("No interesting upgrades available."))
    else:
        iface.hideStatus()
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, install=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #10
0
def main(ctrl, opts):

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    if opts.args:
        pkgs = {}
        for arg in opts.args:
            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            pkgs.update(dct)
        pkgs = pkgs.keys()
    else:
        pkgs = cache.getPackages()
    for pkg in pkgs:
        trans.enqueue(pkg, FIX)
    iface.showStatus(_("Computing transaction..."))
    trans.run()
    if not trans:
        iface.showStatus(_("No problems to resolve!"))
    else:
        iface.hideStatus()
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #11
0
def main(ctrl, opts):

    # Argument check
    if not opts.args:
        raise Error, _("no package(s) given")

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        if obj.installed:
                            dct[obj] = True
                    else:
                        for pkg in obj.packages:
                            if pkg.installed:
                                dct[pkg] = True
                if not dct:
                    del suggestions[:]
            if suggestions:
                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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            for obj in results:
                for pkg in obj.packages:
                    pkgs.append(pkg)

        found = False
        for pkg in pkgs:
            if pkg.installed:
                found = True
                trans.enqueue(pkg, REINSTALL)
                for loader in pkg.loaders:
                    if not loader.getInstalled():
                        break
                else:
                    raise Error, _("'%s' is not available for "
                                   "reinstallation") % pkg
        if not found:
            iface.warning(_("'%s' matches no installed packages") % arg)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()

    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #12
0
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()
Beispiel #13
0
def main(ctrl, opts):

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyRemove)
    policy = trans.getPolicy()

    if opts.auto:
        rmcs = ctrl.markAndSweep()
        confirm = not opts.yes
        ctrl.commitChangeSet(rmcs, confirm=confirm)

    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        if obj.installed:
                            dct[obj] = True
                    else:
                        for pkg in obj.packages:
                            if pkg.installed:
                                dct[pkg] = True
                if not dct:
                    del suggestions[:]
            if suggestions:
                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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            for obj in results:
                for pkg in obj.packages:
                    pkgs.append(pkg)

        found = False
        for pkg in pkgs:
            if pkg.installed:
                found = True
                trans.enqueue(pkg, REMOVE)
            else:
                policy.setLocked(pkg, True)
        if not found:
            iface.warning(_("'%s' matches no installed packages") % arg)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()
    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, remove=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #14
0
def main(ctrl, opts):
    
    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        if obj.installed:
                            dct[obj] = True
                    else:
                        for pkg in obj.packages:
                            if pkg.installed:
                                dct[pkg] = True
                if not dct:
                    del suggestions[:]
            if suggestions:
                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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            for obj in results:
                for pkg in obj.packages:
                    pkgs.append(pkg)

        found = False
        for pkg in pkgs:
            if pkg.installed:
                found = True
                trans.enqueue(pkg, REINSTALL)
                for loader in pkg.loaders:
                    if not loader.getInstalled():
                        break
                else:
                    raise Error, _("'%s' is not available for "
                                   "reinstallation") % pkg
        if not found:
            iface.warning(_("'%s' matches no installed packages") % arg)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()

    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #15
0
def main(ctrl, opts):
 
    # Argument check
    if not opts.args:
        raise Error, _("no package(s) given")

    if opts.attempt:
	sysconf.set("attempt-install", True, soft=True)

    if opts.explain:
        sysconf.set("explain-changesets", True, soft=True)

    urls = []
    for arg in opts.args[:]:
        if (os.path.isfile(arg) and
            '/' in arg or ctrl.checkPackageFile(arg)):
            ctrl.addFileChannel(arg)
            opts.args.remove(arg)
        elif ":/" in arg:
            urls.append(arg)
    if urls:
        succ, fail = ctrl.downloadURLs(urls, _("packages"),
                                       targetdir=os.getcwd())
        if fail:
            raise Error, _("Failed to download packages:\n") + \
                         "\n".join(["    %s: %s" % (url, fail[url])
                                    for url in fail])
        for url, file in succ.items():
            ctrl.addFileChannel(file)
            opts.args.remove(url)
    if sysconf.get("auto-update"):
        from smart.commands import update
        updateopts = update.parse_options([])
        update.main(ctrl, updateopts)
    else:
        ctrl.reloadChannels()
    cache = ctrl.getCache()
    trans = Transaction(cache, PolicyInstall)
    for channel in ctrl.getFileChannels():
        for loader in channel.getLoaders():
            for pkg in loader.getPackages():
                if pkg.installed:
                    raise Error, _("%s is already installed") % pkg
                trans.enqueue(pkg, INSTALL)


    for arg in opts.args:

        ratio, results, suggestions = ctrl.search(arg)

        if not results:
            if suggestions:
                dct = {}
                for r, obj in suggestions:
                    if isinstance(obj, Package):
                        dct[obj] = True
                    else:
                        dct.update(dict.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

        pkgs = []

        for obj in results:
            if isinstance(obj, Package):
                pkgs.append(obj)

        if not pkgs:
            installed = False
            names = {}
            for obj in results:
                for pkg in obj.packages:
                    if pkg.installed:
                        iface.info(_("%s (for %s) is already installed")
                                      % (pkg, arg))
                        installed = True
                        break
                    else:
                        pkgs.append(pkg)
                        names[pkg.name] = True
                else:
                    continue
                break
            if installed:
                continue
            if len(names) == 2 and sysconf.get("rpm-strict-multilib"):
                from smart.backends.rpm.rpmver import splitarch
                # two packages with the same version but different arch, pick best
                if splitarch(pkgs[0].version)[0] == splitarch(pkgs[1].version)[0]:
                    pkg = max(pkgs[0], pkgs[1])
                    names.pop(pkg.name)
                    pkgs.remove(pkg)
            if len(names) > 1:
                raise Error, _("There are multiple matches for '%s':\n%s") % \
                              (arg, "\n".join(["    "+str(x) for x in pkgs]))

        if len(pkgs) > 1:
            sortUpgrades(pkgs)

        names = {}
        for pkg in pkgs:
            names.setdefault(pkg.name, []).append(pkg)
        for name in names:
            pkg = names[name][0]
            if pkg.installed:
                iface.info(_("%s is already installed") % pkg)
            else:
                trans.enqueue(pkg, INSTALL)

    iface.showStatus(_("Computing transaction..."))
    trans.run()
    iface.hideStatus()
    if trans:
        confirm = not opts.yes
        if opts.urls:
            ctrl.dumpTransactionURLs(trans)
        elif opts.metalink:
            ctrl.dumpTransactionMetalink(trans)
        elif opts.dump:
            ctrl.dumpTransactionPackages(trans, install=True)
        elif opts.download:
            ctrl.downloadTransaction(trans, confirm=confirm)
        elif opts.stepped:
            ctrl.commitTransactionStepped(trans, confirm=confirm)
        else:
            ctrl.commitTransaction(trans, confirm=confirm)
Beispiel #16
0
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 opts.all:
        relateset = dict.fromkeys(cache.getPackages(), True)
    else:
        relateset = {}
        if opts.available:
            for pkg in cache.getPackages():
                if not pkg.installed:
                    relateset[pkg] = True
                else:
                    for loader in pkg.loaders:
                        if not loader.getInstalled():
                            relateset[pkg] = True
                            break

        if opts.channels:
            aliases = opts.channels.split(",")
            notfound = []
            disabled = []
            channels = sysconf.get("channels", ())
            for alias in aliases:
                if alias not in channels:
                    notfound.append(alias)
                elif channels[alias].get("disabled"):
                    disabled.append(alias)
            if notfound:
                raise Error, _("Channels not found: %s") % ", ".join(notfound)
            elif disabled:
                iface.warning(_("Channels are disabled: %s") % \
                              ", ".join(disabled))
            for pkg in cache.getPackages():
                for loader in pkg.loaders:
                    if loader.getChannel().getAlias() in opts.channels:
                        relateset[pkg] = True
                        break

        if opts.installed or not opts.channels and not opts.available:
            for pkg in cache.getPackages():
                if pkg.installed:
                    relateset[pkg] = True

    if opts.args:
        checkset = {}
        for arg in opts.args:
            ratio, results, suggestions = ctrl.search(arg)

            if not results:
                if suggestions:
                    dct = {}
                    for r, obj in suggestions:
                        if isinstance(obj, Package):
                            dct[obj] = True
                        else:
                            dct.update(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            checkset.update(dct)
    else:
        checkset = relateset

    return not checkPackages(cache, checkset, relateset, report=True)
Beispiel #17
0
def main(ctrl, opts, reloadchannels=True):

    # Argument check
    if not opts.args:
        raise Error, _("No package(s) given")

    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 opts.args:
        pkgs = {}
        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(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            pkgs.update(dct)
        pkgs = pkgs.keys()
    else:
        pkgs = cache.getPackages()

    for pkg in pkgs:
        channels = {}
        infos = []
        for loader in pkg.loaders:
            channel = loader.getChannel()
            info = loader.getInfo(pkg)
            infos.append(info)
            urls = info.getURLs()
            map = channels.setdefault(str(channel), {})
            if urls:
                map.setdefault("urls", []).extend(urls)

        infos.sort()
        info = infos[0]

        print _("Name:"), pkg.name
        print _("Version:"), pkg.version
        print _("Priority:"), pkg.getPriority()
        print _("Source:"), info.getSource()
        print _("Group:"), info.getGroup()
        print _("License:"), info.getLicense()
        print _("Installed Size:"), sizeToStr(info.getInstalledSize())
        print _("Reference URLs:"), " ".join(info.getReferenceURLs())

        flags = pkgconf.testAllFlags(pkg)
        if flags:
            flags.sort()
            flags = "%s" % ", ".join(flags)
        else:
            flags = ""
        print _("Flags:"), flags

        print _("Channels:"),
        channelnames = channels.keys()
        channelnames.sort()
        print "; ".join(channelnames)

        print _("Summary:"), info.getSummary()
        print _("Description:")
        for line in info.getDescription().splitlines():
            line = line.strip()
            if not line:
                line = "."
            print "", line

        if opts.urls:
            print _("URLs:")
            seen = {}
            for loader in pkg.loaders:
                if loader not in seen:
                    seen[loader] = True
                    info = loader.getInfo(pkg)
                    first = True
                    for url in info.getURLs():
                        if first:
                            print "", loader.getChannel()
                            first = False
                        size = info.getSize(url)
                        if size:
                            print "   ", url, "(%s)" % sizeToStr(size)
                        else:
                            print "   ", url

        if opts.paths or opts.changelog:
            for loader in pkg.loaders:
                if loader.getInstalled():
                    info = loader.getInfo(pkg)
                    break

        if opts.paths:
            print _("Paths:")
            paths = info.getPathList()
            paths.sort()
            for entry in paths:
                print "", entry

        if opts.changelog:
            print _("Changelog:")
            changelog = info.getChangeLog()
            for i in range(len(changelog) / 2):
                print "       ", "%s" % changelog[2 * i]
                changesplit = changelog[2 * i + 1].split("\n")
                print "       ", "%s" % changesplit[0]
                for i in range(1, len(changesplit)):
                    print "         ", "%s" % changesplit[i]

        print
Beispiel #18
0
def main(ctrl, opts, reloadchannels=True):

    # Argument check
    if not opts.args:
      raise Error, _("No package(s) given")

    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 opts.args:
        pkgs = {}
        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(dict.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

            dct = {}
            for obj in results:
                if isinstance(obj, Package):
                    dct[obj] = True
                else:
                    dct.update(dict.fromkeys(obj.packages, True))
            pkgs.update(dct)
        pkgs = pkgs.keys()
    else:
        pkgs = cache.getPackages()

    for pkg in pkgs:
        channels = {}
        infos = []
        for loader in pkg.loaders:
            channel = loader.getChannel()
            info = loader.getInfo(pkg)
            infos.append(info)
            urls = info.getURLs()
            map = channels.setdefault(str(channel), {})
            if urls:
                map.setdefault("urls", []).extend(urls)

        infos.sort()
        info = infos[0]

        print _("Name:"), pkg.name
        print _("Version:"), pkg.version
        print _("Priority:"), pkg.getPriority()
        print _("Source:"), info.getSource()
        print _("Group:"), info.getGroup()
        print _("License:"), info.getLicense()
        print _("Installed Size:"), sizeToStr(info.getInstalledSize())
        print _("Reference URLs:"), " ".join(info.getReferenceURLs())


        flags = pkgconf.testAllFlags(pkg)
        if flags:
            flags.sort()
            flags = "%s" % ", ".join(flags)
        else:
            flags = ""
        print _("Flags:"), flags

        print _("Channels:"),
        channelnames = channels.keys()
        channelnames.sort()
        print "; ".join(channelnames)

        print _("Summary:"), info.getSummary()
        print _("Description:")
        for line in info.getDescription().splitlines():
            line = line.strip()
            if not line:
                line = "."
            print "", line

        if opts.urls:
            print _("URLs:")
            seen = {}
            for loader in pkg.loaders:
                if loader not in seen:
                    seen[loader] = True
                    info = loader.getInfo(pkg)
                    first = True
                    for url in info.getURLs():
                        if first:
                            print "", loader.getChannel()
                            first = False
                        size = info.getSize(url)
                        if size:
                            print "   ", url, "(%s)" % sizeToStr(size)
                        else:
                            print "   ", url

        if opts.paths or opts.changelog:
            for loader in pkg.loaders:
                if loader.getInstalled():
                    info = loader.getInfo(pkg)
                    break

        if opts.paths:
            print _("Paths:")
            paths = info.getPathList()
            paths.sort()
            for entry in paths:
                print "", entry

        if opts.changelog:
            print _("Changelog:")
            changelog = info.getChangeLog()
            for i in range(len(changelog)/2):
                print "       ", "%s" % changelog[2*i]
                changesplit = changelog[2*i+1].split("\n")
                print "       ", "%s" % changesplit[0]
                for i in range(1, len(changesplit)):
                    print "         ", "%s" % changesplit[i]

        print