]> git.ipfire.org Git - pakfire.git/commitdiff
Build cleanup actions and add support to remove packages from the db.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 31 Jul 2011 17:43:13 +0000 (17:43 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 31 Jul 2011 17:43:13 +0000 (17:43 +0000)
pakfire/actions.py
pakfire/packages/base.py
pakfire/packages/installed.py
pakfire/repository/database.py
pakfire/repository/index.py
pakfire/repository/local.py
po/pakfire.pot

index a4c77d9fa747550ab7fd137cfd052dbf3a6f3dd4..bb048b0b9add5b128977117033b196d8c45d2525 100644 (file)
@@ -42,22 +42,6 @@ class Action(object):
                """
                return self.pakfire.repos.local
 
-       def _extract(self, message, prefix=None):
-               # Add package to the database.
-               self.local.add_package(self.pkg)
-
-               if prefix is None:
-                       prefix = self.pakfire.path
-
-               self.pkg.extract(message, prefix=prefix)
-
-
-class ActionCleanup(Action):
-       type = "ignore"
-
-       def run(self):
-               print "XXX Cleanup: %s" % self.pkg
-
 
 class ActionScript(Action):
        def run(self):
@@ -84,14 +68,20 @@ class ActionInstall(Action):
        type = "install"
 
        def run(self):
-               self._extract(_("Installing"))
+               # Add package to the database.
+               self.local.add_package(self.pkg)
+
+               self.pkg.extract(_("Installing"), prefix=self.pakfire.path)
 
 
 class ActionUpdate(Action):
        type = "upgrade"
 
        def run(self):
-               self._extract(_("Updating"))
+               # Add new package to the database.
+               self.local.add_package(self.pkg)
+
+               self.pkg.extract(_("Updating"), prefix=self.pakfire.path)
 
 
 class ActionRemove(Action):
@@ -107,25 +97,54 @@ class ActionRemove(Action):
        def run(self):
                self.pkg.remove(_("Removing"), prefix=self.pakfire.path)
 
-               # XXX Remove package from database
+               # Remove package from the database.
+               self.local.rem_package(self.pkg)
+
+
+class ActionCleanup(Action):
+       type = "ignore"
+
+       def __init__(self, *args, **kwargs):
+               Action.__init__(self, *args, **kwargs)
+
+               # XXX This is ugly, but works for the moment.
+               self.pkg = self.local.index.db.get_package_from_solv(self.pkg_solv)
+               assert self.pkg
+
+       def run(self):
+               # Cleaning up leftover files and stuff.
+               self.pkg.cleanup(_("Cleanup"), prefix=self.pakfire.path)
+
+               # Remove package from the database.
+               self.local.rem_package(self.pkg)
 
 
 class ActionReinstall(Action):
        type = "reinstall"
 
        def run(self):
-               self._extract(_("Installing"))
+               # Remove package from the database and add it afterwards.
+               # Sounds weird, but fixes broken entries in the database.
+               self.local.rem_package(self.pkg)
+               self.local.add_package(self.pkg)
+
+               self.pkg.extract(_("Installing"), prefix=self.pakfire.path)
 
 
 class ActionDowngrade(Action):
        type = "downgrade"
 
        def run(self):
-               self._extract(_("Downgrading"))
+               # Add new package to database.
+               self.local.add_package(self.pkg)
+
+               self.pkg.extract(_("Downgrading"), prefix=self.pakfire.path)
 
 
 class ActionChange(Action):
        type = "change"
 
+       # XXX still need to find out what this should be doing
+
        def run(self):
                print "XXX Change: %s" % self.pkg
index 53bf559150a993e3b24e089659767e24d39c905d..dafad4f287574520287af001c701a0318d0b1512 100644 (file)
@@ -354,9 +354,6 @@ class Package(object):
                raise NotImplementedError, "%s" % repr(self)
 
        def remove(self, message=None, prefix=None):
-               if prefix in ("/", None):
-                       prefix = ""
-
                # Make two filelists. One contains all binary files that need to be
                # removed, the other one contains the configuration files which are
                # kept. files and configfiles are disjunct.
@@ -370,6 +367,12 @@ class Package(object):
                        assert file.startswith("/")
                        files.append(file)
 
+               self._remove_files(files, message, prefix)
+
+       def _remove_files(self, files, message, prefix):
+               if prefix in ("/", None):
+                       prefix = ""
+
                # Load progressbar.
                pb = None
                if message:
index bf044af6d994629c8b14220ce647d431d746a006..96f27542512a58dcfea139d2270217041d34d814 100644 (file)
@@ -7,6 +7,7 @@ import pakfire.downloader
 from base import Package
 from binary import BinaryPackage
 
+import pakfire.util as util
 from pakfire.constants import *
 
 class DatabasePackage(Package):
@@ -230,6 +231,27 @@ class DatabasePackage(Package):
                filename = os.path.join(cache.path, cache_filename)
                return BinaryPackage(self.pakfire, self.repo, filename)
 
+       def cleanup(self, message, prefix):
+               c = self.db.cursor()
+
+               # Get all files, that are in this package and check for all of
+               # them if they need to be removed.
+               files = self.filelist
+
+               # Fetch the whole filelist of the system from the database and create
+               # a diff. Exclude files from this package - of course.
+               c.execute("SELECT name FROM files WHERE pkg != ?", (self.id,))
+
+               for row in c:
+                       # Check if file in filelist.
+                       if row["name"] in files:
+                               files.remove(row["name"])
+
+               c.close()
+
+               self._remove_files(files, message, prefix)
+
+
 # XXX maybe we can remove this later?
 class InstalledPackage(DatabasePackage):
        type = "installed"
index e6d5aa7cb920a17bbd76cf1bf216397dcf03a6dd..4f21b74063b9b617f598d2ae13c0990940a64dec 100644 (file)
@@ -217,6 +217,28 @@ class DatabaseLocal(Database):
 
                c.close()
 
+       def rem_package(self, pkg):
+               logging.debug("Removing package from database: %s" % pkg.friendly_name)
+
+               assert pkg.uuid
+
+               # Get the ID of the package in the database.
+               c = self.cursor()
+               c.execute("SELECT id FROM packages WHERE uuid = ? LIMIT 1", (pkg.uuid,))
+
+               id = None
+               for row in c:
+                       id = row["id"]
+                       break
+               assert id
+
+               # First, delete all files from the database and then delete the pkg itself.
+               c.execute("DELETE FROM files WHERE pkg = ?", (id,))
+               c.execute("DELETE FROM packages WHERE id = ?", (id,))
+
+               c.close()
+               self.commit()
+
        @property
        def packages(self):
                c = self.cursor()
index 57eab3802d68ecb7b95663f4801a4caae06eea0d..0e9346b88dc0c8c9057534e314d438f2bb5c7fc3 100644 (file)
@@ -156,6 +156,10 @@ class Index(object):
                        rel = self.create_relation(file)
                        solvable.add_provides(rel)
 
+       def rem_package(self, pkg):
+               # XXX delete the solvable from the index.
+               self.db.rem_package(pkg)
+
        def clear(self):
                """
                        Forget all packages from memory.
index ddfb7d8a671c63e1f090e4c9b4eb76803856780f..c7d73befb84218dc850a1e71eee3dbe2e35c3c29 100644 (file)
@@ -183,3 +183,7 @@ class RepositoryLocal(base.RepositoryFactory):
                self.index.db.add_package(pkg)
 
                self.index.add_package(pkg)
+
+       def rem_package(self, pkg):
+               # Remove package from the database.
+               self.index.rem_package(pkg)
index f695b91dc9995eec4955e56228d4e23a53908f7b..31ba36705d3b9e99a701bcd0f9f7c87502ac3e37 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-07-31 15:33+0000\n"
+"POT-Creation-Date: 2011-07-31 17:38+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,19 +17,24 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../pakfire/actions.py:87 ../pakfire/actions.py:117
+#: ../pakfire/actions.py:74 ../pakfire/actions.py:131
 msgid "Installing"
 msgstr ""
 
-#: ../pakfire/actions.py:94
+#: ../pakfire/actions.py:84
 msgid "Updating"
 msgstr ""
 
-#: ../pakfire/actions.py:108
+#: ../pakfire/actions.py:98
 msgid "Removing"
 msgstr ""
 
-#: ../pakfire/actions.py:124
+#. Cleaning up leftover files and stuff.
+#: ../pakfire/actions.py:116
+msgid "Cleanup"
+msgstr ""
+
+#: ../pakfire/actions.py:141
 msgid "Downgrading"
 msgstr ""
 
@@ -338,19 +343,19 @@ msgstr ""
 msgid "Requires"
 msgstr ""
 
-#: ../pakfire/repository/index.py:227
+#: ../pakfire/repository/index.py:231
 #, python-format
 msgid "%s: package database"
 msgstr ""
 
 #. Create progress bar.
-#: ../pakfire/repository/index.py:315
+#: ../pakfire/repository/index.py:319
 #, python-format
 msgid "Loading from %s"
 msgstr ""
 
 #. Add all packages from the database to the index.
-#: ../pakfire/repository/index.py:368
+#: ../pakfire/repository/index.py:372
 msgid "Loading installed packages"
 msgstr ""