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

Richard Hughes hughsient at kemper.freedesktop.org
Fri Sep 12 05:29:43 PDT 2008


 backends/smart/helpers/smartBackend.py           |  128 ++++++-
 backends/smart/pk-backend-smart.c                |    1 
 backends/urpmi/helpers/Makefile.am               |    1 
 backends/urpmi/helpers/get-depends.pl            |   35 +-
 backends/urpmi/helpers/get-details.pl            |   64 ++-
 backends/urpmi/helpers/get-distro-upgrades.pl    |  117 ++++++
 backends/urpmi/helpers/get-files.pl              |   52 ++-
 backends/urpmi/helpers/get-packages.pl           |   10 
 backends/urpmi/helpers/get-requires.pl           |   29 +
 backends/urpmi/helpers/get-update-detail.pl      |   71 +---
 backends/urpmi/helpers/get-updates.pl            |   13 
 backends/urpmi/helpers/install-packages.pl       |   10 
 backends/urpmi/helpers/perl_packagekit/enums.pm  |   18 +
 backends/urpmi/helpers/perl_packagekit/prints.pm |   17 +
 backends/urpmi/helpers/refresh-cache.pl          |   25 +
 backends/urpmi/helpers/remove-packages.pl        |   10 
 backends/urpmi/helpers/resolve.pl                |   49 +-
 backends/urpmi/helpers/search-details.pl         |   10 
 backends/urpmi/helpers/search-file.pl            |   10 
 backends/urpmi/helpers/search-group.pl           |   10 
 backends/urpmi/helpers/search-name.pl            |   10 
 backends/urpmi/helpers/update-packages.pl        |   10 
 backends/urpmi/helpers/update-system.pl          |   10 
 backends/urpmi/helpers/urpmi_backend/actions.pm  |   21 +
 backends/urpmi/helpers/urpmi_backend/filters.pm  |   11 
 backends/urpmi/helpers/urpmi_backend/groups.pm   |   11 
 backends/urpmi/helpers/urpmi_backend/open_db.pm  |   11 
 backends/urpmi/helpers/urpmi_backend/tools.pm    |   11 
 backends/urpmi/pk-backend-urpmi.c                |   42 ++
 backends/yum/Makefile.am                         |    1 
 backends/yum/yumBackend.py                       |   34 --
 backends/yum/yumDirect.py                        |   86 -----
 backends/yum/yumFilter.py                        |    6 
 backends/zypp/pk-backend-zypp.cpp                |   55 +++
 backends/zypp/zypp-utils.cpp                     |   22 +
 backends/zypp/zypp-utils.h                       |    5 
 client/pk-console.c                              |   18 -
 client/pk-generate-pack.c                        |   19 -
 client/pk-import-desktop.c                       |    1 
 client/pk-import-specspo.c                       |    2 
 client/pk-monitor.c                              |   16 
 configure.ac                                     |    3 
 contrib/PackageKit.spec.in                       |    2 
 contrib/packagekit-plugin/tests/test.html        |    2 
 contrib/udev/README                              |   27 +
 docs/html/Makefile.am                            |   18 -
 docs/html/img/Makefile.am                        |    2 
 docs/html/img/gpk-distro-upgrade-notify.png      |binary
 docs/html/img/gpk-signature.png                  |binary
 docs/html/img/pk-web-plugin.png                  |binary
 docs/html/pk-matrix.html                         |    4 
 docs/html/pk-reference.html                      |   36 ++
 docs/html/pk-screenshots.html                    |    9 
 libpackagekit/egg-dbus-monitor.c                 |    2 
 libpackagekit/pk-bitfield.c                      |  138 +++++---
 libpackagekit/pk-bitfield.h                      |    7 
 libpackagekit/pk-catalog.c                       |   28 +
 libpackagekit/pk-client.c                        |    7 
 libpackagekit/pk-client.h                        |    2 
 libpackagekit/pk-common.c                        |    1 
 libpackagekit/pk-control.h                       |    2 
 libpackagekit/pk-enum.c                          |    2 
 libpackagekit/pk-enum.h                          |    2 
 libpackagekit/pk-extra.c                         |   15 
 libpackagekit/pk-package-id.c                    |   55 ++-
 libpackagekit/pk-package-ids.c                   |   11 
 libpackagekit/pk-package-list.c                  |   47 ++
 libpackagekit/pk-package-obj.c                   |    6 
 libpackagekit/pk-self-test.c                     |    4 
 libpackagekit/pk-task-list.c                     |   97 +++--
 src/pk-backend-dbus.c                            |  129 ++-----
 src/pk-backend-spawn.c                           |   12 
 src/pk-backend.c                                 |    4 
 src/pk-engine.c                                  |    9 
 src/pk-inhibit.c                                 |   60 +--
 src/pk-main.c                                    |    9 
 src/pk-security-polkit.c                         |   31 -
 src/pk-spawn.c                                   |  123 +++----
 src/pk-spawn.h                                   |   15 
 src/pk-time.c                                    |    2 
 src/pk-transaction-list.c                        |  388 +++++++++++++++++------
 src/pk-transaction.c                             |  295 ++++++++++-------
 src/pk-update-detail-list.c                      |   13 
 83 files changed, 1812 insertions(+), 889 deletions(-)

New commits:
commit 710f6dd45385637ebcf2977f4c53cd09642cbd45
Merge: e8550f6... 1a9aadb...
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 12:51:32 2008 +0100

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

commit 1a9aadb6b7b385a2330994468d4817e878713b3b
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 13:44:03 2008 +0200

    pk-matrix.html update

diff --git a/docs/html/pk-matrix.html b/docs/html/pk-matrix.html
index c2935d7..e52507a 100644
--- a/docs/html/pk-matrix.html
+++ b/docs/html/pk-matrix.html
@@ -99,7 +99,7 @@
 <td><img src="img/status-bad.png" alt="[no]"/></td><!-- pisi -->
 <td><img src="img/status-bad.png" alt="[no]"/></td><!-- poldek -->
 <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
-<td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- urpmi -->
 <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
 <td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
 </tr>
commit 253e8816ecc2cd71ae62d78a6bc725b4cc421d3c
Merge: 4b2c702... 8a57758...
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 13:41:25 2008 +0200

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

commit 4b2c702ed76d0c7f707330cbf09c588a4e56727a
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 13:40:46 2008 +0200

    urpmi: added licence headers in get-distro-upgrades.pl

diff --git a/backends/urpmi/helpers/get-distro-upgrades.pl b/backends/urpmi/helpers/get-distro-upgrades.pl
index 8ccb428..e81ef3f 100755
--- a/backends/urpmi/helpers/get-distro-upgrades.pl
+++ b/backends/urpmi/helpers/get-distro-upgrades.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
commit beab5d37e01ea1072a6af753ece6712f5af2591f
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 13:40:01 2008 +0200

    urpmi: Trivial fix in get-distro-upgrades

diff --git a/backends/urpmi/helpers/get-distro-upgrades.pl b/backends/urpmi/helpers/get-distro-upgrades.pl
index f6988a1..8ccb428 100755
--- a/backends/urpmi/helpers/get-distro-upgrades.pl
+++ b/backends/urpmi/helpers/get-distro-upgrades.pl
@@ -2,6 +2,13 @@
 
 use strict;
 
+use lib;
+use File::Basename;
+
+BEGIN {
+  push @INC, dirname($0);
+}
+
 use perl_packagekit::prints;
 use perl_packagekit::enums;
 
commit a9f3c8bd380921e281109b46f4c84bde89ce232a
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 13:29:09 2008 +0200

    urpmi: get_distro_upgrades method implemented

diff --git a/backends/urpmi/helpers/Makefile.am b/backends/urpmi/helpers/Makefile.am
index 6289fa5..f71bab0 100644
--- a/backends/urpmi/helpers/Makefile.am
+++ b/backends/urpmi/helpers/Makefile.am
@@ -22,6 +22,7 @@ dist_helper_DATA = 						\
 	resolve.pl									\
 	update-packages.pl					\
 	update-system.pl						\
+	get-distro-upgrades.pl						\
 	$(NULL)
 
 install-data-hook:
diff --git a/backends/urpmi/helpers/get-distro-upgrades.pl b/backends/urpmi/helpers/get-distro-upgrades.pl
new file mode 100755
index 0000000..f6988a1
--- /dev/null
+++ b/backends/urpmi/helpers/get-distro-upgrades.pl
@@ -0,0 +1,100 @@
+#!/usr/bin/perl
+
+use strict;
+
+use perl_packagekit::prints;
+use perl_packagekit::enums;
+
+pk_print_status(PK_STATUS_ENUM_QUERY);
+
+open(PRODUCT_FILE, "/etc/product.id");
+
+my %product_id;
+%product_id = parse_line(<PRODUCT_FILE>);
+close(PRODUCT_FILE);
+
+my $distribfile_path = "/tmp/distrib.list";
+download_distrib_file($distribfile_path, \%product_id);
+
+-f $distribfile_path or finished(1);
+
+my @distribs;
+open(DISTRIB_FILE, $distribfile_path);
+while(<DISTRIB_FILE>) {
+  my %distrib = parse_line($_);
+  push(@distribs, \%distrib);
+}
+
+my $distrib;
+foreach (@distribs) {
+  if($_->{version} == $product_id{version}) {
+    $distrib = $_;
+  }
+}
+
+$distrib or finished(0);
+ at distribs = sort { $b->{release_date} <=> $a->{release_date} } @distribs;
+
+my $newer_version = get_newer_distrib($distrib->{version}, \@distribs);
+$newer_version or finished(0);
+pk_print_distro_upgrade(PK_DISTRO_UPGRADE_ENUM_STABLE, join(" ", "Mandriva", $product_id{product}, $newer_version->{version}), "");
+
+unlink($distribfile_path);
+pk_print_status(PK_STATUS_ENUM_FINISHED);
+
+sub parse_line {
+  my ($line) = @_;
+  my %hash;
+  my @affects = split(/,/, $line);
+  foreach my $affect (@affects) {
+    my ($variable, $value) = split(/=/, $affect);
+    chomp($variable);
+    chomp($value);
+    $hash{$variable} = $value;
+  }
+  return %hash;
+}
+
+sub download_distrib_file {
+
+  my ($outfile, $product_id) = @_;
+  
+  -x "/usr/bin/wget" or die "wget is missing\n";
+  
+  my $api_url = sprintf("http://api.mandriva.com/distributions/%s.%s.list?product=%s",
+                  lc($product_id->{type}),
+                  lc($product_id->{arch}),
+                  lc($product_id->{product}));
+  
+  my $wget_command = join(" ", 
+                          "/usr/bin/wget",
+                          "--quiet",
+                          "--output-document", $outfile,
+                          $api_url);
+  
+  my $wget_pid = open(my $wget, "$wget_command |");
+  close($wget);
+}
+
+sub get_newer_distrib {
+
+  my ($installed_version, $distrib_list) = @_;
+  my $installed_distrib;
+  foreach (@$distrib_list) {
+    if($_->{version} == $installed_version) {
+      $installed_distrib = $_;
+    }
+  }
+  $installed_distrib or return;
+  foreach (@$distrib_list) {
+    if($installed_distrib->{release_date} < $_->{release_date}) {
+      return $_;
+    }
+  }
+}
+
+sub finished {
+  my ($exit_status) = @_;
+  pk_print_status(PK_STATUS_ENUM_FINISHED);
+  exit $exit_status;
+}
diff --git a/backends/urpmi/helpers/perl_packagekit/enums.pm b/backends/urpmi/helpers/perl_packagekit/enums.pm
index d00ff72..4a2df62 100644
--- a/backends/urpmi/helpers/perl_packagekit/enums.pm
+++ b/backends/urpmi/helpers/perl_packagekit/enums.pm
@@ -155,6 +155,10 @@ our @EXPORT = qw(
   PK_STATUS_ENUM_DOWNLOAD_GROUP 
   PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO 
 
+  PK_DISTRO_UPGRADE_ENUM_UNKNOWN
+  PK_DISTRO_UPGRADE_ENUM_STABLE
+  PK_DISTRO_UPGRADE_ENUM_UNSTABLE
+
   );
 
 use constant {
@@ -298,6 +302,9 @@ use constant {
   PK_STATUS_ENUM_DOWNLOAD_GROUP => "download-group",
   PK_STATUS_ENUM_DOWNLOAD_UPDATEINFO => "download-updateinfo",
 
+  PK_DISTRO_UPGRADE_ENUM_UNKNOWN => "unknown",
+  PK_DISTRO_UPGRADE_ENUM_STABLE => "stable",
+  PK_DISTRO_UPGRADE_ENUM_UNSTABLE => "unstable",
 
 };
 
diff --git a/backends/urpmi/helpers/perl_packagekit/prints.pm b/backends/urpmi/helpers/perl_packagekit/prints.pm
index 36a726e..58debab 100644
--- a/backends/urpmi/helpers/perl_packagekit/prints.pm
+++ b/backends/urpmi/helpers/perl_packagekit/prints.pm
@@ -24,6 +24,7 @@ our @EXPORT = qw(
   pk_print_error
   pk_print_percentage
   pk_print_sub_percentage
+  pk_print_distro_upgrade
   );
 
 sub pk_print_package {
@@ -103,4 +104,9 @@ sub pk_print_sub_percentage {
   printf("subpercentage\t%i\n", $sub_percentage);
 }
 
+sub pk_print_distro_upgrade {
+  my($dtype, $name, $summary) = @_;
+  printf("distro-upgrade\t%s\t%s\t%s\n", $dtype, $name, $summary);
+}
+
 1;
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 49b5f5f..62c66f6 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -347,6 +347,15 @@ backend_update_system (PkBackend *backend)
 	pk_backend_spawn_helper (spawn, "update-system.pl", NULL);
 }
 
+/**
+ * backend_get_distro_upgrades:
+ */
+static void
+backend_get_distro_upgrades (PkBackend *backend)
+{
+	pk_backend_spawn_helper (spawn, "get-distro-upgrades.pl", NULL);
+}
+
 
 PK_BACKEND_OPTIONS (
 	"URPMI",					/* description */
@@ -359,7 +368,7 @@ PK_BACKEND_OPTIONS (
 	NULL,					/* download_packages */
 	backend_get_depends,			/* get_depends */
 	backend_get_details,			/* get_details */
-	NULL,					/* get_distro_upgrades */
+	backend_get_distro_upgrades,		/* get_distro_upgrades */
 	backend_get_files,			/* get_files */
 	backend_get_packages,			/* get_packages */
 	NULL,					/* get_repo_list */
commit e8550f61613e55839152f38a2b45908137d92c0d
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 12:26:39 2008 +0100

    trivial: whitespace changes, no logic changes

diff --git a/src/pk-backend-dbus.c b/src/pk-backend-dbus.c
index 699e2f3..d3b251a 100644
--- a/src/pk-backend-dbus.c
+++ b/src/pk-backend-dbus.c
@@ -152,15 +152,15 @@ pk_backend_dbus_details_cb (DBusGProxy *proxy, const gchar *package_id,
  **/
 static void
 pk_backend_dbus_distro_upgrade_cb (DBusGProxy *proxy,
-			           const gchar *type,
+				   const gchar *type,
 				   const gchar *name,
 				   const gchar *summary,
 				   PkBackendDbus *backend_dbus)
 {
 	egg_debug ("got signal");
 	pk_backend_distro_upgrade (backend_dbus->priv->backend,
-			           pk_distro_upgrade_enum_from_text (type),
-			           name, summary);
+				   pk_distro_upgrade_enum_from_text (type),
+				   name, summary);
 }
 
 /**
@@ -589,9 +589,8 @@ pk_backend_dbus_kill (PkBackendDbus *backend_dbus)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -617,9 +616,8 @@ pk_backend_dbus_cancel (PkBackendDbus *backend_dbus)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -648,9 +646,8 @@ pk_backend_dbus_get_updates (PkBackendDbus *backend_dbus, PkBitfield filters)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -680,9 +677,8 @@ pk_backend_dbus_get_repo_list (PkBackendDbus *backend_dbus, PkBitfield filters)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -710,9 +706,8 @@ pk_backend_dbus_refresh_cache (PkBackendDbus *backend_dbus, gboolean force)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -730,20 +725,19 @@ pk_backend_dbus_get_distro_upgrades (PkBackendDbus *backend_dbus)
 
 	/* new sync method call */
 	pk_backend_dbus_time_reset (backend_dbus);
-	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, 
-			         "GetDistroUpgrades", &error, 
+	ret = dbus_g_proxy_call (backend_dbus->priv->proxy,
+				 "GetDistroUpgrades", &error,
 				 G_TYPE_INVALID, G_TYPE_INVALID);
 	if (error != NULL) {
 		egg_warning ("%s", error->message);
-		pk_backend_error_code (backend_dbus->priv->backend, 
+		pk_backend_error_code (backend_dbus->priv->backend,
 				       PK_ERROR_ENUM_INTERNAL_ERROR,
 				       error->message);
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -770,9 +764,8 @@ pk_backend_dbus_update_system (PkBackendDbus *backend_dbus)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -801,9 +794,8 @@ pk_backend_dbus_repo_enable (PkBackendDbus *backend_dbus, const gchar *rid, gboo
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -836,9 +828,8 @@ pk_backend_dbus_repo_set_data (PkBackendDbus *backend_dbus, const gchar *rid,
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -869,9 +860,8 @@ pk_backend_dbus_resolve (PkBackendDbus *backend_dbus, PkBitfield filters, gchar
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -900,9 +890,8 @@ pk_backend_dbus_rollback (PkBackendDbus *backend_dbus, const gchar *transaction_
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -933,9 +922,8 @@ pk_backend_dbus_search_name (PkBackendDbus *backend_dbus, PkBitfield filters, co
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -967,9 +955,8 @@ pk_backend_dbus_search_details (PkBackendDbus *backend_dbus, PkBitfield filters,
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1001,9 +988,8 @@ pk_backend_dbus_search_group (PkBackendDbus *backend_dbus, PkBitfield filters, c
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1035,9 +1021,8 @@ pk_backend_dbus_search_file (PkBackendDbus *backend_dbus, PkBitfield filters, co
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1070,9 +1055,8 @@ pk_backend_dbus_get_depends (PkBackendDbus *backend_dbus, PkBitfield filters, gc
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1105,9 +1089,8 @@ pk_backend_dbus_get_requires (PkBackendDbus *backend_dbus, PkBitfield filters, g
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1137,9 +1120,8 @@ pk_backend_dbus_get_packages (PkBackendDbus *backend_dbus, PkBitfield filters)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
@@ -1150,29 +1132,28 @@ pk_backend_dbus_get_packages (PkBackendDbus *backend_dbus, PkBitfield filters)
 gboolean
 pk_backend_dbus_download_packages (PkBackendDbus *backend_dbus, gchar **package_ids, const gchar *directory)
 {
-        gboolean ret;
-        GError *error = NULL;
+	gboolean ret;
+	GError *error = NULL;
 
-        g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
-        g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
+	g_return_val_if_fail (PK_IS_BACKEND_DBUS (backend_dbus), FALSE);
+	g_return_val_if_fail (backend_dbus->priv->proxy != NULL, FALSE);
 	 g_return_val_if_fail (package_ids != NULL, FALSE);
 
-        /* new sync method call */
-        pk_backend_dbus_time_reset (backend_dbus);
-        ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "DownloadPackages", &error,
+	/* new sync method call */
+	pk_backend_dbus_time_reset (backend_dbus);
+	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "DownloadPackages", &error,
 				 G_TYPE_STRV, package_ids,
 				 G_TYPE_STRING, directory,
- 	                         G_TYPE_INVALID, G_TYPE_INVALID);
-        if (error != NULL) {
-                egg_warning ("%s", error->message);
-                pk_backend_error_code (backend_dbus->priv->backend, PK_ERROR_ENUM_INTERNAL_ERROR, error->message);
-                pk_backend_finished (backend_dbus->priv->backend);
-                g_error_free (error);
-        }
-        if (ret) {
-                pk_backend_dbus_time_check (backend_dbus);
-        }
-        return ret;
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+	if (error != NULL) {
+		egg_warning ("%s", error->message);
+		pk_backend_error_code (backend_dbus->priv->backend, PK_ERROR_ENUM_INTERNAL_ERROR, error->message);
+		pk_backend_finished (backend_dbus->priv->backend);
+		g_error_free (error);
+	}
+	if (ret)
+		pk_backend_dbus_time_check (backend_dbus);
+	return ret;
 }
 
 
@@ -1200,9 +1181,8 @@ pk_backend_dbus_get_update_detail (PkBackendDbus *backend_dbus, gchar **package_
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1230,9 +1210,8 @@ pk_backend_dbus_get_details (PkBackendDbus *backend_dbus, gchar **package_ids)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1260,9 +1239,8 @@ pk_backend_dbus_get_files (PkBackendDbus *backend_dbus, gchar **package_ids)
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1292,9 +1270,8 @@ pk_backend_dbus_remove_packages (PkBackendDbus *backend_dbus, gchar **package_id
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1322,9 +1299,8 @@ pk_backend_dbus_install_packages (PkBackendDbus *backend_dbus, gchar **package_i
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1352,9 +1328,8 @@ pk_backend_dbus_update_packages (PkBackendDbus *backend_dbus, gchar **package_id
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1383,9 +1358,8 @@ pk_backend_dbus_install_files (PkBackendDbus *backend_dbus, gboolean trusted, gc
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1414,9 +1388,8 @@ pk_backend_dbus_service_pack (PkBackendDbus *backend_dbus, const gchar *location
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	return ret;
 }
 
@@ -1452,9 +1425,8 @@ pk_backend_dbus_what_provides (PkBackendDbus *backend_dbus, PkBitfield filters,
 		pk_backend_finished (backend_dbus->priv->backend);
 		g_error_free (error);
 	}
-	if (ret) {
+	if (ret)
 		pk_backend_dbus_time_check (backend_dbus);
-	}
 	g_free (filters_text);
 	return ret;
 }
commit 8a57758b770f9e369496c52f14d4560261d25cd5
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 12:17:00 2008 +0100

    bugfix: don't use llu for guint64, it's not x64 portable -- instead use G_GUINT64_FORMAT

diff --git a/client/pk-console.c b/client/pk-console.c
index 92983ce..af580b2 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1484,7 +1484,7 @@ main (int argc, char *argv[])
 
 	if (filter != NULL)
 		filters = pk_filter_bitfield_from_text (filter);
-	egg_debug ("filter=%s, filters=%llu", filter, filters);
+	egg_debug ("filter=%s, filters=%" PK_BITFIELD_FORMAT, filter, filters);
 
 	mode = argv[1];
 	if (argc > 2)
diff --git a/libpackagekit/pk-bitfield.c b/libpackagekit/pk-bitfield.c
index 6420877..768d4d2 100644
--- a/libpackagekit/pk-bitfield.c
+++ b/libpackagekit/pk-bitfield.c
@@ -348,7 +348,7 @@ pk_bitfield_test (EggTest *test)
 	if (filter == pk_bitfield_value (PK_FILTER_ENUM_NONE))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "filter was %llu", filter);
+		egg_test_failed (test, "filter was %" PK_BITFIELD_FORMAT, filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can convert filter text to bitfield (single)");
@@ -356,7 +356,7 @@ pk_bitfield_test (EggTest *test)
 	if (filter == pk_bitfield_value (PK_FILTER_ENUM_NOT_DEVELOPMENT))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "filter was %llu", filter);
+		egg_test_failed (test, "filter was %" PK_BITFIELD_FORMAT, filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can convert filter text to bitfield (plural)");
@@ -366,7 +366,7 @@ pk_bitfield_test (EggTest *test)
 		       pk_bitfield_value (PK_FILTER_ENUM_NEWEST)))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "filter was %llu", filter);
+		egg_test_failed (test, "filter was %" PK_BITFIELD_FORMAT, filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can add / remove bitfield");
@@ -416,7 +416,7 @@ pk_bitfield_test (EggTest *test)
 	if (values == pk_bitfield_value (PK_ROLE_ENUM_UNKNOWN))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield %llu", values);
+		egg_test_failed (test, "returned bitfield %" PK_BITFIELD_FORMAT, values);
 
 	/************************************************************/
 	egg_test_title (test, "role bitfield from enums (random)");
@@ -425,7 +425,7 @@ pk_bitfield_test (EggTest *test)
 		       pk_bitfield_value (PK_ROLE_ENUM_SEARCH_GROUP)))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield %llu", values);
+		egg_test_failed (test, "returned bitfield %" PK_BITFIELD_FORMAT, values);
 
 	/************************************************************/
 	egg_test_title (test, "group bitfield from enums (unknown)");
@@ -433,7 +433,7 @@ pk_bitfield_test (EggTest *test)
 	if (values == pk_bitfield_value (PK_GROUP_ENUM_UNKNOWN))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield %llu", values);
+		egg_test_failed (test, "returned bitfield %" PK_BITFIELD_FORMAT, values);
 
 	/************************************************************/
 	egg_test_title (test, "group bitfield from enums (random)");
@@ -441,7 +441,7 @@ pk_bitfield_test (EggTest *test)
 	if (values == (pk_bitfield_value (PK_GROUP_ENUM_ACCESSIBILITY)))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield %llu", values);
+		egg_test_failed (test, "returned bitfield %" PK_BITFIELD_FORMAT, values);
 
 	/************************************************************/
 	egg_test_title (test, "group bitfield to text (unknown)");
@@ -450,7 +450,7 @@ pk_bitfield_test (EggTest *test)
 	if (egg_strequal (text, "unknown"))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+		egg_test_failed (test, "returned bitfield text %s (%" PK_BITFIELD_FORMAT ")", text, values);
 	g_free (text);
 
 	/************************************************************/
@@ -460,7 +460,7 @@ pk_bitfield_test (EggTest *test)
 	if (egg_strequal (text, "accessibility;unknown"))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+		egg_test_failed (test, "returned bitfield text %s (%" PK_BITFIELD_FORMAT ")", text, values);
 	g_free (text);
 
 	/************************************************************/
@@ -470,7 +470,7 @@ pk_bitfield_test (EggTest *test)
 	if (egg_strequal (text, "repos;unknown"))
 		egg_test_success (test, NULL);
 	else
-		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+		egg_test_failed (test, "returned bitfield text %s (%" PK_BITFIELD_FORMAT ")", text, values);
 	g_free (text);
 
 	/************************************************************/
diff --git a/libpackagekit/pk-bitfield.h b/libpackagekit/pk-bitfield.h
index d28800a..db331f1 100644
--- a/libpackagekit/pk-bitfield.h
+++ b/libpackagekit/pk-bitfield.h
@@ -29,6 +29,7 @@
 G_BEGIN_DECLS
 
 typedef guint64 PkBitfield;
+#define PK_BITFIELD_FORMAT G_GUINT64_FORMAT
 
 /* convenience functions as it's easy to forget the bitwise operators */
 #define pk_bitfield_add(bitfield,enum)		do { ((bitfield) |= (pk_bitfield_value(enum))); } while (0)
commit 78a22d4b0006bdf509f6cdccd6cdd1b871225195
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 12:05:27 2008 +0100

    bugfix: fix a critical warning in the self check program by properly disconnecting references to finished we setup in PkBackendSpawn

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 9be44a5..c59c646 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -65,6 +65,7 @@ struct PkBackendSpawnPrivate
 	PkBackend		*backend;
 	gchar			*name;
 	guint			 kill_id;
+	guint			 backend_finished_id;
 	PkConf			*conf;
 	gboolean		 finished;
 };
@@ -649,6 +650,7 @@ pk_backend_spawn_finalize (GObject *object)
 	if (backend_spawn->priv->kill_id > 0)
 		g_source_remove (backend_spawn->priv->kill_id);
 
+	g_signal_handler_disconnect (backend_spawn->priv->backend, backend_spawn->priv->backend_finished_id);
 	g_free (backend_spawn->priv->name);
 	g_object_unref (backend_spawn->priv->conf);
 	g_object_unref (backend_spawn->priv->spawn);
@@ -680,7 +682,8 @@ pk_backend_spawn_init (PkBackendSpawn *backend_spawn)
 	backend_spawn->priv->finished = FALSE;
 	backend_spawn->priv->conf = pk_conf_new ();
 	backend_spawn->priv->backend = pk_backend_new ();
-	g_signal_connect (backend_spawn->priv->backend, "finished",
+	backend_spawn->priv->backend_finished_id =
+		g_signal_connect (backend_spawn->priv->backend, "finished",
 			  G_CALLBACK (pk_backend_spawn_finished_cb), backend_spawn);
 	backend_spawn->priv->spawn = pk_spawn_new ();
 	g_signal_connect (backend_spawn->priv->spawn, "exit",
commit 0175b1cfa769e7b8eb10648a5846cc83bc8f04f4
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 11:59:59 2008 +0100

    bugfix: emit custom exit status from PkSpawn so we can tell is the dispatcher is exiting correctly

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 12dd6e4..9be44a5 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -395,12 +395,12 @@ out:
  * pk_backend_spawn_exit_cb:
  **/
 static void
-pk_backend_spawn_exit_cb (PkSpawn *spawn, PkExitEnum exit, PkBackendSpawn *backend_spawn)
+pk_backend_spawn_exit_cb (PkSpawn *spawn, PkSpawnExitType exit, PkBackendSpawn *backend_spawn)
 {
 	g_return_if_fail (PK_IS_BACKEND_SPAWN (backend_spawn));
 
-	/* if we killed the process, set an error */
-	if (exit == PK_EXIT_ENUM_KILLED) {
+	/* if we force killed the process, set an error */
+	if (exit == PK_SPAWN_EXIT_TYPE_SIGKILL) {
 		/* we just call this failed, and set an error */
 		pk_backend_error_code (backend_spawn->priv->backend, PK_ERROR_ENUM_PROCESS_KILL,
 				       "Process had to be killed to be cancelled");
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 0fa96e5..09a44c8 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -41,7 +41,6 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
-#include <pk-enum.h>
 #include <pk-common.h>
 
 #include "egg-debug.h"
@@ -66,7 +65,8 @@ struct PkSpawnPrivate
 	guint			 poll_id;
 	guint			 kill_id;
 	gboolean		 finished;
-	PkExitEnum		 exit;
+	gboolean		 is_sending_exit;
+	PkSpawnExitType		 exit;
 	GMainLoop		*exit_loop;
 	GString			*stdout_buf;
 	gchar			*last_argv0;
@@ -182,11 +182,11 @@ pk_spawn_check_child (PkSpawn *spawn)
 
 	if (WEXITSTATUS (status) > 0) {
 		egg_warning ("Running fork failed with return value %d", WEXITSTATUS (status));
-		if (spawn->priv->exit == PK_EXIT_ENUM_UNKNOWN)
-			spawn->priv->exit = PK_EXIT_ENUM_FAILED;
+		if (spawn->priv->exit == PK_SPAWN_EXIT_TYPE_UNKNOWN)
+			spawn->priv->exit = PK_SPAWN_EXIT_TYPE_FAILED;
 	} else {
-		if (spawn->priv->exit == PK_EXIT_ENUM_UNKNOWN)
-			spawn->priv->exit = PK_EXIT_ENUM_SUCCESS;
+		if (spawn->priv->exit == PK_SPAWN_EXIT_TYPE_UNKNOWN)
+			spawn->priv->exit = PK_SPAWN_EXIT_TYPE_SUCCESS;
 	}
 
 	/* officially done, although no signal yet */
@@ -200,14 +200,18 @@ pk_spawn_check_child (PkSpawn *spawn)
 
 	/* are we waiting for a "exit" from the dispatcher? */
 	ret = g_main_loop_is_running (spawn->priv->exit_loop);
-	if (ret)
+	if (ret) {
 		g_main_loop_quit (spawn->priv->exit_loop);
+		spawn->priv->exit = PK_SPAWN_EXIT_TYPE_DISPATCHER_CHANGED;
+	}
+
+	/* are we doing pk_spawn_exit */
+	if (spawn->priv->is_sending_exit)
+		spawn->priv->exit = PK_SPAWN_EXIT_TYPE_DISPATCHER_EXIT;
 
 	/* don't emit if we just closed an invalid dispatcher */
-	if (!ret) {
-		egg_debug ("emitting exit %s", pk_exit_enum_to_text (spawn->priv->exit));
-		g_signal_emit (spawn, signals [PK_SPAWN_EXIT], 0, spawn->priv->exit);
-	}
+	egg_debug ("emitting exit %i", spawn->priv->exit);
+	g_signal_emit (spawn, signals [PK_SPAWN_EXIT], 0, spawn->priv->exit);
 
 	return FALSE;
 }
@@ -227,7 +231,7 @@ pk_spawn_sigkill_cb (PkSpawn *spawn)
 	}
 
 	/* we won't overwrite this if not unknown */
-	spawn->priv->exit = PK_EXIT_ENUM_KILLED;
+	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_SIGKILL;
 
 	egg_debug ("sending SIGKILL %i", spawn->priv->child_pid);
 	retval = kill (spawn->priv->child_pid, SIGKILL);
@@ -264,7 +268,7 @@ pk_spawn_kill (PkSpawn *spawn)
 	}
 
 	/* we won't overwrite this if not unknown */
-	spawn->priv->exit = PK_EXIT_ENUM_CANCELLED;
+	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_SIGQUIT;
 
 	egg_debug ("sending SIGQUIT %i", spawn->priv->child_pid);
 	retval = kill (spawn->priv->child_pid, SIGQUIT);
@@ -332,7 +336,10 @@ out:
 gboolean
 pk_spawn_exit (PkSpawn *spawn)
 {
-	return pk_spawn_send_stdin (spawn, "exit");
+	gboolean ret;
+	spawn->priv->is_sending_exit = TRUE;
+	ret = pk_spawn_send_stdin (spawn, "exit");
+	return ret;
 }
 
 /**
@@ -396,6 +403,7 @@ pk_spawn_argv (PkSpawn *spawn, gchar **argv, gchar **envp)
 	}
 
 	/* create spawned object for tracking */
+	spawn->priv->is_sending_exit = FALSE;
 	spawn->priv->finished = FALSE;
 	egg_debug ("creating new instance of %s", argv[0]);
 	ret = g_spawn_async_with_pipes (NULL, argv, envp,
@@ -473,9 +481,10 @@ pk_spawn_init (PkSpawn *spawn)
 	spawn->priv->poll_id = 0;
 	spawn->priv->kill_id = 0;
 	spawn->priv->finished = FALSE;
+	spawn->priv->is_sending_exit = FALSE;
 	spawn->priv->last_argv0 = NULL;
 	spawn->priv->last_envp = NULL;
-	spawn->priv->exit = PK_EXIT_ENUM_UNKNOWN;
+	spawn->priv->exit = PK_SPAWN_EXIT_TYPE_UNKNOWN;
 
 	spawn->priv->stdout_buf = g_string_new ("");
 	spawn->priv->exit_loop = g_main_loop_new (NULL, FALSE);
@@ -538,7 +547,7 @@ pk_spawn_new (void)
 #include "egg-test.h"
 #define BAD_EXIT 999
 
-PkExitEnum mexit = BAD_EXIT;
+PkSpawnExitType mexit = BAD_EXIT;
 guint stdout_count = 0;
 guint finished_count = 0;
 
@@ -546,7 +555,7 @@ guint finished_count = 0;
  * pk_test_exit_cb:
  **/
 static void
-pk_test_exit_cb (PkSpawn *spawn, PkExitEnum exit, EggTest *test)
+pk_test_exit_cb (PkSpawn *spawn, PkSpawnExitType exit, EggTest *test)
 {
 	egg_debug ("spawn exit=%i", exit);
 	mexit = exit;
@@ -641,7 +650,7 @@ pk_spawn_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "make sure finished okay");
-	if (mexit == PK_EXIT_ENUM_SUCCESS)
+	if (mexit == PK_SPAWN_EXIT_TYPE_SUCCESS)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "finish was okay!");
@@ -710,7 +719,7 @@ pk_spawn_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "make sure finished in SIGKILL");
-	if (mexit == PK_EXIT_ENUM_KILLED)
+	if (mexit == PK_SPAWN_EXIT_TYPE_SIGKILL)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "finish %i!", mexit);
@@ -738,7 +747,7 @@ pk_spawn_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "make sure finished in SIGQUIT");
-	if (mexit == PK_EXIT_ENUM_CANCELLED)
+	if (mexit == PK_SPAWN_EXIT_TYPE_SIGQUIT)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "finish %i!", mexit);
@@ -835,6 +844,13 @@ pk_spawn_test (EggTest *test)
 		egg_test_failed (test, "dispatcher still running");
 
 	/************************************************************/
+	egg_test_title (test, "did we get the right exit code");
+	if (mexit == PK_SPAWN_EXIT_TYPE_DISPATCHER_EXIT)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "finish %i!", mexit);
+
+	/************************************************************/
 	egg_test_title (test, "ask dispatcher to close (again)");
 	ret = pk_spawn_exit (spawn);
 	if (!ret)
diff --git a/src/pk-spawn.h b/src/pk-spawn.h
index 29732b3..14741e5 100644
--- a/src/pk-spawn.h
+++ b/src/pk-spawn.h
@@ -48,6 +48,21 @@ typedef struct
 	GObjectClass	parent_class;
 } PkSpawnClass;
 
+/**
+ * PkSpawnExitType:
+ *
+ * How the spawned file exited
+ **/
+typedef enum {
+	PK_SPAWN_EXIT_TYPE_SUCCESS,		/* script run, without any problems */
+	PK_SPAWN_EXIT_TYPE_FAILED,		/* script failed to run */
+	PK_SPAWN_EXIT_TYPE_DISPATCHER_CHANGED,	/* changed dispatcher, another started */
+	PK_SPAWN_EXIT_TYPE_DISPATCHER_EXIT,	/* we timed out, and exited the dispatcher instance */
+	PK_SPAWN_EXIT_TYPE_SIGQUIT,		/* we killed the instance (SIGQUIT) */
+	PK_SPAWN_EXIT_TYPE_SIGKILL,		/* we killed the instance (SIGKILL) */
+	PK_SPAWN_EXIT_TYPE_UNKNOWN
+} PkSpawnExitType;
+
 GType		 pk_spawn_get_type		  	(void) G_GNUC_CONST;
 PkSpawn		*pk_spawn_new				(void);
 
commit 65083dff66f90e94aee7f34e7bfe003b0bbe2909
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 11:07:56 2008 +0100

    yum: add a workaround when getObsoletesTuples fails, fixes fd#17528

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 1cc208e..de91359 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -1371,11 +1371,14 @@ class PackageKitYumBackend(PackageKitBaseBackend):
                     self.repo_detail(repo.id,repo.name,'false')
 
     def _get_obsoleted(self,name):
-        obsoletes = self.yumbase.up.getObsoletesTuples(newest=1)
-        for (obsoleting,installed) in obsoletes:
-            if obsoleting[0] == name:
-                pkg =  self.yumbase.rpmdb.searchPkgTuple(installed)[0]
-                return self._pkg_to_id(pkg)
+        try:
+            obsoletes = self.yumbase.up.getObsoletesTuples(newest=1)
+            for (obsoleting,installed) in obsoletes:
+                if obsoleting[0] == name:
+                    pkg =  self.yumbase.rpmdb.searchPkgTuple(installed)[0]
+                    return self._pkg_to_id(pkg)
+        except:
+            pass # no obsolete data - fd#17528
         return ""
 
     def _get_updated(self,pkg):
commit 8175dabbc13cedbedf67cdaeacec7192fcfc3f85
Merge: 378b970... 2fba753...
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 10:58:52 2008 +0100

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

commit 378b970922b3afaed8b70e35489c28e4caeac6c3
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 10:58:08 2008 +0100

    trivial: fix a compile warning after the change to 64bit bitfields

diff --git a/client/pk-console.c b/client/pk-console.c
index 3a366a4..92983ce 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -1482,21 +1482,17 @@ main (int argc, char *argv[])
 	g_signal_connect (client_signature, "finished",
 			  G_CALLBACK (pk_console_signature_finished_cb), NULL);
 
-	if (filter != NULL) {
+	if (filter != NULL)
 		filters = pk_filter_bitfield_from_text (filter);
-	}
-	egg_debug ("filter=%s, filters=%i", filter, filters);
+	egg_debug ("filter=%s, filters=%llu", filter, filters);
 
 	mode = argv[1];
-	if (argc > 2) {
+	if (argc > 2)
 		value = argv[2];
-	}
-	if (argc > 3) {
+	if (argc > 3)
 		details = argv[3];
-	}
-	if (argc > 4) {
+	if (argc > 4)
 		parameter = argv[4];
-	}
 
 	/* parse the big list */
 	if (strcmp (mode, "search") == 0) {
commit 2fba7535077cbff020ee7986c381fa062f133869
Author: Stefan Haas <shaas at suse.de>
Date:   Fri Sep 12 11:57:34 2008 +0200

    zypp: updated pk-matrix (get_distro_upgrades)

diff --git a/docs/html/pk-matrix.html b/docs/html/pk-matrix.html
index 6c6f518..c2935d7 100644
--- a/docs/html/pk-matrix.html
+++ b/docs/html/pk-matrix.html
@@ -101,7 +101,7 @@
 <td><img src="img/status-bad.png" alt="[no]"/></td><!-- smart -->
 <td><img src="img/status-bad.png" alt="[no]"/></td><!-- urpmi -->
 <td><img src="img/status-good.png" alt="[yes]"/></td><!-- yum -->
-<td><img src="img/status-bad.png" alt="[no]"/></td><!-- zypp -->
+<td><img src="img/status-good.png" alt="[yes]"/></td><!-- zypp -->
 </tr>
 <tr>
 <td><b>GetFiles</b></td>
commit e27d24bbff750bc27ac3b1458d5afa2a8da7fa43
Merge: e167794... cef04a1...
Author: Stefan Haas <shaas at suse.de>
Date:   Fri Sep 12 11:55:16 2008 +0200

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

commit e16779406320de66ba8b6f2670da902dcc3b74dd
Author: Stefan Haas <shaas at suse.de>
Date:   Fri Sep 12 11:47:59 2008 +0200

    zypp: added get_distro_upgrades

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 52b3df5..b9e86ca 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -572,6 +572,54 @@ backend_get_details (PkBackend *backend, gchar **package_ids)
 }
 
 static gboolean
+backend_get_distro_upgrades_thread(PkBackend *backend)
+{
+	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
+	pk_backend_set_percentage (backend, 0);
+
+	// refresh the repos before checking for updates
+	if (!zypp_refresh_cache (backend, FALSE)) {
+		pk_backend_finished (backend);
+		return FALSE;
+	}
+
+	zypp::ResPool pool = zypp_build_pool (TRUE);
+	pk_backend_set_percentage (backend, 40);
+
+	// get all Packages and Patches for Update
+	std::set<zypp::PoolItem> *candidates = zypp_get_patches ();
+
+	pk_backend_set_percentage (backend, 80);
+
+	std::set<zypp::PoolItem>::iterator cb = candidates->begin (), ce = candidates->end (), ci;
+	for (ci = cb; ci != ce; ++ci) {
+		zypp::ResObject::constPtr res = ci->resolvable();
+
+		if (zypp::isKind<zypp::Patch>(res)) {
+			zypp::Patch::constPtr patch = zypp::asKind<zypp::Patch>(res);
+			if (patch->category () == "distupgrade")
+			{
+				// here emit a distupgrade available using the patch summary
+				pk_backend_distro_upgrade(backend,
+							PK_DISTRO_UPGRADE_ENUM_STABLE,
+							patch->name ().c_str (),
+							patch->summary ().c_str ());
+			}
+		}
+	}
+	return TRUE;
+}
+
+/**
+ * backend_get_distro_upgrades:
+ */
+static void
+backend_get_distro_upgrades (PkBackend *backend)
+{
+	pk_backend_thread_create (backend, backend_get_distro_upgrades_thread);
+}
+
+static gboolean
 backend_refresh_cache_thread (PkBackend *backend)
 {
 	gboolean force = pk_backend_get_bool(backend, "force");
@@ -665,6 +713,8 @@ backend_get_updates_thread (PkBackend *backend)
 				infoEnum = PK_INFO_ENUM_LOW;
 			}else if (patch->category () == "security") {
 				infoEnum = PK_INFO_ENUM_SECURITY;
+			}else if (patch->category () == "distupgrade") {
+				continue;
 			} else {
 				infoEnum = PK_INFO_ENUM_NORMAL;
 			}
@@ -1794,7 +1844,7 @@ extern "C" PK_BACKEND_OPTIONS (
 	NULL,					/* download_packages */
 	backend_get_depends,			/* get_depends */
 	backend_get_details,			/* get_details */
-	NULL,					/* get_distro_upgrades */
+	backend_get_distro_upgrades,		/* get_distro_upgrades */
 	backend_get_files,			/* get_files */
 	backend_get_packages,			/* get_packages */
 	backend_get_repo_list,			/* get_repo_list */
commit cef04a1b0b4708a59efb2b8333a2421c6c95d164
Merge: 72d44b0... 6f0c2db...
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 10:31:25 2008 +0100

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

commit 72d44b03439338e9ca23486a6fae4840f8ba9b18
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 10:30:43 2008 +0100

    bugfix: make PkBitfield a 64 bit type now we have 33 group enums. Also add 6 self tests to catch bugs like this in the future

diff --git a/libpackagekit/pk-bitfield.c b/libpackagekit/pk-bitfield.c
index a8fadd9..6420877 100644
--- a/libpackagekit/pk-bitfield.c
+++ b/libpackagekit/pk-bitfield.c
@@ -57,9 +57,8 @@ pk_bitfield_contain_priority (PkBitfield values, gint value, ...)
 	gint retval = -1;
 
 	/* we must query at least one thing */
-	if (pk_bitfield_contain (values, value)) {
+	if (pk_bitfield_contain (values, value))
 		return value;
-	}
 
 	/* process the valist */
 	va_start (args, value);
@@ -125,10 +124,9 @@ pk_role_bitfield_to_text (PkBitfield roles)
 	guint i;
 
 	string = g_string_new ("");
-	for (i=0; i<PK_ROLE_ENUM_UNKNOWN; i++) {
-		if ((roles & pk_bitfield_value (i)) == 0) {
+	for (i=0; i<=PK_ROLE_ENUM_UNKNOWN; i++) {
+		if ((roles & pk_bitfield_value (i)) == 0)
 			continue;
-		}
 		g_string_append_printf (string, "%s;", pk_role_enum_to_text (i));
 	}
 	/* do we have a no bitfield? \n */
@@ -165,9 +163,8 @@ pk_role_bitfield_from_text (const gchar *roles)
 	}
 
 	length = g_strv_length (split);
-	for (i=0; i<length; i++) {
+	for (i=0; i<length; i++)
 		roles_enum += pk_bitfield_value (pk_role_enum_from_text (split[i]));
-	}
 out:
 	g_strfreev (split);
 	return roles_enum;
@@ -188,10 +185,9 @@ pk_group_bitfield_to_text (PkBitfield groups)
 	guint i;
 
 	string = g_string_new ("");
-	for (i=0; i<PK_GROUP_ENUM_UNKNOWN; i++) {
-		if ((groups & pk_bitfield_value (i)) == 0) {
+	for (i=0; i<=PK_GROUP_ENUM_UNKNOWN; i++) {
+		if ((groups & pk_bitfield_value (i)) == 0)
 			continue;
-		}
 		g_string_append_printf (string, "%s;", pk_group_enum_to_text (i));
 	}
 	/* do we have a no bitfield? \n */
@@ -228,9 +224,8 @@ pk_group_bitfield_from_text (const gchar *groups)
 	}
 
 	length = g_strv_length (split);
-	for (i=0; i<length; i++) {
+	for (i=0; i<length; i++)
 		groups_enum += pk_bitfield_value (pk_group_enum_from_text (split[i]));
-	}
 out:
 	g_strfreev (split);
 	return groups_enum;
@@ -251,15 +246,13 @@ pk_filter_bitfield_to_text (PkBitfield filters)
 	guint i;
 
 	/* shortcut */
-	if (filters == 0) {
+	if (filters == 0)
 		return g_strdup (pk_filter_enum_to_text (filters));
-	}
 
 	string = g_string_new ("");
-	for (i=0; i<PK_FILTER_ENUM_UNKNOWN; i++) {
-		if ((filters & pk_bitfield_value (i)) == 0) {
+	for (i=0; i<=PK_FILTER_ENUM_UNKNOWN; i++) {
+		if ((filters & pk_bitfield_value (i)) == 0)
 			continue;
-		}
 		g_string_append_printf (string, "%s;", pk_filter_enum_to_text (i));
 	}
 	/* do we have a 'none' filter? \n */
@@ -296,9 +289,8 @@ pk_filter_bitfield_from_text (const gchar *filters)
 	}
 
 	length = g_strv_length (split);
-	for (i=0; i<length; i++) {
+	for (i=0; i<length; i++)
 		filters_enum += pk_bitfield_value (pk_filter_enum_from_text (split[i]));
-	}
 out:
 	g_strfreev (split);
 	return filters_enum;
@@ -326,9 +318,8 @@ pk_bitfield_test (EggTest *test)
 	text = pk_filter_bitfield_to_text (pk_bitfield_value (PK_FILTER_ENUM_NONE));
 	if (egg_strequal (text, "none"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "text was %s", text);
-	}
 	g_free (text);
 
 	/************************************************************/
@@ -336,9 +327,8 @@ pk_bitfield_test (EggTest *test)
 	text = pk_filter_bitfield_to_text (pk_bitfield_value (PK_FILTER_ENUM_NOT_DEVELOPMENT));
 	if (egg_strequal (text, "~devel"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "text was %s", text);
-	}
 	g_free (text);
 
 	/************************************************************/
@@ -348,9 +338,8 @@ pk_bitfield_test (EggTest *test)
 					   pk_bitfield_value (PK_FILTER_ENUM_NEWEST));
 	if (egg_strequal (text, "~devel;gui;newest"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "text was %s", text);
-	}
 	g_free (text);
 
 	/************************************************************/
@@ -358,18 +347,16 @@ pk_bitfield_test (EggTest *test)
 	filter = pk_filter_bitfield_from_text ("none");
 	if (filter == pk_bitfield_value (PK_FILTER_ENUM_NONE))
 		egg_test_success (test, NULL);
-	else {
-		egg_test_failed (test, "filter was %i", filter);
-	}
+	else
+		egg_test_failed (test, "filter was %llu", filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can convert filter text to bitfield (single)");
 	filter = pk_filter_bitfield_from_text ("~devel");
 	if (filter == pk_bitfield_value (PK_FILTER_ENUM_NOT_DEVELOPMENT))
 		egg_test_success (test, NULL);
-	else {
-		egg_test_failed (test, "filter was %i", filter);
-	}
+	else
+		egg_test_failed (test, "filter was %llu", filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can convert filter text to bitfield (plural)");
@@ -378,9 +365,8 @@ pk_bitfield_test (EggTest *test)
 		       pk_bitfield_value (PK_FILTER_ENUM_GUI) |
 		       pk_bitfield_value (PK_FILTER_ENUM_NEWEST)))
 		egg_test_success (test, NULL);
-	else {
-		egg_test_failed (test, "filter was %i", filter);
-	}
+	else
+		egg_test_failed (test, "filter was %llu", filter);
 
 	/************************************************************/
 	egg_test_title (test, "check we can add / remove bitfield");
@@ -392,9 +378,8 @@ pk_bitfield_test (EggTest *test)
 	text = pk_filter_bitfield_to_text (filter);
 	if (egg_strequal (text, "gui;~free;newest"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "text was %s", text);
-	}
 	g_free (text);
 
 	/************************************************************/
@@ -404,15 +389,15 @@ pk_bitfield_test (EggTest *test)
 		 pk_bitfield_value (PK_FILTER_ENUM_NEWEST);
 	if (pk_bitfield_contain (filter, PK_FILTER_ENUM_NOT_DEVELOPMENT))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "wrong boolean");
-	}
+
+	/************************************************************/
 	egg_test_title (test, "check we can test enum false-presence");
 	if (!pk_bitfield_contain (filter, PK_FILTER_ENUM_FREE))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "wrong boolean");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check we can add / remove bitfield to nothing");
@@ -421,20 +406,72 @@ pk_bitfield_test (EggTest *test)
 	text = pk_filter_bitfield_to_text (filter);
 	if (egg_strequal (text, "none"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "text was %s", text);
-	}
 	g_free (text);
 
 	/************************************************************/
-	egg_test_title (test, "bitfield from enums");
+	egg_test_title (test, "role bitfield from enums (unknown)");
+	values = pk_bitfield_from_enums (PK_ROLE_ENUM_UNKNOWN, -1);
+	if (values == pk_bitfield_value (PK_ROLE_ENUM_UNKNOWN))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield %llu", values);
+
+	/************************************************************/
+	egg_test_title (test, "role bitfield from enums (random)");
 	values = pk_bitfield_from_enums (PK_ROLE_ENUM_SEARCH_GROUP, PK_ROLE_ENUM_SEARCH_DETAILS, -1);
 	if (values == (pk_bitfield_value (PK_ROLE_ENUM_SEARCH_DETAILS) |
 		       pk_bitfield_value (PK_ROLE_ENUM_SEARCH_GROUP)))
 		egg_test_success (test, NULL);
-	else {
-		egg_test_failed (test, "returned bitfield %i", values);
-	}
+	else
+		egg_test_failed (test, "returned bitfield %llu", values);
+
+	/************************************************************/
+	egg_test_title (test, "group bitfield from enums (unknown)");
+	values = pk_bitfield_from_enums (PK_GROUP_ENUM_UNKNOWN, -1);
+	if (values == pk_bitfield_value (PK_GROUP_ENUM_UNKNOWN))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield %llu", values);
+
+	/************************************************************/
+	egg_test_title (test, "group bitfield from enums (random)");
+	values = pk_bitfield_from_enums (PK_GROUP_ENUM_ACCESSIBILITY, -1);
+	if (values == (pk_bitfield_value (PK_GROUP_ENUM_ACCESSIBILITY)))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield %llu", values);
+
+	/************************************************************/
+	egg_test_title (test, "group bitfield to text (unknown)");
+	values = pk_bitfield_from_enums (PK_GROUP_ENUM_UNKNOWN, -1);
+	text = pk_group_bitfield_to_text (values);
+	if (egg_strequal (text, "unknown"))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+	g_free (text);
+
+	/************************************************************/
+	egg_test_title (test, "group bitfield to text (first and last)");
+	values = pk_bitfield_from_enums (PK_GROUP_ENUM_ACCESSIBILITY, PK_GROUP_ENUM_UNKNOWN, -1);
+	text = pk_group_bitfield_to_text (values);
+	if (egg_strequal (text, "accessibility;unknown"))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+	g_free (text);
+
+	/************************************************************/
+	egg_test_title (test, "group bitfield to text (random)");
+	values = pk_bitfield_from_enums (PK_GROUP_ENUM_UNKNOWN, PK_GROUP_ENUM_REPOS, -1);
+	text = pk_group_bitfield_to_text (values);
+	if (egg_strequal (text, "repos;unknown"))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "returned bitfield text %s (%llu)", text, values);
+	g_free (text);
 
 	/************************************************************/
 	egg_test_title (test, "priority check missing");
@@ -443,27 +480,24 @@ pk_bitfield_test (EggTest *test)
 	value = pk_bitfield_contain_priority (values, PK_ROLE_ENUM_SEARCH_FILE, -1);
 	if (value == -1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "returned priority %i when should be missing", value);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "priority check first");
 	value = pk_bitfield_contain_priority (values, PK_ROLE_ENUM_SEARCH_GROUP, -1);
 	if (value == PK_ROLE_ENUM_SEARCH_GROUP)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "returned wrong value; %i", value);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "priority check second, correct");
 	value = pk_bitfield_contain_priority (values, PK_ROLE_ENUM_SEARCH_FILE, PK_ROLE_ENUM_SEARCH_GROUP, -1);
 	if (value == PK_ROLE_ENUM_SEARCH_GROUP)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "returned wrong value; %i", value);
-	}
 
 	egg_test_end (test);
 }
diff --git a/libpackagekit/pk-bitfield.h b/libpackagekit/pk-bitfield.h
index 3fd27bc..d28800a 100644
--- a/libpackagekit/pk-bitfield.h
+++ b/libpackagekit/pk-bitfield.h
@@ -28,13 +28,13 @@
 
 G_BEGIN_DECLS
 
+typedef guint64 PkBitfield;
+
 /* convenience functions as it's easy to forget the bitwise operators */
 #define pk_bitfield_add(bitfield,enum)		do { ((bitfield) |= (pk_bitfield_value(enum))); } while (0)
 #define pk_bitfield_remove(bitfield,enum)	do { ((bitfield) &= ~(pk_bitfield_value(enum))); } while (0)
 #define pk_bitfield_contain(bitfield,enum)	(((bitfield) & (pk_bitfield_value(enum))) > 0)
-#define pk_bitfield_value(enum)			(1 << (enum))
-
-typedef guint PkBitfield;
+#define pk_bitfield_value(enum)			((PkBitfield) 1 << (enum))
 
 gint		 pk_bitfield_contain_priority		(PkBitfield	 values,
 							 gint		 value, ...);
commit 58cd3d544239984be5ab45ab3f579f1bfc6a5b6c
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 09:17:15 2008 +0100

    trivial: add two backtrace statements to try and find a bug

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 1502901..d6f147b 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -1365,6 +1365,7 @@ pk_backend_error_timeout_delay_cb (gpointer data)
 	/* check we have not already finished */
 	if (backend->priv->finished) {
 		egg_warning ("consistency error");
+		egg_debug_backtrace ();
 		return FALSE;
 	}
 
@@ -1513,6 +1514,7 @@ pk_backend_set_exit_code (PkBackend *backend, PkExitEnum exit)
 		egg_warning ("already set exit status: old=%s, new=%s",
 			    pk_exit_enum_to_text (backend->priv->exit),
 			    pk_exit_enum_to_text (exit));
+		egg_debug_backtrace ();
 		return FALSE;
 	}
 
diff --git a/src/pk-main.c b/src/pk-main.c
index 1bea38c..88e6ed0 100644
--- a/src/pk-main.c
+++ b/src/pk-main.c
@@ -279,19 +279,16 @@ main (int argc, char *argv[])
 
 	/* Only timeout and close the mainloop if we have specified it
 	 * on the command line */
-	if (timed_exit) {
+	if (timed_exit)
 		g_timeout_add_seconds (20, (GSourceFunc) timed_exit_cb, loop);
-	}
 
 	/* only poll every 10 seconds when we are alive */
-	if (exit_idle_time != 0 && disable_timer == FALSE) {
+	if (exit_idle_time != 0 && !disable_timer)
 		g_timeout_add_seconds (5, (GSourceFunc) pk_main_timeout_check_cb, engine);
-	}
 
 	/* immediatly exit */
-	if (immediate_exit) {
+	if (immediate_exit)
 		g_timeout_add (50, (GSourceFunc) timed_exit_cb, loop);
-	}
 
 	g_main_loop_run (loop);
 	g_main_loop_unref (loop);
commit 6f0c2dbc82441d10da2db1e32bc43f4767fcc9ee
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 10:13:04 2008 +0200

    urpmi: bugfix, removed PK_GROUP_ENUM_UNKNOWN which cause problem with get_group function

diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 7dbbef1..49b5f5f 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -55,7 +55,6 @@ static PkBitfield
 backend_get_groups (PkBackend *backend)
 {
 	return pk_bitfield_from_enums (
-		PK_GROUP_ENUM_UNKNOWN,
 		PK_GROUP_ENUM_ACCESSIBILITY,
 		PK_GROUP_ENUM_ACCESSORIES,
 		PK_GROUP_ENUM_EDUCATION,
commit 8894702f2f2f8a123fe4b59ec756554e80780318
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 23:04:02 2008 +0200

    smart: avoid looking in external pathlists for installed packages

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 4855a1d..01d2b88 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -359,9 +359,12 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         packages = self.ctrl.getCache().getPackages()
         for package in packages:
             if self._package_passes_filters(package, filters):
-                # FIXME: Only installed packages have path lists.
                 paths = []
                 for loader in package.loaders:
+                    channel = loader.getChannel()
+                    if package.installed and not \
+                       channel.getType().endswith('-sys'):
+                        continue
                     info = loader.getInfo(package)
                     paths = info.getPathList()
                     if len(paths) > 0:
commit 1d084ab6e4e7a4a209e880366a255a5557131241
Merge: 0c30e1c... 94d9b0e...
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 19:01:25 2008 +0200

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

commit 94d9b0e97e4eaf62b1045c20d3bcb104d10f15d9
Merge: 3029007... 73535b6...
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:54:52 2008 +0100

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

commit 0c30e1cf234626e198f0689f937aa7e62c473aa0
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 18:54:51 2008 +0200

    urpmi: get-depends now supports package ids list argument

diff --git a/backends/urpmi/helpers/get-depends.pl b/backends/urpmi/helpers/get-depends.pl
index f770d46..766c50e 100755
--- a/backends/urpmi/helpers/get-depends.pl
+++ b/backends/urpmi/helpers/get-depends.pl
@@ -31,11 +31,11 @@ use urpmi_backend::tools;
 use perl_packagekit::enums;
 use perl_packagekit::prints;
 
-# Two arguments (filter, package id)
-exit if($#ARGV != 2);
+# 3 arguments (filter, package id, recursive)
+$#ARGV == 2 or exit 1;
 
 my @filters = split(/;/, $ARGV[0]);
-my @pkgid = split(/;/, $ARGV[1]);
+my @pkgids = split(/\|/, $ARGV[1]);
 my $recursive_option = 0;
 
 # We force the recursive option
@@ -46,26 +46,27 @@ pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
+my @pkgnames;
+foreach (@pkgids) {
+  my @pkgid = split(/;/, $_);
+  push(@pkgnames, $pkgid[0]);
+}
+print join(" ", @pkgnames);
+print "\n";
 my %requested;
-my @names = (@pkgid[0]);
-my $results = urpm::select::search_packages($urpm, \%requested, \@names,
+my $results = urpm::select::search_packages($urpm, \%requested, \@pkgnames,
   fuzzy => 0,
   caseinsensitive => 0,
   all => 0
 );
 
-exit if !$results;
-my @requested_keys = keys %requested;
-my $package_id = pop @requested_keys;
-
-my %resolv_request = ();
-%resolv_request->{$package_id} = 1;
+$results or exit;
 
 my $empty_db = new URPM;
 my $state = {};
 $urpm->resolve_requested($empty_db,
   $state,
-  \%resolv_request,
+  \%requested,
 );
 
 my $db = open_rpm_db();
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 131d3ea..7dbbef1 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -156,9 +156,12 @@ static void
 backend_get_depends (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
 	gchar *filters_text;
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
 	filters_text = pk_filter_bitfield_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-depends.pl", filters_text, package_ids[0], pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-depends.pl", filters_text, package_ids_temp, pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
commit 302900797c0a21314ae3100f4a11b0f57687ff80
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:53:49 2008 +0100

    trivial: make PackageKit NULL-FALSE sparse clean

diff --git a/libpackagekit/pk-extra.c b/libpackagekit/pk-extra.c
index 6fb6cc4..18683aa 100644
--- a/libpackagekit/pk-extra.c
+++ b/libpackagekit/pk-extra.c
@@ -330,9 +330,8 @@ pk_extra_get_summary (PkExtra *extra, const gchar *package)
 
 	/* super quick if exists in cache */
 	obj = g_hash_table_lookup (extra->priv->hash_locale, package);
-	if (obj == NULL) {
-		return FALSE;
-	}
+	if (obj == NULL)
+		return NULL;
 	return obj->summary;
 }
 
@@ -352,9 +351,8 @@ pk_extra_get_icon_name (PkExtra *extra, const gchar *package)
 
 	/* super quick if exists in cache */
 	obj = g_hash_table_lookup (extra->priv->hash_package, package);
-	if (obj == NULL) {
-		return FALSE;
-	}
+	if (obj == NULL)
+		return NULL;
 	return obj->icon_name;
 }
 
@@ -374,9 +372,8 @@ pk_extra_get_exec (PkExtra *extra, const gchar *package)
 
 	/* super quick if exists in cache */
 	obj = g_hash_table_lookup (extra->priv->hash_package, package);
-	if (obj == NULL) {
-		return FALSE;
-	}
+	if (obj == NULL)
+		return NULL;
 	return obj->exec;
 }
 
diff --git a/libpackagekit/pk-package-obj.c b/libpackagekit/pk-package-obj.c
index d80f5c4..80f476a 100644
--- a/libpackagekit/pk-package-obj.c
+++ b/libpackagekit/pk-package-obj.c
@@ -56,7 +56,7 @@ pk_package_obj_new (PkInfoEnum info, const PkPackageId *id, const gchar *summary
 {
 	PkPackageObj *obj;
 
-	g_return_val_if_fail (id != NULL, FALSE);
+	g_return_val_if_fail (id != NULL, NULL);
 
 	obj = g_new0 (PkPackageObj, 1);
 	obj->info = info;
diff --git a/src/pk-backend.c b/src/pk-backend.c
index 86c359b..1502901 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -517,7 +517,7 @@ pk_backend_get_pointer (PkBackend *backend, const gchar *key)
 	value = g_hash_table_lookup (backend->priv->hash_pointer, (gpointer) key);
 	if (value == NULL) {
 		egg_warning ("not set data for %s", key);
-		return FALSE;
+		return NULL;
 	}
 	return value-1;
 }
commit 2d7de5d8a9bbcf2682eed083cbe605c5f9739a3e
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:51:43 2008 +0100

    trivial: fix a trailing comma in an enumerated type

diff --git a/libpackagekit/pk-control.h b/libpackagekit/pk-control.h
index a2d787f..4e90be6 100644
--- a/libpackagekit/pk-control.h
+++ b/libpackagekit/pk-control.h
@@ -54,7 +54,7 @@ typedef struct _PkControlClass		PkControlClass;
  */
 typedef enum
 {
-	PK_CONTROL_ERROR_FAILED,
+	PK_CONTROL_ERROR_FAILED
 } PkControlError;
 
 struct _PkControl
commit 7ed193d9103ab9b17d652c50f20b4c9e703888a1
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:51:10 2008 +0100

    trivial: fix any duplicated headers

diff --git a/src/pk-backend-dbus.c b/src/pk-backend-dbus.c
index a771422..699e2f3 100644
--- a/src/pk-backend-dbus.c
+++ b/src/pk-backend-dbus.c
@@ -51,7 +51,6 @@
 #include "pk-backend-internal.h"
 #include "pk-backend-dbus.h"
 #include "pk-marshal.h"
-#include "pk-enum.h"
 #include "pk-time.h"
 #include "pk-inhibit.h"
 
diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 6b5c4a5..12dd6e4 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -51,7 +51,6 @@
 #include "pk-backend-internal.h"
 #include "pk-backend-spawn.h"
 #include "pk-marshal.h"
-#include "pk-enum.h"
 #include "pk-spawn.h"
 #include "pk-time.h"
 #include "pk-inhibit.h"
diff --git a/src/pk-engine.c b/src/pk-engine.c
index daa40ef..adf2b17 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -37,18 +37,17 @@
 #include <glib/gstdio.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
+
 #include <pk-package-id.h>
 #include <pk-package-ids.h>
 #include <pk-package-list.h>
-
-#include "egg-debug.h"
-#include "egg-string.h"
-
 #include <pk-common.h>
 #include <pk-network.h>
-#include <pk-package-list.h>
 #include <pk-enum.h>
 
+#include "egg-debug.h"
+#include "egg-string.h"
+
 #include "pk-cache.h"
 #include "pk-shared.h"
 #include "pk-update-detail-list.h"
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 520b20c..196b8ee 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -38,7 +38,6 @@
 
 #include <glib/gstdio.h>
 #include <glib/gi18n.h>
-#include <egg-dbus-monitor.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
commit f7a117384b6cb3cca57da27306118f5d690786b7
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:47:34 2008 +0100

    feature: add documentation about how the udev firmware loading stuff actually works

diff --git a/contrib/udev/README b/contrib/udev/README
new file mode 100644
index 0000000..766ecbd
--- /dev/null
+++ b/contrib/udev/README
@@ -0,0 +1,27 @@
+README:
+
+PackageKit installs missing firmware as it requested by udev: this is how
+the whole system is designed to work.
+
+Introduction:
+
+ 1. user plugs in hardware / boots computer
+ 2. udev gets the firmware request uevent
+ 3. 51-packagekit-firmware.rules udev rule gets matched, this executes
+    packagekit-firmware.sh
+ 4. This script searches for the firmware file, and if not found, creates a
+    file in /var/run/PackageKit/udev with a random name (e.g. firmware-a1abc1de3),
+    and echos the filename of the firmware into it
+ 5. Either the session tools are started by the user logging in, or there is an
+    inotify watch on this directory -- this prompts the session software to try
+    and find an installable package, and if so install it.
+    The session tools ignore any duplicate entries or files they searched for before.
+ 6. Every time a RefreshCache() method is called, the contents of
+    /var/run/PackageKit/udev are deleted -- this can also be cleared on shutdown
+    by editing the distro scripts if desired
+
+Notes:
+
+ * We create the random file name so that we do not overwrite an existing
+   firmware request as these rules could be run in parallel.
+
commit 0f6638dfaf13b6890ee51e01d7d813f196384084
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:45:51 2008 +0100

    bugfix: fix up all the memory leaks found by the self tests in client, and another trivial one in PkUpdateDetailList

diff --git a/client/pk-console.c b/client/pk-console.c
index 8df03e9..3a366a4 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -687,8 +687,8 @@ out:
 	g_strfreev (package_ids);
 	g_strfreev (files);
 	g_ptr_array_foreach (array_files, (GFunc) g_free, NULL);
-	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
 	g_ptr_array_free (array_files, TRUE);
+	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
 	g_ptr_array_free (array_packages, TRUE);
 	return ret;
 }
@@ -873,6 +873,7 @@ pk_console_download_packages (PkClient *client, gchar **packages, const gchar *d
 
 out:
 	g_strfreev (package_ids);
+	g_ptr_array_foreach (array_packages, (GFunc) g_free, NULL);
 	g_ptr_array_free (array_packages, TRUE);
 	return ret;
 }
diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index 6275d33..fbd3b89 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -380,6 +380,7 @@ pk_generate_pack_create (const gchar *tarfilename, GPtrArray *file_array, GError
 	/* completed all okay */
 	ret = TRUE;
 out:
+	g_free (metadata_filename);
 	/* delete each filename */
 	for (i=0; i<file_array->len; i++) {
 		src = (const gchar *) g_ptr_array_index (file_array, i);
@@ -561,8 +562,10 @@ out:
 	if (list != NULL)
 		g_object_unref (list);
 	g_free (package_id);
-	if (file_array != NULL)
+	if (file_array != NULL) {
+		g_ptr_array_foreach (file_array, (GFunc) g_free, NULL);
 		g_ptr_array_free (file_array, TRUE);
+	}
 	return ret;
 }
 
@@ -704,7 +707,7 @@ pk_genpack_test (EggTest *test)
 	file_array = g_ptr_array_new ();
 	src = g_build_filename ("/tmp", "gitk-1.5.5.1-1.fc9.i386.rpm", NULL);
 	g_ptr_array_add (file_array, src);
-	ret = pk_generate_pack_create ("/tmp/gitk.servicepack",file_array, &error);
+	ret = pk_generate_pack_create ("/tmp/gitk.servicepack", file_array, &error);
 	if (!ret) {
 		if (error != NULL) {
 			egg_test_failed (test, "failed to create pack %s" , error->message);
@@ -712,11 +715,13 @@ pk_genpack_test (EggTest *test)
 		} else {
 			egg_test_failed (test, "could not set error");
 		}
-	} else {
+	} else
 		egg_test_success (test, NULL);
-	}
-	if (file_array != NULL)
+
+	if (file_array != NULL) {
+		g_ptr_array_foreach (file_array, (GFunc) g_free, NULL);
 		g_ptr_array_free (file_array, TRUE);
+	}
 	g_remove ("/tmp/gitk.servicepack");
 
 	/************************************************************/
diff --git a/client/pk-import-desktop.c b/client/pk-import-desktop.c
index dd81dce..0fd7f1b 100644
--- a/client/pk-import-desktop.c
+++ b/client/pk-import-desktop.c
@@ -187,6 +187,7 @@ pk_desktop_process_desktop (const gchar *package_name, const gchar *filename)
 		}
 		g_free (name);
 	}
+	g_ptr_array_foreach (locale_array, (GFunc) g_free, NULL);
 	g_ptr_array_free (locale_array, TRUE);
 	g_free (name_unlocalised);
 	g_print ("]\n");
diff --git a/client/pk-import-specspo.c b/client/pk-import-specspo.c
index a930e8a..4fed402 100644
--- a/client/pk-import-specspo.c
+++ b/client/pk-import-specspo.c
@@ -195,7 +195,9 @@ main (int argc, char *argv[])
 out:
 	g_object_unref (client);
 	g_object_unref (extra);
+	g_ptr_array_foreach (package_array, (GFunc) g_free, NULL);
 	g_ptr_array_free (package_array, TRUE);
+	g_ptr_array_foreach (locale_array, (GFunc) g_free, NULL);
 	g_ptr_array_free (locale_array, TRUE);
 
 	return 0;
diff --git a/src/pk-update-detail-list.c b/src/pk-update-detail-list.c
index 447acc6..2101ce6 100644
--- a/src/pk-update-detail-list.c
+++ b/src/pk-update-detail-list.c
@@ -128,7 +128,7 @@ pk_update_detail_list_finalize (GObject *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, FALSE);
+	g_ptr_array_free (list->priv->array, TRUE);
 
 	G_OBJECT_CLASS (pk_update_detail_list_parent_class)->finalize (object);
 }
commit 67f4dee00c5492e2c6db6d76f2a1fc49ce6aa069
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 18:39:18 2008 +0200

    urpmi: get-files now supports package ids list argument

diff --git a/backends/urpmi/helpers/get-files.pl b/backends/urpmi/helpers/get-files.pl
index 88424bb..57edede 100755
--- a/backends/urpmi/helpers/get-files.pl
+++ b/backends/urpmi/helpers/get-files.pl
@@ -27,24 +27,36 @@ use MDK::Common;
 
 use perl_packagekit::prints;
 
-# One argument (package id)
-exit if($#ARGV != 0);
-
+# One argument (package ids)
+$#ARGV == 0 or exit 1;
 
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
-my $pkg = get_package_by_package_id($urpm, $ARGV[0]);
+my @pkgids = split(/\|/,$ARGV[0]);
+
+foreach (@pkgids) {
+  print_package_files($urpm, $_);
+}
 
-my $medium = pkg2medium($pkg, $urpm);
-my $xml_info = 'files';
-my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
-require urpm::xml_info;
-require urpm::xml_info_pkg;
-my $name = urpm_name($pkg);
-my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
-my %xml_info_pkgs;
-put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
-my @files = map { chomp_($_) } split("\n", $xml_info_pkgs{$name}{files});
+sub print_package_files {
+
+  my ($urpm, $pkgid) = @_;
+
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+  
+  my $medium = pkg2medium($pkg, $urpm);
+  my $xml_info = 'files';
+  my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
+  require urpm::xml_info;
+  require urpm::xml_info_pkg;
+  my $name = urpm_name($pkg);
+  my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
+  my %xml_info_pkgs;
+  put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
+  my @files = map { chomp_($_) } split("\n", $xml_info_pkgs{$name}{files});
+  
+  pk_print_files(get_package_id($pkg), join(';', @files));
 
-pk_print_files(get_package_id($pkg), join(';', @files));
+}
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index ed80ba4..131d3ea 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -143,7 +143,10 @@ backend_get_details (PkBackend *backend, gchar **package_ids)
 static void
 backend_get_files (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-files.pl", package_ids[0], NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-files.pl", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
commit c171832f31714e60d20385fc1018a3a69be9eac6
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 17:36:15 2008 +0100

    bugfix: fix up all the memory leaks found by the self tests in src and libpackagekit -- saving 640 bytes, and fixing a couple of small slow daemon leaks

diff --git a/libpackagekit/egg-dbus-monitor.c b/libpackagekit/egg-dbus-monitor.c
index e28e50b..1c86cd9 100644
--- a/libpackagekit/egg-dbus-monitor.c
+++ b/libpackagekit/egg-dbus-monitor.c
@@ -243,6 +243,8 @@ egg_dbus_monitor_finalize (GObject *object)
 	monitor = EGG_DBUS_MONITOR (object);
 
 	g_return_if_fail (monitor->priv != NULL);
+
+	g_free (monitor->priv->service);
 	if (monitor->priv->proxy != NULL)
 		g_object_unref (monitor->priv->proxy);
 
diff --git a/libpackagekit/pk-catalog.c b/libpackagekit/pk-catalog.c
index c73bc2a..2336d14 100644
--- a/libpackagekit/pk-catalog.c
+++ b/libpackagekit/pk-catalog.c
@@ -80,16 +80,15 @@ pk_catalog_process_type_part (PkCatalog *catalog, GPtrArray *array, const gchar
 	}
 
 	/* make key */
-	if (distro_id_part == NULL) {
+	if (distro_id_part == NULL)
 		key = g_strdup (catalog->priv->type);
-	} else {
+	else
 		key = g_strdup_printf ("%s(%s)", catalog->priv->type, distro_id_part);
-	}
 	data = g_key_file_get_string (catalog->priv->file, PK_CATALOG_FILE_HEADER, key, NULL);
 	g_free (key);
 
 	/* we have no key of this name */
-	if (egg_strzero (data))
+	if (data == NULL)
 		return FALSE;
 
 	/* split using the three delimiters */
@@ -204,6 +203,7 @@ pk_catalog_process_type (PkCatalog *catalog)
 	}
 
 	g_strfreev (parts);
+	g_ptr_array_foreach (array, (GFunc) g_free, NULL);
 	g_ptr_array_free (array, TRUE);
 	return ret;
 }
diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 3ccf675..c3266e1 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -356,9 +356,8 @@ pk_client_error_auth_obtain (GError *error)
 gchar *
 pk_client_get_tid (PkClient *client)
 {
-	if (client->priv->tid == NULL) {
+	if (client->priv->tid == NULL)
 		return NULL;
-	}
 	return g_strdup (client->priv->tid);
 }
 
@@ -4333,9 +4332,8 @@ pk_client_test (EggTest *test)
 
 	/* get the tid */
 	tid = pk_client_get_tid (client);
-	if (tid == NULL) {
+	if (tid == NULL)
 		egg_test_failed (test, "failed to get tid");
-	}
 
 	/* set the tid on the copy */
 	ret = pk_client_set_tid (client_copy, tid, &error);
@@ -4344,6 +4342,7 @@ pk_client_test (EggTest *test)
 		g_error_free (error);
 		error = NULL;
 	}
+	g_free (tid);
 
 	egg_test_loop_wait (test, 5000);
 	if (clone_packages != size_new) {
diff --git a/libpackagekit/pk-common.c b/libpackagekit/pk-common.c
index a0cb607..d97ffb4 100644
--- a/libpackagekit/pk-common.c
+++ b/libpackagekit/pk-common.c
@@ -460,6 +460,7 @@ pk_va_list_to_argv (const gchar *string_first, va_list *args)
 	array = pk_ptr_array_to_argv (ptr_array);
 
 	/* get rid of the array, and free the contents */
+	g_ptr_array_foreach (ptr_array, (GFunc) g_free, NULL);
 	g_ptr_array_free (ptr_array, TRUE);
 	return array;
 }
diff --git a/libpackagekit/pk-package-id.c b/libpackagekit/pk-package-id.c
index 9d911fb..7e6e192 100644
--- a/libpackagekit/pk-package-id.c
+++ b/libpackagekit/pk-package-id.c
@@ -473,9 +473,8 @@ pk_package_id_test (EggTest *test)
 	text = pk_package_id_to_string (id2);
 	if (egg_strequal (text, "moo;0.0.1;i386;fedora"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "package_id is '%s'", text);
-	}
 	g_free (text);
 	pk_package_id_free (id);
 	pk_package_id_free (id2);
@@ -486,9 +485,8 @@ pk_package_id_test (EggTest *test)
 	text = pk_package_id_to_string (id);
 	if (egg_strequal (text, "moo;;;"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "package_id is '%s', should be '%s'", text, "moo;;;");
-	}
 	g_free (text);
 	pk_package_id_free (id);
 
diff --git a/libpackagekit/pk-package-ids.c b/libpackagekit/pk-package-ids.c
index 4269c8d..c179853 100644
--- a/libpackagekit/pk-package-ids.c
+++ b/libpackagekit/pk-package-ids.c
@@ -207,10 +207,10 @@ pk_package_ids_to_text (gchar **package_ids, const gchar *delimiter)
 #include "egg-test.h"
 
 /**
- * pk_package_id_tests_va_list:
+ * pk_package_ids_test_va_list:
  **/
 static gchar **
-pk_package_id_tests_va_list (const gchar *package_id_first, ...)
+pk_package_ids_test_va_list (const gchar *package_id_first, ...)
 {
 	va_list args;
 	gchar **package_ids;
@@ -225,7 +225,7 @@ pk_package_id_tests_va_list (const gchar *package_id_first, ...)
 
 
 void
-pk_package_id_tests (EggTest *test)
+pk_package_ids_test (EggTest *test)
 {
 	gboolean ret;
 	gchar *text;
@@ -240,7 +240,7 @@ pk_package_id_tests (EggTest *test)
 	 ************************************************************/
 
 	egg_test_title (test, "parse va_list");
-	package_ids = pk_package_id_tests_va_list ("foo;0.0.1;i386;fedora", "bar;0.1.1;noarch;livna", NULL);
+	package_ids = pk_package_ids_test_va_list ("foo;0.0.1;i386;fedora", "bar;0.1.1;noarch;livna", NULL);
 	if (package_ids != NULL)
 		egg_test_success (test, NULL);
 	else
@@ -293,6 +293,9 @@ pk_package_id_tests (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, NULL);
+	g_free (text);
+
+	g_strfreev (package_ids);
 
 	egg_test_end (test);
 }
diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index d6bc0b5..f72628a 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -185,6 +185,7 @@ pk_package_list_to_argv (PkPackageList *plist)
 
 	/* convert to argv */
 	package_ids = pk_ptr_array_to_argv (array);
+	g_ptr_array_foreach (array, (GFunc) g_free, NULL);
 	g_ptr_array_free (array, TRUE);
 
 	return package_ids;
@@ -547,7 +548,7 @@ pk_package_list_finalize (GObject *object)
 	g_return_if_fail (plist->priv != NULL);
 
 	/* removed any cached packages */
-	pk_package_list_clear (plist);
+	g_ptr_array_foreach (plist->priv->array, (GFunc) pk_package_obj_free, NULL);
 	g_ptr_array_free (plist->priv->array, TRUE);
 
 	G_OBJECT_CLASS (pk_package_list_parent_class)->finalize (object);
@@ -585,6 +586,8 @@ pk_package_list_test (EggTest *test)
 	gchar *r1_text;
 	gchar *r2_text;
 	PkPackageId *id;
+	guint size;
+	gchar **argv;
 
 	if (!egg_test_start (test, "PkPackageList"))
 		return;
@@ -598,6 +601,14 @@ pk_package_list_test (EggTest *test)
 		egg_test_failed (test, NULL);
 
 	/************************************************************/
+	egg_test_title (test, "make sure size is zero");
+	size = pk_package_list_get_size (plist);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size: %i", size);
+
+	/************************************************************/
 	egg_test_title (test, "add entry");
 	id = pk_package_id_new_from_string ("gnome;1.23;i386;data");
 	ret = pk_package_list_add (plist, PK_INFO_ENUM_INSTALLED, id, "GNOME!");
@@ -608,10 +619,30 @@ pk_package_list_test (EggTest *test)
 		egg_test_failed (test, NULL);
 
 	/************************************************************/
+	egg_test_title (test, "make sure size is one");
+	size = pk_package_list_get_size (plist);
+	if (size == 1)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size: %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "make sure argv is correct");
+	argv = pk_package_list_to_argv (plist);
+	if (argv != NULL &&
+	    egg_strequal (argv[0], "gnome;1.23;i386;data") &&
+	    argv[1] == NULL)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "list: %s", argv[0]);
+	g_strfreev (argv);
+
+	/************************************************************/
 	egg_test_title (test, "check not exists");
 	id = pk_package_id_new_from_string ("gnome;1.23;i386;data");
 	ret = pk_package_list_contains (plist, "liferea;1.23;i386;data");
-	if (ret == FALSE)
+	pk_package_id_free (id);
+	if (!ret)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, NULL);
@@ -688,9 +719,11 @@ pk_package_list_test (EggTest *test)
 	    egg_strequal (r1_text, "def;1.23;i386;data") &&
 	    egg_strequal (r2_text, "ghi;1.23;i386;data"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "could not sort: %s,%s,%s", r0_text, r1_text, r2_text);
-	}
+	g_free (r0_text);
+	g_free (r1_text);
+	g_free (r2_text);
 
 	/************************************************************/
 	egg_test_title (test, "sort by summary");
@@ -750,9 +783,11 @@ pk_package_list_test (EggTest *test)
 	    egg_strequal (r1_text, "def;1.23;i386;data") &&
 	    egg_strequal (r2_text, "ghi;1.23;i386;data"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "could not sort: %s,%s,%s", r0_text, r1_text, r2_text);
-	}
+	g_free (r0_text);
+	g_free (r1_text);
+	g_free (r2_text);
 
 	g_object_unref (plist);
 
diff --git a/libpackagekit/pk-package-obj.c b/libpackagekit/pk-package-obj.c
index 71b27c8..d80f5c4 100644
--- a/libpackagekit/pk-package-obj.c
+++ b/libpackagekit/pk-package-obj.c
@@ -245,9 +245,8 @@ pk_package_obj_test (EggTest *test)
 	text = pk_package_obj_to_string (obj1);
 	if (egg_strequal (text, "installed\tgnome;1.23;i386;data\tGNOME!"))
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "got %s", text);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check from string");
@@ -266,6 +265,7 @@ pk_package_obj_test (EggTest *test)
 	pk_package_id_free (id);
 	pk_package_obj_free (obj1);
 	pk_package_obj_free (obj2);
+	pk_package_obj_free (obj3);
 	g_free (text);
 
 	egg_test_end (test);
diff --git a/libpackagekit/pk-self-test.c b/libpackagekit/pk-self-test.c
index 6172d22..6048bcb 100644
--- a/libpackagekit/pk-self-test.c
+++ b/libpackagekit/pk-self-test.c
@@ -30,7 +30,7 @@
 void egg_string_test (EggTest *test);
 void egg_obj_list_test (EggTest *test);
 void pk_package_id_test (EggTest *test);
-void pk_package_id_tests (EggTest *test);
+void pk_package_ids_test (EggTest *test);
 void pk_package_obj_test (EggTest *test);
 void pk_package_list_test (EggTest *test);
 void pk_enum_test (EggTest *test);
@@ -59,7 +59,7 @@ main (int argc, char **argv)
 	egg_obj_list_test (test);
 	pk_common_test (test);
 	pk_package_id_test (test);
-	pk_package_id_tests (test);
+	pk_package_ids_test (test);
 	pk_package_obj_test (test);
 	pk_package_list_test (test);
 	pk_enum_test (test);
diff --git a/libpackagekit/pk-task-list.c b/libpackagekit/pk-task-list.c
index 7ec0c90..2bdb08f 100644
--- a/libpackagekit/pk-task-list.c
+++ b/libpackagekit/pk-task-list.c
@@ -205,6 +205,56 @@ gpk_task_list_message_cb (PkClient *client, PkMessageEnum message, const gchar *
 }
 
 /**
+ * pk_task_list_item_free:
+ **/
+static void
+pk_task_list_item_free (PkTaskListItem *item)
+{
+	g_return_if_fail (item != NULL);
+	g_object_unref (item->monitor);
+	g_free (item->tid);
+	g_free (item->text);
+	g_free (item);
+}
+
+/**
+ * pk_task_list_item_create:
+ **/
+static PkTaskListItem *
+pk_task_list_item_create (PkTaskList *tlist, const gchar *tid)
+{
+	gboolean ret;
+	GError *error = NULL;
+	PkTaskListItem *item;
+
+	g_return_val_if_fail (PK_IS_TASK_LIST (tlist), NULL);
+	g_return_val_if_fail (tid != NULL, NULL);
+
+	item = g_new0 (PkTaskListItem, 1);
+	item->tid = g_strdup (tid);
+	item->monitor = pk_client_new ();
+	g_signal_connect (item->monitor, "status-changed",
+			  G_CALLBACK (pk_task_list_status_changed_cb), tlist);
+	g_signal_connect (item->monitor, "finished",
+			  G_CALLBACK (gpk_task_list_finished_cb), tlist);
+	g_signal_connect (item->monitor, "error-code",
+			  G_CALLBACK (gpk_task_list_error_code_cb), tlist);
+	g_signal_connect (item->monitor, "message",
+			  G_CALLBACK (gpk_task_list_message_cb), tlist);
+	ret = pk_client_set_tid (item->monitor, tid, &error);
+	if (!ret) {
+		egg_error ("could not set tid: %s", error->message);
+		g_error_free (error);
+		pk_task_list_item_free (item);
+		return NULL;
+	}
+	pk_client_get_role (item->monitor, &item->role, &item->text, NULL);
+	pk_client_get_status (item->monitor, &item->status, NULL);
+
+	return item;
+}
+
+/**
  * pk_task_list_refresh:
  *
  * Not normally required, but force a refresh
@@ -217,8 +267,6 @@ pk_task_list_refresh (PkTaskList *tlist)
 	guint length;
 	const gchar *tid;
 	const gchar **array;
-	GError *error = NULL;
-	gboolean ret;
 
 	g_return_val_if_fail (PK_IS_TASK_LIST (tlist), FALSE);
 
@@ -240,26 +288,7 @@ pk_task_list_refresh (PkTaskList *tlist)
 		item = pk_task_list_find_existing_tid (tlist, tid);
 		if (item == NULL) {
 			egg_debug ("new job, have to create %s", tid);
-			item = g_new0 (PkTaskListItem, 1);
-			item->tid = g_strdup (tid);
-			item->monitor = pk_client_new ();
-			g_signal_connect (item->monitor, "status-changed",
-					  G_CALLBACK (pk_task_list_status_changed_cb), tlist);
-			g_signal_connect (item->monitor, "finished",
-					  G_CALLBACK (gpk_task_list_finished_cb), tlist);
-			g_signal_connect (item->monitor, "error-code",
-					  G_CALLBACK (gpk_task_list_error_code_cb), tlist);
-			g_signal_connect (item->monitor, "message",
-					  G_CALLBACK (gpk_task_list_message_cb), tlist);
-			ret = pk_client_set_tid (item->monitor, tid, &error);
-			if (!ret) {
-				egg_error ("could not set tid: %s", error->message);
-				g_error_free (error);
-				break;
-			}
-			pk_client_get_role (item->monitor, &item->role, &item->text, NULL);
-			pk_client_get_status (item->monitor, &item->status, NULL);
-
+			item = pk_task_list_item_create (tlist, tid);
 			/* add to watched array */
 			g_ptr_array_add (tlist->priv->task_list, item);
 		}
@@ -272,11 +301,8 @@ pk_task_list_refresh (PkTaskList *tlist)
 	for (i=0; i<tlist->priv->task_list->len; i++) {
 		item = g_ptr_array_index (tlist->priv->task_list, i);
 		if (!item->valid) {
-			g_object_unref (item->monitor);
+			pk_task_list_item_free (item);
 			g_ptr_array_remove (tlist->priv->task_list, item);
-			g_free (item->tid);
-			g_free (item->text);
-			g_free (item);
 		}
 	}
 
@@ -317,7 +343,7 @@ pk_task_list_transaction_list_changed_cb (PkControl *control, PkTaskList *tlist)
 	/* for now, just refresh all the jobs. a little inefficient me thinks */
 	pk_task_list_refresh (tlist);
 	egg_debug ("emit changed");
-	g_signal_emit (tlist , signals [PK_TASK_LIST_CHANGED], 0);
+	g_signal_emit (tlist, signals [PK_TASK_LIST_CHANGED], 0);
 }
 
 /**
@@ -328,10 +354,10 @@ pk_task_list_connection_changed_cb (PkConnection *connection, gboolean connected
 {
 	g_return_if_fail (PK_IS_TASK_LIST (tlist));
 	egg_debug ("connected=%i", connected);
-	if (connected) {
-		/* force a refresh so we have valid data*/
+
+	/* force a refresh so we have valid data */
+	if (connected)
 		pk_task_list_refresh (tlist);
-	}
 }
 
 /**
@@ -452,8 +478,6 @@ pk_task_list_init (PkTaskList *tlist)
 static void
 pk_task_list_finalize (GObject *object)
 {
-	guint i;
-	PkTaskListItem *item;
 	PkTaskList *tlist;
 
 	g_return_if_fail (object != NULL);
@@ -462,14 +486,7 @@ pk_task_list_finalize (GObject *object)
 	g_return_if_fail (tlist->priv != NULL);
 
 	/* remove all watches */
-	for (i=0; i<tlist->priv->task_list->len; i++) {
-		item = g_ptr_array_index (tlist->priv->task_list, i);
-		g_object_unref (item->monitor);
-		g_free (item->text);
-		g_ptr_array_remove (tlist->priv->task_list, item);
-		g_free (item);
-	}
-
+	g_ptr_array_foreach (tlist->priv->task_list, (GFunc) pk_task_list_item_free, NULL);
 	g_ptr_array_free (tlist->priv->task_list, TRUE);
 	g_object_unref (tlist->priv->control);
 
diff --git a/src/pk-inhibit.c b/src/pk-inhibit.c
index 92701f0..a9e68a7 100644
--- a/src/pk-inhibit.c
+++ b/src/pk-inhibit.c
@@ -167,9 +167,8 @@ pk_inhibit_add (PkInhibit *inhibit, gpointer data)
 	}
 	g_ptr_array_add (inhibit->priv->array, data);
 	/* do inhibit */
-	if (inhibit->priv->array->len == 1) {
+	if (inhibit->priv->array->len == 1)
 		ret = pk_inhibit_lock (inhibit);
-	}
 	return ret;
 }
 
@@ -187,9 +186,8 @@ pk_inhibit_remove (PkInhibit *inhibit, gpointer data)
 	for (i=0; i<inhibit->priv->array->len; i++) {
 		if (g_ptr_array_index (inhibit->priv->array, i) == data) {
 			g_ptr_array_remove_index (inhibit->priv->array, i);
-			if (inhibit->priv->array->len == 0) {
+			if (inhibit->priv->array->len == 0)
 				ret = pk_inhibit_unlock (inhibit);
-			}
 			return ret;
 		}
 	}
@@ -212,10 +210,10 @@ pk_inhibit_finalize (GObject *object)
 	/* force an unlock if we are inhibited */
 	if (inhibit->priv->is_locked) {
 		ret = pk_inhibit_unlock (inhibit);
-		if (!ret) {
+		if (!ret)
 			egg_warning ("failed to unock on finalise!");
-		}
 	}
+	/* no need to free the data in the array */
 	g_ptr_array_free (inhibit->priv->array, TRUE);
 	g_object_unref (inhibit->priv->proxy);
 
@@ -314,92 +312,82 @@ pk_inhibit_test (EggTest *test)
 
 	/************************************************************/
 	egg_test_title (test, "check we have a connection");
-	if (inhibit->priv->proxy != NULL) {
+	if (inhibit->priv->proxy != NULL)
 		egg_test_success (test, "got proxy");
-	} else {
+	else
 		egg_test_failed (test, "could not get proxy");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check we are not inhibited");
 	ret = pk_inhibit_locked (inhibit);
-	if (ret == FALSE) {
+	if (ret == FALSE)
 		egg_test_success (test, "marked correctly");
-	} else {
+	else
 		egg_test_failed (test, "not marked correctly");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "add 123");
 	ret = pk_inhibit_add (inhibit, GUINT_TO_POINTER (123));
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "inhibited");
-	} else {
+	else
 		egg_test_failed (test, "could not inhibit");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check we are inhibited");
 	ret = pk_inhibit_locked (inhibit);
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "marked correctly");
-	} else {
+	else
 		egg_test_failed (test, "not marked correctly");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "add 123 (again)");
 	ret = pk_inhibit_add (inhibit, GUINT_TO_POINTER (123));
-	if (ret == FALSE) {
+	if (ret == FALSE)
 		egg_test_success (test, "correctly ignored second");
-	} else {
+	else
 		egg_test_failed (test, "added the same number twice");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "add 456");
 	ret = pk_inhibit_add (inhibit, GUINT_TO_POINTER (456));
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "inhibited");
-	} else {
+	else
 		egg_test_failed (test, "could not inhibit");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "remove 123");
 	ret = pk_inhibit_remove (inhibit, GUINT_TO_POINTER (123));
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "removed first inhibit");
-	} else {
+	else
 		egg_test_failed (test, "could not remove inhibit");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check we are still inhibited");
 	ret = pk_inhibit_locked (inhibit);
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "marked correctly");
-	} else {
+	else
 		egg_test_failed (test, "not marked correctly");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "remove 456");
 	ret = pk_inhibit_remove (inhibit, GUINT_TO_POINTER (456));
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "removed second inhibit");
-	} else {
+	else
 		egg_test_failed (test, "could not remove inhibit");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "check we are not inhibited");
 	ret = pk_inhibit_locked (inhibit);
-	if (ret == FALSE) {
+	if (ret == FALSE)
 		egg_test_success (test, "marked correctly");
-	} else {
+	else
 		egg_test_failed (test, "not marked correctly");
-	}
 
 	g_object_unref (inhibit);
 
diff --git a/src/pk-security-polkit.c b/src/pk-security-polkit.c
index 50b345f..566a238 100644
--- a/src/pk-security-polkit.c
+++ b/src/pk-security-polkit.c
@@ -194,9 +194,8 @@ pk_security_action_is_allowed (PkSecurity *security, const gchar *dbus_sender,
 	/* get the dbus sender */
 	pk_result = pk_security_can_do_action (security, dbus_sender, policy);
 	if (pk_result != POLKIT_RESULT_YES) {
-		if (error_detail != NULL) {
+		if (error_detail != NULL)
 			*error_detail = g_strdup_printf ("%s %s", policy, polkit_result_to_string_representation (pk_result));
-		}
 		return FALSE;
 	}
 	return TRUE;
@@ -251,9 +250,8 @@ pk_security_io_add_watch (PolKitContext *pk_context, int fd)
 	guint id = 0;
 	GIOChannel *channel;
 	channel = g_io_channel_unix_new (fd);
-	if (channel == NULL) {
+	if (channel == NULL)
 		return id;
-	}
 	id = g_io_add_watch (channel, G_IO_IN, pk_security_io_watch_have_data, pk_context);
 	if (id == 0) {
 		g_io_channel_unref (channel);
@@ -282,7 +280,7 @@ pk_security_io_remove_watch (PolKitContext *pk_context, int watch_id)
 static void
 pk_security_init (PkSecurity *security)
 {
-	PolKitError *egg_error;
+	PolKitError *pk_error;
 	polkit_bool_t retval;
 	DBusError dbus_error;
 
@@ -308,11 +306,11 @@ pk_security_init (PkSecurity *security)
 					       pk_security_io_add_watch,
 					       pk_security_io_remove_watch);
 
-	egg_error = NULL;
-	retval = polkit_context_init (security->priv->pk_context, &egg_error);
+	pk_error = NULL;
+	retval = polkit_context_init (security->priv->pk_context, &pk_error);
 	if (retval == FALSE) {
-		egg_warning ("Could not init PolicyKit context: %s", polkit_error_get_error_message (egg_error));
-		polkit_error_free (egg_error);
+		egg_warning ("Could not init PolicyKit context: %s", polkit_error_get_error_message (pk_error));
+		polkit_error_free (pk_error);
 	}
 }
 
@@ -374,30 +372,27 @@ pk_security_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "map valid role to action");
 	action = pk_security_role_to_action (security, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES);
-	if (egg_strequal (action, "org.freedesktop.packagekit.system-update")) {
+	if (egg_strequal (action, "org.freedesktop.packagekit.system-update"))
 		egg_test_success (test, NULL, error);
-	} else {
+	else
 		egg_test_failed (test, "did not get correct action '%s'", action);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "map invalid role to action");
 	action = pk_security_role_to_action (security, FALSE, PK_ROLE_ENUM_SEARCH_NAME);
-	if (action == NULL) {
+	if (action == NULL)
 		egg_test_success (test, NULL, error);
-	} else {
+	else
 		egg_test_failed (test, "did not get correct action '%s'", action);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get the default backend");
 	error = NULL;
 	ret = pk_security_action_is_allowed (security, ":0", FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES, &error);
-	if (ret == FALSE) {
+	if (ret == FALSE)
 		egg_test_success (test, "did not authenticate update-package, error '%s'", error);
-	} else {
+	else
 		egg_test_failed (test, "authenticated update-package!");
-	}
 	g_free (error);
 
 	g_object_unref (security);
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 59d2c10..0fa96e5 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -413,7 +413,7 @@ pk_spawn_argv (PkSpawn *spawn, gchar **argv, gchar **envp)
 	}
 
 	/* save this so we can check the dispatcher name */
-	g_strdup (spawn->priv->last_argv0);
+	g_free (spawn->priv->last_argv0);
 	spawn->priv->last_argv0 = g_strdup (argv[0]);
 
 	/* save this in case the proxy or locale changes */
@@ -575,9 +575,8 @@ cancel_cb (gpointer data)
 static void
 new_spawn_object (EggTest *test, PkSpawn **pspawn)
 {
-	if (*pspawn != NULL) {
+	if (*pspawn != NULL)
 		g_object_unref (*pspawn);
-	}
 	*pspawn = pk_spawn_new ();
 	g_signal_connect (*pspawn, "exit",
 			  G_CALLBACK (pk_test_exit_cb), test);
@@ -591,6 +590,7 @@ pk_spawn_test (EggTest *test)
 {
 	PkSpawn *spawn = NULL;
 	gboolean ret;
+	gchar *file;
 	gchar *path;
 	gchar **argv;
 	gchar **envp;
@@ -610,19 +610,17 @@ pk_spawn_test (EggTest *test)
 	argv = g_strsplit ("pk-spawn-test-xxx.sh", " ", 0);
 	ret = pk_spawn_argv (spawn, argv, NULL);
 	g_strfreev (argv);
-	if (!ret) {
+	if (!ret)
 		egg_test_success (test, "failed to run invalid file");
-	} else {
+	else
 		egg_test_failed (test, "ran incorrect file");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "make sure finished wasn't called");
 	if (mexit == BAD_EXIT)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "Called finish for bad file!");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "make sure run correct helper");
@@ -632,11 +630,10 @@ pk_spawn_test (EggTest *test)
 	ret = pk_spawn_argv (spawn, argv, NULL);
 	g_free (path);
 	g_strfreev (argv);
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "ran correct file");
-	} else {
+	else
 		egg_test_failed (test, "did not run helper");
-	}
 
 	/* wait for finished */
 	egg_test_loop_wait (test, 10000);
@@ -646,25 +643,22 @@ pk_spawn_test (EggTest *test)
 	egg_test_title (test, "make sure finished okay");
 	if (mexit == PK_EXIT_ENUM_SUCCESS)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "finish was okay!");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "make sure finished was called only once");
 	if (finished_count == 1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "finish was called %i times!", finished_count);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "make sure we got the right stdout data");
-	if (stdout_count == 4+11) {
+	if (stdout_count == 4+11)
 		egg_test_success (test, "correct stdout count");
-	} else {
+	else
 		egg_test_failed (test, "wrong stdout count %i", stdout_count);
-	}
 
 	/* get new object */
 	new_spawn_object (test, &spawn);
@@ -681,11 +675,11 @@ pk_spawn_test (EggTest *test)
 	ret = pk_spawn_argv (spawn, argv, envp);
 	g_free (path);
 	g_strfreev (argv);
-	if (ret) {
+	g_strfreev (envp);
+	if (ret)
 		egg_test_success (test, "ran correct file");
-	} else {
+	else
 		egg_test_failed (test, "did not run helper");
-	}
 
 	/* wait for finished */
 	egg_test_loop_wait (test, 10000);
@@ -706,9 +700,8 @@ pk_spawn_test (EggTest *test)
 	g_strfreev (argv);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "did not run helper");
-	}
 
 	g_timeout_add_seconds (1, cancel_cb, spawn);
 	/* wait for finished */
@@ -719,9 +712,8 @@ pk_spawn_test (EggTest *test)
 	egg_test_title (test, "make sure finished in SIGKILL");
 	if (mexit == PK_EXIT_ENUM_KILLED)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "finish %i!", mexit);
-	}
 
 	/* get new object */
 	new_spawn_object (test, &spawn);
@@ -736,9 +728,8 @@ pk_spawn_test (EggTest *test)
 	g_strfreev (argv);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "did not run helper");
-	}
 
 	g_timeout_add_seconds (1, cancel_cb, spawn);
 	/* wait for finished */
@@ -749,9 +740,8 @@ pk_spawn_test (EggTest *test)
 	egg_test_title (test, "make sure finished in SIGQUIT");
 	if (mexit == PK_EXIT_ENUM_CANCELLED)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "finish %i!", mexit);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "run lots of data for profiling");
@@ -762,9 +752,8 @@ pk_spawn_test (EggTest *test)
 	g_strfreev (argv);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "did not run profiling helper");
-	}
 
 	/* get new object */
 	new_spawn_object (test, &spawn);
@@ -774,10 +763,11 @@ pk_spawn_test (EggTest *test)
 	 ************************************************************/
 	egg_test_title (test, "run the dispatcher");
 	mexit = BAD_EXIT;
-	path = egg_test_get_data_file ("pk-spawn-dispatcher.py");
-	path = g_strdup_printf ("%s search-name none power", path);
+	file = egg_test_get_data_file ("pk-spawn-dispatcher.py");
+	path = g_strdup_printf ("%s search-name none power", file);
 	argv = g_strsplit (path, " ", 0);
 	ret = pk_spawn_argv (spawn, argv, NULL);
+	g_free (file);
 	g_free (path);
 	if (ret)
 		egg_test_success (test, NULL);
@@ -853,7 +843,6 @@ pk_spawn_test (EggTest *test)
 		egg_test_failed (test, "dispatcher closed twice");
 
 	g_strfreev (argv);
-
 	g_object_unref (spawn);
 
 	egg_test_end (test);
diff --git a/src/pk-time.c b/src/pk-time.c
index 645039e..b7c0533 100644
--- a/src/pk-time.c
+++ b/src/pk-time.c
@@ -325,7 +325,7 @@ pk_time_finalize (GObject *object)
 
 	time = PK_TIME (object);
 	g_return_if_fail (time->priv != NULL);
-	pk_time_free_data (time);
+	g_ptr_array_foreach (time->priv->array, (GFunc) g_free, NULL);
 	g_ptr_array_free (time->priv->array, TRUE);
 	g_timer_destroy (time->priv->timer);
 
diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index b20c07b..2bdb9d6 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -138,6 +138,18 @@ pk_transaction_list_role_present (PkTransactionList *tlist, PkRoleEnum role)
 }
 
 /**
+ * pk_transaction_list_item_free:
+ **/
+void
+pk_transaction_list_item_free (PkTransactionItem *item)
+{
+	g_return_if_fail (item != NULL);
+	g_object_unref (item->transaction);
+	g_free (item->tid);
+	g_free (item);
+}
+
+/**
  * pk_transaction_list_remove_internal:
  **/
 gboolean
@@ -155,9 +167,7 @@ pk_transaction_list_remove_internal (PkTransactionList *tlist, PkTransactionItem
 		egg_warning ("could not remove %p as not present in list", item);
 		return FALSE;
 	}
-	g_object_unref (item->transaction);
-	g_free (item->tid);
-	g_free (item);
+	pk_transaction_list_item_free (item);
 
 	return TRUE;
 }
@@ -420,6 +430,7 @@ pk_transaction_list_get_array (PkTransactionList *tlist)
 	}
 	egg_debug ("%i transactions in list, %i active", length, parray->len);
 	array = pk_ptr_array_to_argv (parray);
+	g_ptr_array_foreach (parray, (GFunc) g_free, NULL);
 	g_ptr_array_free (parray, TRUE);
 
 	return array;
@@ -481,6 +492,7 @@ pk_transaction_list_finalize (GObject *object)
 
 	g_return_if_fail (tlist->priv != NULL);
 
+	g_ptr_array_foreach (tlist->priv->array, (GFunc) pk_transaction_list_item_free, NULL);
 	g_ptr_array_free (tlist->priv->array, TRUE);
 
 	G_OBJECT_CLASS (pk_transaction_list_parent_class)->finalize (object);
@@ -599,6 +611,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/************************************************************/
 	egg_test_title (test, "add again the same tid (should fail)");
@@ -710,6 +723,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/* wait for Finished */
 	egg_test_loop_wait (test, 2000);
@@ -731,6 +745,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/************************************************************/
 	egg_test_title (test, "remove already removed");
@@ -773,6 +788,9 @@ pk_transaction_list_test (EggTest *test)
 	item1 = pk_transaction_list_get_from_tid (tlist, tid1);
 	item2 = pk_transaction_list_get_from_tid (tlist, tid2);
 
+	g_free (tid1);
+	g_free (tid2);
+
 	/************************************************************/
 	egg_test_title (test, "get both items in queue");
 	size = pk_transaction_list_get_size (tlist);
@@ -789,6 +807,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	g_signal_connect (item1->transaction, "finished",
 			  G_CALLBACK (pk_transaction_list_test_finished_cb), test);
@@ -808,6 +827,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/* wait for first action */
 	egg_test_loop_wait (test, 6000);
@@ -829,6 +849,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/************************************************************/
 	egg_test_title (test, "make sure item1 has correct flags");
@@ -866,6 +887,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	/************************************************************/
 	egg_test_title (test, "make sure item1 has correct flags");
@@ -904,6 +926,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_success (test, NULL);
 	else
 		egg_test_failed (test, "size %i", size);
+	g_strfreev (array);
 
 	g_object_unref (tlist);
 	g_object_unref (backend);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index b6396b3..520b20c 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1219,14 +1219,15 @@ out:
  * when not async.
  **/
 static gboolean
-pk_transaction_action_is_allowed (PkTransaction *transaction, const gchar *dbus_sender,
-				  gboolean trusted, PkRoleEnum role, GError **error)
+pk_transaction_action_is_allowed (PkTransaction *transaction, gboolean trusted, PkRoleEnum role, GError **error)
 {
 	gboolean ret;
 	gchar *error_detail;
 
+	g_return_val_if_fail (transaction->priv->dbus_name != NULL, FALSE);
+
 	/* use security model to get auth */
-	ret = pk_security_action_is_allowed (transaction->priv->security, dbus_sender, trusted, role, &error_detail);
+	ret = pk_security_action_is_allowed (transaction->priv->security, transaction->priv->dbus_name, trusted, role, &error_detail);
 	if (!ret) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_REFUSED_BY_POLICY, "%s", error_detail);
 		return FALSE;
@@ -1273,10 +1274,16 @@ pk_transaction_accept_eula (PkTransaction *transaction, const gchar *eula_id, DB
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_ACCEPT_EULA, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_ACCEPT_EULA, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
@@ -1368,6 +1375,7 @@ pk_transaction_download_packages (PkTransaction *transaction, gchar **package_id
 	gchar *package_ids_temp;
 	gchar *directory;
 	gint retval;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1410,7 +1418,9 @@ pk_transaction_download_packages (PkTransaction *transaction, gchar **package_id
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1457,6 +1467,7 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, gch
 	gboolean ret;
 	GError *error;
 	gchar *package_ids_temp;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1495,7 +1506,9 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, gch
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1526,6 +1539,7 @@ pk_transaction_get_details (PkTransaction *transaction, gchar **package_ids, DBu
 	gboolean ret;
 	GError *error;
 	gchar *package_ids_temp;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1557,7 +1571,9 @@ pk_transaction_get_details (PkTransaction *transaction, gchar **package_ids, DBu
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1585,6 +1601,7 @@ pk_transaction_get_distro_upgrades (PkTransaction *transaction, DBusGMethodInvoc
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1603,7 +1620,9 @@ pk_transaction_get_distro_upgrades (PkTransaction *transaction, DBusGMethodInvoc
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1634,6 +1653,7 @@ pk_transaction_get_files (PkTransaction *transaction, gchar **package_ids, DBusG
 	gboolean ret;
 	GError *error;
 	gchar *package_ids_temp;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1665,7 +1685,9 @@ pk_transaction_get_files (PkTransaction *transaction, gchar **package_ids, DBusG
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1693,6 +1715,7 @@ pk_transaction_get_packages (PkTransaction *transaction, const gchar *filter, DB
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1718,7 +1741,9 @@ pk_transaction_get_packages (PkTransaction *transaction, const gchar *filter, DB
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1812,6 +1837,7 @@ pk_transaction_get_repo_list (PkTransaction *transaction, const gchar *filter, D
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1837,7 +1863,9 @@ pk_transaction_get_repo_list (PkTransaction *transaction, const gchar *filter, D
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1867,6 +1895,7 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, gc
 	gboolean ret;
 	GError *error;
 	gchar *package_ids_temp;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -1905,7 +1934,9 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, gc
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -1986,6 +2017,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	GPtrArray *array;
 	guint i;
 	guint len;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -2020,7 +2052,9 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -2085,6 +2119,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	}
 
 out:
+	g_ptr_array_foreach (array, (GFunc) g_free, NULL);
 	g_ptr_array_free (array, TRUE);
 	dbus_g_method_return (context);
 }
@@ -2099,6 +2134,7 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 	GError *error;
 	PkPackageList *updates_cache;
 	gchar *package_id;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -2124,7 +2160,9 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -2411,21 +2449,21 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 		}
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, trusted, PK_ROLE_ENUM_INSTALL_FILES, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, trusted, PK_ROLE_ENUM_INSTALL_FILES, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_trusted = trusted;
 	transaction->priv->cached_full_paths = g_strdupv (full_paths);
@@ -2485,21 +2523,21 @@ pk_transaction_install_packages (PkTransaction *transaction, gchar **package_ids
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_INSTALL_PACKAGES, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_INSTALL_PACKAGES, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
@@ -2562,21 +2600,21 @@ pk_transaction_install_signature (PkTransaction *transaction, const gchar *sig_t
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_INSTALL_SIGNATURE, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_INSTALL_SIGNATURE, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_id = g_strdup (package_id);
 	transaction->priv->cached_key_id = g_strdup (key_id);
@@ -2635,21 +2673,21 @@ pk_transaction_refresh_cache (PkTransaction *transaction, gboolean force, DBusGM
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_REFRESH_CACHE, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REFRESH_CACHE, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* we unref the update cache if it exists */
 	pk_cache_invalidate (transaction->priv->cache);
 
@@ -2711,21 +2749,21 @@ pk_transaction_remove_packages (PkTransaction *transaction, gchar **package_ids,
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_REMOVE_PACKAGES, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REMOVE_PACKAGES, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_allow_deps = allow_deps;
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
@@ -2779,22 +2817,21 @@ pk_transaction_repo_enable (PkTransaction *transaction, const gchar *repo_id, gb
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_REPO_ENABLE, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REPO_ENABLE, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_repo_id = g_strdup (repo_id);
 	transaction->priv->cached_enabled = enabled;
@@ -2849,21 +2886,21 @@ pk_transaction_repo_set_data (PkTransaction *transaction, const gchar *repo_id,
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_REPO_SET_DATA, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_REPO_SET_DATA, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_repo_id = g_strdup (repo_id);
 	transaction->priv->cached_parameter = g_strdup (parameter);
@@ -2895,6 +2932,7 @@ pk_transaction_resolve (PkTransaction *transaction, const gchar *filter,
 	gchar *packages_temp;
 	guint i;
 	guint length;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -2934,7 +2972,9 @@ pk_transaction_resolve (PkTransaction *transaction, const gchar *filter,
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -2990,21 +3030,21 @@ pk_transaction_rollback (PkTransaction *transaction, const gchar *transaction_id
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_ROLLBACK, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_ROLLBACK, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_transaction_id = g_strdup (transaction_id);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
@@ -3031,6 +3071,7 @@ pk_transaction_search_details (PkTransaction *transaction, const gchar *filter,
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -3063,7 +3104,9 @@ pk_transaction_search_details (PkTransaction *transaction, const gchar *filter,
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -3093,6 +3136,7 @@ pk_transaction_search_file (PkTransaction *transaction, const gchar *filter,
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -3125,7 +3169,9 @@ pk_transaction_search_file (PkTransaction *transaction, const gchar *filter,
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -3155,6 +3201,7 @@ pk_transaction_search_group (PkTransaction *transaction, const gchar *filter,
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -3187,7 +3234,9 @@ pk_transaction_search_group (PkTransaction *transaction, const gchar *filter,
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -3217,6 +3266,7 @@ pk_transaction_search_name (PkTransaction *transaction, const gchar *filter,
 {
 	gboolean ret;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -3249,7 +3299,9 @@ pk_transaction_search_name (PkTransaction *transaction, const gchar *filter,
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
@@ -3355,21 +3407,21 @@ pk_transaction_update_packages (PkTransaction *transaction, gchar **package_ids,
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_UPDATE_PACKAGES, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	/* save so we can run later */
 	transaction->priv->cached_package_ids = g_strdupv (package_ids);
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
@@ -3412,10 +3464,16 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 		return;
 	}
 
+	/* set the dbus name, so we can get the disconnect */
+	if (context != NULL) {
+		/* not set inside the test suite */
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
+	}
+
 	/* check if the action is allowed from this client - if not, set an error */
-	sender = dbus_g_method_get_sender (context);
-	ret = pk_transaction_action_is_allowed (transaction, sender, FALSE, PK_ROLE_ENUM_UPDATE_SYSTEM, &error);
-	g_free (sender);
+	ret = pk_transaction_action_is_allowed (transaction, FALSE, PK_ROLE_ENUM_UPDATE_SYSTEM, &error);
 	if (!ret) {
 		dbus_g_method_return_error (context, error);
 		return;
@@ -3429,12 +3487,6 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 		return;
 	}
 
-	/* set the dbus name, so we can get the disconnect */
-	if (context != NULL) {
-		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
-	}
-
 	transaction->priv->status = PK_STATUS_ENUM_WAIT;
 	pk_transaction_set_role (transaction, PK_ROLE_ENUM_UPDATE_SYSTEM);
 
@@ -3455,11 +3507,12 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
  **/
 void
 pk_transaction_what_provides (PkTransaction *transaction, const gchar *filter, const gchar *type,
-			 const gchar *search, DBusGMethodInvocation *context)
+			      const gchar *search, DBusGMethodInvocation *context)
 {
 	gboolean ret;
 	PkProvidesEnum provides;
 	GError *error;
+	gchar *sender;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -3500,7 +3553,9 @@ pk_transaction_what_provides (PkTransaction *transaction, const gchar *filter, c
 	/* set the dbus name, so we can get the disconnect */
 	if (context != NULL) {
 		/* not set inside the test suite */
-		pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+		sender = dbus_g_method_get_sender (context);
+		pk_transaction_set_dbus_name (transaction, sender);
+		g_free (sender);
 	}
 
 	/* save so we can run later */
diff --git a/src/pk-update-detail-list.c b/src/pk-update-detail-list.c
index 27c90d4..447acc6 100644
--- a/src/pk-update-detail-list.c
+++ b/src/pk-update-detail-list.c
@@ -122,19 +122,12 @@ pk_update_detail_list_get_obj (PkUpdateDetailList *list, const PkPackageId *id)
 static void
 pk_update_detail_list_finalize (GObject *object)
 {
-	guint i;
-	guint len;
-	PkUpdateDetailObj *obj;
 	PkUpdateDetailList *list;
 	g_return_if_fail (PK_IS_UPDATE_DETAIL_LIST (object));
 	list = PK_UPDATE_DETAIL_LIST (object);
 
 	/* free the list */
-	len = list->priv->array->len;
-	for (i=0; i<len; i++) {
-		obj = (PkUpdateDetailObj *) g_ptr_array_index (list->priv->array, i);
-		pk_update_detail_obj_free (obj);
-	}
+	g_ptr_array_foreach (list->priv->array, (GFunc) pk_update_detail_obj_free, NULL);
 	g_ptr_array_free (list->priv->array, FALSE);
 
 	G_OBJECT_CLASS (pk_update_detail_list_parent_class)->finalize (object);
commit 73535b6f41bd16324ce23ed77a35e72293371eef
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:29:58 2008 +0200

    smart: fix unicode decode errors by using a temporary variable

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 17c2e67..4855a1d 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -809,8 +809,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 data = 'local'
             else:
                 data = channel.getAlias()
+            summary = info.getSummary()
             self.package(pkpackage.get_package_id(name, version, arch, data),
-                status, info.getSummary())
+                status, summary)
 
     def _get_status(self, package):
         flags = smart.pkgconf.testAllFlags(package)
commit f99213c95158fcb5e3c60a42ef3423d6d832939d
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:27:45 2008 +0200

    smart: set special repo data for installed/local

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index c067c4f..17c2e67 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -803,8 +803,14 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             if package.installed and not channel.getType().endswith('-sys'):
                 continue
             info = loader.getInfo(package)
-            self.package(pkpackage.get_package_id(name, version, arch,
-                channel.getAlias()), status, info.getSummary())
+            if package.installed:
+                data = 'installed'
+            elif isinstance(channel, smart.channel.FileChannel):
+                data = 'local'
+            else:
+                data = channel.getAlias()
+            self.package(pkpackage.get_package_id(name, version, arch, data),
+                status, info.getSummary())
 
     def _get_status(self, package):
         flags = smart.pkgconf.testAllFlags(package)
commit 39f03502619a4265d806b468952da7090e9f4b6c
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:26:39 2008 +0200

    smart: use filters for get_updates

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 4d1241e..c067c4f 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -320,8 +320,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         self.status(STATUS_INFO)
         for (package, op) in trans.getChangeSet().items():
             if op == smart.transaction.INSTALL:
-                status = self._get_status(package)
-                self._add_package(package, status)
+                if self._package_passes_filters(package, filters):
+                    status = self._get_status(package)
+                    self._add_package(package, status)
         self._post_process_package_list(filters)
         self._show_package_list()
 
commit d8e1bdc4c474629618de3909d9429939695557fc
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:25:30 2008 +0200

    smart: need to reset backend between runs, when using dispatching mode

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 866c02c..4d1241e 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -138,6 +138,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         PackageKitBaseBackend.allow_cancel(self, allow)
         self._cancel = allow
 
+    def reset(self):
+        self._package_list = []
+
     @needs_cache
     def install_packages(self, packageids):
         packages = []
@@ -983,6 +986,7 @@ def main():
         line = raw_input('')
         if line == 'exit':
             break
+        backend.reset()
         args = line.split(' ')
         backend.dispatch_command(args[0],args[1:])
 
commit beac719a193a8bfd4fefb1ab328b1d68869b5608
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:23:52 2008 +0200

    pkgsize must be integer

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 5dceb6f..866c02c 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -542,7 +542,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 if pkgsize:
                     break
             if not pkgsize:
-                pkgsize = "unknown"
+                pkgsize = 0
 
             if hasattr(info, 'getLicense'):
                 license = info.getLicense()
commit 83e4761e13e51a2c28d8c5750a858ca5433259e0
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 18:23:14 2008 +0200

    urpmi: resolve now supports package ids list argument

diff --git a/backends/urpmi/helpers/resolve.pl b/backends/urpmi/helpers/resolve.pl
index e58b312..1d4056a 100755
--- a/backends/urpmi/helpers/resolve.pl
+++ b/backends/urpmi/helpers/resolve.pl
@@ -29,46 +29,39 @@ use perl_packagekit::enums;
 use perl_packagekit::prints;
 
 # Two arguments (filter and package name)
-exit if ($#ARGV != 1);
+$#ARGV == 1 or exit 1;
 my @filters = split(/;/, $ARGV[0]);
-my $search_term = $ARGV[1];
+my @patterns = split(/\|/, $ARGV[1]);
 
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
-my @names = ( $search_term );
 my %requested;
-my $result = urpm::select::search_packages($urpm, \%requested, \@names, 
+urpm::select::search_packages($urpm, \%requested, \@patterns, 
   fuzzy => 0, 
   caseinsensitive => 0,
   all => 0
 );
 
-if($result) {
-  my @requested_keys = keys %requested;
-  my $db = open_rpm_db();
-  $urpm->compute_installed_flags($db);
-  my $pkg = @{$urpm->{depslist}}[$requested_keys[0]];
 
-  # We exit the script if found package does not match with
-  # specified filters
-  if(!filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
-    exit;
-  }
+my @requested_keys = keys %requested;
+my $db = open_rpm_db();
+$urpm->compute_installed_flags($db);
+
+foreach (@requested_keys) {
+  my $pkg = @{$urpm->{depslist}}[$_];
+  ($_ && $pkg) or next;
+
+  # We exit the script if found package does not match with specified filters
+  filter($pkg, \@filters, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1}) or next;
+
   if($pkg->version."-".$pkg->release eq find_installed_version($pkg)) {
-    if(grep(/^${\FILTER_NOT_INSTALLED}$/, @filters)) {
-      exit;
-    }
+    grep(/^${\FILTER_NOT_INSTALLED}$/, @filters) and next;
     pk_print_package(INFO_INSTALLED, get_package_id($pkg), $pkg->summary);
   }
   else {
-    if(grep(/^${\FILTER_INSTALLED}$/, @filters)) {
-      exit;
-    }
+    grep(/^${\FILTER_INSTALLED}$/, @filters) and next;
     pk_print_package(INFO_AVAILABLE, get_package_id($pkg), $pkg->summary);
   }
 }
-else {
-  pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Can't find any package for the specified name");
-}
 
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index a174137..ed80ba4 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -303,9 +303,12 @@ static void
 backend_resolve (PkBackend *backend, PkBitfield filters, gchar **package_ids)
 {
 	gchar *filters_text;
+	gchar *package_ids_temp;
 	filters_text = pk_filter_bitfield_to_text (filters);
-	pk_backend_spawn_helper (spawn, "resolve.pl", filters_text, package_ids[0], NULL);
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "resolve.pl", filters_text, package_ids_temp, NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
commit b8aabaf8aeec93c38957ae85075365a601ce7c1b
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 18:22:57 2008 +0200

    smart: add basename_filtering

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index a289f18..5dceb6f 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -907,6 +907,16 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                         return False
                     if filter == FILTER_NOT_DEVELOPMENT and development:
                         return False
+                if filter in (FILTER_BASENAME, FILTER_NOT_BASENAME):
+                    if hasattr(info, 'getSource'):
+                        source = info.getSource()
+                        if not source:
+                            return None
+                        same = (package.name == source)
+                        if filter == FILTER_BASENAME and not same:
+                            return False
+                        if filter == FILTER_NOT_BASENAME and same:
+                            return False
                 if filter in (FILTER_FREE, FILTER_NOT_FREE):
                     if hasattr(info, 'getLicense'):
                         license = info.getLicense()
@@ -923,6 +933,31 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                         return False
         return True
 
+    def _package_has_basename(self, package):
+        from smart.backends.rpm.base import RPMPackage
+        from smart.backends.deb.base import DebPackage
+        if isinstance(package, RPMPackage):
+            if package.name.endswith("-devel") or \
+               package.name.endswith("-debuginfo") or \
+               package.name.endswith("-libs") or \
+               package.name.endswith("-static"):
+                return False
+            return True
+        elif isinstance(package, DebPackage):
+            if package.name.endswith("-dev") or \
+               package.name.endswith("-dbg"):
+                return False
+            return True
+        else:
+            return None
+
+    def _do_basename_filtering(self, package_list):
+        basename = {}
+        for package,status in package_list:
+            if self._package_has_basename(package):
+                basename[package] = (package,status)
+        return basename.values()
+
     def _do_newest_filtering(self, package_list):
         newest = {}
         for package,status in package_list:
@@ -935,6 +970,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
     def _post_process_package_list(self, filters):
         filterlist = filters.split(';')
+        if FILTER_BASENAME in filterlist:
+            self._package_list = self._do_basename_filtering(self._package_list)
         if FILTER_NEWEST in filterlist:
             self._package_list = self._do_newest_filtering(self._package_list)
 
diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index e47be82..94bf176 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -98,6 +98,7 @@ backend_get_filters (PkBackend *backend)
 		PK_FILTER_ENUM_ARCH,
 		PK_FILTER_ENUM_GUI,
 		PK_FILTER_ENUM_DEVELOPMENT,
+		PK_FILTER_ENUM_BASENAME,
 	/* FIXME: These depend on a newer Smart API: */
 		PK_FILTER_ENUM_FREE,
 		-1);
commit 6c2ca0ee90f69e5122957702cb7bf8879b1f2584
Merge: 62d66dc... 49bf251...
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 17:22:31 2008 +0200

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

commit 62d66dc76342eca56f6a47a9049c9b8be3cfa086
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 17:19:15 2008 +0200

    urpmi: get-requires now supports package ids list argument

diff --git a/backends/urpmi/helpers/get-requires.pl b/backends/urpmi/helpers/get-requires.pl
index dfe749e..063c8ef 100755
--- a/backends/urpmi/helpers/get-requires.pl
+++ b/backends/urpmi/helpers/get-requires.pl
@@ -30,25 +30,24 @@ use perl_packagekit::enums;
 use perl_packagekit::prints;
 
 # 3 arguments
-# (filter, packageid, and recursive option)
-exit if($#ARGV != 2);
+# (filter, package ids, and recursive option)
+$#ARGV == 2 or exit 1;
 
 my @filters = split(/;/, $ARGV[0]);
-my $pkgid = $ARGV[1];
-my $recursive_option = 0;
-$recursive_option = 1 if($ARGV[2] eq "yes");
+my $recursive_option = $ARGV[2] eq "yes" ? 1 : 0;
 
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
-my $pkg = get_package_by_package_id($urpm, $pkgid);
-if(!$pkg) {
-  pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Requested package wasn't found");
-  exit;
+my @pkgids = split(/\|/, $ARGV[1]);
+my @pkgnames;
+foreach (@pkgids) {
+  my $pkg = get_package_by_package_id($urpm, $_);
+  $pkg and push(@pkgnames, $pkg->name);
 }
 
 pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
-my @requires = perform_requires_search($urpm, $pkg, $recursive_option);
+my @requires = perform_requires_search($urpm, \@pkgnames, $recursive_option);
 
 foreach(@requires) {
   if(filter($_, \@filters, { FILTER_GUI => 1, FILTER_DEVELOPMENT => 1 })) {
diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
index 3b094d0..005bdcd 100644
--- a/backends/urpmi/helpers/urpmi_backend/actions.pm
+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
@@ -232,12 +232,12 @@ sub perform_file_search {
 
 sub perform_requires_search {
 
-  my ($urpm, $pkg, $recursive_option) = @_;
+  my ($urpm, $pkgnames, $recursive_option) = @_;
 
   my (@properties, %requires, %properties, $dep);
   my %requested;
   urpm::select::search_packages($urpm, 
-    \%requested, [ $pkg->name ], 
+    \%requested, $pkgnames, 
     use_provides => 0,
     fuzzy => 0,
     all => 0
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 9f601b2..a174137 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -263,10 +263,13 @@ backend_get_packages (PkBackend *backend, PkBitfield filters)
 static void
 backend_get_requires (PkBackend *backend, PkBitfield filters, gchar **package_ids, gboolean recursive)
 {
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
 	gchar *filters_text;
 	filters_text = pk_filter_bitfield_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-requires.pl", filters_text, package_ids[0], pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-requires.pl", filters_text, package_ids_temp, pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
+	g_free (package_ids_temp);
 }
 
 /**
commit 5dce0be15ed46f8d70a9e35837e739667af72a75
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 16:41:05 2008 +0200

    urpmi: simplify in get-updates method

diff --git a/backends/urpmi/helpers/get-updates.pl b/backends/urpmi/helpers/get-updates.pl
index 8a5e475..5dcf0d0 100755
--- a/backends/urpmi/helpers/get-updates.pl
+++ b/backends/urpmi/helpers/get-updates.pl
@@ -45,8 +45,7 @@ my %selected = %{$state->{selected} || {}};
 my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
 my @to_remove = urpm::select::removed_packages($urpm, $state);
 my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}]; 
-my ($src, $binary) = partition { $_->arch eq 'src' } @to_install;
- at to_install = @$binary;
+ at to_install = grep { $_->arch ne 'src' } @to_install;
 my $updates_descr = urpm::get_updates_description($urpm);
 
 foreach(@to_install) {
commit 3c70a211520831877e7d52e81ad887df1312e20f
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 16:15:17 2008 +0200

    urpmi: get-update-details now supports package ids list argument

diff --git a/backends/urpmi/helpers/get-update-detail.pl b/backends/urpmi/helpers/get-update-detail.pl
index fcf868d..3b072fe 100755
--- a/backends/urpmi/helpers/get-update-detail.pl
+++ b/backends/urpmi/helpers/get-update-detail.pl
@@ -29,32 +29,28 @@ use perl_packagekit::enums;
 use perl_packagekit::prints;
 use MDK::Common;
 
-# One argument (package id)
-exit if($#ARGV != 0);
+# One argument (package ids)
+$#ARGV == 0 or exit 1;
 
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
-my $pkg = get_package_by_package_id($urpm, @ARGV[0]);
+my @pkgids = split(/\|/, $ARGV[0]);
 
-if(!$pkg) {
-  pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_FOUND, "Requested package was not found");
-  exit;
+foreach (@pkgids) {
+  print_package_update_details($urpm, $_);
 }
 
-my %requested;
-$requested{$pkg->id} = 1;
+sub print_package_update_details {
 
-if(!find_installed_version($pkg)) {
-  pk_print_error(PK_ERROR_ENUM_PACKAGE_NOT_INSTALLED, "The selected package isn't installed on your system");
-}
-elsif(package_version_is_installed($pkg)) {
-  pk_print_error(PK_ERROR_ENUM_PACKAGE_ALREADY_INSTALLED, "The selected package is already at the latest version");
-}
-else {
+  my ($urpm, $pkgid) = @_;
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+
+  my %requested;
+  $requested{$pkg->id} = 1;
   my $state = {};
   my $restart = urpm::select::resolve_dependencies($urpm, $state, \%requested);
-  my %selected = %{$state->{selected}};
   my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
   my @to_remove = urpm::select::removed_packages($urpm, $state);
   my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}]; 
@@ -67,32 +63,19 @@ else {
     $desc = $updesc->{pre};
     $desc =~ s/\n/;/g;
   }
-
+  
   my @to_upgrade_pkids;
   foreach(@to_install) {
     my $pkid = get_installed_version_pkid($_);
     push @to_upgrade_pkids, $pkid if $pkid;
   }
-
-  if($restart) {
-    pk_print_update_detail(get_package_id($pkg),
-      join("^", @to_upgrade_pkids),
-      join("^", map(fullname_to_package_id($_), @to_remove)),
-      "http://qa.mandriva.com",
-      "http://qa.mandriva.com",
-      "http://qa.mandriva.com",
-      PK_RESTART_ENUM_SYSTEM,
-      $desc);
-  }
-  else {
-    pk_print_update_detail(get_package_id($pkg),
-      join("^", @to_upgrade_pkids),
-      join("^", map(fullname_to_package_id($_), @to_remove)),
-      "http://qa.mandriva.com",
-      "http://qa.mandriva.com",
-      "http://qa.mandriva.com",
-      PK_RESTART_ENUM_APPLICATION,
-      $desc);
-  }
-
+  
+  pk_print_update_detail(get_package_id($pkg),
+    join("^", @to_upgrade_pkids),
+    join("^", map(fullname_to_package_id($_), @to_remove)),
+    "http://qa.mandriva.com",
+    "http://qa.mandriva.com",
+    "http://qa.mandriva.com",
+    $restart ? PK_RESTART_ENUM_SYSTEM : PK_RESTART_ENUM_APPLICATION,
+    $desc);
 }
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index ca7f332..9f601b2 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -176,7 +176,10 @@ backend_get_updates (PkBackend *backend, PkBitfield filters)
 static void
 backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_ids[0], NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
commit 49bf2516f6aaf210b2489f5c6a5c94d438bcb15a
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 15:13:44 2008 +0100

    bugfix: allow the catalog list to be split with more than just ; chars

diff --git a/libpackagekit/pk-catalog.c b/libpackagekit/pk-catalog.c
index fcd14a2..c73bc2a 100644
--- a/libpackagekit/pk-catalog.c
+++ b/libpackagekit/pk-catalog.c
@@ -67,6 +67,7 @@ G_DEFINE_TYPE (PkCatalog, pk_catalog, G_TYPE_OBJECT)
 static gboolean
 pk_catalog_process_type_part (PkCatalog *catalog, GPtrArray *array, const gchar *distro_id_part)
 {
+	gchar *data;
 	gchar **list;
 	gchar *key;
 	guint len;
@@ -84,13 +85,15 @@ pk_catalog_process_type_part (PkCatalog *catalog, GPtrArray *array, const gchar
 	} else {
 		key = g_strdup_printf ("%s(%s)", catalog->priv->type, distro_id_part);
 	}
-	list = g_key_file_get_string_list (catalog->priv->file, PK_CATALOG_FILE_HEADER, key, NULL, NULL);
+	data = g_key_file_get_string (catalog->priv->file, PK_CATALOG_FILE_HEADER, key, NULL);
 	g_free (key);
 
 	/* we have no key of this name */
-	if (list == NULL) {
+	if (egg_strzero (data))
 		return FALSE;
-	}
+
+	/* split using the three delimiters */
+	list = g_strsplit_set (data, ";, ", 0);
 
 	/* add to array */
 	len = g_strv_length (list);
@@ -98,6 +101,7 @@ pk_catalog_process_type_part (PkCatalog *catalog, GPtrArray *array, const gchar
 		g_ptr_array_add (array, g_strdup (list[i]));
 	}
 	g_strfreev (list);
+	g_free (data);
 	return TRUE;
 }
 
commit b7e98188608030b6780f65845d147b4bf054da58
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 15:55:08 2008 +0200

    urpmi: get-detail method now supports package ids list

diff --git a/backends/urpmi/helpers/get-details.pl b/backends/urpmi/helpers/get-details.pl
index 93fe098..5de7181 100755
--- a/backends/urpmi/helpers/get-details.pl
+++ b/backends/urpmi/helpers/get-details.pl
@@ -27,32 +27,44 @@ use MDK::Common;
 
 use perl_packagekit::prints;
 
-# One argument (package id)
-exit if($#ARGV != 0);
+# One argument (package ids)
+$#ARGV == 0 or exit 1;
 
 my $urpm = urpm->new_parse_cmdline;
 urpm::media::configure($urpm);
 
-my $pkg = get_package_by_package_id($urpm, $ARGV[0]);
+my @pkgids = split(/\|/, $ARGV[0]);
 
-my $medium = pkg2medium($pkg, $urpm);
-my $xml_info = 'info';
-my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
-
-if(!$xml_info_file) {
-  pk_print_details(get_package_id($pkg), "N/A", $pkg->group, "N/A", "N/A", 0);
-  exit 0;
+foreach (@pkgids) {
+  print_package_details($urpm, $_);
 }
 
-require urpm::xml_info;
-require urpm::xml_info_pkg;
-my $name = urpm_name($pkg);
-my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
-my %xml_info_pkgs;
-put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
-my $description = $xml_info_pkgs{$name}{description};
-$description =~ s/\n/;/g;
-$description =~ s/\t/ /g;
-
-pk_print_details(get_package_id($pkg), "N/A", $pkg->group, ensure_utf8($description), "N/A", $pkg->size);
+sub print_package_details {
+
+  my ($urpm, $pkgid) = @_;
+  
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+
+  my $medium = pkg2medium($pkg, $urpm);
+  my $xml_info = 'info';
+  my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
+  
+  if(!$xml_info_file) {
+    pk_print_details(get_package_id($pkg), "N/A", $pkg->group, "N/A", "N/A", 0);
+    exit 0;
+  }
+  
+  require urpm::xml_info;
+  require urpm::xml_info_pkg;
+  my $name = urpm_name($pkg);
+  my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
+  my %xml_info_pkgs;
+  put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
+  my $description = $xml_info_pkgs{$name}{description};
+  $description =~ s/\n/;/g;
+  $description =~ s/\t/ /g;
+  
+  pk_print_details(get_package_id($pkg), "N/A", $pkg->group, ensure_utf8($description), "N/A", $pkg->size);
+}
 
diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 430e017..ca7f332 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -131,7 +131,10 @@ backend_search_name (PkBackend *backend, PkBitfield filters, const gchar *search
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-details.pl", package_ids[0], NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-details.pl", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
commit d36f55380e5b2fde99f9aa46a74a2d72e907a144
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 15:35:47 2008 +0200

    urpmi: best error's handle in refresh-cache method

diff --git a/backends/urpmi/helpers/refresh-cache.pl b/backends/urpmi/helpers/refresh-cache.pl
index 73dcc70..0edd018 100755
--- a/backends/urpmi/helpers/refresh-cache.pl
+++ b/backends/urpmi/helpers/refresh-cache.pl
@@ -11,7 +11,6 @@
 #
 
 use strict;
-
 use lib;
 use File::Basename;
 
@@ -24,20 +23,24 @@ use urpm::media;
 use urpm::select;
 use urpm::args;
 use urpmi_backend::actions;
+use perl_packagekit::enums;
+use perl_packagekit::prints;
 
 # No arguments
-exit if($#ARGV != -1);
+$#ARGV != -1 and exit 1;
 
-#my $urpm = urpm->new_parse_cmdline;
 my $urpm = urpm->new_parse_cmdline;
+$urpm->{fatal} = sub { 
+    pk_print_error(PK_ERROR_ENUM_TRANSACTION_ERROR, $_[1]."\n"); 
+    exit($_[0]) 
+};
 my $urpmi_lock = urpm::lock::urpmi_db($urpm, 'exclusive', wait => 0);
 urpm::media::read_config($urpm);
 
 my @entries = map { $_->{name} } @{$urpm->{media}};
- at entries == 0 and die N("nothing to update (use urpmi.addmedia to add a media)\n");
+ at entries == 0 and pk_print_error(PK_ERROR_ENUM_TRANSACTION_ERROR, "nothing to update (use urpmi.addmedia to add a media)\n");
 
 my %options = ( all => 1 );
 
-my $ok = urpm::media::update_media($urpm, %options, 
-  quiet => 0);
+my $ok = urpm::media::update_media($urpm, %options, quiet => 0);
 exit($ok ? 0 : 1);
commit c2b4b3aa45ba60884bc49518bb865a3c297fbc6d
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 14:29:27 2008 +0100

    trivial: add another screenshot of distro upgrades

diff --git a/docs/html/img/Makefile.am b/docs/html/img/Makefile.am
index 7d60549..d4b1358 100644
--- a/docs/html/img/Makefile.am
+++ b/docs/html/img/Makefile.am
@@ -34,6 +34,7 @@ IMAGE_FILES =					\
 	gpk-updates-warning.png			\
 	gpk-waiting.png				\
 	gpk-remove-confirm.png			\
+	gpk-distro-upgrade-notify.png		\
 	$(NULL)
 
 EXTRA_DIST = 					\
diff --git a/docs/html/img/gpk-distro-upgrade-notify.png b/docs/html/img/gpk-distro-upgrade-notify.png
new file mode 100644
index 0000000..9799bb2
Binary files /dev/null and b/docs/html/img/gpk-distro-upgrade-notify.png differ
diff --git a/docs/html/pk-screenshots.html b/docs/html/pk-screenshots.html
index 1761c77..a65d193 100644
--- a/docs/html/pk-screenshots.html
+++ b/docs/html/pk-screenshots.html
@@ -87,6 +87,9 @@
 <center><img src="img/gpk-require-restart.png" alt=""/></center>
 <p class="caption">We sometimes need to do a restart</p>
 
+<center><img src="img/gpk-distro-upgrade-notify.png" alt=""/></center>
+<p class="caption">We optionally detect distribution upgrades</p>
+
 <center><img src="img/gpk-auto-update.png" alt=""/></center>
 <p class="caption">Auto update install dialog</p>
 
commit 1726558224ba3cdbb8192b2d07f4e39cfeca336c
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 13:56:03 2008 +0100

    trivial: add a new group enum: PK_GROUP_ENUM_META_PACKAGES

diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index 939361c..1aa9217 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -251,6 +251,7 @@ static PkEnumMatch enum_group[] = {
 	{PK_GROUP_ENUM_SCIENCE,			"science"},
 	{PK_GROUP_ENUM_DOCUMENTATION,		"documentation"},
 	{PK_GROUP_ENUM_ELECTRONICS,		"electronics"},
+	{PK_GROUP_ENUM_META_PACKAGES,		"meta-packages"},
 	{0, NULL}
 };
 
diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 176a322..937841a 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -309,6 +309,7 @@ typedef enum {
 	PK_GROUP_ENUM_SCIENCE,
 	PK_GROUP_ENUM_DOCUMENTATION,
 	PK_GROUP_ENUM_ELECTRONICS,
+	PK_GROUP_ENUM_META_PACKAGES,
 	PK_GROUP_ENUM_UNKNOWN
 } PkGroupEnum;
 
commit bf40880039a82ecfec808881bc1f680be1d73278
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 13:23:18 2008 +0100

    trivial: add another ITS4 annotation in the daemon

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 19e509b..b6396b3 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -2319,6 +2319,7 @@ pk_transaction_check_pack_distro_id (const gchar *full_path, gchar **failure)
 	const gchar *filename;
 	GError *error = NULL;
 
+	/* ITS4: ignore, the user has no control over the daemon envp  */
 	meta_src = g_build_filename (g_get_tmp_dir (), "meta", NULL);
 	ret = pk_transaction_archive_extract (full_path, meta_src, &error);
 	if (!ret) {
commit 77c6add682c6c42a8725ee3f0b772779520deb20
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 13:20:59 2008 +0100

    trivial: add two ITS4 annotations

diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index 7cd447d..6275d33 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -317,12 +317,14 @@ pk_generate_pack_archive_add_file (struct archive *arch, const gchar *filename,
 		goto out;
 	}
 
-	/* write data to archive -- how come no convenience function? */
+	/* ITS4: ignore, buffer statically preallocated  */
 	len = read (fd, buff, sizeof (buff));
+	/* write data to archive -- how come no convenience function? */
 	while (len > 0) {
 		wrote = archive_write_data (arch, buff, len);
 		if (wrote != len)
 			egg_warning("wrote %i instead of %i\n", wrote, len);
+		/* ITS4: ignore, buffer statically preallocated  */
 		len = read (fd, buff, sizeof (buff));
 	}
 	ret = TRUE;
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 70bfac6..59d2c10 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -309,8 +309,10 @@ pk_spawn_send_stdin (PkSpawn *spawn, const gchar *command)
 	egg_debug ("sending '%s'", command);
 	buffer = g_strdup_printf ("%s\n", command);
 
-	/* write to the waiting process */
+	/* ITS4: ignore, we generated this */
 	length = strlen (buffer);
+
+	/* write to the waiting process */
 	wrote = write (spawn->priv->stdin_fd, buffer, length);
 	if (wrote != length) {
 		egg_warning ("failed to write '%s'", buffer);
commit 8250e4a4330131acd1fd8f13089980e1cded268e
Merge: d8d01a4... 503673d...
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 12:54:39 2008 +0200

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

commit d8d01a4335dcb01a0eb9d7baaff7a82cecd15442
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 12:53:39 2008 +0200

    urpmi: Warn the user when installation failed because of missing or bad GPG signature packages

diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
index ff85578..3b094d0 100644
--- a/backends/urpmi/helpers/urpmi_backend/actions.pm
+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
@@ -156,8 +156,10 @@ sub perform_installation {
         print "Install current mode = ", $mode, "\n";
       },
       bad_signature => sub {
-        # Here we display a message (with PK enum) to warn the user
-        # about a bad signature, then we exit
+        pk_print_error(PK_ERROR_ENUM_GPG_FAILURE, "Bad or missing GPG signatures");
+        pk_print_status(PK_STATUS_ENUM_FINISHED);
+        undef $lock;
+        undef $rpm_lock;
         exit 1;
       },
       ask_yes_or_no => sub {
commit ec7c09f09af634e6ed09950ebda52822fac715bd
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Thu Sep 11 12:44:35 2008 +0200

    urpmi: Added licence headers

diff --git a/backends/urpmi/helpers/get-depends.pl b/backends/urpmi/helpers/get-depends.pl
index 3c5b60a..f770d46 100755
--- a/backends/urpmi/helpers/get-depends.pl
+++ b/backends/urpmi/helpers/get-depends.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-details.pl b/backends/urpmi/helpers/get-details.pl
index 3207e9b..93fe098 100755
--- a/backends/urpmi/helpers/get-details.pl
+++ b/backends/urpmi/helpers/get-details.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-files.pl b/backends/urpmi/helpers/get-files.pl
index 74ae157..88424bb 100755
--- a/backends/urpmi/helpers/get-files.pl
+++ b/backends/urpmi/helpers/get-files.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-packages.pl b/backends/urpmi/helpers/get-packages.pl
index 9e3e525..bef46aa 100755
--- a/backends/urpmi/helpers/get-packages.pl
+++ b/backends/urpmi/helpers/get-packages.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-requires.pl b/backends/urpmi/helpers/get-requires.pl
index 52853f8..dfe749e 100755
--- a/backends/urpmi/helpers/get-requires.pl
+++ b/backends/urpmi/helpers/get-requires.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-update-detail.pl b/backends/urpmi/helpers/get-update-detail.pl
index 69ea452..fcf868d 100755
--- a/backends/urpmi/helpers/get-update-detail.pl
+++ b/backends/urpmi/helpers/get-update-detail.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/get-updates.pl b/backends/urpmi/helpers/get-updates.pl
index 6730723..8a5e475 100755
--- a/backends/urpmi/helpers/get-updates.pl
+++ b/backends/urpmi/helpers/get-updates.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/install-packages.pl b/backends/urpmi/helpers/install-packages.pl
index e8ddadf..73e6fad 100755
--- a/backends/urpmi/helpers/install-packages.pl
+++ b/backends/urpmi/helpers/install-packages.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/perl_packagekit/enums.pm b/backends/urpmi/helpers/perl_packagekit/enums.pm
index 8dbb4b0..d00ff72 100644
--- a/backends/urpmi/helpers/perl_packagekit/enums.pm
+++ b/backends/urpmi/helpers/perl_packagekit/enums.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package perl_packagekit::enums;
 
 use Exporter;
diff --git a/backends/urpmi/helpers/perl_packagekit/prints.pm b/backends/urpmi/helpers/perl_packagekit/prints.pm
index 5ac0eb4..36a726e 100644
--- a/backends/urpmi/helpers/perl_packagekit/prints.pm
+++ b/backends/urpmi/helpers/perl_packagekit/prints.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package perl_packagekit::prints;
 
 use Exporter;
diff --git a/backends/urpmi/helpers/refresh-cache.pl b/backends/urpmi/helpers/refresh-cache.pl
index 555a8b8..73dcc70 100755
--- a/backends/urpmi/helpers/refresh-cache.pl
+++ b/backends/urpmi/helpers/refresh-cache.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/remove-packages.pl b/backends/urpmi/helpers/remove-packages.pl
index d17b3d1..d47383a 100755
--- a/backends/urpmi/helpers/remove-packages.pl
+++ b/backends/urpmi/helpers/remove-packages.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/resolve.pl b/backends/urpmi/helpers/resolve.pl
index 32e0866..e58b312 100755
--- a/backends/urpmi/helpers/resolve.pl
+++ b/backends/urpmi/helpers/resolve.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/search-details.pl b/backends/urpmi/helpers/search-details.pl
index 3081abe..fc5b2ec 100755
--- a/backends/urpmi/helpers/search-details.pl
+++ b/backends/urpmi/helpers/search-details.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/search-file.pl b/backends/urpmi/helpers/search-file.pl
index 03d348e..7ba8d26 100755
--- a/backends/urpmi/helpers/search-file.pl
+++ b/backends/urpmi/helpers/search-file.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/search-group.pl b/backends/urpmi/helpers/search-group.pl
index e5b7b92..5745a6f 100755
--- a/backends/urpmi/helpers/search-group.pl
+++ b/backends/urpmi/helpers/search-group.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/search-name.pl b/backends/urpmi/helpers/search-name.pl
index 383921f..2a381d1 100755
--- a/backends/urpmi/helpers/search-name.pl
+++ b/backends/urpmi/helpers/search-name.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/update-packages.pl b/backends/urpmi/helpers/update-packages.pl
index 838fec8..f7a1b76 100755
--- a/backends/urpmi/helpers/update-packages.pl
+++ b/backends/urpmi/helpers/update-packages.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/update-system.pl b/backends/urpmi/helpers/update-system.pl
index 5089ae1..c9c44c4 100755
--- a/backends/urpmi/helpers/update-system.pl
+++ b/backends/urpmi/helpers/update-system.pl
@@ -1,4 +1,14 @@
 #!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
 
 use strict;
 
diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
index dcaafde..ff85578 100644
--- a/backends/urpmi/helpers/urpmi_backend/actions.pm
+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package urpmi_backend::actions;
 
 use strict;
diff --git a/backends/urpmi/helpers/urpmi_backend/filters.pm b/backends/urpmi/helpers/urpmi_backend/filters.pm
index 2c2f13a..b8d2a7d 100644
--- a/backends/urpmi/helpers/urpmi_backend/filters.pm
+++ b/backends/urpmi/helpers/urpmi_backend/filters.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package urpmi_backend::filters;
 
 use MDK::Common;
diff --git a/backends/urpmi/helpers/urpmi_backend/groups.pm b/backends/urpmi/helpers/urpmi_backend/groups.pm
index d377ab2..725c78d 100644
--- a/backends/urpmi/helpers/urpmi_backend/groups.pm
+++ b/backends/urpmi/helpers/urpmi_backend/groups.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package urpmi_backend::groups;
 
 use strict;
diff --git a/backends/urpmi/helpers/urpmi_backend/open_db.pm b/backends/urpmi/helpers/urpmi_backend/open_db.pm
index 795edc6..aeec0a4 100644
--- a/backends/urpmi/helpers/urpmi_backend/open_db.pm
+++ b/backends/urpmi/helpers/urpmi_backend/open_db.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package urpmi_backend::open_db;
 
 use strict;
diff --git a/backends/urpmi/helpers/urpmi_backend/tools.pm b/backends/urpmi/helpers/urpmi_backend/tools.pm
index e078134..4869b98 100644
--- a/backends/urpmi/helpers/urpmi_backend/tools.pm
+++ b/backends/urpmi/helpers/urpmi_backend/tools.pm
@@ -1,3 +1,14 @@
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.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.
+#
+
 package urpmi_backend::tools;
 
 use strict;
commit 503673d4b59cb380eeb17dc56661124295eff972
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 10:40:13 2008 +0100

    yum: now we depend on 3.2.19, rip out YumDirectSQL as we can use yum directly rather than fumble about in the sqlite files

diff --git a/backends/yum/Makefile.am b/backends/yum/Makefile.am
index 0dc1139..9ba6386 100644
--- a/backends/yum/Makefile.am
+++ b/backends/yum/Makefile.am
@@ -1,7 +1,6 @@
 helperdir = $(datadir)/PackageKit/helpers/yum
 dist_helper_DATA = 			\
 	yumBackend.py			\
-	yumDirect.py			\
 	yumComps.py			\
 	yumFilter.py
 
diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 82ff201..1cc208e 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -51,7 +51,6 @@ import tempfile
 import shutil
 import ConfigParser
 
-from yumDirect import *
 from yumFilter import *
 from yumComps import *
 
@@ -254,9 +253,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_QUERY)
         package_list = [] #we can't do emitting as found if we are post-processing
         fltlist = filters.split(';')
-
-        # use direct access for speed
-        #direct = YumDirectSQL(self.yumbase)
         pkgfilter = YumFilter(fltlist)
 
         # get the packagelist for this group
@@ -271,13 +267,8 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         # get available packages
         self.percentage(20)
         if FILTER_INSTALLED not in fltlist:
-            # ideally we want to use pkgSack.searchNames, but it's broken with
-            # 'too many SQL variables' when you pass it lots of packages
             pkgs = self.yumbase.pkgSack.searchNames(names=all_packages)
             pkgfilter.add_available(pkgs)
-            #for package in all_packages:
-            #    pkgs = direct.resolve(package)
-            #    pkgfilter.add_available(pkgs)
 
         # we couldn't do this when generating the list
         package_list = pkgfilter.post_process()
@@ -285,8 +276,6 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.percentage(90)
         self._show_package_list(package_list)
 
-        # close all the databases
-        #direct.close()
         self.percentage(100)
 
     @handle_repo_error
diff --git a/backends/yum/yumDirect.py b/backends/yum/yumDirect.py
deleted file mode 100644
index eeb1e79..0000000
--- a/backends/yum/yumDirect.py
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/python
-# 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.
-
-# Copyright (C) 2008
-#    Richard Hughes <richard at hughsie.com>
-
-# imports
-import sqlite3 as sqlite
-import yum
-
-# simple object that we can use when we use sqlite directly
-class PackageObjectSimple(object):
-    def __init__(self):
-        self.name = None
-        self.epoch = None
-        self.version = None
-        self.release = None
-        self.arch = None
-        self.repo = None
-        self.summary = None
-        self.sourcerpm = None
-        self.requires = []
-        self.pkgKey = 0
-
-# use direct access for speed, for more details see
-# https://bugzilla.redhat.com/show_bug.cgi?id=453356
-class YumDirectSQL(object):
-    def __init__(self,yumbase):
-        ''' connect to all enabled repos '''
-        self.repo_list = []
-        self.cursor_list = []
-        for repo in yumbase.repos.repos.values():
-            if repo.isEnabled():
-                database = '/var/cache/yum/' + repo.id + '/primary.sqlite'
-                try:
-                    connection = sqlite.connect(database)
-                    cursor = connection.cursor()
-                    self.repo_list.append((repo.id,connection))
-                    self.cursor_list.append((cursor,repo.id))
-                except Exception, e:
-                    print "cannot connect to database %s: %s" % (database,str(e))
-
-    def resolve(self,package):
-        ''' resolve a name like "hal" into a list of pkgs '''
-        pkgs = []
-        for cursor,repoid in self.cursor_list:
-            cursor.execute('SELECT name,epoch,version,release,arch,summary,rpm_sourcerpm,pkgKey FROM packages WHERE name = ?',[package])
-            for row in cursor:
-                pkg = PackageObjectSimple()
-                pkg.name = row[0]
-                pkg.epoch = row[1]
-                pkg.version = row[2]
-                pkg.release = row[3]
-                pkg.arch = row[4]
-                pkg.repo = repoid
-                pkg.summary = row[5]
-                pkg.sourcerpm = row[6]
-                pkg.pkgKey = row[7]
-
-                # get the requires
-                cursor.execute('SELECT name FROM requires WHERE pkgKey = ?',[pkg.pkgKey])
-                for row in cursor:
-                    pkg.requires.append(row[0])
-
-                pkgs.append(pkg)
-        return pkgs
-
-    def close(self):
-        ''' close all database connections '''
-        for repo_id,repo_connection in self.repo_list:
-            repo_connection.close()
-
diff --git a/backends/yum/yumFilter.py b/backends/yum/yumFilter.py
index 2cfb67b..ec25bd9 100644
--- a/backends/yum/yumFilter.py
+++ b/backends/yum/yumFilter.py
@@ -21,7 +21,6 @@
 # imports
 from packagekit.backend import *
 from packagekit.package import PackagekitPackage
-from yumDirect import *
 
 import yum
 import rpmUtils
@@ -161,10 +160,7 @@ class YumFilter(object,PackagekitPackage):
             wantInstalled = True
         else:
             wantInstalled = False
-        if isinstance(pkg,PackageObjectSimple):
-            isInstalled = False
-        else:
-            isInstalled = pkg.repo.id == 'installed'
+        isInstalled = pkg.repo.id == 'installed'
         return isInstalled == wantInstalled
 
     def _do_gui_filtering(self,flt,pkg):
diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 84b18ca..72a5e0c 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -53,7 +53,7 @@ cross-architecture API.
 %package yum
 Summary: PackageKit YUM backend
 Group: System Environment/Libraries
-Requires: yum >= 3.2.6
+Requires: yum >= 3.2.19
 Requires: %{name} = %{version}-%{release}
 
 %description yum
commit 757a8a5c989afe6c8e3529fd3a035fa3ccfc5ba0
Merge: 7502283... bf80aee...
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 10:24:05 2008 +0100

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

commit bf80aeeba5772b766f5888f393bc7fbe1b0bf7e0
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Thu Sep 11 11:25:47 2008 +0200

    yum: disable the YumDirect code, it dont work

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 1af62ac..82ff201 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -256,7 +256,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         fltlist = filters.split(';')
 
         # use direct access for speed
-        direct = YumDirectSQL(self.yumbase)
+        #direct = YumDirectSQL(self.yumbase)
         pkgfilter = YumFilter(fltlist)
 
         # get the packagelist for this group
@@ -273,11 +273,11 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         if FILTER_INSTALLED not in fltlist:
             # ideally we want to use pkgSack.searchNames, but it's broken with
             # 'too many SQL variables' when you pass it lots of packages
-            #pkgs = self.yumbase.pkgSack.searchNames(names=all_packages)
-            #pkgfilter.add_available(pkgs)
-            for package in all_packages:
-                pkgs = direct.resolve(package)
-                pkgfilter.add_available(pkgs)
+            pkgs = self.yumbase.pkgSack.searchNames(names=all_packages)
+            pkgfilter.add_available(pkgs)
+            #for package in all_packages:
+            #    pkgs = direct.resolve(package)
+            #    pkgfilter.add_available(pkgs)
 
         # we couldn't do this when generating the list
         package_list = pkgfilter.post_process()
@@ -286,7 +286,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self._show_package_list(package_list)
 
         # close all the databases
-        direct.close()
+        #direct.close()
         self.percentage(100)
 
     @handle_repo_error
commit 75022834b07daefb232f6f72dcb066bc58db446f
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 10:23:43 2008 +0100

    bugfix: execute the pk_transaction_run handler in an idle callback
    
    After spending a couple of hours reviewing the code, it was obvious that queued transactions were
    being called recursively, which really screwed up the next transaction list scheduling.
    This would often leave the daemon 'waiting for transactions' indefinately.
    Make sure we idle_add the running callback, so we break out of the signal chain and add a metric ton of
    self tests to verify this is working correctly.

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index e5823ea..b20c07b 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -208,6 +208,37 @@ pk_transaction_list_remove_item_timeout (gpointer data)
 }
 
 /**
+ * pk_transaction_list_run_idle_cb:
+ **/
+static gboolean
+pk_transaction_list_run_idle_cb (PkTransactionItem *item)
+{
+	gboolean ret;
+
+	egg_debug ("actually running %s", item->tid);
+	ret = pk_transaction_run (item->transaction);
+	if (!ret)
+		egg_error ("failed to run transaction (fatal)");
+
+	/* never try to idle add this again */
+	return FALSE;
+}
+
+/**
+ * pk_transaction_list_run_item:
+ **/
+static void
+pk_transaction_list_run_item (PkTransactionList *tlist, PkTransactionItem *item)
+{
+	/* we set this here so that we don't try starting more than one */
+	egg_debug ("schedule idle running %s", item->tid);
+	item->running = TRUE;
+
+	/* add this idle, so that we don't have a deep out-of-order callchain */
+	g_idle_add ((GSourceFunc) pk_transaction_list_run_idle_cb, item);
+}
+
+/**
  * pk_transaction_list_transaction_finished_cb:
  **/
 static void
@@ -215,7 +246,6 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 {
 	guint i;
 	guint length;
-	gboolean ret;
 	PkTransactionItem *item;
 	PkTransactionFinished *finished;
 	const gchar *tid;
@@ -234,6 +264,7 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 	}
 
 	egg_debug ("transaction %s completed, marking finished", item->tid);
+	item->running = FALSE;
 	item->finished = TRUE;
 
 	/* we have changed what is running */
@@ -252,14 +283,8 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
 		if (item->committed &&
 		    !item->running &&
-		    !item->finished) {
-			egg_debug ("running %s", item->tid);
-			item->running = TRUE;
-			ret = pk_transaction_run (item->transaction);
-			/* only stop lookng if we run the job */
-			if (ret)
-				break;
-		}
+		    !item->finished)
+			pk_transaction_list_run_item (tlist, item);
 	}
 }
 
@@ -343,7 +368,6 @@ pk_transaction_list_number_running (PkTransactionList *tlist)
 gboolean
 pk_transaction_list_commit (PkTransactionList *tlist, const gchar *tid)
 {
-	gboolean ret;
 	PkTransactionItem *item;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
@@ -363,15 +387,8 @@ pk_transaction_list_commit (PkTransactionList *tlist, const gchar *tid)
 	g_signal_emit (tlist, signals [PK_TRANSACTION_LIST_CHANGED], 0);
 
 	/* do the transaction now if we have no other in progress */
-	if (pk_transaction_list_number_running (tlist) == 0) {
-		egg_debug ("running %s", item->tid);
-		item->running = TRUE;
-		ret = pk_transaction_run (item->transaction);
-		if (!ret) {
-			egg_warning ("unable to start first job");
-			return FALSE;
-		}
-	}
+	if (pk_transaction_list_number_running (tlist) == 0)
+		pk_transaction_list_run_item (tlist, item);
 
 	return TRUE;
 }
@@ -575,7 +592,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_failed (test, "size %i", size);
 
 	/************************************************************/
-	egg_test_title (test, "get transactions in progress");
+	egg_test_title (test, "get transactions (committed, not finished) in progress");
 	array = pk_transaction_list_get_array (tlist);
 	size = g_strv_length (array);
 	if (size == 0)
@@ -648,8 +665,9 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_failed (test, "could not find in db");
 
 	g_signal_connect (item->transaction, "finished",
-				G_CALLBACK (pk_transaction_list_test_finished_cb), test);
+			  G_CALLBACK (pk_transaction_list_test_finished_cb), test);
 
+	/* this tests the run-on-commit action */
 	pk_transaction_get_updates (item->transaction, "none", NULL);
 
 	/************************************************************/
@@ -685,7 +703,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_failed (test, "size %i", size);
 
 	/************************************************************/
-	egg_test_title (test, "get transactions in progress");
+	egg_test_title (test, "get transactions (committed, not finished) in progress");
 	array = pk_transaction_list_get_array (tlist);
 	size = g_strv_length (array);
 	if (size == 1)
@@ -706,7 +724,7 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_failed (test, "size %i", size);
 
 	/************************************************************/
-	egg_test_title (test, "get transactions in progress (none)");
+	egg_test_title (test, "get transactions (committed, not finished) in progress (none)");
 	array = pk_transaction_list_get_array (tlist);
 	size = g_strv_length (array);
 	if (size == 0)
@@ -737,6 +755,156 @@ pk_transaction_list_test (EggTest *test)
 
 	g_free (tid);
 
+	/************************************************************
+	 ****************  Chained transactions    ******************
+	 ************************************************************/
+
+	gchar *tid1;
+	gchar *tid2;
+	PkTransactionItem *item1;
+	PkTransactionItem *item2;
+
+	tid1 = pk_transaction_id_generate ();
+	tid2 = pk_transaction_id_generate ();
+
+	pk_transaction_list_create (tlist, tid1);
+	pk_transaction_list_create (tlist, tid2);
+
+	item1 = pk_transaction_list_get_from_tid (tlist, tid1);
+	item2 = pk_transaction_list_get_from_tid (tlist, tid2);
+
+	/************************************************************/
+	egg_test_title (test, "get both items in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "get transactions (committed, not finished) committed");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	g_signal_connect (item1->transaction, "finished",
+			  G_CALLBACK (pk_transaction_list_test_finished_cb), test);
+	g_signal_connect (item2->transaction, "finished",
+			  G_CALLBACK (pk_transaction_list_test_finished_cb), test);
+
+	/* this starts one action */
+	pk_transaction_get_updates (item1->transaction, "none", NULL);
+	/* this should be chained after the first action completes */
+	pk_transaction_search_name (item2->transaction, "none", "power", NULL);
+
+	/************************************************************/
+	egg_test_title (test, "get transactions (committed, not finished) in progress (both)");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/* wait for first action */
+	egg_test_loop_wait (test, 6000);
+	egg_test_loop_check (test);
+
+	/************************************************************/
+	egg_test_title (test, "get both items in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "get transactions (committed, not finished) (just one)");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 1)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "make sure item1 has correct flags");
+	if (item1->running == FALSE && item1->committed == TRUE && item1->finished == TRUE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item1->running, item1->committed, item1->finished);
+
+	/************************************************************/
+	egg_test_title (test, "make sure item2 has correct flags");
+	if (item2->running == TRUE && item2->committed == TRUE && item2->finished == FALSE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item2->running, item2->committed, item2->finished);
+
+	/* wait for second action */
+	egg_test_loop_wait (test, 6000);
+	egg_test_loop_check (test);
+
+	/************************************************************/
+	egg_test_title (test, "get both items in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 2)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "get transactions (committed, not finished) in progress (neither)");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "make sure item1 has correct flags");
+	if (item1->running == FALSE && item1->committed == TRUE && item1->finished == TRUE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item1->running, item1->committed, item1->finished);
+
+	/************************************************************/
+	egg_test_title (test, "make sure item2 has correct flags");
+	if (item2->running == FALSE && item2->committed == TRUE && item2->finished == TRUE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item2->running, item2->committed, item2->finished);
+
+	/* wait for Cleanup */
+	g_timeout_add_seconds (5, (GSourceFunc) pk_transaction_list_test_delay_cb, test);
+	egg_test_loop_wait (test, 6000);
+	egg_test_loop_check (test);
+
+	/************************************************************/
+	egg_test_title (test, "get both items in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
+	/************************************************************/
+	egg_test_title (test, "get transactions (committed, not finished) in progress (neither - again)");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 0)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "size %i", size);
+
 	g_object_unref (tlist);
 	g_object_unref (backend);
 
commit c20e8f574cfd39f34f86585919daa3b73d5fc042
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 10:04:47 2008 +0100

    trivial: allow pk_transaction_search_name() to be used internally in the self check code

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 0473c6b..19e509b 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -2172,10 +2172,9 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 		return;
 	}
 
-	if (context != NULL) {
-		/* not set inside the test suite */
+	/* not set inside the test suite */
+	if (context != NULL)
 		dbus_g_method_return (context);
-	}
 }
 
 /**
@@ -3267,7 +3266,9 @@ pk_transaction_search_name (PkTransaction *transaction, const gchar *filter,
 		return;
 	}
 
-	dbus_g_method_return (context);
+	/* not set inside the test suite */
+	if (context != NULL)
+		dbus_g_method_return (context);
 }
 
 /**
commit 601ac1e9171134c2bc7f8e1dec00002856b8985b
Author: Stefan Haas <shaas at suse.de>
Date:   Thu Sep 11 10:31:11 2008 +0200

    zypp: implement fate #301904 to warn for outdated repo (dmacvicar at suse.de)

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index 3c32ec0..52b3df5 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -630,6 +630,9 @@ backend_get_updates_thread (PkBackend *backend)
 	zypp::ResPool pool = zypp_build_pool (TRUE);
 	pk_backend_set_percentage (backend, 40);
 
+	// check if the repositories may be dead (feature #301904)  
+	 warn_outdated_repos(backend, pool);
+
 	// get all Packages and Patches for Update
 	std::set<zypp::PoolItem> *candidates = zypp_get_patches ();
 	//std::set<zypp::PoolItem> *candidates2 = new std::set<zypp::PoolItem> ();
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index b6d13b5..94f4c54 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -48,6 +48,7 @@
 #include <zypp/target/rpm/RpmHeader.h>
 #include <zypp/target/rpm/librpmDb.h>
 #include <zypp/base/LogControl.h>
+#include <zypp/base/String.h>
 
 #include <zypp/base/Logger.h>
 
@@ -192,6 +193,27 @@ zypp_build_pool (gboolean include_local)
 	return zypp->pool ();
 }
 
+void  
+warn_outdated_repos(PkBackend *backend, const zypp::ResPool & pool)  
+{  
+	zypp::Repository repoobj;  
+	zypp::ResPool::repository_iterator it;  
+	for ( it = pool.knownRepositoriesBegin();  
+		it != pool.knownRepositoriesEnd();  
+		++it )  
+	{  
+		zypp::Repository repo(*it);  
+		if ( repo.maybeOutdated() )  
+		{  
+			// warn the user  
+			pk_backend_message (backend,
+					PK_MESSAGE_ENUM_BROKEN_MIRROR,
+					zypp::str::form("The repository %s seems to be outdated. You may want to try another mirror.",
+					repo.alias().c_str()).c_str() );
+		}  
+	}  
+}
+
 zypp::ResPool
 zypp_build_local_pool ()
 {
diff --git a/backends/zypp/zypp-utils.h b/backends/zypp/zypp-utils.h
index 4a31fdd..280286e 100644
--- a/backends/zypp/zypp-utils.h
+++ b/backends/zypp/zypp-utils.h
@@ -88,6 +88,11 @@ gboolean zypp_is_changeable_media (const zypp::Url &url);
  */
 zypp::ResPool zypp_build_pool (gboolean include_local);
 
+/**  
+* check and warns the user that a repository may be outdated  
+*/  
+void warn_outdated_repos(PkBackend *backend, const zypp::ResPool & pool);  
+
 /**
  * Build and return a ResPool that contains only the local resolvables.
  */
commit d205acad4cf6d4895e042e5ff84b7c587bc1ad90
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 09:21:01 2008 +0100

    trivial: add another couple of unit tests to chase down a bug

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index 0be6123..e5823ea 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -559,6 +559,14 @@ pk_transaction_list_test (EggTest *test)
 		egg_test_failed (test, "could not find in db");
 
 	/************************************************************/
+	egg_test_title (test, "make sure item has correct flags");
+	if (item->running == FALSE && item->committed == FALSE && item->finished == FALSE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item->running, item->committed, item->finished);
+
+	/************************************************************/
 	egg_test_title (test, "get size one we have in queue");
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 1)
@@ -645,6 +653,14 @@ pk_transaction_list_test (EggTest *test)
 	pk_transaction_get_updates (item->transaction, "none", NULL);
 
 	/************************************************************/
+	egg_test_title (test, "make sure item has correct flags");
+	if (item->running == TRUE && item->committed == TRUE && item->finished == FALSE)
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "wrong flags: running[%i] committed[%i] finished[%i]",
+				 item->running, item->committed, item->finished);
+
+	/************************************************************/
 	egg_test_title (test, "get present role");
 	ret = pk_transaction_list_role_present (tlist, PK_ROLE_ENUM_GET_UPDATES);
 	if (ret)
commit 60fee5f0442f04316b153891a8dbb76eeb53ca9f
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 09:09:42 2008 +0100

    trivial: make some small changes to PkTransactionList after paper review

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index c52a162..0be6123 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -38,10 +38,11 @@
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
 
+#include <pk-common.h>
+
 #include "egg-debug.h"
 #include "egg-string.h"
 
-#include <pk-common.h>
 #include "pk-transaction-id.h"
 #include "pk-transaction-list.h"
 #include "pk-interface-transaction.h"
@@ -52,6 +53,9 @@ static void     pk_transaction_list_finalize	(GObject        *object);
 
 #define PK_TRANSACTION_LIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), PK_TYPE_TRANSACTION_LIST, PkTransactionListPrivate))
 
+/* how long the transaction should be queriable after it is finished, in seconds */
+#define PK_TRANSACTION_LIST_KEEP_FINISHED_TIMEOUT	5
+
 struct PkTransactionListPrivate
 {
 	GPtrArray		*array;
@@ -82,7 +86,7 @@ static PkTransactionItem *
 pk_transaction_list_get_from_tid (PkTransactionList *tlist, const gchar *tid)
 {
 	guint i;
-	guint length;
+	GPtrArray *array;
 	PkTransactionItem *item;
 	const gchar *tmptid;
 
@@ -90,13 +94,12 @@ pk_transaction_list_get_from_tid (PkTransactionList *tlist, const gchar *tid)
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), NULL);
 
 	/* find the runner with the transaction ID */
-	length = tlist->priv->array->len;
-	for (i=0; i<length; i++) {
-		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
+	array = tlist->priv->array;
+	for (i=0; i<array->len; i++) {
+		item = (PkTransactionItem *) g_ptr_array_index (array, i);
 		tmptid = pk_transaction_get_tid (item->transaction);
-		if (egg_strequal (tmptid, tid)) {
+		if (egg_strequal (tmptid, tid))
 			return item;
-		}
 	}
 	return NULL;
 }
@@ -111,28 +114,25 @@ gboolean
 pk_transaction_list_role_present (PkTransactionList *tlist, PkRoleEnum role)
 {
 	guint i;
-	guint length;
+	GPtrArray *array;
 	PkRoleEnum role_temp;
 	PkTransactionItem *item;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
 
 	/* check for existing transaction doing an update */
-	length = tlist->priv->array->len;
-	for (i=0; i<length; i++) {
-		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
+	array = tlist->priv->array;
+	for (i=0; i<array->len; i++) {
+		item = (PkTransactionItem *) g_ptr_array_index (array, i);
 		/* we might have recently finished this, but not removed it */
-		if (item->finished) {
+		if (item->finished)
 			continue;
-		}
 		/* we might not have this set yet */
-		if (item->transaction == NULL) {
+		if (item->transaction == NULL)
 			continue;
-		}
 		role_temp = pk_transaction_priv_get_role (item->transaction);
-		if (role_temp == role) {
+		if (role_temp == role)
 			return TRUE;
-		}
 	}
 	return FALSE;
 }
@@ -151,7 +151,7 @@ pk_transaction_list_remove_internal (PkTransactionList *tlist, PkTransactionItem
 	/* valid item */
 	egg_debug ("remove transaction %s, item %p", item->tid, item);
 	ret = g_ptr_array_remove (tlist->priv->array, item);
-	if (ret == FALSE) {
+	if (!ret) {
 		egg_warning ("could not remove %p as not present in list", item);
 		return FALSE;
 	}
@@ -224,9 +224,8 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 
 	tid = pk_transaction_get_tid (transaction);
 	item = pk_transaction_list_get_from_tid (tlist, tid);
-	if (item == NULL) {
+	if (item == NULL)
 		egg_error ("no transaction list item found!");
-	}
 
 	/* transaction is already finished? */
 	if (item->finished) {
@@ -245,22 +244,21 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 	finished = g_new0 (PkTransactionFinished, 1);
 	finished->tlist = tlist;
 	finished->item = item;
-	g_timeout_add_seconds (5, pk_transaction_list_remove_item_timeout, finished);
+	g_timeout_add_seconds (PK_TRANSACTION_LIST_KEEP_FINISHED_TIMEOUT, pk_transaction_list_remove_item_timeout, finished);
 
 	/* do the next transaction now if we have another queued */
 	length = tlist->priv->array->len;
 	for (i=0; i<length; i++) {
 		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
 		if (item->committed &&
-		    item->running == FALSE &&
-		    item->finished == FALSE) {
+		    !item->running &&
+		    !item->finished) {
 			egg_debug ("running %s", item->tid);
 			item->running = TRUE;
 			ret = pk_transaction_run (item->transaction);
 			/* only stop lookng if we run the job */
-			if (ret) {
+			if (ret)
 				break;
-			}
 		}
 	}
 }
@@ -271,6 +269,7 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 gboolean
 pk_transaction_list_create (PkTransactionList *tlist, const gchar *tid)
 {
+	gboolean ret;
 	PkTransactionItem *item;
 	DBusGConnection *connection;
 
@@ -294,14 +293,19 @@ pk_transaction_list_create (PkTransactionList *tlist, const gchar *tid)
 
 	/* get another connection */
 	connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, NULL);
-	if (connection == NULL) {
+	if (connection == NULL)
 		egg_error ("no connection");
-	}
 
 	item->transaction = pk_transaction_new ();
 	g_signal_connect_after (item->transaction, "finished",
 				G_CALLBACK (pk_transaction_list_transaction_finished_cb), tlist);
-	pk_transaction_set_tid (item->transaction, item->tid);
+
+	/* set the TID on the transaction */
+	ret = pk_transaction_set_tid (item->transaction, item->tid);
+	if (!ret)
+		egg_error ("failed to set TID");
+
+	/* put on the bus */
 	dbus_g_object_type_install_info (PK_TYPE_TRANSACTION, &dbus_glib_pk_transaction_object_info);
 	dbus_g_connection_register_g_object (connection, item->tid, G_OBJECT (item->transaction));
 
@@ -327,11 +331,8 @@ pk_transaction_list_number_running (PkTransactionList *tlist)
 	length = tlist->priv->array->len;
 	for (i=0; i<length; i++) {
 		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
-		if (item->committed &&
-		    item->running &&
-		    item->finished == FALSE) {
+		if (item->committed && item->running && !item->finished)
 			count++;
-		}
 	}
 	return count;
 }
@@ -358,7 +359,7 @@ pk_transaction_list_commit (PkTransactionList *tlist, const gchar *tid)
 	item->committed = TRUE;
 
 	/* we will changed what is running */
-	egg_debug ("emmitting ::changed");
+	egg_debug ("emitting ::changed");
 	g_signal_emit (tlist, signals [PK_TRANSACTION_LIST_CHANGED], 0);
 
 	/* do the transaction now if we have no other in progress */
@@ -397,9 +398,8 @@ pk_transaction_list_get_array (PkTransactionList *tlist)
 	for (i=0; i<length; i++) {
 		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
 		/* only return in the list if its committed and not finished */
-		if (item->committed && !item->finished) {
+		if (item->committed && !item->finished)
 			g_ptr_array_add (parray, g_strdup (item->tid));
-		}
 	}
 	egg_debug ("%i transactions in list, %i active", length, parray->len);
 	array = pk_ptr_array_to_argv (parray);
@@ -537,38 +537,34 @@ pk_transaction_list_test (EggTest *test)
 	tid = pk_transaction_id_generate ();
 	if (tid != NULL) {
 		egg_test_success (test, "got tid %s", tid);
-	} else {
+	} else
 		egg_test_failed (test, "failed to get tid");
-	}
 
 	/************************************************************/
-	egg_test_title (test, "make sure we get a valid tid");
+	egg_test_title (test, "create a transaction object");
 	ret = pk_transaction_list_create (tlist, tid);
 	if (ret) {
 		egg_test_success (test, "created transaction %s", tid);
-	} else {
+	} else
 		egg_test_failed (test, "failed to create transaction");
-	}
 
 	/************************************************************/
-	egg_test_title (test, "get from db");
+	egg_test_title (test, "make sure we get the right object back");
 	item = pk_transaction_list_get_from_tid (tlist, tid);
 	if (item != NULL &&
 	    egg_strequal (item->tid, tid) &&
 	    item->transaction != NULL)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "could not find in db");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get size one we have in queue");
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get transactions in progress");
@@ -576,36 +572,32 @@ pk_transaction_list_test (EggTest *test)
 	size = g_strv_length (array);
 	if (size == 0)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "add again the same tid (should fail)");
 	ret = pk_transaction_list_create (tlist, tid);
 	if (!ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "added the same tid twice");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "remove without ever committing");
 	ret = pk_transaction_list_remove (tlist, tid);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "failed to remove");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get size none we have in queue");
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 0)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/* get a new tid */
 	g_free (tid);
@@ -614,11 +606,10 @@ pk_transaction_list_test (EggTest *test)
 	/************************************************************/
 	egg_test_title (test, "create another item");
 	ret = pk_transaction_list_create (tlist, tid);
-	if (ret) {
+	if (ret)
 		egg_test_success (test, "created transaction %s", tid);
-	} else {
+	else
 		egg_test_failed (test, "failed to create transaction");
-	}
 
 	/************************************************************/
 	PkBackend *backend;
@@ -635,9 +626,8 @@ pk_transaction_list_test (EggTest *test)
 	ret = pk_backend_lock (backend);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "failed to lock");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get from db");
@@ -646,9 +636,8 @@ pk_transaction_list_test (EggTest *test)
 	    egg_strequal (item->tid, tid) &&
 	    item->transaction != NULL)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "could not find in db");
-	}
 
 	g_signal_connect (item->transaction, "finished",
 				G_CALLBACK (pk_transaction_list_test_finished_cb), test);
@@ -660,27 +649,24 @@ pk_transaction_list_test (EggTest *test)
 	ret = pk_transaction_list_role_present (tlist, PK_ROLE_ENUM_GET_UPDATES);
 	if (ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "did not get role");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get non-present role");
 	ret = pk_transaction_list_role_present (tlist, PK_ROLE_ENUM_SEARCH_NAME);
 	if (!ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "got missing role");
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get size one we have in queue");
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get transactions in progress");
@@ -688,9 +674,8 @@ pk_transaction_list_test (EggTest *test)
 	size = g_strv_length (array);
 	if (size == 1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/* wait for Finished */
 	egg_test_loop_wait (test, 2000);
@@ -701,9 +686,8 @@ pk_transaction_list_test (EggTest *test)
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 1)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "get transactions in progress (none)");
@@ -711,18 +695,16 @@ pk_transaction_list_test (EggTest *test)
 	size = g_strv_length (array);
 	if (size == 0)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	/************************************************************/
 	egg_test_title (test, "remove already removed");
 	ret = pk_transaction_list_remove (tlist, tid);
 	if (!ret)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "tried to remove");
-	}
 
 	/* wait for Cleanup */
 	g_timeout_add_seconds (5, (GSourceFunc) pk_transaction_list_test_delay_cb, test);
@@ -734,9 +716,8 @@ pk_transaction_list_test (EggTest *test)
 	size = pk_transaction_list_get_size (tlist);
 	if (size == 0)
 		egg_test_success (test, NULL);
-	else {
+	else
 		egg_test_failed (test, "size %i", size);
-	}
 
 	g_free (tid);
 
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index ac7c9fa..0473c6b 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1069,6 +1069,7 @@ pk_transaction_set_tid (PkTransaction *transaction, const gchar *tid)
 
 	if (transaction->priv->tid != NULL) {
 		egg_warning ("changing a tid -- why?");
+		return FALSE;
 	}
 	g_free (transaction->priv->tid);
 	transaction->priv->tid = g_strdup (tid);
diff --git a/src/pk-update-detail-list.c b/src/pk-update-detail-list.c
index c083825..27c90d4 100644
--- a/src/pk-update-detail-list.c
+++ b/src/pk-update-detail-list.c
@@ -192,8 +192,6 @@ void
 pk_update_detail_test_list (EggTest *test)
 {
 	PkUpdateDetailList *list;
-	gchar *text;
-	gint value;
 
 	if (!egg_test_start (test, "PkUpdateDetailList"))
 		return;
commit 6104e317ebf4f8508d20b624a1ee408096d82325
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Sep 11 09:08:59 2008 +0100

    trivial: limit polling check when spawned to 1 in 20

diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 8cfa407..70bfac6 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -148,6 +148,7 @@ pk_spawn_check_child (PkSpawn *spawn)
 {
 	int status;
 	gboolean ret;
+	static guint limit_printing = 0;
 
 	/* this shouldn't happen */
 	if (spawn->priv->finished) {
@@ -158,8 +159,11 @@ pk_spawn_check_child (PkSpawn *spawn)
 	pk_spawn_read_fd_into_buffer (spawn->priv->stdout_fd, spawn->priv->stdout_buf);
 	pk_spawn_emit_whole_lines (spawn, spawn->priv->stdout_buf);
 
+	/* Only print one in twenty times to avoid filling the screen */
+	if (limit_printing++ % 20 ==0)
+		egg_debug ("polling child_pid=%i (1/20)", spawn->priv->child_pid);
+
 	/* check if the child exited */
-	egg_debug ("polling child_pid=%i", spawn->priv->child_pid);
 	if (waitpid (spawn->priv->child_pid, &status, WNOHANG) != spawn->priv->child_pid)
 		return TRUE;
 
commit cda4678a9505fcdffb7e968b9ae0da3f456e28f7
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 09:25:15 2008 +0200

    use enums instead of magic strings

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 9d4ac19..a289f18 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -547,13 +547,13 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             if hasattr(info, 'getLicense'):
                 license = info.getLicense()
             else:
-                license = "unknown"
+                license = LICENSE_UNKNOWN
 
             group = info.getGroup()
             if group in self.GROUPS:
                 group = self.GROUPS[group]
             else:
-                group = "unknown"
+                group = GROUP_UNKNOWN
 
             self.details(packageid, license, group, description, url,
                     pkgsize)
commit cf4f00824c3504eb222ef6ca40009ff4f45125f0
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 09:15:04 2008 +0200

    smart: report package-not-found for update/download too

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 3a18384..9d4ac19 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -235,6 +235,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         packages = []
         for packageid in packageids:
             ratio, results, suggestions = self._search_packageid(packageid)
+            if not results:
+                packagestring = self._string_packageid(packageid)
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % packagestring)
             packages.extend(self._process_search_results(results))
 
         installed = [package for package in packages if package.installed]
@@ -257,6 +261,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         packages = []
         for packageid in packageids:
             ratio, results, suggestions = self._search_packageid(packageid)
+            if not results:
+                packagestring = self._string_packageid(packageid)
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % packagestring)
             packages.extend(self._process_search_results(results))
         if len(packages) < 1:
             return
commit 3f03a94f8fa1bb469bedd653a3097de3cb8094c3
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Thu Sep 11 09:09:23 2008 +0200

    smart: fix progress report bug that was stopping update_system

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index da0d94e..3a18384 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -101,9 +101,11 @@ class PackageKitSmartProgress(Progress):
                         info = loader.getInfo(package)
                         for url in info.getURLs():
                             # account for progress url from current mirror
-                            url = str(self._fetcher.getItem(url).getURL())
-                            if subtopic == url:
-                                self._backend._show_package(package)
+                            item = self._fetcher.getItem(url)
+                            if item:
+                                url = str(item.getURL())
+                                if subtopic == url:
+                                    self._backend._show_package(package)
                 self._lasturl = subtopic
             elif isinstance(subkey, smart.cache.Package):
                 self._backend._show_package(subkey)
commit 918dd9d10ef18725776c6a55fe9cf03ec18db047
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 17:24:24 2008 +0100

    bugfix: use a bitfield when searching for files in the catalog else we might return the wrong results

diff --git a/libpackagekit/pk-catalog.c b/libpackagekit/pk-catalog.c
index 3072ad1..fcd14a2 100644
--- a/libpackagekit/pk-catalog.c
+++ b/libpackagekit/pk-catalog.c
@@ -174,12 +174,18 @@ pk_catalog_process_type (PkCatalog *catalog)
 		/* do the actions */
 		if (mode == PK_CATALOG_PROGRESS_PACKAGES) {
 			packages = pk_package_ids_from_id (package);
-			ret = pk_client_resolve (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, packages, &error);
+			ret = pk_client_resolve (catalog->priv->client,
+						 pk_bitfield_value (PK_FILTER_ENUM_NOT_INSTALLED),
+						 packages, &error);
 			g_strfreev (packages);
 		} else if (mode == PK_CATALOG_PROGRESS_FILES) {
-			ret = pk_client_search_file (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, package, &error);
+			ret = pk_client_search_file (catalog->priv->client,
+						     pk_bitfield_value (PK_FILTER_ENUM_NOT_INSTALLED),
+						     package, &error);
 		} else if (mode == PK_CATALOG_PROGRESS_PROVIDES) {
-			ret = pk_client_what_provides (catalog->priv->client, PK_FILTER_ENUM_NOT_INSTALLED, 0, package, &error);
+			ret = pk_client_what_provides (catalog->priv->client,
+						      pk_bitfield_value (PK_FILTER_ENUM_NOT_INSTALLED),
+						      PK_PROVIDES_ENUM_ANY, package, &error);
 		}
 		if (!ret) {
 			egg_warning ("method failed: %s", error->message);
commit 847ec1b071e53f809e0156cecac5dcd403369cd1
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 17:22:53 2008 +0100

    trivial: indentation fix

diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
index 86ede10..2d59e6c 100644
--- a/libpackagekit/pk-client.h
+++ b/libpackagekit/pk-client.h
@@ -249,7 +249,7 @@ gboolean	 pk_client_get_requires			(PkClient	*client,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_client_what_provides		(PkClient	*client,
-							 PkBitfield filters,
+							 PkBitfield	 filters,
 							 PkProvidesEnum	 provides,
 							 const gchar	*search,
 							 GError		**error)
commit 328e0ed24e160340a9c904e296eb516f547fd0a7
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 16:43:31 2008 +0100

    trivial: remove debugging comment

diff --git a/client/pk-console.c b/client/pk-console.c
index 8a85755..8df03e9 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -545,7 +545,6 @@ pk_console_perhaps_resolve (PkClient *client, PkBitfield filter, const gchar *pa
 
 	/* we need to resolve it */
 	packages = pk_package_ids_from_id (package);
-egg_warning ("%s: %i", packages[0], filter);
 	ret = pk_client_resolve (client_task, filter, packages, error);
 	g_strfreev (packages);
 	if (!ret) {
commit 822c8eb90f65cdf1705c70d579e97b0cf7596af1
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 16:19:22 2008 +0100

    bugfix: turn off -Wformat-security as old gtk-doc generators break the build

diff --git a/configure.ac b/configure.ac
index 8e258c7..2024ef2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -55,7 +55,8 @@ dnl - Extra verbose warning switches
 dnl ---------------------------------------------------------------------------
 if test "$GCC" = "yes"; then
 	CPPFLAGS="$CPPFLAGS -Wcast-align -Wno-uninitialized"
-	CPPFLAGS="$CPPFLAGS -Wall -Wformat-security -Wreturn-type"
+	CPPFLAGS="$CPPFLAGS -Wall -Wreturn-type"
+#	CPPFLAGS="$CPPFLAGS -Wformat-security"
 	CPPFLAGS="$CPPFLAGS -Werror"
 fi
 
commit 25b7cdf0f0c3992de90dac64ca45f96e1dd4c864
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Wed Sep 10 17:02:06 2008 +0200

    smart: better error reporting for install/remove of non-existing package

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index f4b590a..da0d94e 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -141,6 +141,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         packages = []
         for packageid in packageids:
             ratio, results, suggestions = self._search_packageid(packageid)
+            if not results:
+                packagestring = self._string_packageid(packageid)
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % packagestring)
             packages.extend(self._process_search_results(results))
 
         available = []
@@ -193,6 +197,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         packages = []
         for packageid in packageids:
             ratio, results, suggestions = self._search_packageid(packageid)
+            if not results:
+                packagestring = self._string_packageid(packageid)
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % packagestring)
             packages.extend(self._process_search_results(results))
 
         installed = []
@@ -739,10 +747,14 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             pkg = "%s-%s" % (name, version)
         return pkg
 
-    def _search_packageid(self, packageid):
+    def _string_packageid(self, packageid):
         idparts = packageid.split(';')
         # note: currently you can only search in channels native to system
         packagestring = self._joinpackage(idparts[0], idparts[1], idparts[2])
+        return packagestring
+
+    def _search_packageid(self, packageid):
+        packagestring = self._string_packageid(packageid)
         ratio, results, suggestions = self.ctrl.search(packagestring)
 
         return (ratio, results, suggestions)
commit b7ba03a6f2f01bce45a70188d737b23ac4d773bb
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Wed Sep 10 16:32:22 2008 +0200

    smart: only show the best requires/provides, and remove the package itself

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 8863128..f4b590a 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -570,6 +570,16 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             return True
         return False
 
+    def _best_package_from_list(self, package_list):
+        for installed in (True, False):
+            best = None
+            for package in package_list:
+                if not best or package > best:
+                    best = package
+            if best:
+                return best
+        return None
+
     @needs_cache
     def get_depends(self, filters, packageids, recursive_text):
         recursive = self._text_to_boolean(recursive_text)
@@ -584,15 +594,21 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 return
 
             package = packages[0]
+            original = package
 
-            providers = {}
+            extras = {}
             for required in package.requires:
+                providers = {}
                 for provider in required.providedby:
                     for package in provider.packages:
                         if not providers.has_key(package):
                             providers[package] = True
+                package = self._best_package_from_list(providers.keys())
+                if package and not extras.has_key(package):
+                    extras[package] = True
 
-            for package in providers.keys():
+            del extras[original]
+            for package in extras.keys():
                 if self._package_passes_filters(package, filters):
                     self._add_package(package)
             self._post_process_package_list(filters)
@@ -612,15 +628,21 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 return
 
             package = packages[0]
+            original = package
 
-            requirers = {}
+            extras = {}
             for provided in package.provides:
+                requirers = {}
                 for requirer in provided.requiredby:
                     for package in requirer.packages:
                         if not requirers.has_key(package):
                             requirers[package] = True
+                package = self._best_package_from_list(requirers.keys())
+                if package and not extras.has_key(package):
+                    extras[package] = True
 
-            for package in requirers.keys():
+            del extras[original]
+            for package in extras.keys():
                 if self._package_passes_filters(package, filters):
                     self._add_package(package)
             self._post_process_package_list(filters)
commit 0bc4ba936db39ccf0466987d964a016363bceeee
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 15:17:01 2008 +0100

    bugfix: don't convert null sections of a package_id to '(NULL)' instead use an empty string. Add unit tests to catch this as well

diff --git a/libpackagekit/pk-package-id.c b/libpackagekit/pk-package-id.c
index f328225..9d911fb 100644
--- a/libpackagekit/pk-package-id.c
+++ b/libpackagekit/pk-package-id.c
@@ -152,18 +152,14 @@ pk_package_id_new_from_string (const gchar *package_id)
 
 	/* create new object */
 	id = pk_package_id_new ();
-	if (egg_strzero (sections[0]) == FALSE) {
+	if (!egg_strzero (sections[0]))
 		id->name = g_strdup (sections[0]);
-	}
-	if (egg_strzero (sections[1]) == FALSE) {
+	if (!egg_strzero (sections[1]))
 		id->version = g_strdup (sections[1]);
-	}
-	if (egg_strzero (sections[2]) == FALSE) {
+	if (!egg_strzero (sections[2]))
 		id->arch = g_strdup (sections[2]);
-	}
-	if (egg_strzero (sections[3]) == FALSE) {
+	if (!egg_strzero (sections[3]))
 		id->data = g_strdup (sections[3]);
-	}
 	g_strfreev (sections);
 	return id;
 }
@@ -218,9 +214,12 @@ pk_package_id_copy (const PkPackageId *id)
 gchar *
 pk_package_id_to_string (const PkPackageId *id)
 {
-	return g_strdup_printf ("%s;%s;%s;%s",
-				id->name, id->version,
-				id->arch, id->data);
+	g_return_val_if_fail (id != NULL, NULL);
+	g_return_val_if_fail (id->name != NULL, NULL);
+	return g_strdup_printf ("%s;%s;%s;%s", id->name,
+				id->version != NULL ? id->version : "",
+				id->arch != NULL ? id->arch : "",
+				id->data != NULL ? id->data : "");
 }
 
 /**
@@ -237,11 +236,10 @@ pk_package_id_build (const gchar *name, const gchar *version,
 		     const gchar *arch, const gchar *data)
 {
 	g_return_val_if_fail (name != NULL, NULL);
-	g_return_val_if_fail (version != NULL, NULL);
-	g_return_val_if_fail (arch != NULL, NULL);
-	g_return_val_if_fail (data != NULL, NULL);
-
-	return g_strdup_printf ("%s;%s;%s;%s", name, version, arch, data);
+	return g_strdup_printf ("%s;%s;%s;%s", name,
+				version != NULL ? version : "",
+				arch != NULL ? arch : "",
+				data != NULL ? data : "");
 }
 
 /**
@@ -382,7 +380,7 @@ pk_package_id_test (EggTest *test)
 	 ****************          id           ******************
 	 ************************************************************/
 
-	egg_test_title (test, "id build");
+	egg_test_title (test, "id build valid");
 	text = pk_package_id_build ("moo", "0.0.1", "i386", "fedora");
 	if (egg_strequal (text, "moo;0.0.1;i386;fedora"))
 		egg_test_success (test, NULL);
@@ -390,6 +388,14 @@ pk_package_id_test (EggTest *test)
 		egg_test_failed (test, NULL);
 	g_free (text);
 
+	egg_test_title (test, "id build partial");
+	text = pk_package_id_build ("moo", NULL, NULL, NULL);
+	if (egg_strequal (text, "moo;;;"))
+		egg_test_success (test, NULL);
+	else
+		egg_test_failed (test, "got '%s', expected '%s'", text, "moo;;;");
+	g_free (text);
+
 	egg_test_title (test, "pid equal pass (same)");
 	ret = pk_package_id_equal_strings ("moo;0.0.1;i386;fedora", "moo;0.0.1;i386;fedora");
 	if (ret)
@@ -441,6 +447,7 @@ pk_package_id_test (EggTest *test)
 		egg_test_failed (test, "passed an invalid string '%s'", temp);
 	}
 
+
 	/************************************************************/
 	egg_test_title (test, "parse package_id from string");
 	id = pk_package_id_new_from_string ("moo;0.0.1;i386;fedora");
@@ -474,6 +481,18 @@ pk_package_id_test (EggTest *test)
 	pk_package_id_free (id2);
 
 	/************************************************************/
+	egg_test_title (test, "test id building with partial data");
+	id = pk_package_id_new_from_string ("moo;;;");
+	text = pk_package_id_to_string (id);
+	if (egg_strequal (text, "moo;;;"))
+		egg_test_success (test, NULL);
+	else {
+		egg_test_failed (test, "package_id is '%s', should be '%s'", text, "moo;;;");
+	}
+	g_free (text);
+	pk_package_id_free (id);
+
+	/************************************************************/
 	egg_test_title (test, "parse short package_id from string");
 	id = pk_package_id_new_from_string ("moo;0.0.1;;");
 	if (id != NULL &&
commit e58fb40f4c0263a6e6b40061a5c94863322f5930
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 13:06:59 2008 +0100

    trivial: add another screenshot, this time of the signature install

diff --git a/docs/html/img/gpk-signature.png b/docs/html/img/gpk-signature.png
new file mode 100644
index 0000000..1c6c9cc
Binary files /dev/null and b/docs/html/img/gpk-signature.png differ
commit 40582fecbcefe48c6802787b0d7f673e260443e7
Author: Richard Hughes <hughsie at localhost.localdomain>
Date:   Wed Sep 10 10:48:29 2008 +0100

    bugfix: use a proper error enum when we have no more mirrors to try

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 26a2d9c..1af62ac 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -788,7 +788,11 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             self.percentage(100)
 
         except yum.Errors.RepoError,e:
-            self.error(ERROR_REPO_CONFIGURATION_ERROR,str(e))
+                message = self._format_msgs(e.value)
+                if message.find ("No more mirrors to try") != -1:
+                    self.error(ERROR_FILE_NO_MORE_MIRRORS_TO_TRY,message)
+                else:
+                    self.error(ERROR_REPO_CONFIGURATION_ERROR,message)
         except yum.Errors.YumBaseError,e:
             self.error(ERROR_UNKNOWN,"cannot refresh cache: %s" % str(e))
 
commit ad1981ab3d449e4de13c92c55245187d4cade94a
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 10:30:20 2008 +0100

    trivial: add another error enum: PK_ERROR_ENUM_NO_MORE_MIRRORS_TO_TRY

diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index 7389ab2..939361c 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -162,6 +162,7 @@ static PkEnumMatch enum_error[] = {
 	{PK_ERROR_ENUM_PACKAGE_CORRUPT,         "package-corrupt"},
 	{PK_ERROR_ENUM_ALL_PACKAGES_ALREADY_INSTALLED, "all-packages-already-installed"},
 	{PK_ERROR_ENUM_FILE_NOT_FOUND,		"file-not-found"},
+	{PK_ERROR_ENUM_NO_MORE_MIRRORS_TO_TRY,	"no-more-mirrors-to-try"},
 	{0, NULL}
 };
 
diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 158c885..176a322 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -268,6 +268,7 @@ typedef enum {
 	PK_ERROR_ENUM_PACKAGE_CORRUPT,
 	PK_ERROR_ENUM_ALL_PACKAGES_ALREADY_INSTALLED,
 	PK_ERROR_ENUM_FILE_NOT_FOUND,
+	PK_ERROR_ENUM_NO_MORE_MIRRORS_TO_TRY,
 	PK_ERROR_ENUM_UNKNOWN
 } PkErrorCodeEnum;
 
commit 2e7c15849868810c041ebc09e26aa074a535f688
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 10:20:52 2008 +0100

    trivial: tiny fix in the test file for the web plugin

diff --git a/contrib/packagekit-plugin/tests/test.html b/contrib/packagekit-plugin/tests/test.html
index a260d44..922b446 100644
--- a/contrib/packagekit-plugin/tests/test.html
+++ b/contrib/packagekit-plugin/tests/test.html
@@ -21,7 +21,7 @@
     <object type="application/x-packagekit-plugin" width="500" height="200" class="packagekit-plugin">
       <param name="displayname" value="KStars"/>
       <param name="packagenames" value="kdeedu"/>
-      <param name="desktopnames" value="kstars"/> -->
+      <param name="desktopnames" value="kstars"/>
     </object>
     <br/><br/>
     <object type="application/x-packagekit-plugin" width="500" height="200" class="packagekit-plugin">
commit 3d80761af7f764eeb08af7f662c9e054e8d3cbd3
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 10:20:31 2008 +0100

    bugfix: actually print the transactions without using --verbose when using pkmon

diff --git a/client/pk-monitor.c b/client/pk-monitor.c
index 8a4f197..cbf8fac 100644
--- a/client/pk-monitor.c
+++ b/client/pk-monitor.c
@@ -40,7 +40,21 @@
 static void
 pk_monitor_task_list_changed_cb (PkTaskList *tlist, gpointer data)
 {
-	pk_task_list_print (tlist);
+	guint i;
+	PkTaskListItem *item;
+	guint length;
+
+	length = pk_task_list_get_size (tlist);
+	g_print ("Tasks:\n");
+	if (length == 0) {
+		g_print ("[none]\n");
+		return;
+	}
+	for (i=0; i<length; i++) {
+		item = pk_task_list_get_item (tlist, i);
+		g_print ("#%i\t%s\t%s (%s)\t%s\n", i+1, item->tid, pk_role_enum_to_text (item->role),
+			 pk_status_enum_to_text (item->status), item->text);
+	}
 }
 
 /**
commit 0db35a40b4a78b5b284ab338ca2c8ceb0ba0ef58
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Sep 10 09:23:12 2008 +0100

    trivial: add a dummy redirect file as some old documentation was archived on google

diff --git a/docs/html/Makefile.am b/docs/html/Makefile.am
index 47f7312..2047201 100644
--- a/docs/html/Makefile.am
+++ b/docs/html/Makefile.am
@@ -1,20 +1,22 @@
-NULL =
-
 SUBDIRS = img
 
 HTML_FILES =				\
 	index.html			\
-	pk-help.html			\
-	pk-screenshots.html		\
+	pk-authors.html			\
+	pk-bugs.html			\
 	pk-download.html		\
+	pk-faq.html			\
+	pk-help.html			\
 	pk-intro.html			\
-	pk-using.html			\
-	$(NULL)
+	pk-matrix.html			\
+	pk-profiles.html		\
+	pk-reference.html		\
+	pk-screenshots.html		\
+	pk-using.html
 
 EXTRA_DIST = 				\
 	style.css			\
-	$(HTML_FILES)			\
-	$(NULL)
+	$(HTML_FILES)
 
 clean-local:
 	rm -f *~
diff --git a/docs/html/pk-reference.html b/docs/html/pk-reference.html
new file mode 100644
index 0000000..2c4eb10
--- /dev/null
+++ b/docs/html/pk-reference.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>PackageKit - Reference Documentation</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+<link rel="stylesheet" href="style.css" type="text/css" media="screen"/>
+</head>
+<body>
+
+<table align="center" class="title">
+<tr>
+ <td><img src="img/packagekit.png" alt=""/></td>
+ <td width="95%" valign="middle"><p class="title">Reference Documentation</p></td>
+ <td><img src="img/packagekit.png" alt=""/></td>
+</tr>
+</table>
+
+<p>Back to the <a href="index.html">main page</a></p>
+
+<h1>Reference Documentation</h1>
+
+<p>
+You need to see the new mini-site <a href="http://www.packagekit.org/gtk-doc/">
+here</a>. Please update your links!
+</p>
+
+<p>Back to the <a href="index.html">main page</a></p>
+
+<p class="footer">
+ Copyright <a href="mailto:richard at hughsie.com">Richard Hughes 2007-2008</a><br/>
+ <a href="http://validator.w3.org/check/referer">Optimized</a>
+ for <a href="http://www.w3.org/">standards</a>.
+</p>
+
+</body>
+</html>
commit 8ade7ead3a268840c08dabd8305f54bb05e2c7c3
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Sep 9 18:20:13 2008 +0100

    trivial: add a screenshot of the web plugin

diff --git a/docs/html/img/Makefile.am b/docs/html/img/Makefile.am
index a2d4a44..7d60549 100644
--- a/docs/html/img/Makefile.am
+++ b/docs/html/img/Makefile.am
@@ -9,6 +9,7 @@ IMAGE_FILES =					\
 	large-preferences-system.png		\
 	large-system-users.png			\
 	packagekit.png				\
+	pk-web-plugin.png			\
 	pk-update-bugfix.png			\
 	pk-update-enhancement.png		\
 	pk-update-high.png			\
diff --git a/docs/html/img/pk-web-plugin.png b/docs/html/img/pk-web-plugin.png
new file mode 100644
index 0000000..9890126
Binary files /dev/null and b/docs/html/img/pk-web-plugin.png differ
diff --git a/docs/html/pk-screenshots.html b/docs/html/pk-screenshots.html
index d0b15a1..1761c77 100644
--- a/docs/html/pk-screenshots.html
+++ b/docs/html/pk-screenshots.html
@@ -22,6 +22,7 @@
 <li><a href="#gnome">GNOME Screenshots</a></li>
 <li><a href="#kde">KDE Screenshots</a></li>
 <li><a href="#moko">OpenMoko Screenshots</a></li>
+<li><a href="#plugin">Web Plugin Screenshots</a></li>
 </ul>
 
 <h1><a name="gnome">GNOME Screenshots</a></h1>
@@ -120,6 +121,11 @@
 <center><img src="img/assassin.png" alt=""/></center>
 <p class="caption">Assassin</p>
 
+<h1><a name="plugin">Web Plugin Screenshots</a></h1>
+
+<center><img src="img/pk-web-plugin.png" alt=""/></center>
+<p class="caption">Mozilla web plugin</p>
+
 <p>Back to the <a href="index.html">main page</a></p>
 
 <p class="footer">


More information about the PackageKit-commit mailing list