From: Michael Tremer Date: Sat, 30 Apr 2011 21:03:49 +0000 (+0000) Subject: Implement update command. X-Git-Tag: 0.9.3~40 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0c1a80b8def2aef15e647f9c48476a0d8ddf7630;p=pakfire.git Implement update command. --- diff --git a/pakfire/base.py b/pakfire/base.py index 5ea41115..52dfd74d 100644 --- a/pakfire/base.py +++ b/pakfire/base.py @@ -138,8 +138,22 @@ class Pakfire(object): t.run() def update(self, pkgs): - # XXX needs to be done - pass + request = self.solver.create_request() + + repo_installed = self.solver.get_repo("installed") + assert repo_installed + + for solvable in repo_installed: + request.update(solvable) + + t = self.solver.solve(request, update=True) + + if not t: + return + + t.dump() + + t.run() def info(self, patterns): pkgs = [] diff --git a/pakfire/repository/solver.py b/pakfire/repository/solver.py index a34b82ce..cf9bf610 100644 --- a/pakfire/repository/solver.py +++ b/pakfire/repository/solver.py @@ -136,9 +136,14 @@ class Solver(object): def create_request(self): return self.pool.create_request() - def solve(self, request, interactive=False): + def solve(self, request, update=False, interactive=False): solver = self.pool.create_solver() - solver.set_allow_uninstall(True) + #solver.set_allow_uninstall(True) + + # Configure the solver for an update. + if update: + solver.set_update_system(True) + solver.set_do_split_provides(True) while True: # Save start time. diff --git a/pakfire/repository/transaction.py b/pakfire/repository/transaction.py index d9ded3d8..193a2df2 100644 --- a/pakfire/repository/transaction.py +++ b/pakfire/repository/transaction.py @@ -3,6 +3,7 @@ import logging import os import progressbar +import satsolver import sys import pakfire.packages as packages @@ -49,62 +50,10 @@ class Action(object): class ActionCleanup(Action): - def gen_files(self): - """ - Return a list of all files that are not in the package anymore - and so to be removed. - """ - files = [] - - # Compare the filelist of the old and the new package and save the - # difference. - - for f in self.pkg.old_package.filelist: - if f in self.pkg.filelist: - continue - - # Save absolute path. - f = os.path.join(self.pakfire.path, f) - files.append(f) - - return files - - def remove_files(self, message, files): - if not files: - return - - pb = util.make_progress(message, len(files)) - i = 0 - - for f in self.gen_files(): - # Update progress if any. - i += 1 - if pb: - pb.update(i) - - # Skip non-existant files (mabye the user removed it already?) - if not os.path.exists(f): - continue - - logging.debug("Going to remove file: %s" % f) - - try: - os.unlink(f) - except: - logging.critical("Could not remove file: %s. Do it manually." % f) - - # XXX remove file from database - - if pb: - pb.finish() + type = "ignore" def run(self): - files = self.gen_files() - - if not files: - return - - self.remove_files(_("Cleanup: %s") % self.pkg.name, files) + print "XXX Cleanup: %s" % self.pkg class ActionScript(Action): @@ -149,7 +98,7 @@ class ActionInstall(Action): class ActionUpdate(ActionInstall): - type = "update" + type = "upgrade" def run(self): self.extract(_("Updating: %s") % self.pkg.name) @@ -167,19 +116,12 @@ class ActionRemove(ActionCleanup): self.remove_files(_("Removing: %s") % self.pkg.name, files) -class ActionIgnore(Action): - type = "ignore" - - def run(self): - pass - - class Transaction(object): action_classes = [ ActionInstall, ActionUpdate, ActionRemove, - ActionIgnore, + ActionCleanup, ] def __init__(self, pakfire): @@ -188,6 +130,10 @@ class Transaction(object): self.downloads = [] + self.installs = [] + self.updates = [] + self.removes = [] + @classmethod def from_solver(cls, pakfire, solver1, solver2): # Grab the original transaction object from the solver. @@ -200,11 +146,17 @@ class Transaction(object): # Create a new instance of our own transaction class. transaction = cls(pakfire) + # Copy all information. + transaction.installs = solver1.solvables2packages(solver2.installs()) + transaction.updates = \ + [p for p in solver1.solvables2packages(solver2.updates()) if not p.repo.name == "installed"] + transaction.removes = solver1.solvables2packages(solver2.removes()) + for step in _transaction.steps(): - action = step.type_s() + action = step.type_s(satsolver.TRANSACTION_MODE_ACTIVE) pkg = solver1.id2pkg[step.solvable().id()] - if not isinstance(pkg, packages.BinaryPackage): + if action in ("install", "upgrade") and not isinstance(pkg, packages.BinaryPackage): transaction.downloads.append(pkg) for action_cls in cls.action_classes: @@ -239,18 +191,6 @@ class Transaction(object): self.downloads = [] print - @property - def installs(self): - return [a for a in self.actions if a.type == "install"] - - @property - def removes(self): - return [a for a in self.actions if a.type == "remove"] - - @property - def updates(self): - return [a for a in self.actions if a.type == "update"] - def dump_pkg(self, pkg): ret = [] @@ -286,9 +226,9 @@ class Transaction(object): s.append(PKG_DUMP_FORMAT % (_("Package"), _("Arch"), _("Version"), _("Repository"), _("Size"))) s.append(line) - s += self.dump_pkgs(_("Installing:"), [a.pkg for a in self.installs]) - s += self.dump_pkgs(_("Updating:"), [a.pkg for a in self.updates]) - s += self.dump_pkgs(_("Removing:"), [a.pkg for a in self.removes]) + s += self.dump_pkgs(_("Installing:"), self.installs) + s += self.dump_pkgs(_("Updating:"), self.updates) + s += self.dump_pkgs(_("Removing:"), self.removes) s.append(_("Transaction Summary")) s.append(line) diff --git a/po/pakfire.pot b/po/pakfire.pot index 637ed212..1175c05b 100644 --- a/po/pakfire.pot +++ b/po/pakfire.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2011-04-30 16:33+0000\n" +"POT-Creation-Date: 2011-04-30 20:58+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -21,11 +21,11 @@ msgstr "" msgid "Name" msgstr "" -#: ../pakfire/packages/base.py:68 ../pakfire/repository/transaction.py:278 +#: ../pakfire/packages/base.py:68 ../pakfire/repository/transaction.py:226 msgid "Arch" msgstr "" -#: ../pakfire/packages/base.py:69 ../pakfire/repository/transaction.py:278 +#: ../pakfire/packages/base.py:69 ../pakfire/repository/transaction.py:226 msgid "Version" msgstr "" @@ -33,7 +33,7 @@ msgstr "" msgid "Release" msgstr "" -#: ../pakfire/packages/base.py:71 ../pakfire/repository/transaction.py:278 +#: ../pakfire/packages/base.py:71 ../pakfire/repository/transaction.py:226 msgid "Size" msgstr "" @@ -90,81 +90,76 @@ msgstr "" msgid "Loading %s" msgstr "" -#: ../pakfire/repository/solver.py:188 +#: ../pakfire/repository/solver.py:197 msgid "Empty to abort." msgstr "" -#: ../pakfire/repository/solver.py:191 +#: ../pakfire/repository/solver.py:200 msgid "Choose a solution:" msgstr "" -#: ../pakfire/repository/solver.py:207 +#: ../pakfire/repository/solver.py:216 msgid "You have entered an invalid solution. Try again." msgstr "" -#: ../pakfire/repository/transaction.py:107 -#, python-format -msgid "Cleanup: %s" -msgstr "" - -#: ../pakfire/repository/transaction.py:146 +#: ../pakfire/repository/transaction.py:95 #, python-format msgid "Installing: %s" msgstr "" -#: ../pakfire/repository/transaction.py:155 +#: ../pakfire/repository/transaction.py:104 #, python-format msgid "Updating: %s" msgstr "" -#: ../pakfire/repository/transaction.py:167 +#: ../pakfire/repository/transaction.py:116 #, python-format msgid "Removing: %s" msgstr "" -#: ../pakfire/repository/transaction.py:278 +#: ../pakfire/repository/transaction.py:226 msgid "Package" msgstr "" -#: ../pakfire/repository/transaction.py:278 ../pakfire/cli.py:227 +#: ../pakfire/repository/transaction.py:226 ../pakfire/cli.py:227 msgid "Repository" msgstr "" -#: ../pakfire/repository/transaction.py:281 +#: ../pakfire/repository/transaction.py:229 msgid "Installing:" msgstr "" -#: ../pakfire/repository/transaction.py:282 +#: ../pakfire/repository/transaction.py:230 msgid "Updating:" msgstr "" -#: ../pakfire/repository/transaction.py:283 +#: ../pakfire/repository/transaction.py:231 msgid "Removing:" msgstr "" -#: ../pakfire/repository/transaction.py:285 +#: ../pakfire/repository/transaction.py:233 msgid "Transaction Summary" msgstr "" -#: ../pakfire/repository/transaction.py:291 +#: ../pakfire/repository/transaction.py:239 msgid "Install" msgstr "" -#: ../pakfire/repository/transaction.py:291 -#: ../pakfire/repository/transaction.py:294 -#: ../pakfire/repository/transaction.py:297 +#: ../pakfire/repository/transaction.py:239 +#: ../pakfire/repository/transaction.py:242 +#: ../pakfire/repository/transaction.py:245 msgid "Package(s)" msgstr "" -#: ../pakfire/repository/transaction.py:294 +#: ../pakfire/repository/transaction.py:242 msgid "Updates" msgstr "" -#: ../pakfire/repository/transaction.py:297 +#: ../pakfire/repository/transaction.py:245 msgid "Remove" msgstr "" -#: ../pakfire/repository/transaction.py:303 +#: ../pakfire/repository/transaction.py:251 #, python-format msgid "Total download size: %s" msgstr ""