[packagekit] packagekit: Branch 'master' - 18 commits

Richard Hughes hughsient at kemper.freedesktop.org
Tue Apr 1 12:10:06 PDT 2008


 TODO                               |   67 +++++------
 backends/dummy/pk-backend-dummy.c  |    2 
 backends/yum/helpers/yumBackend.py |   65 ++++++++--
 backends/zypp/zypp-utils.cpp       |   39 +++++-
 backends/zypp/zypp-utils.h         |    5 
 client/pk-console.c                |    4 
 configure.ac                       |    2 
 libpackagekit/pk-client.c          |    2 
 libpackagekit/pk-common.h          |    9 +
 src/Makefile.am                    |   13 ++
 src/pk-backend.c                   |   22 ---
 src/pk-backend.h                   |    1 
 src/pk-cache.c                     |  183 ++++++++++++++++++++++++++++++
 src/pk-cache.h                     |   60 ++++++++++
 src/pk-engine.c                    |   25 ----
 src/pk-interface-transaction.xml   |  221 +++++++++++++++++++++++++++++++++++++
 src/pk-restart.c                   |    2 
 src/pk-security-polkit.c           |   11 +
 18 files changed, 620 insertions(+), 113 deletions(-)

New commits:
commit efd6c232416d9be3e704b56ccbb36d047c0058dc
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 19:58:33 2008 +0100

    use pk_backend_set_allow_cancel in the dummy backend when installing a package

diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index d5e6a7d..7d3a1f9 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -282,6 +282,7 @@ backend_install_timeout (gpointer data)
 		return FALSE;
 	}
 	if (_progress_percentage == 30) {
+		pk_backend_set_allow_cancel (backend, FALSE);
 		pk_backend_package (backend, PK_INFO_ENUM_INSTALLING,
 				    "gtkhtml2;2.19.1-4.fc8;i386;fedora",
 				    "An HTML widget for GTK+ 2.0");
@@ -316,6 +317,7 @@ backend_install_package (PkBackend *backend, const gchar *package_id)
 		pk_backend_finished (backend);
 	}
 
+	pk_backend_set_allow_cancel (backend, TRUE);
 	_progress_percentage = 0;
 	pk_backend_package (backend, PK_INFO_ENUM_DOWNLOADING,
 			    "gtkhtml2;2.19.1-4.fc8;i386;fedora",
commit eb431576a11e1bd4ebdaf12e7fc4aa585c532311
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 19:50:17 2008 +0100

    mark the signal as finished when we check for finished,
    else we get a 'pk_backend_set_exit_code: assertion backend->priv->locked != FALSE' critical error on exit

diff --git a/src/pk-backend.c b/src/pk-backend.c
index d2e51b2..57af107 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -1052,6 +1052,7 @@ pk_backend_finished_delay (gpointer data)
 
 	pk_debug ("emit finished %i", backend->priv->exit);
 	g_signal_emit (backend, signals [PK_BACKEND_FINISHED], 0, backend->priv->exit);
+	backend->priv->signal_finished = 0;
 	return FALSE;
 }
 
commit 4a8d481918d2401f7a3d32b0cb84638831197175
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 18:39:00 2008 +0100

    detect when we are not doing the format string correctly, and fix all the issues

diff --git a/client/pk-console.c b/client/pk-console.c
index deb4191..866a7ff 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1167,7 +1167,7 @@ main (int argc, char *argv[])
 	}
 
 	if (argc < 2) {
-		g_print (options_help);
+		g_print ("%s", options_help);
 		return 1;
 	}
 
@@ -1219,7 +1219,7 @@ main (int argc, char *argv[])
 	if (error != NULL) {
 		g_print ("Error:\n  %s\n\n", error->message);
 		g_error_free (error);
-		g_print (options_help);
+		g_print ("%s", options_help);
 	}
 
 	g_free (options_help);
diff --git a/configure.ac b/configure.ac
index e5e0c96..5142dd2 100755
--- a/configure.ac
+++ b/configure.ac
@@ -54,7 +54,7 @@ dnl - Extra verbose warning switches
 dnl ---------------------------------------------------------------------------
 if test "$GCC" = "yes"; then
 	CPPFLAGS="$CPPFLAGS -Werror -Wcast-align -Wno-uninitialized"
-	CPPFLAGS="$CPPFLAGS -Wall"
+	CPPFLAGS="$CPPFLAGS -Wall -Wformat-security"
 fi
 
 dnl ---------------------------------------------------------------------------
diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 4552dab..9d0e164 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -192,7 +192,7 @@ pk_client_error_set (GError **error, gint code, const gchar *format, ...)
 	}
 
 	/* propogate */
-	g_set_error (error, PK_CLIENT_ERROR, code, buffer);
+	g_set_error (error, PK_CLIENT_ERROR, code, "%s", buffer);
 
 out:
 	g_free(buffer);
diff --git a/src/pk-engine.c b/src/pk-engine.c
index bb0346d..ef54133 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -806,7 +806,7 @@ pk_engine_action_is_allowed (PkEngine *engine, const gchar *dbus_sender,
 	/* use security model to get auth */
 	ret = pk_security_action_is_allowed (engine->priv->security, dbus_sender, role, &error_detail);
 	if (!ret) {
-		*error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_REFUSED_BY_POLICY, error_detail);
+		*error = g_error_new (PK_ENGINE_ERROR, PK_ENGINE_ERROR_REFUSED_BY_POLICY, "%s", error_detail);
 		return FALSE;
 	}
 	return TRUE;
@@ -2690,7 +2690,7 @@ pk_engine_cancel (PkEngine *engine, const gchar *tid, GError **error)
 	/* try to cancel the transaction */
 	ret = pk_runner_cancel (item->runner, &error_text);
 	if (!ret) {
-		g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_NOT_SUPPORTED, error_text);
+		g_set_error (error, PK_ENGINE_ERROR, PK_ENGINE_ERROR_NOT_SUPPORTED, "%s", error_text);
 		g_free (error_text);
 		return FALSE;
 	}
commit 756a1a144a0e99da0a3d0497bd4d38fa31b5e66d
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 18:31:34 2008 +0100

    Revert "enable more warnings from gcc"
    
    This reverts commit 9953683f28bf03518583f4d8f811917ffe146d1e.

diff --git a/configure.ac b/configure.ac
index 0f33cbb..e5e0c96 100755
--- a/configure.ac
+++ b/configure.ac
@@ -54,7 +54,7 @@ dnl - Extra verbose warning switches
 dnl ---------------------------------------------------------------------------
 if test "$GCC" = "yes"; then
 	CPPFLAGS="$CPPFLAGS -Werror -Wcast-align -Wno-uninitialized"
-	CPPFLAGS="$CPPFLAGS -Wall -Wextra"
+	CPPFLAGS="$CPPFLAGS -Wall"
 fi
 
 dnl ---------------------------------------------------------------------------
commit 9953683f28bf03518583f4d8f811917ffe146d1e
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 18:29:26 2008 +0100

    enable more warnings from gcc

diff --git a/configure.ac b/configure.ac
index e5e0c96..0f33cbb 100755
--- a/configure.ac
+++ b/configure.ac
@@ -54,7 +54,7 @@ dnl - Extra verbose warning switches
 dnl ---------------------------------------------------------------------------
 if test "$GCC" = "yes"; then
 	CPPFLAGS="$CPPFLAGS -Werror -Wcast-align -Wno-uninitialized"
-	CPPFLAGS="$CPPFLAGS -Wall"
+	CPPFLAGS="$CPPFLAGS -Wall -Wextra"
 fi
 
 dnl ---------------------------------------------------------------------------
commit b5378c1fd11d9f2fe94b1abfc9dd08f336591472
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 17:27:39 2008 +0100

    copy the basename filtering from yum2 into the yum backend to fix rh#440066

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index bbdb5a0..ccc6eeb 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -337,6 +337,9 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             elif filter in (FILTER_FREE, FILTER_NOT_FREE):
                 if not self._do_free_filtering(filter, pkg):
                     return False
+            elif filter in (FILTER_BASENAME, FILTER_NOT_BASENAME):
+                if not self._do_basename_filtering(filter, pkg):
+                    return False
         return True
 
     def _do_gui_filtering(self,flt,pkg):
@@ -382,6 +385,33 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         return isFree == wantFree
 
+    def _do_basename_filtering(self,flt,pkg):
+        if flt == FILTER_BASENAME:
+            wantBase = True
+        else:
+            wantBase = False
+
+        isBase = self._check_basename(pkg)
+
+        return isBase == wantBase
+
+    def _check_basename(self, pkg):
+        '''
+        If a package does not have a source rpm (If that ever
+        happens), or it does have a source RPM, and the package's name
+        is the same as the source RPM's name, then we assume it is the
+        'base' package.
+        '''
+        basename = pkg.name
+
+        if pkg.sourcerpm:
+            basename = rpmUtils.miscutils.splitFilename(pkg.sourcerpm)[0]
+
+        if basename == pkg.name:
+            return True
+
+        return False
+
     def search_name(self,filters,key):
         '''
         Implement the {backend}-search-name functionality
@@ -1043,25 +1073,30 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         else:
             return INFO_UNKNOWN
 
-    def get_updates(self, filter):
+    def get_updates(self, filters):
         '''
         Implement the {backend}-get-updates functionality
+        @param filters: package types to show
         '''
         self._check_init()
         self.allow_cancel(True)
         self.percentage(None)
         self.status(STATUS_INFO)
+
+        fltlist = filters.split(';')
+
         try:
             ygl = self.yumbase.doPackageLists(pkgnarrow='updates')
             md = self.updateMetadata
             for pkg in ygl.updates:
-                # Get info about package in updates info
-                notice = md.get_notice((pkg.name, pkg.version, pkg.release))
-                if notice:
-                    status = self._get_status(notice)
-                    self._show_package(pkg,status)
-                else:
-                    self._show_package(pkg,INFO_NORMAL)
+                if self._do_extra_filtering(pkg, fltlist):
+                    # Get info about package in updates info
+                    notice = md.get_notice((pkg.name, pkg.version, pkg.release))
+                    if notice:
+                        status = self._get_status(notice)
+                        self._show_package(pkg,status)
+                    else:
+                        self._show_package(pkg,INFO_NORMAL)
         except yum.Errors.RepoError,e:
             self._refresh_yum_cache()
             self.error(ERROR_NO_CACHE,"Yum cache was invalid and has been rebuilt.")
commit 5a7080325e3e2a9eda650a508f7bef2cbe7c37cb
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 17:01:12 2008 +0100

    don't connect to PkBackend::updates-changed, it doesn't exists anymore

diff --git a/src/Makefile.am b/src/Makefile.am
index 2b36dfe..0af1183 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -53,6 +53,8 @@ shared_SOURCES =					\
 	pk-time.c					\
 	pk-conf.c					\
 	pk-conf.h					\
+	pk-cache.c					\
+	pk-cache.h					\
 	pk-notify.c					\
 	pk-notify.h					\
 	pk-spawn.c					\
diff --git a/src/pk-engine.c b/src/pk-engine.c
index ee1ca99..bb0346d 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -316,25 +316,6 @@ pk_engine_update_detail_cb (PkBackend *backend, const gchar *package_id,
 }
 
 /**
- * pk_engine_updates_changed_cb:
- **/
-static void
-pk_engine_updates_changed_cb (PkBackend *backend, PkEngine *engine)
-{
-	const gchar *c_tid;
-
-	g_return_if_fail (engine != NULL);
-	g_return_if_fail (PK_IS_ENGINE (engine));
-
-	c_tid = pk_backend_get_current_tid (engine->priv->backend);
-	if (c_tid == NULL) {
-		pk_warning ("could not get current tid from backend");
-		return;
-	}
-	pk_notify_updates_changed (engine->priv->notify, c_tid);
-}
-
-/**
  * pk_engine_repo_signature_required_cb:
  **/
 static void
@@ -3068,8 +3049,6 @@ pk_engine_init (PkEngine *engine)
 			  G_CALLBACK (pk_engine_update_detail_cb), engine);
 	g_signal_connect (engine->priv->backend, "error-code",
 			  G_CALLBACK (pk_engine_error_code_cb), engine);
-	g_signal_connect (engine->priv->backend, "updates-changed",
-			  G_CALLBACK (pk_engine_updates_changed_cb), engine);
 	g_signal_connect (engine->priv->backend, "repo-signature-required",
 			  G_CALLBACK (pk_engine_repo_signature_required_cb), engine);
 	g_signal_connect (engine->priv->backend, "require-restart",
commit 85fd6258be8064e768cf30cb78e4df5a0d401625
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Tue Apr 1 15:29:15 2008 +0200

    yum: make the yum backend support both name and package id as parameter to the different helpers. to make it easier to test the helpers from the command line, with out messing with long packageids.

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index b0fb1d2..bbdb5a0 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -582,10 +582,16 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         '''
         find a package based on a package id (name;version;arch;repoid)
         '''
-        # Split up the id
-        (n,idver,a,d) = self.get_package_from_id(id)
-        # get e,v,r from package id version
-        e,v,r = self._getEVR(idver)
+        # is this an real id or just an name
+        if len(id.split(';')) > 1:
+            # Split up the id
+            (n,idver,a,d) = self.get_package_from_id(id)
+            # get e,v,r from package id version 
+            e,v,r = self._getEVR(idver)
+        else:
+            print id
+            n = id
+            e = v = r = a = None  
         # search the rpmdb for the nevra
         pkgs = self.yumbase.rpmdb.searchNevra(name=n,epoch=e,ver=v,rel=r,arch=a)
         # if the package is found, then return it
commit 98eb568d8b5542a8e35971e091ce12a740008b98
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 14:01:45 2008 +0100

    fix a typo in the gtk-markup

diff --git a/libpackagekit/pk-common.h b/libpackagekit/pk-common.h
index 88cc2f4..26d114d 100644
--- a/libpackagekit/pk-common.h
+++ b/libpackagekit/pk-common.h
@@ -55,12 +55,19 @@ G_BEGIN_DECLS
 #define	PK_DBUS_INTERFACE		"org.freedesktop.PackageKit"
 
 /**
- * PK_DBUS_INTERFACE:
+ * PK_DBUS_INTERFACE_NOTIFY:
  *
  * The DBUS interface for the notifications
  */
 #define	PK_DBUS_INTERFACE_NOTIFY	"org.freedesktop.PackageKit.Notify"
 
+/**
+ * PK_DBUS_INTERFACE_TRANSACTION:
+ *
+ * The DBUS interface for the transactions
+ */
+#define	PK_DBUS_INTERFACE_TRANSACTION	"org.freedesktop.PackageKit.Transaction"
+
 guint		 pk_strlen				(gchar		*text,
 							 guint		 max_length)
 							 G_GNUC_WARN_UNUSED_RESULT;
commit 141108a0c08ce63ec5fbcc425a6108c67c8faee8
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 13:54:27 2008 +0100

    update TODO

diff --git a/TODO b/TODO
index b1d013a..b0a4a89 100644
--- a/TODO
+++ b/TODO
@@ -1,55 +1,45 @@
-Order of no particular importance:
+*** Timeframe: 0.1.11 ***
 
-* Make installing firmware with udev possible:
-  http://lists.freedesktop.org/archives/packagekit/2008-March/002430.html
-
-* Fix ServicePack to work correctly:
-  http://lists.freedesktop.org/archives/packagekit/2008-March/002434.html
+* Make PkMessages into proper enumerated types with localised descriptions
 
-* Find out why yum doesn't output some package status calls.
+* Add a way to import GPG keys for unsigned packages
+  In fedora, if you add a signed repo you have to agree to the GPG key.
 
-* Make PkMessages into proper erumerated types with localised descriptions
+*** Timeframe: 0.2.0 ***
 
-* We need to make sure the html documentation is still correct and easy
-to read - does any of it sound like technobabble? Is it easy enough for
-developers to get detailed information about how to contribute?
+* Make the dbus interface sane
+  Preview available in src/pk-interface-transaction.xml
 
-* We need to audit all the strings in gnome-packagekit so that they are
-easily localisable and don't contain markup. This is one for you if you
-are also a translator.
+* Make installing firmware with udev possible
+  http://lists.freedesktop.org/archives/packagekit/2008-March/002430.html
 
-* We need some yelp documentation for the gnome-packagekit tools. This
-will mean getting screenshots and generally explaining how to use the
-tools.
+* Enable GetUpdateDetail to handle arrays for 'updates' and 'obsoletes'
+  Until then, use a space to delimit package_id's
 
-* We need a proper security audit of the packagekitd daemon. We are
-running as root, so we need to make sure we are not doing anything
-insane that would mean we could crash and do bad things.
+* Add the GetPackages(filter) method to get the complete package list
+  Then add a group menu item for this in pk-application
 
-* We need more unit tests where we can actually simulate _using_
-packagekit, probably using an enhanced dummy backend and libpackagekit.
-This is a tricky one as we can't assume we have the
-org.freedesktop.PackageKit.conf file installed in the system prefix -
-maybe we can #ifdef the daemon to run in the session bus for some
-testing.
+* Make one-click installs work
 
-*** write to the database for config stuff
- - Probably should move the job number too
+* We need more unit tests.
+  Where we can actually simulate _using_ packagekit, probably using an
+  enhanced dummy backend and libpackagekit.
+  This is a tricky one as we can't assume we have the
+  org.freedesktop.PackageKit.conf file installed in the system prefix -
+  maybe we can #ifdef the daemon to run in the session bus for some
+  testing.
 
-*** Add a way to import GPG keys ***
-In fedora, if you add a signed repo you have to agree to the GPG key.
+*** Timeframe: Sometime in the future ***
 
-*** Split up PolicyKit install into different types ***
-Have different permissions for signed and unsigned repos.
+* Split up PolicyKit install into different types
+  Have different permissions for signed and unsigned repos.
 
-*** Handle rollbacks for select backends ***
-To do rollbacks sanely in PK we need a few things:
- - allow transaction data to be changed in _db
+* Fix ServicePack to work correctly:
+  http://lists.freedesktop.org/archives/packagekit/2008-March/002434.html
 
-*** Don't display install if something is upgradable
- - Return update when we search for something that is installed, but an
-   update exists for
+* Handle rollbacks for select backends, i.e. allow transaction data to be changed
 
-*  Enable get_update_detail to handle arrays for 'updates' and 
-'obsoletes'.
+* Don't display install if something is upgradable
+  Return update when we search for something that is installed, but an
+  update exists for
 
commit cd84ff47b40a20023a17197f4f1a371ef98194c1
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Mar 30 19:18:46 2008 +0100

    add the Makefile.am stuff for the new interface

diff --git a/src/Makefile.am b/src/Makefile.am
index 46d9a2a..2b36dfe 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -118,7 +118,8 @@ BUILT_SOURCES = 					\
 	pk-marshal.c					\
 	pk-marshal.h					\
 	pk-interface.h					\
-	pk-interface-notify.h					\
+	pk-interface-notify.h				\
+	pk-interface-transaction.h			\
 	$(NULL)
 
 pk-marshal.c: pk-marshal.list
@@ -142,6 +143,13 @@ pk-interface-notify.h: pk-interface-notify.xml
 		--output=pk-interface-notify.h		\
 		$(srcdir)/pk-interface-notify.xml
 
+pk-interface-transaction.h: pk-interface-transaction.xml
+	$(LIBTOOL) --mode=execute dbus-binding-tool	\
+		--prefix=pk_transaction			\
+		--mode=glib-server			\
+		--output=pk-interface-transaction.h	\
+		$(srcdir)/pk-interface-transaction.xml
+
 if PK_BUILD_TESTS
 
 check_PROGRAMS =					\
@@ -187,6 +195,7 @@ EXTRA_DIST =						\
 	pk-security-dummy.c				\
 	pk-interface.xml				\
 	pk-interface-notify.xml				\
+	pk-interface-transaction.xml			\
 	$(NULL)
 
 clean-local:
commit aa378db0f7454f6b0b0ee538658a48c7b0cf7edf
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 13:13:20 2008 +0100

    Add the new tranasaction interface. This is _not_ used yet, but this will be the
    new transaction interface in PackageKit 0.2.0.
    It is provided for no other reason than developer interest.

diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
new file mode 100644
index 0000000..74acc01
--- /dev/null
+++ b/src/pk-interface-transaction.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<node name="/">
+  <!-- This is not used yet, but this will be the new transaction interface in
+       PackageKit 0.2.0 -->
+  <interface name="org.freedesktop.PackageKit.Transaction">
+
+    <method name="Cancel">
+    </method>
+    <method name="GetAllowCancel">
+      <arg type="b" name="allow_cancel" direction="out"/>
+    </method>
+    <method name="GetDepends">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="package_id" direction="in"/>
+      <arg type="b" name="recursive" direction="in"/>
+    </method>
+    <method name="GetDescription">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="package_id" direction="in"/>
+    </method>
+    <method name="GetFiles">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="package_id" direction="in"/>
+    </method>
+    <method name="GetOldTransactions">
+      <arg type="u" name="number" direction="in"/>
+    </method>
+    <method name="GetPackage">
+      <arg type="s" name="package" direction="out"/>
+    </method>
+    <method name="GetProgress">
+      <arg type="u" name="percentage" direction="out"/>
+      <arg type="u" name="subpercentage" direction="out"/>
+      <arg type="u" name="elapsed" direction="out"/>
+      <arg type="u" name="remaining" direction="out"/>
+    </method>
+    <method name="GetRepoList">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+    </method>
+    <method name="GetRequires">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="package_id" direction="in"/>
+      <arg type="b" name="recursive" direction="in"/>
+    </method>
+    <method name="GetRole">
+      <arg type="s" name="status" direction="out"/>
+      <arg type="s" name="package_id" direction="out"/>
+    </method>
+    <method name="GetStatus">
+      <arg type="s" name="status" direction="out"/>
+    </method>
+    <method name="GetUpdateDetail">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="package_id" direction="in"/>
+    </method>
+    <method name="GetUpdates">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+    </method>
+    <method name="InstallFile">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="full_path" direction="in"/>
+    </method>
+    <method name="InstallPackage">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="package_id" direction="in"/>
+    </method>
+    <method name="IsCallerActive">
+      <arg type="b" name="is_active" direction="out"/>
+    </method>
+    <method name="RefreshCache">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="b" name="force" direction="in"/>
+    </method>
+    <method name="RemovePackage">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="package_id" direction="in"/>
+      <arg type="b" name="allow_deps" direction="in"/>
+      <arg type="b" name="autoremove" direction="in"/>
+    </method>
+    <method name="RepoEnable">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="repo_id" direction="in"/>
+      <arg type="b" name="enabled" direction="in"/>
+    </method>
+    <method name="RepoSetData">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="repo_id" direction="in"/>
+      <arg type="s" name="parameter" direction="in"/>
+      <arg type="s" name="value" direction="in"/>
+    </method>
+    <method name="Resolve">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="package" direction="in"/>
+    </method>
+    <method name="Rollback">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="transaction_id" direction="in"/>
+    </method>
+    <method name="SearchDetails">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="search" direction="in"/>
+    </method>
+    <method name="SearchFile">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="search" direction="in"/>
+    </method>
+    <method name="SearchGroup">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="search" direction="in"/>
+    </method>
+    <method name="SearchName">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="search" direction="in"/>
+    </method>
+    <method name="UpdatePackages">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="as" name="package_ids" direction="in"/>
+    </method>
+    <method name="UpdateSystem">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+    </method>
+    <method name="WhatProvides">
+      <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+      <arg type="s" name="filter" direction="in"/>
+      <arg type="s" name="type" direction="in"/>
+      <arg type="s" name="search" direction="in"/>
+    </method>
+
+    <signal name="AllowCancel">
+      <arg type="b" name="allow_cancel" direction="out"/>
+    </signal>
+    <signal name="CallerActiveChanged">
+      <arg type="b" name="is_active" direction="out"/>
+    </signal>
+    <signal name="Description">
+      <arg type="s" name="package_id" direction="out"/>
+      <arg type="s" name="license" direction="out"/>
+      <arg type="s" name="group" direction="out"/>
+      <arg type="s" name="detail" direction="out"/>
+      <arg type="s" name="url" direction="out"/>
+      <arg type="t" name="size" direction="out"/>
+    </signal>
+    <signal name="ErrorCode">
+      <arg type="s" name="code" direction="out"/>
+      <arg type="s" name="details" direction="out"/>
+    </signal>
+    <signal name="Files">
+      <arg type="s" name="package_id" direction="out"/>
+      <arg type="s" name="file_list" direction="out"/>
+    </signal>
+    <signal name="Finished">
+      <arg type="s" name="status" direction="out"/>
+      <arg type="u" name="runtime" direction="out"/>
+    </signal>
+    <signal name="Message">
+      <arg type="s" name="message" direction="out"/>
+      <arg type="s" name="details" direction="out"/>
+    </signal>
+    <signal name="Package">
+      <arg type="s" name="info" direction="out"/>
+      <arg type="s" name="package_id" direction="out"/>
+      <arg type="s" name="summary" direction="out"/>
+    </signal>
+    <signal name="ProgressChanged">
+      <arg type="u" name="percentage" direction="out"/>
+      <arg type="u" name="subpercentage" direction="out"/>
+      <arg type="u" name="elapsed" direction="out"/>
+      <arg type="u" name="remaining" direction="out"/>
+    </signal>
+    <signal name="RepoDetail">
+      <arg type="s" name="repo_id" direction="out"/>
+      <arg type="s" name="description" direction="out"/>
+      <arg type="b" name="enabled" direction="out"/>
+    </signal>
+    <signal name="RepoSignatureRequired">
+      <arg type="s" name="repository_name" direction="out"/>
+      <arg type="s" name="key_url" direction="out"/>
+      <arg type="s" name="key_userid" direction="out"/>
+      <arg type="s" name="key_id" direction="out"/>
+      <arg type="s" name="key_fingerprint" direction="out"/>
+      <arg type="s" name="key_timestamp" direction="out"/>
+      <arg type="s" name="type" direction="out"/>
+    </signal>
+    <signal name="RequireRestart">
+      <arg type="s" name="type" direction="out"/>
+      <arg type="s" name="details" direction="out"/>
+    </signal>
+    <signal name="StatusChanged">
+      <arg type="s" name="status" direction="out"/>
+    </signal>
+    <signal name="Transaction">
+      <arg type="s" name="old_tid" direction="out"/>
+      <arg type="s" name="timespec" direction="out"/>
+      <arg type="b" name="succeeded" direction="out"/>
+      <arg type="s" name="role" direction="out"/>
+      <arg type="u" name="duration" direction="out"/>
+      <arg type="s" name="data" direction="out"/>
+    </signal>
+    <signal name="UpdateDetail">
+      <arg type="s" name="package_id" direction="out"/>
+      <arg type="s" name="updates" direction="out"/>
+      <arg type="s" name="obsoletes" direction="out"/>
+      <arg type="s" name="vendor_url" direction="out"/>
+      <arg type="s" name="bugzilla_url" direction="out"/>
+      <arg type="s" name="cve_url" direction="out"/>
+      <arg type="s" name="restart" direction="out"/>
+      <arg type="s" name="update_text" direction="out"/>
+    </signal>
+
+  </interface>
+</node>
+
commit 1fbf473e248811facd51738a578bb68ca6bda894
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Mar 31 01:22:05 2008 +0100

    remove PkBackend::updates-changed, nothing uses it

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 5f2a5aa..d2e51b2 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -109,7 +109,6 @@ enum {
 	PK_BACKEND_PACKAGE,
 	PK_BACKEND_UPDATE_DETAIL,
 	PK_BACKEND_ERROR_CODE,
-	PK_BACKEND_UPDATES_CHANGED,
 	PK_BACKEND_REPO_SIGNATURE_REQUIRED,
 	PK_BACKEND_REQUIRE_RESTART,
 	PK_BACKEND_MESSAGE,
@@ -805,21 +804,6 @@ pk_backend_files (PkBackend *backend, const gchar *package_id,
 }
 
 /**
- * pk_backend_updates_changed:
- **/
-gboolean
-pk_backend_updates_changed (PkBackend *backend)
-{
-	g_return_val_if_fail (backend != NULL, FALSE);
-	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
-	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
-
-	pk_debug ("emit updates-changed");
-	g_signal_emit (backend, signals [PK_BACKEND_UPDATES_CHANGED], 0);
-	return TRUE;
-}
-
-/**
  * pk_backend_repo_signature_required:
  **/
 gboolean
@@ -1317,11 +1301,6 @@ pk_backend_class_init (PkBackendClass *klass)
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      0, NULL, NULL, pk_marshal_VOID__UINT_STRING,
 			      G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_STRING);
-	signals [PK_BACKEND_UPDATES_CHANGED] =
-		g_signal_new ("updates-changed",
-			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
 	signals [PK_BACKEND_REPO_SIGNATURE_REQUIRED] =
 		g_signal_new ("repo-signature-required",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
diff --git a/src/pk-backend.h b/src/pk-backend.h
index 4a9a3e8..ad89bf4 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -102,7 +102,6 @@ gboolean 	 pk_backend_files 			(PkBackend 	*backend,
 gboolean	 pk_backend_error_code			(PkBackend	*backend,
 							 PkErrorCodeEnum code,
 							 const gchar	*details, ...);
-gboolean	 pk_backend_updates_changed		(PkBackend	*backend);
 gboolean         pk_backend_repo_signature_required     (PkBackend      *backend,
 							 const gchar    *repository_name,
 							 const gchar    *key_url,
commit add1f90bfb82f923808b9578c5e8868668112191
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Mar 30 23:46:47 2008 +0100

    make PkSecurity(polkit) a singleton

diff --git a/src/pk-security-polkit.c b/src/pk-security-polkit.c
index b20e16a..2b1467f 100644
--- a/src/pk-security-polkit.c
+++ b/src/pk-security-polkit.c
@@ -51,6 +51,7 @@ struct PkSecurityPrivate
 };
 
 G_DEFINE_TYPE (PkSecurity, pk_security, G_TYPE_OBJECT)
+static gpointer pk_security_object = NULL;
 
 /**
  * pk_security_can_do_action:
@@ -279,9 +280,13 @@ pk_security_init (PkSecurity *security)
 PkSecurity *
 pk_security_new (void)
 {
-	PkSecurity *security;
-	security = g_object_new (PK_TYPE_SECURITY, NULL);
-	return PK_SECURITY (security);
+	if (pk_security_object != NULL) {
+		g_object_ref (pk_security_object);
+	} else {
+		pk_security_object = g_object_new (PK_TYPE_SECURITY, NULL);
+		g_object_add_weak_pointer (pk_security_object, &pk_security_object);
+	}
+	return PK_SECURITY (pk_security_object);
 }
 
 /***************************************************************************
commit fa613cb835cb290c60b8c95f6e54a29d704ddbaf
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Mar 30 23:44:48 2008 +0100

    add a simple cache object for use in PkTransaction

diff --git a/src/pk-cache.c b/src/pk-cache.c
new file mode 100644
index 0000000..01d0f15
--- /dev/null
+++ b/src/pk-cache.c
@@ -0,0 +1,183 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <glib/gi18n.h>
+#include <glib.h>
+
+#include <pk-package-list.h>
+
+#include "pk-debug.h"
+#include "pk-cache.h"
+
+#define PK_CACHE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_CACHE, PkCachePrivate))
+
+struct PkCachePrivate
+{
+	PkPackageList		*updates_cache;
+};
+
+G_DEFINE_TYPE (PkCache, pk_cache, G_TYPE_OBJECT)
+static gpointer pk_cache_object = NULL;
+
+/**
+ * pk_cache_get_updates:
+ **/
+PkPackageList *
+pk_cache_get_updates (PkCache *cache)
+{
+	g_return_val_if_fail (cache != NULL, NULL);
+	g_return_val_if_fail (PK_IS_CACHE (cache), NULL);
+	return cache->priv->updates_cache;
+}
+
+/**
+ * pk_cache_set_updates:
+ **/
+gboolean
+pk_cache_set_updates (PkCache *cache, PkPackageList *list)
+{
+	g_return_val_if_fail (cache != NULL, FALSE);
+	g_return_val_if_fail (PK_IS_CACHE (cache), FALSE);
+
+	/* do this in case we have old data */
+	pk_cache_invalidate (cache);
+
+	cache->priv->updates_cache = list;
+	pk_debug ("reffing updates cache");
+	g_object_ref (cache->priv->updates_cache);
+	g_object_add_weak_pointer (G_OBJECT (cache->priv->updates_cache), (gpointer) &cache->priv->updates_cache);
+	return TRUE;
+}
+
+/**
+ * pk_cache_invalidate:
+ **/
+gboolean
+pk_cache_invalidate (PkCache *cache)
+{
+	g_return_val_if_fail (cache != NULL, FALSE);
+	g_return_val_if_fail (PK_IS_CACHE (cache), FALSE);
+
+	pk_debug ("unreffing updates cache");
+	if (cache->priv->updates_cache != NULL) {
+		g_object_unref (cache->priv->updates_cache);
+		cache->priv->updates_cache = NULL;
+	}
+	return TRUE;
+}
+
+/**
+ * pk_cache_finalize:
+ **/
+static void
+pk_cache_finalize (GObject *object)
+{
+	PkCache *cache;
+	g_return_if_fail (object != NULL);
+	g_return_if_fail (PK_IS_CACHE (object));
+	cache = PK_CACHE (object);
+
+	if (cache->priv->updates_cache != NULL) {
+		g_object_unref (cache->priv->updates_cache);
+	}
+
+	G_OBJECT_CLASS (pk_cache_parent_class)->finalize (object);
+}
+
+/**
+ * pk_cache_class_init:
+ **/
+static void
+pk_cache_class_init (PkCacheClass *klass)
+{
+	GObjectClass *object_class = G_OBJECT_CLASS (klass);
+	object_class->finalize = pk_cache_finalize;
+	g_type_class_add_private (klass, sizeof (PkCachePrivate));
+}
+
+/**
+ * pk_cache_init:
+ *
+ * initializes the cache class. NOTE: We expect cache objects
+ * to *NOT* be removed or added during the session.
+ * We only control the first cache object if there are more than one.
+ **/
+static void
+pk_cache_init (PkCache *cache)
+{
+	cache->priv = PK_CACHE_GET_PRIVATE (cache);
+	cache->priv->updates_cache = NULL;
+}
+
+/**
+ * pk_cache_new:
+ * Return value: A new cache class instance.
+ **/
+PkCache *
+pk_cache_new (void)
+{
+	if (pk_cache_object != NULL) {
+		g_object_ref (pk_cache_object);
+	} else {
+		pk_cache_object = g_object_new (PK_TYPE_CACHE, NULL);
+		g_object_add_weak_pointer (pk_cache_object, &pk_cache_object);
+	}
+	return PK_CACHE (pk_cache_object);
+}
+
+/***************************************************************************
+ ***                          MAKE CHECK TESTS                           ***
+ ***************************************************************************/
+#ifdef PK_BUILD_TESTS
+#include <libselftest.h>
+
+void
+libst_cache (LibSelfTest *test)
+{
+	PkCache *cache;
+	gchar *text;
+	gint value;
+
+	if (libst_start (test, "PkCache", CLASS_AUTO) == FALSE) {
+		return;
+	}
+
+	/************************************************************/
+	libst_title (test, "get an instance");
+	cache = pk_cache_new ();
+	if (cache != NULL) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, NULL);
+	}
+
+	g_object_unref (cache);
+
+	libst_end (test);
+}
+#endif
+
diff --git a/src/pk-cache.h b/src/pk-cache.h
new file mode 100644
index 0000000..a47b538
--- /dev/null
+++ b/src/pk-cache.h
@@ -0,0 +1,60 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PK_CACHE_H
+#define __PK_CACHE_H
+
+#include <glib-object.h>
+#include <pk-package-list.h>
+
+G_BEGIN_DECLS
+
+#define PK_TYPE_CACHE		(pk_cache_get_type ())
+#define PK_CACHE(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_CACHE, PkCache))
+#define PK_CACHE_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_CACHE, PkCacheClass))
+#define PK_IS_CACHE(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_CACHE))
+#define PK_IS_CACHE_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_CACHE))
+#define PK_CACHE_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_CACHE, PkCacheClass))
+
+typedef struct PkCachePrivate PkCachePrivate;
+
+typedef struct
+{
+	GObject		      parent;
+	PkCachePrivate	     *priv;
+} PkCache;
+
+typedef struct
+{
+	GObjectClass	parent_class;
+} PkCacheClass;
+
+GType		 pk_cache_get_type		(void);
+PkCache		*pk_cache_new			(void);
+
+PkPackageList	*pk_cache_get_updates		(PkCache	*cache);
+gboolean	 pk_cache_set_updates		(PkCache	*cache,
+						 PkPackageList	*list);
+gboolean	 pk_cache_invalidate		(PkCache	*cache);
+
+G_END_DECLS
+
+#endif /* __PK_CACHE_H */
commit 4328800847a9c0ed5309d437423709c897805d0c
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Apr 1 12:17:04 2008 +0100

    watch the config file, not the sbin binary

diff --git a/src/pk-restart.c b/src/pk-restart.c
index 64b924c..d77f184 100644
--- a/src/pk-restart.c
+++ b/src/pk-restart.c
@@ -45,7 +45,7 @@ static void     pk_restart_init		(PkRestart      *restart);
 static void     pk_restart_finalize	(GObject       *object);
 
 #define PK_RESTART_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_RESTART, PkRestartPrivate))
-#define	PK_RESTART_FILE_TO_WATCH	 SBINDIR "/packagekitd"
+#define	PK_RESTART_FILE_TO_WATCH	 SYSCONFDIR "/PackageKit/PackageKit.conf"
 
 struct PkRestartPrivate
 {
commit 8579f8cdfd911d621f16574f595d65db250834a8
Author: Stefan Haas <shaas at suse.de>
Date:   Tue Apr 1 10:52:37 2008 +0200

    added error-handling for get_zypp

diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 2649b88..ca034d1 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -50,17 +50,22 @@ zypp::ZYpp::Ptr
 get_zypp ()
 {
 	static gboolean initialized = FALSE;
-	zypp::ZYpp::Ptr zypp = NULL;
+        zypp::ZYpp::Ptr zypp = NULL;
 
-	zypp = zypp::ZYppFactory::instance ().getZYpp ();
-	
-	// TODO: Make this threadsafe
-	if (initialized == FALSE) {
-		zypp::filesystem::Pathname pathname("/");
-		zypp->initializeTarget (pathname);
+        try {
 
-		initialized = TRUE;
-	}
+	        zypp = zypp::ZYppFactory::instance ().getZYpp ();
+	
+	        // TODO: Make this threadsafe
+	        if (initialized == FALSE) {
+		        zypp::filesystem::Pathname pathname("/");
+		        zypp->initializeTarget (pathname);
+
+		        initialized = TRUE;
+	        }
+        } catch (const zypp::Exception &ex) {
+                pk_error (ex.asUserString ().c_str ());
+        }
 
 	return zypp;
 }
@@ -541,3 +546,19 @@ zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force)
         
         return TRUE;
 }
+
+gchar **
+zypp_convert_set_char (std::set<zypp::sat::Solvable> *set)
+{
+        gchar **array = new gchar* [set->size ()];
+        guint i = 0;
+
+        for (std::set<zypp::sat::Solvable>::iterator it = set->begin (); it != set->end (); it++){
+                gchar *package_id = zypp_build_package_id_from_resolvable (*it);
+                array[i] = g_strdup(package_id);
+                i++;
+                g_free (package_id);
+        }
+
+        return array;
+}
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index 2d4bf53..bd77325 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -122,5 +122,10 @@ std::set<zypp::ui::Selectable::Ptr> * zypp_get_patches ();
 gboolean zypp_perform_execution (PkBackend *backend, PerformType type, gboolean force);
 
 void zypp_emit_packages_in_list (PkBackend *backend, std::vector<zypp::sat::Solvable> *v);
+
+/**
+  * convert a std::set<zypp::sat::Solvable to gchar ** array
+  */
+gchar ** zypp_convert_set_char (std::set<zypp::sat::Solvable> *set);
 #endif // _ZYPP_UTILS_H_
 
commit 2ddbabe9ff9dca229e7b890066f7b4e808ae1b8d
Author: Stefan Haas <shaas at suse.de>
Date:   Tue Apr 1 10:50:22 2008 +0200

    added item in TODO list

diff --git a/TODO b/TODO
index 5c6dadd..b1d013a 100644
--- a/TODO
+++ b/TODO
@@ -50,3 +50,6 @@ To do rollbacks sanely in PK we need a few things:
  - Return update when we search for something that is installed, but an
    update exists for
 
+*  Enable get_update_detail to handle arrays for 'updates' and 
+'obsoletes'.
+



More information about the PackageKit mailing list