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

Richard Hughes hughsient at kemper.freedesktop.org
Sat May 16 12:17:22 PDT 2009


 AUTHORS                               |    3 
 backends/Makefile.am                  |    4 
 backends/portage/.gitignore           |   10 
 backends/portage/Makefile.am          |   16 +
 backends/portage/pk-backend-portage.c |  375 +++++++++++++++++++++++++++++++
 backends/yum/yumBackend.py            |    2 
 configure.ac                          |   25 +-
 lib/packagekit-glib/.gitignore        |    1 
 lib/packagekit-glib/Makefile.am       |    3 
 lib/packagekit-glib/packagekit.h      |    1 
 lib/packagekit-glib/pk-client.c       |    4 
 lib/packagekit-glib/pk-control.c      |    8 
 lib/packagekit-glib/pk-version.h.in   |   44 +++
 po/LINGUAS                            |    6 
 po/th.po                              |  411 ++++++++++++++++++++++++++++++++++
 po/update-linguas.sh                  |    1 
 src/Makefile.am                       |    2 
 src/org.freedesktop.PackageKit.xml    |   29 ++
 src/pk-cache.c                        |   24 +
 src/pk-engine.c                       |  348 +++++++++++++++++++++++++---
 src/pk-main.c                         |   19 +
 src/pk-notify.c                       |   19 -
 src/pk-notify.h                       |    1 
 src/pk-transaction-db.c               |    2 
 src/pk-transaction.c                  |   68 -----
 src/pk-update-detail-list.c           |  201 ----------------
 src/pk-update-detail-list.h           |   62 -----
 27 files changed, 1286 insertions(+), 403 deletions(-)

New commits:
commit 1487b5dcf0ffc7eb8b010569a042da76cb01bcf0
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat May 16 19:54:09 2009 +0100

    Don't try to clear the cancel timeout if it fires again on PkClient finalise

diff --git a/lib/packagekit-glib/pk-client.c b/lib/packagekit-glib/pk-client.c
index 9ef7d1d..c9200e9 100644
--- a/lib/packagekit-glib/pk-client.c
+++ b/lib/packagekit-glib/pk-client.c
@@ -1297,6 +1297,10 @@ pk_client_transaction_timeout_cb (PkClient *client)
 	/* emit signal */
 	egg_debug ("emit error-code %i, %s", PK_ERROR_ENUM_TRANSACTION_CANCELLED, details);
 	g_signal_emit (client , signals [PK_CLIENT_ERROR_CODE], 0, PK_ERROR_ENUM_TRANSACTION_CANCELLED, details);
+
+	/* set used */
+	client->priv->timeout_id = 0;
+
 	return FALSE;
 }
 
commit 9a10630a1c27a7c260ebc49a1842532b7a29a6fb
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat May 16 19:36:05 2009 +0100

    Don't even ref the update cache if it's not being used

diff --git a/src/pk-cache.c b/src/pk-cache.c
index ccf9f35..1c7aadb 100644
--- a/src/pk-cache.c
+++ b/src/pk-cache.c
@@ -31,11 +31,14 @@
 
 #include "egg-debug.h"
 #include "pk-cache.h"
+#include "pk-conf.h"
 
 #define PK_CACHE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_CACHE, PkCachePrivate))
 
 struct PkCachePrivate
 {
+	PkConf			*conf;
+	gboolean		 use_update_cache;
 	PkPackageList		*updates_cache;
 };
 
@@ -49,6 +52,13 @@ PkPackageList *
 pk_cache_get_updates (PkCache *cache)
 {
 	g_return_val_if_fail (PK_IS_CACHE (cache), NULL);
+
+	/* do not use */
+	if (!cache->priv->use_update_cache) {
+		egg_debug ("not using cache");
+		return NULL;
+	}
+
 	return cache->priv->updates_cache;
 }
 
@@ -61,12 +71,17 @@ pk_cache_set_updates (PkCache *cache, PkPackageList *list)
 	g_return_val_if_fail (PK_IS_CACHE (cache), FALSE);
 	g_return_val_if_fail (list != NULL, FALSE);
 
+	/* do not use */
+	if (!cache->priv->use_update_cache) {
+		egg_debug ("not using cache");
+		return FALSE;
+	}
+
 	/* do this in case we have old data */
 	pk_cache_invalidate (cache);
 
-	cache->priv->updates_cache = list;
 	egg_debug ("reffing updates cache");
-	g_object_ref (cache->priv->updates_cache);
+	cache->priv->updates_cache = g_object_ref (list);
 	g_object_add_weak_pointer (G_OBJECT (cache->priv->updates_cache), (gpointer) &cache->priv->updates_cache);
 	return TRUE;
 }
@@ -97,9 +112,8 @@ pk_cache_finalize (GObject *object)
 	g_return_if_fail (PK_IS_CACHE (object));
 	cache = PK_CACHE (object);
 
-	if (cache->priv->updates_cache != NULL) {
+	if (cache->priv->updates_cache != NULL)
 		g_object_unref (cache->priv->updates_cache);
-	}
 
 	G_OBJECT_CLASS (pk_cache_parent_class)->finalize (object);
 }
@@ -127,6 +141,8 @@ pk_cache_init (PkCache *cache)
 {
 	cache->priv = PK_CACHE_GET_PRIVATE (cache);
 	cache->priv->updates_cache = NULL;
+	cache->priv->conf = pk_conf_new ();
+	cache->priv->use_update_cache = pk_conf_get_bool (cache->priv->conf, "UseUpdateCache");
 }
 
 /**
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index b6e7b0c..0026169 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -2472,8 +2472,7 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 
 	/* try and reuse cache */
 	updates_cache = pk_cache_get_updates (transaction->priv->cache);
-	ret = pk_conf_get_bool (transaction->priv->conf, "UseUpdateCache");
-	if (ret && updates_cache != NULL) {
+	if (updates_cache != NULL) {
 		const PkPackageObj *obj;
 		const gchar *info_text;
 		guint i;
commit 3db4c116f80e3fff43c91c71748101687f338b13
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat May 16 19:17:50 2009 +0100

    Don't cache the update detail, returning half results from the cache and half from backend causes odd bugs

diff --git a/src/Makefile.am b/src/Makefile.am
index df696f6..4806f56 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -81,8 +81,6 @@ shared_SOURCES =					\
 	pk-spawn.h					\
 	pk-sysdep.h					\
 	pk-sysdep.c					\
-	pk-update-detail-list.c				\
-	pk-update-detail-list.h				\
 	pk-file-monitor.h				\
 	pk-engine.h					\
 	pk-engine.c					\
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 63f1145..4a62fa7 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -45,7 +45,6 @@
 #include "pk-network.h"
 #include "pk-cache.h"
 #include "pk-shared.h"
-#include "pk-update-detail-list.h"
 #include "pk-backend.h"
 #include "pk-backend-internal.h"
 #include "pk-engine.h"
@@ -93,7 +92,6 @@ struct PkEnginePrivate
 	PkTransactionList	*transaction_list;
 	PkTransactionDb		*transaction_db;
 	PkCache			*cache;
-	PkUpdateDetailList	*update_detail_cache;
 	PkBackend		*backend;
 	PkInhibit		*inhibit;
 	PkNetwork		*network;
@@ -842,7 +840,6 @@ pk_engine_init (PkEngine *engine)
 
 	/* we save a cache of the latest update lists sowe can do cached responses */
 	engine->priv->cache = pk_cache_new ();
-	engine->priv->update_detail_cache = pk_update_detail_list_new ();
 
 	/* we need to be able to clear this */
 	engine->priv->signal_state_priority_timeout = 0;
@@ -937,7 +934,6 @@ pk_engine_finalize (GObject *object)
 	g_object_unref (engine->priv->notify);
 	g_object_unref (engine->priv->backend);
 	g_object_unref (engine->priv->cache);
-	g_object_unref (engine->priv->update_detail_cache);
 	g_object_unref (engine->priv->conf);
 	g_free (engine->priv->mime_types);
 
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 25bf3e1..b6e7b0c 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -53,7 +53,6 @@
 #include "pk-backend.h"
 #include "pk-backend-internal.h"
 #include "pk-inhibit.h"
-#include "pk-update-detail-list.h"
 #include "pk-conf.h"
 #include "pk-shared.h"
 #include "pk-cache.h"
@@ -93,7 +92,6 @@ struct PkTransactionPrivate
 	PkInhibit		*inhibit;
 	PkCache			*cache;
 	PkConf			*conf;
-	PkUpdateDetailList	*update_detail_list;
 	PkNotify		*notify;
 	PkSecurity		*security;
 	PkSecurityCaller	*caller;
@@ -983,9 +981,6 @@ pk_transaction_update_detail_cb (PkBackend *backend, const PkUpdateDetailObj *de
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
 
-	/* add, if not already added? */
-	pk_update_detail_list_add_obj (transaction->priv->update_detail_list, detail);
-
 	restart_text = pk_restart_enum_to_text (detail->restart);
 	package_id = pk_package_id_to_string (detail->id);
 	state_text = pk_update_state_enum_to_text (detail->state);
@@ -2375,13 +2370,6 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	gboolean ret;
 	GError *error;
 	gchar *package_ids_temp;
-	gchar *package_id;
-	gchar **package_ids_new;
-	const PkUpdateDetailObj *detail;
-	PkPackageId *id;
-	GPtrArray *array;
-	guint i;
-	guint len;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -2390,9 +2378,6 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	egg_debug ("GetUpdateDetail method called: %s", package_ids_temp);
 	g_free (package_ids_temp);
 
-	/* need to split the package_ids into new and cached */
-	array = g_ptr_array_new ();
-
 	/* not implemented yet */
 	if (transaction->priv->backend->desc->get_update_detail == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
@@ -2426,51 +2411,6 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_GET_UPDATE_DETAIL);
 
-	/* try and reuse cache */
-	len = g_strv_length (package_ids);
-	for (i=0; i<len; i++) {
-		id = pk_package_id_new_from_string (package_ids[i]);
-		detail = pk_update_detail_list_get_obj (transaction->priv->update_detail_list, id);
-		pk_package_id_free (id);
-		if (detail != NULL) {
-			gchar *issued;
-			gchar *updated;
-			const gchar *state_text;
-			package_id = pk_package_id_to_string (detail->id);
-			issued = pk_iso8601_from_date (detail->issued);
-			updated = pk_iso8601_from_date (detail->updated);
-			state_text = pk_update_state_enum_to_text (detail->state);
-
-			/* emulate the backend */
-			g_signal_emit (transaction, signals [PK_TRANSACTION_UPDATE_DETAIL], 0,
-				       package_id, detail->updates, detail->obsoletes,
-				       detail->vendor_url, detail->bugzilla_url, detail->cve_url,
-				       pk_restart_enum_to_text (detail->restart), detail->update_text,
-				       detail->changelog, state_text, issued, updated);
-			g_free (issued);
-			g_free (updated);
-			g_free (package_id);
-		} else {
-			egg_debug ("not got %s", package_ids[i]);
-			g_ptr_array_add (array, g_strdup (package_ids[i]));
-		}
-	}
-
-	/* if we have nothing to do, i.e. everything was in the cache */
-	if (array->len == 0) {
-		/* we are done */
-		g_idle_add ((GSourceFunc) pk_transaction_finished_idle_cb, transaction);
-		goto out;
-	}
-
-	/* get the new list */
-	egg_debug ("%i more to process", array->len);
-	package_ids_new = pk_ptr_array_to_strv (array);
-
-	/* alter list */
-	g_strfreev (transaction->priv->cached_package_ids);
-	transaction->priv->cached_package_ids = package_ids_new;
-
 	/* try to commit this */
 	ret = pk_transaction_commit (transaction);
 	if (!ret) {
@@ -2481,9 +2421,6 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 		return;
 	}
 
-out:
-	g_ptr_array_foreach (array, (GFunc) g_free, NULL);
-	g_ptr_array_free (array, TRUE);
 	/* return from async with success */
 	pk_transaction_dbus_return (context);
 }
@@ -3948,7 +3885,6 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->security = pk_security_new ();
 	transaction->priv->cache = pk_cache_new ();
 	transaction->priv->conf = pk_conf_new ();
-	transaction->priv->update_detail_list = pk_update_detail_list_new ();
 	transaction->priv->notify = pk_notify_new ();
 	transaction->priv->inhibit = pk_inhibit_new ();
 	transaction->priv->package_list = pk_package_list_new ();
@@ -4020,7 +3956,6 @@ pk_transaction_finalize (GObject *object)
 
 	g_object_unref (transaction->priv->conf);
 	g_object_unref (transaction->priv->cache);
-	g_object_unref (transaction->priv->update_detail_list);
 	g_object_unref (transaction->priv->inhibit);
 	g_object_unref (transaction->priv->backend);
 	g_object_unref (transaction->priv->monitor);
diff --git a/src/pk-update-detail-list.c b/src/pk-update-detail-list.c
deleted file mode 100644
index f46e2f7..0000000
--- a/src/pk-update-detail-list.c
+++ /dev/null
@@ -1,201 +0,0 @@
-/* -*- 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.
- */
-
-#ifdef CONFIG_H
-#  include <config.h>
-#endif
-
-#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 "egg-debug.h"
-
-#include "pk-update-detail-list.h"
-
-#define PK_UPDATE_DETAIL_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_UPDATE_DETAIL_LIST, PkUpdateDetailListPrivate))
-
-struct PkUpdateDetailListPrivate
-{
-	GPtrArray		*array;
-};
-
-G_DEFINE_TYPE (PkUpdateDetailList, pk_update_detail_list, G_TYPE_OBJECT)
-static gpointer pk_update_detail_list_object = NULL;
-
-/**
- * pk_update_detail_list_clear:
- * @list: a valid #PkUpdateDetailList instance
- *
- * Clears the package list
- **/
-gboolean
-pk_update_detail_list_clear (PkUpdateDetailList *list)
-{
-	g_return_val_if_fail (PK_IS_UPDATE_DETAIL_LIST (list), FALSE);
-	return TRUE;
-}
-
-/**
- * pk_update_detail_list_add_obj:
- * @list: a valid #PkUpdateDetailList instance
- * @obj: a valid #PkUpdateDetailObj object
- *
- * Adds a copy of the object to the list
- **/
-gboolean
-pk_update_detail_list_add_obj (PkUpdateDetailList *list, const PkUpdateDetailObj *obj)
-{
-	PkUpdateDetailObj *obj_new;
-	const PkUpdateDetailObj *obj_found;
-	g_return_val_if_fail (PK_IS_UPDATE_DETAIL_LIST (list), FALSE);
-	g_return_val_if_fail (obj != NULL, FALSE);
-
-	/* are we already in the cache? */
-	obj_found = pk_update_detail_list_get_obj (list, obj->id);
-	if (obj_found != NULL) {
-		egg_debug ("already in list: %s", obj->id->name);
-		return FALSE;
-	}
-
-	obj_new = pk_update_detail_obj_copy (obj);
-	g_ptr_array_add (list->priv->array, obj_new);
-	return TRUE;
-}
-
-/**
- * pk_update_detail_list_get_obj:
- * @list: a valid #PkUpdateDetailList instance
- * @id: A #PkPackageId of the item to match
- *
- * Gets an object from the list
- **/
-const PkUpdateDetailObj *
-pk_update_detail_list_get_obj (PkUpdateDetailList *list, const PkPackageId *id)
-{
-	guint i;
-	guint len;
-	PkUpdateDetailObj *obj;
-
-	g_return_val_if_fail (PK_IS_UPDATE_DETAIL_LIST (list), NULL);
-	g_return_val_if_fail (id != NULL, NULL);
-
-	len = list->priv->array->len;
-	for (i=0; i<len; i++) {
-		obj = (PkUpdateDetailObj *) g_ptr_array_index (list->priv->array, i);
-		if (pk_package_id_equal (id, obj->id)) {
-			return obj;
-		}
-	}
-	/* bahh, found nothing */
-	return NULL;
-}
-
-/**
- * pk_update_detail_list_finalize:
- * @object: a valid #PkUpdateDetailList instance
- **/
-static void
-pk_update_detail_list_finalize (GObject *object)
-{
-	PkUpdateDetailList *list;
-	g_return_if_fail (PK_IS_UPDATE_DETAIL_LIST (object));
-	list = PK_UPDATE_DETAIL_LIST (object);
-
-	/* free the list */
-	g_ptr_array_foreach (list->priv->array, (GFunc) pk_update_detail_obj_free, NULL);
-	g_ptr_array_free (list->priv->array, TRUE);
-
-	G_OBJECT_CLASS (pk_update_detail_list_parent_class)->finalize (object);
-}
-
-/**
- * pk_update_detail_list_class_init:
- * @klass: a valid #PkUpdateDetailListClass instance
- **/
-static void
-pk_update_detail_list_class_init (PkUpdateDetailListClass *klass)
-{
-	GObjectClass *object_class = G_OBJECT_CLASS (klass);
-	object_class->finalize = pk_update_detail_list_finalize;
-	g_type_class_add_private (klass, sizeof (PkUpdateDetailListPrivate));
-}
-
-/**
- * pk_update_detail_list_init:
- * @list: a valid #PkUpdateDetailList instance
- *
- * Initializes the update_detail_list class.
- **/
-static void
-pk_update_detail_list_init (PkUpdateDetailList *list)
-{
-	list->priv = PK_UPDATE_DETAIL_LIST_GET_PRIVATE (list);
-	list->priv->array = g_ptr_array_new ();
-}
-
-/**
- * pk_update_detail_list_new:
- *
- * Return value: A new list class instance.
- **/
-PkUpdateDetailList *
-pk_update_detail_list_new (void)
-{
-	if (pk_update_detail_list_object != NULL) {
-		g_object_ref (pk_update_detail_list_object);
-	} else {
-		pk_update_detail_list_object = g_object_new (PK_TYPE_UPDATE_DETAIL_LIST, NULL);
-		g_object_add_weak_pointer (pk_update_detail_list_object, &pk_update_detail_list_object);
-	}
-	return PK_UPDATE_DETAIL_LIST (pk_update_detail_list_object);
-}
-
-/***************************************************************************
- ***                          MAKE CHECK TESTS                           ***
- ***************************************************************************/
-#ifdef EGG_TEST
-#include "egg-test.h"
-
-void
-pk_update_detail_test_list (EggTest *test)
-{
-	PkUpdateDetailList *list;
-
-	if (!egg_test_start (test, "PkUpdateDetailList"))
-		return;
-
-	/************************************************************/
-	egg_test_title (test, "get an instance");
-	list = pk_update_detail_list_new ();
-	egg_test_assert (test, list != NULL);
-
-	g_object_unref (list);
-
-	egg_test_end (test);
-}
-#endif
-
diff --git a/src/pk-update-detail-list.h b/src/pk-update-detail-list.h
deleted file mode 100644
index cb2b93b..0000000
--- a/src/pk-update-detail-list.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- 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_UPDATE_DETAIL_LIST_H
-#define __PK_UPDATE_DETAIL_LIST_H
-
-#include <glib-object.h>
-#include <packagekit-glib/packagekit.h>
-
-G_BEGIN_DECLS
-
-#define PK_TYPE_UPDATE_DETAIL_LIST		(pk_update_detail_list_get_type ())
-#define PK_UPDATE_DETAIL_LIST(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), PK_TYPE_UPDATE_DETAIL_LIST, PkUpdateDetailList))
-#define PK_UPDATE_DETAIL_LIST_CLASS(k)		(G_TYPE_CHECK_CLASS_CAST((k), PK_TYPE_UPDATE_DETAIL_LIST, PkUpdateDetailListClass))
-#define PK_IS_UPDATE_DETAIL_LIST(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), PK_TYPE_UPDATE_DETAIL_LIST))
-#define PK_IS_UPDATE_DETAIL_LIST_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), PK_TYPE_UPDATE_DETAIL_LIST))
-#define PK_UPDATE_DETAIL_LIST_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), PK_TYPE_UPDATE_DETAIL_LIST, PkUpdateDetailListClass))
-
-typedef struct PkUpdateDetailListPrivate PkUpdateDetailListPrivate;
-
-typedef struct
-{
-	GObject		     		 parent;
-	PkUpdateDetailListPrivate	*priv;
-} PkUpdateDetailList;
-
-typedef struct
-{
-	GObjectClass			 parent_class;
-} PkUpdateDetailListClass;
-
-GType			 pk_update_detail_list_get_type		(void);
-PkUpdateDetailList	 *pk_update_detail_list_new		(void);
-
-gboolean		 pk_update_detail_list_clear		(PkUpdateDetailList	*list);
-gboolean		 pk_update_detail_list_add_obj 		(PkUpdateDetailList	*list,
-								 const PkUpdateDetailObj *obj);
-const PkUpdateDetailObj	*pk_update_detail_list_get_obj 		(PkUpdateDetailList	*list,
-								 const PkPackageId	*id);
-
-
-G_END_DECLS
-
-#endif /* __PK_UPDATE_DETAIL_LIST_H */
commit 9cdb276dc28c0446cea2f1bd52876969cfb162b1
Merge: d8fa28c... 254b365...
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri May 15 18:01:17 2009 +0100

    Merge branch 'master' of git+ssh://hughsie@git.packagekit.org/srv/git/PackageKit

commit d8fa28c92669a8fb3c832c353896f3c08c29cb16
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri May 15 09:09:19 2009 +0100

    yum: Disable the rpm-warm-cache yum plugin, it's so broken, and nobody is going to fix it

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index de9f532..1197491 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -2813,7 +2813,7 @@ class PackageKitYumBase(yum.YumBase):
         # disable the PackageKit plugin when running under PackageKit
         try:
             pc = self.preconf
-            pc.disabled_plugins = ['refresh-packagekit']
+            pc.disabled_plugins = ['refresh-packagekit', 'rpm-warm-cache']
         except yum.Errors.ConfigError, e:
             raise PkError(ERROR_REPO_CONFIGURATION_ERROR, _to_unicode(e))
         except ValueError, e:
commit 254b365f79d2830ef9e52a3042b5f4ff52470a39
Merge: da3c9e9... 06ab35f...
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu May 14 21:52:48 2009 +0200

    Merge branch 'portage-backend'

commit 06ab35fa6b7e512dd9ab90e1c6d96ad75466d4c1
Author: Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
Date:   Thu May 14 21:48:40 2009 +0200

    portage backend: configure + dummy backend

diff --git a/AUTHORS b/AUTHORS
index c0431a8..b4ba1b9 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -18,6 +18,9 @@ Backend: pisi
 Backend: poldek
     Marcin Banasiak <megabajt at pld-linux.org>
 
+Backend: portage
+    Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>
+
 Backend: zypp
     Boyd Timothy <btimothy at gmail.com>
     Scott Reeves <sreeves at novell.com>
diff --git a/backends/Makefile.am b/backends/Makefile.am
index 400765b..53413e8 100644
--- a/backends/Makefile.am
+++ b/backends/Makefile.am
@@ -56,6 +56,10 @@ if BACKEND_TYPE_POLDEK
 SUBDIRS += poldek
 endif
 
+if BACKEND_TYPE_PORTAGE
+SUBDIRS += portage
+endif
+
 clean-local :
 	rm -f *~
 
diff --git a/backends/portage/.gitignore b/backends/portage/.gitignore
new file mode 100644
index 0000000..c851833
--- /dev/null
+++ b/backends/portage/.gitignore
@@ -0,0 +1,10 @@
+.deps
+.libs
+Makefile
+Makefile.in
+*.la
+*.lo
+*.loT
+*.o
+*~
+
diff --git a/backends/portage/Makefile.am b/backends/portage/Makefile.am
new file mode 100644
index 0000000..94c7480
--- /dev/null
+++ b/backends/portage/Makefile.am
@@ -0,0 +1,16 @@
+helperdir = $(datadir)/PackageKit/helpers/portage
+dist_helper_DATA = # to fill
+
+plugindir = $(PK_PLUGIN_DIR)
+plugin_LTLIBRARIES = libpk_backend_portage.la
+libpk_backend_portage_la_SOURCES = pk-backend-portage.c
+libpk_backend_portage_la_LIBADD = $(PK_PLUGIN_LIBS)
+libpk_backend_portage_la_LDFLAGS = -module -avoid-version
+libpk_backend_portage_la_CFLAGS = $(PK_PLUGIN_CFLAGS) $(WARNINGFLAGS_C)
+
+install-data-hook:
+	chmod a+rx $(DESTDIR)$(helperdir)/*.py
+
+clean-local :
+	rm -f *~
+	rm -f *.pyc
diff --git a/backends/portage/pk-backend-portage.c b/backends/portage/pk-backend-portage.c
new file mode 100644
index 0000000..3bf998f
--- /dev/null
+++ b/backends/portage/pk-backend-portage.c
@@ -0,0 +1,375 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 Mounir Lamouri (volkmar) <mounir.lamouri at gmail.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 <stdio.h>
+#include <pk-backend.h>
+
+/**
+ * backend_initialize:
+ * This should only be run once per backend load, i.e. not every transaction
+ */
+static void
+backend_initialize (PkBackend *backend)
+{
+	egg_debug ("backend: initialize");
+}
+
+/**
+ * backend_destroy:
+ * This should only be run once per backend load, i.e. not every transaction
+ */
+static void
+backend_destroy (PkBackend *backend)
+{
+	egg_debug ("backend: destroy");
+}
+
+/**
+ * backend_get_groups:
+ */
+static PkBitfield
+backend_get_groups (PkBackend *backend)
+{
+	/*
+	 * TODO: set group list
+	 */
+	egg_debug ("backend: get_groups");
+
+	return pk_bitfield_from_enums (PK_GROUP_ENUM_ACCESSIBILITY,
+		PK_GROUP_ENUM_GAMES,
+		PK_GROUP_ENUM_SYSTEM,
+		-1);
+}
+
+/**
+ * backend_get_filters:
+ */
+static PkBitfield
+backend_get_filters (PkBackend *backend)
+{
+	/*
+	 * TODO: set filter list
+	 */
+	egg_debug ("backend: get_filters");
+
+	return pk_bitfield_from_enums (PK_FILTER_ENUM_GUI,
+		PK_FILTER_ENUM_INSTALLED,
+		PK_FILTER_ENUM_DEVELOPMENT,
+		-1);
+}
+
+/**
+ * backend_get_mime_types:
+ */
+static gchar *
+backend_get_mime_types (PkBackend *backend)
+{
+	/*
+	 * TODO: what needs to be done for ebuilds here ?
+	 */
+	egg_debug ("backend: get_mime_types");
+
+	return g_strdup ("application/x-rpm;application/x-deb");
+}
+
+/**
+ * backend_cancel:
+ */
+static void
+backend_cancel (PkBackend *backend)
+{
+	/* this feels bad... */
+	egg_debug ("backend: cancel");
+}
+
+/**
+ * backend_get_depends:
+ */
+static void
+backend_get_depends (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
+{
+	egg_debug ("backend: depends");
+}
+
+/**
+ * backend_get_details:
+ */
+static void
+backend_get_details (PkBackend *backend, gchar **package_ids)
+{
+	egg_debug ("backend: details");
+}
+
+/**
+ * backend_get_distro_upgrades:
+ */
+static void
+backend_get_distro_upgrades (PkBackend *backend)
+{
+	egg_debug ("backend: distro upgrade");
+}
+
+/**
+ * backend_get_files:
+ */
+static void
+backend_get_files (PkBackend *backend, gchar **package_ids)
+{
+	egg_debug ("backend: get_files");
+}
+
+/**
+ * backend_get_requires:
+ */
+static void
+backend_get_requires (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
+{
+	egg_debug ("backend: requires");
+}
+
+/**
+ * backend_get_updates:
+ */
+static void
+backend_get_updates (PkBackend *backend, PkBitfield filters)
+{
+	egg_debug ("backend: updates");
+}
+
+/**
+ * backend_get_update_detail:
+ */
+static void
+backend_get_update_detail (PkBackend *backend, gchar **package_ids)
+{
+	egg_debug ("backend: update_detail");
+}
+
+/**
+ * backend_install_packages:
+ */
+static void
+backend_install_packages (PkBackend *backend, gchar **package_ids)
+{
+	egg_debug ("backend: install");
+}
+
+/**
+ * backend_install_signature:
+ */
+static void
+backend_install_signature (PkBackend *backend, PkSigTypeEnum type,
+			   const gchar *key_id, const gchar *package_id)
+{
+	egg_debug ("backend: install signature");
+}
+
+/**
+ * backend_install_files:
+ */
+static void
+backend_install_files (PkBackend *backend, gboolean trusted, gchar **full_paths)
+{
+	egg_debug ("backend: install files");
+}
+
+/**
+ * backend_refresh_cache:
+ */
+static void
+backend_refresh_cache (PkBackend *backend, gboolean force)
+{
+	egg_debug ("backend: refresh cache");
+}
+
+/**
+ * backend_resolve:
+ */
+static void
+backend_resolve (PkBackend *backend, PkBitfield filters, gchar **packages)
+{
+	egg_debug ("backend: resolve");
+}
+
+/**
+ * backend_rollback:
+ */
+static void
+backend_rollback (PkBackend *backend, const gchar *transaction_id)
+{
+	egg_debug ("backend: rollback");
+}
+
+/**
+ * backend_remove_packages:
+ */
+static void
+backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow_deps, gboolean autoremove)
+{
+	egg_debug ("backend: remove packages");
+}
+
+/**
+ * backend_search_details:
+ */
+static void
+backend_search_details (PkBackend *backend, PkBitfield filters, const gchar *search)
+{
+	egg_debug ("backend: search details");
+}
+
+/**
+ * backend_search_file:
+ */
+static void
+backend_search_file (PkBackend *backend, PkBitfield filters, const gchar *search)
+{
+	egg_debug ("backend: search file");
+}
+
+/**
+ * backend_search_group:
+ */
+static void
+backend_search_group (PkBackend *backend, PkBitfield filters, const gchar *search)
+{
+	egg_debug ("backend: search group");
+}
+
+/**
+ * backend_search_name:
+ */
+static void
+backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search)
+{
+	egg_debug ("backend: search name");
+}
+
+/**
+ * backend_update_packages:
+ */
+static void
+backend_update_packages (PkBackend *backend, gchar **package_ids)
+{
+	egg_debug ("backend: update packages");
+}
+
+/**
+ * backend_update_system:
+ */
+static void
+backend_update_system (PkBackend *backend)
+{
+	egg_debug ("backend: update system");
+}
+
+/**
+ * backend_get_repo_list:
+ */
+static void
+backend_get_repo_list (PkBackend *backend, PkBitfield filters)
+{
+	egg_debug ("backend: get repo list");
+}
+
+/**
+ * backend_repo_enable:
+ */
+static void
+backend_repo_enable (PkBackend *backend, const gchar *rid, gboolean enabled)
+{
+	egg_debug ("backend: repo enable");
+}
+
+/**
+ * backend_repo_set_data:
+ */
+static void
+backend_repo_set_data (PkBackend *backend, const gchar *rid, const gchar *parameter, const gchar *value)
+{
+	egg_debug ("backend: repo set data");
+}
+
+/**
+ * backend_what_provides:
+ */
+static void
+backend_what_provides (PkBackend *backend, PkBitfield filters, PkProvidesEnum provides, const gchar *search)
+{
+	egg_debug ("backend: what provides");
+}
+
+/**
+ * backend_get_packages:
+ */
+static void
+backend_get_packages (PkBackend *backend, PkBitfield filters)
+{
+	egg_debug ("backend: get packages");
+}
+
+/**
+ * backend_download_packages:
+ */
+static void
+backend_download_packages (PkBackend *backend, gchar **package_ids, const gchar *directory)
+{
+	egg_debug ("backend: download packages");
+}
+
+PK_BACKEND_OPTIONS (
+	"Portage",				/* description */
+	"Mounir Lamouri (volkmar) <mounir.lamouri at gmail.com>",	/* author */
+	backend_initialize,			/* initalize */
+	backend_destroy,			/* destroy */
+	backend_get_groups,			/* get_groups */
+	backend_get_filters,			/* get_filters */
+	backend_get_mime_types,			/* get_mime_types */
+	backend_cancel,				/* cancel */
+	backend_download_packages,		/* download_packages */
+	NULL,					/* get_categories */
+	backend_get_depends,			/* get_depends */
+	backend_get_details,			/* get_details */
+	backend_get_distro_upgrades,		/* get_distro_upgrades */
+	backend_get_files,			/* get_files */
+	backend_get_packages,			/* get_packages */
+	backend_get_repo_list,			/* get_repo_list */
+	backend_get_requires,			/* get_requires */
+	backend_get_update_detail,		/* get_update_detail */
+	backend_get_updates,			/* get_updates */
+	backend_install_files,			/* install_files */
+	backend_install_packages,		/* install_packages */
+	backend_install_signature,		/* install_signature */
+	backend_refresh_cache,			/* refresh_cache */
+	backend_remove_packages,		/* remove_packages */
+	backend_repo_enable,			/* repo_enable */
+	backend_repo_set_data,			/* repo_set_data */
+	backend_resolve,			/* resolve */
+	backend_rollback,			/* rollback */
+	backend_search_details,			/* search_details */
+	backend_search_file,			/* search_file */
+	backend_search_group,			/* search_group */
+	backend_search_name,			/* search_name */
+	backend_update_packages,		/* update_packages */
+	backend_update_system,			/* update_system */
+	backend_what_provides			/* what_provides */
+);
+
diff --git a/configure.ac b/configure.ac
index 39433a4..62661a1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -464,6 +464,7 @@ AC_ARG_ENABLE(dummy, AS_HELP_STRING([--enable-dummy],[use the dummy backend]),en
 AC_ARG_ENABLE(opkg, AS_HELP_STRING([--enable-opkg],[use the OPKG backend]),enable_opkg=$enableval,enable_opkg=no)
 AC_ARG_ENABLE(pisi, AS_HELP_STRING([--enable-pisi],[use the PiSi backend]),enable_pisi=$enableval,enable_pisi=no)
 AC_ARG_ENABLE(poldek, AS_HELP_STRING([--enable-poldek],[use the poldek backend]),enable_poldek=$enableval,enable_poldek=no)
+AC_ARG_ENABLE(portage, AS_HELP_STRING([--enable-portage],[use the portage backend]),enable_portage=$enableval,enable_portage=no)
 AC_ARG_ENABLE(razor, AS_HELP_STRING([--enable-razor],[use the razor backend]),enable_razor=$enableval,enable_razor=no)
 AC_ARG_ENABLE(smart, AS_HELP_STRING([--enable-smart],[use the SMART backend]),enable_smart=$enableval,enable_smart=no)
 AC_ARG_ENABLE(urpmi, AS_HELP_STRING([--enable-urpmi],[use the URPMI backend]),enable_urpmi=$enableval,enable_urpmi=no)
@@ -480,6 +481,7 @@ AM_CONDITIONAL(BACKEND_TYPE_DUMMY, [test x$enable_dummy = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_OPKG, [test x$enable_opkg = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_PISI, [test x$enable_pisi = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_POLDEK, [test x$enable_poldek = xyes])
+AM_CONDITIONAL(BACKEND_TYPE_PORTAGE, [test x$enable_portage = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_RAZOR, [test x$enable_razor = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_SMART, [test x$enable_smart = xyes])
 AM_CONDITIONAL(BACKEND_TYPE_URPMI, [test x$enable_urpmi = xyes])
@@ -630,6 +632,8 @@ if test x$with_default_backend = x; then
 		with_default_backend=urpmi
 	elif test -f /usr/bin/zypper ; then
 		with_default_backend=zypp
+	elif test -f /usr/bin/emerge ; then
+		with_default_backend=portage
 	else
 		with_default_backend=dummy
 	fi
@@ -765,6 +769,7 @@ backends/razor/Makefile
 backends/yum/Makefile
 backends/pisi/Makefile
 backends/poldek/Makefile
+backends/portage/Makefile
 backends/zypp/Makefile
 data/Makefile
 data/org.freedesktop.PackageKit.conf
@@ -826,6 +831,7 @@ echo "
         Razor backend:             ${enable_razor}
         PiSi backend:              ${enable_pisi}
         poldek backend:            ${enable_poldek}
+        Portage backend:           ${enable_portage}
         SMART backend:             ${enable_smart}
         URPMI backend:             ${enable_urpmi}
         YUM backend:               ${enable_yum}
commit da3c9e9e5ca200a7517bc7356fbbc6e968a018bf
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 19:18:37 2009 +0100

    Add three properties on the main interface with the runtime daemon versions

diff --git a/lib/packagekit-glib/pk-version.h.in b/lib/packagekit-glib/pk-version.h.in
index 46a92bf..8153d1e 100644
--- a/lib/packagekit-glib/pk-version.h.in
+++ b/lib/packagekit-glib/pk-version.h.in
@@ -28,9 +28,9 @@
 
 /* compile time version
  */
-#define PK_MAJOR_VERSION                               (@PK_MAJOR_VERSION@)
-#define PK_MINOR_VERSION                               (@PK_MINOR_VERSION@)
-#define PK_MICRO_VERSION                               (@PK_MICRO_VERSION@)
+#define PK_MAJOR_VERSION				(@PK_MAJOR_VERSION@)
+#define PK_MINOR_VERSION				(@PK_MINOR_VERSION@)
+#define PK_MICRO_VERSION				(@PK_MICRO_VERSION@)
 
 /* check whether a PackageKit version equal to or greater than
  * major.minor.micro.
diff --git a/src/org.freedesktop.PackageKit.xml b/src/org.freedesktop.PackageKit.xml
index 33e4499..ae6518f 100644
--- a/src/org.freedesktop.PackageKit.xml
+++ b/src/org.freedesktop.PackageKit.xml
@@ -14,6 +14,35 @@
     </doc:doc>
 
     <!--*****************************************************************************************-->
+    <property name="version-major" type="u" access="read">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            The major version number.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </property>
+    <property name="version-minor" type="u" access="read">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            The minor version number.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </property>
+    <property name="version-micro" type="u" access="read">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            The micro version number.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+    </property>
+
+    <!--*****************************************************************************************-->
     <method name="GetActions">
       <doc:doc>
         <doc:description>
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 5ac329d..63f1145 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -121,6 +121,14 @@ enum {
 	PK_ENGINE_LAST_SIGNAL
 };
 
+enum {
+	PROP_0,
+	PROP_VERSION_MAJOR,
+	PROP_VERSION_MINOR,
+	PROP_VERSION_MICRO,
+	PROP_LAST,
+};
+
 static guint	     signals [PK_ENGINE_LAST_SIGNAL] = { 0 };
 
 G_DEFINE_TYPE (PkEngine, pk_engine, G_TYPE_OBJECT)
@@ -631,17 +639,79 @@ out:
 }
 
 /**
+ * pk_engine_get_property:
+ **/
+static void
+pk_engine_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+	switch (prop_id) {
+	case PROP_VERSION_MAJOR:
+		g_value_set_uint (value, PK_MAJOR_VERSION);
+		break;
+	case PROP_VERSION_MINOR:
+		g_value_set_uint (value, PK_MINOR_VERSION);
+		break;
+	case PROP_VERSION_MICRO:
+		g_value_set_uint (value, PK_MICRO_VERSION);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
+ * pk_engine_set_property:
+ **/
+static void
+pk_engine_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+	switch (prop_id) {
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+/**
  * pk_engine_class_init:
  * @klass: The PkEngineClass
  **/
 static void
 pk_engine_class_init (PkEngineClass *klass)
 {
+	GParamSpec *pspec;
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
 	object_class->finalize = pk_engine_finalize;
-
-	/* set up signal that emits 'au' */
+	object_class->get_property = pk_engine_get_property;
+	object_class->set_property = pk_engine_set_property;
+
+	/**
+	 * PkEngine:version-major:
+	 */
+	pspec = g_param_spec_uint ("version-major", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_VERSION_MAJOR, pspec);
+
+	/**
+	 * PkEngine:version-minor:
+	 */
+	pspec = g_param_spec_uint ("version-minor", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_VERSION_MINOR, pspec);
+
+	/**
+	 * PkEngine:version-micro:
+	 */
+	pspec = g_param_spec_uint ("version-micro", NULL, NULL,
+				   0, G_MAXUINT, 0,
+				   G_PARAM_READWRITE);
+	g_object_class_install_property (object_class, PROP_VERSION_MICRO, pspec);
+
+	/* signals */
 	signals [PK_ENGINE_LOCKED] =
 		g_signal_new ("locked",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
commit 22c9b907106c1d43e82e1fcaf577ccfd858f5718
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 14:57:52 2009 +0100

    Add a PK_CHECK_VERSION macro

diff --git a/configure.ac b/configure.ac
index 89a351d..a381076 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,11 +1,27 @@
+# Copyright (C) 2007-2009 Richard Hughes <richard at hughsie.com>
 AC_PREREQ(2.52)
 
-AC_INIT(PackageKit, 0.4.8)
+m4_define([pk_major_version], [0])
+m4_define([pk_minor_version], [4])
+m4_define([pk_micro_version], [8])
+m4_define([pk_version],
+          [pk_major_version.pk_minor_version.pk_micro_version])
+
+AC_INIT(PackageKit, [pk_version])
 AC_CONFIG_SRCDIR(src)
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 AM_CONFIG_HEADER(config.h)
 AC_CONFIG_MACRO_DIR([m4])
 
+PK_MAJOR_VERSION=pk_major_version
+PK_MINOR_VERSION=pk_minor_version
+PK_MICRO_VERSION=pk_micro_version
+PK_VERSION=pk_version
+AC_SUBST(PK_MAJOR_VERSION)
+AC_SUBST(PK_MINOR_VERSION)
+AC_SUBST(PK_MICRO_VERSION)
+AC_SUBST(PK_VERSION)
+
 # Should we enable extra stuff automatically?
 # set no for release builds, yes for development builds
 DEVELOPMENT_RELEASE=yes
@@ -769,6 +785,7 @@ data/Makefile
 data/org.freedesktop.PackageKit.conf
 data/tests/Makefile
 lib/Makefile
+lib/packagekit-glib/pk-version.h
 lib/packagekit-glib/Makefile
 lib/packagekit-glib/packagekit-glib.pc
 lib/packagekit-qt/Makefile
diff --git a/lib/packagekit-glib/.gitignore b/lib/packagekit-glib/.gitignore
index c9d3c55..5d3c4af 100644
--- a/lib/packagekit-glib/.gitignore
+++ b/lib/packagekit-glib/.gitignore
@@ -13,4 +13,5 @@ pk-self-test
 *.txt
 *.out
 *.db
+pk-version.h
 
diff --git a/lib/packagekit-glib/Makefile.am b/lib/packagekit-glib/Makefile.am
index d32b1cc..07e3d67 100644
--- a/lib/packagekit-glib/Makefile.am
+++ b/lib/packagekit-glib/Makefile.am
@@ -33,6 +33,7 @@ libpackagekit_glib_includedir = $(includedir)/PackageKit/packagekit-glib
 
 libpackagekit_glib_include_HEADERS =				\
 	packagekit.h						\
+	pk-version.h						\
 	pk-desktop.h						\
 	pk-connection.h						\
 	pk-package-id.h						\
@@ -61,6 +62,7 @@ libpackagekit_glib_la_SOURCES =					\
 	egg-debug.h						\
 	egg-string.c						\
 	egg-string.h						\
+	pk-version.h						\
 	pk-marshal.c						\
 	pk-marshal.h						\
 	pk-desktop.c						\
@@ -151,6 +153,7 @@ endif
 
 EXTRA_DIST =							\
 	packagekit-glib.pc.in					\
+	pk-version.h.in						\
 	pk-marshal.list
 
 BUILT_SOURCES = 						\
diff --git a/lib/packagekit-glib/packagekit.h b/lib/packagekit-glib/packagekit.h
index 1818b86..a89e506 100644
--- a/lib/packagekit-glib/packagekit.h
+++ b/lib/packagekit-glib/packagekit.h
@@ -24,6 +24,7 @@
 
 #define __PACKAGEKIT_H_INSIDE__
 
+#include <packagekit-glib/pk-version.h>
 #include <packagekit-glib/pk-bitfield.h>
 #include <packagekit-glib/pk-catalog.h>
 #include <packagekit-glib/pk-category-obj.h>
diff --git a/lib/packagekit-glib/pk-version.h.in b/lib/packagekit-glib/pk-version.h.in
new file mode 100644
index 0000000..46a92bf
--- /dev/null
+++ b/lib/packagekit-glib/pk-version.h.in
@@ -0,0 +1,44 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2009 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.
+ */
+
+#if !defined (__PACKAGEKIT_H_INSIDE__) && !defined (PK_COMPILATION)
+#error "Only <packagekit.h> can be included directly."
+#endif
+
+#ifndef __PK_VERSION_H
+#define __PK_VERSION_H
+
+/* compile time version
+ */
+#define PK_MAJOR_VERSION                               (@PK_MAJOR_VERSION@)
+#define PK_MINOR_VERSION                               (@PK_MINOR_VERSION@)
+#define PK_MICRO_VERSION                               (@PK_MICRO_VERSION@)
+
+/* check whether a PackageKit version equal to or greater than
+ * major.minor.micro.
+ */
+#define PK_CHECK_VERSION(major,minor,micro)    \
+    (PK_MAJOR_VERSION > (major) || \
+     (PK_MAJOR_VERSION == (major) && PK_MINOR_VERSION > (minor)) || \
+     (PK_MAJOR_VERSION == (major) && PK_MINOR_VERSION == (minor) && \
+      PK_MICRO_VERSION >= (micro)))
+
+#endif /* __PK_VERSION_H */
commit 76903972eefba8c8df28c93522f7201d88b205d5
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:36:28 2009 +0100

    Add some self tests to PkEngine to ensure that the signals are being sent correctly

diff --git a/src/pk-engine.c b/src/pk-engine.c
index 3bb4963..5ac329d 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -893,14 +893,93 @@ pk_engine_new (void)
 #ifdef EGG_TEST
 #include "egg-test.h"
 
+static PkNotify *notify = NULL;
+static gboolean _quit = FALSE;
+static gboolean _locked = FALSE;
+static gboolean _restart_schedule = FALSE;
+
+/**
+ * pk_test_quit_cb:
+ **/
+static void
+pk_test_quit_cb (PkEngine *engine, EggTest *test)
+{
+	_quit = TRUE;
+}
+
+/**
+ * pk_test_locked_cb:
+ **/
+static void
+pk_test_locked_cb (PkEngine *engine, gboolean is_locked, EggTest *test)
+{
+	_locked = is_locked;
+}
+
+/**
+ * pk_test_updates_changed_cb:
+ **/
+static void
+pk_test_updates_changed_cb (PkEngine *engine, EggTest *test)
+{
+	egg_test_loop_quit (test);
+}
+
+/**
+ * pk_test_repo_list_changed_cb:
+ **/
+static void
+pk_test_repo_list_changed_cb (PkEngine *engine, EggTest *test)
+{
+	egg_test_loop_quit (test);
+}
+
+/**
+ * pk_test_restart_schedule_cb:
+ **/
+static void
+pk_test_restart_schedule_cb (PkEngine *engine, EggTest *test)
+{
+	_restart_schedule = TRUE;
+	egg_test_loop_quit (test);
+}
+
+/**
+ * pk_test_emit_updates_changed_cb:
+ **/
+static gboolean
+pk_test_emit_updates_changed_cb (EggTest *test)
+{
+	PkNotify *notify2;
+	notify2 = pk_notify_new ();
+	pk_notify_updates_changed (notify2);
+	g_object_unref (notify2);
+	return FALSE;
+}
+
+/**
+ * pk_test_emit_repo_list_changed_cb:
+ **/
+static gboolean
+pk_test_emit_repo_list_changed_cb (EggTest *test)
+{
+	PkNotify *notify2;
+	notify2 = pk_notify_new ();
+	pk_notify_repo_list_changed (notify2);
+	g_object_unref (notify2);
+	return FALSE;
+}
+
 void
 pk_engine_test (EggTest *test)
 {
 	gboolean ret;
 	PkEngine *engine;
 	PkBackend *backend;
+	PkInhibit *inhibit;
 	guint idle;
 	gchar *actions;
+	guint elapsed;
 
 	if (!egg_test_start (test, "PkEngine"))
 		return;
@@ -916,6 +995,11 @@ pk_engine_test (EggTest *test)
 	backend = pk_backend_new ();
 	egg_test_assert (test, backend != NULL);
 
+	/************************************************************/
+	egg_test_title (test, "get a notify instance");
+	notify = pk_notify_new ();
+	egg_test_assert (test, notify != NULL);
+
 	/* set the type, as we have no pk-main doing this for us */
 	/************************************************************/
 	egg_test_title (test, "set the backend name");
@@ -927,7 +1011,21 @@ pk_engine_test (EggTest *test)
 	engine = pk_engine_new ();
 	egg_test_assert (test, engine != NULL);
 
-	/************************************************************/
+	/* connect up signals */
+	g_signal_connect (engine, "quit",
+			  G_CALLBACK (pk_test_quit_cb), test);
+	g_signal_connect (engine, "locked",
+			  G_CALLBACK (pk_test_locked_cb), test);
+	g_signal_connect (engine, "updates-changed",
+			  G_CALLBACK (pk_test_updates_changed_cb), test);
+	g_signal_connect (engine, "repo-list-changed",
+			  G_CALLBACK (pk_test_repo_list_changed_cb), test);
+	g_signal_connect (engine, "restart-schedule",
+			  G_CALLBACK (pk_test_restart_schedule_cb), test);
+
+	/************************************************************
+	 **********           GET IDLE TIMES              ***********
+	 ************************************************************/
 	egg_test_title (test, "get idle at startup");
 	idle = pk_engine_get_seconds_idle (engine);
 	if (idle < 1)
@@ -956,7 +1054,93 @@ pk_engine_test (EggTest *test)
 	else
 		egg_test_failed (test, "idle = %i", idle);
 
+	/************************************************************
+	 **********        TEST PROXY NOTIFY              ***********
+	 ************************************************************/
+	egg_test_title (test, "force test notify updates-changed");
+	g_timeout_add (25, (GSourceFunc) pk_test_emit_updates_changed_cb, test);
+	egg_test_success (test, NULL);
+	egg_test_loop_wait (test, 50);
+	egg_test_loop_check (test);
+
+	/************************************************************/
+	egg_test_title (test, "force test notify repo-list-changed");
+	g_timeout_add (25, (GSourceFunc) pk_test_emit_repo_list_changed_cb, test);
+	egg_test_success (test, NULL);
+	egg_test_loop_wait (test, 50);
+	egg_test_loop_check (test);
+
+	/************************************************************/
+	egg_test_title (test, "force test notify wait updates-changed");
+	pk_notify_wait_updates_changed (notify, 500);
+	egg_test_loop_wait (test, 1000);
+	elapsed = egg_test_elapsed (test);
+	if (elapsed > 400 && elapsed < 600)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "failed to quit (%i)", elapsed);
+
+	/************************************************************
+	 **********               LOCKING                 ***********
+	 ************************************************************/
+	egg_test_title (test, "test locked");
+	inhibit = pk_inhibit_new ();
+	pk_inhibit_add (inhibit, GUINT_TO_POINTER (999));
+	if (_locked)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "not locked");
+
+	/************************************************************/
+	egg_test_title (test, "test locked");
+	pk_inhibit_remove (inhibit, GUINT_TO_POINTER (999));
+	if (!_locked)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "not locked");
+	g_object_unref (inhibit);
+
+	/************************************************************/
+	egg_test_title (test, "test not locked");
+	if (!_locked)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "still locked");
+
+	/************************************************************
+	 **********          BINARY UPGRADE TEST          ***********
+	 ************************************************************/
+	egg_test_title_assert (test, "restart_schedule not set", !_restart_schedule);
+	ret = g_file_set_contents (SBINDIR "/packagekitd", "overwrite", -1, NULL);
+
+	/************************************************************/
+	egg_test_title_assert (test, "touched binary file", ret);
+	egg_test_loop_wait (test, 5000);
+
+	/************************************************************/
+	egg_test_title (test, "get idle after we touched the binary");
+	idle = pk_engine_get_seconds_idle (engine);
+	if (idle == G_MAXUINT)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "idle = %i", idle);
+
+	/************************************************************/
+	egg_test_title_assert (test, "restart_schedule set", _restart_schedule);
+
+	/************************************************************
+	 **********             DAEMON QUIT               ***********
+	 ************************************************************/
+	egg_test_title_assert (test, "not already quit", !_quit);
+	egg_test_title (test, "suggest quit with no transactions (should get quit signal)");
+	pk_engine_suggest_daemon_quit (engine, NULL);
+	if (_quit)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "did not quit");
+
 	g_object_unref (backend);
+	g_object_unref (notify);
 	g_object_unref (engine);
 
 	egg_test_end (test);
commit 95bae5d929c07d6350028a63fc532d9fc1f16d68
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:34:31 2009 +0100

    Fix the logic of ::RestartSchedule and don't make changing the config file prompt the session to reload

diff --git a/src/pk-engine.c b/src/pk-engine.c
index 4c42e71..3bb4963 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -88,7 +88,8 @@ static void     pk_engine_finalize	(GObject       *object);
 struct PkEnginePrivate
 {
 	GTimer			*timer;
-	gboolean		 restart_schedule;
+	gboolean		 notify_clients_of_upgrade;
+	gboolean		 shutdown_as_soon_as_possible;
 	PkTransactionList	*transaction_list;
 	PkTransactionDb		*transaction_db;
 	PkCache			*cache;
@@ -99,7 +100,8 @@ struct PkEnginePrivate
 	PkSecurity		*security;
 	PkNotify		*notify;
 	PkConf			*conf;
-	PkFileMonitor		*file_monitor;
+	PkFileMonitor		*file_monitor_conf;
+	PkFileMonitor		*file_monitor_binary;
 	PkBitfield		 actions;
 	PkBitfield		 groups;
 	PkBitfield		 filters;
@@ -530,12 +532,18 @@ pk_engine_get_seconds_idle (PkEngine *engine)
 	}
 
 	/* have we been updated? */
-	if (engine->priv->restart_schedule) {
-		egg_debug ("need to restart daemon *NOW*");
+	if (engine->priv->notify_clients_of_upgrade) {
+		egg_debug ("emitting restart-schedule because of binary change");
 		g_signal_emit (engine, signals [PK_ENGINE_RESTART_SCHEDULE], 0);
 		return G_MAXUINT;
 	}
 
+	/* do we need to shutdown quickly */
+	if (engine->priv->shutdown_as_soon_as_possible) {
+		egg_debug ("need to restart daemon asap");
+		return G_MAXUINT;
+	}
+
 	idle = (guint) g_timer_elapsed (engine->priv->timer, NULL);
 	return idle;
 }
@@ -561,7 +569,7 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
 	/* This will wait from 0..10 seconds, depending on the status of
 	 * pk_main_timeout_check_cb() - usually it should be a few seconds
 	 * after the last transaction */
-	engine->priv->restart_schedule = TRUE;
+	engine->priv->shutdown_as_soon_as_possible = TRUE;
 	return TRUE;
 }
 
@@ -674,14 +682,27 @@ pk_engine_class_init (PkEngineClass *klass)
 }
 
 /**
- * pk_engine_file_monitor_changed_cb:
+ * pk_engine_conf_file_changed_cb:
+ *
+ * A config file has changed, we need to reload the daemon
+ **/
+static void
+pk_engine_conf_file_changed_cb (PkFileMonitor *file_monitor, PkEngine *engine)
+{
+	g_return_if_fail (PK_IS_ENGINE (engine));
+	egg_debug ("setting shutdown_as_soon_as_possible TRUE");
+	engine->priv->shutdown_as_soon_as_possible = TRUE;
+}
+
+/**
+ * pk_engine_binary_file_changed_cb:
  **/
 static void
-pk_engine_file_monitor_changed_cb (PkFileMonitor *file_monitor, PkEngine *engine)
+pk_engine_binary_file_changed_cb (PkFileMonitor *file_monitor, PkEngine *engine)
 {
 	g_return_if_fail (PK_IS_ENGINE (engine));
-	egg_debug ("setting restart_schedule TRUE");
-	engine->priv->restart_schedule = TRUE;
+	egg_debug ("setting notify_clients_of_upgrade TRUE");
+	engine->priv->notify_clients_of_upgrade = TRUE;
 }
 
 /**
@@ -710,7 +731,8 @@ pk_engine_init (PkEngine *engine)
 	gchar *proxy_ftp;
 
 	engine->priv = PK_ENGINE_GET_PRIVATE (engine);
-	engine->priv->restart_schedule = FALSE;
+	engine->priv->notify_clients_of_upgrade = FALSE;
+	engine->priv->shutdown_as_soon_as_possible = FALSE;
 	engine->priv->mime_types = NULL;
 
 	/* use the config file */
@@ -769,13 +791,19 @@ pk_engine_init (PkEngine *engine)
 			  G_CALLBACK (pk_engine_notify_updates_changed_cb), engine);
 
 	/* monitor the config file for changes */
-	engine->priv->file_monitor = pk_file_monitor_new ();
+	engine->priv->file_monitor_conf = pk_file_monitor_new ();
 	filename = pk_conf_get_filename ();
-	pk_file_monitor_set_file (engine->priv->file_monitor, filename);
-	g_signal_connect (engine->priv->file_monitor, "file-changed",
-			  G_CALLBACK (pk_engine_file_monitor_changed_cb), engine);
+	pk_file_monitor_set_file (engine->priv->file_monitor_conf, filename);
+	g_signal_connect (engine->priv->file_monitor_conf, "file-changed",
+			  G_CALLBACK (pk_engine_conf_file_changed_cb), engine);
 	g_free (filename);
 
+	/* monitor the binary file for changes */
+	engine->priv->file_monitor_binary = pk_file_monitor_new ();
+	pk_file_monitor_set_file (engine->priv->file_monitor_binary, SBINDIR "/packagekitd");
+	g_signal_connect (engine->priv->file_monitor_binary, "file-changed",
+			  G_CALLBACK (pk_engine_binary_file_changed_cb), engine);
+
 	/* set the proxy */
 	proxy_http = pk_conf_get_string (engine->priv->conf, "ProxyHTTP");
 	proxy_ftp = pk_conf_get_string (engine->priv->conf, "ProxyFTP");
@@ -829,7 +857,8 @@ pk_engine_finalize (GObject *object)
 
 	/* compulsory gobjects */
 	g_timer_destroy (engine->priv->timer);
-	g_object_unref (engine->priv->file_monitor);
+	g_object_unref (engine->priv->file_monitor_conf);
+	g_object_unref (engine->priv->file_monitor_binary);
 	g_object_unref (engine->priv->inhibit);
 	g_object_unref (engine->priv->transaction_list);
 	g_object_unref (engine->priv->transaction_db);
commit 1cac7e5546d47e75553ad2209ef042313e473a2d
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:34:00 2009 +0100

    Be more forgiving in the self test when checking the time to create a TID

diff --git a/src/pk-transaction-db.c b/src/pk-transaction-db.c
index 39b1d41..c2dbacd 100644
--- a/src/pk-transaction-db.c
+++ b/src/pk-transaction-db.c
@@ -801,7 +801,7 @@ pk_transaction_db_test (EggTest *test)
 	egg_test_title (test, "get an tid object");
 	tid = pk_transaction_db_generate_id (db);
 	ms = egg_test_elapsed (test);
-	if (ms < 5)
+	if (ms < 10)
 		egg_test_success (test, "acceptable time %ims", ms);
 	else
 		egg_test_failed (test, "took a long time: %ims", ms);
commit 53e18773b5a41213d1a7dead6d8e9303000109fb
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:29:51 2009 +0100

    Don't proxy RestartSchedule to PkNotify, only the daemon uses it

diff --git a/src/pk-engine.c b/src/pk-engine.c
index d2a8f37..4c42e71 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -214,17 +214,6 @@ pk_engine_notify_repo_list_changed_cb (PkNotify *notify, PkEngine *engine)
 }
 
 /**
- * pk_engine_notify_restart_schedule_cb:
- **/
-static void
-pk_engine_notify_restart_schedule_cb (PkNotify *notify, PkEngine *engine)
-{
-	g_return_if_fail (PK_IS_ENGINE (engine));
-	egg_debug ("emitting restart-schedule");
-	g_signal_emit (engine, signals [PK_ENGINE_RESTART_SCHEDULE], 0);
-}
-
-/**
  * pk_engine_notify_updates_changed_cb:
  **/
 static void
@@ -543,7 +532,7 @@ pk_engine_get_seconds_idle (PkEngine *engine)
 	/* have we been updated? */
 	if (engine->priv->restart_schedule) {
 		egg_debug ("need to restart daemon *NOW*");
-		pk_notify_restart_schedule (engine->priv->notify);
+		g_signal_emit (engine, signals [PK_ENGINE_RESTART_SCHEDULE], 0);
 		return G_MAXUINT;
 	}
 
@@ -774,8 +763,6 @@ pk_engine_init (PkEngine *engine)
 
 	/* add the interface */
 	engine->priv->notify = pk_notify_new ();
-	g_signal_connect (engine->priv->notify, "restart-schedule",
-			  G_CALLBACK (pk_engine_notify_restart_schedule_cb), engine);
 	g_signal_connect (engine->priv->notify, "repo-list-changed",
 			  G_CALLBACK (pk_engine_notify_repo_list_changed_cb), engine);
 	g_signal_connect (engine->priv->notify, "updates-changed",
diff --git a/src/pk-notify.c b/src/pk-notify.c
index 774baa7..2ff39be 100644
--- a/src/pk-notify.c
+++ b/src/pk-notify.c
@@ -47,7 +47,6 @@ struct PkNotifyPrivate
 
 enum {
 	PK_NOTIFY_REPO_LIST_CHANGED,
-	PK_NOTIFY_RESTART_SCHEDULE,
 	PK_NOTIFY_UPDATES_CHANGED,
 	PK_NOTIFY_LAST_SIGNAL
 };
@@ -58,19 +57,6 @@ static guint signals [PK_NOTIFY_LAST_SIGNAL] = { 0 };
 G_DEFINE_TYPE (PkNotify, pk_notify, G_TYPE_OBJECT)
 
 /**
- * pk_notify_restart_schedule:
- **/
-gboolean
-pk_notify_restart_schedule (PkNotify *notify)
-{
-	g_return_val_if_fail (PK_IS_NOTIFY (notify), FALSE);
-
-	egg_debug ("emitting restart-schedule");
-	g_signal_emit (notify, signals [PK_NOTIFY_RESTART_SCHEDULE], 0);
-	return TRUE;
-}
-
-/**
  * pk_notify_repo_list_changed:
  **/
 gboolean
@@ -157,11 +143,6 @@ pk_notify_class_init (PkNotifyClass *klass)
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
 	object_class->finalize = pk_notify_finalize;
 
-	signals [PK_NOTIFY_RESTART_SCHEDULE] =
-		g_signal_new ("restart-schedule",
-			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
-			      G_TYPE_NONE, 0);
 	signals [PK_NOTIFY_REPO_LIST_CHANGED] =
 		g_signal_new ("repo-list-changed",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
diff --git a/src/pk-notify.h b/src/pk-notify.h
index d941690..52661cd 100644
--- a/src/pk-notify.h
+++ b/src/pk-notify.h
@@ -53,7 +53,6 @@ gboolean	 pk_notify_repo_list_changed	(PkNotify	*notify);
 gboolean	 pk_notify_updates_changed	(PkNotify	*notify);
 gboolean	 pk_notify_wait_updates_changed	(PkNotify	*notify,
 						 guint		 timeout);
-gboolean	 pk_notify_restart_schedule	(PkNotify	*notify);
 
 G_END_DECLS
 
commit 77b855c1a2ffd1bc4406c0e0cff6c757a496a795
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:25:13 2009 +0100

    When we do SuggestDaemonQuit with no transactions, exit the daemon using the mainloop rather than just doing exit()

diff --git a/src/pk-engine.c b/src/pk-engine.c
index e5190a7..d2a8f37 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -115,6 +115,7 @@ enum {
 	PK_ENGINE_NETWORK_STATE_CHANGED,
 	PK_ENGINE_RESTART_SCHEDULE,
 	PK_ENGINE_UPDATES_CHANGED,
+	PK_ENGINE_QUIT,
 	PK_ENGINE_LAST_SIGNAL
 };
 
@@ -563,8 +564,8 @@ pk_engine_suggest_daemon_quit (PkEngine *engine, GError **error)
 	/* can we exit straight away */
 	size = pk_transaction_list_get_size (engine->priv->transaction_list);
 	if (size == 0) {
-		egg_warning ("exit!!");
-		exit (0);
+		egg_debug ("emitting quit");
+		g_signal_emit (engine, signals [PK_ENGINE_QUIT], 0);
 		return TRUE;
 	}
 
@@ -674,6 +675,11 @@ pk_engine_class_init (PkEngineClass *klass)
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
 			      0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE, 0);
+	signals [PK_ENGINE_QUIT] =
+		g_signal_new ("quit",
+			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
+			      0, NULL, NULL, g_cclosure_marshal_VOID__VOID,
+			      G_TYPE_NONE, 0);
 
 	g_type_class_add_private (klass, sizeof (PkEnginePrivate));
 }
diff --git a/src/pk-main.c b/src/pk-main.c
index d5853f9..f022aa2 100644
--- a/src/pk-main.c
+++ b/src/pk-main.c
@@ -146,6 +146,16 @@ pk_main_timeout_check_cb (PkEngine *engine)
 }
 
 /**
+ * pk_main_quit_cb:
+ **/
+static void
+pk_main_quit_cb (PkEngine *engine, GMainLoop *mainloop)
+{
+	egg_debug ("engine quit");
+	g_main_loop_quit (mainloop);
+}
+
+/**
  * pk_main_sigint_handler:
  **/
 static void
@@ -309,8 +319,12 @@ main (int argc, char *argv[])
 	if (!ret)
 		egg_error ("cannot continue, backend invalid");
 
+	loop = g_main_loop_new (NULL, FALSE);
+
 	/* create a new engine object */
 	engine = pk_engine_new ();
+	g_signal_connect (engine, "quit",
+			  G_CALLBACK (pk_main_quit_cb), loop);
 
 	if (!pk_object_register (system_connection, G_OBJECT (engine), &error)) {
 		/* TRANSLATORS: cannot register on system bus, unknown reason */
@@ -319,8 +333,6 @@ main (int argc, char *argv[])
 		goto out;
 	}
 
-	loop = g_main_loop_new (NULL, FALSE);
-
 	/* Only timeout and close the mainloop if we have specified it
 	 * on the command line */
 	if (timed_exit)
@@ -334,13 +346,14 @@ main (int argc, char *argv[])
 	if (immediate_exit)
 		g_timeout_add (50, (GSourceFunc) timed_exit_cb, loop);
 
+	/* run until quit */
 	g_main_loop_run (loop);
-	g_main_loop_unref (loop);
 
 out:
 	/* log the shutdown */
 	pk_syslog_add (syslog, PK_SYSLOG_TYPE_INFO, "daemon quit");
 
+	g_main_loop_unref (loop);
 	g_object_unref (syslog);
 	g_object_unref (conf);
 	g_object_unref (engine);
commit 310a9afa3f4676027e009ab79139f206e76eb595
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 10:20:35 2009 +0100

    Clarify the gtk-doc markup for PkControl::restart-schedule

diff --git a/lib/packagekit-glib/pk-control.c b/lib/packagekit-glib/pk-control.c
index 2ab5a42..721b575 100644
--- a/lib/packagekit-glib/pk-control.c
+++ b/lib/packagekit-glib/pk-control.c
@@ -879,11 +879,13 @@ pk_control_class_init (PkControlClass *klass)
 			      NULL, NULL, g_cclosure_marshal_VOID__UINT,
 			      G_TYPE_NONE, 1, G_TYPE_UINT);
 	/**
-	 * PkControl::restart_schedule:
+	 * PkControl::restart-schedule:
 	 * @control: the #PkControl instance that emitted the signal
 	 *
-	 * The ::restart_schedule signal is emitted when the service has been
-	 * restarted. Client programs should reload themselves.
+	 * The ::restart_schedule signal is emitted when the packagekitd service
+	 * has been restarted because it has been upgraded.
+	 * Client programs should reload themselves when it is convenient to
+	 * do so, as old client tools may not be compatable with the new daemon.
 	 **/
 	signals [PK_CONTROL_RESTART_SCHEDULE] =
 		g_signal_new ("restart-schedule",
commit 3f077261c4f63b288ee308c15639b74dc27d0096
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 08:49:27 2009 +0100

    Add a trivial script to update the LINGUAS for me

diff --git a/po/update-linguas.sh b/po/update-linguas.sh
new file mode 100755
index 0000000..d0224d4
--- /dev/null
+++ b/po/update-linguas.sh
@@ -0,0 +1 @@
+ls *.po | cut -d. -f1 > LINGUAS 
commit 5d8c5c135ff206216ab9cf1a7a3a6421f9a0c62e
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu May 14 08:48:59 2009 +0100

    Update LINGUAS with the new translations

diff --git a/po/LINGUAS b/po/LINGUAS
index 42c547c..ce23a3f 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,3 +1,4 @@
+as
 bn_IN
 ca
 cs
@@ -12,11 +13,13 @@ gu
 he
 hu
 it
+kn
 ml
 mr
 ms
 nb
 nl
+or
 pa
 pl
 pt_BR
@@ -27,6 +30,9 @@ sk
 sr at latin
 sr
 sv
+ta
+te
+th
 tr
 zh_CN
 zh_TW
commit 58e89258a133455c5134624f8b2911cf79a33a1f
Author: willwill <willwill at fedoraproject.org>
Date:   Thu May 14 01:13:43 2009 +0000

    Sending translation for po/th.po

diff --git a/po/th.po b/po/th.po
new file mode 100644
index 0000000..f9f3b38
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,411 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2008-11-09 12:10+0000\n"
+"PO-Revision-Date: 2008-12-05 18:14+0700\n"
+"Last-Translator: Manatsawin <whs at whsgroup.ath.cx>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Pootle 1.1.0\n"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:1
+msgid "Accept EULA"
+msgstr "ยอมรับข้อตกลงสัญญาอนุญาต"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:2
+msgid "Authentication is required to accept a EULA"
+msgstr "ต้องยึนยันตัวเพื่อยอมรับข้อตกลงสัญญาอนุญาต"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:3
+msgid "Authentication is required to change software source parameters"
+msgstr "ต้องยึนยันตัวเพื่อเปลี่ยนแปลงพารามิเตอร์คลังซอฟต์แวร์"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:4
+msgid "Authentication is required to install a local file"
+msgstr "ต้องยึนยันตัวเพื่อติดตั้งไฟล์บนเครื่อง"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:5
+msgid "Authentication is required to install a package"
+msgstr "ต้องยึนยันตัวเพื่อติดตั้งแพคเกจ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:6
+msgid "Authentication is required to install a security signature"
+msgstr "ต้องยึนยันตัวเพื่อติดตั้งลายเซ็นรับรองความปลอดภัย"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:7
+msgid "Authentication is required to refresh the package lists"
+msgstr "ต้องยึนยันตัวเพื่อเรียกรายการแพคเกจใหม่"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:8
+msgid "Authentication is required to remove packages"
+msgstr "ต้องยึนยันตัวเพื่อถอดแพคเกจ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:9
+msgid "Authentication is required to rollback a transaction"
+msgstr "ต้องยึนยันตัวเพื่อยกเลิกการดำเนินการ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:10
+msgid "Authentication is required to update all packages"
+msgstr "ต้องยึนยันตัวเพื่ออัปเดตแพคเกจทั้งหมด"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:11
+msgid "Authentication is required to update packages"
+msgstr "ต้องยึนยันตัวเพื่ออัปเดตแพคเกจ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:12
+msgid "Change software source parameters"
+msgstr "เปลี่ยนแปลงพารามิเตอร์คลังซอฟต์แวร์"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:13
+msgid "Further authentication is required to install an untrusted local file"
+msgstr "ต้องยึนยันตัวเพื่อติดตั้งไฟล์ที่ไม่น่าเชื่อถือบนเครื่อง"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:14
+msgid "Install local file"
+msgstr "ติดตั้งแพคเกจบนเครื่อง"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:15
+msgid "Install package"
+msgstr "ติดตั้งแพคเกจ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:16
+msgid "Install security signature"
+msgstr "ติดตั้งลายเซ็นรับรองความปลอดภัย"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:17
+msgid "Install untrusted local file"
+msgstr "ติดตั้งไฟล์ที่ไม่น่าเชื่อถือบนเครื่อง"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:18
+msgid "Refresh package lists"
+msgstr "เรียกรายการแพคเกจใหม่"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:19
+msgid "Remove package"
+msgstr "ถอดแพคเกจ"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:20
+msgid "Rollback to a previous transaction"
+msgstr "ถอยกลับไปยังการดำเนินการก่อนหน้า"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:21
+msgid "Update all packages"
+msgstr "อัปเดตแพคเกจทั้งหมด"
+
+#: ../policy/org.freedesktop.packagekit.policy.in.h:22
+msgid "Update package"
+msgstr "อัปเดตแพคเกจ"
+
+#: ../client/pk-console.c:224
+msgid "Update detail"
+msgstr "รายละเอียดการอัปเดต"
+
+#: ../client/pk-console.c:425
+msgid "A system restart is required"
+msgstr "ต้องเริ่มต้นระบบใหม่"
+
+#: ../client/pk-console.c:427
+msgid "A logout and login is required"
+msgstr "ต้องออกจากระบบและเข้าสู่ระบบใหม่"
+
+#: ../client/pk-console.c:429
+msgid "An application restart is required"
+msgstr "ต้องเริ่มต้นโปรแกรมใหม่"
+
+#: ../client/pk-console.c:474
+#, c-format
+msgid "Please enter a number from 1 to %i: "
+msgstr "กรุณาป้อนตัวเลขจาก 1 ถึง %i: "
+
+#: ../client/pk-console.c:524
+msgid "Could not find a package match"
+msgstr "ไม่สามารถหาแพคเกจที่ตรงกันได้"
+
+#: ../client/pk-console.c:538
+msgid "There are multiple package matches"
+msgstr "มีแพคเกจที่ตรงกันหลายตัว"
+
+#. find out what package the user wants to use
+#: ../client/pk-console.c:545
+msgid "Please enter the package number: "
+msgstr "กรุณาป้อนหมายเลขแพคเกจ: "
+
+#: ../client/pk-console.c:561
+msgid ""
+"Could not find a package with that name to install, or package already "
+"installed"
+msgstr ""
+"ไม่สามารถค้นหาแพคเกจชื่อดังกล่าวเพื่อติดตั้ง "
+"หรือแพคเกจดังกล่าวถูกติดตั้งไว้อยู่แล้ว"
+
+#: ../client/pk-console.c:643
+msgid "Could not find a package with that name to remove"
+msgstr "ไม่สามารถค้นหาแพคเกจดังกล่าวเพื่อถอดถอน"
+
+#: ../client/pk-console.c:683
+msgid "The following packages have to be removed"
+msgstr "แพคเกจต่อไปนี้จะถูกถอดถอน"
+
+#. get user input
+#: ../client/pk-console.c:692
+msgid "Okay to remove additional packages?"
+msgstr "ต้องการถอดแพคเกจเพิ่มเติม?"
+
+#: ../client/pk-console.c:696
+msgid "Cancelled!"
+msgstr "ถูกยกเลิก!"
+
+#: ../client/pk-console.c:718
+msgid "Could not find a package with that name to update"
+msgstr "ไม่สามารถค้นหาแพคเกจชื่อดังกล่าวเพื่ออัปเดต"
+
+#: ../client/pk-console.c:736
+msgid "Could not find what packages require this package"
+msgstr "ไม่สามารถค้นหาแพคเกจที่ต้องการแพคเกจนี้"
+
+#: ../client/pk-console.c:754
+msgid "Could not get dependencies for this package"
+msgstr "ไม่สามารถค้นหารายการพึ่งพาแพคเกจสำหรับแพคเกจนี้"
+
+#: ../client/pk-console.c:772
+msgid "Could not find details for this package"
+msgstr "ไม่สามารถค้นหารายละเอียดแพคเกจนี้"
+
+#: ../client/pk-console.c:790
+#, c-format
+msgid "Could not find the files for this package"
+msgstr "ไม่สามารถค้นหาไฟล์สำหรับแพคเกจนี้"
+
+#: ../client/pk-console.c:870
+msgid "Package description"
+msgstr "รายละเอียดแพคเกจ"
+
+#: ../client/pk-console.c:893
+msgid "Package files"
+msgstr "ไฟล์แพคเกจ"
+
+#: ../client/pk-console.c:901
+msgid "No files"
+msgstr "ไม่มีไฟล์"
+
+#. get user input
+#: ../client/pk-console.c:933
+msgid "Okay to import key?"
+msgstr "ต้องการนำเข้ากุญแจ?"
+
+#: ../client/pk-console.c:936
+msgid "Did not import key"
+msgstr "ไม่ได้นำเข้ากุญแจ"
+
+#. get user input
+#: ../client/pk-console.c:976
+msgid "Do you agree?"
+msgstr "ยอมรับข้อความข้างต้น?"
+
+#: ../client/pk-console.c:979
+msgid "Did not agree to licence, task will fail"
+msgstr "ไม่ยอมรับข้อตกลงสัญญาอนุญาต งานที่ทำจะล้มเหลว"
+
+#: ../client/pk-console.c:1008
+msgid "The daemon crashed mid-transaction!"
+msgstr "ดีมอนขัดข้องระหว่างกระบวนการ!"
+
+#. header
+#: ../client/pk-console.c:1061
+msgid "PackageKit Console Interface"
+msgstr "ส่วนติดต่อบนคอนโซลของ PackageKit"
+
+#: ../client/pk-console.c:1061
+msgid "Subcommands:"
+msgstr "คำสั่งย่อย:"
+
+#: ../client/pk-console.c:1165 ../client/pk-monitor.c:104 ../src/pk-main.c:189
+msgid "Show extra debugging information"
+msgstr "แสดงข้อมูลเพิ่มเติมสำหรับดีบั๊ก"
+
+#: ../client/pk-console.c:1167 ../client/pk-monitor.c:106
+msgid "Show the program version and exit"
+msgstr "แสดงรุ่นของโปรแกรมแล้วออก"
+
+#: ../client/pk-console.c:1169
+msgid "Set the filter, e.g. installed"
+msgstr "ตั้งตัวกรอง เช่น ติดตั้งไว้แล้ว"
+
+#: ../client/pk-console.c:1171
+msgid "Exit without waiting for actions to complete"
+msgstr "ออกโดยไม่ต้องรอกระบวนการให้เสร็จสิ้น"
+
+#: ../client/pk-console.c:1194
+msgid "Could not connect to system DBUS."
+msgstr "ไม่สามารถต่อกับ DBUS ของระบบ"
+
+#: ../client/pk-console.c:1288
+#, c-format
+msgid "You need to specify a search type"
+msgstr "คุณต้องระบุชนิดการค้นหา"
+
+#: ../client/pk-console.c:1293 ../client/pk-console.c:1300
+#: ../client/pk-console.c:1307 ../client/pk-console.c:1314
+#: ../client/pk-console.c:1421 ../client/pk-console.c:1428
+#: ../client/pk-console.c:1435 ../client/pk-console.c:1442
+#, c-format
+msgid "You need to specify a search term"
+msgstr "คุณต้องระบุคำค้นหา"
+
+#: ../client/pk-console.c:1319
+#, c-format
+msgid "Invalid search type"
+msgstr "ชนิดการค้นหาไม่ถูกต้อง"
+
+#: ../client/pk-console.c:1324
+#, c-format
+msgid "You need to specify a package or file to install"
+msgstr "คุณต้องระบุแพคเกจหรือไฟล์ที่จะติดตั้ง"
+
+#: ../client/pk-console.c:1339
+#, c-format
+msgid "You need to specify a type, key_id and package_id"
+msgstr "คุณต้องระบุชนิด, key_id และ package_id"
+
+#: ../client/pk-console.c:1346
+#, c-format
+msgid "You need to specify a package to remove"
+msgstr "คุณต้องระบุแพคเกจที่จะถอดถอน"
+
+#: ../client/pk-console.c:1353
+#, c-format
+msgid "You need to specify a eula-id"
+msgstr "คุณต้องระบุ eula-id"
+
+#: ../client/pk-console.c:1369
+#, c-format
+#, fuzzy
+msgid "You need to specify a package name to resolve"
+msgstr "คุณต้องระบุชื่อแพคเกจที่จะแยกแยะ"
+
+#: ../client/pk-console.c:1376 ../client/pk-console.c:1383
+#, c-format
+msgid "You need to specify a repo name"
+msgstr "คุณต้องระบุชื่อคลัง"
+
+#: ../client/pk-console.c:1390
+#, c-format
+msgid "You need to specify a repo name/parameter and value"
+msgstr "คุณต้องระบุชื่อคลัง/พารามิเตอร์และค่า"
+
+#: ../client/pk-console.c:1403
+#, c-format
+#, fuzzy
+msgid "You need to specify a time term"
+msgstr "คุณต้องระบุระยะเวลา"
+
+#: ../client/pk-console.c:1408
+#, c-format
+msgid "You need to specify a correct role"
+msgstr "คุณต้องระบุหน้าที่ที่ถูกต้อง"
+
+#: ../client/pk-console.c:1413
+#, c-format
+msgid "Failed to get last time"
+msgstr "ไม่สามารถหาเวลาล่าสุด"
+
+#: ../client/pk-console.c:1449
+#, c-format
+msgid "You need to specify a package to find the details for"
+msgstr "คุณต้องระบุแพคเกจที่จะค้นหารายละเอียด"
+
+#: ../client/pk-console.c:1456
+#, c-format
+msgid "You need to specify a package to find the files for"
+msgstr "คุณต้องระบุแพคเกจที่จะค้นหาไฟล์"
+
+#: ../client/pk-console.c:1503
+#, c-format
+msgid "Option '%s' not supported"
+msgstr "ไม่รองรับตัวเลือก '%s'"
+
+#: ../client/pk-console.c:1514
+msgid "Command failed"
+msgstr "คำสั่งล้มเหลว"
+
+#: ../client/pk-console.c:1518
+msgid "You don't have the necessary privileges for this operation"
+msgstr "คุณมีสิทธิไม่เพียงพอสำหรับกระบวนการนี้"
+
+#: ../client/pk-monitor.c:117
+msgid "PackageKit Monitor"
+msgstr "โปรแกรมเฝ้าสังเกต PackageKit"
+
+#: ../client/pk-import-desktop.c:293 ../client/pk-import-specspo.c:169
+#, c-format
+msgid "Could not open database: %s"
+msgstr "ไม่สามารถเปิดฐานข้อมูล: %s"
+
+#: ../client/pk-import-desktop.c:294 ../client/pk-import-specspo.c:170
+msgid "You probably need to run this program as the root user"
+msgstr "คุณอาจจะต้องรันโปรแกรมนี้เป็นผู้ใช้รูท"
+
+#: ../src/pk-main.c:83
+msgid "Startup failed due to security policies on this machine."
+msgstr "การเริ่มโปรแกรมไม่สำเร็จเนื่องจากนโยบายด้านความปลอดภัยบนเครื่องนี้"
+
+#: ../src/pk-main.c:84
+msgid "This can happen for two reasons:"
+msgstr "นี่อาจจะเกิดจากสองสาเหตุ:"
+
+# งงกับที่เค้าเขียนมาเหมือนกันครับ
+#: ../src/pk-main.c:85
+msgid "The correct user is not launching the executable (usually root)"
+msgstr "ผู้ใช้ที่ถูกต้องไม่ได้เรียกโปรแกรม (ปกติคือ root)"
+
+#: ../src/pk-main.c:86
+msgid ""
+"The org.freedesktop.PackageKit.conf file is not installed in the system /etc/"
+"dbus-1/system.d directory"
+msgstr ""
+"ไฟล์ org.freedesktop.PackageKit.conf file ไม่ได้ถูกติดตั้งในไดเรคทอรี "
+"/etc/dbus-1/system.d"
+
+#: ../src/pk-main.c:185
+msgid "Packaging backend to use, e.g. dummy"
+msgstr "แบ็คเอนด์ตัวจัดการแพคเกจที่จะใช้ เช่น dummy"
+
+#: ../src/pk-main.c:187
+msgid "Daemonize and detach from the terminal"
+msgstr "เปลี่ยนเป็นดีมอนและแยกตัวออกจากเทอร์มินัล"
+
+#: ../src/pk-main.c:191
+msgid "Disable the idle timer"
+msgstr "ปิดไทเมอร์ที่ไม่ใช้งาน"
+
+#: ../src/pk-main.c:193
+msgid "Show version and exit"
+msgstr "แสดงรุ่นแล้วออก"
+
+#: ../src/pk-main.c:195
+msgid "Exit after a small delay"
+msgstr "ออกหลังจากหน่วงเวลาเล็กน้อย"
+
+#: ../src/pk-main.c:197
+msgid "Exit after the engine has loaded"
+msgstr "ออกหลังจาก engine ถูกเรียกแล้ว"
+
+#: ../src/pk-main.c:207
+msgid "PackageKit service"
+msgstr "บริการ PackageKit"
+
+#: ../src/pk-main.c:233
+msgid "Cannot connect to the system bus"
+msgstr "ไม่สามารถติดต่อกับบัสระบบ"
+
+#: ../src/pk-main.c:273
+#, c-format
+msgid "Error trying to start: %s\n"
+msgstr "เกิดข้อผิดพลาดขณะจะเริ่ม: %s\n"


More information about the PackageKit-commit mailing list