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

Richard Hughes hughsient at kemper.freedesktop.org
Mon Aug 4 10:36:47 PDT 2008


 NEWS                                            |   52 
 RELEASE                                         |    2 
 backends/apt/pk-backend-apt.c                   |    4 
 backends/conary/pk-backend-conary.c             |   17 
 backends/dummy/pk-backend-dummy.c               |   28 
 backends/opkg/pk-backend-opkg.c                 |   23 
 backends/poldek/pk-backend-poldek.c             |  180 -
 backends/urpmi/helpers/urpmi_backend/actions.pm |    3 
 backends/urpmi/pk-backend-urpmi.c               |   12 
 backends/yum/helpers/Makefile.am                |    1 
 backends/yum/helpers/yumBackend.py              |  279 +
 backends/yum/helpers/yumComps.py                |    4 
 backends/yum/helpers/yumFilter.py               |   10 
 backends/zypp/pk-backend-zypp.cpp               |   26 
 backends/zypp/zypp-utils.cpp                    |    6 
 client/.gitignore                               |    2 
 client/Makefile.am                              |   27 
 client/pk-console.c                             |  195 -
 client/pk-generate-pack.c                       |  517 +++
 client/pk-generate-package-list.c               |   94 
 client/pk-tools-common.c                        |   97 
 client/pk-tools-common.h                        |   30 
 configure.ac                                    |    4 
 contrib/PackageKit.spec.in                      |   11 
 data/Makefile.am                                |    5 
 data/packagekit-pack.xml.in                     |    9 
 docs/api/Makefile.am                            |    1 
 docs/api/spec/pk-concepts.xml                   |   16 
 docs/api/spec/pk-transactions-set-locale.png    |binary
 docs/api/spec/pk-transactions.svg               |  198 +
 docs/html/img/large-emblem-favorite.png         |binary
 docs/html/img/profile-bevan.png                 |binary
 docs/html/img/profile-graham.png                |binary
 docs/html/img/profile-suzan.png                 |binary
 docs/html/index.html                            |   14 
 docs/html/pk-download.html                      |    2 
 docs/html/pk-profiles.html                      |  127 
 docs/html/style.css                             |    1 
 libpackagekit/pk-client.c                       |   49 
 libpackagekit/pk-client.h                       |    5 
 libpackagekit/pk-common.c                       |   30 
 libpackagekit/pk-common.h                       |    2 
 libpackagekit/pk-control.c                      |   37 
 libpackagekit/pk-debug.c                        |   32 
 libpackagekit/pk-debug.h                        |    1 
 libpackagekit/pk-package-id.c                   |   10 
 libpackagekit/pk-package-list.c                 |  116 
 libpackagekit/pk-package-list.h                 |    6 
 libpackagekit/pk-package-obj.c                  |   86 
 libpackagekit/pk-package-obj.h                  |    2 
 libpackagekit/pk-task-list.c                    |    8 
 libpackagekit/pk-task-list.h                    |    2 
 po/de.po                                        | 3792 +++++++++++++++++++++---
 po/pl.po                                        |  127 
 po/pt_BR.po                                     |  142 
 policy/org.freedesktop.packagekit.policy.in     |   61 
 python/packagekitwrapper.py                     |  373 ++
 src/pk-backend-dbus.c                           |   30 
 src/pk-backend-spawn.c                          |   17 
 src/pk-backend.c                                |   37 
 src/pk-backend.h                                |    3 
 src/pk-engine.c                                 |    2 
 src/pk-interface-transaction.xml                |   35 
 src/pk-security-polkit.c                        |   38 
 src/pk-spawn.c                                  |    2 
 src/pk-transaction-list.c                       |  299 +
 src/pk-transaction-list.h                       |    4 
 src/pk-transaction.c                            |  292 +
 src/pk-transaction.h                            |    5 
 69 files changed, 6642 insertions(+), 1000 deletions(-)

New commits:
commit 6f5aa6e87a4f7785708a35618b7584594fd740dc
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Aug 4 18:33:20 2008 +0100

    bugfix: yum: don't show internal error backtrace if we try to install a zero byte rpm

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index a40b3b5..05ff633 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -887,9 +887,14 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         # remove files of packages that alrady exist
         for inst_file in inst_files:
-            pkg = YumLocalPackage(ts=self.yumbase.rpmdb.readOnlyTS(), filename=inst_file)
-            if self._is_inst(pkg):
-                inst_files.remove(inst_file)
+            try:
+                pkg = YumLocalPackage(ts=self.yumbase.rpmdb.readOnlyTS(), filename=inst_file)
+                if self._is_inst(pkg):
+                    inst_files.remove(inst_file)
+            except yum.Errors.YumBaseError,e:
+                self.error(ERROR_INVALID_PACKAGE_FILE,'Package could not be decompressed')
+            except:
+                self.error(ERROR_UNKNOWN,"Failed to open local file -- please report")
 
         # If trusted is true, it means that we will only install trusted files
         if trusted == 'yes':
commit d12f68905c4946e42b16427531c2dcb1204ab715
Author: Shishir Goel <crazyontheedge at gmail.com>
Date:   Mon Aug 4 09:50:10 2008 +0100

    fix the FIXMEs in pkgenpack

diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index a127481..d92ab40 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -44,8 +44,6 @@
 
 #include "pk-tools-common.h"
 
-//FIXME: This should be generated using g_get_tmp_dir and random chars
-#define PK_GENPACK_TEMP_DIR "/tmp/pack"
 
 /**
  * pk_generate_pack_perhaps_resolve:
@@ -203,8 +201,6 @@ pk_generate_pack_create (const gchar *tarfilename, GPtrArray *file_array, GError
 	const gchar *src;
 	gchar *dest;
 
-	/* FIXME: do we have to close this? */
-	/* FIXME: check if file exists before we overwrite it */
 	file = g_fopen (tarfilename, "a+");
 	retval = tar_open (&t, (gchar *)tarfilename, NULL, O_WRONLY, 0, TAR_GNU);
 	if (retval != 0) {
@@ -238,7 +234,7 @@ pk_generate_pack_create (const gchar *tarfilename, GPtrArray *file_array, GError
 	}
 	tar_append_eof (t);
 	tar_close (t);
-
+	fclose (file);
 out:
 	return ret;
 }
@@ -249,22 +245,26 @@ out:
 static GPtrArray *
 pk_generate_pack_scan_dir (const gchar *directory)
 {
-	guint i;
-	guint n;
 	gchar *src;
-	GPtrArray *file_array;
-	struct dirent **namelist;
+	GPtrArray *file_array = NULL;
+	GDir *dir;
+	const gchar *filename;
 
-	/* FIXME: this has to be converted to GDir */
-	n = scandir ("/tmp/pack", &namelist, 0, alphasort);
+	/* try and open the directory */
+	dir = g_dir_open (directory, 0, NULL);
+	if (dir == NULL) {
+		pk_warning ("failed to get directory for %s", directory);
+		goto out;
+	}
 
+	/* add each file to an array */
 	file_array = g_ptr_array_new ();
-	/* add each of the files */
-	for (i=2; i<n; i++) {
-		src = g_strjoin (G_DIR_SEPARATOR_S, directory, namelist[i]->d_name, NULL);
+	while ((filename = g_dir_read_name (dir))) {
+		src = g_build_filename (directory, filename, NULL);
 		g_ptr_array_add (file_array, src);
 	}
-	free (namelist);
+	g_dir_close (dir);
+out:
 	return file_array;
 }
 
@@ -359,19 +359,20 @@ pk_generate_pack_main (const gchar *pack_filename, const gchar *directory, const
 
 		/* convert to list of package_ids */
 		package_ids = pk_package_list_to_argv (list);
-
 		ret = pk_generate_pack_download_only (client, package_ids, directory);
 		g_strfreev (package_ids);
-		if (!ret) {
-			pk_warning ("failed to download deps of package: %s", package_id);
-			goto out;
-		}
+	}
+
+	/* failed to get deps */
+	if (!ret) {
+		pk_warning ("failed to download deps of package: %s", package_id);
+		goto out;
 	}
 
 	/* find packages that were downloaded */
 	file_array = pk_generate_pack_scan_dir (directory);
-	if (!ret) {
-		pk_warning ("failed to download packages");
+	if (file_array == NULL) {
+		pk_warning ("failed to scan directory: %s", directory);
 		goto out;
 	}
 
@@ -409,6 +410,9 @@ main (int argc, char *argv[])
 	PkControl *control = NULL;
 	PkRoleEnum roles;
 	const gchar *package_list = NULL;
+	const gchar *tempdir = NULL;
+	gboolean exists;
+	gboolean overwrite;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
@@ -469,18 +473,33 @@ main (int argc, char *argv[])
 		goto out;
 	}
 
+	/* download packages to a temporary directory */
+	tempdir = g_strconcat (g_get_tmp_dir (), "/pack", NULL);
+
+	/* check if file exists before we overwrite it */
+	exists = g_file_test (pack_filename, G_FILE_TEST_EXISTS);
+
+	/*ask user input*/
+	if (exists) {
+		overwrite = pk_console_get_prompt (_("A pack with the same name already exists, do you want to overwrite it?"), FALSE);
+		if (!overwrite) {
+			g_print ("%s\n", _("Cancelled!"));
+			goto out;
+		}
+	}
+
 	/* get rid of temp directory if it already exists */
-	g_rmdir (PK_GENPACK_TEMP_DIR);
+	g_rmdir (tempdir);
 
 	/* make the temporary directory */
-	retval = g_mkdir_with_parents (PK_GENPACK_TEMP_DIR, 0777);
+	retval = g_mkdir_with_parents (tempdir, 0777);
 	if (retval != 0) {
-		g_print ("%s: %s\n", _("Failed to create directory"), PK_GENPACK_TEMP_DIR);
+		g_print ("%s: %s\n", _("Failed to create directory"), tempdir);
 		goto out;
 	}
 
 	/* generate the pack */
-	ret = pk_generate_pack_main (pack_filename, PK_GENPACK_TEMP_DIR, package, package_list, &error);
+	ret = pk_generate_pack_main (pack_filename, tempdir, package, package_list, &error);
 	if (!ret) {
 		g_print ("%s: %s\n", _("Failed to create pack"), error->message);
 		g_error_free (error);
@@ -489,8 +508,7 @@ main (int argc, char *argv[])
 
 out:
 	/* get rid of temp directory */
-	g_rmdir (PK_GENPACK_TEMP_DIR);
-
+	g_rmdir (tempdir);
 	g_free (packname);
 	g_free (with_package_list);
 	g_free (options_help);
commit babf9479e5df3daba4901d3ec7b0d36a92d3e948
Merge: 5e23b3b... 2930a85...
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sat Aug 2 11:07:16 2008 +0100

    Merge branch 'pkwrap' of ../packagekit-anon

commit 2930a858e091a2e0e1456f0b27df8be52367e7e9
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sat Aug 2 10:44:28 2008 +0100

    Fix GetUpdates, remove bogus filter argument from UpdateSystem, add a few more 'tests'. Really needs something better...

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 9d66f2e..7e23dad 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -71,7 +71,8 @@ class PackageKitClient:
         result = []
         package_cb = lambda i, id, summary: result.append({'installed' : (i == 'installed'),
                                                            'id': (str(id)),
-                                                           'summary' :str(summary)}
+                                                           'summary' : str(summary)
+                                                           }
                                                           )
         self._wrapCall(pk_xn, method, {'Package' : package_cb})
         return result
@@ -221,9 +222,11 @@ class PackageKitClient:
         It should only return the newest update for each installed package.
         '''
         xn = self._get_xn()
-        self._wrapPackageCall(xn, lambda : xn.GetUpdates(filter))
+        if (filter == None):
+            filter = 'none'
+        return self._wrapPackageCall(xn, lambda : xn.GetUpdates(filter))
 
-    def UpdateSystem(self, filter=None):
+    def UpdateSystem(self):
         '''
         This method should return a list of packages that are installed and are upgradable.
 
@@ -337,6 +340,9 @@ if __name__ == '__main__':
     print pk.Resolve('installed', 'coreutils')
     print pk.Resolve('installed', 'pmount')
 
+    print '---- GetUpdates() ----'
+    print pk.GetUpdates('none')
+
     print '---- GetDetails() -----'
     print pk.GetDetails(pmount[0]['id'])
 
@@ -351,6 +357,9 @@ if __name__ == '__main__':
         return True
         #return pc < 12
 
+    print '---- UpdateSystem() ----'
+    print pk.UpdateSystem()
+
     print '---- InstallPackages() -----'
     pk.InstallPackages(['pmount;0.9.17-2;i386;Ubuntu', 'quilt;0.46-6;all;Ubuntu'], cb)
 
commit 5e23b3b9831b356e676ee294a772840ea0192d7b
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Aug 1 10:11:37 2008 +0100

    trivial: fix the spec file up

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 2ba81bc..6d27c72 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -150,7 +150,7 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
 %{_datadir}/man/man1/*.1.gz
 %{_datadir}/gtk-doc/html/PackageKit
 %{_datadir}/PolicyKit/policy/*.policy
-%{_datadir}/mime/packages/packagekit-catalog.xml
+%{_datadir}/mime/packages/packagekit-*.xml
 %{_sbindir}/packagekitd
 %{_bindir}/pkmon
 %{_bindir}/pkcon
commit 8917b67618290a5afb5c2327ad0c3d6c2a1e1f14
Author: Shishir Goel <crazyontheedge at gmail.com>
Date:   Fri Aug 1 09:50:02 2008 +0100

    add a mime-type .pack to PackageKit

diff --git a/data/Makefile.am b/data/Makefile.am
index e7919ba..86972f1 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -21,7 +21,10 @@ pmutils_DATA = 95packagekit
 
 @INTLTOOL_XML_RULE@
 mimedir = $(datadir)/mime/packages
-mime_in_files = packagekit-catalog.xml.in
+mime_in_files = 					\
+	packagekit-catalog.xml.in			\
+	packagekit-pack.xml.in				\
+	$(NULL)						
 mime_DATA = $(mime_in_files:.xml.in=.xml)
 
 dbusdir = ${SYSCONFDIR}/dbus-1/system.d
diff --git a/data/packagekit-pack.xml.in b/data/packagekit-pack.xml.in
new file mode 100644
index 0000000..ad15b8a
--- /dev/null
+++ b/data/packagekit-pack.xml.in
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+  <mime-type type="application/x-pack">
+    <_comment>PackageKit Service Pack</_comment>
+    <glob pattern="*.pack"/>
+    <generic-icon name="package-x-generic"/>
+  </mime-type>
+</mime-info>
+
commit 7228a549fcad6ff88afa49b279ec4a1ac3b4a4ae
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 11:02:43 2008 +0100

    yum: add Bohdi ID to the UpdateDetail if avilable, fixes RH#457358

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 61aefaa..a40b3b5 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -1320,6 +1320,17 @@ class PackageKitYumBackend(PackageKitBaseBackend):
                         else:
                             urls['vendor'].append("%s;%s" % (href,title))
 
+            # add link to bohdi if available
+            if notice['update_id']:
+                href = "https://admin.fedoraproject.org/updates/%s" % notice['update_id']
+                title = "%s Update %s" % (notice['release'],notice['update_id'])
+                urls['vendor'].append("%s;%s" % (href,title))
+
+            # other interesting data:
+            # notice['issued'] = '2008-07-30 18:09:08'
+            # notice['updated'] = presume date and time, not used
+            # notice['status'] = 'stable'
+
             # Reboot flag
             if notice.get_metadata().has_key('reboot_suggested') and notice['reboot_suggested']:
                 reboot = 'system'
commit f58714c5c7e55710f8d08c75547b75937e040541
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 10:39:18 2008 +0100

    yum: fix the DownloadPackages call to give useful output

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 2639030..61aefaa 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -370,36 +370,52 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self._show_package_list(package_list)
 
     @handle_repo_error
-    def download_packages(self,directory,packages):
-	'''
-	Implement the {backend}-download-packages functionality
-	'''
-	self._check_init()
-	self.allow_cancel(True)
-	self.percentage(0)
-	self.status(STATUS_DOWNLOAD)
-	for package in packages:
-	   pkg,inst = self._findPackage(package)
-	   n,a,e,v,r = pkg.pkgtup
-	   packs = self.yumbase.pkgSack.searchNevra(n,e,v,r,a)
-	   for download in packs:
-	      	repo = self.yumbase.repos.getRepo(download.repoid)
-	      	remote = download.returnSimple('relativepath')
-	      	local = os.path.basename(remote)
-	       	if not os.path.exists(directory):
-	              	self.error(ERROR_PACKAGE_DOWNLOAD_FAILED,"No destination directory exists")
-            	local = os.path.join(directory,local)
-            	if(os.path.exists(local) and os.path.getsize(local) == int(download.returnSimple('packagesize'))):
-                	self.error(ERROR_PACKAGE_DOWNLOAD_FAILED,"Package already exists")
-                	continue
-	        # Disable cache otherwise things won't download
-	        repo.cache = 0
-	        download.localpath = local #Hack:To set the localpath we want
-	        try:
-	           path = repo.getPackage(download)
-	        except IOError, e:
-	           self.error(ERROR_WRITE_ERROR,"Cannot write to file")
-	           continue
+    def download_packages(self,directory,package_ids):
+        '''
+        Implement the {backend}-download-packages functionality
+        '''
+        self._check_init()
+        self.allow_cancel(True)
+        self.status(STATUS_DOWNLOAD)
+        percentage = 0;
+        bump = 100 / len(package_ids)
+
+        # download each package
+        for package in package_ids:
+            self.percentage(percentage)
+            pkg,inst = self._findPackage(package)
+            n,a,e,v,r = pkg.pkgtup
+            packs = self.yumbase.pkgSack.searchNevra(n,e,v,r,a)
+
+            # if we couldn't map package_id -> pkg
+            if len(packs) == 0:
+                self.message(MESSAGE_WARNING,"Could not find a match for package %s" % package)
+                continue
+
+            # should have only one...
+            for pkg_download in packs:
+                self._show_package(pkg_download,INFO_DOWNLOADING)
+                repo = self.yumbase.repos.getRepo(pkg_download.repoid)
+                remote = pkg_download.returnSimple('relativepath')
+                local = os.path.basename(remote)
+                if not os.path.exists(directory):
+                    self.error(ERROR_PACKAGE_DOWNLOAD_FAILED,"No destination directory exists")
+                local = os.path.join(directory,local)
+                if (os.path.exists(local) and os.path.getsize(local) == int(pkg_download.returnSimple('packagesize'))):
+                    self.error(ERROR_PACKAGE_DOWNLOAD_FAILED,"Package already exists")
+                    continue
+                # Disable cache otherwise things won't download
+                repo.cache = 0
+                pkg_download.localpath = local #Hack:To set the localpath we want
+                try:
+                    path = repo.getPackage(pkg_download)
+                except IOError, e:
+                    self.error(ERROR_WRITE_ERROR,"Cannot write to file")
+                    continue
+            percentage += bump
+
+        # in case we don't sum to 100
+        self.percentage(100)
 
     def _getEVR(self,idver):
         '''
commit 9be9b6149a6ee07b86f00a9521c18e187106f9a2
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 10:19:26 2008 +0100

    trivial: delete old comps data when we refresh else we get multiple entries

diff --git a/backends/yum/helpers/yumComps.py b/backends/yum/helpers/yumComps.py
index a9aa037..c6b2169 100644
--- a/backends/yum/helpers/yumComps.py
+++ b/backends/yum/helpers/yumComps.py
@@ -219,6 +219,9 @@ class yumComps:
         if self.yumbase.comps.compscount == 0:
             return False
 
+	# delete old data else we get multiple entries
+	self.cursor.execute('DELETE FROM groups;')
+
         # store to sqlite
         for category in cats:
             grps = map(lambda x: self.yumbase.comps.return_group(x),
commit 682725b01938fb18386f260f01fd966fae394c85
Author: Shishir Goel <crazyontheedge at gmail.com>
Date:   Thu Jul 31 08:59:00 2008 +0100

    add a --with-package-list option to pkgenpack to make it useful

diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index fab73ac..a127481 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -158,7 +158,7 @@ out:
  * pk_generate_pack_exclude_packages:
  **/
 static gboolean
-pk_generate_pack_exclude_packages (PkPackageList *list)
+pk_generate_pack_exclude_packages (PkPackageList *list, const gchar *package_list)
 {
 	guint i;
 	guint length;
@@ -170,7 +170,7 @@ pk_generate_pack_exclude_packages (PkPackageList *list)
 	list_packages = pk_package_list_new ();
 
 	/* load a list of packages already found on the users system */
-	ret = pk_package_list_add_file (list_packages, "/var/lib/PackageKit/package-list.txt");
+	ret = pk_package_list_add_file (list_packages, package_list);
 	if (!ret)
 		goto out;
 
@@ -272,7 +272,7 @@ pk_generate_pack_scan_dir (const gchar *directory)
  * pk_generate_pack_main:
  **/
 static gboolean
-pk_generate_pack_main (const gchar *pack_filename, const gchar *directory, const gchar *package, GError **error)
+pk_generate_pack_main (const gchar *pack_filename, const gchar *directory, const gchar *package, const gchar *package_list, GError **error)
 {
 
 	gchar *package_id;
@@ -330,7 +330,7 @@ pk_generate_pack_main (const gchar *pack_filename, const gchar *directory, const
 	list = pk_client_get_package_list (client);
 
 	/* remove some deps */
-	ret = pk_generate_pack_exclude_packages (list);
+	ret = pk_generate_pack_exclude_packages (list, package_list);
 	if (!ret) {
 		pk_warning ("failed to exclude packages");
 		goto out;
@@ -398,6 +398,7 @@ main (int argc, char *argv[])
 {
 	GError *error = NULL;
 	gboolean verbose = FALSE;
+	gchar *with_package_list = NULL;
 	GOptionContext *context;
 	gchar *options_help;
 	gboolean ret;
@@ -407,10 +408,13 @@ main (int argc, char *argv[])
 	gchar *packname = NULL;
 	PkControl *control = NULL;
 	PkRoleEnum roles;
+	const gchar *package_list = NULL;
 
 	const GOptionEntry options[] = {
 		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
 			_("Show extra debugging information"), NULL },
+		{ "with-package-list", '\0', 0, G_OPTION_ARG_STRING, &with_package_list,
+			_("Set the path of the file with the list of packages/dependencies to be excluded"), NULL},
 		{ NULL}
 	};
 
@@ -428,6 +432,12 @@ main (int argc, char *argv[])
 	g_option_context_free (context);
 	pk_debug_init (verbose);
 
+	if (with_package_list != NULL) {
+		package_list = with_package_list;
+	} else {
+		package_list = "/var/lib/PackageKit/package-list.txt";
+	}
+
 	if (argc < 2) {
 		g_print ("%s", options_help);
 		return 1;
@@ -470,7 +480,7 @@ main (int argc, char *argv[])
 	}
 
 	/* generate the pack */
-	ret = pk_generate_pack_main (pack_filename, PK_GENPACK_TEMP_DIR, package, &error);
+	ret = pk_generate_pack_main (pack_filename, PK_GENPACK_TEMP_DIR, package, package_list, &error);
 	if (!ret) {
 		g_print ("%s: %s\n", _("Failed to create pack"), error->message);
 		g_error_free (error);
@@ -482,6 +492,7 @@ out:
 	g_rmdir (PK_GENPACK_TEMP_DIR);
 
 	g_free (packname);
+	g_free (with_package_list);
 	g_free (options_help);
 	g_object_unref (control);
 	return 0;
commit e65f2dbf517fbcc138064b29d05f47937b2d72b2
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 08:56:05 2008 +0100

    trivial: make a couple of changes to pkgenpack so that we can compile the rpm

diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index 2e1de52..fab73ac 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -198,13 +198,14 @@ pk_generate_pack_create (const gchar *tarfilename, GPtrArray *file_array, GError
 	gboolean ret = TRUE;
 	guint retval;
 	TAR *t;
+	FILE *file;
 	guint i;
 	const gchar *src;
 	gchar *dest;
 
 	/* FIXME: do we have to close this? */
 	/* FIXME: check if file exists before we overwrite it */
-	g_fopen (tarfilename, "a+");
+	file = g_fopen (tarfilename, "a+");
 	retval = tar_open (&t, (gchar *)tarfilename, NULL, O_WRONLY, 0, TAR_GNU);
 	if (retval != 0) {
 		*error = g_error_new (1, 0, "failed to open tar file: %s", tarfilename);
commit 066e57aaca357a669cdc2786b81c9b6114a1b2b0
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 08:55:38 2008 +0100

    trivial: fix some breakage from ad0b69e0237feb53b70bb6a5213a2e8870b8852a

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index ddc93e3..2639030 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -1175,7 +1175,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             self.error(ERROR_REPO_NOT_AVAILABLE,str(e))
         md = self.updateMetadata
         for pkg in ygl.updates:
-            if pkgfilter._do_extra_filtering(pkg,fltlist):
+            if pkgfilter._do_extra_filtering(pkg):
                 # Get info about package in updates info
                 notice = md.get_notice((pkg.name,pkg.version,pkg.release))
                 if notice:
commit 489e64fcfb640fa4c97ef3c28afa80d9582893ba
Author: Richard Hughes <richard at hughsie.com>
Date:   Thu Jul 31 08:54:49 2008 +0100

    trivial: add pkgenpack to the spec file

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 7c81e8d..2ba81bc 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -154,6 +154,7 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
 %{_sbindir}/packagekitd
 %{_bindir}/pkmon
 %{_bindir}/pkcon
+%{_bindir}/pkgenpack
 %{_bindir}/packagekit-bugreport.sh
 %{_libexecdir}/pk-import-*
 %{_libexecdir}/pk-generate-*
commit a2a179e3a54b4ac61fb0e6744dfed9b0fd8aed35
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 17:01:34 2008 +0100

    bugfix: fix up error reporting in pkcon

diff --git a/client/pk-console.c b/client/pk-console.c
index ced4196..2a45324 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -173,7 +173,7 @@ pk_console_package_cb (PkClient *client, const PkPackageObj *obj, gpointer data)
 		goto out;
 	}
 
-	text = g_strdup_printf ("%s\t%s\t%s", info_pad, package_pad, obj->summary);
+	text = g_strdup_printf ("%s\t%s", info_pad, package);
 	pk_console_start_bar (text);
 	g_free (text);
 
@@ -465,7 +465,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	}
 
 	ret = pk_client_reset (client_task, error);
-	if (ret == FALSE) {
+	if (!ret) {
 		pk_warning ("failed to reset client task");
 		return NULL;
 	}
@@ -474,7 +474,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	packages = pk_package_ids_from_id (package);
 	ret = pk_client_resolve (client_task, filter, packages, error);
 	g_strfreev (packages);
-	if (ret == FALSE) {
+	if (!ret) {
 		pk_warning ("Resolve is not supported in this backend");
 		return NULL;
 	}
@@ -487,15 +487,11 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	/* didn't resolve to anything, try to get a provide */
 	if (length == 0) {
 		ret = pk_client_reset (client_task, error);
-		if (ret == FALSE) {
-			pk_warning ("failed to reset client task");
+		if (!ret)
 			return NULL;
-		}
 		ret = pk_client_what_provides (client_task, filter, PK_PROVIDES_ENUM_ANY, package, error);
-		if (ret == FALSE) {
-			pk_warning ("WhatProvides is not supported in this backend");
+		if (!ret)
 			return NULL;
-		}
 	}
 
 	/* get length of items found again (we might have had success) */
@@ -557,7 +553,7 @@ pk_console_install_stuff (PkClient *client, gchar **packages, GError **error)
 		} else {
 			package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NOT_INSTALLED, packages[i], error);
 			if (package_id == NULL) {
-				g_print ("%s\n", _("Could not find a package with that name to install, or package already installed"));
+				*error = g_error_new (1, 0, "%s: %s", _("Could not find package to install"), packages[i]);
 				ret = FALSE;
 				break;
 			}
@@ -661,7 +657,7 @@ pk_console_remove_packages (PkClient *client, gchar **packages, GError **error)
 	for (i=2; i<length; i++) {
 		package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, packages[i], error);
 		if (package_id == NULL) {
-			g_print ("%s:%s\n", _("Could not find a package to remove"), packages[i]);
+			*error = g_error_new (1, 0, "%s:%s\n", _("Could not find package to remove"), packages[i]);
 			ret = FALSE;
 			break;
 		}
@@ -767,7 +763,7 @@ pk_console_download_packages (PkClient *client, gchar **packages, const gchar *d
 	for (i=2; i<length; i++) {
 			package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, packages[i], error);
 			if (package_id == NULL) {
-				g_print ("%s\n", _("Could not find a package to download"));
+				*error = g_error_new (1, 0, "%s: packages[i]", _("Could not find package to download:"));
 				ret = FALSE;
 				break;
 			}
@@ -818,7 +814,7 @@ pk_console_update_package (PkClient *client, const gchar *package, GError **erro
 
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, package, error);
 	if (package_id == NULL) {
-		g_print ("%s\n", _("Could not find a package with that name to update"));
+		*error = g_error_new (1, 0, "%s: %s", _("Could not find package to update"), package);
 		return FALSE;
 	}
 
@@ -840,7 +836,7 @@ pk_console_get_requires (PkClient *client, PkFilterEnum filters, const gchar *pa
 	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
-		g_print ("%s\n", _("Could not find what packages require this package"));
+		*error = g_error_new (1, 0, "%s %s", _("Could not find what packages require"), package);
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
@@ -861,7 +857,7 @@ pk_console_get_depends (PkClient *client, PkFilterEnum filters, const gchar *pac
 	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
-		g_print ("%s\n", _("Could not get dependencies for this package"));
+		*error = g_error_new (1, 0, "%s %s", _("Could not get dependencies for"), package);
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
@@ -882,7 +878,7 @@ pk_console_get_details (PkClient *client, const gchar *package, GError **error)
 	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
 	if (package_id == NULL) {
-		g_print ("%s\n", _("Could not find details for this package"));
+		*error = g_error_new (1, 0, "%s %s", _("Could not find details for"), package);
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
@@ -901,13 +897,20 @@ pk_console_get_files (PkClient *client, const gchar *package, GError **error)
 	gboolean ret;
 	gchar *package_id;
 	gchar **package_ids;
-	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, error);
+	GError *error_local = NULL;
+
+	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, &error_local);
 	if (package_id == NULL) {
-		g_print (_("Could not find the files for this package"));
+		*error = g_error_new (1, 0, "%s (%s)", _("Could not find the files for this package"), error_local->message);
+		g_error_free (error_local);
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
 	ret = pk_client_get_files (client, package_ids, error);
+	if (!ret) {
+		*error = g_error_new (1, 0, "%s (%s)", _("Could not get the file list"), error_local->message);
+		g_error_free (error_local);
+	}
 	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
@@ -924,7 +927,7 @@ pk_console_get_update_detail (PkClient *client, const gchar *package, GError **e
 	gchar **package_ids;
 	package_id = pk_console_perhaps_resolve (client, PK_FILTER_ENUM_INSTALLED, package, error);
 	if (package_id == NULL) {
-		g_print ("%s\n", "Could not find the update details for this package");
+		*error = g_error_new (1, 0, "%s %s", _("Could not find the update details for"), package);
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
@@ -1407,69 +1410,69 @@ main (int argc, char *argv[])
 	/* parse the big list */
 	if (strcmp (mode, "search") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a search type"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a search type, e.g. name"));
 			goto out;
 
 		} else if (strcmp (value, "name") == 0) {
 			if (details == NULL) {
-				g_print (_("You need to specify a search term"));
+				error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 				goto out;
 			}
 			ret = pk_client_search_name (client, filters, details, &error);
 
 		} else if (strcmp (value, "details") == 0) {
 			if (details == NULL) {
-				g_print (_("You need to specify a search term"));
+				error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 				goto out;
 			}
 			ret = pk_client_search_details (client, filters, details, &error);
 
 		} else if (strcmp (value, "group") == 0) {
 			if (details == NULL) {
-				g_print (_("You need to specify a search term"));
+				error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 				goto out;
 			}
 			ret = pk_client_search_group (client, filters, details, &error);
 
 		} else if (strcmp (value, "file") == 0) {
 			if (details == NULL) {
-				g_print (_("You need to specify a search term"));
+				error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 				goto out;
 			}
 			ret = pk_client_search_file (client, filters, details, &error);
 		} else {
-			g_print (_("Invalid search type"));
+			error = g_error_new (1, 0, "%s", _("Invalid search type"));
 		}
 
 	} else if (strcmp (mode, "install") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a package or file to install"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a package or file to install"));
 			goto out;
 		}
 		ret = pk_console_install_stuff (client, argv, &error);
 
 	} else if (strcmp (mode, "install-sig") == 0) {
 		if (value == NULL || details == NULL || parameter == NULL) {
-			g_print (_("You need to specify a type, key_id and package_id"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a type, key_id and package_id"));
 			goto out;
 		}
 		ret = pk_client_install_signature (client, PK_SIGTYPE_ENUM_GPG, details, parameter, &error);
 
 	} else if (strcmp (mode, "remove") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a package to remove"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a package to remove"));
 			goto out;
 		}
 		ret = pk_console_remove_packages (client, argv, &error);
 	} else if (strcmp (mode, "download") == 0) {
 		if (value == NULL || directory == NULL) {
-			g_print (_("You need to specify the package to download and the destination directory"));
+			error = g_error_new (1, 0, "%s", _("You need to specify the package to download and the destination directory"));
 			goto out;
 		}
 		ret = pk_console_download_packages (client, argv, directory, &error);
 	} else if (strcmp (mode, "accept-eula") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a eula-id"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a eula-id"));
 			goto out;
 		}
 		ret = pk_client_accept_eula (client, value, &error);
@@ -1485,7 +1488,7 @@ main (int argc, char *argv[])
 
 	} else if (strcmp (mode, "resolve") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a package name to resolve"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a package name to resolve"));
 			goto out;
 		}
 		package_ids = pk_package_ids_from_id (value);
@@ -1494,21 +1497,21 @@ main (int argc, char *argv[])
 
 	} else if (strcmp (mode, "repo-enable") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a repo name"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a repo name"));
 			goto out;
 		}
 		ret = pk_client_repo_enable (client, value, TRUE, &error);
 
 	} else if (strcmp (mode, "repo-disable") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a repo name"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a repo name"));
 			goto out;
 		}
 		ret = pk_client_repo_enable (client, value, FALSE, &error);
 
 	} else if (strcmp (mode, "repo-set-data") == 0) {
 		if (value == NULL || details == NULL || parameter == NULL) {
-			g_print (_("You need to specify a repo name/parameter and value"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a repo name/parameter and value"));
 			goto out;
 		}
 		ret = pk_client_repo_set_data (client, value, details, parameter, &error);
@@ -1521,17 +1524,17 @@ main (int argc, char *argv[])
 		guint time;
 		gboolean ret;
 		if (value == NULL) {
-			g_print (_("You need to specify a time term"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a time term"));
 			goto out;
 		}
 		role = pk_role_enum_from_text (value);
 		if (role == PK_ROLE_ENUM_UNKNOWN) {
-			g_print (_("You need to specify a correct role"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a correct role"));
 			goto out;
 		}
 		ret = pk_control_get_time_since_action (control, role, &time, &error);
-		if (ret == FALSE) {
-			g_print (_("Failed to get last time"));
+		if (!ret) {
+			error = g_error_new (1, 0, "%s", _("Failed to get last time"));
 			goto out;
 		}
 		g_print ("time since %s is %is\n", value, time);
@@ -1539,42 +1542,42 @@ main (int argc, char *argv[])
 
 	} else if (strcmp (mode, "get-depends") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a search term"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 			goto out;
 		}
 		ret = pk_console_get_depends (client, filters, value, &error);
 
 	} else if (strcmp (mode, "get-update-detail") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a search term"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 			goto out;
 		}
 		ret = pk_console_get_update_detail (client, value, &error);
 
 	} else if (strcmp (mode, "get-requires") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a search term"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 			goto out;
 		}
 		ret = pk_console_get_requires (client, filters, value, &error);
 
 	} else if (strcmp (mode, "what-provides") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a search term"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a search term"));
 			goto out;
 		}
 		ret = pk_client_what_provides (client, filters, PK_PROVIDES_ENUM_CODEC, value, &error);
 
 	} else if (strcmp (mode, "get-details") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a package to find the details for"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a package to find the details for"));
 			goto out;
 		}
 		ret = pk_console_get_details (client, value, &error);
 
 	} else if (strcmp (mode, "get-files") == 0) {
 		if (value == NULL) {
-			g_print (_("You need to specify a package to find the files for"));
+			error = g_error_new (1, 0, "%s", _("You need to specify a package to find the files for"));
 			goto out;
 		}
 		ret = pk_console_get_files (client, value, &error);
@@ -1623,8 +1626,7 @@ main (int argc, char *argv[])
 		ret = pk_client_refresh_cache (client, FALSE, &error);
 
 	} else {
-		g_print (_("Option '%s' not supported"), mode);
-		g_print ("\n");
+		error = g_error_new (1, 0, _("Option '%s' not supported"), mode);
 	}
 
 	/* do we wait for the method? */
@@ -1633,14 +1635,13 @@ main (int argc, char *argv[])
 	}
 
 out:
-	if (ret == FALSE) {
-		g_print ("\n%s\n", _("Command failed"));
-	}
-	if (error != NULL) {
-		if (g_str_has_prefix (error->message, "org.freedesktop.packagekit."))  {
+	if (!ret) {
+		if (error == NULL) {
+			g_print ("Command failed in an unknown way. Please report!\n");
+		} else if (g_str_has_prefix (error->message, "org.freedesktop.packagekit."))  {
 			g_print ("%s\n", _("You don't have the necessary privileges for this operation"));
 		} else {
-			g_print ("Error:\n  %s\n\n", error->message);
+			g_print ("%s:  %s\n", _("Command failed"), error->message);
 			g_error_free (error);
 		}
 	}
commit 99d0af602a7a7938391b89d16019f510718d0d68
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 17:00:11 2008 +0100

    bugfix: WhatProvides has a freeform search string that we don't check, also, check for wildcards before length to pick up a single star

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 753db36..e0fd353 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1011,24 +1011,24 @@ pk_transaction_search_check (const gchar *search, GError **error)
 				     "Search string zero length");
 		return FALSE;
 	}
-	if (size < 2) {
+	if (strstr (search, "*") != NULL) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_SEARCH_INVALID,
-				     "The search string length is too small");
+				     "Invalid search containing '*'");
 		return FALSE;
 	}
-	if (size == 1024) {
+	if (strstr (search, "?") != NULL) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_SEARCH_INVALID,
-				     "The search string length is too large");
+				     "Invalid search containing '?'");
 		return FALSE;
 	}
-	if (strstr (search, "*") != NULL) {
+	if (size < 2) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_SEARCH_INVALID,
-				     "Invalid search containing '*'");
+				     "The search string length is too small");
 		return FALSE;
 	}
-	if (strstr (search, "?") != NULL) {
+	if (size == 1024) {
 		*error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_SEARCH_INVALID,
-				     "Invalid search containing '?'");
+				     "The search string length is too large");
 		return FALSE;
 	}
 	ret = pk_strvalidate (search);
@@ -3087,6 +3087,13 @@ pk_transaction_what_provides (PkTransaction *transaction, const gchar *filter, c
 		return;
 	}
 
+	/* check the search term */
+	ret = pk_transaction_search_check (search, &error);
+	if (!ret) {
+		dbus_g_method_return_error (context, error);
+		return;
+	}
+
 	/* check the filter */
 	ret = pk_transaction_filter_check (filter, &error);
 	if (!ret) {
commit 2dd1652bc60054347a3a1d9d64960b40a59b5a37
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 16:17:39 2008 +0100

    trivial: remove a over zealous debugging statement

diff --git a/client/pk-console.c b/client/pk-console.c
index a913cb1..ced4196 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -502,7 +502,7 @@ pk_console_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *
 	list = pk_client_get_package_list (client_task);
 	length = pk_package_list_get_size (list);
 	if (length == 0) {
-		pk_warning (_("Could not find a package match"));
+		pk_debug ("Could not find a package match");
 		return NULL;
 	}
 
commit 5dc0eac3aa43098bf861268f0e2808b8df3d129a
Author: Shishir Goel <crazyontheedge at gmail.com>
Date:   Wed Jul 30 15:26:13 2008 +0100

    yum: add the pack decompressing code

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 8c4db83..ddc93e3 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -45,6 +45,10 @@ import signal
 import time
 import os.path
 
+import tarfile
+import tempfile
+import shutil
+
 from yumDirect import *
 from yumFilter import *
 from yumComps import *
@@ -825,7 +829,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             if newest.EVR > po.EVR:
                 self.message(MESSAGE_WARNING,"A newer version of %s is available online." % po.name)
 
-    def install_files (self,trusted,inst_files):
+    def install_files(self,trusted,inst_files):
         '''
         Implement the {backend}-install-files functionality
         Install the package containing the inst_file file
@@ -835,16 +839,41 @@ class PackageKitYumBackend(PackageKitBaseBackend):
             if inst_file.endswith('.src.rpm'):
                 self.error(ERROR_CANNOT_INSTALL_SOURCE_PACKAGE,'Backend will not install a src rpm file')
                 return
-        for inst_file in inst_files:
-            if not inst_file.endswith('.rpm'):
-                self.error(ERROR_INVALID_PACKAGE_FILE,'Only rpm packages are supported')
-                return
+
         self._check_init()
         self.allow_cancel(False);
         self.percentage(0)
         self.status(STATUS_RUNNING)
 
-        pkgs_to_inst = []
+        # process these first
+        inst_packs = []
+
+        for inst_file in inst_files:
+            if inst_file.endswith('.rpm'):
+                continue
+            elif inst_file.endswith('.pack'):
+                inst_packs.append(inst_file)
+                inst_files.remove(inst_file)
+            else:
+                self.error(ERROR_INVALID_PACKAGE_FILE,'Only rpm files and packs are supported')
+                return
+
+        # decompress and add the contents of any .pack files
+        for inst_pack in inst_packs:
+            pack = tarfile.TarFile(name = inst_pack,mode = "r")
+            members = pack.getnames()
+            tempdir = tempfile.mkdtemp()
+            for mem in members:
+                pack.extract(mem,path = tempdir)
+            files = os.listdir(tempdir)
+            for file in files:
+                inst_files.append(os.path.join(tempdir, file))
+
+        # remove files of packages that alrady exist
+        for inst_file in inst_files:
+            pkg = YumLocalPackage(ts=self.yumbase.rpmdb.readOnlyTS(), filename=inst_file)
+            if self._is_inst(pkg):
+                inst_files.remove(inst_file)
 
         # If trusted is true, it means that we will only install trusted files
         if trusted == 'yes':
commit 678fca31c29e8ee9f05a62ee8f4cd6d58dccbc6b
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 14:59:01 2008 +0100

    add a trivial fixme to pkgenpack

diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
index 849e072..2e1de52 100644
--- a/client/pk-generate-pack.c
+++ b/client/pk-generate-pack.c
@@ -44,6 +44,7 @@
 
 #include "pk-tools-common.h"
 
+//FIXME: This should be generated using g_get_tmp_dir and random chars
 #define PK_GENPACK_TEMP_DIR "/tmp/pack"
 
 /**
commit 5c9de15548f0c7fca98eafd4c2f72dd13275406f
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 14:14:35 2008 +0100

    bugfix: properly match local files correctly so we don't try to resolve them

diff --git a/client/pk-console.c b/client/pk-console.c
index 03f5807..a913cb1 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -551,7 +551,7 @@ pk_console_install_stuff (PkClient *client, gchar **packages, GError **error)
 	length = g_strv_length (packages);
 	for (i=2; i<length; i++) {
 		/* are we a local file */
-		is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS & G_FILE_TEST_IS_REGULAR);
+		is_local = g_file_test (packages[i], G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR);
 		if (is_local) {
 			g_ptr_array_add (array_files, g_strdup (packages[i]));
 		} else {
commit 021a43d21164d75d3df259b45b3358d3d469ceb2
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 14:06:51 2008 +0100

    add pkgenpack, a way of packaging up a package and it's deps for installation somewhere else
    
    Original author was Shishir Goel <crazyontheedge at gmail.com>, but tidied up a lot by me

diff --git a/client/Makefile.am b/client/Makefile.am
index e3f3551..8d893e1 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -29,6 +29,7 @@ PK_LIBS =						\
 bin_PROGRAMS =						\
 	pkcon						\
 	pkmon						\
+	pkgenpack					\
 	$(NULL)
 
 libexec_PROGRAMS =					\
@@ -61,6 +62,20 @@ pkmon_LDADD =						\
 	$(SELFTEST_LIBS)				\
 	$(NULL)
 
+pkgenpack_SOURCES =					\
+	pk-generate-pack.c				\
+	pk-tools-common.c				\
+	pk-tools-common.h				\
+	$(NULL)
+
+pkgenpack_LDADD = 					\
+	$(TAR_LIBS)					\
+	$(GLIB_LIBS)					\
+	$(DBUS_LIBS)					\
+	$(PK_LIBS)					\
+	$(SELFTEST_LIBS)				\
+	$(NULL)
+
 pk_generate_package_list_SOURCES =			\
 	pk-generate-package-list.c			\
 	$(NULL)
diff --git a/client/pk-generate-pack.c b/client/pk-generate-pack.c
new file mode 100644
index 0000000..849e072
--- /dev/null
+++ b/client/pk-generate-pack.c
@@ -0,0 +1,486 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ * Copyright (C) 2008 Shishir Goel <crazyontheedge at gmail.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+#include <dbus/dbus-glib.h>
+
+#include <pk-debug.h>
+#include <pk-package-ids.h>
+#include <pk-client.h>
+#include <pk-control.h>
+#include <pk-package-id.h>
+#include <pk-common.h>
+#include <libtar.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <dirent.h>
+
+#include "pk-tools-common.h"
+
+#define PK_GENPACK_TEMP_DIR "/tmp/pack"
+
+/**
+ * pk_generate_pack_perhaps_resolve:
+ **/
+static gchar *
+pk_generate_pack_perhaps_resolve (PkClient *client, PkFilterEnum filter, const gchar *package, GError **error)
+{
+	gboolean ret;
+	gboolean valid;
+	guint i;
+	guint length;
+	const PkPackageObj *obj;
+	PkPackageList *list;
+	gchar **packages;
+
+	/* have we passed a complete package_id? */
+	valid = pk_package_id_check (package);
+	if (valid) {
+		return g_strdup (package);
+	}
+
+	ret = pk_client_reset (client, error);
+	if (ret == FALSE) {
+		pk_warning ("failed to reset client task");
+		return NULL;
+	}
+
+	/* we need to resolve it */
+	packages = pk_package_ids_from_id (package);
+	ret = pk_client_resolve (client, filter, packages, error);
+	g_strfreev (packages);
+	if (ret == FALSE) {
+		pk_warning ("Resolve failed");
+		return NULL;
+	}
+
+	/* get length of items found */
+	list = pk_client_get_package_list (client);
+	length = pk_package_list_get_size (list);
+	g_object_unref (list);
+
+	/* didn't resolve to anything, try to get a provide */
+	if (length == 0) {
+		ret = pk_client_reset (client, error);
+		if (ret == FALSE) {
+			pk_warning ("failed to reset client task");
+			return NULL;
+		}
+		ret = pk_client_what_provides (client, filter, PK_PROVIDES_ENUM_ANY, package, error);
+		if (ret == FALSE) {
+			pk_warning ("WhatProvides is not supported in this backend");
+			return NULL;
+		}
+	}
+
+	/* get length of items found again (we might have had success) */
+	list = pk_client_get_package_list (client);
+	length = pk_package_list_get_size (list);
+	if (length == 0) {
+		pk_warning (_("Could not find a package match"));
+		return NULL;
+	}
+
+	/* only found one, great! */
+	if (length == 1) {
+		obj = pk_package_list_get_obj (list, 0);
+		return pk_package_id_to_string (obj->id);
+	}
+	g_print ("%s\n", _("There are multiple package matches"));
+	for (i=0; i<length; i++) {
+		obj = pk_package_list_get_obj (list, i);
+		g_print ("%i. %s-%s.%s\n", i+1, obj->id->name, obj->id->version, obj->id->arch);
+	}
+
+	/* find out what package the user wants to use */
+	i = pk_console_get_number (_("Please enter the package number: "), length);
+	obj = pk_package_list_get_obj (list, i-1);
+	g_object_unref (list);
+
+	return pk_package_id_to_string (obj->id);
+}
+
+/**
+ * pk_generate_pack_download_only:
+ **/
+static gboolean
+pk_generate_pack_download_only (PkClient *client, gchar **package_ids, const gchar *directory)
+{
+	gboolean ret;
+	GError *error = NULL;
+
+	pk_debug ("download+ %s %s", package_ids[0], directory);
+	ret = pk_client_reset (client, &error);
+	if (!ret) {
+		pk_warning ("failed to download: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+	ret = pk_client_download_packages (client, package_ids, directory, &error);
+	if (!ret) {
+		pk_warning ("failed to download: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+out:
+	return ret;
+}
+
+/**
+ * pk_generate_pack_exclude_packages:
+ **/
+static gboolean
+pk_generate_pack_exclude_packages (PkPackageList *list)
+{
+	guint i;
+	guint length;
+	gboolean found;
+	PkPackageList *list_packages;
+	const PkPackageObj *obj;
+	gboolean ret;
+
+	list_packages = pk_package_list_new ();
+
+	/* load a list of packages already found on the users system */
+	ret = pk_package_list_add_file (list_packages, "/var/lib/PackageKit/package-list.txt");
+	if (!ret)
+		goto out;
+
+	/* do not just download everything, uselessly */
+	length = pk_package_list_get_size (list_packages);
+	for (i=0; i<length; i++) {
+		obj = pk_package_list_get_obj (list_packages, i);
+		/* will just ignore if the obj is not there */
+		found = pk_package_list_remove_obj (list, obj);
+		if (found)
+			pk_debug ("removed %s", obj->id->name);
+	}
+
+out:
+	g_object_unref (list_packages);
+	return ret;
+}
+
+/**
+ * pk_generate_pack_create:
+ **/
+static gboolean
+pk_generate_pack_create (const gchar *tarfilename, GPtrArray *file_array, GError **error)
+{
+	gboolean ret = TRUE;
+	guint retval;
+	TAR *t;
+	guint i;
+	const gchar *src;
+	gchar *dest;
+
+	/* FIXME: do we have to close this? */
+	/* FIXME: check if file exists before we overwrite it */
+	g_fopen (tarfilename, "a+");
+	retval = tar_open (&t, (gchar *)tarfilename, NULL, O_WRONLY, 0, TAR_GNU);
+	if (retval != 0) {
+		*error = g_error_new (1, 0, "failed to open tar file: %s", tarfilename);
+		ret = FALSE;
+		goto out;
+	}
+
+	/* add each of the files */
+	for (i=0; i<file_array->len; i++) {
+		src = (const gchar *) g_ptr_array_index (file_array, i);
+		dest =  g_path_get_basename (src);
+
+		/* add file to archive */
+		pk_debug ("adding %s", src);
+		retval = tar_append_file (t, (gchar *)src, dest);
+		if (retval != 0) {
+			*error = g_error_new (1, 0, "failed to copy %s into %s", src, dest);
+			ret = FALSE;
+		}
+
+		/* delete file */
+		g_remove (src);
+
+		/* free the stripped filename */
+		g_free (dest);
+
+		/* abort */
+		if (!ret)
+			break;
+	}
+	tar_append_eof (t);
+	tar_close (t);
+
+out:
+	return ret;
+}
+
+/**
+ * pk_generate_pack_scan_dir:
+ **/
+static GPtrArray *
+pk_generate_pack_scan_dir (const gchar *directory)
+{
+	guint i;
+	guint n;
+	gchar *src;
+	GPtrArray *file_array;
+	struct dirent **namelist;
+
+	/* FIXME: this has to be converted to GDir */
+	n = scandir ("/tmp/pack", &namelist, 0, alphasort);
+
+	file_array = g_ptr_array_new ();
+	/* add each of the files */
+	for (i=2; i<n; i++) {
+		src = g_strjoin (G_DIR_SEPARATOR_S, directory, namelist[i]->d_name, NULL);
+		g_ptr_array_add (file_array, src);
+	}
+	free (namelist);
+	return file_array;
+}
+
+/**
+ * pk_generate_pack_main:
+ **/
+static gboolean
+pk_generate_pack_main (const gchar *pack_filename, const gchar *directory, const gchar *package, GError **error)
+{
+
+	gchar *package_id;
+	gchar **package_ids;
+	PkPackageList *list = NULL;
+	guint length;
+	gboolean download;
+	guint i;
+	const PkPackageObj *obj;
+	GPtrArray *file_array = NULL;
+	PkClient *client;
+	GError *error_local;
+	gboolean ret;
+	gchar *text;
+
+	client = pk_client_new ();
+	pk_client_set_use_buffer (client, TRUE, NULL);
+	pk_client_set_synchronous (client, TRUE, NULL);
+
+	/* resolve package */
+	package_id = pk_generate_pack_perhaps_resolve (client, PK_FILTER_ENUM_NONE, package, &error_local);
+	if (package_id == NULL) {
+		pk_warning ("failed to resolve: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* download this package */
+	package_ids = pk_package_ids_from_id (package_id);
+	ret = pk_generate_pack_download_only (client, package_ids, directory);
+	if (!ret) {
+		pk_warning ("failed to download main package: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	/* get depends */
+	ret = pk_client_reset (client, &error_local);
+	if (!ret) {
+		pk_warning ("failed to reset: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+	pk_debug ("Getting depends for %s", package_id);
+	ret = pk_client_get_depends (client, PK_FILTER_ENUM_NONE, package_ids, TRUE, &error_local);
+	if (!ret) {
+		pk_warning ("failed to get depends: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+	g_strfreev (package_ids);
+
+	/* get the deps */
+	list = pk_client_get_package_list (client);
+
+	/* remove some deps */
+	ret = pk_generate_pack_exclude_packages (list);
+	if (!ret) {
+		pk_warning ("failed to exclude packages");
+		goto out;
+	}
+
+	/* list deps */
+	length = pk_package_list_get_size (list);
+	for (i=0; i<length; i++) {
+		obj = pk_package_list_get_obj (list, i);
+		text = pk_package_obj_to_string (obj);
+		g_print ("%s\n", text);
+		g_free (text);
+	}
+
+	/* confirm we want the deps */
+	if (length != 0) {
+		/* get user input */
+		download = pk_console_get_prompt (_("Okay to download the additional packages"), TRUE);
+
+		/* we chickened out */
+		if (download == FALSE) {
+			g_print ("%s\n", _("Cancelled!"));
+			ret = FALSE;
+			goto out;
+		}
+
+		/* convert to list of package_ids */
+		package_ids = pk_package_list_to_argv (list);
+
+		ret = pk_generate_pack_download_only (client, package_ids, directory);
+		g_strfreev (package_ids);
+		if (!ret) {
+			pk_warning ("failed to download deps of package: %s", package_id);
+			goto out;
+		}
+	}
+
+	/* find packages that were downloaded */
+	file_array = pk_generate_pack_scan_dir (directory);
+	if (!ret) {
+		pk_warning ("failed to download packages");
+		goto out;
+	}
+
+	/* generate pack file */
+	ret = pk_generate_pack_create (pack_filename, file_array, &error_local);
+	if (!ret) {
+		pk_warning ("failed to create archive: %s", error_local->message);
+		g_error_free (error_local);
+		goto out;
+	}
+
+out:
+	g_object_unref (client);
+	if (list != NULL)
+		g_object_unref (list);
+	g_free (package_id);
+	if (file_array != NULL)
+		g_ptr_array_free (file_array, TRUE);
+	return ret;
+}
+
+int
+main (int argc, char *argv[])
+{
+	GError *error = NULL;
+	gboolean verbose = FALSE;
+	GOptionContext *context;
+	gchar *options_help;
+	gboolean ret;
+	guint retval;
+	const gchar *package = NULL;
+	gchar *pack_filename = NULL;
+	gchar *packname = NULL;
+	PkControl *control = NULL;
+	PkRoleEnum roles;
+
+	const GOptionEntry options[] = {
+		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+			_("Show extra debugging information"), NULL },
+		{ NULL}
+	};
+
+	if (! g_thread_supported ()) {
+		g_thread_init (NULL);
+	}
+	dbus_g_thread_init ();
+	g_type_init ();
+
+	context = g_option_context_new ("PackageKit Pack Generator");
+	g_option_context_add_main_entries (context, options, NULL);
+	g_option_context_parse (context, &argc, &argv, NULL);
+	/* Save the usage string in case command parsing fails. */
+	options_help = g_option_context_get_help (context, TRUE, NULL);
+	g_option_context_free (context);
+	pk_debug_init (verbose);
+
+	if (argc < 2) {
+		g_print ("%s", options_help);
+		return 1;
+	}
+
+	/* are we dumb and can't check for depends? */
+	control = pk_control_new ();
+	roles = pk_control_get_actions (control);
+	if (!pk_enums_contain (roles, PK_ROLE_ENUM_GET_DEPENDS)) {
+		g_print ("Please use a backend that supports GetDepends!\n");
+		goto out;
+	}
+
+	/* get the arguments */
+	pack_filename = argv[1];
+	if (argc > 2) {
+		package = argv[2];
+	}
+
+	/* have we specified the right things */
+	if (pack_filename == NULL || package == NULL) {
+		g_print (_("You need to specify the pack name and packages to be packed\n"));
+		goto out;
+	}
+
+	/* check the suffix */
+	if (!g_str_has_suffix (pack_filename,".pack")) {
+		g_print(_("Invalid name for the service pack, Specify a name with .pack extension\n"));
+		goto out;
+	}
+
+	/* get rid of temp directory if it already exists */
+	g_rmdir (PK_GENPACK_TEMP_DIR);
+
+	/* make the temporary directory */
+	retval = g_mkdir_with_parents (PK_GENPACK_TEMP_DIR, 0777);
+	if (retval != 0) {
+		g_print ("%s: %s\n", _("Failed to create directory"), PK_GENPACK_TEMP_DIR);
+		goto out;
+	}
+
+	/* generate the pack */
+	ret = pk_generate_pack_main (pack_filename, PK_GENPACK_TEMP_DIR, package, &error);
+	if (!ret) {
+		g_print ("%s: %s\n", _("Failed to create pack"), error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+out:
+	/* get rid of temp directory */
+	g_rmdir (PK_GENPACK_TEMP_DIR);
+
+	g_free (packname);
+	g_free (options_help);
+	g_object_unref (control);
+	return 0;
+}
commit 2f535651a35d23bb5d48c839e967302e01a5c7a8
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 13:56:01 2008 +0100

    add the new convenience method pk_package_list_remove_obj()

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index e50ce79..c2ea904 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -366,6 +366,34 @@ pk_package_list_remove (PkPackageList *plist, const gchar *package_id)
 		if (ret) {
 			pk_package_obj_free (obj);
 			g_ptr_array_remove_index (plist->priv->array, i);
+			ret = TRUE;
+			break;
+		}
+	}
+	return ret;
+}
+
+/**
+ * pk_package_list_remove_obj:
+ **/
+gboolean
+pk_package_list_remove_obj (PkPackageList *plist, const PkPackageObj *obj)
+{
+	PkPackageObj *obj_temp;
+	guint i;
+	guint length;
+	gboolean ret = FALSE;
+
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
+	g_return_val_if_fail (obj != NULL, FALSE);
+
+	length = plist->priv->array->len;
+	for (i=0; i<length; i++) {
+		obj_temp = g_ptr_array_index (plist->priv->array, i);
+		if (pk_package_obj_equal (obj_temp, obj)) {
+			pk_package_obj_free (obj_temp);
+			g_ptr_array_remove_index (plist->priv->array, i);
+			ret = TRUE;
 			break;
 		}
 	}
commit 15c6bfdd50933ee3faa9d49594fef1a96d682890
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 13:55:46 2008 +0100

    add the new convenience method pk_package_list_remove_obj()

diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
index 3ab8687..22198a8 100644
--- a/libpackagekit/pk-package-list.h
+++ b/libpackagekit/pk-package-list.h
@@ -65,6 +65,8 @@ gboolean		 pk_package_list_contains	(PkPackageList		*plist,
 							 const gchar		*package_id);
 gboolean		 pk_package_list_remove		(PkPackageList		*plist,
 							 const gchar		*package_id);
+gboolean		 pk_package_list_remove_obj	(PkPackageList		*plist,
+							 const PkPackageObj	*obj);
 gboolean		 pk_package_list_contains_obj	(PkPackageList		*plist,
 							 const PkPackageObj	*obj);
 gchar			*pk_package_list_to_string	(PkPackageList		*plist)
commit 786dc22b4534aa2e461cf8ed2538866531ce0226
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 12:35:16 2008 +0100

    trivial: abstract out some common functions for pkgenpack to use

diff --git a/client/.gitignore b/client/.gitignore
index d44757e..662278f 100644
--- a/client/.gitignore
+++ b/client/.gitignore
@@ -5,6 +5,7 @@ pk-marshal.h
 pk-marshal.c
 pkcon
 pkmon
+pkgenpack
 pk-update-icon
 pk-application
 pk-import-desktop
diff --git a/client/Makefile.am b/client/Makefile.am
index 29b11b2..e3f3551 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -39,6 +39,8 @@ libexec_PROGRAMS =					\
 
 pkcon_SOURCES =						\
 	pk-console.c					\
+	pk-tools-common.c				\
+	pk-tools-common.h				\
 	$(NULL)
 
 pkcon_LDADD =						\
diff --git a/client/pk-console.c b/client/pk-console.c
index 0527d1a..03f5807 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -40,6 +40,8 @@
 #include <pk-connection.h>
 #include <pk-update-detail-obj.h>
 
+#include "pk-tools-common.h"
+
 #define PROGRESS_BAR_SIZE 15
 
 static GMainLoop *loop = NULL;
@@ -443,31 +445,6 @@ pk_console_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpoint
 }
 
 /**
- * pk_console_get_number:
- **/
-static guint
-pk_console_get_number (const gchar *question, guint maxnum)
-{
-	gint answer = 0;
-	gint retval;
-
-	/* pretty print */
-	g_print ("%s", question);
-
-	do {
-		/* get a number */
-		retval = scanf("%u", &answer);
-
-		/* positive */
-		if (retval == 1 && answer > 0 && answer <= maxnum) {
-			break;
-		}
-		g_print (_("Please enter a number from 1 to %i: "), maxnum);
-	} while (TRUE);
-	return answer;
-}
-
-/**
  * pk_console_perhaps_resolve:
  **/
 static gchar *
@@ -662,48 +639,6 @@ pk_console_remove_only (PkClient *client, gchar **package_ids, gboolean force, G
 }
 
 /**
- * pk_console_get_prompt:
- **/
-static gboolean
-pk_console_get_prompt (const gchar *question, gboolean defaultyes)
-{
-	gchar answer = '\0';
-
-	/* pretty print */
-	g_print ("%s", question);
-	if (defaultyes) {
-		g_print (" [Y/n] ");
-	} else {
-		g_print (" [N/y] ");
-	}
-
-	do {
-		/* ITS4: ignore, we are copying into the same variable, not a string */
-		answer = (gchar) getchar();
-
-		/* positive */
-		if (answer == 'y' || answer == 'Y') {
-			return TRUE;
-		}
-		/* negative */
-		if (answer == 'n' || answer == 'N') {
-			return FALSE;
-		}
-
-		/* default choice */
-		if (answer == '\n' && defaultyes) {
-			return TRUE;
-		}
-		if (answer == '\n' && defaultyes == FALSE) {
-			return FALSE;
-		}
-	} while (TRUE);
-
-	/* keep GCC happy */
-	return FALSE;
-}
-
-/**
  * pk_console_remove_packages:
  **/
 static gboolean
diff --git a/client/pk-tools-common.c b/client/pk-tools-common.c
new file mode 100644
index 0000000..7ac4cd1
--- /dev/null
+++ b/client/pk-tools-common.c
@@ -0,0 +1,97 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+#include <glib.h>
+#include <stdio.h>
+#include <glib/gi18n.h>
+
+#include <pk-debug.h>
+#include <pk-common.h>
+#include "pk-tools-common.h"
+
+/**
+ * pk_console_get_number:
+ **/
+guint
+pk_console_get_number (const gchar *question, guint maxnum)
+{
+	gint answer = 0;
+	gint retval;
+
+	/* pretty print */
+	g_print ("%s", question);
+
+	do {
+		/* get a number */
+		retval = scanf("%u", &answer);
+
+		/* positive */
+		if (retval == 1 && answer > 0 && answer <= maxnum) {
+			break;
+		}
+		g_print (_("Please enter a number from 1 to %i: "), maxnum);
+	} while (TRUE);
+	return answer;
+}
+
+/**
+ * pk_console_get_prompt:
+ **/
+gboolean
+pk_console_get_prompt (const gchar *question, gboolean defaultyes)
+{
+	gchar answer = '\0';
+
+	/* pretty print */
+	g_print ("%s", question);
+	if (defaultyes) {
+		g_print (" [Y/n] ");
+	} else {
+		g_print (" [N/y] ");
+	}
+
+	do {
+		/* ITS4: ignore, we are copying into the same variable, not a string */
+		answer = (gchar) getchar();
+
+		/* positive */
+		if (answer == 'y' || answer == 'Y') {
+			return TRUE;
+		}
+		/* negative */
+		if (answer == 'n' || answer == 'N') {
+			return FALSE;
+		}
+
+		/* default choice */
+		if (answer == '\n' && defaultyes) {
+			return TRUE;
+		}
+		if (answer == '\n' && defaultyes == FALSE) {
+			return FALSE;
+		}
+	} while (TRUE);
+
+	/* keep GCC happy */
+	return FALSE;
+}
+
diff --git a/client/pk-tools-common.h b/client/pk-tools-common.h
new file mode 100644
index 0000000..2941398
--- /dev/null
+++ b/client/pk-tools-common.h
@@ -0,0 +1,30 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PK_TOOLS_COMMON_H
+#define __PK_TOOLS_COMMON_H
+
+guint		 pk_console_get_number			(const gchar	*question,
+							 guint		 maxnum);
+gboolean	 pk_console_get_prompt			(const gchar	*question,
+							 gboolean	 defaultyes);
+
+#endif /* __PK_TOOLS_COMMON_H */
commit 4b2d31a30f18e2de8f14b7fdfb041b12050fd041
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 12:25:44 2008 +0100

    trivial: add a missing file to the dist_DATA

diff --git a/backends/yum/helpers/Makefile.am b/backends/yum/helpers/Makefile.am
index 0d5cb31..4172e30 100644
--- a/backends/yum/helpers/Makefile.am
+++ b/backends/yum/helpers/Makefile.am
@@ -26,6 +26,7 @@ dist_helper_DATA = 			\
 	refresh-cache.py		\
 	what-provides.py		\
 	update-system.py		\
+	download-packages.py		\
 	yumBackend.py			\
 	yumDirect.py			\
 	yumComps.py			\
commit 2becb4576c455c0bfc1e32d3e726433ca0f92458
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 11:44:51 2008 +0100

    add a libtar build requirement for the new pkgenpack executable

diff --git a/configure.ac b/configure.ac
index e184e53..32148b2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -103,6 +103,10 @@ PKG_CHECK_MODULES(DBUS, \
 AC_SUBST(DBUS_CFLAGS)
 AC_SUBST(DBUS_LIBS)
 
+AC_CHECK_HEADERS([libtar.h])
+TAR_LIBS=-ltar
+AC_SUBST(TAR_LIBS)
+
 dnl ---------------------------------------------------------------------------
 dnl - xsltproc
 dnl ---------------------------------------------------------------------------
commit d31fd37a15f5d44ffe533ba13675fc7631f8b68d
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 11:44:10 2008 +0100

    update download page with new stable release

diff --git a/docs/html/pk-download.html b/docs/html/pk-download.html
index cd9bf8f..db94c1f 100644
--- a/docs/html/pk-download.html
+++ b/docs/html/pk-download.html
@@ -64,6 +64,7 @@ Released versions are found on
 <tr><td>0.2.1</td><td></td><td>2008-05-09</td></tr>
 <tr><td>0.2.2</td><td></td><td>2008-06-05</td></tr>
 <tr><td>0.2.3</td><td></td><td>2008-07-04</td></tr>
+<tr><td>0.2.4</td><td></td><td>2008-07-30</td></tr>
 </table>
 
 <h2>Dependencies</h2>
commit ee515a528b41567b16506ac7d285fb96fb3785b9
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:46:15 2008 +0100

    trivial diff noise for the yum backend

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index b66a8eb..8c4db83 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -293,9 +293,9 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.yumbase.doConfigSetup(errorlevel=0,debuglevel=0)# Setup Yum Config
         self.yumbase.conf.cache = 1 # Only look in cache.
 
+        package_list = [] #we can't do emitting as found if we are post-processing
         fltlist = filters.split(';')
         pkgfilter = YumFilter(fltlist)
-        package_list = [] #we can't do emitting as found if we are post-processing
 
         # Now show installed packages.
         pkgs = self.yumbase.rpmdb
@@ -330,6 +330,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         # Check available for file
         if not FILTER_INSTALLED in fltlist:
+            # Check available for file
             self.yumbase.repos.populateSack(mdtype='filelists')
             pkgs = self.yumbase.pkgSack.searchFiles(key)
             pkgfilter.add_available(pkgs)
commit 73a138a2e8a000fabbe55d1731ec65736a361226
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:21:29 2008 +0100

    zypp: trivial build fixes (bodged to the first entry)

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index e4182f1..2c02aa3 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -127,8 +127,8 @@ backend_get_requires_thread (PkBackend *backend)
 	PkPackageId *pi;
 	gchar **package_ids;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_package_id_free (pi);
@@ -302,8 +302,8 @@ backend_get_depends_thread (PkBackend *backend)
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	pk_backend_set_percentage (backend, 0);
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	PkPackageId *pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	PkPackageId *pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_backend_finished (backend);
@@ -462,8 +462,8 @@ backend_get_details_thread (PkBackend *backend)
 	gchar **package_ids;
 	PkPackageId *pi;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_package_id_free (pi);
@@ -805,8 +805,8 @@ backend_get_update_detail_thread (PkBackend *backend)
 	PkPackageId *pi;
 	gchar **package_ids;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_package_id_free (pi);
@@ -1161,7 +1161,8 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
 static gboolean
 backend_resolve_thread (PkBackend *backend)
 {
-	gchar **package_ids = pk_backend_get_string (backend, "package_id");
+	gchar **package_ids = pk_backend_get_string (backend, "package_ids");
+	const gchar *package = package_ids[0];
 
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 
@@ -1409,8 +1410,8 @@ backend_get_files_thread (PkBackend *backend)
 	PkPackageId *pi;
 	gchar **package_ids;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL) {
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
 		pk_package_id_free (pi);
commit c22a9aa4e0ab689ac4dad5437ef5f1cf31710492
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:17:49 2008 +0100

    urpmi: trivial build fixes (bodged to the first entry)

diff --git a/backends/urpmi/pk-backend-urpmi.c b/backends/urpmi/pk-backend-urpmi.c
index 4261fa4..0436b52 100644
--- a/backends/urpmi/pk-backend-urpmi.c
+++ b/backends/urpmi/pk-backend-urpmi.c
@@ -127,7 +127,7 @@ backend_search_name (PkBackend *backend, PkFilterEnum filters, const gchar *sear
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-details.pl", package_id, NULL);
+	pk_backend_spawn_helper (spawn, "get-details.pl", package_ids[0], NULL);
 }
 
 /**
@@ -136,7 +136,7 @@ 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_id, NULL);
+	pk_backend_spawn_helper (spawn, "get-files.pl", package_ids[0], NULL);
 }
 
 /**
@@ -147,7 +147,7 @@ backend_get_depends (PkBackend *backend, PkFilterEnum filters, gchar **package_i
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-depends.pl", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-depends.pl", filters_text, package_ids[0], pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
 }
 
@@ -169,7 +169,7 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
 static void
 backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_id, NULL);
+	pk_backend_spawn_helper (spawn, "get-update-detail.pl", package_ids[0], NULL);
 }
 
 /**
@@ -255,7 +255,7 @@ backend_get_requires (PkBackend *backend, PkFilterEnum filters, gchar **package_
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "get-requires.pl", filters_text, package_id, pk_backend_bool_to_text (recursive), NULL);
+	pk_backend_spawn_helper (spawn, "get-requires.pl", filters_text, package_ids[0], pk_backend_bool_to_text (recursive), NULL);
 	g_free (filters_text);
 }
 
@@ -291,7 +291,7 @@ backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "resolve.pl", filters_text, package_id, NULL);
+	pk_backend_spawn_helper (spawn, "resolve.pl", filters_text, package_ids[0], NULL);
 	g_free (filters_text);
 }
 
commit 55dd74e4bd665f612563220b30321670d7509c40
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:15:38 2008 +0100

    opkg: trivial build fixes

diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
index 106b42b..8f43829 100644
--- a/backends/opkg/pk-backend-opkg.c
+++ b/backends/opkg/pk-backend-opkg.c
@@ -559,7 +559,7 @@ backend_update_package_thread (PkBackend *backend)
 {
 	PkPackageId *pi;
 	gint err = 0;
-	gchar **package_ids;
+	const gchar *package_id;
 
 	package_id = pk_backend_get_string (backend, "pkgid");
 	pi = pk_package_id_new_from_string (package_id);
@@ -665,8 +665,8 @@ backend_get_details_thread (PkBackend *backend)
 	opkg_package_t *pkg;
 	gchar *newid;
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pi = pk_package_id_new_from_string (package_id);
+	package_ids = pk_backend_get_string (backend, "package_ids");
+	pi = pk_package_id_new_from_string (package_ids[0]);
 	if (pi == NULL)
 	{
 		pk_backend_error_code (backend, PK_ERROR_ENUM_PACKAGE_ID_INVALID, "invalid package id");
commit 14cec618052c320da3e785349fa9201655001a77
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:10:48 2008 +0100

    conary: trivial build fixes

diff --git a/backends/conary/pk-backend-conary.c b/backends/conary/pk-backend-conary.c
index b130813..9dc1aa2 100644
--- a/backends/conary/pk-backend-conary.c
+++ b/backends/conary/pk-backend-conary.c
@@ -106,7 +106,10 @@ backend_cancel (PkBackend *backend)
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-details.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-details.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
@@ -115,7 +118,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.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-files.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
@@ -136,7 +142,10 @@ backend_get_updates (PkBackend *backend, PkFilterEnum filters)
 static void
 backend_get_update_detail (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_id, NULL);
+	gchar *package_ids_temp;
+	package_ids_temp = pk_package_ids_to_text (package_ids, "|");
+	pk_backend_spawn_helper (spawn, "get-update-detail.py", package_ids_temp, NULL);
+	g_free (package_ids_temp);
 }
 
 /**
@@ -256,7 +265,7 @@ backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	gchar *filters_text;
 	filters_text = pk_filter_enums_to_text (filters);
-	pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_id, NULL);
+	pk_backend_spawn_helper (spawn, "resolve.py", filters_text, package_ids[0], NULL);
 	g_free (filters_text);
 }
 
commit 92b49658faecb74ac201874f6b8f03d87e299202
Merge: f77819b... 1ef43f7...
Author: Richard Hughes <richard at hughsie.com>
Date:   Wed Jul 30 09:02:07 2008 +0100

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

commit 1ef43f70cbc3812d45424dc55772e3ae83c03d08
Author: I-Fan, Chen <tick at openmoko.com>
Date:   Tue Jul 29 22:18:15 2008 +0800

    opkg: fix some memory leak issue.

diff --git a/backends/opkg/pk-backend-opkg.c b/backends/opkg/pk-backend-opkg.c
index cf6cb3c..106b42b 100644
--- a/backends/opkg/pk-backend-opkg.c
+++ b/backends/opkg/pk-backend-opkg.c
@@ -308,20 +308,23 @@ pk_opkg_package_list_cb (opkg_t *opkg, opkg_package_t *pkg, void *data)
 	/* check filters */
 
 	if ((filters & PK_FILTER_ENUM_DEVELOPMENT) && !opkg_is_devel_pkg (pkg))
-		return;
+		goto end_handle;
 	if ((filters & PK_FILTER_ENUM_NOT_DEVELOPMENT) && opkg_is_devel_pkg (pkg))
-		return;
+		goto end_handle;
 	if ((filters & PK_FILTER_ENUM_GUI) && !opkg_is_gui_pkg (pkg))
-		return;
+		goto end_handle;
 	if ((filters & PK_FILTER_ENUM_NOT_GUI) && opkg_is_gui_pkg (pkg))
-		return;
+		goto end_handle;
 	if ((filters & PK_FILTER_ENUM_INSTALLED) && (!pkg->installed))
-		return;
+		goto end_handle;
 	if ((filters & PK_FILTER_ENUM_NOT_INSTALLED) && (pkg->installed))
-		return;
+		goto end_handle;
 
 	pk_backend_package (params->backend, status, uid, pkg->description);
 
+end_handle:
+	g_free(uid);
+
 }
 
 static gboolean
@@ -614,6 +617,7 @@ pk_opkg_list_upgradable_cb (opkg_t *opkg, opkg_package_t *pkg, void *data)
 		pkg->name, pkg->version, pkg->architecture);
 
 	pk_backend_package (backend, status, uid, pkg->description);
+	g_free(uid);
 }
 
 static gboolean
@@ -694,6 +698,7 @@ backend_get_details_thread (PkBackend *backend)
 
 	pk_backend_details (backend, newid, NULL, group, pkg->description, pkg->url, pkg->size);
 	g_free (newid);
+	opkg_package_free(pkg);
 	pk_backend_finished (backend);
 	return TRUE;
 }
commit f77819b2090fe8d30cb710237d6a32884a1fea82
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 15:10:27 2008 +0100

    yum: add trivial comment about pkgSack.searchNames()

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 69b8259..b66a8eb 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -262,6 +262,10 @@ 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)
commit d26732b8cd3cd2ad0b05eafd737a00dca9c750b9
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 13:11:35 2008 +0100

    trivial: bring back the summary printing to pkcon ::Package()

diff --git a/client/pk-console.c b/client/pk-console.c
index 7c23c72..0527d1a 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -127,6 +127,7 @@ pk_console_package_cb (PkClient *client, const PkPackageObj *obj, gpointer data)
 {
 	PkRoleEnum role;
 	gchar *package = NULL;
+	gchar *package_pad = NULL;
 	gchar *info_pad = NULL;
 	gchar *text = NULL;
 
@@ -145,6 +146,7 @@ pk_console_package_cb (PkClient *client, const PkPackageObj *obj, gpointer data)
 	} else {
 		package = g_strdup_printf ("%s-%s", obj->id->name, obj->id->version);
 	}
+	package_pad = pk_strpad (package, 40);
 
 	/* mark previous complete */
 	if (has_output_bar) {
@@ -165,17 +167,18 @@ pk_console_package_cb (PkClient *client, const PkPackageObj *obj, gpointer data)
 	    role == PK_ROLE_ENUM_GET_REQUIRES ||
 	    role == PK_ROLE_ENUM_GET_UPDATES) {
 		/* don't do the bar */
-		g_print ("%s %s\n", info_pad, package);
+		g_print ("%s\t%s\t%s\n", info_pad, package_pad, obj->summary);
 		goto out;
 	}
 
-	text = g_strdup_printf ("%s %s", info_pad, package);
+	text = g_strdup_printf ("%s\t%s\t%s", info_pad, package_pad, obj->summary);
 	pk_console_start_bar (text);
 	g_free (text);
 
 out:
 	/* free all the data */
 	g_free (package);
+	g_free (package_pad);
 	g_free (info_pad);
 }
 
commit 5bb6bb0dc91a44d692f47a3d81ee7b4ec78fd3a2
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 11:15:31 2008 +0100

    yum: fix the GetDepends call to match on installed pacages before available packages

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index ffa6faa..69b8259 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -450,7 +450,21 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         else:
             return reqlist
 
-    def get_requires(self,filters,package_ids,recursive):
+    def _text_to_boolean(self,text):
+        '''
+        Parses true and false
+        '''
+        if text == 'true':
+            return True
+        if text == 'TRUE':
+            return True
+        if text == 'yes':
+            return True
+        if text == 'YES':
+            return True
+        return False
+
+    def get_requires(self,filters,package_ids,recursive_text):
         '''
         Print a list of requires for a given package
         '''
@@ -463,6 +477,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         bump = 100 / len(package_ids)
         deps_list = []
         resolve_list = []
+        recursive = self._text_to_boolean(recursive_text)
 
         for package in package_ids:
             self.percentage(percentage)
@@ -557,32 +572,73 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         return False
 
-    def _get_best_dependencies(self,po):
-        ''' find the most recent packages that provides the dependencies for a package
-        @param po: yum package object to find deps for
-        @return: a list for yum package object providing the dependencies
+    def _get_best_pkg_from_list(self,pkglist):
         '''
-        results = self.yumbase.findDeps([po])
-        pkg = results.keys()[0]
-        bestdeps=[]
-        if len(results[pkg].keys()) == 0: # No dependencies for this package ?
-            return bestdeps
-        for req in results[pkg].keys():
-            reqlist = results[pkg][req]
-            if not reqlist: #  Unsatisfied dependency
-                self.error(ERROR_DEP_RESOLUTION_FAILED,"the (%s) requirement could not be resolved" % prco_tuple_to_string(req),exit=False)
-                continue
-            best = None
-            for po in reqlist:
+        Gets best dep package from a list
+        '''
+        best = None
+
+        # first try and find the highest EVR package that is already installed
+        for pkgi in pkglist:
+            n,a,e,v,r = pkgi.pkgtup
+            pkgs = self.yumbase.rpmdb.searchNevra(name=n,epoch=e,ver=v,arch=a)
+            for pkg in pkgs:
                 if best:
-                    if po.EVR > best.EVR:
-                        best=po
+                    if pkg.EVR > best.EVR:
+                        best=pkg
                 else:
-                    best= po
-            bestdeps.append(best)
-        return unique(bestdeps)
+                    best=pkg
+
+        # then give up and see if there's one available
+        if not best:
+            for pkg in pkglist:
+                if best:
+                    if pkg.EVR > best.EVR:
+                        best=pkg
+                else:
+                    best=pkg
+        return best
+
+    def _get_best_depends(self,pkgs,recursive):
+        ''' Gets the best deps for a package
+        @param pkgs: a list of package objects
+        @param recursive: if we recurse
+        @return: a list for yum package object providing the dependencies
+        '''
+        deps_list = []
 
-    def get_depends(self,filters,package_ids,recursive):
+        # get the dep list
+        results = self.yumbase.findDeps(pkgs)
+        require_list = []
+        recursive_list = []
+
+        # get the list of deps for each package
+        for pkg in results.keys():
+            for req in results[pkg].keys():
+                reqlist = results[pkg][req]
+                if not reqlist: #  Unsatisfied dependency
+                    self.error(ERROR_DEP_RESOLUTION_FAILED,"the (%s) requirement could not be resolved" % prco_tuple_to_string(req),exit=False)
+                    break
+                require_list.append(reqlist)
+
+        # for each list, find the best backage using a metric
+        for reqlist in require_list:
+            pkg = self._get_best_pkg_from_list(reqlist)
+            if pkg not in pkgs:
+                deps_list.append(pkg)
+                if recursive and not self._is_inst(pkg):
+                    recursive_list.append(pkg)
+
+        # if the package is to be downloaded, also find its deps
+        if len(recursive_list) > 0:
+            pkgsdeps = self._get_best_depends(recursive_list,True)
+            for pkg in pkgsdeps:
+                if pkg not in pkgs:
+                    deps_list.append(pkg)
+
+        return deps_list
+
+    def get_depends(self,filters,package_ids,recursive_text):
         '''
         Print a list of depends for a given package
         '''
@@ -592,43 +648,42 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_INFO)
 
         fltlist = filters.split(';')
+        pkgfilter = YumFilter(fltlist)
+        recursive = self._text_to_boolean(recursive_text)
 
         percentage = 0;
         bump = 100 / len(package_ids)
         deps_list = []
         resolve_list = []
 
+        # resolve each package_id to a pkg object
         for package in package_ids:
             self.percentage(percentage)
             name = package.split(';')[0]
             pkg,inst = self._findPackage(package)
-            results = {}
             if pkg:
                 resolve_list.append(pkg)
-                deps = self._get_best_dependencies(pkg)
-                # if not present, add
-                for pkg in deps:
-                    if pkg not in deps_list:
-                        deps_list.append(pkg)
             else:
                 self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
                 break
             percentage += bump
 
-        # remove any of the original names
-        for pkg in resolve_list:
-            if pkg in deps_list:
-                deps_list.remove(pkg)
+        # get the best deps
+        deps_list = self._get_best_depends(resolve_list,recursive)
 
-        # each unique name, emit
-        for pkg in deps_list:
-            id = self._pkg_to_id(pkg)
+        # make unique list
+        deps_list = unique(deps_list)
 
-            if self._is_inst_arch(pkg) and FILTER_NOT_INSTALLED not in fltlist:
-                self.package(id,INFO_INSTALLED,pkg.summary)
+        # add to correct lists
+        for pkg in deps_list:
+            if self._is_inst(pkg):
+                pkgfilter.add_installed([pkg])
             else:
-                if self._installable(pkg) and FILTER_INSTALLED not in fltlist:
-                    self.package(id,INFO_AVAILABLE,pkg.summary)
+                pkgfilter.add_available([pkg])
+
+        # we couldn't do this when generating the list
+        package_list = pkgfilter.post_process()
+        self._show_package_list(package_list)
         self.percentage(100)
 
     def update_system(self):
commit ad0b69e0237feb53b70bb6a5213a2e8870b8852a
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 11:10:48 2008 +0100

    trivial yum filter optimisation

diff --git a/backends/yum/helpers/yumFilter.py b/backends/yum/helpers/yumFilter.py
index bab67d1..1aae192 100644
--- a/backends/yum/helpers/yumFilter.py
+++ b/backends/yum/helpers/yumFilter.py
@@ -40,7 +40,7 @@ class YumFilter(object):
     def add_installed(self,pkgs):
         ''' add a list of packages that are already installed '''
         for pkg in pkgs:
-            if self._do_extra_filtering(pkg,self.fltlist):
+            if self._do_extra_filtering(pkg):
                 self.package_list.append((pkg,INFO_INSTALLED))
             self.installed_nevra.append(self._get_nevra(pkg))
 
@@ -49,14 +49,14 @@ class YumFilter(object):
         for pkg in pkgs:
             nevra = self._get_nevra(pkg)
             if nevra not in self.installed_nevra:
-                if self._do_extra_filtering(pkg,self.fltlist):
+                if self._do_extra_filtering(pkg):
                     self.package_list.append((pkg,INFO_AVAILABLE))
 
     def add_custom(self,pkg,info):
         ''' add a custom packages indervidually '''
         nevra = self._get_nevra(pkg)
         if nevra not in self.installed_nevra:
-            if self._do_extra_filtering(pkg,self.fltlist):
+            if self._do_extra_filtering(pkg):
                 self.package_list.append((pkg,info))
 
     def post_process(self):
@@ -138,9 +138,9 @@ class YumFilter(object):
             newest[key] = (pkg,state)
         return newest.values()
 
-    def _do_extra_filtering(self,pkg,filterList):
+    def _do_extra_filtering(self,pkg):
         ''' do extra filtering (gui,devel etc) '''
-        for filter in filterList:
+        for filter in self.fltlist:
             if filter in (FILTER_INSTALLED,FILTER_NOT_INSTALLED):
                 if not self._do_installed_filtering(filter,pkg):
                     return False
commit 3b4ed1b597257b77b59425122a72e682009536b6
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 07:56:03 2008 +0100

    trivial: is we are getting the Role for Resolve, check we have a PackageID first

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 40dec69..753db36 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -261,19 +261,32 @@ pk_transaction_get_text (PkTransaction *transaction)
 {
 	PkPackageId *id;
 	gchar *text = NULL;
+	const gchar *data;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), NULL);
 	g_return_val_if_fail (transaction->priv->tid != NULL, NULL);
 
 	if (transaction->priv->cached_package_id != NULL) {
-		id = pk_package_id_new_from_string (transaction->priv->cached_package_id);
-		text = g_strdup (id->name);
-		pk_package_id_free (id);
+		data = transaction->priv->cached_package_id;
+		/* is a package id? */
+		if (pk_package_id_check (data)) {
+			id = pk_package_id_new_from_string (data);
+			text = g_strdup (id->name);
+			pk_package_id_free (id);
+		} else {
+			text = g_strdup (data);
+		}
 	} else if (transaction->priv->cached_package_ids != NULL) {
-		/* FIXME: join all with ';' */
-		id = pk_package_id_new_from_string (transaction->priv->cached_package_ids[0]);
-		text = g_strdup (id->name);
-		pk_package_id_free (id);
+		data = transaction->priv->cached_package_ids[0];
+		/* is a package id? */
+		if (pk_package_id_check (data)) {
+			/* FIXME: join all with ';' */
+			id = pk_package_id_new_from_string (data);
+			text = g_strdup (id->name);
+			pk_package_id_free (id);
+		} else {
+			text = g_strdup (data);
+		}
 	} else if (transaction->priv->cached_search != NULL) {
 		text = g_strdup (transaction->priv->cached_search);
 	}
commit cb4dc3ea140fb9f3289225f3fb6a49dcd7fb3b4f
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 07:55:34 2008 +0100

    trivial: use the filters in pkcon for GetDepends and GetRequires

diff --git a/client/pk-console.c b/client/pk-console.c
index 23b70ae..7c23c72 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -895,7 +895,7 @@ pk_console_update_package (PkClient *client, const gchar *package, GError **erro
  * pk_console_get_requires:
  **/
 static gboolean
-pk_console_get_requires (PkClient *client, const gchar *package, GError **error)
+pk_console_get_requires (PkClient *client, PkFilterEnum filters, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
@@ -906,7 +906,7 @@ pk_console_get_requires (PkClient *client, const gchar *package, GError **error)
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
-	ret = pk_client_get_requires (client, PK_FILTER_ENUM_NONE, package_ids, TRUE, error);
+	ret = pk_client_get_requires (client, filters, package_ids, TRUE, error);
 	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
@@ -916,7 +916,7 @@ pk_console_get_requires (PkClient *client, const gchar *package, GError **error)
  * pk_console_get_depends:
  **/
 static gboolean
-pk_console_get_depends (PkClient *client, const gchar *package, GError **error)
+pk_console_get_depends (PkClient *client, PkFilterEnum filters, const gchar *package, GError **error)
 {
 	gboolean ret;
 	gchar *package_id;
@@ -927,7 +927,7 @@ pk_console_get_depends (PkClient *client, const gchar *package, GError **error)
 		return FALSE;
 	}
 	package_ids = pk_package_ids_from_id (package_id);
-	ret = pk_client_get_depends (client, PK_FILTER_ENUM_NONE, package_ids, FALSE, error);
+	ret = pk_client_get_depends (client, filters, package_ids, FALSE, error);
 	g_strfreev (package_ids);
 	g_free (package_id);
 	return ret;
@@ -1604,7 +1604,7 @@ main (int argc, char *argv[])
 			g_print (_("You need to specify a search term"));
 			goto out;
 		}
-		ret = pk_console_get_depends (client, value, &error);
+		ret = pk_console_get_depends (client, filters, value, &error);
 
 	} else if (strcmp (mode, "get-update-detail") == 0) {
 		if (value == NULL) {
@@ -1618,7 +1618,7 @@ main (int argc, char *argv[])
 			g_print (_("You need to specify a search term"));
 			goto out;
 		}
-		ret = pk_console_get_requires (client, value, &error);
+		ret = pk_console_get_requires (client, filters, value, &error);
 
 	} else if (strcmp (mode, "what-provides") == 0) {
 		if (value == NULL) {
commit 6635e4539b9d532aac70269a7cb40312b1032d6a
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 07:51:00 2008 +0100

    trivial: remove some over zealous debgging

diff --git a/libpackagekit/pk-common.c b/libpackagekit/pk-common.c
index c7f8b6a..5abd04a 100644
--- a/libpackagekit/pk-common.c
+++ b/libpackagekit/pk-common.c
@@ -432,20 +432,17 @@ pk_strsplit (const gchar *id, guint parts)
 	gchar **sections = NULL;
 
 	if (id == NULL) {
-		pk_warning ("ident is null!");
 		goto out;
 	}
 
 	/* split by delimeter ';' */
 	sections = g_strsplit (id, ";", 0);
 	if (g_strv_length (sections) != parts) {
-		pk_warning ("ident '%s' is invalid (sections=%d)", id, g_strv_length (sections));
 		goto out;
 	}
 
 	/* name has to be valid */
 	if (pk_strzero (sections[0])) {
-		pk_warning ("ident first section is empty");
 		goto out;
 	}
 
commit 4b3f4070f8da9a7da7796a94d6eff016de0b1f96
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 29 07:35:52 2008 +0100

    apt: fix two trivial compile errors

diff --git a/backends/apt/pk-backend-apt.c b/backends/apt/pk-backend-apt.c
index cb53e0f..32ec527 100644
--- a/backends/apt/pk-backend-apt.c
+++ b/backends/apt/pk-backend-apt.c
@@ -137,7 +137,7 @@ backend_remove_packages (PkBackend *backend, gchar **package_ids, gboolean allow
 static void
 backend_get_details (PkBackend *backend, gchar **package_ids)
 {
-	pk_backend_dbus_get_details (dbus, package_id);
+	pk_backend_dbus_get_details (dbus, package_ids);
 }
 
 /**
@@ -173,7 +173,7 @@ backend_cancel (PkBackend *backend)
 static void
 backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
-	        pk_backend_dbus_resolve (dbus, filters, package_id);
+	        pk_backend_dbus_resolve (dbus, filters, package_ids);
 }
 
 /**
commit 8047a2f0cb2730df67cb50aeafb62ac85ca453e9
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 28 16:40:55 2008 +0100

    bugfix: don't print out '%' chars on the console from python exceptions, we can crash the daemon that way as we parse them as formatters

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 7711906..f75d5f3 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -235,8 +235,13 @@ pk_backend_spawn_parse_stdout (PkBackendSpawn *backend_spawn, const gchar *line)
 		}
 		/* convert back all the ;'s to newlines */
 		text = g_strdup (sections[2]);
+
 		/* convert ; to \n as we can't emit them on stdout */
 		g_strdelimit (text, ";", '\n');
+
+		/* convert % else we try to format them */
+		g_strdelimit (text, "%", '$');
+
 		pk_backend_error_code (backend_spawn->priv->backend, error_enum, text);
 		g_free (text);
 	} else if (pk_strequal (command, "requirerestart")) {
commit ed680d77b7aed14f64b8e0d9e11673baab4d2f06
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 28 12:14:13 2008 +0100

    trivial: don't quote the No such file error message

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index b4ce7a0..40dec69 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -2007,7 +2007,7 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 		ret = g_file_test (full_paths[i], G_FILE_TEST_EXISTS);
 		if (!ret) {
 			error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NO_SUCH_FILE,
-					     "No such file '%s'", full_paths[i]);
+					     "No such file %s", full_paths[i]);
 			dbus_g_method_return_error (context, error);
 			return;
 		}
commit c3b5608403f03bd62147bb111edf398a9f12b6d3
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 28 08:47:07 2008 +0100

    trivial: fix a crash in pk-generate-package-list if we don't have perms to write to disk

diff --git a/client/pk-generate-package-list.c b/client/pk-generate-package-list.c
index 74e0bf4..50d94a3 100644
--- a/client/pk-generate-package-list.c
+++ b/client/pk-generate-package-list.c
@@ -80,7 +80,7 @@ main (int argc, char *argv[])
 	list = pk_client_get_package_list (client);
 	ret = pk_package_list_to_file (list, PK_PACKAGE_LIST_LOCATION);
 	if (!ret) {
-		g_print ("Failed to write to disk: %s\n", error->message);
+		g_print ("Failed to write to disk\n");
 		g_error_free (error);
 		goto out;
 	}
commit 023f5faf626497fc5478fd3f0a10e90feeaa1dc2
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sun Jul 27 13:13:58 2008 +0100

    Add generic wrapper call that takes a dict of callbacks to connect,
    and generic wrappers that connect Package, Details and RepoDetail
    signals as well as one that just makes the call.
    
    Convert all the methods to use those generic ones to reduce copypasta.

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 4cd783b..9d66f2e 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -44,6 +44,67 @@ class PackageKitClient:
 
         self.bus = dbus.SystemBus()
 
+    def _wrapCall(self, pk_xn, method, callbacks):
+        '''
+        Wraps a call which emits Finished and ErrorCode on completion
+        '''
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        for cb in callbacks.keys():
+            pk_xn.connect_to_signal(cb, callbacks[cb])
+
+        method()
+        self._wait()
+        if self._error_enum:
+            raise PackageKitError(self._error_enum)
+
+
+    def _wrapBasicCall(self, pk_xn, method):
+        return self._wrapCall(pk_xn, method, {})
+
+    def _wrapPackageCall(self, pk_xn, method):
+        '''
+        Wraps a call which emits Finished, ErrorCode on completion and Package for information
+        returns a list of dicts with 'installed', 'id' and 'summary' keys
+        '''
+
+        result = []
+        package_cb = lambda i, id, summary: result.append({'installed' : (i == 'installed'),
+                                                           'id': (str(id)),
+                                                           'summary' :str(summary)}
+                                                          )
+        self._wrapCall(pk_xn, method, {'Package' : package_cb})
+        return result
+
+    def _wrapDetailsCall(self, pk_xn, method):
+        '''
+        Wraps a call which emits Finished, ErrorCode on completion and Details for information
+        returns a list of dicts with 'id', 'license', 'group', 'description', 'upstream_url', 'size'.keys
+        '''
+        result = []
+        details_cb = lambda id, license, group, detail, url, size: result.append({"id" : str(id),
+                                                                                  "license" : str(license),
+                                                                                  "group" : str(group),
+                                                                                  "detail" : str(detail),
+                                                                                  "url" : str(url),
+                                                                                  "size" : int(size)}
+                                                                                 )
+        self._wrapCall(pk_xn, method, {'Details' : details_cb})
+        return result
+
+    def _wrapReposCall(self, pk_xn, method):
+        '''
+        Wraps a call which emits Finished, ErrorCode and RepoDetail for information
+        returns a list of dicts with 'id', 'description', 'enabled' keys
+        '''
+        result = []
+        repo_cb = lambda id, description, enabled: result.append({'id' : str(id),
+                                                                  'desc' : str(description),
+                                                                  'enabled' : enabled})
+        self._wrapCall(pk_xn, method, {'RepoDetail' : repo_cb})
+        return result
+
+
     def SuggestDaemonQuit(self):
         '''Ask the PackageKit daemon to shutdown.'''
 
@@ -62,74 +123,32 @@ class PackageKitClient:
         Return Dict with keys of (installed, id, short_description) for all matches,
         where installed is a boolean and id and short_description are strings.
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Package',
-            lambda i, id, summary: result.append({'installed' : (i == 'installed'),
-                                                  'id': (str(id)),
-                                                  'summary' :str(summary)}))
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.Resolve(filter, package)
-        self._wait()
-        return result
+        xn = self._get_xn()
+        return self._wrapPackageCall(xn, lambda : xn.Resolve(filter, package))
+
 
     def GetDetails(self, package_id):
         '''Get details about a PackageKit package_id.
 
         Return dict with keys (id, license, group, description, upstream_url, size).
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Details', lambda id, license, group, detail, url, size:
-                                    result.append({"id" : str(id),
-                                                   "license" : str(license),
-                                                   "group" : str(group),
-                                                   "detail" : str(detail),
-                                                   "url" : str(url),
-                                                   "size" : int(size)})
-                                )
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.GetDetails(package_id)
-        self._wait()
-        if self._error_enum:
-            raise PackageKitError(self._error_enum)
-        return result
+        xn = self._get_xn()
+        return self._wrapDetailsCall(xn, lambda : xn.GetDetails(package_id))
 
     def SearchName(self, filter, name):
-        '''Search a package by name.
-
-        # FIXME AS incorrect return
-        Return a list of (installed, package_id, short_description) triples,
-        where installed is a boolean and package_id/short_description are
-        strings.
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Package',
-            lambda i, id, summary: result.append({'id': (str(id)),
-                                                  'summary' :str(summary)}))
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.SearchName(filter, name)
-        self._wait()
-        return result
+        Search a package by name.
+        '''
+        xn = self._get_xn()
+        return self._wrapPackageCall(xn, lambda : xn.SearchName(filter, name))
 
     def SearchDetails(self, filter, name):
-        '''Search a packages details.
-        #FIXME description
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Package',
-            lambda i, id, summary: result.append({'id': (str(id)),
-                                                  'summary' :str(summary)}))
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.SearchDetails(filter, name)
-        self._wait()
-        return result
+        Search a packages details.
+        '''
+        xn = self._get_xn()
+        return self._wrapPackageCall(xn, lambda : xn.SearchDetails(filter, name))
+
 
     def InstallPackages(self, package_ids, progress_cb=None):
         '''Install a list of package IDs.
@@ -166,11 +185,9 @@ class PackageKitClient:
         may take a few minutes and should be done when the session and
         system are idle.
         '''
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.RefreshCache(force)
-        self._wait()
+        xn = self._get_xn()
+        self._wrapBasicCall(xn, lambda : xn.RefreshCache(force))
+
 
     def GetRepoList(self, filter=None):
         '''
@@ -179,20 +196,11 @@ class PackageKitClient:
         filter is a correct filter, e.g. None or 'installed;~devel'
 
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.connect_to_signal('RepoDetail',
-                                lambda id, description, enabled:
-                                    result.append({'id' : str(id),
-                                                   'desc' : str(description),
-                                                   'enabled' : enabled}))
         if (filter == None):
             filter = 'none'
-        pk_xn.GetRepoList(filter)
-        self._wait()
-        return result
+        xn = self._get_xn()
+        return self._wrapReposCall(xn, lambda : xn.GetRepoList(filter))
+
 
     def RepoEnable(self, repo_id, enabled):
         '''
@@ -203,11 +211,8 @@ class PackageKitClient:
         enabled true if enabled, false if disabled
 
         '''
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.RepoEnable(repo_id, enabled)
-        self._wait()
+        xn = self._get_xn()
+        self._wrapBasicCall(xn, lambda : xn.RepoEnable(repo_id, enabled))
 
     def GetUpdates(self, filter=None):
         '''
@@ -215,18 +220,8 @@ class PackageKitClient:
 
         It should only return the newest update for each installed package.
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.connect_to_signal('Package',
-            lambda i, id, summary: result.append({'id': str(id),
-                                                  'summary' : str(summary)}))
-        if (filter == None):
-            filter = "none"
-        pk_xn.GetUpdates(filter)
-        self._wait()
-        return result
+        xn = self._get_xn()
+        self._wrapPackageCall(xn, lambda : xn.GetUpdates(filter))
 
     def UpdateSystem(self, filter=None):
         '''
@@ -234,13 +229,8 @@ class PackageKitClient:
 
         It should only return the newest update for each installed package.
         '''
-        result = []
-        pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Finished', self._h_finished)
-        pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.UpdateSystem()
-        self._wait()
-        return result
+        xn = self._get_xn()
+        self._wrapPackageCall(xn, lambda : xn.UpdateSystem())
 
 
     #
@@ -340,14 +330,15 @@ if __name__ == '__main__':
     print pk.RefreshCache()
 
     print '---- Resolve() -----'
-    print pk.Resolve('none', 'pmount')
+    pmount = pk.Resolve('none', 'pmount')
+    print pmount
     print pk.Resolve('none', 'quilt')
     print pk.Resolve('none', 'foobar')
     print pk.Resolve('installed', 'coreutils')
     print pk.Resolve('installed', 'pmount')
 
     print '---- GetDetails() -----'
-    print pk.GetDetails('installation-guide-powerpc;20080520ubuntu1;all;Ubuntu')
+    print pk.GetDetails(pmount[0]['id'])
 
     print '---- SearchName() -----'
     print pk.SearchName('available', 'coreutils')
commit 44782e37372079d702c9c1cfb507e4a3c0b3a0b9
Merge: f3d5ae4... 5be8839...
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat Jul 26 21:26:38 2008 +0100

    Merge branch 'POLAND'

commit f3d5ae4aab8a266a563b0ecb8071c8e9f14523dc
Author: Igor Pires Soares <igorsoares at gmail.com>
Date:   Fri Jul 25 19:49:21 2008 +0000

    Updated Brazilian Portuguese translation
    
    Transmitted-via: Transifex (translate.fedoraproject.org)

diff --git a/po/pt_BR.po b/po/pt_BR.po
index fd1b2ce..3c6dc2b 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-06-10 17:51+0000\n"
-"PO-Revision-Date: 2008-07-03 21:49-0300\n"
+"POT-Creation-Date: 2008-07-23 01:22+0000\n"
+"PO-Revision-Date: 2008-07-25 16:49-0300\n"
 "Last-Translator: Igor Pires Soares <igor at projetofedora.org>\n"
 "Language-Team: Brazilian Portuguese <fedora-trans-pt_br at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -19,236 +19,244 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-Country: BRAZIL\n"
 
-#: ../client/pk-console.c:223
+#: ../client/pk-console.c:212
 msgid "Update detail"
 msgstr "Detalhe da atualização"
 
-#: ../client/pk-console.c:424
+#: ../client/pk-console.c:413
 msgid "A system restart is required"
 msgstr "É necessário reiniciar o sistema"
 
-#: ../client/pk-console.c:426
+#: ../client/pk-console.c:415
 msgid "A logout and login is required"
 msgstr "É necessário sair da sessão e autenticar novamente"
 
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:417
 msgid "An application restart is required"
 msgstr "É necessário reiniciar a aplicação"
 
-#: ../client/pk-console.c:473
+#: ../client/pk-console.c:462
 #, c-format
 msgid "Please enter a number from 1 to %i: "
 msgstr "Por favor, insira um número entre 1 e %i: "
 
-#: ../client/pk-console.c:533
+#: ../client/pk-console.c:525
 msgid "Could not find a package match"
 msgstr "Não foi possível encontrar um pacote correspondente"
 
-#: ../client/pk-console.c:547
+#: ../client/pk-console.c:539
 msgid "There are multiple package matches"
 msgstr "Há múltiplos pacotes correspondentes"
 
 #. find out what package the user wants to use
-#: ../client/pk-console.c:554
+#: ../client/pk-console.c:546
 msgid "Please enter the package number: "
 msgstr "Por favor, insira o número do pacote: "
 
-#: ../client/pk-console.c:589
+#: ../client/pk-console.c:580
 msgid "Could not find a package with that name to install, or package already installed"
 msgstr "Não foi possível encontrar um pacote com esse nome para instalar ou o pacote já está instalado"
 
-#: ../client/pk-console.c:737
+#: ../client/pk-console.c:726
 msgid "Could not find a package to remove"
 msgstr "Não foi possível localizar um pacote a ser removido"
 
-#: ../client/pk-console.c:806
+#: ../client/pk-console.c:787
 msgid "The following packages have to be removed"
 msgstr "Os seguintes pacotes têm que ser removidos"
 
 #. get user input
-#: ../client/pk-console.c:815
+#: ../client/pk-console.c:794
 msgid "Okay to remove additional packages?"
 msgstr "Os pacotes adicionais podem ser removidos?"
 
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:798
 msgid "Cancelled!"
 msgstr "Cancelado!"
 
-#: ../client/pk-console.c:844
+#: ../client/pk-console.c:832
+msgid "Could not find a package to download"
+msgstr "Não foi possível localizar um pacote a ser baixado"
+
+#: ../client/pk-console.c:883
 msgid "Could not find a package with that name to update"
 msgstr "Não foi possível encontrar um pacote com esse nome para ser atualizado"
 
-#: ../client/pk-console.c:862
+#: ../client/pk-console.c:905
 msgid "Could not find what packages require this package"
 msgstr "Não foi possível encontrar quais pacotes necessitam desse pacote"
 
-#: ../client/pk-console.c:880
+#: ../client/pk-console.c:926
 msgid "Could not get dependencies for this package"
 msgstr "Não foi possível obter as dependências desse pacote"
 
-#: ../client/pk-console.c:898
+#: ../client/pk-console.c:947
 msgid "Could not find details for this package"
 msgstr "Não foi possível localizar os detalhes deste pacote"
 
-#: ../client/pk-console.c:916
+#: ../client/pk-console.c:968
 msgid "Could not find the files for this package"
 msgstr "Não foi possível encontrar os arquivos para este pacote"
 
-#: ../client/pk-console.c:996
+#: ../client/pk-console.c:1050
 msgid "Package description"
 msgstr "Descrição do pacote"
 
-#: ../client/pk-console.c:1019
+#: ../client/pk-console.c:1073
 msgid "Package files"
 msgstr "Arquivos do pacote"
 
-#: ../client/pk-console.c:1027
+#: ../client/pk-console.c:1081
 msgid "No files"
 msgstr "Nenhum arquivo"
 
 #. get user input
-#: ../client/pk-console.c:1059
+#: ../client/pk-console.c:1113
 msgid "Okay to import key?"
 msgstr "A chave pode ser importada?"
 
-#: ../client/pk-console.c:1062
+#: ../client/pk-console.c:1116
 msgid "Did not import key"
 msgstr "Não importar a chave"
 
 #. get user input
-#: ../client/pk-console.c:1102
+#: ../client/pk-console.c:1156
 msgid "Do you agree?"
 msgstr "Você concorda?"
 
-#: ../client/pk-console.c:1105
+#: ../client/pk-console.c:1159
 msgid "Did not agree to licence, task will fail"
 msgstr "Se você não concordar com a licença a tarefa irá falhar"
 
-#: ../client/pk-console.c:1134
+#: ../client/pk-console.c:1188
 msgid "The daemon crashed mid-transaction!"
 msgstr "O daemon travou no meio da transação!"
 
 #. header
-#: ../client/pk-console.c:1187
+#: ../client/pk-console.c:1241
 msgid "PackageKit Console Interface"
 msgstr "Interface em Console do PackageKit"
 
-#: ../client/pk-console.c:1187
+#: ../client/pk-console.c:1241
 msgid "Subcommands:"
 msgstr "Subcomandos:"
 
-#: ../client/pk-console.c:1290
+#: ../client/pk-console.c:1349
 #: ../client/pk-monitor.c:104
 #: ../src/pk-main.c:189
 msgid "Show extra debugging information"
 msgstr "Mostrar informações extras de depuração"
 
-#: ../client/pk-console.c:1292
+#: ../client/pk-console.c:1351
 #: ../client/pk-monitor.c:106
 msgid "Show the program version and exit"
 msgstr "Mostrar a versão do programa e sair"
 
-#: ../client/pk-console.c:1294
+#: ../client/pk-console.c:1353
 msgid "Set the filter, e.g. installed"
 msgstr "Definir o filtro, p. ex.: instalados"
 
-#: ../client/pk-console.c:1296
+#: ../client/pk-console.c:1355
 msgid "Exit without waiting for actions to complete"
 msgstr "Sair sem esperar pelo término das ações"
 
-#: ../client/pk-console.c:1319
+#: ../client/pk-console.c:1378
 msgid "Could not connect to system DBUS."
 msgstr "Não foi possível conectar ao DBUS do sistema."
 
-#: ../client/pk-console.c:1413
+#: ../client/pk-console.c:1472
 msgid "You need to specify a search type"
 msgstr "Você precisa especificar um tipo de pesquisa"
 
-#: ../client/pk-console.c:1418
-#: ../client/pk-console.c:1425
-#: ../client/pk-console.c:1432
-#: ../client/pk-console.c:1439
-#: ../client/pk-console.c:1538
-#: ../client/pk-console.c:1545
-#: ../client/pk-console.c:1552
-#: ../client/pk-console.c:1559
+#: ../client/pk-console.c:1477
+#: ../client/pk-console.c:1484
+#: ../client/pk-console.c:1491
+#: ../client/pk-console.c:1498
+#: ../client/pk-console.c:1604
+#: ../client/pk-console.c:1611
+#: ../client/pk-console.c:1618
+#: ../client/pk-console.c:1625
 msgid "You need to specify a search term"
 msgstr "Você precisa especificar um termo de pesquisa"
 
-#: ../client/pk-console.c:1444
+#: ../client/pk-console.c:1503
 msgid "Invalid search type"
 msgstr "Tipo de pesquisa inválido"
 
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1508
 msgid "You need to specify a package or file to install"
 msgstr "Você precisa especificar um pacote ou programa a ser instalado"
 
-#: ../client/pk-console.c:1456
+#: ../client/pk-console.c:1515
 msgid "You need to specify a type, key_id and package_id"
 msgstr "Você precisa especificar um tipo, key_id e package_id"
 
-#: ../client/pk-console.c:1463
+#: ../client/pk-console.c:1522
 msgid "You need to specify a package to remove"
 msgstr "Você precisa especificar um pacote a ser removido"
 
-#: ../client/pk-console.c:1470
+#: ../client/pk-console.c:1528
+msgid "You need to specify the package to download and the destination directory"
+msgstr "Você precisa especificar o pacote a ser baixado e o diretório de destino"
+
+#: ../client/pk-console.c:1534
 msgid "You need to specify a eula-id"
 msgstr "Você precisa especificar um eula-id"
 
-#: ../client/pk-console.c:1486
+#: ../client/pk-console.c:1550
 msgid "You need to specify a package name to resolve"
 msgstr "Você precisa especificar um nome de pacote a ser analisado"
 
-#: ../client/pk-console.c:1493
-#: ../client/pk-console.c:1500
+#: ../client/pk-console.c:1559
+#: ../client/pk-console.c:1566
 msgid "You need to specify a repo name"
 msgstr "Você precisa especificar um nome de repositório"
 
-#: ../client/pk-console.c:1507
+#: ../client/pk-console.c:1573
 msgid "You need to specify a repo name/parameter and value"
 msgstr "Você precisa especificar um nome/parâmetro de repositório e um valor"
 
-#: ../client/pk-console.c:1520
+#: ../client/pk-console.c:1586
 msgid "You need to specify a time term"
 msgstr "Você precisa especificar um termo de horário"
 
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1591
 msgid "You need to specify a correct role"
 msgstr "Você precisa especificar um papel correto"
 
-#: ../client/pk-console.c:1530
+#: ../client/pk-console.c:1596
 msgid "Failed to get last time"
 msgstr "Falha ao obter o último horário"
 
-#: ../client/pk-console.c:1566
+#: ../client/pk-console.c:1632
 msgid "You need to specify a package to find the details for"
 msgstr "Você precisa especificar o pacote para o qual você quer localizar os detalhes"
 
-#: ../client/pk-console.c:1573
+#: ../client/pk-console.c:1639
 msgid "You need to specify a package to find the files for"
 msgstr "Você precisa especificar o pacote para o qual você quer localizar os arquivos"
 
-#: ../client/pk-console.c:1622
+#: ../client/pk-console.c:1688
 #, c-format
 msgid "Option '%s' not supported"
 msgstr "A opção \"%s\" não é suportada"
 
-#: ../client/pk-console.c:1633
+#: ../client/pk-console.c:1699
 msgid "Command failed"
 msgstr "O comando falhou"
 
-#: ../client/pk-console.c:1637
+#: ../client/pk-console.c:1703
 msgid "You don't have the necessary privileges for this operation"
 msgstr "Você não tem os privilégios necessários para esta operação"
 
-#: ../client/pk-import-desktop.c:298
-#: ../client/pk-import-specspo.c:173
+#: ../client/pk-import-desktop.c:279
+#: ../client/pk-import-specspo.c:177
 #, c-format
 msgid "Could not open database: %s"
 msgstr "Não foi possível abrir o banco de dados: %s"
 
-#: ../client/pk-import-desktop.c:299
-#: ../client/pk-import-specspo.c:174
+#: ../client/pk-import-desktop.c:280
+#: ../client/pk-import-specspo.c:178
 msgid "You probably need to run this program as the root user"
 msgstr "Você provavelmente precisa executar este programa como usuário root"
 
@@ -356,8 +364,4 @@ msgstr "Erro ao tentar iniciar: %s\n"
 #~ msgstr "Atualizar pacote"
 #~ msgid "Could not find a description for this package"
 #~ msgstr "Não foi possível encontrar uma descrição para esse pacote"
-#~ msgid "You need to specify a package to find the description for"
-#~ msgstr ""
-#~ "Você precisa especificar o pacote para o qual você deseja localizar a "
-#~ "descrição"
 
commit 44757fe713710e4666bdeee37cb238b541bef2ab
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Jul 25 15:43:15 2008 +0200

    urpmi: Improve download error handling in perform_installation method

diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
index 966b472..dcaafde 100644
--- a/backends/urpmi/helpers/urpmi_backend/actions.pm
+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
@@ -139,6 +139,9 @@ sub perform_installation {
         if($mode eq "progress") {
           pk_print_status(PK_STATUS_ENUM_DOWNLOAD);
         }
+        elsif($mode eq "error") {
+          pk_print_error(PK_ERROR_ENUM_PACKAGE_DOWNLOAD_FAILED, "Please refresh your package list");
+        }
         print "Install current mode = ", $mode, "\n";
       },
       bad_signature => sub {
commit 212267fdb4bd7ba87c38023f75821f9a423e7c3c
Author: Piotr DrÄ…g <piotrdrag at gmail.com>
Date:   Thu Jul 24 18:40:57 2008 +0000

    2008-07-24  Piotr DrÄ…g <piotrdrag at gmail.com> (via raven at fedoraproject.org)
    
      * po/pl.po: Updated Polish translation

diff --git a/po/pl.po b/po/pl.po
index 59b5480..0b2aab6 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,49 +5,49 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-06-10 17:24+0000\n"
-"PO-Revision-Date: 2008-06-10 22:15+0200\n"
+"POT-Creation-Date: 2008-07-22 19:44+0000\n"
+"PO-Revision-Date: 2008-07-24 20:39+0200\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <pl at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../client/pk-console.c:223
+#: ../client/pk-console.c:212
 msgid "Update detail"
 msgstr "Szczegóły aktualizacji"
 
-#: ../client/pk-console.c:424
+#: ../client/pk-console.c:413
 msgid "A system restart is required"
 msgstr "Wymagane jest ponowne uruchomienie systemu"
 
-#: ../client/pk-console.c:426
+#: ../client/pk-console.c:415
 msgid "A logout and login is required"
 msgstr "Wymagane jest wylogowanie siÄ™ i ponowne zalogowanie"
 
-#: ../client/pk-console.c:428
+#: ../client/pk-console.c:417
 msgid "An application restart is required"
 msgstr "Wymagane jest ponowne uruchomienie aplikacji"
 
-#: ../client/pk-console.c:473
+#: ../client/pk-console.c:462
 #, c-format
 msgid "Please enter a number from 1 to %i: "
 msgstr "Proszę podać numer od 1 do %i: "
 
-#: ../client/pk-console.c:533
+#: ../client/pk-console.c:525
 msgid "Could not find a package match"
 msgstr "Nie można znaleźć pasującego pakietu"
 
-#: ../client/pk-console.c:547
+#: ../client/pk-console.c:539
 msgid "There are multiple package matches"
 msgstr "Pasuje kilka pakietów"
 
 #. find out what package the user wants to use
-#: ../client/pk-console.c:554
+#: ../client/pk-console.c:546
 msgid "Please enter the package number: "
 msgstr "Proszę podać numer pakietu: "
 
-#: ../client/pk-console.c:589
+#: ../client/pk-console.c:580
 msgid ""
 "Could not find a package with that name to install, or package already "
 "installed"
@@ -55,188 +55,197 @@ msgstr ""
 "Nie można znaleźć pakietu o tej nazwie do zainstalowania, lub pakiet jest "
 "już zainstalowany"
 
-#: ../client/pk-console.c:737
+#: ../client/pk-console.c:726
 msgid "Could not find a package to remove"
 msgstr "Nie można znaleźć pakietu do usunięcia"
 
-#: ../client/pk-console.c:806
+#: ../client/pk-console.c:787
 msgid "The following packages have to be removed"
 msgstr "Następujące pakiety muszą zostać usunięte"
 
 #. get user input
-#: ../client/pk-console.c:815
+#: ../client/pk-console.c:794
 msgid "Okay to remove additional packages?"
 msgstr "Usunąć dodatkowe pakiety?"
 
-#: ../client/pk-console.c:819
+#: ../client/pk-console.c:798
 msgid "Cancelled!"
 msgstr "Anulowano!"
 
-#: ../client/pk-console.c:844
+#: ../client/pk-console.c:832
+msgid "Could not find a package to download"
+msgstr "Nie można znaleźć pakietu do pobrania"
+
+#: ../client/pk-console.c:883
 msgid "Could not find a package with that name to update"
 msgstr "Nie można znaleźć pakietu o tej nazwie do zaktualizowania"
 
-#: ../client/pk-console.c:862
+#: ../client/pk-console.c:905
 msgid "Could not find what packages require this package"
 msgstr "Nie można znaleźć pakietów, które wymagają tego pakietu"
 
-#: ../client/pk-console.c:880
+#: ../client/pk-console.c:926
 msgid "Could not get dependencies for this package"
 msgstr "Nie można uzyskać zależności tego pakietu"
 
-#: ../client/pk-console.c:898
+#: ../client/pk-console.c:947
 msgid "Could not find details for this package"
 msgstr "Nie można znaleźć szczegółów tego pakietu"
 
-#: ../client/pk-console.c:916
+#: ../client/pk-console.c:968
 msgid "Could not find the files for this package"
 msgstr "Nie można znaleźć plików tego pakietu"
 
-#: ../client/pk-console.c:996
+#: ../client/pk-console.c:1050
 msgid "Package description"
 msgstr "Opis pakietu"
 
-#: ../client/pk-console.c:1019
+#: ../client/pk-console.c:1073
 msgid "Package files"
 msgstr "Pliki pakietu"
 
-#: ../client/pk-console.c:1027
+#: ../client/pk-console.c:1081
 msgid "No files"
 msgstr "Brak plików"
 
 #. get user input
-#: ../client/pk-console.c:1059
+#: ../client/pk-console.c:1113
 msgid "Okay to import key?"
 msgstr "Zaimportować klucz?"
 
-#: ../client/pk-console.c:1062
+#: ../client/pk-console.c:1116
 msgid "Did not import key"
 msgstr "Nie zaimportowano klucza"
 
 #. get user input
-#: ../client/pk-console.c:1102
+#: ../client/pk-console.c:1156
 msgid "Do you agree?"
 msgstr "Zgadzasz siÄ™?"
 
-#: ../client/pk-console.c:1105
+#: ../client/pk-console.c:1159
 msgid "Did not agree to licence, task will fail"
 msgstr "Nie zaakceptowano licencji, zadanie nie powiedzie siÄ™"
 
-#: ../client/pk-console.c:1134
+#: ../client/pk-console.c:1188
 msgid "The daemon crashed mid-transaction!"
 msgstr "Demon zawiesił się w połowie transakcji!"
 
 #. header
-#: ../client/pk-console.c:1187
+#: ../client/pk-console.c:1241
 msgid "PackageKit Console Interface"
 msgstr "Interfejs konsoli PackageKit"
 
-#: ../client/pk-console.c:1187
+#: ../client/pk-console.c:1241
 msgid "Subcommands:"
 msgstr "Podpolecenia:"
 
-#: ../client/pk-console.c:1290 ../client/pk-monitor.c:104 ../src/pk-main.c:189
+#: ../client/pk-console.c:1349 ../client/pk-monitor.c:104 ../src/pk-main.c:189
 msgid "Show extra debugging information"
 msgstr "Wyświetla dodatkowe informacje o debugowaniu"
 
-#: ../client/pk-console.c:1292 ../client/pk-monitor.c:106
+#: ../client/pk-console.c:1351 ../client/pk-monitor.c:106
 msgid "Show the program version and exit"
 msgstr "Wyświetla wersję programu i wyłącza"
 
-#: ../client/pk-console.c:1294
+#: ../client/pk-console.c:1353
 msgid "Set the filter, e.g. installed"
 msgstr "Ustawia filtr, np. zainstalowane"
 
-#: ../client/pk-console.c:1296
+#: ../client/pk-console.c:1355
 msgid "Exit without waiting for actions to complete"
 msgstr "Wyłącza bez oczekiwania na zakończenie działań"
 
-#: ../client/pk-console.c:1319
+#: ../client/pk-console.c:1378
 msgid "Could not connect to system DBUS."
 msgstr "Nie można połączyć się z systemowym D-Bus."
 
-#: ../client/pk-console.c:1413
+#: ../client/pk-console.c:1472
 msgid "You need to specify a search type"
 msgstr "Należy podać typ wyszukiwania"
 
-#: ../client/pk-console.c:1418 ../client/pk-console.c:1425
-#: ../client/pk-console.c:1432 ../client/pk-console.c:1439
-#: ../client/pk-console.c:1538 ../client/pk-console.c:1545
-#: ../client/pk-console.c:1552 ../client/pk-console.c:1559
+#: ../client/pk-console.c:1477 ../client/pk-console.c:1484
+#: ../client/pk-console.c:1491 ../client/pk-console.c:1498
+#: ../client/pk-console.c:1604 ../client/pk-console.c:1611
+#: ../client/pk-console.c:1618 ../client/pk-console.c:1625
 msgid "You need to specify a search term"
 msgstr "Należy podać termin wyszukiwania"
 
-#: ../client/pk-console.c:1444
+#: ../client/pk-console.c:1503
 msgid "Invalid search type"
 msgstr "Nieprawidłowy typ wyszukiwania"
 
-#: ../client/pk-console.c:1449
+#: ../client/pk-console.c:1508
 msgid "You need to specify a package or file to install"
 msgstr "Należy podać pakiet lub plik do zainstalowania"
 
-#: ../client/pk-console.c:1456
+#: ../client/pk-console.c:1515
 msgid "You need to specify a type, key_id and package_id"
 msgstr "Należy podać typ, key_id i package_id"
 
-#: ../client/pk-console.c:1463
+#: ../client/pk-console.c:1522
 msgid "You need to specify a package to remove"
 msgstr "Należy podać pakiet do usunięcia"
 
-#: ../client/pk-console.c:1470
+#: ../client/pk-console.c:1528
+msgid ""
+"You need to specify the package to download and the destination directory"
+msgstr "Należy podać pakiet do pobrania i katalog docelowy"
+
+#: ../client/pk-console.c:1534
 msgid "You need to specify a eula-id"
 msgstr "Należy podać eula-id"
 
-#: ../client/pk-console.c:1486
+#: ../client/pk-console.c:1550
 msgid "You need to specify a package name to resolve"
 msgstr "Należy podać nazwę pakietu do rozwiązania"
 
-#: ../client/pk-console.c:1493 ../client/pk-console.c:1500
+#: ../client/pk-console.c:1559 ../client/pk-console.c:1566
 msgid "You need to specify a repo name"
 msgstr "Należy podać nazwę repozytorium"
 
-#: ../client/pk-console.c:1507
+#: ../client/pk-console.c:1573
 msgid "You need to specify a repo name/parameter and value"
 msgstr "Należy podać nazwę/parametr repozytorium i wartość"
 
-#: ../client/pk-console.c:1520
+#: ../client/pk-console.c:1586
 msgid "You need to specify a time term"
 msgstr "Należy podać termin czasu"
 
-#: ../client/pk-console.c:1525
+#: ../client/pk-console.c:1591
 msgid "You need to specify a correct role"
 msgstr "Należy podać poprawną rolę"
 
-#: ../client/pk-console.c:1530
+#: ../client/pk-console.c:1596
 msgid "Failed to get last time"
 msgstr "Uzyskanie ostatniego czasu nie powiodło się"
 
-#: ../client/pk-console.c:1566
+#: ../client/pk-console.c:1632
 msgid "You need to specify a package to find the details for"
 msgstr "Należy podać pakiet do znalezienia szczegółów dla"
 
-#: ../client/pk-console.c:1573
+#: ../client/pk-console.c:1639
 msgid "You need to specify a package to find the files for"
 msgstr "Należy podać pakiet do znalezienia plików dla"
 
-#: ../client/pk-console.c:1622
+#: ../client/pk-console.c:1688
 #, c-format
 msgid "Option '%s' not supported"
 msgstr "Opcja \"%s\" nie jest obsługiwana"
 
-#: ../client/pk-console.c:1633
+#: ../client/pk-console.c:1699
 msgid "Command failed"
 msgstr "Polecenie nie powiodło się"
 
-#: ../client/pk-console.c:1637
+#: ../client/pk-console.c:1703
 msgid "You don't have the necessary privileges for this operation"
 msgstr "Nie posiadasz niezbędnych uprawnień dla tej operacji"
 
-#: ../client/pk-import-desktop.c:298 ../client/pk-import-specspo.c:173
+#: ../client/pk-import-desktop.c:279 ../client/pk-import-specspo.c:177
 #, c-format
 msgid "Could not open database: %s"
 msgstr "Nie można otworzyć bazy danych: %s"
 
-#: ../client/pk-import-desktop.c:299 ../client/pk-import-specspo.c:174
+#: ../client/pk-import-desktop.c:280 ../client/pk-import-specspo.c:178
 msgid "You probably need to run this program as the root user"
 msgstr "Prawdopodobnie należy uruchomić ten program jako użytkownik root"
 
@@ -267,7 +276,7 @@ msgid ""
 "The org.freedesktop.PackageKit.conf file is not installed in the system /etc/"
 "dbus-1/system.d directory"
 msgstr ""
-"Plik org.freedesktop.PackageKit.conf nie jest zainstalowany w folderze "
+"Plik org.freedesktop.PackageKit.conf nie jest zainstalowany w katalogu "
 "systemowym /etc/dbus-1/system.d"
 
 #: ../src/pk-main.c:185
commit 5be88395a5a6b4f056d35c6be4c2c792a8937c07
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 17:22:28 2008 +0100

    dummy: add some more functionality to the dummy backend

diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index 0aa4314..b6a3838 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -34,6 +34,7 @@ static guint _package_current = 0;
 static gboolean _has_service_pack = FALSE;
 static gboolean _repo_enabled_local = FALSE;
 static gboolean _repo_enabled_fedora = TRUE;
+static gboolean _repo_enabled_devel = TRUE;
 static gboolean _repo_enabled_livna = TRUE;
 static gboolean _updated_gtkhtml = FALSE;
 static gboolean _updated_kernel = FALSE;
@@ -525,10 +526,20 @@ backend_search_group (PkBackend *backend, PkFilterEnum filters, const gchar *sea
 static gboolean
 backend_search_name_timeout (gpointer data)
 {
+	gchar *locale;
 	PkBackend *backend = (PkBackend *) data;
-	pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
-			    "evince;0.9.3-5.fc8;i386;installed",
-			    "PDF Document viewer");
+	locale = pk_backend_get_locale (backend);
+
+	pk_debug ("locale is %s", locale);
+	if (!pk_strequal (locale, "en_GB.utf8")) {
+		pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
+				    "evince;0.9.3-5.fc8;i386;installed",
+				    "PDF Dokument Ƥrŏgrȃɱ");
+	} else {
+		pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
+				    "evince;0.9.3-5.fc8;i386;installed",
+				    "PDF Document viewer");
+	}
 	pk_backend_package (backend, PK_INFO_ENUM_INSTALLED,
 			    "tetex;3.0-41.fc8;i386;fedora",
 			    "TeTeX is an implementation of TeX for Linux or UNIX systems.");
@@ -702,8 +713,12 @@ backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
 		pk_backend_repo_detail (backend, "local",
 					"Local PackageKit volume", _repo_enabled_local);
 	}
-	pk_backend_repo_detail (backend, "development",
-				"Fedora - Development", _repo_enabled_fedora);
+	pk_backend_repo_detail (backend, "fedora",
+				"Fedora - 9", _repo_enabled_fedora);
+	if (!pk_enums_contain (filters, PK_FILTER_ENUM_NOT_DEVELOPMENT)) {
+		pk_backend_repo_detail (backend, "development",
+					"Fedora - Development", _repo_enabled_devel);
+	}
 	pk_backend_repo_detail (backend, "livna-development",
 				"Livna for Fedora Core 8 - i386 - Development Tree", _repo_enabled_livna);
 	pk_backend_finished (backend);
@@ -721,6 +736,9 @@ backend_repo_enable (PkBackend *backend, const gchar *rid, gboolean enabled)
 		pk_debug ("local repo: %i", enabled);
 		_repo_enabled_local = enabled;
 	} else if (pk_strequal (rid, "development")) {
+		pk_debug ("devel repo: %i", enabled);
+		_repo_enabled_devel = enabled;
+	} else if (pk_strequal (rid, "fedora")) {
 		pk_debug ("fedora repo: %i", enabled);
 		_repo_enabled_fedora = enabled;
 	} else if (pk_strequal (rid, "livna-development")) {
commit 7871b84b293cd2c1b230df115ffe9d26abfbdb63
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 17:21:04 2008 +0100

    trivial: remove a scary debugging statement

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 014ed7b..98abb7b 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -1134,7 +1134,6 @@ pk_backend_set_locale (PkBackend *backend, const gchar *code)
 	g_free (backend->priv->locale);
 	backend->priv->locale = g_strdup (code);
 
-	pk_warning ("TODO: do something here!!");
 	return TRUE;
 }
 
commit d6cd1fe4bd34fa35f8942b3347715b9bec96dba2
Merge: feebee7... 5af3569...
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 16:40:05 2008 +0100

    Merge branch 'user-profiles' into POLAND

commit feebee7b10fe069d29ac081f4898ff2bcf0bf205
Merge: 3a62976... dbf3888...
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 16:39:53 2008 +0100

    Merge branch 'polkit-rename' into POLAND

commit 3a62976579b6887c8bffa28de936156bfae3e3aa
Merge: ef75e9a... 050eccb...
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 16:39:48 2008 +0100

    Merge branch 'set-locale' into POLAND

diff --cc src/pk-transaction.c
index bfec63a,9eccf54..b4ce7a0
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@@ -3216,8 -3231,9 +3240,9 @@@ pk_transaction_init (PkTransaction *tra
  	transaction->priv->cached_repo_id = NULL;
  	transaction->priv->cached_parameter = NULL;
  	transaction->priv->cached_value = NULL;
 -	transaction->priv->last_package = NULL;
 +	transaction->priv->last_package_id = NULL;
  	transaction->priv->tid = NULL;
+ 	transaction->priv->locale = NULL;
  	transaction->priv->role = PK_ROLE_ENUM_UNKNOWN;
  
  	transaction->priv->backend = pk_backend_new ();
@@@ -3251,8 -3267,9 +3276,9 @@@ pk_transaction_finalize (GObject *objec
  	transaction = PK_TRANSACTION (object);
  	g_return_if_fail (transaction->priv != NULL);
  
 -	g_free (transaction->priv->last_package);
 +	g_free (transaction->priv->last_package_id);
  	g_free (transaction->priv->dbus_name);
+ 	g_free (transaction->priv->locale);
  	g_free (transaction->priv->cached_package_id);
  	g_free (transaction->priv->cached_key_id);
  	g_strfreev (transaction->priv->cached_package_ids);
commit 050eccb8d6dd8cdcce0600241bbe5a7e1ed67117
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 16:34:49 2008 +0100

    trivial: add a diagram missing from the last commit

diff --git a/docs/api/spec/pk-transactions-set-locale.png b/docs/api/spec/pk-transactions-set-locale.png
new file mode 100644
index 0000000..48e2e10
Binary files /dev/null and b/docs/api/spec/pk-transactions-set-locale.png differ
commit fc0af654754dd1def2cd8a04347db39278545548
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 22 16:33:29 2008 +0100

    API ADDITION: Add a SetLocale() method so we can support native localisations for backends that support it

diff --git a/docs/api/Makefile.am b/docs/api/Makefile.am
index 031e6d6..b9f9c4d 100644
--- a/docs/api/Makefile.am
+++ b/docs/api/Makefile.am
@@ -50,6 +50,7 @@ HTML_IMAGES =						\
 	spec/pk-faq-error-code.png			\
 	spec/pk-faq-status.png				\
 	spec/pk-transactions.svg			\
+	spec/pk-transactions-set-locale.png		\
 	spec/pk-transactions-failure.png		\
 	spec/pk-transactions-sig-install.png		\
 	spec/pk-transactions-success.png		\
diff --git a/docs/api/spec/pk-concepts.xml b/docs/api/spec/pk-concepts.xml
index bbe1b13..cfa5a48 100644
--- a/docs/api/spec/pk-concepts.xml
+++ b/docs/api/spec/pk-concepts.xml
@@ -693,6 +693,22 @@
       This is done as three transactions, as other transactions may be queued and have a higher
       priority, and to make sure that the transaction object is not reused.
     </para>
+    <mediaobject id="pk-transactions-set-locale">
+      <imageobject>
+        <imagedata format="PNG" fileref="pk-transactions-set-locale.png" align="center"/>
+      </imageobject>
+    </mediaobject>
+    <para>
+      The PackageKit backend may support native localisation, which we should support if the
+      translations exist.
+      In the prior examples the <literal>SetLocale()</literal> method has been left out for brevity.
+      If you are using the raw DBUS methods to access PackageKit, you will also need to make
+      a call to <literal>SetLocale()</literal> so the daemon knows what locale to assign the
+      transaction.
+      If you are using libpackagekit to schedule transactions, then the locale will be set
+      automatically in the <literal>PkControl</literal> GObject, and you do not need to call
+      <literal>pk_client_set_locale()</literal> manually.
+    </para>
   </sect1>
 
   <sect1 id="introduction-ideas-transactionid">
diff --git a/docs/api/spec/pk-transactions.svg b/docs/api/spec/pk-transactions.svg
index 954e540..2a39467 100644
--- a/docs/api/spec/pk-transactions.svg
+++ b/docs/api/spec/pk-transactions.svg
@@ -14,7 +14,10 @@
    sodipodi:version="0.32"
    inkscape:version="0.46"
    sodipodi:docname="pk-transactions.svg"
-   inkscape:output_extension="org.inkscape.output.svg.inkscape">
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions.png"
+   inkscape:export-xdpi="89.970497"
+   inkscape:export-ydpi="89.970497">
   <defs
      id="defs4">
     <marker
@@ -1271,5 +1274,196 @@
          x="-958.495"
          y="60"
          style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
-  </g>
+    <rect
+       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.41040158;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       id="rect2590"
+       width="475.0896"
+       height="154.92587"
+       x="29.932425"
+       y="1057.3746"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <rect
+       style="opacity:0.76146785;fill:#ff8080;fill-opacity:1"
+       id="rect2592"
+       width="35"
+       height="144.94287"
+       x="249.92029"
+       y="1062.4193"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <rect
+       style="opacity:0.76146785;fill:#5fd38d;fill-opacity:1"
+       id="rect2594"
+       width="35"
+       height="144.94287"
+       x="34.920288"
+       y="1062.4193"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1148.481"
+       y="274.5025"
+       id="text2596"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2598"
+         x="-1148.481"
+         y="274.5025"
+         style="font-size:20px;text-align:center;text-anchor:middle">Client</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 459.86334,1152.4194 L 284.92028,1152.4194"
+       id="path2606"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.059877,1082.3903 L 249.93173,1082.3903"
+       id="path2610"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.3997"
+       y="1077.3903"
+       id="text2612"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2614"
+         x="164.3997"
+         y="1077.3903"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">GetTid()</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.39060569;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 245.03003,1092.3972 L 119.6421,1092.3972 L 110,1082.3622"
+       id="path2616"
+       sodipodi:nodetypes="ccc"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="370.26013"
+       y="1147.4194"
+       id="text2618"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2620"
+         x="370.26013"
+         y="1147.4194"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">InstallPackage(p)</tspan></text>
+    <rect
+       style="opacity:0.76146785;fill:#8d5fd3;fill-opacity:1"
+       id="rect2628"
+       width="35"
+       height="69.970947"
+       x="464.86035"
+       y="1137.3912"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1171.0731"
+       y="490"
+       id="text2630"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2632"
+         x="-1171.0731"
+         y="490"
+         style="font-size:20px;text-align:center;text-anchor:middle">Tran</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.7523787;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 290,1192.3622 L 464.94306,1192.3622"
+       id="path2634"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="381.12277"
+       y="1187.3621"
+       id="text2636"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2638"
+         x="381.12277"
+         y="1187.3621"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">::Finished(failed)</tspan></text>
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="-1133.495"
+       y="60"
+       id="text2640"
+       transform="matrix(0,-1,1,0,0,0)"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2642"
+         x="-1133.495"
+         y="60"
+         style="font-size:20px;text-align:center;text-anchor:middle">Manager</tspan></text>
+    <path
+       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3.75172305;stroke-linecap:butt;stroke-linejoin:miter;marker-start:url(#Arrow2Mstart);stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+       d="M 75.12815,1127.3622 L 250,1127.3622"
+       id="path2644"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996" />
+    <text
+       xml:space="preserve"
+       style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Sans;-inkscape-font-specification:Sans"
+       x="164.46797"
+       y="1122.3621"
+       id="text2646"
+       sodipodi:linespacing="125%"
+       inkscape:export-filename="/home/hughsie/Code/PackageKit/docs/api/html/pk-transactions-set-locale.png"
+       inkscape:export-xdpi="90.089996"
+       inkscape:export-ydpi="90.089996"><tspan
+         sodipodi:role="line"
+         id="tspan2648"
+         x="164.46797"
+         y="1122.3621"
+         style="font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:125%;writing-mode:lr-tb;text-anchor:middle;font-family:Sans;-inkscape-font-specification:Sans">SetLocale()</tspan></text>
+    <flowRoot
+       xml:space="preserve"
+       id="flowRoot2650"
+       style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Sans;font-style:normal;font-weight:normal;font-size:40px;-inkscape-font-specification:Sans;font-stretch:normal;font-variant:normal"><flowRegion
+         id="flowRegion2652"><rect
+           id="rect2654"
+           width="268.70059"
+           height="42.426407"
+           x="-0.50507629"
+           y="1106.4054" /></flowRegion><flowPara
+         id="flowPara2656"></flowPara></flowRoot>  </g>
 </svg>
diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 3706e32..bfb15ce 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -1609,6 +1609,38 @@ pk_client_get_packages (PkClient *client, PkFilterEnum filters, GError **error)
 }
 
 /**
+ * pk_client_set_locale:
+ * @client: a valid #PkClient instance
+ * @code: a valid locale code, e.g. en_GB
+ * @error: a %GError to put the error code and message in, or %NULL
+ *
+ * Set the locale for this transaction.
+ * You normally don't need to call this function as the locale is set
+ * automatically when the tid is requested.
+ *
+ * Return value: %TRUE if the daemon queued the transaction
+ **/
+gboolean
+pk_client_set_locale (PkClient *client, const gchar *code, GError **error)
+{
+	gboolean ret;
+
+	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
+	g_return_val_if_fail (code != NULL, FALSE);
+
+	/* check to see if we have a valid proxy */
+	if (client->priv->proxy == NULL) {
+		pk_client_error_set (error, PK_CLIENT_ERROR_NO_TID, "No proxy for transaction");
+		return FALSE;
+	}
+	ret = dbus_g_proxy_call (client->priv->proxy, "SetLocale", error,
+				 G_TYPE_STRING, code,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+	pk_client_error_fixup (error);
+	return ret;
+}
+
+/**
  * pk_client_get_requires:
  * @client: a valid #PkClient instance
  * @filters: a %PkFilterEnum such as %PK_FILTER_ENUM_GUI | %PK_FILTER_ENUM_FREE or %PK_FILTER_ENUM_NONE
diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
index c4a4d4e..0f072f1 100644
--- a/libpackagekit/pk-client.h
+++ b/libpackagekit/pk-client.h
@@ -186,6 +186,9 @@ gboolean	 pk_client_get_progress			(PkClient	*client,
 gboolean	 pk_client_get_package			(PkClient	*client,
 							 gchar		**package,
 							 GError		**error);
+gboolean	 pk_client_set_locale			(PkClient	*client,
+							 const gchar	*code,
+							 GError		**error);
 gboolean	 pk_client_cancel			(PkClient	*client,
 							 GError		**error)
 							 G_GNUC_WARN_UNUSED_RESULT;
diff --git a/libpackagekit/pk-control.c b/libpackagekit/pk-control.c
index fbb83fa..7132a85 100644
--- a/libpackagekit/pk-control.c
+++ b/libpackagekit/pk-control.c
@@ -42,6 +42,7 @@
 
 #include "pk-debug.h"
 #include "pk-control.h"
+#include "pk-client.h"
 #include "pk-marshal.h"
 #include "pk-connection.h"
 #include "pk-common.h"
@@ -445,6 +446,35 @@ pk_control_get_time_since_action (PkControl *control, PkRoleEnum role, guint *se
 }
 
 /**
+ * pk_control_set_locale:
+ **/
+static gboolean
+pk_control_set_locale (PkControl *control, const gchar *tid, GError **error)
+{
+	PkClient *client;
+	gboolean ret;
+	gchar *locale; /* does not need to be freed */
+
+	client = pk_client_new ();
+	ret = pk_client_set_tid (client, tid, error);
+	if (!ret) {
+		pk_warning ("failed to set the tid: %s", (*error)->message);
+		goto out;
+	}
+
+	/* get the session locale and set th transaction to be in this locale */
+	locale = setlocale (LC_ALL, NULL);
+	ret = pk_client_set_locale (client, locale, error);
+	if (!ret) {
+		pk_warning ("failed to set the locale: %s", (*error)->message);
+		goto out;
+	}
+out:
+	g_object_unref (client);
+	return ret;
+}
+
+/**
  * pk_control_allocate_transaction_id:
  * @control: a valid #PkControl instance
  * @error: a %GError to put the error code and message in, or %NULL
@@ -483,6 +513,13 @@ pk_control_allocate_transaction_id (PkControl *control, gchar **tid, GError **er
 		goto out;
 	}
 
+	/* automatically set the locale */
+	ret = pk_control_set_locale (control, tid_local, error);
+	if (!ret) {
+		pk_control_error_fixup (error);
+		goto out;
+	}
+
 	/* copy */
 	*tid = g_strdup (tid_local);
 	pk_debug ("Got tid: '%s'", tid_local);
diff --git a/src/pk-backend-dbus.c b/src/pk-backend-dbus.c
index 530b0b2..23d8757 100644
--- a/src/pk-backend-dbus.c
+++ b/src/pk-backend-dbus.c
@@ -367,6 +367,30 @@ pk_backend_dbus_set_proxy (PkBackendDbus *backend_dbus, const gchar *proxy_http,
 }
 
 /**
+ * pk_backend_dbus_set_locale:
+ **/
+static gboolean
+pk_backend_dbus_set_locale (PkBackendDbus *backend_dbus, const gchar *locale)
+{
+	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);
+
+	/* new sync method call */
+	pk_backend_dbus_time_reset (backend_dbus);
+	ret = dbus_g_proxy_call (backend_dbus->priv->proxy, "SetLocale", &error,
+				 G_TYPE_STRING, locale,
+				 G_TYPE_INVALID, G_TYPE_INVALID);
+	if (error != NULL) {
+		pk_warning ("%s", error->message);
+		g_error_free (error);
+	}
+	return ret;
+}
+
+/**
  * pk_backend_dbus_startup:
  **/
 gboolean
@@ -374,6 +398,7 @@ pk_backend_dbus_startup (PkBackendDbus *backend_dbus)
 {
 	gboolean ret;
 	GError *error = NULL;
+	gchar *locale;
 	gchar *proxy_http;
 	gchar *proxy_ftp;
 
@@ -396,6 +421,11 @@ pk_backend_dbus_startup (PkBackendDbus *backend_dbus)
 	g_free (proxy_http);
 	g_free (proxy_ftp);
 
+	/* set the language */
+	locale = pk_backend_get_locale (backend_dbus->priv->backend);
+	pk_backend_dbus_set_locale (backend_dbus, locale);
+	g_free (locale);
+
 	/* reset the time */
 	pk_backend_dbus_time_check (backend_dbus);
 out:
diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 2bd416d..7711906 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -460,6 +460,7 @@ pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
 		line = g_strdup_printf ("%s=%s", "http_proxy", value);
 		pk_debug ("setting evp '%s'", line);
 		g_ptr_array_add (array, line);
+		g_free (line);
 	}
 	g_free (value);
 
@@ -469,6 +470,17 @@ pk_backend_spawn_get_envp (PkBackendSpawn *backend_spawn)
 		line = g_strdup_printf ("%s=%s", "ftp_proxy", value);
 		pk_debug ("setting evp '%s'", line);
 		g_ptr_array_add (array, line);
+		g_free (line);
+	}
+	g_free (value);
+
+	/* ftp_proxy */
+	value = pk_backend_get_locale (backend_spawn->priv->backend);
+	if (!pk_strzero (value)) {
+		line = g_strdup_printf ("%s=%s", "LANG", value);
+		pk_debug ("setting evp '%s'", line);
+		g_ptr_array_add (array, line);
+		g_free (line);
 	}
 	g_free (value);
 
diff --git a/src/pk-backend.c b/src/pk-backend.c
index 292cff9..38bf6db 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -82,6 +82,7 @@ struct _PkBackendPrivate
 	gchar			*c_tid;
 	gchar			*proxy_http;
 	gchar			*proxy_ftp;
+	gchar			*locale;
 	gboolean		 locked;
 	gboolean		 set_error;
 	gboolean		 set_signature;
@@ -1108,6 +1109,36 @@ pk_backend_set_transaction_data (PkBackend *backend, const gchar *data)
 }
 
 /**
+ * pk_backend_get_locale:
+ *
+ * Return value: session locale, e.g. en_GB
+ **/
+gchar *
+pk_backend_get_locale (PkBackend *backend)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
+	return g_strdup (backend->priv->locale);
+}
+
+/**
+ * pk_backend_set_locale:
+ **/
+gboolean
+pk_backend_set_locale (PkBackend *backend, const gchar *code)
+{
+	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
+	g_return_val_if_fail (code != NULL, FALSE);
+	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
+
+	pk_debug ("locale changed to %s", code);
+	g_free (backend->priv->locale);
+	backend->priv->locale = g_strdup (code);
+
+	pk_warning ("TODO: do something here!!");
+	return TRUE;
+}
+
+/**
  * pk_backend_details:
  **/
 gboolean
@@ -1732,6 +1763,7 @@ pk_backend_finalize (GObject *object)
 	g_free (backend->priv->proxy_http);
 	g_free (backend->priv->proxy_ftp);
 	g_free (backend->priv->name);
+	g_free (backend->priv->locale);
 	g_free (backend->priv->c_tid);
 	g_object_unref (backend->priv->time);
 	g_object_unref (backend->priv->network);
@@ -1900,6 +1932,7 @@ pk_backend_init (PkBackend *backend)
 	backend->priv = PK_BACKEND_GET_PRIVATE (backend);
 	backend->priv->handle = NULL;
 	backend->priv->name = NULL;
+	backend->priv->locale = NULL;
 	backend->priv->c_tid = NULL;
 	backend->priv->proxy_http = NULL;
 	backend->priv->proxy_ftp = NULL;
diff --git a/src/pk-backend.h b/src/pk-backend.h
index 336b88a..ebc857d 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -60,6 +60,8 @@ gboolean	 pk_backend_set_exit_code		(PkBackend	*backend,
 							 PkExitEnum	 exit);
 gboolean	 pk_backend_set_transaction_data	(PkBackend	*backend,
 							 const gchar	*data);
+gboolean	 pk_backend_set_locale			(PkBackend	*backend,
+							 const gchar	*code);
 
 /* get the state */
 const gchar	*pk_backend_get_current_tid		(PkBackend	*backend);
@@ -74,6 +76,7 @@ gboolean	 pk_backend_get_progress		(PkBackend	*backend,
 guint		 pk_backend_get_runtime			(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_ftp		(PkBackend	*backend);
 gchar		*pk_backend_get_proxy_http		(PkBackend	*backend);
+gchar		*pk_backend_get_locale			(PkBackend	*backend);
 
 /* signal helpers */
 gboolean	 pk_backend_finished			(PkBackend	*backend);
diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index 6ba188d..880303f 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -8,12 +8,34 @@
     <doc:doc>
       <doc:description>
         <doc:para>
-          The transaction interface is used for interacting with indervidual transactions.
+          The transaction interface is used for interacting with individual transactions.
         </doc:para>
       </doc:description>
     </doc:doc>
 
     <!--*****************************************************************************************-->
+    <method name="SetLocale">
+      <doc:doc>
+        <doc:description>
+          <doc:para>
+            This method allows the calling session to set a system locale for
+            the package manager so that summaries and descriptions can be
+            correctly localised.
+          </doc:para>
+        </doc:description>
+      </doc:doc>
+      <arg type="s" name="code" direction="in">
+        <doc:doc>
+          <doc:summary>
+            <doc:para>
+              The locale code, for example <literal>en_GB</literal>.
+            </doc:para>
+          </doc:summary>
+        </doc:doc>
+      </arg>
+    </method>
+
+    <!--*****************************************************************************************-->
     <method name="AcceptEula">
       <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
       <doc:doc>
@@ -320,7 +342,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              The estimated remamining time of the transaction, or 0 if not known.
+              The estimated remaining time of the transaction, or 0 if not known.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1845,7 +1867,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              The timespec of the old transaction.
+              The timespec of the old transaction in ISO8601 format.
             </doc:para>
           </doc:summary>
         </doc:doc>
@@ -1923,7 +1945,7 @@
         <doc:doc>
           <doc:summary>
             <doc:para>
-              A list of package_id's that are to be obsoleted, seporated by <literal>^</literal>
+              A list of package_id's that are to be obsoleted, separated by <literal>^</literal>
               This will change in 0.3.x where <literal>obsoletes</literal> will be a proper string
               array field.
             </doc:para>
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 05503fb..9eccf54 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -78,6 +78,7 @@ struct PkTransactionPrivate
 	gboolean		 allow_cancel;
 	gboolean		 emit_eula_required;
 	gboolean		 emit_signature_required;
+	gchar			*locale;
 	LibGBus			*libgbus;
 	PkBackend		*backend;
 	PkInhibit		*inhibit;
@@ -750,6 +751,7 @@ pk_transaction_set_running (PkTransaction *transaction)
 
 	/* assign */
 	pk_backend_set_current_tid (priv->backend, priv->tid);
+	pk_backend_set_locale (priv->backend, priv->locale);
 
 	/* set the role */
 	pk_backend_set_role (priv->backend, priv->role);
@@ -2883,6 +2885,28 @@ pk_transaction_service_pack (PkTransaction *transaction, const gchar *location,
 }
 
 /**
+ * pk_transaction_set_locale:
+ */
+gboolean
+pk_transaction_set_locale (PkTransaction *transaction, const gchar *code, GError **error)
+{
+	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
+	g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
+
+	/* already set? */
+	if (transaction->priv->locale != NULL) {
+		pk_warning ("Already set locale");
+		g_set_error (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
+			     "Already set locale to %s", transaction->priv->locale);
+		return FALSE;
+	}
+
+	/* save so we can pass to the backend */
+	transaction->priv->locale = g_strdup (code);
+	return TRUE;
+}
+
+/**
  * pk_transaction_update_packages:
  **/
 void
@@ -3209,6 +3233,7 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->cached_value = NULL;
 	transaction->priv->last_package = NULL;
 	transaction->priv->tid = NULL;
+	transaction->priv->locale = NULL;
 	transaction->priv->role = PK_ROLE_ENUM_UNKNOWN;
 
 	transaction->priv->backend = pk_backend_new ();
@@ -3244,6 +3269,7 @@ pk_transaction_finalize (GObject *object)
 
 	g_free (transaction->priv->last_package);
 	g_free (transaction->priv->dbus_name);
+	g_free (transaction->priv->locale);
 	g_free (transaction->priv->cached_package_id);
 	g_free (transaction->priv->cached_key_id);
 	g_strfreev (transaction->priv->cached_package_ids);
diff --git a/src/pk-transaction.h b/src/pk-transaction.h
index 316d057..08f19fb 100644
--- a/src/pk-transaction.h
+++ b/src/pk-transaction.h
@@ -209,6 +209,9 @@ void		 pk_transaction_search_name		(PkTransaction	*transaction,
 							 const gchar	*filter,
 							 const gchar	*search,
 							 DBusGMethodInvocation *context);
+gboolean	 pk_transaction_set_locale		(PkTransaction	*transaction,
+							 const gchar	*code,
+							 GError		**error);
 gboolean	 pk_transaction_service_pack		(PkTransaction	*transaction,
 							 const gchar	*location,
 							 gboolean	 enabled);
commit 70d6426422def430e51aeb2a19d2edf5b2aa76fb
Author: Fabian Affolter <fabian at bernewireless.net>
Date:   Tue Jul 22 07:29:39 2008 +0000

    2008-07-22  Fabian Affolter <fabian at bernewireless.net> (via
    fab at fedoraproject.org)
    
      * po/de.po: fix typo

diff --git a/po/de.po b/po/de.po
index ff15df4..39a8804 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1,369 +1,3453 @@
-# PackageKit
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PackageKit package.
-# Stephan Sachse <white at dev-zero.com>, 2008.
-# Fabian Affolter <fab at fedoraproject.org>, 2008.
+# translation of policycoreutils.HEAD.de.po to
+# translation of de.po to
+# German translation of policycoreutils.
+# Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+#
+#
 #
+# Holger Wansing <linux at wansing-online.de>, 2006.
+# Timo Trinks <ttrinks at redhat.com>, 2006, 2007.
+# Michael Schönitzer <michael at schoenitzer.de>, 2007.
+# Fabian Affolter <fab at fedoraproject.org>, 2008.
+# PGP-KeyID: 0x037FD3CF <ttrinks at redhat.com>, 2008.
 msgid ""
 msgstr ""
-"Project-Id-Version: PackageKit\n"
+"Project-Id-Version: policycoreutils.HEAD.de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-06-10 17:24+0000\n"
-"PO-Revision-Date: 2008-07-22 09:21+0100\n"
+"POT-Creation-Date: 2008-07-22 02:41+0000\n"
+"PO-Revision-Date: 2008-07-22 09:10+0100\n"
 "Last-Translator: Fabian Affolter <fab at fedoraproject.org>\n"
-"Language-Team: German <fedora-trans-de at redhat.com>\n"
+"Language-Team:  <en at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Poedit-Language: German\n"
-
-#: ../client/pk-console.c:223
-msgid "Update detail"
-msgstr "Aktualisierungsdetails"
-
-#: ../client/pk-console.c:424
-msgid "A system restart is required"
-msgstr "Ein Systemneustart ist erforderlich"
-
-#: ../client/pk-console.c:426
-msgid "A logout and login is required"
-msgstr "Eine Neuanmeldung ist erforderlich"
-
-#: ../client/pk-console.c:428
-msgid "An application restart is required"
-msgstr "Ein Neustart der Anwendung ist erforderlich"
-
-#: ../client/pk-console.c:473
-#, c-format
-msgid "Please enter a number from 1 to %i: "
-msgstr "Bitte eine Zahl zwischen 1 und %i eingeben: "
-
-#: ../client/pk-console.c:533
-msgid "Could not find a package match"
-msgstr "Es konnte kein passendes Paket gefunden werden"
-
-#: ../client/pk-console.c:547
-msgid "There are multiple package matches"
-msgstr "Es wurden mehrere passende Paket gefunden"
-
-#. find out what package the user wants to use
-#: ../client/pk-console.c:554
-msgid "Please enter the package number: "
-msgstr "Bitte die Paketnummer eingeben: "
-
-#: ../client/pk-console.c:589
-msgid "Could not find a package with that name to install, or package already installed"
-msgstr "Es konnten weder installierte noch zu installierende Paket mit diesem Namen gefunden werden"
-
-#: ../client/pk-console.c:737
-msgid "Could not find a package to remove"
-msgstr "Es konnte kein Paket zum Entfernen finden"
-
-#: ../client/pk-console.c:806
-msgid "The following packages have to be removed"
-msgstr "Die folgenden Paket werden entfernt"
-
-#. get user input
-#: ../client/pk-console.c:815
-msgid "Okay to remove additional packages?"
-msgstr "Die folgenden zusätzlichen Pakete entfernen?"
-
-#: ../client/pk-console.c:819
-msgid "Cancelled!"
-msgstr "Abgebrochen!"
-
-#: ../client/pk-console.c:844
-msgid "Could not find a package with that name to update"
-msgstr "Es konnte kein Paket mit diesem Namen zum Aktualisieren gefunden werden"
-
-#: ../client/pk-console.c:862
-msgid "Could not find what packages require this package"
-msgstr "Es konnte nicht rausgefunden werden, welche Pakete dieses Paket benötigen"
-
-#: ../client/pk-console.c:880
-msgid "Could not get dependencies for this package"
-msgstr "Die Abhängigkeiten für dieses Paket konnten nicht ermittelt werden"
-
-#: ../client/pk-console.c:898
-msgid "Could not find details for this package"
-msgstr "Die Details für dieses Paket konnten nicht gefunden werden"
-
-#: ../client/pk-console.c:916
-msgid "Could not find the files for this package"
-msgstr "Die Dateien für dieses Paket konnten nicht ermittelt werden"
-
-#: ../client/pk-console.c:996
-msgid "Package description"
-msgstr "Paketbeschreibung"
-
-#: ../client/pk-console.c:1019
-msgid "Package files"
-msgstr "Paketinhalt"
-
-#: ../client/pk-console.c:1027
-msgid "No files"
-msgstr "Keine Dateien"
-
-#. get user input
-#: ../client/pk-console.c:1059
-msgid "Okay to import key?"
-msgstr "Soll der Schlüssel importiert werden?"
-
-#: ../client/pk-console.c:1062
-msgid "Did not import key"
-msgstr "Den Schlüssel nicht importieren"
-
-#. get user input
-#: ../client/pk-console.c:1102
-msgid "Do you agree?"
-msgstr "Sind Sie einverstanden?"
-
-#: ../client/pk-console.c:1105
-msgid "Did not agree to licence, task will fail"
-msgstr "Lizenz wurde abgelehnt, Aufgabe wird fehlschlagen"
-
-#: ../client/pk-console.c:1134
-msgid "The daemon crashed mid-transaction!"
-msgstr "Der Dienst ist während der Verarbeitung abgestürzt!"
-
-#. header
-#: ../client/pk-console.c:1187
-msgid "PackageKit Console Interface"
-msgstr "PackageKit-Konsolenschnittstelle"
-
-#: ../client/pk-console.c:1187
-msgid "Subcommands:"
-msgstr "Unterbefehle:"
-
-#: ../client/pk-console.c:1290
-#: ../client/pk-monitor.c:104
-#: ../src/pk-main.c:189
-msgid "Show extra debugging information"
-msgstr "Zusätzliche Debugging-Informationen anzeigen"
-
-#: ../client/pk-console.c:1292
-#: ../client/pk-monitor.c:106
-msgid "Show the program version and exit"
-msgstr "Die Programmversion anzeigen und beenden"
-
-#: ../client/pk-console.c:1294
-msgid "Set the filter, e.g. installed"
-msgstr "Setzt den Filter, z. B. installiert"
-
-#: ../client/pk-console.c:1296
-msgid "Exit without waiting for actions to complete"
-msgstr "Beenden ohne auf das Ende der Aktionen zu warten"
-
-#: ../client/pk-console.c:1319
-msgid "Could not connect to system DBUS."
-msgstr "Mit System-DBUS konnte nicht verbunden werden."
-
-#: ../client/pk-console.c:1413
-msgid "You need to specify a search type"
-msgstr "Es muss eine Suchart angegeben werden"
-
-#: ../client/pk-console.c:1418
-#: ../client/pk-console.c:1425
-#: ../client/pk-console.c:1432
-#: ../client/pk-console.c:1439
-#: ../client/pk-console.c:1538
-#: ../client/pk-console.c:1545
-#: ../client/pk-console.c:1552
-#: ../client/pk-console.c:1559
-msgid "You need to specify a search term"
-msgstr "Es muss ein Suchausdruck angegeben werden"
-
-#: ../client/pk-console.c:1444
-msgid "Invalid search type"
-msgstr "Ungültige Suchart"
-
-#: ../client/pk-console.c:1449
-msgid "You need to specify a package or file to install"
-msgstr "Es muss ein Paket oder eine Datei zum Installieren angegeben werden"
-
-#: ../client/pk-console.c:1456
-msgid "You need to specify a type, key_id and package_id"
-msgstr "Es muss ein Typ angegeben werden, key_id oder package_id"
-
-#: ../client/pk-console.c:1463
-msgid "You need to specify a package to remove"
-msgstr "Es muss ein Paket zum Entfernen angegeben werden"
-
-#: ../client/pk-console.c:1470
-msgid "You need to specify a eula-id"
-msgstr "Es muss eine eula-id angegeben werden"
-
-#: ../client/pk-console.c:1486
-msgid "You need to specify a package name to resolve"
-msgstr "Es muss ein Paketname zum Auflösen angegeben werden"
-
-#: ../client/pk-console.c:1493
-#: ../client/pk-console.c:1500
-msgid "You need to specify a repo name"
-msgstr "Es muss ein Repository-Name angegeben werden"
-
-#: ../client/pk-console.c:1507
-msgid "You need to specify a repo name/parameter and value"
-msgstr "Es muss ein Repository-Name/Argument und Wert angegeben werden"
-
-#: ../client/pk-console.c:1520
-msgid "You need to specify a time term"
-msgstr "Es muss ein Zeitausdruck angegeben werden"
-
-#: ../client/pk-console.c:1525
-msgid "You need to specify a correct role"
-msgstr "Es muss eine korrekte Rolle angegeben werden"
-
-#: ../client/pk-console.c:1530
-msgid "Failed to get last time"
-msgstr "Die letzte Zeit konnte nicht abgefragt werden"
-
-#: ../client/pk-console.c:1566
-msgid "You need to specify a package to find the details for"
-msgstr "Es muss ein Paket angegeben werden zu dem die Details gefunden werden sollen"
-
-#: ../client/pk-console.c:1573
-msgid "You need to specify a package to find the files for"
-msgstr "Es muss ein Paket angegeben werden zu dem die Dateien gefunden werden sollen"
-
-#: ../client/pk-console.c:1622
-#, c-format
-msgid "Option '%s' not supported"
-msgstr "Option '%s' wird nicht unterstützt"
-
-#: ../client/pk-console.c:1633
-msgid "Command failed"
-msgstr "Befehl fehlgeschlagen"
-
-#: ../client/pk-console.c:1637
-msgid "You don't have the necessary privileges for this operation"
-msgstr "Es fehlen die benötigten Rechte für diese Operation"
-
-#: ../client/pk-import-desktop.c:298
-#: ../client/pk-import-specspo.c:173
-#, c-format
-msgid "Could not open database: %s"
-msgstr "Datenbank konnte nicht geöffnet werden: %s"
-
-#: ../client/pk-import-desktop.c:299
-#: ../client/pk-import-specspo.c:174
-msgid "You probably need to run this program as the root user"
-msgstr "Das Programm muss möglicherweise als Benutzer root ausgeführt werden"
-
-#: ../client/pk-monitor.c:117
-msgid "PackageKit Monitor"
-msgstr "PackageKit Monitor"
-
-#: ../data/packagekit-catalog.xml.in.h:1
-msgid "PackageKit Catalog"
-msgstr "PackageKit-Katalog"
-
-#: ../src/pk-main.c:83
-msgid "Startup failed due to security policies on this machine."
-msgstr "Start auf Grund einer Sicherheitsrichtlinie fehlgeschlagen."
-
-#: ../src/pk-main.c:84
-msgid "This can happen for two reasons:"
-msgstr "Dies kann zwei Gründe haben:"
-
-#: ../src/pk-main.c:85
-msgid "The correct user is not launching the executable (usually root)"
-msgstr "Das Programm wurde nicht vom richtigen Benutzer gestartet (normalerweise root)"
-
-#: ../src/pk-main.c:86
-msgid "The org.freedesktop.PackageKit.conf file is not installed in the system /etc/dbus-1/system.d directory"
-msgstr "Die Datei org.freedesktop.PackageKit.conf ist nicht im Verzeichnis /etc/dbus-1/system.d installiert"
-
-#: ../src/pk-main.c:185
-msgid "Packaging backend to use, e.g. dummy"
-msgstr "zu nutzendes Paketverwaltungsmodul, z.B. dummy"
-
-#: ../src/pk-main.c:187
-msgid "Daemonize and detach from the terminal"
-msgstr "Als Dienst starten und vom Terminal trennen"
-
-#: ../src/pk-main.c:191
-msgid "Disable the idle timer"
-msgstr "Den IDLE-Zeitnehmer deaktivieren"
-
-#: ../src/pk-main.c:193
-msgid "Show version and exit"
-msgstr "Version anzeigen und beenden"
-
-#: ../src/pk-main.c:195
-msgid "Exit after a small delay"
-msgstr "Nach einer kurzen Zeitspanne beenden"
-
-#: ../src/pk-main.c:197
-msgid "Exit after the engine has loaded"
-msgstr "Beenden nachdem die Funktionseinheit geladen wurde"
-
-#: ../src/pk-main.c:207
-msgid "PackageKit service"
-msgstr "PackageKit-Dienst"
-
-#: ../src/pk-main.c:233
-msgid "Cannot connect to the system bus"
-msgstr "Es konnte nicht zum System-Bus verbunden werden"
-
-#: ../src/pk-main.c:273
-#, c-format
-msgid "Error trying to start: %s\n"
-msgstr "Fehler beim Versuch zu starten: %s\n"
-
-#~ msgid "Could not find a description for this package"
-#~ msgstr "Die Beschreibung für dieses Paket konnten nicht ermittelt werden"
-#~ msgid "You need to specify a package to find the description for"
-#~ msgstr ""
-#~ "Es muss ein Paket angegeben werden zu dem die Beschreibung gefunden "
-#~ "werden soll"
-#~ msgid "Accept EULA"
-#~ msgstr "EULA akzeptieren"
-#~ msgid "Authentication is required to accept a EULA"
-#~ msgstr "eine Authentifikation ist erforderlich zum akzeptieren der EULA"
-#~ msgid "Authentication is required to change software source parameters"
-#~ msgstr "eine Authentifikation ist erforderlich um Softwarequellen zu ändern"
-#~ msgid "Authentication is required to install a local file"
+
+#. USAGE_STRING describes the command-line args of this program.
+#: ../run_init/run_init.c:67
+msgid ""
+"USAGE: run_init <script> <args ...>\n"
+"  where: <script> is the name of the init script to run,\n"
+"         <args ...> are the arguments to that script."
+msgstr ""
+"VERWENDUNG: run_init <script> <args ...>\n"
+"  dabei ist <script> der Name des Init-Skripts, das Sie ausführen möchten und\n"
+"            <args ...> sind die Argumente für dieses Skript."
+
+#: ../run_init/run_init.c:126
+#: ../newrole/newrole.c:1187
+#, c-format
+msgid "failed to initialize PAM\n"
+msgstr "Initialisieren von PAM fehlgeschlagen\n"
+
+#: ../run_init/run_init.c:139
+#, c-format
+msgid "failed to get account information\n"
+msgstr "Konnte keine Account-Informationen abrufen\n"
+
+#: ../run_init/run_init.c:162
+#: ../newrole/newrole.c:338
+msgid "Password:"
+msgstr "Passwort:"
+
+#: ../run_init/run_init.c:197
+#: ../newrole/newrole.c:363
+#, c-format
+msgid "Cannot find your entry in the shadow passwd file.\n"
+msgstr "Konnte Ihren Eintrag in der \"shadow\"-Passwortdatei nicht finden.\n"
+
+#: ../run_init/run_init.c:203
+#: ../newrole/newrole.c:370
+#, c-format
+msgid "getpass cannot open /dev/tty\n"
+msgstr "getpass kann /dev/tty nicht öffnen\n"
+
+#: ../run_init/run_init.c:275
+#, c-format
+msgid "run_init: incorrect password for %s\n"
+msgstr "run_init: falsches Passwort für %s\n"
+
+#: ../run_init/run_init.c:309
+#, c-format
+msgid "Could not open file %s\n"
+msgstr "Konnte Datei %s nicht öffnen\n"
+
+#: ../run_init/run_init.c:336
+#, c-format
+msgid "No context in file %s\n"
+msgstr "Kein Kontext in Datei %s\n"
+
+#: ../run_init/run_init.c:361
+#, c-format
+msgid "Sorry, run_init may be used only on a SELinux kernel.\n"
+msgstr "Entschuldigung, run_init sollte nur auf einem SELinux-Kernel benutzt werden.\n"
+
+#: ../run_init/run_init.c:380
+#, c-format
+msgid "authentication failed.\n"
+msgstr "Authentifizierung fehlgeschlagen.\n"
+
+#: ../run_init/run_init.c:405
+#: ../newrole/newrole.c:1321
+#, c-format
+msgid "Could not set exec context to %s.\n"
+msgstr "Konnte exec-Kontext nicht auf %s setzen.\n"
+
+#: ../audit2allow/audit2allow:217
+msgid "******************** IMPORTANT ***********************\n"
+msgstr "******************** WICHTIG ***********************\n"
+
+#: ../audit2allow/audit2allow:218
+msgid "To make this policy package active, execute:"
+msgstr "Um dieses Richtlinien-Paket zu aktivieren, führen sie folgendes aus:"
+
+#: ../audit2allow/audit2allow:219
+#, c-format
+msgid ""
+"\n"
+"\n"
+"semodule -i %s\n"
+"\n"
+msgstr ""
+"\n"
+"\n"
+"semodule -i %s\n"
+"\n"
+
+#: ../semanage/seobject.py:113
+#: ../semanage/seobject.py:117
+msgid "global"
+msgstr "global"
+
+#: ../semanage/seobject.py:172
+msgid "translations not supported on non-MLS machines"
+msgstr "Übersetzungen auf Nicht-MLS Machinen werden nicht unterstützt"
+
+#: ../semanage/seobject.py:179
+#, python-format
+msgid "Unable to open %s: translations not supported on non-MLS machines: %s"
+msgstr "Öffnen von %s fehlgeschlagen: Übersetzungen auf Nicht-MLS Machinen werden nicht unterstützt: %s"
+
+#: ../semanage/seobject.py:212
+msgid "Level"
+msgstr "Level"
+
+#: ../semanage/seobject.py:212
+#: ../gui/system-config-selinux.glade.h:58
+#: ../gui/translationsPage.py:43
+#: ../gui/translationsPage.py:59
+msgid "Translation"
+msgstr "Ãœbersetzung"
+
+#: ../semanage/seobject.py:220
+#: ../semanage/seobject.py:234
+#, python-format
+msgid "Translations can not contain spaces '%s' "
+msgstr "Übersetzungen können keine Leerfelder enthalten '%s'"
+
+#: ../semanage/seobject.py:223
+#, python-format
+msgid "Invalid Level '%s' "
+msgstr "Ungültiges Level '%s'"
+
+#: ../semanage/seobject.py:226
+#, python-format
+msgid "%s already defined in translations"
+msgstr "%s ist bereits in Ãœbersetzungen festgelegt"
+
+#: ../semanage/seobject.py:238
+#, python-format
+msgid "%s not defined in translations"
+msgstr "%s ist nicht in Ãœbersetzungen festgelegt"
+
+#: ../semanage/seobject.py:266
+msgid "Permissive Types"
+msgstr "Permissive Typen"
+
+#: ../semanage/seobject.py:316
+msgid "Could not create semanage handle"
+msgstr "semanage-Handle konnte nicht erstellt werden"
+
+#: ../semanage/seobject.py:325
+msgid "SELinux policy is not managed or store cannot be accessed."
+msgstr "SELinux-Richtlinie wird nicht verwaltet oder auf den Speicher kann nicht zugegriffen werden."
+
+#: ../semanage/seobject.py:330
+msgid "Cannot read policy store."
+msgstr "Kann Richtlinien-Speicher nicht lesen"
+
+#: ../semanage/seobject.py:335
+msgid "Could not establish semanage connection"
+msgstr "Konnte semanage-Verbindung nicht herstellen"
+
+#: ../semanage/seobject.py:337
+msgid "Not yet implemented"
+msgstr "Noch nicht implementiert"
+
+#: ../semanage/seobject.py:357
+#: ../semanage/seobject.py:415
+#: ../semanage/seobject.py:462
+#: ../semanage/seobject.py:545
+#: ../semanage/seobject.py:614
+#: ../semanage/seobject.py:674
+#: ../semanage/seobject.py:892
+#: ../semanage/seobject.py:1260
+#: ../semanage/seobject.py:1324
+#: ../semanage/seobject.py:1338
+#: ../semanage/seobject.py:1416
+#: ../semanage/seobject.py:1455
+#: ../semanage/seobject.py:1495
+#, python-format
+msgid "Could not create a key for %s"
+msgstr "Konnte keinen Schlüssel für %s erstellen"
+
+#: ../semanage/seobject.py:361
+#: ../semanage/seobject.py:419
+#: ../semanage/seobject.py:466
+#: ../semanage/seobject.py:472
+#, python-format
+msgid "Could not check if login mapping for %s is defined"
+msgstr "Konnte nicht überprüfen ob die Login-Zuweisung für %s zugewiesen ist"
+
+#: ../semanage/seobject.py:363
+#, python-format
+msgid "Login mapping for %s is already defined"
+msgstr "Login-Zuordung für %s ist bereits festgelegt"
+
+#: ../semanage/seobject.py:367
+#, python-format
+msgid "Linux User %s does not exist"
+msgstr "Linux-Benutzer %s existiert nicht"
+
+#: ../semanage/seobject.py:371
+#, python-format
+msgid "Could not create login mapping for %s"
+msgstr "Login-Zuweisung für %s konnte nicht erstellt werden"
+
+#: ../semanage/seobject.py:375
+#: ../semanage/seobject.py:559
+#, python-format
+msgid "Could not set name for %s"
+msgstr "Bezeichnung für %s konnte nicht gesetzt werden"
+
+#: ../semanage/seobject.py:380
+#: ../semanage/seobject.py:569
+#, python-format
+msgid "Could not set MLS range for %s"
+msgstr "MLS-Bereich für %s konnte nicht gesetzt werden"
+
+#: ../semanage/seobject.py:384
+#, python-format
+msgid "Could not set SELinux user for %s"
+msgstr "SELinux-Benutzer für %s konnte nicht gesetzt werden"
+
+#: ../semanage/seobject.py:388
+#: ../semanage/seobject.py:440
+#: ../semanage/seobject.py:478
+#: ../semanage/seobject.py:583
+#: ../semanage/seobject.py:651
+#: ../semanage/seobject.py:690
+#: ../semanage/seobject.py:820
+#: ../semanage/seobject.py:862
+#: ../semanage/seobject.py:882
+#: ../semanage/seobject.py:919
+#: ../semanage/seobject.py:1052
+#: ../semanage/seobject.py:1093
+#: ../semanage/seobject.py:1125
+#: ../semanage/seobject.py:1238
+#: ../semanage/seobject.py:1296
+#: ../semanage/seobject.py:1316
+#: ../semanage/seobject.py:1354
+#: ../semanage/seobject.py:1436
+#: ../semanage/seobject.py:1471
+#: ../semanage/seobject.py:1489
+msgid "Could not start semanage transaction"
+msgstr "semanage-Transaktion konnte nicht gestartet werden"
+
+#: ../semanage/seobject.py:392
+#: ../semanage/seobject.py:396
+#, python-format
+msgid "Could not add login mapping for %s"
+msgstr "Login-Zuweisung für %s konnte nicht hinzugefügt werden"
+
+#: ../semanage/seobject.py:399
+#: ../semanage/seobject.py:402
+msgid "add SELinux user mapping"
+msgstr "SELinux-Benutzerzuordnung hinzufügen"
+
+#: ../semanage/seobject.py:411
+msgid "Requires seuser or serange"
+msgstr "Benötigt seuser oder serange"
+
+#: ../semanage/seobject.py:421
+#: ../semanage/seobject.py:468
+#, python-format
+msgid "Login mapping for %s is not defined"
+msgstr "Login-Zuordnung für %s ist nicht definiert"
+
+#: ../semanage/seobject.py:425
+#, python-format
+msgid "Could not query seuser for %s"
+msgstr "Konnte seuser für %s nicht abfragen"
+
+#: ../semanage/seobject.py:444
+#: ../semanage/seobject.py:448
+#, python-format
+msgid "Could not modify login mapping for %s"
+msgstr "Konnte Login-Zuweisung für %s nicht ändern"
+
+#: ../semanage/seobject.py:474
+#, python-format
+msgid "Login mapping for %s is defined in policy, cannot be deleted"
+msgstr "Login-Zuordnung für %s ist in der Richtlinie festgelegt und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:483
+#: ../semanage/seobject.py:487
+#, python-format
+msgid "Could not delete login mapping for %s"
+msgstr "Konnte Login-Zuweisung für %s nicht löschen"
+
+#: ../semanage/seobject.py:503
+msgid "Could not list login mappings"
+msgstr "Konnte Login-Zuweisungen nicht anzeigen"
+
+#: ../semanage/seobject.py:516
+#: ../semanage/seobject.py:521
+#: ../gui/system-config-selinux.glade.h:31
+msgid "Login Name"
+msgstr "Benutzername:"
+
+#: ../semanage/seobject.py:516
+#: ../semanage/seobject.py:521
+#: ../semanage/seobject.py:733
+#: ../semanage/seobject.py:738
+#: ../gui/system-config-selinux.glade.h:50
+msgid "SELinux User"
+msgstr "SELinux-User"
+
+#: ../semanage/seobject.py:516
+#: ../gui/system-config-selinux.glade.h:35
+msgid "MLS/MCS Range"
+msgstr "MLS/MCS Bereich"
+
+#: ../semanage/seobject.py:549
+#: ../semanage/seobject.py:618
+#: ../semanage/seobject.py:678
+#: ../semanage/seobject.py:684
+#, python-format
+msgid "Could not check if SELinux user %s is defined"
+msgstr "Konnte nicht überprüfen ob SELinux-Benutzer %s definiert ist"
+
+#: ../semanage/seobject.py:551
+#, python-format
+msgid "SELinux user %s is already defined"
+msgstr "SELinux-Benutzer %s ist bereits angelegt"
+
+#: ../semanage/seobject.py:555
+#, python-format
+msgid "Could not create SELinux user for %s"
+msgstr "Konnte SELinux-Benutzer für %s nicht erstellen"
+
+#: ../semanage/seobject.py:564
+#, python-format
+msgid "Could not add role %s for %s"
+msgstr "Konnte Funktion %s für %s nicht hinzufügen"
+
+#: ../semanage/seobject.py:573
+#, python-format
+msgid "Could not set MLS level for %s"
+msgstr "Konnte MLS-Level für %s nicht setzen"
+
+#: ../semanage/seobject.py:576
+#, python-format
+msgid "Could not add prefix %s for %s"
+msgstr "Konnte Präfix %s für %s nicht hinzufügen"
+
+#: ../semanage/seobject.py:579
+#, python-format
+msgid "Could not extract key for %s"
+msgstr "Konnte Schlüssel für %s nicht extrahieren"
+
+#: ../semanage/seobject.py:587
+#: ../semanage/seobject.py:591
+#, python-format
+msgid "Could not add SELinux user %s"
+msgstr "Konnte SELinux-Benutzer %s nicht hinzufügen"
+
+#: ../semanage/seobject.py:608
+msgid "Requires prefix, roles, level or range"
+msgstr "Benötigt Präfix, Funktionen, Level oder Bereich"
+
+#: ../semanage/seobject.py:610
+msgid "Requires prefix or roles"
+msgstr "Benötigt Präfix oder Funktionen"
+
+#: ../semanage/seobject.py:620
+#: ../semanage/seobject.py:680
+#, python-format
+msgid "SELinux user %s is not defined"
+msgstr "SELinux-Benutzer %s ist nicht definiert"
+
+#: ../semanage/seobject.py:624
+#, python-format
+msgid "Could not query user for %s"
+msgstr "Konnte Benutzer für %s nicht abfragen"
+
+#: ../semanage/seobject.py:655
+#: ../semanage/seobject.py:659
+#, python-format
+msgid "Could not modify SELinux user %s"
+msgstr "Konnte SELinux-Benutzer %s nicht ändern"
+
+#: ../semanage/seobject.py:686
+#, python-format
+msgid "SELinux user %s is defined in policy, cannot be deleted"
+msgstr "SELinux-Benutzer %s ist in der Richtlinie definiert und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:694
+#: ../semanage/seobject.py:698
+#, python-format
+msgid "Could not delete SELinux user %s"
+msgstr "Konnte SELinux-Benutzer %s nicht löschen"
+
+#: ../semanage/seobject.py:713
+msgid "Could not list SELinux users"
+msgstr "Konnte SELinux-Benutzer nicht auflisten"
+
+#: ../semanage/seobject.py:719
+#, python-format
+msgid "Could not list roles for user %s"
+msgstr "Konnte Funktionen für Benutzer %s nicht auflisten"
+
+#: ../semanage/seobject.py:732
+msgid "Labeling"
+msgstr "Kennzeichnung"
+
+#: ../semanage/seobject.py:732
+msgid "MLS/"
+msgstr "MLS/"
+
+#: ../semanage/seobject.py:733
+msgid "Prefix"
+msgstr "Präfix"
+
+#: ../semanage/seobject.py:733
+msgid "MCS Level"
+msgstr "MCS-Stufe"
+
+#: ../semanage/seobject.py:733
+msgid "MCS Range"
+msgstr "MCS-Bereich"
+
+#: ../semanage/seobject.py:733
+#: ../semanage/seobject.py:738
+#: ../gui/system-config-selinux.glade.h:48
+#: ../gui/usersPage.py:59
+msgid "SELinux Roles"
+msgstr "SELinux-Rollen"
+
+#: ../semanage/seobject.py:753
+msgid "Protocol udp or tcp is required"
+msgstr "Protokoll UDP oder TCP wird benötigt"
+
+#: ../semanage/seobject.py:755
+msgid "Port is required"
+msgstr "Port wird benötigt"
+
+#: ../semanage/seobject.py:766
+#, python-format
+msgid "Could not create a key for %s/%s"
+msgstr "Konnte Schlüssel für %s/%s nicht erstellen"
+
+#: ../semanage/seobject.py:777
+msgid "Type is required"
+msgstr "Typ wird benötigt"
+
+#: ../semanage/seobject.py:783
+#: ../semanage/seobject.py:845
+#: ../semanage/seobject.py:907
+#: ../semanage/seobject.py:913
+#, python-format
+msgid "Could not check if port %s/%s is defined"
+msgstr "Konnte nicht prüfen, ob Port %s/%s definiert ist"
+
+#: ../semanage/seobject.py:785
+#, python-format
+msgid "Port %s/%s already defined"
+msgstr "Port %s/%s ist bereits definiert"
+
+#: ../semanage/seobject.py:789
+#, python-format
+msgid "Could not create port for %s/%s"
+msgstr "Konnte Port für %s/%s nicht erstellen"
+
+#: ../semanage/seobject.py:795
+#, python-format
+msgid "Could not create context for %s/%s"
+msgstr "Konnte Kontext für %s/%s nicht erstellen"
+
+#: ../semanage/seobject.py:799
+#, python-format
+msgid "Could not set user in port context for %s/%s"
+msgstr "Konnte Benutzer in Port-Kontext für %s/%s nicht setzen"
+
+#: ../semanage/seobject.py:803
+#, python-format
+msgid "Could not set role in port context for %s/%s"
+msgstr "Konnte Funktion in Port-Kontext für %s/%s nicht setzen"
+
+#: ../semanage/seobject.py:807
+#, python-format
+msgid "Could not set type in port context for %s/%s"
+msgstr "Konnte Typ in Port-Kontext für %s/%s nicht setzen"
+
+#: ../semanage/seobject.py:812
+#, python-format
+msgid "Could not set mls fields in port context for %s/%s"
+msgstr "Konnte MLS-Felder in Port-Kontext für %s/%s nicht setzen"
+
+#: ../semanage/seobject.py:816
+#, python-format
+msgid "Could not set port context for %s/%s"
+msgstr "Konnte Port-Kontext für %s/%s nicht setzen"
+
+#: ../semanage/seobject.py:824
+#: ../semanage/seobject.py:828
+#, python-format
+msgid "Could not add port %s/%s"
+msgstr "Konnte Port %s/%s nicht hinzufügen"
+
+#: ../semanage/seobject.py:837
+#: ../semanage/seobject.py:1068
+msgid "Requires setype or serange"
+msgstr "Benötigt setype oder serange"
+
+#: ../semanage/seobject.py:839
+msgid "Requires setype"
+msgstr "Benötigt setype"
+
+#: ../semanage/seobject.py:847
+#: ../semanage/seobject.py:909
+#, python-format
+msgid "Port %s/%s is not defined"
+msgstr "Port %s/%s ist nicht definiert"
+
+#: ../semanage/seobject.py:851
+#, python-format
+msgid "Could not query port %s/%s"
+msgstr "Konnte Port %s/%s nicht abfragen"
+
+#: ../semanage/seobject.py:866
+#: ../semanage/seobject.py:870
+#, python-format
+msgid "Could not modify port %s/%s"
+msgstr "Konnte Port %s/%s nicht ändern"
+
+#: ../semanage/seobject.py:878
+msgid "Could not list the ports"
+msgstr "Konnte Ports nicht auflisten"
+
+#: ../semanage/seobject.py:896
+#, python-format
+msgid "Could not delete the port %s"
+msgstr "Konnte Port %s nicht löschen"
+
+#: ../semanage/seobject.py:901
+#, python-format
+msgid "Could not delete the %s"
+msgstr "Konnte %s nicht löschen"
+
+#: ../semanage/seobject.py:915
+#, python-format
+msgid "Port %s/%s is defined in policy, cannot be deleted"
+msgstr "Port %s/%s ist in der Richtlinie festgelegt und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:923
+#: ../semanage/seobject.py:927
+#, python-format
+msgid "Could not delete port %s/%s"
+msgstr "Konnte Port %s/%s nicht löschen"
+
+#: ../semanage/seobject.py:938
+#: ../semanage/seobject.py:960
+msgid "Could not list ports"
+msgstr "Konnte Ports nicht auflisten"
+
+#: ../semanage/seobject.py:981
+msgid "SELinux Port Type"
+msgstr "SELinux Port-Typ"
+
+#: ../semanage/seobject.py:981
+msgid "Proto"
+msgstr "Proto"
+
+#: ../semanage/seobject.py:981
+#: ../gui/system-config-selinux.glade.h:40
+msgid "Port Number"
+msgstr "Port-Nummer"
+
+#: ../semanage/seobject.py:1004
+#: ../semanage/seobject.py:1202
+msgid "SELinux Type is required"
+msgstr "SELinux-Typ wird benötigt"
+
+#: ../semanage/seobject.py:1008
+#: ../semanage/seobject.py:1072
+#: ../semanage/seobject.py:1109
+#: ../semanage/seobject.py:1206
+#, python-format
+msgid "Could not create key for %s"
+msgstr "Konnte Schlüssel für %s nicht kreieren"
+
+#: ../semanage/seobject.py:1012
+#: ../semanage/seobject.py:1076
+#: ../semanage/seobject.py:1113
+#: ../semanage/seobject.py:1119
+#, python-format
+msgid "Could not check if interface %s is defined"
+msgstr "Konnte nicht überprüfen, ob die Schnittstelle %s definiert ist"
+
+#: ../semanage/seobject.py:1014
+#, python-format
+msgid "Interface %s already defined"
+msgstr "Schnittstelle %s ist bereits definiert"
+
+#: ../semanage/seobject.py:1018
+#, python-format
+msgid "Could not create interface for %s"
+msgstr "Konnte keine Schnittstelle für %s kreieren"
+
+#: ../semanage/seobject.py:1023
+#: ../semanage/seobject.py:1172
+#, python-format
+msgid "Could not create context for %s"
+msgstr "Konnte keinen Kontext für %s kreieren"
+
+#: ../semanage/seobject.py:1027
+#, python-format
+msgid "Could not set user in interface context for %s"
+msgstr "Konnte Benutzer in Schnittstellen-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1031
+#, python-format
+msgid "Could not set role in interface context for %s"
+msgstr "Konnte Aufgabe in Schnittstellen-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1035
+#, python-format
+msgid "Could not set type in interface context for %s"
+msgstr "Konnte Typ in Schnittstellen-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1040
+#, python-format
+msgid "Could not set mls fields in interface context for %s"
+msgstr "Konnte die mls-Felder in Schnittstellen-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1044
+#, python-format
+msgid "Could not set interface context for %s"
+msgstr "Konnte Schnittstellen-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1048
+#, python-format
+msgid "Could not set message context for %s"
+msgstr "Konnte Nachricht-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1056
+#: ../semanage/seobject.py:1060
+#, python-format
+msgid "Could not add interface %s"
+msgstr "Konnte Schnittstelle %s nicht hinzufügen"
+
+#: ../semanage/seobject.py:1078
+#: ../semanage/seobject.py:1115
+#, python-format
+msgid "Interface %s is not defined"
+msgstr "Schnittstelle %s ist nicht definiert"
+
+#: ../semanage/seobject.py:1082
+#, python-format
+msgid "Could not query interface %s"
+msgstr "Konnte Schnittstelle %s nicht abfragen"
+
+#: ../semanage/seobject.py:1097
+#: ../semanage/seobject.py:1101
+#, python-format
+msgid "Could not modify interface %s"
+msgstr "Konnte Schnittstelle %s nicht modifizieren"
+
+#: ../semanage/seobject.py:1121
+#, python-format
+msgid "Interface %s is defined in policy, cannot be deleted"
+msgstr "Schnittstelle %s ist in der Richtlinie festgelegt und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:1129
+#: ../semanage/seobject.py:1133
+#, python-format
+msgid "Could not delete interface %s"
+msgstr "Konnte Schnittstelle %s nicht löschen"
+
+#: ../semanage/seobject.py:1144
+msgid "Could not list interfaces"
+msgstr "Konnte Schnittstellen nicht auflisten"
+
+#: ../semanage/seobject.py:1154
+msgid "SELinux Interface"
+msgstr "SELinux-Schnittstelle"
+
+#: ../semanage/seobject.py:1154
+#: ../semanage/seobject.py:1395
+msgid "Context"
+msgstr "Inhalt"
+
+#: ../semanage/seobject.py:1178
+#, python-format
+msgid "Could not set user in file context for %s"
+msgstr "Konnte Benutzer in Datei-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1182
+#, python-format
+msgid "Could not set role in file context for %s"
+msgstr "Konnte Aufgabe in Datei-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1187
+#: ../semanage/seobject.py:1229
+#, python-format
+msgid "Could not set mls fields in file context for %s"
+msgstr "Konnte die mls-Felder in Datei-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1193
+msgid "Invalid file specification"
+msgstr "Ungültige Dateiangabe"
+
+#: ../semanage/seobject.py:1210
+#: ../semanage/seobject.py:1264
+#: ../semanage/seobject.py:1342
+#: ../semanage/seobject.py:1346
+#, python-format
+msgid "Could not check if file context for %s is defined"
+msgstr "Konnte nicht überprüfen, ob Datei-Kontext für %s definiert ist"
+
+#: ../semanage/seobject.py:1212
+#, python-format
+msgid "File context for %s already defined"
+msgstr "Datei-Kontext für %s ist bereits definiert"
+
+#: ../semanage/seobject.py:1216
+#, python-format
+msgid "Could not create file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht kreieren"
+
+#: ../semanage/seobject.py:1224
+#, python-format
+msgid "Could not set type in file context for %s"
+msgstr "Konnte Typ in Datei-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1232
+#: ../semanage/seobject.py:1288
+#: ../semanage/seobject.py:1292
+#, python-format
+msgid "Could not set file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht setzen"
+
+#: ../semanage/seobject.py:1242
+#: ../semanage/seobject.py:1246
+#, python-format
+msgid "Could not add file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht hinzufügen"
+
+#: ../semanage/seobject.py:1255
+msgid "Requires setype, serange or seuser"
+msgstr "Benötigt setype, serange oder seuser"
+
+#: ../semanage/seobject.py:1266
+#: ../semanage/seobject.py:1350
+#, python-format
+msgid "File context for %s is not defined"
+msgstr "Datei-Kontext für %s ist nicht definiert"
+
+#: ../semanage/seobject.py:1270
+#, python-format
+msgid "Could not query file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht abfragen"
+
+#: ../semanage/seobject.py:1300
+#: ../semanage/seobject.py:1304
+#, python-format
+msgid "Could not modify file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht erneuern"
+
+#: ../semanage/seobject.py:1312
+msgid "Could not list the file contexts"
+msgstr "Konnte Datei-Kontexte nicht auflisten"
+
+#: ../semanage/seobject.py:1328
+#: ../semanage/seobject.py:1333
+#, python-format
+msgid "Could not delete the file context %s"
+msgstr "Konnte Datei-Kontext für %s nicht löschen"
+
+#: ../semanage/seobject.py:1348
+#, python-format
+msgid "File context for %s is defined in policy, cannot be deleted"
+msgstr "Der Kontext für Datei %s ist in der Richtlinie festgelegt und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:1358
+#: ../semanage/seobject.py:1362
+#, python-format
+msgid "Could not delete file context for %s"
+msgstr "Konnte Datei-Kontext für %s nicht löschen"
+
+#: ../semanage/seobject.py:1373
+msgid "Could not list file contexts"
+msgstr "Konnte Datei-Kontexte nicht auflisten"
+
+#: ../semanage/seobject.py:1377
+msgid "Could not list local file contexts"
+msgstr "Konnte lokale Datei-Kontexte nicht auflisten"
+
+#: ../semanage/seobject.py:1395
+msgid "SELinux fcontext"
+msgstr "SELinux-fcontext"
+
+#: ../semanage/seobject.py:1395
+msgid "type"
+msgstr "Typ"
+
+#: ../semanage/seobject.py:1412
+msgid "Requires value"
+msgstr "Benötigt einen Wert"
+
+#: ../semanage/seobject.py:1420
+#: ../semanage/seobject.py:1459
+#: ../semanage/seobject.py:1465
+#, python-format
+msgid "Could not check if boolean %s is defined"
+msgstr "Konnte nicht überprüfen, ob Boolesch %s definiert ist"
+
+#: ../semanage/seobject.py:1422
+#: ../semanage/seobject.py:1461
+#, python-format
+msgid "Boolean %s is not defined"
+msgstr "Boolescher Wert %s ist nicht definiert"
+
+#: ../semanage/seobject.py:1426
+#, python-format
+msgid "Could not query file context %s"
+msgstr "Konnte den Datei-Kontext %s nicht abfragen"
+
+#: ../semanage/seobject.py:1432
+msgid "You must specify a value"
+msgstr "Sie müssen einen Wert angeben"
+
+#: ../semanage/seobject.py:1440
+#, python-format
+msgid "Could not set active value of boolean %s"
+msgstr "Konnte Boolesch %s nicht auf aktiv setzen"
+
+#: ../semanage/seobject.py:1443
+#: ../semanage/seobject.py:1447
+#, python-format
+msgid "Could not modify boolean %s"
+msgstr "Konnte Boolesch %s nicht erneuern"
+
+#: ../semanage/seobject.py:1467
+#, python-format
+msgid "Boolean %s is defined in policy, cannot be deleted"
+msgstr "Boolescher Wert %s ist in der Richtlinie festgelegt und kann nicht entfernt werden"
+
+#: ../semanage/seobject.py:1475
+#: ../semanage/seobject.py:1479
+#: ../semanage/seobject.py:1499
+#: ../semanage/seobject.py:1504
+#, python-format
+msgid "Could not delete boolean %s"
+msgstr "Konnte Boolesch %s nicht löschen"
+
+#: ../semanage/seobject.py:1485
+#: ../semanage/seobject.py:1512
+msgid "Could not list booleans"
+msgstr "Konnte Boolesche Werte nicht auflisten"
+
+#: ../semanage/seobject.py:1531
+msgid "unknown"
+msgstr "unbekannt"
+
+#: ../semanage/seobject.py:1534
+msgid "off"
+msgstr "aus"
+
+#: ../semanage/seobject.py:1534
+msgid "on"
+msgstr "ein"
+
+#: ../semanage/seobject.py:1536
+msgid "SELinux boolean"
+msgstr "SELinux Wahrheitswert"
+
+#: ../semanage/seobject.py:1536
+#: ../gui/polgen.glade.h:18
+#: ../gui/polgengui.py:169
+msgid "Description"
+msgstr "Beschreibung"
+
+#: ../newrole/newrole.c:198
+#, c-format
+msgid "failed to set PAM_TTY\n"
+msgstr "Einstellung von PAM_TTY fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:287
+#, c-format
+msgid "newrole: service name configuration hashtable overflow\n"
+msgstr "newrole: Hashtable-Overflow der Konfiguration des Namens des Dienstes\n"
+
+#: ../newrole/newrole.c:297
+#, c-format
+msgid "newrole:  %s:  error on line %lu.\n"
+msgstr "newrole:  %s:  Fehler in Zeile %lu.\n"
+
+#: ../newrole/newrole.c:436
+#, c-format
+msgid "cannot find valid entry in the passwd file.\n"
+msgstr "Kann keinen gültigen Eintrag in der \"passwd\"-Datei finden.\n"
+
+#: ../newrole/newrole.c:447
+#, c-format
+msgid "Out of memory!\n"
+msgstr "Nicht genügend Speicher!\n"
+
+#: ../newrole/newrole.c:452
+#, c-format
+msgid "Error!  Shell is not valid.\n"
+msgstr "Fehler! Shell ist ungültig.\n"
+
+#: ../newrole/newrole.c:509
+#, c-format
+msgid "Unable to clear environment\n"
+msgstr "Kann Umgebung nicht löschen\n"
+
+#: ../newrole/newrole.c:556
+#: ../newrole/newrole.c:634
+#, c-format
+msgid "Error initing capabilities, aborting.\n"
+msgstr "Fehler bei der Funktions-Initialisierung, Abbruch.\n"
+
+#: ../newrole/newrole.c:564
+#: ../newrole/newrole.c:640
+#, c-format
+msgid "Error setting capabilities, aborting\n"
+msgstr "Fehler bei der Leistungsinitialisierung, Abbruch.\n"
+
+#: ../newrole/newrole.c:570
+#, c-format
+msgid "Error setting KEEPCAPS, aborting\n"
+msgstr "Fehler bei der KEEPCAPS-Einrichtung, Abbruch\n"
+
+#: ../newrole/newrole.c:578
+#: ../newrole/newrole.c:652
+#, c-format
+msgid "Error dropping capabilities, aborting\n"
+msgstr "Fehler beim Verwerfen von Funktionen.\n"
+
+#: ../newrole/newrole.c:584
+#: ../newrole/newrole.c:683
+#, c-format
+msgid "Error changing uid, aborting.\n"
+msgstr "Fehler beim Ändern der Benutzerkennung (uid), Abbruch.\n"
+
+#: ../newrole/newrole.c:590
+#: ../newrole/newrole.c:646
+#: ../newrole/newrole.c:678
+#, c-format
+msgid "Error resetting KEEPCAPS, aborting\n"
+msgstr "Fehler beim zurücksetzen von KEEPCAPS, Abbruch\n"
+
+#: ../newrole/newrole.c:597
+#, c-format
+msgid "Error dropping SETUID capability, aborting\n"
+msgstr "Fehler beim Verwerfen der SETUID-Funktion, Abbruch.\n"
+
+#: ../newrole/newrole.c:602
+#: ../newrole/newrole.c:657
+#, c-format
+msgid "Error freeing caps\n"
+msgstr "Fehler beim Lösen von Caps\n"
+
+#: ../newrole/newrole.c:701
+#, c-format
+msgid "Error connecting to audit system.\n"
+msgstr "Fehler beim Verbinden für Systemprüfung.\n"
+
+#: ../newrole/newrole.c:707
+#, c-format
+msgid "Error allocating memory.\n"
+msgstr "Fehler beim Reservieren des Speichers.\n"
+
+#: ../newrole/newrole.c:714
+#, c-format
+msgid "Error sending audit message.\n"
+msgstr "Fehler beim Senden der Prüfungsmeldung.\n"
+
+#: ../newrole/newrole.c:758
+#: ../newrole/newrole.c:1122
+#, c-format
+msgid "Could not determine enforcing mode.\n"
+msgstr "Konnte Enforcing-Modus nicht beenden.\n"
+
+#: ../newrole/newrole.c:765
+#, c-format
+msgid "Error!  Could not open %s.\n"
+msgstr "Fehler! Konnte %s nicht öffnen.\n"
+
+#: ../newrole/newrole.c:771
+#, c-format
+msgid "%s!  Could not get current context for %s, not relabeling tty.\n"
+msgstr "%s! Erwerb des aktuellen Kontexts für %s fehlgeschlagen. tty wird nicht umbenannt.\n"
+
+#: ../newrole/newrole.c:781
+#, c-format
+msgid "%s!  Could not get new context for %s, not relabeling tty.\n"
+msgstr "%s! Erwerb des neuen Kontexts für %s fehlgeschlagen. tty wird nicht umbenannt.\n"
+
+#: ../newrole/newrole.c:791
+#, c-format
+msgid "%s!  Could not set new context for %s\n"
+msgstr "%s! Konnte neuen Kontext für »%s« nicht setzen.\n"
+
+#: ../newrole/newrole.c:838
+#, c-format
+msgid "%s changed labels.\n"
+msgstr "%s wurde unbenannt.\n"
+
+#: ../newrole/newrole.c:844
+#, c-format
+msgid "Warning! Could not restore context for %s\n"
+msgstr "Warnung! Kontext für %s nicht wiederherstellbar\n"
+
+#: ../newrole/newrole.c:901
+#, c-format
+msgid "Error: multiple roles specified\n"
+msgstr "Fehler: Mehrere Funktionen festgelegt\n"
+
+#: ../newrole/newrole.c:909
+#, c-format
+msgid "Error: multiple types specified\n"
+msgstr "Fehler: mehrere Typen festgelegt\n"
+
+#: ../newrole/newrole.c:916
+#, c-format
+msgid "Sorry, -l may be used with SELinux MLS support.\n"
+msgstr "Entschuldigung, ich sollte nur mit SELinux-MLS-Unterstützung benutzt werden.\n"
+
+#: ../newrole/newrole.c:921
+#, c-format
+msgid "Error: multiple levels specified\n"
+msgstr "Fehler: mehrere Ebenen festgelegt\n"
+
+#: ../newrole/newrole.c:931
+#, c-format
+msgid "Error: you are not allowed to change levels on a non secure terminal \n"
+msgstr "Fehler: Sie dürfen die Stufen an einem unsicheren Terminal nicht verändern \n"
+
+#: ../newrole/newrole.c:957
+#, c-format
+msgid "Couldn't get default type.\n"
+msgstr "Konnte Standardtyp nicht feststellen.\n"
+
+#: ../newrole/newrole.c:967
+#, c-format
+msgid "failed to get new context.\n"
+msgstr "Erwerb des neuen Kontexts fehlgeschlagen.\n"
+
+#: ../newrole/newrole.c:974
+#, c-format
+msgid "failed to set new role %s\n"
+msgstr "Setzen einer neuen Funktion %s fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:981
+#, c-format
+msgid "failed to set new type %s\n"
+msgstr "Setzen des neuen Typs %s fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:991
+#, c-format
+msgid "failed to build new range with level %s\n"
+msgstr "Erstellung von neuem Bereich mit Level %s fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:996
+#, c-format
+msgid "failed to set new range %s\n"
+msgstr "Setzen von neuem Bereich %s fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:1004
+#, c-format
+msgid "failed to convert new context to string\n"
+msgstr "Konvertieren des neuen Kontexts in Zeichenfolge (String) fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:1009
+#, c-format
+msgid "%s is not a valid context\n"
+msgstr "%s ist kein gültiger Kontext\n"
+
+#: ../newrole/newrole.c:1016
+#, c-format
+msgid "Unable to allocate memory for new_context"
+msgstr "Kann keinen Speicher für new_context zuweisen"
+
+#: ../newrole/newrole.c:1042
+#, c-format
+msgid "Unable to obtain empty signal set\n"
+msgstr "Kann keine leere Signalmenge erhalten\n"
+
+#: ../newrole/newrole.c:1050
+#, c-format
+msgid "Unable to set SIGHUP handler\n"
+msgstr "Kann SIGHUP-Handler nicht setzen\n"
+
+#: ../newrole/newrole.c:1116
+#, c-format
+msgid "Sorry, newrole may be used only on a SELinux kernel.\n"
+msgstr "Entschuldigung, diese neue Eingabe sollte nur auf einem SELinux-Kernel benutzt werden.\n"
+
+#: ../newrole/newrole.c:1133
+#, c-format
+msgid "failed to get old_context.\n"
+msgstr "Konnte alten Kontext nicht bekommen.\n"
+
+#: ../newrole/newrole.c:1140
+#, c-format
+msgid "Warning!  Could not retrieve tty information.\n"
+msgstr "Warnung! Konnte tty-Informationen nicht abrufen.\n"
+
+#: ../newrole/newrole.c:1161
+#, c-format
+msgid "error on reading PAM service configuration.\n"
+msgstr "Fehler beim Lesen der PAM-Dienst Konfiguration.\n"
+
+#: ../newrole/newrole.c:1196
+#, c-format
+msgid "newrole: incorrect password for %s\n"
+msgstr "Neue Eingabe: falsches Passwort für %s\n"
+
+#: ../newrole/newrole.c:1223
+#, c-format
+msgid "newrole: failure forking: %s"
+msgstr "newrole: Fork fehlgeschlagen: %s"
+
+#: ../newrole/newrole.c:1226
+#: ../newrole/newrole.c:1249
+#, c-format
+msgid "Unable to restore tty label...\n"
+msgstr "Kann TTY-Label nicht wiederherstellen...\n"
+
+#: ../newrole/newrole.c:1228
+#: ../newrole/newrole.c:1255
+#, c-format
+msgid "Failed to close tty properly\n"
+msgstr "Schliessen von TTY fehlgeschlagen\n"
+
+#: ../newrole/newrole.c:1287
+#, c-format
+msgid "Could not close descriptors.\n"
+msgstr "Konnte Deskriptoren nicht schliessen.\n"
+
+#: ../newrole/newrole.c:1314
+#, c-format
+msgid "Error allocating shell's argv0.\n"
+msgstr "Fehler beim Zuweisen von argv0 für die Shell.\n"
+
+#: ../newrole/newrole.c:1346
+#, c-format
+msgid "Unable to restore the environment, aborting\n"
+msgstr "Kann Umgebung nicht wiederherstellen, Abbruch\n"
+
+#.
+#. * Error path cleanup
+#. *
+#. * If we reach here, then we failed to exec the new shell.
+#.
+#: ../newrole/newrole.c:1357
+msgid "failed to exec shell\n"
+msgstr "Ausführen der Shell fehlgeschlagen\n"
+
+#: ../load_policy/load_policy.c:22
+#, c-format
+msgid "usage:  %s [-qi]\n"
+msgstr "Verwendung:  %s [-qi]\n"
+
+#: ../load_policy/load_policy.c:71
+#, c-format
+msgid "%s:  Policy is already loaded and initial load requested\n"
+msgstr "%s:  Richtlinie bereits geladen und initiale Ladeanforderung\n"
+
+#: ../load_policy/load_policy.c:80
+#, c-format
+msgid "%s:  Can't load policy and enforcing mode requested:  %s\n"
+msgstr "%s:  Kann Richtlinie nicht laden und fordere Zwangsmodus an:  %s\n"
+
+#: ../load_policy/load_policy.c:90
+#, c-format
+msgid "%s:  Can't load policy:  %s\n"
+msgstr "%s: Kann Richtlinie nicht laden: %s\n"
+
+#: ../scripts/chcat:92
+#: ../scripts/chcat:169
+msgid "Requires at least one category"
+msgstr "Benötigt mindestens eine Kategorie"
+
+# Translation of sensitivity fuzzy
+#: ../scripts/chcat:106
+#: ../scripts/chcat:183
+#, c-format
+msgid "Can not modify sensitivity levels using '+' on %s"
+msgstr "Kann Sensivitätsstufe mittels '+' auf %s nicht ändern"
+
+#: ../scripts/chcat:110
+#, c-format
+msgid "%s is already in %s"
+msgstr "%s ist bereits in %s"
+
+#: ../scripts/chcat:188
+#: ../scripts/chcat:198
+#, c-format
+msgid "%s is not in %s"
+msgstr "%s ist nicht in %s"
+
+#: ../scripts/chcat:267
+#: ../scripts/chcat:272
+msgid "Can not combine +/- with other types of categories"
+msgstr "Kann +/- nicht mit anderen Kategorietypen kombinieren"
+
+# Translation of 'sensitivities' fuzzy
+#: ../scripts/chcat:317
+msgid "Can not have multiple sensitivities"
+msgstr "Kann nicht mehrere Empfindlichkeiten besitzen"
+
+#: ../scripts/chcat:323
+#, c-format
+msgid "Usage %s CATEGORY File ..."
+msgstr "Verwendung %s KATEGORIE Datei ..."
+
+#: ../scripts/chcat:324
+#, c-format
+msgid "Usage %s -l CATEGORY user ..."
+msgstr "Verwendung %s -l KATEGORIE Benutzer ..."
+
+#: ../scripts/chcat:325
+#, c-format
+msgid "Usage %s [[+|-]CATEGORY],...]q File ..."
+msgstr "Verwendung %s [[+|-]KATEGORIE],...]q Datei ..."
+
+#: ../scripts/chcat:326
+#, c-format
+msgid "Usage %s -l [[+|-]CATEGORY],...]q user ..."
+msgstr "Verwendung %s -l [[+|-]KATEGORIE],...]q Benutzer ..."
+
+#: ../scripts/chcat:327
+#, c-format
+msgid "Usage %s -d File ..."
+msgstr "Aufruf %s -d Datei ..."
+
+#: ../scripts/chcat:328
+#, c-format
+msgid "Usage %s -l -d user ..."
+msgstr "Verwendung %s -l -d Benutzer ..."
+
+#: ../scripts/chcat:329
+#, c-format
+msgid "Usage %s -L"
+msgstr "Aufruf %s -L"
+
+#: ../scripts/chcat:330
+#, c-format
+msgid "Usage %s -L -l user"
+msgstr "Aufruf: %s -L -l Benutzer"
+
+#: ../scripts/chcat:331
+msgid "Use -- to end option list.  For example"
+msgstr "Benutze -- um die Optionsliste abzuschliessen. Beispiel:"
+
+#: ../scripts/chcat:332
+msgid "chcat -- -CompanyConfidential /docs/businessplan.odt"
+msgstr "chcat -- -Vertraulich /docs/geschaeftsplanung.odt"
+
+#: ../scripts/chcat:333
+msgid "chcat -l +CompanyConfidential juser"
+msgstr "chcat -l +Vertraulich juser"
+
+#: ../scripts/chcat:397
+#, c-format
+msgid "Options Error %s "
+msgstr "Optionsfehler %s"
+
+#: ../gui/booleansPage.py:183
+msgid "Boolean"
+msgstr "Boolesche"
+
+#: ../gui/booleansPage.py:224
+#: ../gui/semanagePage.py:164
+msgid "all"
+msgstr "alle"
+
+#: ../gui/booleansPage.py:226
+#: ../gui/semanagePage.py:166
+#: ../gui/system-config-selinux.glade.h:13
+msgid "Customized"
+msgstr "Angepasst"
+
+#: ../gui/fcontextPage.py:64
+msgid "File Labeling"
+msgstr "Dateikennzeichnung"
+
+#: ../gui/fcontextPage.py:74
+msgid ""
+"File\n"
+"Specification"
+msgstr ""
+"Datei\n"
+"Spezifikation"
+
+#: ../gui/fcontextPage.py:81
+msgid ""
+"Selinux\n"
+"File Type"
+msgstr ""
+"SELinux\n"
+"Datei-Typ"
+
+#: ../gui/fcontextPage.py:88
+msgid ""
+"File\n"
+"Type"
+msgstr ""
+"Datei\n"
+"Typ"
+
+#: ../gui/loginsPage.py:48
+msgid "User Mapping"
+msgstr "Benutzerzuordnung"
+
+#: ../gui/loginsPage.py:52
+msgid ""
+"Login\n"
+"Name"
+msgstr ""
+"Anmelden\n"
+"Name"
+
+#: ../gui/loginsPage.py:56
+#: ../gui/usersPage.py:50
+msgid ""
+"SELinux\n"
+"User"
+msgstr ""
+"SELinux\n"
+"Benutzer"
+
+#: ../gui/loginsPage.py:59
+#: ../gui/usersPage.py:55
+msgid ""
+"MLS/\n"
+"MCS Range"
+msgstr ""
+"MLS/\n"
+"MCS-Bereich"
+
+#: ../gui/loginsPage.py:133
+#, python-format
+msgid "Login '%s' is required"
+msgstr "Login '%s' wird benötigt"
+
+#: ../gui/modulesPage.py:48
+msgid "Policy Module"
+msgstr "Richtlinien-Modul"
+
+#: ../gui/modulesPage.py:57
+msgid "Module Name"
+msgstr "Modul-Name"
+
+#: ../gui/modulesPage.py:62
+msgid "Version"
+msgstr "Version"
+
+#: ../gui/modulesPage.py:134
+msgid "Disable Audit"
+msgstr "Audit deaktivieren"
+
+#: ../gui/modulesPage.py:137
+#: ../gui/system-config-selinux.glade.h:23
+msgid "Enable Audit"
+msgstr "Audit aktivieren"
+
+#: ../gui/modulesPage.py:162
+msgid "Load Policy Module"
+msgstr "Richtlinien-Modul laden"
+
+#: ../gui/polgen.glade.h:1
+msgid "..."
+msgstr "..."
+
+#: ../gui/polgen.glade.h:2
+msgid "600-1024"
+msgstr "600-1024"
+
+#: ../gui/polgen.glade.h:3
+msgid "<b>Applications</b>"
+msgstr "<b>Applikationen</b>"
+
+#: ../gui/polgen.glade.h:4
+msgid "<b>Login Users</b>"
+msgstr "<b>Melde Benutzer an</b>"
+
+#: ../gui/polgen.glade.h:5
+msgid "<b>Root Users</b>"
+msgstr "<b>Root-Benutzer</b>"
+
+#: ../gui/polgen.glade.h:6
+msgid "<b>TCP Ports</b>"
+msgstr "<b>TCP-Ports</b>"
+
+#: ../gui/polgen.glade.h:7
+msgid "<b>UDP Ports</b>"
+msgstr "<b>UDP Ports</b>"
+
+#: ../gui/polgen.glade.h:8
+msgid "Add Booleans Dialog"
+msgstr "Fügen Boolean-Dialog hinzu"
+
+#: ../gui/polgen.glade.h:9
+msgid "Add Files/Directories that application will need to \"Write\" to. Pid Files, Log Files, /var/lib Files ..."
+msgstr "Hinzufügen von Dateien/Ordnern, in welche diese Applikation \"Schreiben\" muss. Pid Files, Log Files, /var/lib Files ..."
+
+#: ../gui/polgen.glade.h:10
+msgid "Add/Remove booleans used for this confined application/user"
+msgstr "Boolsche Werte, die für diese eingeschränkte Applikation/Benutzer verwendet werden hinzufügen/entfernen"
+
+#: ../gui/polgen.glade.h:11
+msgid "Admin User Role"
+msgstr "Admin-Benutzerrolle"
+
+#: ../gui/polgen.glade.h:12
+msgid "All"
+msgstr "Alle"
+
+#: ../gui/polgen.glade.h:13
+msgid "Allow application/user role to call bindresvport with 0. Binding to port 600-1024"
+msgstr "Erlaubt Applikationsrolle/Benutzer-Rolle bindresvport mit 0 aufzurufen. Verbinde mit Ports 600-1024"
+
+#: ../gui/polgen.glade.h:14
+msgid "Allows application/user role to bind to any udp ports > 1024"
+msgstr "Erlaubt Applikationsrolle/Benutzer-Rolle sich mit einem beliebigen UDP-Port > 1024 zu verbinden"
+
+#: ../gui/polgen.glade.h:15
+msgid "Allows confined application/user role to bind to any udp port"
+msgstr "Erlaubt einer eingeschränkten Applikationsrolle/einem eingeschränkten Benutzer-Rolle sich mit jedem beliebigen UDP-Port zu verbinden"
+
+#: ../gui/polgen.glade.h:16
+msgid "Boolean Name"
+msgstr "Boolean-Name:"
+
+#: ../gui/polgen.glade.h:17
+msgid "Create/Manipulate temporary files in /tmp"
+msgstr "Erstelle/ändert temporäre Dateien in /tmp"
+
+#: ../gui/polgen.glade.h:19
+msgid "Enter a comma separated list of tcp ports or ranges of ports that application/user role connects to. Example: 612, 650-660"
+msgstr "Geben Sie eine durch Kommas getrennte Liste von TCP-Ports oder einen Bereich an, an welche Applikation/Benutzer-Rollen gebunden werden. Beispiel: 612, 650-660"
+
+#: ../gui/polgen.glade.h:20
+msgid "Enter a comma separated list of udp ports or ranges of ports that application/user role binds to. Example: 612, 650-660"
+msgstr "Geben Sie eine durch Kommas getrennte Liste von UDP-Ports oder einen Bereich an, an welche Applikation/Benutzer-Rollen gebunden werden. Beispiel: 612, 650-660"
+
+#: ../gui/polgen.glade.h:21
+msgid "Enter a comma separated list of udp ports or ranges of ports that application/user role connects to. Example: 612, 650-660"
+msgstr "Geben Sie eine durch Kommas getrennte Liste von UDP-Ports an, mit denen sich die Applikation/der Benutzer verbindet. Beispiel: 612, 650-660"
+
+#: ../gui/polgen.glade.h:22
+msgid "Enter complete path for executable to be confined."
+msgstr "Geben Sie den vollständigen Pfad der ausführbaren Datei ein, die eingeschränkt werden soll."
+
+#: ../gui/polgen.glade.h:23
+msgid "Enter complete path to init script used to start the confined application."
+msgstr "Geben Sie einen vollständigen Pfad zum Init-Skript ein, das verwendet wird, um die eingeschränkte Applikation zu starten."
+
+#: ../gui/polgen.glade.h:24
+msgid "Enter name of application or user role to be confined"
+msgstr "Geben Sie die einzuschränkende Applikation oder Benutzerrollen ein."
+
+#: ../gui/polgen.glade.h:25
+msgid "Enter network ports that application/user role connects to"
+msgstr "Geben Sie die Netzwerkports an, mit denen sich die Applikation/der Benutzer verbinden können"
+
+#: ../gui/polgen.glade.h:26
+msgid "Enter network ports that application/user role listens to"
+msgstr "Geben Sie die Netzwerksports an, auf denen Applikation/Benutzer hören"
+
+#: ../gui/polgen.glade.h:27
+msgid "Enter unique name for the confined application or user role."
+msgstr "Geben Sie einen eindeutigen Namen für die eingeschränkte Benutzer- oder Applikationsrolle ein."
+
+#: ../gui/polgen.glade.h:28
+msgid "Executable"
+msgstr "Ausführbar"
+
+#: ../gui/polgen.glade.h:29
+msgid "Existing User Roles"
+msgstr "Existierende Benutzer-Rollen"
+
+#: ../gui/polgen.glade.h:30
+msgid "GPL"
+msgstr "GPL"
+
+#: ../gui/polgen.glade.h:31
+msgid "Generated Policy Files"
+msgstr "Generierte Richtliniendateien"
+
+#: ../gui/polgen.glade.h:32
+msgid "Init script"
+msgstr "Init Skript"
+
+#: ../gui/polgen.glade.h:33
+msgid "Interacts with the terminal"
+msgstr "Interagiere mit dem Terminal"
+
+#: ../gui/polgen.glade.h:34
+msgid "Internet Services Daemon (inetd)"
+msgstr "Internet Services Daemon (inetd)"
+
+#: ../gui/polgen.glade.h:35
+msgid "Internet Services Daemon are daemons started by xinetd"
+msgstr "'Internet Services Daemon' sind Daemons, die von xinetd gestartet werden"
+
+#: ../gui/polgen.glade.h:36
+msgid "Minimal Terminal User Role"
+msgstr "Minimale Terminal-Benutzerrolle"
+
+#: ../gui/polgen.glade.h:37
+msgid "Minimal X Windows User Role"
+msgstr "Minimale X-Windows-Benutzerrolle"
+
+#: ../gui/polgen.glade.h:38
+msgid "Modify an existing login user record."
+msgstr "Ändere einen existierenden Benutzer-Datensatz."
+
+#: ../gui/polgen.glade.h:39
+#: ../gui/polgengui.py:167
+msgid "Name"
+msgstr "Name"
+
+#: ../gui/polgen.glade.h:40
+msgid "Polgen"
+msgstr "Polgen"
+
+#: ../gui/polgen.glade.h:41
+msgid "Policy Directory"
+msgstr "Richtlinienverzeichnis"
+
+#: ../gui/polgen.glade.h:42
+msgid "Red Hat 2007"
+msgstr "Red Hat 2007"
+
+#: ../gui/polgen.glade.h:43
+msgid "Root Admin User Role"
+msgstr "Root-Admin-Benutzerrolle"
+
+#: ../gui/polgen.glade.h:44
+msgid "SELinux Policy Generation Tool"
+msgstr "Tool zum Erstellen von SELinux-Richtlinien"
+
+#: ../gui/polgen.glade.h:45
+msgid "Select Ports"
+msgstr "Ports auswählen"
+
+#: ../gui/polgen.glade.h:46
+msgid "Select Root Administrator User Role, if this user will be used to administer the machine while running as root.  This user will not be able to login to the system directly."
+msgstr "Wählen Sie 'Root-Administrator Benutzerrolle', wenn dieser Benutzer zur Verwaltung des Rechners als Root-Benutzer verwendet wird.  Dieser Benutzer kann sich nicht direkt auf dem System einloggen."
+
+#: ../gui/polgen.glade.h:47
+msgid "Select additional domains that this user role will administer"
+msgstr "Wählen Sie zusätzliche Domains, die dieser Benutzer administrieren soll."
+
+#: ../gui/polgen.glade.h:48
+msgid "Select additional domains to which this user role will transition"
+msgstr "Wählen Sie zusätzliche Domain(s), in die diese Benutzerrolle übergeht"
+
+#: ../gui/polgen.glade.h:49
+msgid "Select additional roles for this user"
+msgstr "Wählen Sie zusätzliche Rollen für diesen Benutzer"
+
+#: ../gui/polgen.glade.h:50
+msgid "Select booleans that the application uses"
+msgstr "Wählen Sie booleschen Werte, die diese Applikation verwendet"
+
+#: ../gui/polgen.glade.h:51
+msgid "Select common application traits"
+msgstr "Wählen Sie allgemeine Applikationseigenschaften"
+
+#: ../gui/polgen.glade.h:52
+msgid "Select directory to generate policy in"
+msgstr "Wählen Sie das Verzeichnis, in das die Richtliniendateien generiert werden sollen"
+
+#: ../gui/polgen.glade.h:53
+msgid "Select files/directories that the application manages"
+msgstr "Wählen Sie die Dateien/Verzeichnisse, die die Applikation verwaltet"
+
+#: ../gui/polgen.glade.h:54
+msgid "Select the applications domains that you would like this user role to transition to."
+msgstr "Wählen Sie die Applikation-Domains, auf die dieser Benutzerrolle wechseln soll."
+
+#: ../gui/polgen.glade.h:55
+msgid "Select the domains that you would like this user administer."
+msgstr "Wählen Sie die Domains, die dieser Benutzer administrieren soll."
+
+#: ../gui/polgen.glade.h:56
+msgid "Select the user roles that will transiton to this applications domains."
+msgstr "Wählen Sie die Applikation-Domains, auf die diese Benutzerrole wechseln soll."
+
+#: ../gui/polgen.glade.h:57
+msgid "Select type of the application/user role to be confined"
+msgstr "Wählen Sie den Typ der einzuschränkenden Applikation oder Benutzerrolle"
+
+#: ../gui/polgen.glade.h:58
+msgid "Select user roles that will transition to this domain"
+msgstr "Wählen Sie die Benutzerrolle(n), die auf diese Domain übertragen werden soll"
+
+#: ../gui/polgen.glade.h:59
+msgid "Select user roles that you want to customize"
+msgstr "Wählen Sie die Rolle, welche Sie anpassen wollen"
+
+#: ../gui/polgen.glade.h:60
+msgid "Sends audit messages"
+msgstr "Sende Audit-Meldungen"
+
+#: ../gui/polgen.glade.h:61
+msgid "Sends email"
+msgstr "Sende Nachricht"
+
+#: ../gui/polgen.glade.h:62
+msgid "Standard Init Daemon"
+msgstr "Standard Init Daemon"
+
+#: ../gui/polgen.glade.h:63
+msgid "Standard Init Daemon are daemons started on boot via init scripts.  Usually requires a script in /etc/rc.d/init.d"
+msgstr "Standard-Init-Daemon sind Daemons, die beim Booten via Init-Skripte gestartet werden. Benötigt normalerweise ein Skript in /etc/rc.d/init.d"
+
+#: ../gui/polgen.glade.h:64
+msgid ""
+"This tool can be used to generate a policy framework, to confine applications or users using SELinux.   \n"
+"\n"
+"The tool generates:\n"
+"Type enforcement file (te)\n"
+"Interface file (if)\n"
+"File context file (fc)\n"
+"Shell script (sh) - used to compile and install the policy. "
+msgstr ""
+"Dieses Tool kann dazu verwendet werden, ein Richtlinien-Framework zur Abgrenzung von Applikationen oder Benutzern mit SELinux zu erstellen.   \n"
+"\n"
+"Das Tool generiert:\n"
+"Typ-Enforcement-Datei (te)\n"
+"Interface-Datei (if)\n"
+"Dateikontextdatei (fc)\n"
+"Shell-Skript (sh) - wird für das Kompilieren und Installieren der Richtlinie verwendet. "
+
+#: ../gui/polgen.glade.h:71
+msgid ""
+"This tool will generate the following: \n"
+"Type Enforcement(te), File Context(fc), Interface(if), Shell Script(sh)\n"
+"\n"
+"Execute shell script to compile/install and relabel files/directories.  \n"
+"Put the machine in permissive mode (setenforce 0). \n"
+"Run/restart the application to generate avc messages.\n"
+"Use audit2allow -R to generate additional rules for the te file.\n"
+msgstr ""
+"Dieses Werkzeug erstellt das folgende: \n"
+"Type Enforcment(te), File Context(fc), Interface(if), Shell Script(sh).\n"
+"\n"
+"Führen Sie das Shell-Skript aus, um Dateien/Verzeichnisse zu kompilieren/installieren und neu zu kennzeichnen.\n"
+"Anschliessend können Sie den Rechner in 'permissive' Modus versetzen. \n"
+"Führen Sie die Applikation aus oder starten Sie diese neu, um 'avc'-Meldungen zu generieren.\n"
+"Verwenden Sie 'audit2allow -R', um zusätzliche Regeln für die 'te'-Datei zu erstellen.\n"
+
+#: ../gui/polgen.glade.h:79
+msgid ""
+"This tool will generate the following: \n"
+"Type Enforcement(te), File Context(fc), Interface(if), Shell Script(sh)\n"
+"Execute shell script as root to compile/install and relabel files/directories.  \n"
+"Use semanage or useradd to map Linux login users to user roles.\n"
+"Put the machine in permissive mode (setenforce 0). \n"
+"Login as the user and test this user role.\n"
+"Use audit2allow -R to generate additional rules for the te file.\n"
+msgstr ""
+"Dieses Werkzeug erstellt das folgende: \n"
+"Type Enforcment(te), File Context(fc), Interface(if), Shell Script(sh).\n"
+"Führen Sie das Shell-Skript als root aus, um Dateien/Verzeichnisse zu kompilieren/installieren und neu zu kennzeichnen.\n"
+"Benutzen Sie semanage oder useradd, um Linux-Anmeldebenutzer den Beutzerrollen zuzuordnen.\n"
+"Anschliessend können Sie den Rechner in permissive-Modus versetzen. \n"
+"Melden Sie sich als Benutzer an und testen Sie die Benutzerrolle.\n"
+"Verwenden Sie audit2allow -R, um zusätzliche Regeln für die Datei zu erstellen.\n"
+
+#: ../gui/polgen.glade.h:87
+msgid "This user can login to a machine via X or terminal.  By default this user will have no setuid, no networking, no sudo, no su"
+msgstr "Dieser Benutzer kann sich via X oder Terminal auf einer Maschine einloggen.  Standardmäßig besitzt dieser Benutzer kein setuid, kein Netzwerk, kein sudo und kein su."
+
+#: ../gui/polgen.glade.h:88
+msgid "This user will login to a machine only via a terminal or remote login.  By default this user will have  no setuid, no networking, no su, no sudo."
+msgstr "Dieser Benutzer loggt sich auf einer Maschine nur via Terminal oder Login von Remote aus ein.  Standardmäßig besitzt dieser Benutzer kein setuid, kein Netzwerk, kein su und kein sudo."
+
+#: ../gui/polgen.glade.h:89
+msgid "Unreserved Ports (>1024)"
+msgstr "Nicht reservierte Ports (>1024)"
+
+#: ../gui/polgen.glade.h:90
+msgid "User Application"
+msgstr "Benutzerapplikation"
+
+#: ../gui/polgen.glade.h:91
+msgid "User Application are any application that you would like to confine that is started by a user"
+msgstr "Eine Benutzerapplikation ist eine beliebige Applikation, die von einem Benutzer gestartet wird und die Sie einschränken möchten"
+
+#: ../gui/polgen.glade.h:92
+msgid "User Role"
+msgstr "Benutzer-Rolle"
+
+#: ../gui/polgen.glade.h:93
+msgid "User with full networking, no setuid applications without transition, no su, can sudo to Root Administration Roles"
+msgstr "Benutzer mit vollem Zugriff auf das Netzwerk, keine setuid-Applikationen ohne Ãœbertragung, kein su und kann mit sudo in Root Administration Roles wechseln."
+
+#: ../gui/polgen.glade.h:94
+msgid "User with full networking, no setuid applications without transition, no sudo, no su."
+msgstr "Benutzer mit vollem Zugriff auf das Netzwerk, keine setuid-Applikationen ohne Ãœbertragung, kein sudo und kein su."
+
+#: ../gui/polgen.glade.h:95
+msgid "Uses Pam for authentication"
+msgstr "Benutzt PAM zur Authentifizierung"
+
+#: ../gui/polgen.glade.h:96
+msgid "Uses dbus"
+msgstr "Benutzt DBus"
+
+#: ../gui/polgen.glade.h:97
+msgid "Uses nsswitch or getpw* calls"
+msgstr "Benutzt nsswitch- oder getpw*-Aufrufe"
+
+#: ../gui/polgen.glade.h:98
+msgid "Web Application/Script (CGI)"
+msgstr "Web Application/Script (CGI)"
+
+#: ../gui/polgen.glade.h:99
+msgid "Web Applications/Script (CGI) CGI scripts started by the web server (apache)"
+msgstr "Web-Applikationen/Skript (CGI) CGI-Skripte, die vom Web-Server (Apache) gestartet werden"
+
+#: ../gui/polgen.glade.h:100
+msgid "Writes syslog messages\t"
+msgstr "Schreibt syslog-Nachricht\t"
+
+#. TRANSLATORS: Replace this string with your names, one name per line.
+#: ../gui/polgen.glade.h:102
+#: ../gui/system-config-selinux.glade.h:74
+msgid "translator-credits"
+msgstr "N/A"
+
+#: ../gui/polgengui.py:177
+msgid "Role"
+msgstr "Funktion"
+
+#: ../gui/polgengui.py:184
+msgid "Existing_User"
+msgstr "Bestehender_Benutzer"
+
+#: ../gui/polgengui.py:199
+#: ../gui/polgengui.py:207
+#: ../gui/polgengui.py:221
+msgid "Application"
+msgstr "Applikation"
+
+#: ../gui/polgengui.py:269
+#, python-format
+msgid "%s must be a directory"
+msgstr "%s muss ein Verzeichnis sein"
+
+#: ../gui/polgengui.py:328
+#: ../gui/polgengui.py:595
+msgid "You must select a user"
+msgstr "Sie müssen eine Benutzer auswählen"
+
+#: ../gui/polgengui.py:451
+msgid "Select executable file to be confined."
+msgstr "Wählen Sie eine einzuschränkende ausführbare Datei."
+
+#: ../gui/polgengui.py:462
+msgid "Select init script file to be confined."
+msgstr "Wählen Sie eine Init-Skript-Datei, die eingeschränkt werden soll."
+
+#: ../gui/polgengui.py:472
+msgid "Select file(s) that confined application creates or writes"
+msgstr "Wählen Sie die Datei(en), die eine eingeschränkte Applikation erstellt oder schreibt"
+
+#: ../gui/polgengui.py:479
+msgid "Select directory(s) that the confined application owns and writes into"
+msgstr "Wählen Sie das/die Verzeichnis(se), die die eingeschränkte Applikation besitzt und in die sie schreibt"
+
+#: ../gui/polgengui.py:538
+msgid "Select directory to generate policy files in"
+msgstr "Wählen Sie das Verzeichnis, in das die Richtliniendateien generiert werden sollen"
+
+#: ../gui/polgengui.py:551
+#, python-format
+msgid ""
+"Type %s_t already defined in current policy.\n"
+"Do you want to continue?"
+msgstr ""
+"Typ %s_t bereits definiert in aktueller Richtlinie.\n"
+"Wollen Sie fortfahren?"
+
+#: ../gui/polgengui.py:551
+#: ../gui/polgengui.py:555
+msgid "Verify Name"
+msgstr "Überprüfe Name"
+
+#: ../gui/polgengui.py:555
+#, python-format
+msgid ""
+"Module %s.pp already loaded in current policy.\n"
+"Do you want to continue?"
+msgstr ""
+"Modul %s.pp bereits geladen in aktueller Richtlinie.\n"
+"Wollen Sie fortfahren?"
+
+#: ../gui/polgengui.py:601
+msgid "You must enter a name"
+msgstr "Sie müssen einen Namen angeben"
+
+#: ../gui/polgengui.py:607
+msgid "You must enter a executable"
+msgstr "Sie müssen eine ausführbare Datei angeben"
+
+#: ../gui/polgengui.py:611
+#: ../gui/system-config-selinux.py:174
+msgid "Configue SELinux"
+msgstr "SELinux konfigurieren"
+
+#: ../gui/polgen.py:161
+#, python-format
+msgid "Ports must be be numbers or ranges of numbers from 1 to %d "
+msgstr "Ports müssen zahlen zwischen 1 und %d sein"
+
+#: ../gui/polgen.py:190
+msgid "You must enter a name for your confined process/user"
+msgstr "Sie müssen einen Pfad für Ihren eingeschränkten Prozess/Benutzer eingeben"
+
+#: ../gui/polgen.py:268
+msgid "USER Types are not allowed executables"
+msgstr "USER-Types sind keine erlaubten ausführbaren Dateien"
+
+#: ../gui/polgen.py:274
+msgid "Only DAEMON apps can use an init script"
+msgstr "Nur DAEMON-Applikationen können ein Init-Skript verwenden"
+
+#: ../gui/polgen.py:292
+msgid "use_syslog must be a boolean value "
+msgstr "use_syslog muss ein Boolescher Wert sein"
+
+#: ../gui/polgen.py:313
+msgid "USER Types autoomatically get a tmp type"
+msgstr "USER-Types erhalten automatisch ein tmp-Typ"
+
+#: ../gui/polgen.py:709
+msgid "You must enter the executable path for your confined process"
+msgstr "Sie müssen einen ausführbaren Pfad für Ihren eingeschränkten Prozess eingeben"
+
+#: ../gui/polgen.py:828
+msgid "Type Enforcement file"
+msgstr "Type Enforcement Datei"
+
+#: ../gui/polgen.py:829
+msgid "Interface file"
+msgstr "Schnittstellendatei"
+
+#: ../gui/polgen.py:830
+msgid "File Contexts file"
+msgstr "Datei-Kontexte-Datei"
+
+#: ../gui/polgen.py:831
+msgid "Setup Script"
+msgstr "Skript für das Einrichten"
+
+#: ../gui/portsPage.py:85
+msgid ""
+"SELinux Port\n"
+"Type"
+msgstr ""
+"SELinux Port\n"
+"Typ"
+
+#: ../gui/portsPage.py:91
+#: ../gui/system-config-selinux.glade.h:41
+msgid "Protocol"
+msgstr "Protokoll"
+
+#: ../gui/portsPage.py:96
+#: ../gui/system-config-selinux.glade.h:33
+msgid ""
+"MLS/MCS\n"
+"Level"
+msgstr ""
+"MLS/MCS\n"
+"Level"
+
+#: ../gui/portsPage.py:101
+msgid "Port"
+msgstr "Port"
+
+#: ../gui/portsPage.py:206
+#, python-format
+msgid "Port number \"%s\" is not valid.  0 < PORT_NUMBER < 65536 "
+msgstr "Portnummer \"%s\" ist nicht gültig. 0 < PORTNUMMER < 65536 "
+
+#: ../gui/portsPage.py:251
+msgid "List View"
+msgstr "Listenansicht"
+
+#: ../gui/portsPage.py:254
+#: ../gui/system-config-selinux.glade.h:29
+msgid "Group View"
+msgstr "Gruppenansicht"
+
+#: ../gui/selinux.tbl:1
+#: ../gui/selinux.tbl:30
+#: ../gui/selinux.tbl:31
+#: ../gui/selinux.tbl:32
+#: ../gui/selinux.tbl:33
+#: ../gui/selinux.tbl:34
+#: ../gui/selinux.tbl:36
+#: ../gui/selinux.tbl:37
+#: ../gui/selinux.tbl:38
+#: ../gui/selinux.tbl:39
+#: ../gui/selinux.tbl:40
+#: ../gui/selinux.tbl:42
+#: ../gui/selinux.tbl:43
+#: ../gui/selinux.tbl:44
+#: ../gui/selinux.tbl:45
+#: ../gui/selinux.tbl:46
+#: ../gui/selinux.tbl:47
+#: ../gui/selinux.tbl:48
+#: ../gui/selinux.tbl:49
+#: ../gui/selinux.tbl:50
+#: ../gui/selinux.tbl:51
+#: ../gui/selinux.tbl:52
+#: ../gui/selinux.tbl:53
+#: ../gui/selinux.tbl:59
+#: ../gui/selinux.tbl:60
+#: ../gui/selinux.tbl:61
+#: ../gui/selinux.tbl:62
+#: ../gui/selinux.tbl:63
+#: ../gui/selinux.tbl:64
+#: ../gui/selinux.tbl:65
+#: ../gui/selinux.tbl:66
+#: ../gui/selinux.tbl:67
+#: ../gui/selinux.tbl:68
+#: ../gui/selinux.tbl:69
+#: ../gui/selinux.tbl:75
+#: ../gui/selinux.tbl:76
+#: ../gui/selinux.tbl:77
+#: ../gui/selinux.tbl:78
+#: ../gui/selinux.tbl:79
+#: ../gui/selinux.tbl:80
+#: ../gui/selinux.tbl:81
+#: ../gui/selinux.tbl:82
+#: ../gui/selinux.tbl:83
+#: ../gui/selinux.tbl:84
+#: ../gui/selinux.tbl:86
+#: ../gui/selinux.tbl:88
+#: ../gui/selinux.tbl:89
+#: ../gui/selinux.tbl:90
+#: ../gui/selinux.tbl:92
+#: ../gui/selinux.tbl:94
+#: ../gui/selinux.tbl:95
+#: ../gui/selinux.tbl:96
+#: ../gui/selinux.tbl:97
+#: ../gui/selinux.tbl:98
+#: ../gui/selinux.tbl:99
+#: ../gui/selinux.tbl:100
+#: ../gui/selinux.tbl:101
+#: ../gui/selinux.tbl:102
+#: ../gui/selinux.tbl:103
+#: ../gui/selinux.tbl:104
+#: ../gui/selinux.tbl:106
+#: ../gui/selinux.tbl:108
+#: ../gui/selinux.tbl:109
+#: ../gui/selinux.tbl:110
+#: ../gui/selinux.tbl:111
+#: ../gui/selinux.tbl:112
+#: ../gui/selinux.tbl:113
+#: ../gui/selinux.tbl:114
+#: ../gui/selinux.tbl:116
+#: ../gui/selinux.tbl:117
+#: ../gui/selinux.tbl:119
+#: ../gui/selinux.tbl:121
+#: ../gui/selinux.tbl:123
+#: ../gui/selinux.tbl:124
+#: ../gui/selinux.tbl:127
+#: ../gui/selinux.tbl:129
+#: ../gui/selinux.tbl:130
+#: ../gui/selinux.tbl:131
+#: ../gui/selinux.tbl:132
+#: ../gui/selinux.tbl:133
+#: ../gui/selinux.tbl:134
+#: ../gui/selinux.tbl:135
+#: ../gui/selinux.tbl:136
+#: ../gui/selinux.tbl:137
+#: ../gui/selinux.tbl:138
+#: ../gui/selinux.tbl:139
+#: ../gui/selinux.tbl:142
+#: ../gui/selinux.tbl:143
+#: ../gui/selinux.tbl:144
+#: ../gui/selinux.tbl:145
+#: ../gui/selinux.tbl:146
+#: ../gui/selinux.tbl:147
+#: ../gui/selinux.tbl:148
+#: ../gui/selinux.tbl:149
+#: ../gui/selinux.tbl:150
+#: ../gui/selinux.tbl:151
+#: ../gui/selinux.tbl:152
+#: ../gui/selinux.tbl:154
+#: ../gui/selinux.tbl:155
+#: ../gui/selinux.tbl:156
+#: ../gui/selinux.tbl:157
+#: ../gui/selinux.tbl:158
+#: ../gui/selinux.tbl:159
+#: ../gui/selinux.tbl:160
+#: ../gui/selinux.tbl:167
+#: ../gui/selinux.tbl:171
+#: ../gui/selinux.tbl:172
+#: ../gui/selinux.tbl:173
+#: ../gui/selinux.tbl:174
+#: ../gui/selinux.tbl:175
+#: ../gui/selinux.tbl:177
+#: ../gui/selinux.tbl:178
+#: ../gui/selinux.tbl:179
+#: ../gui/selinux.tbl:180
+#: ../gui/selinux.tbl:184
+#: ../gui/selinux.tbl:192
+#: ../gui/selinux.tbl:193
+#: ../gui/selinux.tbl:194
+#: ../gui/selinux.tbl:195
+#: ../gui/selinux.tbl:196
+#: ../gui/selinux.tbl:197
+#: ../gui/selinux.tbl:198
+#: ../gui/selinux.tbl:199
+#: ../gui/selinux.tbl:200
+#: ../gui/selinux.tbl:201
+#: ../gui/selinux.tbl:206
+#: ../gui/selinux.tbl:207
+#: ../gui/selinux.tbl:218
+#: ../gui/selinux.tbl:219
+#: ../gui/selinux.tbl:220
+#: ../gui/selinux.tbl:222
+#: ../gui/selinux.tbl:224
+#: ../gui/selinux.tbl:226
+#: ../gui/selinux.tbl:227
+#: ../gui/selinux.tbl:230
+msgid "SELinux Service Protection"
+msgstr "SELinux-Dienst-Schutz"
+
+#: ../gui/selinux.tbl:1
+msgid "Disable SELinux protection for acct daemon"
+msgstr "Deaktiviere SELinux Schutz für acct daemon"
+
+#: ../gui/selinux.tbl:2
+#: ../gui/selinux.tbl:3
+#: ../gui/selinux.tbl:70
+#: ../gui/selinux.tbl:153
+#: ../gui/selinux.tbl:168
+#: ../gui/selinux.tbl:169
+#: ../gui/selinux.tbl:170
+#: ../gui/selinux.tbl:189
+#: ../gui/selinux.tbl:202
+#: ../gui/selinux.tbl:203
+#: ../gui/selinux.tbl:204
+#: ../gui/selinux.tbl:205
+msgid "Admin"
+msgstr "Administrator"
+
+#: ../gui/selinux.tbl:2
+msgid "Allow all daemons to write corefiles to /"
+msgstr "Allen Daemons erlauben, 'corefiles' nach \"/\" zu schreiben"
+
+#: ../gui/selinux.tbl:3
+msgid "Allow all daemons the ability to use unallocated ttys"
+msgstr "Allen Daemons die Fähigkeit geben, nicht zugewiesene TTYs zu verwenden"
+
+#: ../gui/selinux.tbl:4
+#: ../gui/selinux.tbl:5
+#: ../gui/selinux.tbl:11
+#: ../gui/selinux.tbl:12
+#: ../gui/selinux.tbl:13
+#: ../gui/selinux.tbl:15
+#: ../gui/selinux.tbl:20
+#: ../gui/selinux.tbl:41
+#: ../gui/selinux.tbl:208
+#: ../gui/selinux.tbl:210
+#: ../gui/selinux.tbl:211
+#: ../gui/selinux.tbl:212
+#: ../gui/selinux.tbl:213
+#: ../gui/selinux.tbl:214
+#: ../gui/selinux.tbl:215
+#: ../gui/selinux.tbl:216
+#: ../gui/selinux.tbl:217
+msgid "User Privs"
+msgstr "Benutzer-Privs"
+
+#: ../gui/selinux.tbl:4
+msgid "Allow gadmin SELinux user account to execute files in home directory or /tmp"
+msgstr "gadmin-SELinux-Benutzer erlauben, Dateien in seinem Stammverzeichnis oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:5
+msgid "Allow guest SELinux user account to execute files in home directory or /tmp"
+msgstr "SELinux Gast-Benutzerkonten erlauben, Dateien in ihrem Stammverzeichnis oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:6
+#: ../gui/selinux.tbl:9
+#: ../gui/selinux.tbl:16
+msgid "Memory Protection"
+msgstr "Speicherschutz"
+
+#: ../gui/selinux.tbl:6
+msgid "Allow java executable stack"
+msgstr "Ausführbaren Java-Stapel erlauben"
+
+#: ../gui/selinux.tbl:7
+#: ../gui/selinux.tbl:8
+#: ../gui/selinux.tbl:35
+#: ../gui/selinux.tbl:209
+msgid "Mount"
+msgstr "Einhängen"
+
+#: ../gui/selinux.tbl:7
+msgid "Allow mount to mount any file"
+msgstr "'mount' gestatten, jede beliebige Datei einzuhängen"
+
+#: ../gui/selinux.tbl:8
+msgid "Allow mount to mount any directory"
+msgstr "'mount' gestatten, jedes beliebige Verzeichnis einzuhängen"
+
+#: ../gui/selinux.tbl:9
+msgid "Allow mplayer executable stack"
+msgstr "'mplayer' einen ausführbaren Stapel erlauben"
+
+#: ../gui/selinux.tbl:10
+#: ../gui/selinux.tbl:162
+#: ../gui/selinux.tbl:187
+#: ../gui/selinux.tbl:188
+msgid "SSH"
+msgstr "SSH"
+
+#: ../gui/selinux.tbl:10
+msgid "Allow ssh to run ssh-keysign"
+msgstr "SSH gestatten, 'ssh-keysign' auszuführen"
+
+#: ../gui/selinux.tbl:11
+msgid "Allow staff SELinux user account to execute files in home directory or /tmp"
+msgstr "staff-SELinux-Benutzerkonten gestatten, Dateien in ihren Stammverzeichnissen oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:12
+msgid "Allow sysadm SELinux user account to execute files in home directory or /tmp"
+msgstr "sysadm-SELinux-Benutzerkonten gestatten, Dateien in ihren Stammverzeichnissen oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:13
+msgid "Allow unconfined SELinux user account to execute files in home directory or /tmp"
+msgstr "Uneingeschränkten SELinux-Benutzerkonten gestatten, Dateien in ihren Stammverzeichnissen oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:14
+msgid "Network Configuration"
+msgstr "Netzwerkkonfiguration"
+
+#: ../gui/selinux.tbl:14
+msgid "Allow unlabeled packets to flow on the network"
+msgstr "Nicht gekennzeichneten Paketen gestatten, sich durch das Netzwerk fortzubewegen"
+
+#: ../gui/selinux.tbl:15
+msgid "Allow user SELinux user account to execute files in home directory or /tmp"
+msgstr "user-SELinux-Benutzerkonten gestatten, Dateien in ihren Stammverzeichnissen oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:16
+msgid "Allow unconfined to dyntrans to unconfined_execmem"
+msgstr "'unconfined' zu 'dyntrans' zu 'unconfined_execmem' gestatten"
+
+#: ../gui/selinux.tbl:17
+#: ../gui/selinux.tbl:18
+#: ../gui/selinux.tbl:120
+#: ../gui/selinux.tbl:140
+msgid "Databases"
+msgstr "Datenbanken"
+
+#: ../gui/selinux.tbl:17
+msgid "Allow user to connect to mysql socket"
+msgstr "Benutzer gestatten, sich mit dem MySQL-Socket zu verbinden"
+
+#: ../gui/selinux.tbl:18
+msgid "Allow user to connect to postgres socket"
+msgstr "Benutzer gestatten, sich mit dem Postgres-Socket zu verbinden"
+
+#: ../gui/selinux.tbl:19
+#: ../gui/selinux.tbl:165
+#: ../gui/selinux.tbl:223
+msgid "XServer"
+msgstr "X-Server"
+
+#: ../gui/selinux.tbl:19
+msgid "Allow clients to write to X shared memory"
+msgstr "Clients gestatten, in von X gemeinsam genutzten Speicher zu schreiben"
+
+#: ../gui/selinux.tbl:20
+msgid "Allow xguest SELinux user account to execute files in home directory or /tmp"
+msgstr "xguest-SELinux-Benutzerkonten gestatten, Dateien in ihren Stammverzeichnissen oder /tmp auszuführen"
+
+#: ../gui/selinux.tbl:21
+#: ../gui/selinux.tbl:228
+#: ../gui/selinux.tbl:229
+#: ../gui/selinux.tbl:231
+msgid "NIS"
+msgstr "NIS"
+
+#: ../gui/selinux.tbl:21
+msgid "Allow daemons to run with NIS"
+msgstr "Daemons gestatten, mit NIS zu laufen"
+
+#: ../gui/selinux.tbl:22
+#: ../gui/selinux.tbl:23
+#: ../gui/selinux.tbl:24
+#: ../gui/selinux.tbl:25
+#: ../gui/selinux.tbl:26
+#: ../gui/selinux.tbl:27
+#: ../gui/selinux.tbl:28
+#: ../gui/selinux.tbl:29
+#: ../gui/selinux.tbl:71
+#: ../gui/selinux.tbl:73
+#: ../gui/selinux.tbl:74
+#: ../gui/selinux.tbl:115
+#: ../gui/selinux.tbl:118
+msgid "Web Applications"
+msgstr "Web-Applikationen"
+
+#: ../gui/selinux.tbl:22
+msgid "Transition staff SELinux user to Web Browser Domain"
+msgstr "'staff'-SELinux-Benutzer auf Web-Browser-Domain übertragen"
+
+#: ../gui/selinux.tbl:23
+msgid "Transition sysadm SELinux user to Web Browser Domain"
+msgstr "'sysadmin'-SELinux-Benutzer auf Web-Browser-Domain übertragen"
+
+#: ../gui/selinux.tbl:24
+msgid "Transition user SELinux user to Web Browser Domain"
+msgstr "'user'-SELinux-Benutzer auf Web-Browser-Domain übertragen"
+
+#: ../gui/selinux.tbl:25
+msgid "Transition xguest SELinux user to Web Browser Domain"
+msgstr "'xguest'-SELinux-Benutzer auf Web-Browser-Domain übertragen"
+
+#: ../gui/selinux.tbl:26
+#: ../gui/selinux.tbl:27
+#: ../gui/selinux.tbl:28
+#: ../gui/selinux.tbl:29
+msgid "Allow staff Web Browsers to write to home directories"
+msgstr "'staff'-Web-Browsern gestatten, in Stammverzeichnisse zu schreiben"
+
+#: ../gui/selinux.tbl:30
+msgid "Disable SELinux protection for amanda"
+msgstr "Deaktiviere SELinux Schutz für amanda"
+
+#: ../gui/selinux.tbl:31
+msgid "Disable SELinux protection for amavis"
+msgstr "Deaktiviere SELinux Schutz für amavis"
+
+#: ../gui/selinux.tbl:32
+msgid "Disable SELinux protection for apmd daemon"
+msgstr "Deaktiviere SELinux Schutz für apmd daemon"
+
+#: ../gui/selinux.tbl:33
+msgid "Disable SELinux protection for arpwatch daemon"
+msgstr "Deaktiviere SELinux Schutz für arpwatch daemon"
+
+#: ../gui/selinux.tbl:34
+msgid "Disable SELinux protection for auditd daemon"
+msgstr "Deaktiviere SELinux Schutz für auditd daemon"
+
+#: ../gui/selinux.tbl:35
+msgid "Disable SELinux protection for automount daemon"
+msgstr "Deaktiviere SELinux Schutz für automount daemon"
+
+#: ../gui/selinux.tbl:36
+msgid "Disable SELinux protection for avahi"
+msgstr "Deaktiviere SELinux Schutz für avahi"
+
+#: ../gui/selinux.tbl:37
+msgid "Disable SELinux protection for bluetooth daemon"
+msgstr "Deaktiviere SELinux Schutz für bluetooth daemon"
+
+#: ../gui/selinux.tbl:38
+msgid "Disable SELinux protection for canna daemon"
+msgstr "Deaktiviere SELinux Schutz für canna daemon"
+
+#: ../gui/selinux.tbl:39
+msgid "Disable SELinux protection for cardmgr daemon"
+msgstr "Deaktiviere SELinux Schutz für cardmgr daemon"
+
+#: ../gui/selinux.tbl:40
+msgid "Disable SELinux protection for Cluster Server"
+msgstr "Deaktiviere SELinux Schutz für Cluster Server"
+
+#: ../gui/selinux.tbl:41
+msgid "Allow cdrecord to read various content. nfs, samba, removable devices, user temp and untrusted content files"
+msgstr "'cdrecord' gestatten, verschiedenen Inhalt zu lesen. NFS, SAMBA, entfernbare Geräte, temporäre Benutzerverzeichnisse und nicht vertrauenswürdige Inhaltsdateien"
+
+#: ../gui/selinux.tbl:42
+msgid "Disable SELinux protection for ciped daemon"
+msgstr "Deaktiviere SELinux Schutz für ciped daemon"
+
+#: ../gui/selinux.tbl:43
+msgid "Disable SELinux protection for clamd daemon"
+msgstr "Deaktiviere SELinux Schutz für clamd daemon"
+
+#: ../gui/selinux.tbl:44
+msgid "Disable SELinux protection for clamscan"
+msgstr "Deaktiviere SELinux Schutz für clamscan"
+
+#: ../gui/selinux.tbl:45
+msgid "Disable SELinux protection for clvmd"
+msgstr "Deaktiviere SELinux Schutz für clvmd"
+
+#: ../gui/selinux.tbl:46
+msgid "Disable SELinux protection for comsat daemon"
+msgstr "Deaktiviere SELinux Schutz für comsat daemon"
+
+#: ../gui/selinux.tbl:47
+#: ../gui/selinux.tbl:48
+#: ../gui/selinux.tbl:49
+#: ../gui/selinux.tbl:50
+#: ../gui/selinux.tbl:51
+msgid "Disable SELinux protection for courier daemon"
+msgstr "Deaktiviere SELinux Schutz für courier daemon"
+
+#: ../gui/selinux.tbl:52
+msgid "Disable SELinux protection for cpucontrol daemon"
+msgstr "Deaktiviere SELinux Schutz für cpucontrol daemon"
+
+#: ../gui/selinux.tbl:53
+msgid "Disable SELinux protection for cpuspeed daemon"
+msgstr "Deaktiviere SELinux Schutz für cpuspeed daemon"
+
+#: ../gui/selinux.tbl:54
+msgid "Cron"
+msgstr "Cron"
+
+#: ../gui/selinux.tbl:54
+msgid "Disable SELinux protection for crond daemon"
+msgstr "Deaktiviere SELinux Schutz für crond daemon"
+
+#: ../gui/selinux.tbl:55
+#: ../gui/selinux.tbl:56
+#: ../gui/selinux.tbl:57
+#: ../gui/selinux.tbl:91
+msgid "Printing"
+msgstr "Drucken"
+
+#: ../gui/selinux.tbl:55
+msgid "Disable SELinux protection for cupsd back end server"
+msgstr "Deaktiviere SELinux-Schutz für cupsd backend-Server"
+
+#: ../gui/selinux.tbl:56
+msgid "Disable SELinux protection for cupsd daemon"
+msgstr "Deaktiviere SELinux Schutz für cupsd daemon"
+
+#: ../gui/selinux.tbl:57
+msgid "Disable SELinux protection for cupsd_lpd"
+msgstr "Deaktiviere SELinux Schutz für cupsd_lpd"
+
+#: ../gui/selinux.tbl:58
+msgid "CVS"
+msgstr "CVS"
+
+#: ../gui/selinux.tbl:58
+msgid "Disable SELinux protection for cvs daemon"
+msgstr "Deaktiviere SELinux Schutz für cvs daemon"
+
+#: ../gui/selinux.tbl:59
+msgid "Disable SELinux protection for cyrus daemon"
+msgstr "Deaktiviere SELinux Schutz für cyrus daemon"
+
+#: ../gui/selinux.tbl:60
+msgid "Disable SELinux protection for dbskkd daemon"
+msgstr "Deaktiviere SELinux Schutz für dbskkd daemon"
+
+#: ../gui/selinux.tbl:61
+msgid "Disable SELinux protection for dbusd daemon"
+msgstr "Deaktiviere SELinux Schutz für dbusd daemon"
+
+#: ../gui/selinux.tbl:62
+msgid "Disable SELinux protection for dccd"
+msgstr "Deaktiviere SELinux Schutz für dccd"
+
+#: ../gui/selinux.tbl:63
+msgid "Disable SELinux protection for dccifd"
+msgstr "Deaktiviere SELinux Schutz für dccifd"
+
+#: ../gui/selinux.tbl:64
+msgid "Disable SELinux protection for dccm"
+msgstr "Deaktiviere SELinux Schutz für dccm"
+
+#: ../gui/selinux.tbl:65
+msgid "Disable SELinux protection for ddt daemon"
+msgstr "Deaktiviere SELinux Schutz für ddt daemon"
+
+#: ../gui/selinux.tbl:66
+msgid "Disable SELinux protection for devfsd daemon"
+msgstr "Deaktiviere SELinux Schutz für devfsd daemon"
+
+#: ../gui/selinux.tbl:67
+msgid "Disable SELinux protection for dhcpc daemon"
+msgstr "Deaktiviere SELinux Schutz für dhcpc daemon"
+
+#: ../gui/selinux.tbl:68
+msgid "Disable SELinux protection for dhcpd daemon"
+msgstr "Deaktiviere SELinux Schutz für dhcpd daemon"
+
+#: ../gui/selinux.tbl:69
+msgid "Disable SELinux protection for dictd daemon"
+msgstr "Deaktiviere SELinux Schutz für dictd daemon"
+
+#: ../gui/selinux.tbl:70
+msgid "Allow sysadm_t to directly start daemons"
+msgstr "'sysadm_t' gestatten, Daemons direkt zu starten"
+
+#: ../gui/selinux.tbl:71
+msgid "Disable SELinux protection for Evolution"
+msgstr "Deaktiviere SELinux Schutz für Evolution"
+
+#: ../gui/selinux.tbl:72
+msgid "Games"
+msgstr "Spiele"
+
+#: ../gui/selinux.tbl:72
+msgid "Disable SELinux protection for games"
+msgstr "Deaktiviere SELinux Schutz für games"
+
+#: ../gui/selinux.tbl:73
+msgid "Disable SELinux protection for the web browsers"
+msgstr "Deaktiviere SELinux Schutz für the web browsers"
+
+#: ../gui/selinux.tbl:74
+msgid "Disable SELinux protection for Thunderbird"
+msgstr "Deaktiviere SELinux Schutz für Thunderbird"
+
+#: ../gui/selinux.tbl:75
+msgid "Disable SELinux protection for distccd daemon"
+msgstr "Deaktiviere SELinux Schutz für distccd daemon"
+
+#: ../gui/selinux.tbl:76
+msgid "Disable SELinux protection for dmesg daemon"
+msgstr "Deaktiviere SELinux Schutz für dmesg daemon"
+
+#: ../gui/selinux.tbl:77
+msgid "Disable SELinux protection for dnsmasq daemon"
+msgstr "Deaktiviere SELinux Schutz für dnsmasq daemon"
+
+#: ../gui/selinux.tbl:78
+msgid "Disable SELinux protection for dovecot daemon"
+msgstr "Deaktiviere SELinux Schutz für dovecot daemon"
+
+#: ../gui/selinux.tbl:79
+msgid "Disable SELinux protection for entropyd daemon"
+msgstr "Deaktiviere SELinux Schutz für entropyd daemon"
+
+#: ../gui/selinux.tbl:80
+msgid "Disable SELinux protection for fetchmail"
+msgstr "Deaktiviere SELinux Schutz für fetchmail"
+
+#: ../gui/selinux.tbl:81
+msgid "Disable SELinux protection for fingerd daemon"
+msgstr "Deaktiviere SELinux Schutz für fingerd daemon"
+
+#: ../gui/selinux.tbl:82
+msgid "Disable SELinux protection for freshclam daemon"
+msgstr "Deaktiviere SELinux Schutz für freshclam daemon"
+
+#: ../gui/selinux.tbl:83
+msgid "Disable SELinux protection for fsdaemon daemon"
+msgstr "Deaktiviere SELinux Schutz für fsdaemon daemon"
+
+#: ../gui/selinux.tbl:84
+msgid "Disable SELinux protection for gpm daemon"
+msgstr "Deaktiviere SELinux Schutz für gpm daemon"
+
+#: ../gui/selinux.tbl:85
+#: ../gui/selinux.tbl:125
+msgid "NFS"
+msgstr "NFS"
+
+#: ../gui/selinux.tbl:85
+msgid "Disable SELinux protection for gss daemon"
+msgstr "Deaktiviere SELinux Schutz für gss daemon"
+
+#: ../gui/selinux.tbl:86
+msgid "Disable SELinux protection for Hal daemon"
+msgstr "Deaktiviere SELinux-Schutz für Hal-Daemon"
+
+#: ../gui/selinux.tbl:87
+msgid "Compatibility"
+msgstr "Kompatibilität"
+
+#: ../gui/selinux.tbl:87
+msgid "Do not audit things that we know to be broken but which are not security risks"
+msgstr "Dinge, die als defekt bekannt sind, aber keine Gefährdung der Sicherheit darstellen, nicht überprüfen"
+
+#: ../gui/selinux.tbl:88
+msgid "Disable SELinux protection for hostname daemon"
+msgstr "Deaktiviere SELinux Schutz für hostname daemon"
+
+#: ../gui/selinux.tbl:89
+msgid "Disable SELinux protection for hotplug daemon"
+msgstr "Deaktiviere SELinux Schutz für hotplug daemon"
+
+#: ../gui/selinux.tbl:90
+msgid "Disable SELinux protection for howl daemon"
+msgstr "Deaktiviere SELinux Schutz für howl daemon"
+
+#: ../gui/selinux.tbl:91
+msgid "Disable SELinux protection for cups hplip daemon"
+msgstr "Deaktiviere SELinux Schutz für hplip daemon"
+
+#: ../gui/selinux.tbl:92
+msgid "Disable SELinux protection for httpd rotatelogs"
+msgstr "Deaktiviere SELinux Schutz für httpd rotatelogs"
+
+#: ../gui/selinux.tbl:93
+#: ../gui/selinux.tbl:232
+#: ../gui/selinux.tbl:233
+msgid "HTTPD Service"
+msgstr "HTTPD-Dienst"
+
+#: ../gui/selinux.tbl:93
+msgid "Disable SELinux protection for http suexec"
+msgstr "Deaktiviere SELinux Schutz für http suexec"
+
+#: ../gui/selinux.tbl:94
+msgid "Disable SELinux protection for hwclock daemon"
+msgstr "Deaktiviere SELinux Schutz für hwclock daemon"
+
+#: ../gui/selinux.tbl:95
+msgid "Disable SELinux protection for i18n daemon"
+msgstr "Deaktiviere SELinux Schutz für i18n daemon"
+
+#: ../gui/selinux.tbl:96
+msgid "Disable SELinux protection for imazesrv daemon"
+msgstr "Deaktiviere SELinux Schutz für imazesrv daemon"
+
+#: ../gui/selinux.tbl:97
+msgid "Disable SELinux protection for inetd child daemons"
+msgstr "Deaktiviere SELinux Schutz für inetd child daemons"
+
+#: ../gui/selinux.tbl:98
+msgid "Disable SELinux protection for inetd daemon"
+msgstr "Deaktiviere SELinux Schutz für inetd daemon"
+
+#: ../gui/selinux.tbl:99
+msgid "Disable SELinux protection for innd daemon"
+msgstr "Deaktiviere SELinux Schutz für innd daemon"
+
+#: ../gui/selinux.tbl:100
+msgid "Disable SELinux protection for iptables daemon"
+msgstr "Deaktiviere SELinux Schutz für iptables daemon"
+
+#: ../gui/selinux.tbl:101
+msgid "Disable SELinux protection for ircd daemon"
+msgstr "Deaktiviere SELinux Schutz für ircd daemon"
+
+#: ../gui/selinux.tbl:102
+msgid "Disable SELinux protection for irqbalance daemon"
+msgstr "Deaktiviere SELinux Schutz für irqbalance daemon"
+
+#: ../gui/selinux.tbl:103
+msgid "Disable SELinux protection for iscsi daemon"
+msgstr "Deaktiviere SELinux Schutz für iscsi daemon"
+
+#: ../gui/selinux.tbl:104
+msgid "Disable SELinux protection for jabberd daemon"
+msgstr "Deaktiviere SELinux Schutz für jabberd daemon"
+
+#: ../gui/selinux.tbl:105
+#: ../gui/selinux.tbl:107
+msgid "Kerberos"
+msgstr "Kerberos"
+
+#: ../gui/selinux.tbl:105
+msgid "Disable SELinux protection for kadmind daemon"
+msgstr "Deaktiviere SELinux Schutz für kadmind daemon"
+
+#: ../gui/selinux.tbl:106
+msgid "Disable SELinux protection for klogd daemon"
+msgstr "Deaktiviere SELinux Schutz für klogd daemon"
+
+#: ../gui/selinux.tbl:107
+msgid "Disable SELinux protection for krb5kdc daemon"
+msgstr "Deaktiviere SELinux Schutz für krb5kdc daemon"
+
+#: ../gui/selinux.tbl:108
+msgid "Disable SELinux protection for ktalk daemons"
+msgstr "Deaktiviere SELinux Schutz für ktalk daemons"
+
+#: ../gui/selinux.tbl:109
+msgid "Disable SELinux protection for kudzu daemon"
+msgstr "Deaktiviere SELinux Schutz für kudzu daemon"
+
+#: ../gui/selinux.tbl:110
+msgid "Disable SELinux protection for locate daemon"
+msgstr "Deaktiviere SELinux Schutz für locate daemon"
+
+#: ../gui/selinux.tbl:111
+msgid "Disable SELinux protection for lpd daemon"
+msgstr "Deaktiviere SELinux Schutz für lpd daemon"
+
+#: ../gui/selinux.tbl:112
+msgid "Disable SELinux protection for lrrd daemon"
+msgstr "Deaktiviere SELinux Schutz für lrrd daemon"
+
+#: ../gui/selinux.tbl:113
+msgid "Disable SELinux protection for lvm daemon"
+msgstr "Deaktiviere SELinux Schutz für lvm daemon"
+
+#: ../gui/selinux.tbl:114
+msgid "Disable SELinux protection for mailman"
+msgstr "Deaktiviere SELinux Schutz für mailman"
+
+#: ../gui/selinux.tbl:115
+msgid "Allow evolution and thunderbird to read user files"
+msgstr "Evolution und Thunderbird gestatten, Benutzerdateien zu lesen"
+
+#: ../gui/selinux.tbl:116
+msgid "Disable SELinux protection for mdadm daemon"
+msgstr "Deaktiviere SELinux Schutz für mdadm daemon"
+
+#: ../gui/selinux.tbl:117
+msgid "Disable SELinux protection for monopd daemon"
+msgstr "Deaktiviere SELinux Schutz für monopd daemon"
+
+#: ../gui/selinux.tbl:118
+msgid "Allow the mozilla browser to read user files"
+msgstr "Dem Mozilla-Browser gestatten, Benutzerdateien zu lesen"
+
+#: ../gui/selinux.tbl:119
+msgid "Disable SELinux protection for mrtg daemon"
+msgstr "Deaktiviere SELinux Schutz für mrtg daemon"
+
+#: ../gui/selinux.tbl:120
+msgid "Disable SELinux protection for mysqld daemon"
+msgstr "Deaktiviere SELinux Schutz für mysqld daemon"
+
+#: ../gui/selinux.tbl:121
+msgid "Disable SELinux protection for nagios daemon"
+msgstr "Deaktiviere SELinux Schutz für nagios daemon"
+
+#: ../gui/selinux.tbl:122
+#: ../gui/selinux.tbl:128
+msgid "Name Service"
+msgstr "Name-Dienst"
+
+#: ../gui/selinux.tbl:122
+msgid "Disable SELinux protection for named daemon"
+msgstr "Deaktiviere SELinux Schutz für named daemon"
+
+#: ../gui/selinux.tbl:123
+msgid "Disable SELinux protection for nessusd daemon"
+msgstr "Deaktiviere SELinux Schutz für nessusd daemon"
+
+#: ../gui/selinux.tbl:124
+msgid "Disable SELinux protection for NetworkManager"
+msgstr "Deaktiviere SELinux Schutz für NetworkManager"
+
+#: ../gui/selinux.tbl:125
+msgid "Disable SELinux protection for nfsd daemon"
+msgstr "Deaktiviere SELinux Schutz für nfsd daemon"
+
+#: ../gui/selinux.tbl:126
+#: ../gui/selinux.tbl:163
+#: ../gui/selinux.tbl:176
+#: ../gui/selinux.tbl:221
+msgid "Samba"
+msgstr "Samba"
+
+#: ../gui/selinux.tbl:126
+msgid "Disable SELinux protection for nmbd daemon"
+msgstr "Deaktiviere SELinux Schutz für nmbd daemon"
+
+#: ../gui/selinux.tbl:127
+msgid "Disable SELinux protection for nrpe daemon"
+msgstr "Deaktiviere SELinux Schutz für nrpe daemon"
+
+#: ../gui/selinux.tbl:128
+msgid "Disable SELinux protection for nscd daemon"
+msgstr "Deaktiviere SELinux Schutz für nscd daemon"
+
+#: ../gui/selinux.tbl:129
+msgid "Disable SELinux protection for nsd daemon"
+msgstr "Deaktiviere SELinux Schutz für nsd daemon"
+
+#: ../gui/selinux.tbl:130
+msgid "Disable SELinux protection for ntpd daemon"
+msgstr "Deaktiviere SELinux Schutz für ntpd daemon"
+
+#: ../gui/selinux.tbl:131
+msgid "Disable SELinux protection for oddjob"
+msgstr "Deaktiviere SELinux Schutz für oddjob"
+
+#: ../gui/selinux.tbl:132
+msgid "Disable SELinux protection for oddjob_mkhomedir"
+msgstr "Deaktiviere SELinux Schutz für oddjob_mkhomedir"
+
+#: ../gui/selinux.tbl:133
+msgid "Disable SELinux protection for openvpn daemon"
+msgstr "Deaktiviere SELinux Schutz für openvpn daemon"
+
+#: ../gui/selinux.tbl:134
+msgid "Disable SELinux protection for pam daemon"
+msgstr "Deaktiviere SELinux Schutz für pam daemon"
+
+#: ../gui/selinux.tbl:135
+msgid "Disable SELinux protection for pegasus"
+msgstr "Deaktiviere SELinux Schutz für pegasus"
+
+#: ../gui/selinux.tbl:136
+msgid "Disable SELinux protection for perdition daemon"
+msgstr "Deaktiviere SELinux Schutz für perdition daemon"
+
+#: ../gui/selinux.tbl:137
+msgid "Disable SELinux protection for portmap daemon"
+msgstr "Deaktiviere SELinux Schutz für portmap daemon"
+
+#: ../gui/selinux.tbl:138
+msgid "Disable SELinux protection for portslave daemon"
+msgstr "Deaktiviere SELinux Schutz für portslave daemon"
+
+#: ../gui/selinux.tbl:139
+msgid "Disable SELinux protection for postfix"
+msgstr "Deaktiviere SELinux Schutz für postfix"
+
+#: ../gui/selinux.tbl:140
+msgid "Disable SELinux protection for postgresql daemon"
+msgstr "Deaktiviere SELinux Schutz für postgresql daemon"
+
+#: ../gui/selinux.tbl:141
+msgid "pppd"
+msgstr "pppd"
+
+#: ../gui/selinux.tbl:141
+msgid "Allow pppd to be run for a regular user"
+msgstr "Gestatten, dass 'pppd' für einen regulären Benutzer ausgeführt wird"
+
+#: ../gui/selinux.tbl:142
+msgid "Disable SELinux protection for pptp"
+msgstr "Deaktiviere SELinux Schutz für pptp"
+
+#: ../gui/selinux.tbl:143
+msgid "Disable SELinux protection for prelink daemon"
+msgstr "Deaktiviere SELinux Schutz für prelink daemon"
+
+#: ../gui/selinux.tbl:144
+msgid "Disable SELinux protection for privoxy daemon"
+msgstr "Deaktiviere SELinux Schutz für privoxy daemon"
+
+#: ../gui/selinux.tbl:145
+msgid "Disable SELinux protection for ptal daemon"
+msgstr "Deaktiviere SELinux Schutz für ptal daemon"
+
+#: ../gui/selinux.tbl:146
+msgid "Disable SELinux protection for pxe daemon"
+msgstr "Deaktiviere SELinux Schutz für pxe daemon"
+
+#: ../gui/selinux.tbl:147
+msgid "Disable SELinux protection for pyzord"
+msgstr "Deaktiviere SELinux Schutz für pyzord"
+
+#: ../gui/selinux.tbl:148
+msgid "Disable SELinux protection for quota daemon"
+msgstr "Deaktiviere SELinux Schutz für quota daemon"
+
+#: ../gui/selinux.tbl:149
+msgid "Disable SELinux protection for radiusd daemon"
+msgstr "Deaktiviere SELinux Schutz für radiusd daemon"
+
+#: ../gui/selinux.tbl:150
+msgid "Disable SELinux protection for radvd daemon"
+msgstr "Deaktiviere SELinux Schutz für radvd daemon"
+
+#: ../gui/selinux.tbl:151
+msgid "Disable SELinux protection for rdisc"
+msgstr "Deaktiviere SELinux Schutz für rdisc"
+
+#: ../gui/selinux.tbl:152
+msgid "Disable SELinux protection for readahead"
+msgstr "Deaktiviere SELinux Schutz für readahead"
+
+#: ../gui/selinux.tbl:153
+msgid "Allow programs to read files in non-standard locations (default_t)"
+msgstr "Programmen gestatten, Dateien an nicht standardmässigen Orten zu lesen (default_t)"
+
+#: ../gui/selinux.tbl:154
+msgid "Disable SELinux protection for restorecond"
+msgstr "Deaktiviere SELinux Schutz für restorecond"
+
+#: ../gui/selinux.tbl:155
+msgid "Disable SELinux protection for rhgb daemon"
+msgstr "Deaktiviere SELinux Schutz für rhgb daemon"
+
+#: ../gui/selinux.tbl:156
+msgid "Disable SELinux protection for ricci"
+msgstr "Deaktiviere SELinux Schutz für ricci"
+
+#: ../gui/selinux.tbl:157
+msgid "Disable SELinux protection for ricci_modclusterd"
+msgstr "Deaktiviere SELinux Schutz für ricci_modclusterd"
+
+#: ../gui/selinux.tbl:158
+msgid "Disable SELinux protection for rlogind daemon"
+msgstr "Deaktiviere SELinux Schutz für rlogind daemon"
+
+#: ../gui/selinux.tbl:159
+msgid "Disable SELinux protection for rpcd daemon"
+msgstr "Deaktiviere SELinux Schutz für rpcd daemon"
+
+#: ../gui/selinux.tbl:160
+msgid "Disable SELinux protection for rshd"
+msgstr "Deaktiviere SELinux Schutz für rshd"
+
+#: ../gui/selinux.tbl:161
+msgid "rsync"
+msgstr "rsync"
+
+#: ../gui/selinux.tbl:161
+msgid "Disable SELinux protection for rsync daemon"
+msgstr "Deaktiviere SELinux Schutz für rsync daemon"
+
+#: ../gui/selinux.tbl:162
+msgid "Allow ssh to run from inetd instead of as a daemon"
+msgstr "SSH gestatten, von 'inetd' aus gestartet zu werden, anstatt als Daemon"
+
+#: ../gui/selinux.tbl:163
+msgid "Allow Samba to share nfs directories"
+msgstr "Samba gestatten, NFS-Verzeichnisse freizugeben"
+
+#: ../gui/selinux.tbl:164
+#: ../gui/selinux.tbl:166
+msgid "SASL authentication server"
+msgstr "SASL-Authentifizierungs-Server"
+
+#: ../gui/selinux.tbl:164
+msgid "Allow sasl authentication server to read /etc/shadow"
+msgstr "SASL-Authentifizierungs-Server gestatten, /etc/shadow zu lesen"
+
+#: ../gui/selinux.tbl:165
+msgid "Allow X-Windows server to map a memory region as both executable and writable"
+msgstr "Dem X-Windows-Server gestatten, einen Speicherbereich sowohl als ausführbar, als auch beschreibbar auszuweisen"
+
+#: ../gui/selinux.tbl:166
+msgid "Disable SELinux protection for saslauthd daemon"
+msgstr "Deaktiviere SELinux Schutz für saslauthd daemon"
+
+#: ../gui/selinux.tbl:167
+msgid "Disable SELinux protection for scannerdaemon daemon"
+msgstr "Deaktiviere SELinux Schutz für scannerdaemon daemon"
+
+#: ../gui/selinux.tbl:168
+msgid "Do not allow transition to sysadm_t, sudo and su effected"
+msgstr "Wechsel zu 'sysadm_t' nicht gestatten. Davon betroffen sind 'sudo' und 'su'"
+
+#: ../gui/selinux.tbl:169
+msgid "Do not allow any processes to load kernel modules"
+msgstr "Keinem Prozess gestatten, Kernel-Module zu laden"
+
+#: ../gui/selinux.tbl:170
+msgid "Do not allow any processes to modify kernel SELinux policy"
+msgstr "Keinem Prozess gestatten, die Kernel SELinux-Richtlinien zu verändern"
+
+#: ../gui/selinux.tbl:171
+msgid "Disable SELinux protection for sendmail daemon"
+msgstr "Deaktiviere SELinux Schutz für sendmail daemon"
+
+#: ../gui/selinux.tbl:172
+msgid "Disable SELinux protection for setrans"
+msgstr "Deaktiviere SELinux Schutz für setrans"
+
+#: ../gui/selinux.tbl:173
+msgid "Disable SELinux protection for setroubleshoot daemon"
+msgstr "Deaktiviere SELinux-Schutz für setroubleshoot-Daemon"
+
+#: ../gui/selinux.tbl:174
+msgid "Disable SELinux protection for slapd daemon"
+msgstr "Deaktiviere SELinux Schutz für slapd daemon"
+
+#: ../gui/selinux.tbl:175
+msgid "Disable SELinux protection for slrnpull daemon"
+msgstr "Deaktiviere SELinux Schutz für slrnpull daemon"
+
+#: ../gui/selinux.tbl:176
+msgid "Disable SELinux protection for smbd daemon"
+msgstr "Deaktiviere SELinux Schutz für smbd daemon"
+
+#: ../gui/selinux.tbl:177
+msgid "Disable SELinux protection for snmpd daemon"
+msgstr "Deaktiviere SELinux Schutz für snmpd daemon"
+
+#: ../gui/selinux.tbl:178
+msgid "Disable SELinux protection for snort daemon"
+msgstr "Deaktiviere SELinux Schutz für snort daemon"
+
+#: ../gui/selinux.tbl:179
+msgid "Disable SELinux protection for soundd daemon"
+msgstr "Deaktiviere SELinux Schutz für soundd daemon"
+
+#: ../gui/selinux.tbl:180
+msgid "Disable SELinux protection for sound daemon"
+msgstr "Deaktiviere SELinux Schutz für sound daemon"
+
+#: ../gui/selinux.tbl:181
+#: ../gui/selinux.tbl:182
+#: ../gui/selinux.tbl:183
+msgid "Spam Protection"
+msgstr "Spam-Schutz"
+
+#: ../gui/selinux.tbl:181
+msgid "Disable SELinux protection for spamd daemon"
+msgstr "Deaktiviere SELinux Schutz für spamd daemon"
+
+#: ../gui/selinux.tbl:182
+msgid "Allow spamd to access home directories"
+msgstr "'spamd' Zugriff auf Stammverzeichnisse gestatten"
+
+#: ../gui/selinux.tbl:183
+msgid "Allow Spam Assassin daemon network access"
+msgstr "Dem Spamassassin-Daemon Netzwerkzugriff gestatten"
+
+#: ../gui/selinux.tbl:184
+msgid "Disable SELinux protection for speedmgmt daemon"
+msgstr "Deaktiviere SELinux Schutz für speedmgmt daemon"
+
+#: ../gui/selinux.tbl:185
+#: ../gui/selinux.tbl:186
+msgid "Squid"
+msgstr "Squid"
+
+#: ../gui/selinux.tbl:185
+msgid "Allow squid daemon to connect to the network"
+msgstr "Dem Squid-Daemon gestatten, sich mit dem Netzwerk zu verbinden"
+
+#: ../gui/selinux.tbl:186
+msgid "Disable SELinux protection for squid daemon"
+msgstr "Deaktiviere SELinux Schutz für squid daemon"
+
+#: ../gui/selinux.tbl:187
+msgid "Disable SELinux protection for ssh daemon"
+msgstr "Deaktiviere SELinux Schutz für ssh daemon"
+
+#: ../gui/selinux.tbl:188
+msgid "Allow ssh logins as sysadm_r:sysadm_t"
+msgstr "SSH-Logins als 'sysadm_r:sysadm_t' gestatten"
+
+#: ../gui/selinux.tbl:189
+msgid "Allow staff_r users to search the sysadm home dir and read files (such as ~/.bashrc)"
+msgstr "'staff_r'-Benutzern gestatten, das 'sysadm'-Stammverzeichnis zu durchsuchen und Dateien zu lesen (z.B. ~/.bashrc)"
+
+#: ../gui/selinux.tbl:190
+#: ../gui/selinux.tbl:191
+msgid "Universal SSL tunnel"
+msgstr "Universeller SSL-Tunnel"
+
+#: ../gui/selinux.tbl:190
+msgid "Disable SELinux protection for stunnel daemon"
+msgstr "Deaktiviere SELinux Schutz für stunnel daemon"
+
+#: ../gui/selinux.tbl:191
+msgid "Allow stunnel daemon to run as standalone, outside of xinetd"
+msgstr "Dem stunnel-Daemon gestatten, als \"standalone\" zu laufen, ausserhalb von 'xinetd'"
+
+#: ../gui/selinux.tbl:192
+msgid "Disable SELinux protection for swat daemon"
+msgstr "Deaktiviere SELinux Schutz für swat daemon"
+
+#: ../gui/selinux.tbl:193
+msgid "Disable SELinux protection for sxid daemon"
+msgstr "Deaktiviere SELinux Schutz für sxid daemon"
+
+#: ../gui/selinux.tbl:194
+msgid "Disable SELinux protection for syslogd daemon"
+msgstr "Deaktiviere SELinux Schutz für syslogd daemon"
+
+#: ../gui/selinux.tbl:195
+msgid "Disable SELinux protection for system cron jobs"
+msgstr "Deaktiviere SELinux Schutz für system cron jobs"
+
+#: ../gui/selinux.tbl:196
+msgid "Disable SELinux protection for tcp daemon"
+msgstr "Deaktiviere SELinux Schutz für tcp daemon"
+
+#: ../gui/selinux.tbl:197
+msgid "Disable SELinux protection for telnet daemon"
+msgstr "Deaktiviere SELinux Schutz für telnet daemon"
+
+#: ../gui/selinux.tbl:198
+msgid "Disable SELinux protection for tftpd daemon"
+msgstr "Deaktiviere SELinux Schutz für tftpd daemon"
+
+#: ../gui/selinux.tbl:199
+msgid "Disable SELinux protection for transproxy daemon"
+msgstr "Deaktiviere SELinux Schutz für transproxy daemon"
+
+#: ../gui/selinux.tbl:200
+msgid "Disable SELinux protection for udev daemon"
+msgstr "Deaktiviere SELinux Schutz für udev daemon"
+
+#: ../gui/selinux.tbl:201
+msgid "Disable SELinux protection for uml daemon"
+msgstr "Deaktiviere SELinux Schutz für uml daemon"
+
+#: ../gui/selinux.tbl:202
+msgid "Allow xinetd to run unconfined, including any services it starts that do not have a domain transition explicitly defined"
+msgstr "'xinetd' gestatten, uneingeschränkt zu laufen, inklusive einiger Dienste, die gestartet werden, die keine Domain-Übertragung explizit definiert haben."
+
+#: ../gui/selinux.tbl:203
+msgid "Allow rc scripts to run unconfined, including any daemon started by an rc script that does not have a domain transition explicitly defined"
+msgstr "rc-Skripten gestatten, uneingeschränkt zu laufen, inklusive beliebiger Daemons, die von einem rc-Skript gestartet werden, das keine Domain-Übertragung explizit definiert hat"
+
+#: ../gui/selinux.tbl:204
+msgid "Allow rpm to run unconfined"
+msgstr "'rpm' gestatten, ohne Einschränkungen zu laufen"
+
+#: ../gui/selinux.tbl:205
+msgid "Allow privileged utilities like hotplug and insmod to run unconfined"
+msgstr "Privilegierten Dienstprogrammen wie 'hotplug' und 'insmod' gestatten, ohne Einschränkung zu laufen"
+
+#: ../gui/selinux.tbl:206
+msgid "Disable SELinux protection for updfstab daemon"
+msgstr "Deaktiviere SELinux Schutz für updfstab daemon"
+
+#: ../gui/selinux.tbl:207
+msgid "Disable SELinux protection for uptimed daemon"
+msgstr "Deaktiviere SELinux Schutz für uptimed daemon"
+
+#: ../gui/selinux.tbl:208
+msgid "Allow user_r to reach sysadm_r via su, sudo, or userhelper. Otherwise, only staff_r can do so"
+msgstr "'user_r' gestatten, 'sysadm_r'-Rechte via 'su', 'sudo' oder 'userhelper' zu erlangen. Ansonsten ist dies lediglich 'staff_r' gestattet"
+
+#: ../gui/selinux.tbl:209
+msgid "Allow users to execute the mount command"
+msgstr "Benutzern gestatten, den Befehl 'mount' auszuführen"
+
+#: ../gui/selinux.tbl:210
+msgid "Allow regular users direct mouse access (only allow the X server)"
+msgstr "Regulären Benutzern direkten Zugriff auf die Maus gestatten (nur dem X-Server gestatten)"
+
+#: ../gui/selinux.tbl:211
+msgid "Allow users to run the dmesg command"
+msgstr "Benutzern gestatten, den Befehl 'dmesg' auszuführen"
+
+#: ../gui/selinux.tbl:212
+msgid "Allow users to control network interfaces (also needs USERCTL=true)"
+msgstr "Benutzern gestatten, Netzwerkschnittstellen zu kontrollieren (setzt ebenfalls USERCTL=true voraus)"
+
+#: ../gui/selinux.tbl:213
+msgid "Allow normal user to execute ping"
+msgstr "Einem normalen Benutzer gestatten, 'ping' auszuführen"
+
+#: ../gui/selinux.tbl:214
+msgid "Allow user to r/w noextattrfile (FAT, CDROM, FLOPPY)"
+msgstr "Benutzer r/w noextattrfile (FAT, CDROM, FLOPPY) gestatten"
+
+#: ../gui/selinux.tbl:215
+msgid "Allow users to rw usb devices"
+msgstr "Benutzern gestatten, USB-Geräte zu lesen/beschreiben"
+
+#: ../gui/selinux.tbl:216
+msgid "Allow users to run TCP servers (bind to ports and accept connection from the same domain and outside users)  disabling this forces FTP passive mode and may change other protocols"
+msgstr "Benutzern gestatten, TCP-Server auszuführen (Verbindung zu Ports und Annahme der Verbindung aus derselben Domain und ausserhalb 'users'). Wird dies verweigert, muss FTP im Passiv-Modus laufen und verändert ggf. auch andere Protokolle"
+
+#: ../gui/selinux.tbl:217
+msgid "Allow user to stat ttyfiles"
+msgstr "Benutzer gestatten, 'ttyfiles' statistisch anzusehen"
+
+#: ../gui/selinux.tbl:218
+msgid "Disable SELinux protection for uucpd daemon"
+msgstr "Deaktiviere SELinux Schutz für uucpd daemon"
+
+#: ../gui/selinux.tbl:219
+msgid "Disable SELinux protection for vmware daemon"
+msgstr "Deaktiviere SELinux Schutz für vmware daemon"
+
+#: ../gui/selinux.tbl:220
+msgid "Disable SELinux protection for watchdog daemon"
+msgstr "Deaktiviere SELinux Schutz für watchdog daemon"
+
+#: ../gui/selinux.tbl:221
+msgid "Disable SELinux protection for winbind daemon"
+msgstr "Deaktiviere SELinux Schutz für winbind daemon"
+
+#: ../gui/selinux.tbl:222
+msgid "Disable SELinux protection for xdm daemon"
+msgstr "Deaktiviere SELinux Schutz für xdm daemon"
+
+#: ../gui/selinux.tbl:223
+msgid "Allow xdm logins as sysadm_r:sysadm_t"
+msgstr "'xdm' Logins als 'sysadm_r:sysadm_t' gestatten"
+
+#: ../gui/selinux.tbl:224
+msgid "Disable SELinux protection for xen daemon"
+msgstr "Deaktiviere SELinux Schutz für xen daemon"
+
+#: ../gui/selinux.tbl:225
+msgid "XEN"
+msgstr "XEN"
+
+#: ../gui/selinux.tbl:225
+msgid "Allow xen to read/write physical disk devices"
+msgstr "'xen' gestatten, physikalische Plattengeräte zu lesen/beschreiben"
+
+#: ../gui/selinux.tbl:226
+msgid "Disable SELinux protection for xfs daemon"
+msgstr "Deaktiviere SELinux Schutz für xfs daemon"
+
+#: ../gui/selinux.tbl:227
+msgid "Disable SELinux protection for xen control"
+msgstr "Deaktiviere SELinux-Schutz für xen-Daemon"
+
+#: ../gui/selinux.tbl:228
+msgid "Disable SELinux protection for ypbind daemon"
+msgstr "Deaktiviere SELinux Schutz für ypbind daemon"
+
+#: ../gui/selinux.tbl:229
+msgid "Disable SELinux protection for NIS Password Daemon"
+msgstr "Deaktiviere SELinux Schutz für NIS Password Daemon"
+
+#: ../gui/selinux.tbl:230
+msgid "Disable SELinux protection for ypserv daemon"
+msgstr "Deaktiviere SELinux Schutz für ypserv daemon"
+
+#: ../gui/selinux.tbl:231
+msgid "Disable SELinux protection for NIS Transfer Daemon"
+msgstr "Deaktiviere SELinux Schutz für NIS Transfer Daemon"
+
+#: ../gui/selinux.tbl:232
+msgid "Allow SELinux webadm user to manage unprivileged users home directories"
+msgstr "Dem SELinux-Benutzer webadm gestatten, nicht privilegierte Benutzerverzeichnisse zu verwalten"
+
+#: ../gui/selinux.tbl:233
+msgid "Allow SELinux webadm user to read unprivileged users home directories"
+msgstr "Dem SELinux-Benutzer webadm gestatten, nicht privilegierte Benutzerverzeichnisse zu lesen"
+
+#: ../gui/semanagePage.py:126
+#, python-format
+msgid "Are you sure you want to delete %s '%s'?"
+msgstr "Möchten Sie %s '%s' wirklich löschen?"
+
+#: ../gui/semanagePage.py:126
+#, python-format
+msgid "Delete %s"
+msgstr "%s löschen"
+
+#: ../gui/semanagePage.py:134
+#, python-format
+msgid "Add %s"
+msgstr "Hinzufügen von %s"
+
+#: ../gui/semanagePage.py:149
+#, python-format
+msgid "Modify %s"
+msgstr "%s ändern"
+
+#: ../gui/statusPage.py:69
+msgid "Permissive"
+msgstr "Permissive"
+
+#: ../gui/statusPage.py:70
+msgid "Enforcing"
+msgstr "Enforcing"
+
+#: ../gui/statusPage.py:75
+msgid "Disabled"
+msgstr "Deaktiviert"
+
+#: ../gui/statusPage.py:94
+msgid "Status"
+msgstr "Status"
+
+#: ../gui/statusPage.py:133
+msgid "Changing the policy type will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system.  Do you wish to continue?"
+msgstr "Wenn der Richtlinientyp geändert wird, muss beim nächsten Neustart das vollständige Dateisystem neu beschriftet werden. Das Neubeschriften wird, je nach Grösse des Dateisystems, sehr lange dauern. Wollen Sie fortfahren?"
+
+#: ../gui/statusPage.py:147
+msgid "Changing to SELinux disabled requires a reboot.  It is not recommended.  If you later decide to turn SELinux back on, the system will be required to relabel.  If you just want to see if SELinux is causing a problem on your system, you can go to permissive mode which will only log errors and not enforce SELinux policy.  Permissive mode does not require a reboot    Do you wish to continue?"
+msgstr "Das Deaktivieren von SELinux erfordert einen Neustart. Es wird nicht empfohlen. Falls Sie nachträglich entscheiden, SELinux wieder zu aktivieren, muss das System neu gekennzeichnet werden. Falls Sie nur überprüfen möchten, ob SELinux ein Problem auf Ihrem System verursacht, können Sie in den 'permissive' Modus wechseln, in dem Fehler lediglich protokolliert, die SELinux-Richtlinien jedoch nicht erzwungen werden. Der 'permissive' Modus erfordert keinen Neustart. Möchten Sie fortfahren?"
+
+#: ../gui/statusPage.py:152
+msgid "Changing to SELinux enabled will cause a relabel of the entire file system on the next boot. Relabeling takes a long time depending on the size of the file system.  Do you wish to continue?"
+msgstr "Das Aktivieren von SELinux führt eine komplette Neu-Kennzeichnung des gesamten Dateisystems beim nächsten Neustart nach sich. Das Neu-Kennzeichnen dauert sehr lange, abhängig von der Grösse des Dateisystems. Möchten Sie fortfahren?"
+
+#: ../gui/system-config-selinux.glade.h:1
+msgid "<b>Select:</b>"
+msgstr "<b>Wählen Sie aus:</b>"
+
+#: ../gui/system-config-selinux.glade.h:2
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:3
+msgid "Add File Context"
+msgstr "Dateikontext hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:4
+msgid "Add Network Port"
+msgstr "Netzwerk-Port hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:5
+msgid "Add SELinux Login Mapping"
+msgstr "SELinux Login-Zuweisung hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:6
+msgid "Add SELinux Network Ports"
+msgstr "SELinux Netzwerk-Ports hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:7
+msgid "Add SELinux User"
+msgstr "SELinux-Benutzer hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:8
+msgid "Add SELinux User Mapping"
+msgstr "SELinux Benutzerzuweisung hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:9
+msgid "Add Translation"
+msgstr "Übersetzung hinzufügen"
+
+#: ../gui/system-config-selinux.glade.h:10
+msgid ""
+"Copyright (c)2006 Red Hat, Inc.\n"
+"Copyright (c) 2006 Dan Walsh <dwalsh at redhat.com>"
+msgstr ""
+"Copyright (c)2006 Red Hat, Inc.\n"
+"Copyright (c) 2006 Dan Walsh <dwalsh at redhat.com>"
+
+#: ../gui/system-config-selinux.glade.h:12
+msgid "Current Enforcing Mode"
+msgstr "Derzeitiger Enforcing-Modus"
+
+#: ../gui/system-config-selinux.glade.h:14
+msgid "Delete File Context"
+msgstr "Dateikontext löschen"
+
+#: ../gui/system-config-selinux.glade.h:15
+msgid "Delete Network Port"
+msgstr "Netzwerk-Port löschen"
+
+#: ../gui/system-config-selinux.glade.h:16
+msgid "Delete SELinux User Mapping"
+msgstr "SELinux-Benutzerzuordnung löschen"
+
+#: ../gui/system-config-selinux.glade.h:17
+msgid "Delete Translation"
+msgstr "Übersetzung löschen"
+
+#: ../gui/system-config-selinux.glade.h:18
+msgid ""
+"Disabled\n"
+"Permissive\n"
+"Enforcing\n"
+msgstr ""
+"Deaktiviert\n"
+"Permissive\n"
+"Enforcing\n"
+
+#: ../gui/system-config-selinux.glade.h:22
+msgid "Edit Network Port"
+msgstr "Netzwerk-Port bearbeiten"
+
+#: ../gui/system-config-selinux.glade.h:24
+msgid "Enable/Disable additional audit rules, that are normally not reported in the log files."
+msgstr "Zusätzliche Prüfregeln aktivieren/deaktivieren, die normalerweise nicht in den Protokolldateien erscheinen."
+
+#: ../gui/system-config-selinux.glade.h:25
+msgid "File Specification"
+msgstr "Dateispezifikation"
+
+#: ../gui/system-config-selinux.glade.h:26
+msgid "File Type"
+msgstr "Dateityp"
+
+#: ../gui/system-config-selinux.glade.h:27
+msgid "Filter"
+msgstr "Filter"
+
+#: ../gui/system-config-selinux.glade.h:28
+msgid "Generate new policy module"
+msgstr "Neues Richtlinienmodul generieren"
+
+#: ../gui/system-config-selinux.glade.h:30
+msgid "Load policy module"
+msgstr "Richtlinienmodul laden"
+
+#: ../gui/system-config-selinux.glade.h:32
+msgid "MLS"
+msgstr "MLS"
+
+#: ../gui/system-config-selinux.glade.h:36
+msgid "Modify File Context"
+msgstr "Datei-Kontext ändern"
+
+#: ../gui/system-config-selinux.glade.h:37
+msgid "Modify SELinux User"
+msgstr "SELinux-Benutzer modifizieren"
+
+#: ../gui/system-config-selinux.glade.h:38
+msgid "Modify SELinux User Mapping"
+msgstr "SELinux-Benutzer Benutzerzuordnung"
+
+#: ../gui/system-config-selinux.glade.h:39
+msgid "Modify Translation"
+msgstr "Ãœbersetzung bearbeiten"
+
+#: ../gui/system-config-selinux.glade.h:42
+msgid "Relabel on next reboot."
+msgstr "Beim nächsten Neustart neu kennzeichnen."
+
+#: ../gui/system-config-selinux.glade.h:43
+msgid "Remove loadable policy module"
+msgstr "Ladbares Richtlinienmodul entfernen"
+
+#: ../gui/system-config-selinux.glade.h:44
+msgid "Revert boolean setting to system default"
+msgstr "Boolsche Einstellungen auf Standardeinstellungen des Systems zurücksetzen"
+
+#: ../gui/system-config-selinux.glade.h:45
+msgid "SELinux Administration"
+msgstr "SELinux-Administration"
+
+#: ../gui/system-config-selinux.glade.h:46
+msgid ""
+"SELinux MLS/MCS\n"
+"Level"
+msgstr ""
+"SELinux MLS/MCS\n"
+"Level"
+
+#: ../gui/system-config-selinux.glade.h:49
+msgid "SELinux Type"
+msgstr "SELinux-Typ"
+
+#: ../gui/system-config-selinux.glade.h:51
+msgid "Select Management Object"
+msgstr "Management-Objekt auswählen"
+
+#: ../gui/system-config-selinux.glade.h:52
+msgid "Select if you wish to relabel then entire file system on next reboot.  Relabeling can take a very long time, depending on the size of the system.  If you are changing policy types or going from disabled to enforcing, a relabel is required."
+msgstr "Wählen Sie aus, ob Sie das gesamte Dateisystem beim nächsten Neustart neu kennzeichnen möchten. Das Neu-Kennzeichnen kann sehr lange dauern, abhängig von der Grösse des Systems. Falls Sie die Richtlinientypen ändern oder vom Zustand 'disabled' zu 'enforcing' wechseln, ist eine Neu-Kennzeichnung erforderlich."
+
+#: ../gui/system-config-selinux.glade.h:53
+msgid "System Default Enforcing Mode"
+msgstr "Standard-Enforcing-Modus des Systems"
+
+#: ../gui/system-config-selinux.glade.h:54
+msgid "System Default Policy Type: "
+msgstr "Systemstandard-Richtlinientyp: "
+
+#: ../gui/system-config-selinux.glade.h:55
+msgid "Toggle between Customized and All Booleans"
+msgstr "Zwischen 'Angepasst' und 'Alles Boolsche Werte' auswählen"
+
+#: ../gui/system-config-selinux.glade.h:56
+msgid "Toggle between Customized and All Ports"
+msgstr "Zwischen 'Angepasst' und 'Alle Ports' auswählen"
+
+#: ../gui/system-config-selinux.glade.h:57
+msgid "Toggle between all and customized file context"
+msgstr "Zwischen 'Alles' oder 'Angepasstem Dateikontext' auswählen"
+
+#: ../gui/system-config-selinux.glade.h:59
+msgid "_Delete"
+msgstr "_Löschen"
+
+#: ../gui/system-config-selinux.glade.h:60
+msgid "_Properties"
+msgstr "_Einstellungen"
+
+#: ../gui/system-config-selinux.glade.h:61
+msgid ""
+"all files\n"
+"regular file\n"
+"directory\n"
+"character device\n"
+"block device\n"
+"socket\n"
+"symbolic link\n"
+"named pipe\n"
+msgstr ""
+"alle Dateien\n"
+"reguläre Datei\n"
+"Verzeichnis\n"
+"Zeichengerät\n"
+"Blockgerät\n"
+"Socket\n"
+"symbolischer Link\n"
+"Named-Pipe\n"
+
+#: ../gui/system-config-selinux.glade.h:70
+msgid "system-config-selinux"
+msgstr "system-config-selinux"
+
+#: ../gui/system-config-selinux.glade.h:71
+msgid ""
+"tcp\n"
+"udp"
+msgstr ""
+"tcp\n"
+"udp"
+
+#: ../gui/translationsPage.py:53
+msgid "Sensitvity Level"
+msgstr "Empfindlichkeitsstufe"
+
+#: ../gui/usersPage.py:138
+#, python-format
+msgid "SELinux user '%s' is required"
+msgstr "SELinux-Benutzer '%s' wird benötigt"
+
+#~ msgid "Invalid prefix %s"
+#~ msgstr "Ungültiges Präfix %s"
+#~ msgid "Allow application/user role to bind to any tcp ports > 1024"
 #~ msgstr ""
-#~ "eine Authentifikation ist erforderlich um eine lokale Datei zu "
-#~ "installieren"
-#~ msgid "Authentication is required to install a package"
-#~ msgstr "eine Authentifikation ist erforderlich um ein Paket zu installieren"
-#~ msgid "Authentication is required to install a security signature"
+#~ "Erlaubt Applikationsrolle/Benutzer-Rolle, sich mit einem beliebigen TCP-"
+#~ "Port > 1024 zu verbinden"
+#~ msgid "Allows confined application/user role to bind to any tcp port"
 #~ msgstr ""
-#~ "eine Authentifikation ist erforderlich um eine digitale Unterschrift zu "
-#~ "installieren"
-#~ msgid "Authentication is required to refresh the package lists"
+#~ "Erlaubt einer eingeschränkten Applikationsrolle/einem eingeschränkten "
+#~ "Benutzer-Rolle sich mit jedem beliebigen TCP-Port zu verbinden"
+#~ msgid ""
+#~ "Enter a comma separated list of tcp ports or ranges of ports that "
+#~ "application/user role binds to. Example: 612, 650-660"
 #~ msgstr ""
-#~ "eine Authentifikation ist erforderlich um die Paketliste zu aktualisieren"
-#~ msgid "Authentication is required to remove packages"
-#~ msgstr "eine Authentifikation ist erforderlich um Pakete zu entfernen"
-#~ msgid "Authentication is required to rollback a transaction"
+#~ "Geben Sie eine durch Kommas getrennte Liste von TCP-Ports oder einen "
+#~ "Bereich an, an welche Applikation/Benutzer-Rollen gebunden werden. "
+#~ "Beispiel: 612, 650-660"
+#~ msgid "SELinux Policy Generation Druid"
+#~ msgstr "Druid zum Erstellen von SELinux-Richtlinien"
+#~ msgid "Unreserved Ports  (> 1024)"
+#~ msgstr "Nicht reservierte Ports  (>1024)"
+#~ msgid "Use this checkbutton if your app calls bindresvport with 0."
 #~ msgstr ""
-#~ "eine Authentifikation ist erforderlich um eine Transaktion rückgängig zu "
-#~ "machen"
-#~ msgid "Authentication is required to update all packages"
+#~ "Verwenden Sie diese Schaltfläche, wenn Ihre Applikation bindresvport mit "
+#~ "0 aufruft."
+#~ msgid ""
+#~ "Enforcing\n"
+#~ "Permissive\n"
+#~ "Disabled\n"
 #~ msgstr ""
-#~ "eine Authentifikation ist erforderlich um alle Pakete zu aktualisieren"
-#~ msgid "Authentication is required to update packages"
-#~ msgstr "eine Authentifikation ist erforderlich um Pakete zu aktualisieren"
-#~ msgid "Change software source parameters"
-#~ msgstr "Softwarequellen ändern"
-#~ msgid "Install local file"
-#~ msgstr "Lokale Datei installieren"
-#~ msgid "Install package"
-#~ msgstr "Paket installieren"
-#~ msgid "Install security signature"
-#~ msgstr "digitale Unterschrift installieren"
-#~ msgid "Refresh package lists"
-#~ msgstr "Paketlisten aktualisieren"
-#~ msgid "Remove package"
-#~ msgstr "Paket entfernen"
-#~ msgid "Rollback to a previous transaction"
-#~ msgstr "Wiederherstellung zu einer vorherigen Transaktion"
-#~ msgid "Update all packages"
-#~ msgstr "Alle Pakete aktualisieren"
-#~ msgid "Update package"
-#~ msgstr "Paket aktualisieren"
+#~ "Enforcing\n"
+#~ "Permissive\n"
+#~ "Deaktiviert\n"
 
commit 7f68d106a95219498cb237524abc4680c6331c70
Author: Fabian Affolter <fabian at bernewireless.net>
Date:   Tue Jul 22 07:26:13 2008 +0000

    2008-07-22  Fabian Affolter <fabian at bernewireless.net> (via
    fab at fedoraproject.org)
    
      * po/de.po: Updated German translation

diff --git a/po/de.po b/po/de.po
index 1496e28..ff15df4 100644
--- a/po/de.po
+++ b/po/de.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: PackageKit\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2008-06-10 17:24+0000\n"
-"PO-Revision-Date: 2008-07-07 11:56+0100\n"
+"PO-Revision-Date: 2008-07-22 09:21+0100\n"
 "Last-Translator: Fabian Affolter <fab at fedoraproject.org>\n"
 "Language-Team: German <fedora-trans-de at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -58,7 +58,7 @@ msgstr "Es konnten weder installierte noch zu installierende Paket mit diesem Na
 
 #: ../client/pk-console.c:737
 msgid "Could not find a package to remove"
-msgstr "Es konnte kein Paket zum Deinstallieren finden"
+msgstr "Es konnte kein Paket zum Entfernen finden"
 
 #: ../client/pk-console.c:806
 msgid "The following packages have to be removed"
commit ef75e9a3f6295ac6a0b59f147695d3e84cc12b81
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 18:21:44 2008 +0100

    API CHANGE: GetRole() now returns the role and the search parameter or the package _name_. Not knowing if we are getting a package_id or free text is just bad API design

diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 3706e32..1f865d0 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -932,7 +932,7 @@ pk_client_get_progress (PkClient *client, guint *percentage, guint *subpercentag
  * pk_client_get_role:
  * @client: a valid #PkClient instance
  * @role: a PkRoleEnum value such as %PK_ROLE_ENUM_UPDATE_SYSTEM
- * @package_id: the primary %package_id or thing associated with the role
+ * @text: the primary search term or package name associated with the role
  * @error: a %GError to put the error code and message in, or %NULL
  *
  * The role is the action of the transaction as does not change for the entire
@@ -941,11 +941,11 @@ pk_client_get_progress (PkClient *client, guint *percentage, guint *subpercentag
  * Return value: %TRUE if we found the status successfully
  **/
 gboolean
-pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **package_id, GError **error)
+pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **text, GError **error)
 {
 	gboolean ret;
 	gchar *role_text;
-	gchar *package_id_temp;
+	gchar *text_temp;
 
 	g_return_val_if_fail (PK_IS_CLIENT (client), FALSE);
 	g_return_val_if_fail (role != NULL, FALSE);
@@ -957,7 +957,7 @@ pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **package_id, GErr
 	}
 
 	/* we can avoid a trip to the daemon */
-	if (package_id == NULL && client->priv->role != PK_ROLE_ENUM_UNKNOWN) {
+	if (text == NULL && client->priv->role != PK_ROLE_ENUM_UNKNOWN) {
 		*role = client->priv->role;
 		return TRUE;
 	}
@@ -965,15 +965,15 @@ pk_client_get_role (PkClient *client, PkRoleEnum *role, gchar **package_id, GErr
 	ret = dbus_g_proxy_call (client->priv->proxy, "GetRole", error,
 				 G_TYPE_INVALID,
 				 G_TYPE_STRING, &role_text,
-				 G_TYPE_STRING, &package_id_temp,
+				 G_TYPE_STRING, &text_temp,
 				 G_TYPE_INVALID);
 	if (ret) {
 		*role = pk_role_enum_from_text (role_text);
 		g_free (role_text);
-		if (package_id != NULL) {
-			*package_id = package_id_temp;
+		if (text != NULL) {
+			*text = text_temp;
 		} else {
-			g_free (package_id_temp);
+			g_free (text_temp);
 		}
 	}
 	pk_client_error_fixup (error);
diff --git a/libpackagekit/pk-client.h b/libpackagekit/pk-client.h
index c4a4d4e..6f5797d 100644
--- a/libpackagekit/pk-client.h
+++ b/libpackagekit/pk-client.h
@@ -175,7 +175,7 @@ gboolean	 pk_client_get_status			(PkClient	*client,
 							 GError		**error);
 gboolean	 pk_client_get_role			(PkClient	*client,
 							 PkRoleEnum	*role,
-							 gchar		**package_id,
+							 gchar		**text,
 							 GError		**error);
 gboolean	 pk_client_get_progress			(PkClient	*client,
 							 guint		*percentage,
diff --git a/libpackagekit/pk-task-list.c b/libpackagekit/pk-task-list.c
index e203462..d374f08 100644
--- a/libpackagekit/pk-task-list.c
+++ b/libpackagekit/pk-task-list.c
@@ -101,7 +101,7 @@ pk_task_list_print (PkTaskList *tlist)
 	for (i=0; i<length; i++) {
 		item = g_ptr_array_index (tlist->priv->task_list, i);
 		pk_debug ("%s\t%s:%s %s", item->tid, pk_role_enum_to_text (item->role),
-			 pk_status_enum_to_text (item->status), item->package_id);
+			 pk_status_enum_to_text (item->status), item->text);
 	}
 	return TRUE;
 }
@@ -257,7 +257,7 @@ pk_task_list_refresh (PkTaskList *tlist)
 				g_error_free (error);
 				break;
 			}
-			pk_client_get_role (item->monitor, &item->role, &item->package_id, NULL);
+			pk_client_get_role (item->monitor, &item->role, &item->text, NULL);
 			pk_client_get_status (item->monitor, &item->status, NULL);
 
 			/* add to watched array */
@@ -275,7 +275,7 @@ pk_task_list_refresh (PkTaskList *tlist)
 			g_object_unref (item->monitor);
 			g_ptr_array_remove (tlist->priv->task_list, item);
 			g_free (item->tid);
-			g_free (item->package_id);
+			g_free (item->text);
 			g_free (item);
 		}
 	}
@@ -465,7 +465,7 @@ pk_task_list_finalize (GObject *object)
 	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->package_id);
+		g_free (item->text);
 		g_ptr_array_remove (tlist->priv->task_list, item);
 		g_free (item);
 	}
diff --git a/libpackagekit/pk-task-list.h b/libpackagekit/pk-task-list.h
index 47e57a1..5a67ef4 100644
--- a/libpackagekit/pk-task-list.h
+++ b/libpackagekit/pk-task-list.h
@@ -44,7 +44,7 @@ typedef struct
 	gchar			*tid;
 	PkStatusEnum		 status;
 	PkRoleEnum		 role;
-	gchar			*package_id;
+	gchar			*text;
 	PkClient		*monitor;
 	gboolean		 valid;
 } PkTaskListItem;
diff --git a/src/pk-interface-transaction.xml b/src/pk-interface-transaction.xml
index 6ba188d..9097ab8 100644
--- a/src/pk-interface-transaction.xml
+++ b/src/pk-interface-transaction.xml
@@ -425,11 +425,12 @@
           </doc:summary>
         </doc:doc>
       </arg>
-      <arg type="s" name="package_id" direction="out">
+      <arg type="s" name="text" direction="out">
         <doc:doc>
           <doc:summary>
             <doc:para>
-              The original package_id that was used to start the transaction.
+              The original search terms or package names that are used to start the transaction.
+              Multiple entries are split using <literal>;</literal>.
             </doc:para>
           </doc:summary>
         </doc:doc>
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index f5bd8db..bfec63a 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -87,7 +87,7 @@ struct PkTransactionPrivate
 	PkSecurity		*security;
 
 	/* needed for gui coldplugging */
-	gchar			*last_package;
+	gchar			*last_package_id;
 	gchar			*dbus_name;
 	gchar			*tid;
 	PkPackageList		*package_list;
@@ -255,21 +255,29 @@ pk_transaction_set_role (PkTransaction *transaction, PkRoleEnum role)
 /**
  * pk_transaction_get_text:
  **/
-const gchar *
+gchar *
 pk_transaction_get_text (PkTransaction *transaction)
 {
+	PkPackageId *id;
+	gchar *text = NULL;
+
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), NULL);
 	g_return_val_if_fail (transaction->priv->tid != NULL, NULL);
 
 	if (transaction->priv->cached_package_id != NULL) {
-		return transaction->priv->cached_package_id;
+		id = pk_package_id_new_from_string (transaction->priv->cached_package_id);
+		text = g_strdup (id->name);
+		pk_package_id_free (id);
 	} else if (transaction->priv->cached_package_ids != NULL) {
-		return transaction->priv->cached_package_ids[0];
+		/* FIXME: join all with ';' */
+		id = pk_package_id_new_from_string (transaction->priv->cached_package_ids[0]);
+		text = g_strdup (id->name);
+		pk_package_id_free (id);
 	} else if (transaction->priv->cached_search != NULL) {
-		return transaction->priv->cached_search;
+		text = g_strdup (transaction->priv->cached_search);
 	}
 
-	return NULL;
+	return text;
 }
 
 /**
@@ -541,7 +549,6 @@ static void
 pk_transaction_package_cb (PkBackend *backend, const PkPackageObj *obj, PkTransaction *transaction)
 {
 	const gchar *info_text;
-	gchar *package_id;
 
 	g_return_if_fail (PK_IS_TRANSACTION (transaction));
 	g_return_if_fail (transaction->priv->tid != NULL);
@@ -569,9 +576,10 @@ pk_transaction_package_cb (PkBackend *backend, const PkPackageObj *obj, PkTransa
 	pk_package_list_add_obj (transaction->priv->package_list, obj);
 
 	/* emit */
-	package_id = pk_package_id_to_string (obj->id);
-	g_signal_emit (transaction, signals [PK_TRANSACTION_PACKAGE], 0, info_text, package_id, obj->summary);
-	g_free (package_id);
+	g_free (transaction->priv->last_package_id);
+	transaction->priv->last_package_id = pk_package_id_to_string (obj->id);
+	g_signal_emit (transaction, signals [PK_TRANSACTION_PACKAGE], 0, info_text,
+		       transaction->priv->last_package_id, obj->summary);
 }
 
 /**
@@ -1563,12 +1571,12 @@ pk_transaction_get_package_last (PkTransaction *transaction, gchar **package_id,
 
 	pk_debug ("GetPackageLast method called");
 
-	if (transaction->priv->last_package == NULL) {
+	if (transaction->priv->last_package_id == NULL) {
 		g_set_error (error, PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_INVALID_STATE,
 			     "No package data available");
 		return FALSE;
 	}
-	*package_id = g_strdup (transaction->priv->last_package);
+	*package_id = g_strdup (transaction->priv->last_package_id);
 	return TRUE;
 }
 
@@ -1724,9 +1732,9 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, gc
  **/
 gboolean
 pk_transaction_get_role (PkTransaction *transaction,
-			 const gchar **role, const gchar **package_id, GError **error)
+			 const gchar **role, const gchar **text, GError **error)
 {
-	const gchar *text;
+	gchar *text_temp;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
 
@@ -1738,9 +1746,10 @@ pk_transaction_get_role (PkTransaction *transaction,
 		return FALSE;
 	}
 
-	text = pk_transaction_get_text (transaction);
+	text_temp = pk_transaction_get_text (transaction);
 	*role = g_strdup (pk_role_enum_to_text (transaction->priv->role));
-	*package_id = g_strdup (text);
+	*text = g_strdup (text_temp);
+	g_free (text_temp);
 	return TRUE;
 }
 
@@ -3207,7 +3216,7 @@ pk_transaction_init (PkTransaction *transaction)
 	transaction->priv->cached_repo_id = NULL;
 	transaction->priv->cached_parameter = NULL;
 	transaction->priv->cached_value = NULL;
-	transaction->priv->last_package = NULL;
+	transaction->priv->last_package_id = NULL;
 	transaction->priv->tid = NULL;
 	transaction->priv->role = PK_ROLE_ENUM_UNKNOWN;
 
@@ -3242,7 +3251,7 @@ pk_transaction_finalize (GObject *object)
 	transaction = PK_TRANSACTION (object);
 	g_return_if_fail (transaction->priv != NULL);
 
-	g_free (transaction->priv->last_package);
+	g_free (transaction->priv->last_package_id);
 	g_free (transaction->priv->dbus_name);
 	g_free (transaction->priv->cached_package_id);
 	g_free (transaction->priv->cached_key_id);
diff --git a/src/pk-transaction.h b/src/pk-transaction.h
index 316d057..0717990 100644
--- a/src/pk-transaction.h
+++ b/src/pk-transaction.h
@@ -143,7 +143,7 @@ void		 pk_transaction_get_requires		(PkTransaction	*transaction,
 							 DBusGMethodInvocation *context);
 gboolean	 pk_transaction_get_role		(PkTransaction	*transaction,
 							 const gchar	**role,
-							 const gchar	**package_id,
+							 const gchar	**text,
 							 GError		**error);
 gboolean	 pk_transaction_get_status		(PkTransaction	*transaction,
 							 const gchar	**status,
commit 4e4133d1da0239fc9bd4db0b24acd9a671aebab1
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:53:12 2008 +0100

    trivial: don't warn when we try to import a file list from a file with trailing whitespace

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 4bffdf2..e50ce79 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -463,11 +463,14 @@ pk_package_list_add_file (PkPackageList *plist, const gchar *filename)
 	split = g_strsplit (text, "\n", 0);
 	length = g_strv_length (split);
 	for (i=0; i<length; i++) {
-		obj = pk_package_obj_from_string (split[i]);
-		if (obj != NULL) {
-			pk_package_list_add_obj (plist, obj);
+		/* we get trailing whitespace sometimes */
+		if (!pk_strzero (split[i])) {
+			obj = pk_package_obj_from_string (split[i]);
+			if (obj != NULL) {
+				pk_package_list_add_obj (plist, obj);
+			}
+			pk_package_obj_free (obj);
 		}
-		pk_package_obj_free (obj);
 	}
 	g_strfreev (split);
 	g_free (text);
commit d0a6638f9818d44a7a541598c31495863b2fdd77
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:52:37 2008 +0100

    trivial: make the backtraces in RED

diff --git a/libpackagekit/pk-debug.c b/libpackagekit/pk-debug.c
index 7997c64..57b86e9 100644
--- a/libpackagekit/pk-debug.c
+++ b/libpackagekit/pk-debug.c
@@ -103,11 +103,13 @@ pk_debug_backtrace (void)
 	call_stack_size = backtrace (call_stack, G_N_ELEMENTS (call_stack));
 	symbols = backtrace_symbols (call_stack, call_stack_size);
 	if (symbols != NULL) {
+		pk_set_console_mode (CONSOLE_RED);
 		g_print ("Traceback:\n");
 		while (i < call_stack_size) {
 			g_print ("\t%s\n", symbols[i]);
 			i++;
 		}
+		pk_set_console_mode (CONSOLE_RESET);
 		free (symbols);
 	}
 }
commit 08252517ee50f46c7661c10922759e072f7132f2
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:42:26 2008 +0100

    trivial: if we ignore Cancel() on a finished transaction, don't show a warning

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 05503fb..f5bd8db 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1173,7 +1173,7 @@ pk_transaction_cancel (PkTransaction *transaction, GError **error)
 
 	/* if it's finished, cancelling will have no action */
 	if (transaction->priv->finished) {
-		pk_warning ("No point trying to cancel a finished transaction, ignoring");
+		pk_debug ("No point trying to cancel a finished transaction, ignoring");
 		return TRUE;
 	}
 
commit 30a166ab019343ed9ac28c3092e7d96494b1597c
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:40:37 2008 +0100

    trivial: fix up a couple of issues with make check

diff --git a/libpackagekit/pk-package-id.c b/libpackagekit/pk-package-id.c
index c5392ef..e99c67a 100644
--- a/libpackagekit/pk-package-id.c
+++ b/libpackagekit/pk-package-id.c
@@ -322,16 +322,6 @@ libst_package_id (LibSelfTest *test)
 	}
 
 	/************************************************************/
-	libst_title (test, "parse incorrect package_id from string (null)");
-	temp = NULL;
-	id = pk_package_id_new_from_string (temp);
-	if (id == NULL) {
-		libst_success (test, NULL);
-	} else {
-		libst_failed (test, "passed an invalid string '%s'", temp);
-	}
-
-	/************************************************************/
 	libst_title (test, "parse incorrect package_id from string (empty)");
 	temp = "";
 	id = pk_package_id_new_from_string (temp);
diff --git a/src/pk-spawn.c b/src/pk-spawn.c
index 3cc9c2f..221439e 100644
--- a/src/pk-spawn.c
+++ b/src/pk-spawn.c
@@ -204,7 +204,7 @@ pk_spawn_sigkill_cb (PkSpawn *spawn)
 	/* we won't overwrite this if not unknown */
 	spawn->priv->exit = PK_EXIT_ENUM_KILLED;
 
-	pk_warning ("sending SIGKILL %i", spawn->priv->child_pid);
+	pk_debug ("sending SIGKILL %i", spawn->priv->child_pid);
 	retval = kill (spawn->priv->child_pid, SIGKILL);
 	if (retval == EINVAL) {
 		pk_warning ("The signum argument is an invalid or unsupported number");
commit 28287ab2432a65ee3cbc03c35c215fa0626c166c
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:27:59 2008 +0100

    bugfix: AllowCancel(FALSE) is allowed when we are finished, but not TRUE

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 292cff9..2bda9db 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -1352,12 +1352,11 @@ pk_backend_set_allow_cancel (PkBackend *backend, gboolean allow_cancel)
 	g_return_val_if_fail (backend->priv->locked != FALSE, FALSE);
 
 	/* have we already set an error? */
-	if (backend->priv->set_error) {
+	if (backend->priv->set_error && allow_cancel) {
 		pk_warning ("already set error, cannot process");
 		return FALSE;
 	}
 
-
 	/* can we do the action? */
 	if (backend->desc->cancel != NULL) {
 		backend->priv->allow_cancel = allow_cancel;
commit e5c008bdab291b2e762bf7124944e030247f383a
Author: Richard Hughes <richard at hughsie.com>
Date:   Mon Jul 21 13:26:15 2008 +0100

    feature: add a new function pk_debug_backtrace() so we can find out where errors and warnings come from

diff --git a/libpackagekit/pk-debug.c b/libpackagekit/pk-debug.c
index 0b8c142..7997c64 100644
--- a/libpackagekit/pk-debug.c
+++ b/libpackagekit/pk-debug.c
@@ -39,6 +39,7 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <time.h>
+#include <execinfo.h>
 
 #include "pk-debug.h"
 
@@ -89,6 +90,29 @@ pk_set_console_mode (guint console_code)
 }
 
 /**
+ * pk_debug_backtrace:
+ **/
+void
+pk_debug_backtrace (void)
+{
+	void *call_stack[512];
+	int  call_stack_size;
+	char **symbols;
+	int i = 1;
+
+	call_stack_size = backtrace (call_stack, G_N_ELEMENTS (call_stack));
+	symbols = backtrace_symbols (call_stack, call_stack_size);
+	if (symbols != NULL) {
+		g_print ("Traceback:\n");
+		while (i < call_stack_size) {
+			g_print ("\t%s\n", symbols[i]);
+			i++;
+		}
+		free (symbols);
+	}
+}
+
+/**
  * pk_log_line:
  **/
 static void
@@ -204,6 +228,9 @@ pk_warning_real (const gchar *func, const gchar *file, const int line, const gch
 	pk_print_line (func, file, line, buffer, CONSOLE_RED);
 
 	g_free(buffer);
+
+	/* we want to fix this! */
+	pk_debug_backtrace ();
 }
 
 /**
@@ -226,6 +253,9 @@ pk_error_real (const gchar *func, const gchar *file, const int line, const gchar
 	pk_print_line (func, file, line, buffer, CONSOLE_RED);
 	g_free(buffer);
 
+	/* we want to fix this! */
+	pk_debug_backtrace ();
+
 	exit (1);
 }
 
diff --git a/libpackagekit/pk-debug.h b/libpackagekit/pk-debug.h
index 9344a9c..a97994b 100644
--- a/libpackagekit/pk-debug.h
+++ b/libpackagekit/pk-debug.h
@@ -62,6 +62,7 @@ G_BEGIN_DECLS
 void		pk_debug_init			(gboolean	 debug);
 void		pk_debug_set_logging		(gboolean	 enabled);
 gboolean	pk_debug_enabled		(void);
+void		pk_debug_backtrace		(void);
 void		pk_debug_real			(const gchar	*func,
 						 const gchar	*file,
 						 int		 line,
commit e97759f58a05adf2e1f8f2f1374f7d036212a993
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 18:34:39 2008 +0100

    trivial: fix a huge memory leak in the new code I just committed

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index d2237f1..4bffdf2 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -469,7 +469,7 @@ pk_package_list_add_file (PkPackageList *plist, const gchar *filename)
 		}
 		pk_package_obj_free (obj);
 	}
-
+	g_strfreev (split);
 	g_free (text);
 out:
 	return ret;
commit bb50c5fccf935969af43754db92280695b2b5f3f
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sun Jul 20 18:32:40 2008 +0100

    Bind UpdateSystem. Just about time to make this async though...

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 8963b06..4cd783b 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -228,6 +228,20 @@ class PackageKitClient:
         self._wait()
         return result
 
+    def UpdateSystem(self, filter=None):
+        '''
+        This method should return a list of packages that are installed and are upgradable.
+
+        It should only return the newest update for each installed package.
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.UpdateSystem()
+        self._wait()
+        return result
+
 
     #
     # Internal helper functions
commit a7707dc7ffc332971f869422d63bf85f461db559
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 18:17:58 2008 +0100

    trivial: ony add the packageobj if non-null (extra \n at end of data)

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 1f6873b..d2237f1 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -464,7 +464,9 @@ pk_package_list_add_file (PkPackageList *plist, const gchar *filename)
 	length = g_strv_length (split);
 	for (i=0; i<length; i++) {
 		obj = pk_package_obj_from_string (split[i]);
-		pk_package_list_add_obj (plist, obj);
+		if (obj != NULL) {
+			pk_package_list_add_obj (plist, obj);
+		}
 		pk_package_obj_free (obj);
 	}
 
commit e9b86a65fdb56de17143c80c3794b8730296bd1d
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sun Jul 20 18:12:32 2008 +0100

    Make Resolve and GetDetails return easy-to-use dicts, not tuples.

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 938c1c5..8963b06 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -59,13 +59,15 @@ class PackageKitClient:
         filter and package are directly passed to the PackageKit transaction D-BUS
         method Resolve()
 
-        Return List of (installed, id, short_description) triples for all matches,
+        Return Dict with keys of (installed, id, short_description) for all matches,
         where installed is a boolean and id and short_description are strings.
         '''
         result = []
         pk_xn = self._get_xn()
         pk_xn.connect_to_signal('Package',
-            lambda i, p_id, summary: result.append((i == 'installed', str(p_id), str(summary))))
+            lambda i, id, summary: result.append({'installed' : (i == 'installed'),
+                                                  'id': (str(id)),
+                                                  'summary' :str(summary)}))
         pk_xn.connect_to_signal('Finished', self._h_finished)
         pk_xn.connect_to_signal('ErrorCode', self._h_error)
         pk_xn.Resolve(filter, package)
@@ -75,18 +77,25 @@ class PackageKitClient:
     def GetDetails(self, package_id):
         '''Get details about a PackageKit package_id.
 
-        Return tuple (license, group, description, upstream_url, size).
+        Return dict with keys (id, license, group, description, upstream_url, size).
         '''
         result = []
         pk_xn = self._get_xn()
-        pk_xn.connect_to_signal('Details', lambda *args: result.extend(args))
+        pk_xn.connect_to_signal('Details', lambda id, license, group, detail, url, size:
+                                    result.append({"id" : str(id),
+                                                   "license" : str(license),
+                                                   "group" : str(group),
+                                                   "detail" : str(detail),
+                                                   "url" : str(url),
+                                                   "size" : int(size)})
+                                )
         pk_xn.connect_to_signal('Finished', self._h_finished)
         pk_xn.connect_to_signal('ErrorCode', self._h_error)
         pk_xn.GetDetails(package_id)
         self._wait()
         if self._error_enum:
             raise PackageKitError(self._error_enum)
-        return (str(result[1]), str(result[2]), str(result[3]), str(result[4]), int(result[5]))
+        return result
 
     def SearchName(self, filter, name):
         '''Search a package by name.
commit 229e7ac9127b262588d3705b09a71b68cb0be227
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 17:59:09 2008 +0100

    trivial: update the spec file with the new binary name

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 140ef5c..7c81e8d 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -1,4 +1,4 @@
-%define glib2_version           2.6.0
+%define glib2_version           2.16.1
 %define dbus_version            0.90
 %define dbus_glib_version       0.70
 %define policykit_version       0.7
@@ -38,6 +38,7 @@ BuildRequires: docbook-utils
 BuildRequires: gnome-doc-utils
 BuildRequires: python-devel
 BuildRequires: perl(XML::Parser)
+BuildRequires: intltool
 BuildRequires: gettext
 
 %description 
@@ -141,6 +142,7 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
 %dir %{python_sitelib}/packagekit
 %dir %{_localstatedir}/run/PackageKit
 %{python_sitelib}/packagekit/*py*
+%dir %{_sysconfdir}/bash_completion.d
 %config %{_sysconfdir}/bash_completion.d/pk-completion.bash
 %config(noreplace) %{_sysconfdir}/PackageKit/PackageKit.conf
 %config %{_sysconfdir}/dbus-1/system.d/*
@@ -153,8 +155,8 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
 %{_bindir}/pkmon
 %{_bindir}/pkcon
 %{_bindir}/packagekit-bugreport.sh
-%{_libexecdir}/pk-import-desktop
-%{_libexecdir}/pk-import-specspo
+%{_libexecdir}/pk-import-*
+%{_libexecdir}/pk-generate-*
 %exclude %{_libdir}/libpackagekit*.so.*
 %exclude %{_libdir}/packagekit-backend/*.so
 %ghost %verify(not md5 size mtime) %{_localstatedir}/lib/PackageKit/transactions.db
commit fa11ce09937b3da6f40fbb97a367c7bbb351c035
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 17:49:45 2008 +0100

    add a new binary pk-generate-package-list to generate a package list we can use for search as you type

diff --git a/client/.gitignore b/client/.gitignore
index fe9d600..d44757e 100644
--- a/client/.gitignore
+++ b/client/.gitignore
@@ -9,6 +9,7 @@ pk-update-icon
 pk-application
 pk-import-desktop
 pk-import-specspo
+pk-generate-package-list
 *.glade.bak
 *.gladep
 *.gladep.bak
diff --git a/client/Makefile.am b/client/Makefile.am
index 2846b9a..29b11b2 100644
--- a/client/Makefile.am
+++ b/client/Makefile.am
@@ -34,6 +34,7 @@ bin_PROGRAMS =						\
 libexec_PROGRAMS =					\
 	pk-import-desktop				\
 	pk-import-specspo				\
+	pk-generate-package-list			\
 	$(NULL)
 
 pkcon_SOURCES =						\
@@ -58,6 +59,15 @@ pkmon_LDADD =						\
 	$(SELFTEST_LIBS)				\
 	$(NULL)
 
+pk_generate_package_list_SOURCES =			\
+	pk-generate-package-list.c			\
+	$(NULL)
+
+pk_generate_package_list_LDADD =			\
+	$(GLIB_LIBS)					\
+	$(PK_LIBS)					\
+	$(NULL)
+
 pk_import_desktop_SOURCES =				\
 	pk-import-common.c				\
 	pk-import-common.h				\
diff --git a/client/pk-generate-package-list.c b/client/pk-generate-package-list.c
new file mode 100644
index 0000000..74e0bf4
--- /dev/null
+++ b/client/pk-generate-package-list.c
@@ -0,0 +1,94 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <dbus/dbus-glib.h>
+
+#include <pk-debug.h>
+#include <pk-client.h>
+#include <pk-common.h>
+#include <pk-package-id.h>
+
+#define PK_PACKAGE_LIST_LOCATION	"/var/lib/PackageKit/package-list.txt"
+
+/**
+ * main:
+ **/
+int
+main (int argc, char *argv[])
+{
+	PkClient *client;
+	GOptionContext *context;
+	gboolean verbose = FALSE;
+	gboolean ret;
+	GError *error = NULL;
+	PkPackageList *list = NULL;
+
+	const GOptionEntry options[] = {
+		{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose,
+			"Show extra debugging information", NULL },
+		{ NULL}
+	};
+
+	g_type_init ();
+
+	context = g_option_context_new ("pk-generate-package-list");
+	g_option_context_add_main_entries (context, options, NULL);
+	g_option_context_parse (context, &argc, &argv, NULL);
+	g_option_context_free (context);
+
+	pk_debug_init (verbose);
+
+	client = pk_client_new ();
+	pk_client_set_use_buffer (client, TRUE, NULL);
+	pk_client_set_synchronous (client, TRUE, NULL);
+
+	/* get the package list with no filter */
+	ret = pk_client_get_packages (client, PK_FILTER_ENUM_NONE, &error);
+	if (!ret) {
+		g_print ("Failed to get package lists: %s\n", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* check that we only matched one package */
+	list = pk_client_get_package_list (client);
+	ret = pk_package_list_to_file (list, PK_PACKAGE_LIST_LOCATION);
+	if (!ret) {
+		g_print ("Failed to write to disk: %s\n", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+out:
+	if (list != NULL) {
+		g_object_unref (list);
+	}
+	g_object_unref (client);
+	return 0;
+}
commit 42800090b67cddee38085dd138d5ac64e9b25510
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 17:48:30 2008 +0100

    add two new function to convert a PkPackageList to and from a file on disk

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index 197face..1f6873b 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -398,6 +398,82 @@ pk_package_list_contains_obj (PkPackageList *plist, const PkPackageObj *obj)
 }
 
 /**
+ * pk_package_list_to_file:
+ **/
+gboolean
+pk_package_list_to_file (PkPackageList *plist, const gchar *filename)
+{
+	PkPackageObj *obj;
+	guint i;
+	guint length;
+	gboolean ret;
+	gchar *text;
+	GString *buffer;
+	GError *error = NULL;
+
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
+	g_return_val_if_fail (filename != NULL, FALSE);
+
+	/* add each object */
+	buffer = g_string_new ("");
+	length = plist->priv->array->len;
+	for (i=0; i<length; i++) {
+		obj = g_ptr_array_index (plist->priv->array, i);
+		text = pk_package_obj_to_string (obj);
+		g_string_append_printf (buffer, "%s\n", text);
+		g_free (text);
+	}
+
+	/* write to disk */
+	text = g_string_free (buffer, FALSE);
+	ret = g_file_set_contents (filename, text, -1, &error);
+	if (!ret) {
+		pk_warning ("Failed to write to disk: %s", error->message);
+		g_error_free (error);
+	}
+	g_free (text);
+	return ret;
+}
+
+/**
+ * pk_package_list_add_file:
+ **/
+gboolean
+pk_package_list_add_file (PkPackageList *plist, const gchar *filename)
+{
+	PkPackageObj *obj;
+	guint i;
+	guint length;
+	gboolean ret;
+	gchar *text = NULL;
+	gchar **split;
+	GError *error = NULL;
+
+	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
+	g_return_val_if_fail (filename != NULL, FALSE);
+
+	ret = g_file_get_contents (filename, &text, NULL, &error);
+	if (!ret) {
+		pk_warning ("Failed to read from disk: %s", error->message);
+		g_error_free (error);
+		goto out;
+	}
+
+	/* split into lines */
+	split = g_strsplit (text, "\n", 0);
+	length = g_strv_length (split);
+	for (i=0; i<length; i++) {
+		obj = pk_package_obj_from_string (split[i]);
+		pk_package_list_add_obj (plist, obj);
+		pk_package_obj_free (obj);
+	}
+
+	g_free (text);
+out:
+	return ret;
+}
+
+/**
  * pk_package_list_class_init:
  * @klass: The PkPackageListClass
  **/
diff --git a/libpackagekit/pk-package-list.h b/libpackagekit/pk-package-list.h
index 324a7f4..3ab8687 100644
--- a/libpackagekit/pk-package-list.h
+++ b/libpackagekit/pk-package-list.h
@@ -78,6 +78,10 @@ gboolean		 pk_package_list_sort_summary	(PkPackageList		*plist);
 const PkPackageObj	*pk_package_list_get_obj	(PkPackageList		*plist,
 							 guint			 item);
 gboolean		 pk_package_list_clear		(PkPackageList		*plist);
+gboolean		 pk_package_list_to_file	(PkPackageList		*plist,
+							 const gchar		*filename);
+gboolean		 pk_package_list_add_file	(PkPackageList		*plist,
+							 const gchar		*filename);
 
 G_END_DECLS
 
commit 066147ffa4a9e6ff39b436bf994c00634849000d
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 17:29:30 2008 +0100

    performance: don't check for existance of the obj in pk_package_list_add_obj(), it hurts us by about 10 seconds when we get the package list

diff --git a/libpackagekit/pk-package-list.c b/libpackagekit/pk-package-list.c
index b25c7f7..197face 100644
--- a/libpackagekit/pk-package-list.c
+++ b/libpackagekit/pk-package-list.c
@@ -91,18 +91,11 @@ pk_package_list_add (PkPackageList *plist, PkInfoEnum info, const PkPackageId *i
 gboolean
 pk_package_list_add_obj (PkPackageList *plist, const PkPackageObj *obj)
 {
-	gboolean ret;
 	PkPackageObj *obj_new;
 
 	g_return_val_if_fail (PK_IS_PACKAGE_LIST (plist), FALSE);
 	g_return_val_if_fail (obj != NULL, FALSE);
 
-	ret = pk_package_list_contains_obj (plist, obj);
-	if (ret) {
-		pk_debug ("already added obj");
-		return FALSE;
-	}
-
 	obj_new = pk_package_obj_copy (obj);
 	g_ptr_array_add (plist->priv->array, obj_new);
 
commit a0a1267f80bb59ef5ed5a2ac93cb785314502358
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 17:17:02 2008 +0100

    yum: return all packages when we do GetPackages() rather than just the newest

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 95f9c09..ffa6faa 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -299,7 +299,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         # Now show available packages.
         if FILTER_INSTALLED not in fltlist:
-            pkgs = self.yumbase.pkgSack.returnNewestByNameArch()
+            pkgs = self.yumbase.pkgSack
             pkgfilter.add_available(pkgs)
 
         # we couldn't do this when generating the list
commit 26be7c7a84d7c260ba946b0c6c5298f93c170015
Author: Aidan Skinner <aidan at skinner.me.uk>
Date:   Sun Jul 20 16:56:03 2008 +0100

    Add GetUpdates

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 086eeb0..938c1c5 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -200,12 +200,11 @@ class PackageKitClient:
         pk_xn.RepoEnable(repo_id, enabled)
         self._wait()
 
-    def GetPackages(self, filter=None):
+    def GetUpdates(self, filter=None):
         '''
-        This method returns all the packages without a search term.
-
-        filter is a correct filter, e.g. none or installed;~devel
+        This method should return a list of packages that are installed and are upgradable.
 
+        It should only return the newest update for each installed package.
         '''
         result = []
         pk_xn = self._get_xn()
@@ -216,7 +215,7 @@ class PackageKitClient:
                                                   'summary' : str(summary)}))
         if (filter == None):
             filter = "none"
-        pk_xn.GetPackages(filter)
+        pk_xn.GetUpdates(filter)
         self._wait()
         return result
 
commit 6a4da37394112f3899e79dafa845aab9f6a10c76
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Jul 20 16:54:45 2008 +0100

    add two new methods pk_package_obj_from_string() and pk_package_obj_to_string()

diff --git a/libpackagekit/pk-package-obj.c b/libpackagekit/pk-package-obj.c
index db945d0..740d963 100644
--- a/libpackagekit/pk-package-obj.c
+++ b/libpackagekit/pk-package-obj.c
@@ -104,6 +104,65 @@ pk_package_obj_copy (const PkPackageObj *obj)
 	return pk_package_obj_new (obj->info, obj->id, obj->summary);
 }
 
+/**
+ * pk_package_obj_to_string:
+ *
+ * Convert a PkPackageObj to a string
+ **/
+gchar *
+pk_package_obj_to_string (const PkPackageObj *obj)
+{
+	gchar *text;
+	gchar *package_id;
+
+	g_return_val_if_fail (obj != NULL, NULL);
+
+	package_id = pk_package_id_to_string (obj->id);
+	text = g_strdup_printf ("%s\t%s\t%s",
+				pk_info_enum_to_text (obj->info),
+				package_id, obj->summary);
+	g_free (package_id);
+	return text;
+}
+
+/**
+ * pk_package_obj_from_string:
+ *
+ * Convert a PkPackageObj from a string
+ **/
+PkPackageObj *
+pk_package_obj_from_string (const gchar *text)
+{
+	gchar **sections;
+	PkPackageObj *obj = NULL;
+	PkPackageId *id = NULL;
+	PkInfoEnum info;
+
+	g_return_val_if_fail (text != NULL, NULL);
+
+	sections = g_strsplit (text, "\t", 3);
+	if (sections == NULL) {
+		pk_warning ("invalid input: %s", text);
+		goto out;
+	}
+
+	info = pk_info_enum_from_text (sections[0]);
+	if (info == PK_INFO_ENUM_UNKNOWN) {
+		pk_warning ("invalid info for string %s", text);
+		goto out;
+	}
+	id = pk_package_id_new_from_string (sections[1]);
+	if (id == NULL) {
+		pk_warning ("invalid package_id for string %s", text);
+		goto out;
+	}
+	obj = pk_package_obj_new (info, id, sections[2]);
+out:
+	pk_package_id_free (id);
+	g_strfreev (sections);
+	return obj;
+}
+
 /***************************************************************************
  ***                          MAKE CHECK TESTS                           ***
  ***************************************************************************/
@@ -118,6 +177,7 @@ libst_package_obj (LibSelfTest *test)
 	PkPackageObj *obj3;
 	gboolean ret;
 	PkPackageId *id;
+	gchar *text;
 
 	if (libst_start (test, "PkPackageObj", CLASS_AUTO) == FALSE) {
 		return;
@@ -175,7 +235,6 @@ libst_package_obj (LibSelfTest *test)
 	} else {
 		libst_failed (test, NULL);
 	}
-	pk_package_id_free (id);
 
 	/************************************************************/
 	libst_title (test, "check !equal");
@@ -186,8 +245,33 @@ libst_package_obj (LibSelfTest *test)
 		libst_failed (test, NULL);
 	}
 
+	/************************************************************/
+	libst_title (test, "check to string");
+	text = pk_package_obj_to_string (obj1);
+	if (pk_strequal (text, "installed\tgnome;1.23;i386;data\tGNOME!")) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "got %s", text);
+	}
+
+	/************************************************************/
+	libst_title (test, "check from string");
+	obj3 = pk_package_obj_from_string (text);
+	if (obj3->info == PK_INFO_ENUM_INSTALLED &&
+	    pk_package_id_equal (obj3->id, obj1->id) &&
+	    pk_strequal (obj3->summary, "GNOME!")) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "got incorrect data %s,%s,%s",
+			      pk_info_enum_to_text (obj3->info),
+			      pk_package_id_to_string (obj3->id),
+			      obj3->summary);
+	}
+
+	pk_package_id_free (id);
 	pk_package_obj_free (obj1);
 	pk_package_obj_free (obj2);
+	g_free (text);
 
 	libst_end (test);
 }
diff --git a/libpackagekit/pk-package-obj.h b/libpackagekit/pk-package-obj.h
index 01f6494..fabd6ab 100644
--- a/libpackagekit/pk-package-obj.h
+++ b/libpackagekit/pk-package-obj.h
@@ -44,6 +44,8 @@ gboolean	 pk_package_obj_free			(PkPackageObj		*obj);
 PkPackageObj	*pk_package_obj_copy			(const PkPackageObj	*obj);
 gboolean	 pk_package_obj_equal			(const PkPackageObj	*obj1,
 							 const PkPackageObj	*obj2);
+gchar		*pk_package_obj_to_string		(const PkPackageObj	*obj);
+PkPackageObj	*pk_package_obj_from_string		(const gchar		*text);
 
 #endif /* __PK_PACKAGE_OBJ_H */
 
commit 1ca91f9341ef14aed5253ebabc38794fa1dfd9ae
Author: Aidan Skinner <aidan at contemplation.skinner.me.uk>
Date:   Sun Jul 20 16:37:09 2008 +0100

    Change SearchName to return a dict
    add SearchDetails

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 54c4090..086eeb0 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -91,6 +91,7 @@ class PackageKitClient:
     def SearchName(self, filter, name):
         '''Search a package by name.
 
+        # FIXME AS incorrect return
         Return a list of (installed, package_id, short_description) triples,
         where installed is a boolean and package_id/short_description are
         strings.
@@ -98,13 +99,29 @@ class PackageKitClient:
         result = []
         pk_xn = self._get_xn()
         pk_xn.connect_to_signal('Package',
-            lambda i, id, summary: result.extend((str(id), str(summary))))
+            lambda i, id, summary: result.append({'id': (str(id)),
+                                                  'summary' :str(summary)}))
         pk_xn.connect_to_signal('Finished', self._h_finished)
         pk_xn.connect_to_signal('ErrorCode', self._h_error)
         pk_xn.SearchName(filter, name)
         self._wait()
         return result
 
+    def SearchDetails(self, filter, name):
+        '''Search a packages details.
+        #FIXME description
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Package',
+            lambda i, id, summary: result.append({'id': (str(id)),
+                                                  'summary' :str(summary)}))
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.SearchDetails(filter, name)
+        self._wait()
+        return result
+
     def InstallPackages(self, package_ids, progress_cb=None):
         '''Install a list of package IDs.
 
commit 0cac22c1c8692d1e8ae29a00d6cdb6f768d0a023
Author: Aidan Skinner <aidan at contemplation.skinner.me.uk>
Date:   Sun Jul 20 11:24:29 2008 +0100

    Use glib mainloop for running

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 4cbca44..54c4090 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -210,11 +210,7 @@ class PackageKitClient:
 
     def _wait(self):
         '''Wait until an async PK operation finishes.'''
-
-        while self._finished_status is None:
-            self.main_loop.get_context().iteration(True)
-        while self.main_loop.get_context().pending():
-            self.main_loop.get_context().iteration()
+        self.main_loop.run()
 
     def _h_status(self, status):
         self._status = status
@@ -226,7 +222,7 @@ class PackageKitClient:
         self._error_enum = enum
 
     def _h_finished(self, status, code):
-        self._finished_status = status
+        self.main_loop.quit()
 
     def _h_progress(self, per, subper, el, rem):
         def _cancel(xn):
commit dbf3888ce4b226775fd3d777cd97d8977a32601b
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat Jul 19 09:00:24 2008 +0100

    rename some of the PolicyKit actions on advice of David Zeuthen

diff --git a/policy/org.freedesktop.packagekit.policy.in b/policy/org.freedesktop.packagekit.policy.in
index 4c4607d..883c670 100644
--- a/policy/org.freedesktop.packagekit.policy.in
+++ b/policy/org.freedesktop.packagekit.policy.in
@@ -13,9 +13,9 @@
   <vendor_url>http://www.packagekit.org/</vendor_url>
   <icon_name>package-x-generic</icon_name>
 
-  <action id="org.freedesktop.packagekit.install">
-    <_description>Install package</_description>
-    <_message>Authentication is required to install a package</_message>
+  <action id="org.freedesktop.packagekit.package-install">
+    <_description>Install local file</_description>
+    <_message>Authentication is required to install a signed package</_message>
     <icon_name>pk-package-add</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-install-package</vendor_url>
     <defaults>
@@ -24,9 +24,9 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.localinstall-untrusted">
+  <action id="org.freedesktop.packagekit.package-install-untrusted">
     <_description>Install untrusted local file</_description>
-    <_message>Further authentication is required to install an untrusted local file</_message>
+    <_message>Authentication is required to install an untrusted package</_message>
     <icon_name>pk-package-add</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-install-file</vendor_url>
     <defaults>
@@ -35,20 +35,10 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.localinstall-trusted">
-    <_description>Install local file</_description>
-    <_message>Authentication is required to install a local file</_message>
-    <icon_name>pk-package-add</icon_name>
-    <vendor_url>http://www.packagekit.org/pk-reference.html#methods-install-file</vendor_url>
-    <defaults>
-      <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
-    </defaults>
-  </action>
 
-  <action id="org.freedesktop.packagekit.install-signature">
-    <_description>Install security signature</_description>
-    <_message>Authentication is required to install a security signature</_message>
+  <action id="org.freedesktop.packagekit.system-trust-signing-key">
+    <_description>Trust a key used for signing packages</_description>
+    <_message>Authentication is required to consider a key used for signing packages as trusted</_message>
     <icon_name>pk-package-add</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-install-signature</vendor_url>
     <defaults>
@@ -57,29 +47,18 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.accept-eula">
+  <action id="org.freedesktop.packagekit.package-eula-accept">
     <_description>Accept EULA</_description>
     <_message>Authentication is required to accept a EULA</_message>
     <icon_name>pk-package-add</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-accept-eula</vendor_url>
     <defaults>
       <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
-    </defaults>
-  </action>
-
-  <action id="org.freedesktop.packagekit.update-package">
-    <_description>Update package</_description>
-    <_message>Authentication is required to update packages</_message>
-    <icon_name>pk-package-update</icon_name>
-    <vendor_url>http://www.packagekit.org/pk-reference.html#methods-update</vendor_url>
-    <defaults>
-      <allow_inactive>no</allow_inactive>
-      <allow_active>auth_admin_keep_always</allow_active>
+      <allow_active>yes</allow_active>
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.remove">
+  <action id="org.freedesktop.packagekit.package-remove">
     <_description>Remove package</_description>
     <_message>Authentication is required to remove packages</_message>
     <icon_name>pk-package-delete</icon_name>
@@ -90,9 +69,9 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.update-system">
-    <_description>Update all packages</_description>
-    <_message>Authentication is required to update all packages</_message>
+  <action id="org.freedesktop.packagekit.system-update">
+    <_description>Update packages</_description>
+    <_message>Authentication is required to update packages</_message>
     <icon_name>pk-package-update</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-update-system</vendor_url>
     <defaults>
@@ -101,7 +80,7 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.rollback">
+  <action id="org.freedesktop.packagekit.system-rollback">
     <_description>Rollback to a previous transaction</_description>
     <_message>Authentication is required to rollback a transaction</_message>
     <icon_name>pk-rollback</icon_name>
@@ -112,7 +91,7 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.repo-change">
+  <action id="org.freedesktop.packagekit.systems-sources-configure">
     <_description>Change software source parameters</_description>
     <_message>Authentication is required to change software source parameters</_message>
     <icon_name>pk-package-info</icon_name>
@@ -123,9 +102,9 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.refresh-cache">
-    <_description>Refresh package lists</_description>
-    <_message>Authentication is required to refresh the package lists</_message>
+  <action id="org.freedesktop.packagekit.system-sources-refresh">
+    <_description>Refresh system sources</_description>
+    <_message>Authentication is required to refresh the system sources</_message>
     <icon_name>pk-refresh-cache</icon_name>
     <vendor_url>http://www.packagekit.org/pk-reference.html#methods-refresh-cache</vendor_url>
     <defaults>
@@ -134,7 +113,7 @@
     </defaults>
   </action>
 
-  <action id="org.freedesktop.packagekit.set-proxy">
+  <action id="org.freedesktop.packagekit.system-network-proxy-configure">
     <_description>Set network proxy</_description>
     <_message>Authentication is required to set the network proxy used for downloading packages</_message>
     <icon_name>applications-internet</icon_name>
diff --git a/src/pk-security-polkit.c b/src/pk-security-polkit.c
index 0b13fe4..30744af 100644
--- a/src/pk-security-polkit.c
+++ b/src/pk-security-polkit.c
@@ -105,32 +105,30 @@ pk_security_role_to_action (PkSecurity *security, gboolean trusted, PkRoleEnum r
 	g_return_val_if_fail (security != NULL, NULL);
 	g_return_val_if_fail (PK_IS_SECURITY (security), NULL);
 
-	if (role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
-		policy = "org.freedesktop.packagekit.update-package";
-	} else if (role == PK_ROLE_ENUM_UPDATE_SYSTEM) {
-		policy = "org.freedesktop.packagekit.update-system";
-	} else if (role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
-		policy = "org.freedesktop.packagekit.remove";
-	} else if (role == PK_ROLE_ENUM_INSTALL_PACKAGES) {
-		policy = "org.freedesktop.packagekit.install";
-	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && trusted) {
-		policy = "org.freedesktop.packagekit.localinstall-trusted";
-	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && !trusted) {
-		policy = "org.freedesktop.packagekit.localinstall-untrusted";
+	if (role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
+	    role == PK_ROLE_ENUM_UPDATE_SYSTEM) {
+		policy = "org.freedesktop.packagekit.system-update";
 	} else if (role == PK_ROLE_ENUM_INSTALL_SIGNATURE) {
-		policy = "org.freedesktop.packagekit.install-signature";
-	} else if (role == PK_ROLE_ENUM_ACCEPT_EULA) {
-		policy = "org.freedesktop.packagekit.accept-eula";
+		policy = "org.freedesktop.packagekit.system-trust-signing-key";
 	} else if (role == PK_ROLE_ENUM_ROLLBACK) {
-		policy = "org.freedesktop.packagekit.rollback";
+		policy = "org.freedesktop.packagekit.system-rollback";
 	} else if (role == PK_ROLE_ENUM_REPO_ENABLE ||
 		   role == PK_ROLE_ENUM_REPO_SET_DATA) {
-		policy = "org.freedesktop.packagekit.repo-change";
+		policy = "org.freedesktop.packagekit.systems-sources-configure";
 	} else if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
-		policy = "org.freedesktop.packagekit.refresh-cache";
-	/* PRIVATE: not actually roles */
+		policy = "org.freedesktop.packagekit.system-sources-refresh";
 	} else if (role == PK_ROLE_ENUM_SET_PROXY_PRIVATE) {
-		policy = "org.freedesktop.packagekit.refresh-cache";
+		policy = "org.freedesktop.packagekit.system-network-proxy-configure";
+	} else if (role == PK_ROLE_ENUM_REMOVE_PACKAGES) {
+		policy = "org.freedesktop.packagekit.package-remove";
+	} else if (role == PK_ROLE_ENUM_INSTALL_PACKAGES) {
+		policy = "org.freedesktop.packagekit.package-install";
+	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && trusted) {
+		policy = "org.freedesktop.packagekit.package-install";
+	} else if (role == PK_ROLE_ENUM_INSTALL_FILES && !trusted) {
+		policy = "org.freedesktop.packagekit.package-install-untrusted";
+	} else if (role == PK_ROLE_ENUM_ACCEPT_EULA) {
+		policy = "org.freedesktop.packagekit.package-eula-accept";
 	}
 	return policy;
 }
commit 5af3569d2b7e9d1c271b467b38700fefe26964e4
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 18 14:40:05 2008 +0100

    feature: Add a profiles page on the website so we can show typical users of PackageKit

diff --git a/docs/html/img/large-emblem-favorite.png b/docs/html/img/large-emblem-favorite.png
new file mode 100644
index 0000000..8606418
Binary files /dev/null and b/docs/html/img/large-emblem-favorite.png differ
diff --git a/docs/html/img/profile-bevan.png b/docs/html/img/profile-bevan.png
new file mode 100644
index 0000000..1333f3c
Binary files /dev/null and b/docs/html/img/profile-bevan.png differ
diff --git a/docs/html/img/profile-graham.png b/docs/html/img/profile-graham.png
new file mode 100644
index 0000000..a7aa84c
Binary files /dev/null and b/docs/html/img/profile-graham.png differ
diff --git a/docs/html/img/profile-suzan.png b/docs/html/img/profile-suzan.png
new file mode 100644
index 0000000..7d37625
Binary files /dev/null and b/docs/html/img/profile-suzan.png differ
diff --git a/docs/html/index.html b/docs/html/index.html
index d60f825..bd53b37 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -17,30 +17,34 @@
 
 <br/>
 
-<table align="center" cellpadding="5px" border="0">
+<table align="center" cellpadding="10px" border="0">
 
 <tr>
  <td align="center"><a href="pk-intro.html"><img src="img/large-accessories-text-editor.png" width="128" alt=""/></a></td>
  <td align="center"><a href="pk-using.html"><img src="img/large-preferences-system.png" width="128" alt=""/></a></td>
  <td align="center"><a href="pk-download.html"><img src="img/large-dialog-information.png" width="128" alt=""/></a></td>
  <td align="center"><a href="pk-screenshots.html"><img src="img/large-emblem-photos.png" width="128" alt=""/></a></td>
+ <td align="center"><a href="pk-profiles.html"><img src="img/large-system-users.png" width="128" alt=""/></a></td>
 </tr>
 <tr>
  <td><p class="indextitle"><a href="pk-intro.html" class="indextitle">What is<br/>PackageKit?</a></p></td>
  <td><p class="indextitle"><a href="pk-using.html" class="indextitle">How do I use<br/>PackageKit?</a></p></td>
  <td><p class="indextitle"><a href="pk-download.html" class="indextitle">Where can I<br/>download it?</a></p></td>
- <td><p class="indextitle"><a href="pk-screenshots.html" class="indextitle">Screenshots</a></p></td>
+ <td><p class="indextitle"><a href="pk-screenshots.html" class="indextitle">Cool<br/>Screenshots</a></p></td>
+ <td><p class="indextitle"><a href="pk-profiles.html" class="indextitle">Typical<br/>User Profiles</a></p></td>
 </tr>
+</table>
+<table align="center" cellpadding="10px" border="0">
 <tr>
  <td align="center"><a href="pk-authors.html"><img src="img/large-authors.png" width="128" alt=""/></a></td>
  <td align="center"><a href="pk-bugs.html"><img src="img/large-applications-development.png" width="128" alt=""/></a></td>
- <td align="center"><a href="pk-help.html"><img src="img/large-system-users.png" width="128" alt=""/></a></td>
+ <td align="center"><a href="pk-help.html"><img src="img/large-emblem-favorite.png" width="128" alt=""/></a></td>
  <td align="center"><a href="pk-faq.html"><img src="img/large-help-browser.png" width="128" alt=""/></a></td>
 </tr>
 <tr>
  <td><p class="indextitle"><a href="pk-authors.html" class="indextitle">Who develops<br/>PackageKit?</a></p></td>
- <td><p class="indextitle"><a href="pk-bugs.html" class="indextitle">Reporting bugs</a></p></td>
- <td><p class="indextitle"><a href="pk-help.html" class="indextitle">How can I help?</a></p></td>
+ <td><p class="indextitle"><a href="pk-bugs.html" class="indextitle">Reporting<br/>bugs</a></p></td>
+ <td><p class="indextitle"><a href="pk-help.html" class="indextitle">How can<br/>I help?</a></p></td>
  <td><p class="indextitle"><a href="pk-faq.html" class="indextitle">Frequently<br/>asked questions</a></p></td>
 </tr>
 </table>
diff --git a/docs/html/pk-profiles.html b/docs/html/pk-profiles.html
new file mode 100644
index 0000000..00161f3
--- /dev/null
+++ b/docs/html/pk-profiles.html
@@ -0,0 +1,127 @@
+<!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 - Typical User Profiles</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">Typical User Profiles</p></td>
+ <td><img src="img/packagekit.png" alt=""/></td>
+</tr>
+</table>
+
+<p>Back to the <a href="index.html">main page</a></p>
+
+<h2>User Profile: Suzan</h2>
+<table cellpadding="10px"><tr>
+<td><img src="img/profile-suzan.png"/></td>
+<td>
+<p>
+<b>Suzan is a 23 year old 4th year medical student.</b>
+She uses Linux because she does not want viruses or trojans, and finds Linux is
+quicker on her 3 year old laptop than Windows XP.
+She does not understand programming and has no need to change the way the
+computer works.
+</p>
+<p>
+She can use the OpenOffice programs proficiently, but does not know what a package is.
+She wants to install cool applications to talk to her friends online and send
+and receive emails.
+</p>
+<p>
+She watches DVD's with her friends on her laptop every now and then and
+occasionally plays other media files sent to her by her medical colleagues.
+She absolutely loves facebook and twitter.
+</p>
+<p>
+If there are any problems with her computer, she rings her brother who is a Linux expert.
+He can normally walk her through problems on the phone to get the problem sorted.
+Suzan has a low speed dial up connection that she uses a few times a week for
+up to 40 minutes.
+</p>
+</td>
+</tr></table>
+<hr/>
+
+<h2>User Profile: Bevan</h2>
+<table cellpadding="10px"><tr>
+<td><img src="img/profile-bevan.png"/></td>
+<td>
+<p>
+<b>Bevan is a 30 year old computer wizz and an adrenaline junkie.</b>
+He is an expert in Microsoft products and is starting to play with live CD's on
+popular Linux distributions.
+</p>
+<p>
+He wants ultimately to replace his Windows XP installation with a Linux
+installation, and also wants to play with the latest stuff like compiz and
+also experiment by trying to compile software from source.
+</p>
+<p>
+He wants to install and run some of the proprietary Windows programs on his
+Linux computer.
+He also has a 40Gb MP3 music collection and many hundreds of gigabytes of media
+files that he shares on the LAN with other computers on the network.
+</p>
+<p>
+He has lots of cool hardware that he's acquired over the years.
+He expects this hardware to "just work" with his Linux install.
+He understands the concept of packages, but does not know all the names of
+common applications.
+Bevan is quite comfortable partitioning his disk when installing.
+Bevan has a unlimited bandwidth high speed broadband internet connection.
+</p>
+</td>
+</tr></table>
+<hr/>
+
+<h2>User Profile: Graham</h2>
+<table cellpadding="10px"><tr>
+<td><img src="img/profile-graham.png"/></td>
+<td>
+<p>
+<b>Graham is a 55 year old retired policeman.</b>
+Graham's son has installed Linux on their new computer and moved away to university.
+Graham does not know much about computers, and gets quite confused when
+application icons change or if the start button is moved.
+Graham uses GNOME as it's simpler, but does now know what it means.
+Needless to say, Graham doesn't understand packages or dependencies.
+</p>
+<p>
+He has been doing automatic updates when using Windows XP, and was also
+updating the virus scanner by hand.
+He expects Linux to keep itself updated and just notify him when it's done.
+Words like "security" scare Graham, and a phone call to his son is expected if
+anything technical pops up on the screen he doesn't understand.
+</p>
+<p>
+He does not generally add or remove software from his computer but does like to
+dabble with Latex as he is writing a book.
+Every now and then latex asks him to install a package for a new font or layout,
+but he normally just ignores it.
+</p>
+<p>
+His son is often away for many months, and so Graham may have to perform distro
+upgrades in a way he can understand.
+Words like "partitioning" and "boot sector" scare him considerably.
+Graham has a low bandwidth broadband package that limits him to 1GB a month.
+He says that when files are downloading, "the Internet gets slower".
+</p>
+</td>
+</tr></table>
+
+<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>
diff --git a/docs/html/style.css b/docs/html/style.css
index b7c6445..fe1d4c1 100644
--- a/docs/html/style.css
+++ b/docs/html/style.css
@@ -1,4 +1,5 @@
 body {
+	background: #fefeff;
 	color: #000000;
 	font-family: 'Lucida Grande', Verdana, Arial, Sans-Serif;
 	}
commit a9af7d1dabf3604b8a3bcad4447118660fd0abce
Author: Scott Reeves <sreeves at novell.com>
Date:   Thu Jul 17 16:17:34 2008 -0600

    match the libzypp updates for listing repos

diff --git a/backends/zypp/pk-backend-zypp.cpp b/backends/zypp/pk-backend-zypp.cpp
index fb08591..e4182f1 100644
--- a/backends/zypp/pk-backend-zypp.cpp
+++ b/backends/zypp/pk-backend-zypp.cpp
@@ -1349,7 +1349,8 @@ backend_get_repo_list (PkBackend *backend, PkFilterEnum filters)
 	std::list <zypp::RepoInfo> repos;
 	try
 	{
-		repos = manager.knownRepositories();
+		//repos = manager.knownRepositories();
+		repos = std::list<zypp::RepoInfo>(manager.repoBegin(),manager.repoEnd());
 	}
 	catch ( const zypp::Exception &e)
 	{
diff --git a/backends/zypp/zypp-utils.cpp b/backends/zypp/zypp-utils.cpp
index 293dba3..47e4e1e 100644
--- a/backends/zypp/zypp-utils.cpp
+++ b/backends/zypp/zypp-utils.cpp
@@ -165,7 +165,8 @@ zypp_build_pool (gboolean include_local)
 	zypp::RepoManager manager;
 	std::list<zypp::RepoInfo> repos;
 	try {
-		repos = manager.knownRepositories ();
+		//repos = manager.knownRepositories ();
+		repos = std::list<zypp::RepoInfo>(manager.repoBegin(),manager.repoEnd());
 		for (std::list<zypp::RepoInfo>::iterator it = repos.begin(); it != repos.end (); it++) {
 			zypp::RepoInfo repo (*it);
 
@@ -861,7 +862,8 @@ zypp_refresh_cache (PkBackend *backend, gboolean force)
 	std::list <zypp::RepoInfo> repos;
 	try
 	{
-		repos = manager.knownRepositories();
+		//repos = manager.knownRepositories();
+		repos = std::list<zypp::RepoInfo>(manager.repoBegin(),manager.repoEnd());
 	}
 	catch ( const zypp::Exception &e)
 	{
commit e203320c4117b6258a156b24c8145168897f718f
Author: Marcin Banasiak <megabajt at pld-linux.org>
Date:   Thu Jul 17 11:50:30 2008 +0200

    poldek: trivial: don't mark package as installed when filters contain ~installed

diff --git a/backends/poldek/pk-backend-poldek.c b/backends/poldek/pk-backend-poldek.c
index 0f2e0ab..26c80a2 100644
--- a/backends/poldek/pk-backend-poldek.c
+++ b/backends/poldek/pk-backend-poldek.c
@@ -1023,7 +1023,7 @@ do_depends (tn_array *installed, tn_array *available, tn_array *depends, struct
 }
 
 static gchar*
-package_id_from_pkg (struct pkg *pkg, const gchar *repo)
+package_id_from_pkg (struct pkg *pkg, const gchar *repo, PkFilterEnum filters)
 {
 	gchar *evr, *package_id, *poldek_dir;
 
@@ -1034,7 +1034,10 @@ package_id_from_pkg (struct pkg *pkg, const gchar *repo)
 	if (repo) {
 		poldek_dir = g_strdup (repo);
 	} else {
-		if (pkg_is_installed (pkg)) {
+		/* when filters contain PK_FILTER_ENUM_NOT_INSTALLED package
+		 * can't be marked as installed */
+		if (!pk_enums_contain (filters, PK_FILTER_ENUM_NOT_INSTALLED) &&
+		    pkg_is_installed (pkg)) {
 			poldek_dir = g_strdup ("installed");
 		} else {
 			if (pkg->pkgdir && pkg->pkgdir->name) {
@@ -1079,7 +1082,7 @@ poldek_backend_package (PkBackend *backend, struct pkg *pkg, PkInfoEnum infoenum
 		}
 	}
 
-	package_id = package_id_from_pkg (pkg, NULL);
+	package_id = package_id_from_pkg (pkg, NULL, filters);
 
 	pkgu = pkg_uinf (pkg);
 
@@ -2184,7 +2187,7 @@ get_obsoletedby_pkg (struct pkg *pkg)
 		struct pkg *dbpkg = n_array_nth (dbpkgs, i);
 
 		if (pkg_caps_obsoletes_pkg_caps (pkg, dbpkg)) {
-			gchar *package_id = package_id_from_pkg (dbpkg, "installed");
+			gchar *package_id = package_id_from_pkg (dbpkg, "installed", 0);
 
 			if (obsoletes) {
 				obsoletes = g_string_append_c (obsoletes, '^');
@@ -2233,7 +2236,7 @@ backend_get_update_detail_thread (PkBackend *backend)
 			gchar	*updates, *obsoletes, *cve_url = NULL;
 			tn_array *cves = NULL;
 
-			updates = package_id_from_pkg (pkg, "installed");
+			updates = package_id_from_pkg (pkg, "installed", 0);
 
 			upkg = poldek_get_pkg_from_package_id (package_ids[0]);
 
commit 9afec115a9872ca5a7fd394cb932f07ae7790bfb
Author: Aidan Skinner <aidan at contemplation.skinner.me.uk>
Date:   Thu Jul 17 01:29:41 2008 +0100

    Add GetPackages

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index e2623b3..4cbca44 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -183,6 +183,27 @@ class PackageKitClient:
         pk_xn.RepoEnable(repo_id, enabled)
         self._wait()
 
+    def GetPackages(self, filter=None):
+        '''
+        This method returns all the packages without a search term.
+
+        filter is a correct filter, e.g. none or installed;~devel
+
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.connect_to_signal('Package',
+            lambda i, id, summary: result.append({'id': str(id),
+                                                  'summary' : str(summary)}))
+        if (filter == None):
+            filter = "none"
+        pk_xn.GetPackages(filter)
+        self._wait()
+        return result
+
+
     #
     # Internal helper functions
     #
@@ -270,32 +291,6 @@ class PackageKitClient:
         return dbus.Interface(self.bus.get_object('org.freedesktop.PackageKit',
             tid, False), 'org.freedesktop.PackageKit.Transaction')
 
-    # Constants used around the place
-    # Filters
-    PK_FILTER_ENUM_NONE			= 0
-    PK_FILTER_ENUM_INSTALLED		= 1 << 0
-    PK_FILTER_ENUM_NOT_INSTALLED	= 1 << 1
-    PK_FILTER_ENUM_DEVELOPMENT		= 1 << 2
-    PK_FILTER_ENUM_NOT_DEVELOPMENT	= 1 << 3
-    PK_FILTER_ENUM_GUI			= 1 << 4
-    PK_FILTER_ENUM_NOT_                 = 1 << 5
-    PK_FILTER_ENUM_FREE			= 1 << 6
-    PK_FILTER_ENUM_NOT_FREE		= 1 << 7
-    PK_FILTER_ENUM_VISIBLE		= 1 << 8
-    PK_FILTER_ENUM_NOT_VISIBLE		= 1 << 9
-    PK_FILTER_ENUM_SUPPORTED		= 1 << 10
-    PK_FILTER_ENUM_NOT_SUPPORTED	= 1 << 11
-    PK_FILTER_ENUM_BASENAME		= 1 << 12
-    PK_FILTER_ENUM_NOT_BASENAME		= 1 << 13
-    PK_FILTER_ENUM_NEWEST		= 1 << 14
-    PK_FILTER_ENUM_NOT_NEWEST		= 1 << 15
-    PK_FILTER_ENUM_ARCH			= 1 << 16
-    PK_FILTER_ENUM_NOT_ARCH		= 1 << 17
-    PK_FILTER_ENUM_SOURCE		= 1 << 18
-    PK_FILTER_ENUM_NOT_SOURCE		= 1 << 19
-    PK_FILTER_ENUM_UNKNOWN		= 1 << 20
-
-
 
 #
 # Test code
commit fc50093e76067790baaffe6301a38e5d3f041618
Author: Aidan Skinner <aidan at contemplation.skinner.me.uk>
Date:   Wed Jul 16 23:52:28 2008 +0100

    Fix RepoEnable

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
index 21f8b0d..e2623b3 100644
--- a/python/packagekitwrapper.py
+++ b/python/packagekitwrapper.py
@@ -150,7 +150,7 @@ class PackageKitClient:
         '''
         Returns the list of repositories used in the system
 
-        A correct filter, e.g. None or 'installed;~devel'
+        filter is a correct filter, e.g. None or 'installed;~devel'
 
         '''
         result = []
@@ -168,27 +168,20 @@ class PackageKitClient:
         self._wait()
         return result
 
-    def RepoEnable(self, filter=None):
+    def RepoEnable(self, repo_id, enabled):
         '''
-        Returns the list of repositories used in the system
+        Enables the repository specified.
+
+        repo_id is a repository identifier, e.g. fedora-development-debuginfo
 
-        A correct filter, e.g. None or 'installed;~devel'
+        enabled true if enabled, false if disabled
 
         '''
-        result = []
         pk_xn = self._get_xn()
         pk_xn.connect_to_signal('Finished', self._h_finished)
         pk_xn.connect_to_signal('ErrorCode', self._h_error)
-        pk_xn.connect_to_signal('RepoDetail',
-                                lambda id, description, enabled:
-                                    result.append({'id' : str(id),
-                                                   'desc' : str(description),
-                                                   'enabled' : enabled}))
-        if (filter == None):
-            filter = 'none'
-        pk_xn.GetRepoList(filter)
+        pk_xn.RepoEnable(repo_id, enabled)
         self._wait()
-        return result
 
     #
     # Internal helper functions
commit c21117316b8dda7dc2e44a56bc505fa36b4be327
Author: Aidan Skinner <aidan at contemplation.skinner.me.uk>
Date:   Wed Jul 16 23:13:45 2008 +0100

    Import python wrapper.
    Origionally by Martin Pitt <martin.pitt at ubuntu.com>,
    additions by Aidan Skinner <aidan at skinner.me.uk>

diff --git a/python/packagekitwrapper.py b/python/packagekitwrapper.py
new file mode 100644
index 0000000..21f8b0d
--- /dev/null
+++ b/python/packagekitwrapper.py
@@ -0,0 +1,350 @@
+#!/usr/bin/python
+#
+# (c) 2008 Canonical Ltd.
+# (c) 2008 Aidan Skinner <aidan at skinner.me.uk>
+# Author: Martin Pitt <martin.pitt at ubuntu.com>
+# License: LGPL 2.1 or later
+#
+# Synchronous PackageKit client wrapper for Python.
+
+import gobject
+import dbus
+
+class PackageKitError(Exception):
+    '''PackageKit error.
+
+    This class mainly wraps a PackageKit "error enum". See
+    http://www.packagekit.org/pk-reference.html#introduction-errors for details
+    and possible values.
+    '''
+    def __init__(self, error):
+        self.error = error
+
+    def __str__(self):
+        return self.error
+
+class PackageKitClient:
+    '''PackageKit client wrapper class.
+
+    This exclusively uses synchonous calls. Functions which take a long time
+    (install/remove packages) have callbacks for progress feedback.
+    '''
+    def __init__(self, main_loop=None):
+        '''Initialize a PackageKit client.
+
+        If main_loop is None, this sets up its own gobject.MainLoop(),
+        otherwise it attaches to the specified one.
+        '''
+        self.pk_control = None
+        if main_loop is None:
+            import dbus.mainloop.glib
+            main_loop = gobject.MainLoop()
+            dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
+        self.main_loop = main_loop
+
+        self.bus = dbus.SystemBus()
+
+    def SuggestDaemonQuit(self):
+        '''Ask the PackageKit daemon to shutdown.'''
+
+        try:
+            self.pk_control.SuggestDaemonQuit()
+        except (AttributeError, dbus.DBusException), e:
+            # not initialized, or daemon timed out
+            pass
+
+    def Resolve(self, filter, package):
+        '''Resolve a package name to a PackageKit package_id.
+
+        filter and package are directly passed to the PackageKit transaction D-BUS
+        method Resolve()
+
+        Return List of (installed, id, short_description) triples for all matches,
+        where installed is a boolean and id and short_description are strings.
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Package',
+            lambda i, p_id, summary: result.append((i == 'installed', str(p_id), str(summary))))
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.Resolve(filter, package)
+        self._wait()
+        return result
+
+    def GetDetails(self, package_id):
+        '''Get details about a PackageKit package_id.
+
+        Return tuple (license, group, description, upstream_url, size).
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Details', lambda *args: result.extend(args))
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.GetDetails(package_id)
+        self._wait()
+        if self._error_enum:
+            raise PackageKitError(self._error_enum)
+        return (str(result[1]), str(result[2]), str(result[3]), str(result[4]), int(result[5]))
+
+    def SearchName(self, filter, name):
+        '''Search a package by name.
+
+        Return a list of (installed, package_id, short_description) triples,
+        where installed is a boolean and package_id/short_description are
+        strings.
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Package',
+            lambda i, id, summary: result.extend((str(id), str(summary))))
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.SearchName(filter, name)
+        self._wait()
+        return result
+
+    def InstallPackages(self, package_ids, progress_cb=None):
+        '''Install a list of package IDs.
+
+        progress_cb is a function taking arguments (status, percentage,
+        subpercentage, elapsed, remaining, allow_cancel). If it returns False,
+        the action is cancelled (if allow_cancel == True), otherwise it
+        continues.
+
+        On failure this throws a PackageKitError or a DBusException.
+        '''
+        self._InstRemovePackages(package_ids, progress_cb, True, None, None)
+
+    def RemovePackages(self, package_ids, progress_cb=None, allow_deps=False,
+        auto_remove=True):
+        '''Remove a list of package IDs.
+
+        progress_cb is a function taking arguments (status, percentage,
+        subpercentage, elapsed, remaining, allow_cancel). If it returns False,
+        the action is cancelled (if allow_cancel == True), otherwise it
+        continues.
+
+        allow_deps and auto_remove are passed to the PackageKit function.
+
+        On failure this throws a PackageKitError or a DBusException.
+        '''
+        self._InstRemovePackages(package_ids, progress_cb, False, allow_deps,
+            auto_remove)
+
+    def RefreshCache(self, force=False):
+        '''
+        Refresh the cache, i.e. download new metadata from a
+        remote URL so that package lists are up to date. This action
+        may take a few minutes and should be done when the session and
+        system are idle.
+        '''
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.RefreshCache(force)
+        self._wait()
+
+    def GetRepoList(self, filter=None):
+        '''
+        Returns the list of repositories used in the system
+
+        A correct filter, e.g. None or 'installed;~devel'
+
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.connect_to_signal('RepoDetail',
+                                lambda id, description, enabled:
+                                    result.append({'id' : str(id),
+                                                   'desc' : str(description),
+                                                   'enabled' : enabled}))
+        if (filter == None):
+            filter = 'none'
+        pk_xn.GetRepoList(filter)
+        self._wait()
+        return result
+
+    def RepoEnable(self, filter=None):
+        '''
+        Returns the list of repositories used in the system
+
+        A correct filter, e.g. None or 'installed;~devel'
+
+        '''
+        result = []
+        pk_xn = self._get_xn()
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.connect_to_signal('RepoDetail',
+                                lambda id, description, enabled:
+                                    result.append({'id' : str(id),
+                                                   'desc' : str(description),
+                                                   'enabled' : enabled}))
+        if (filter == None):
+            filter = 'none'
+        pk_xn.GetRepoList(filter)
+        self._wait()
+        return result
+
+    #
+    # Internal helper functions
+    #
+
+    def _wait(self):
+        '''Wait until an async PK operation finishes.'''
+
+        while self._finished_status is None:
+            self.main_loop.get_context().iteration(True)
+        while self.main_loop.get_context().pending():
+            self.main_loop.get_context().iteration()
+
+    def _h_status(self, status):
+        self._status = status
+
+    def _h_allowcancel(self, allow):
+        self._allow_cancel = allow
+
+    def _h_error(self, enum, desc):
+        self._error_enum = enum
+
+    def _h_finished(self, status, code):
+        self._finished_status = status
+
+    def _h_progress(self, per, subper, el, rem):
+        def _cancel(xn):
+            try:
+                xn.Cancel()
+            except dbus.DBusException, e:
+                if e._dbus_error_name == 'org.freedesktop.PackageKit.Transaction.CannotCancel':
+                    pass
+                else:
+                    raise
+
+        ret = self._progress_cb(self._status, int(per),
+            int(subper), int(el), int(rem), self._allow_cancel)
+        if not ret:
+            # we get backend timeout exceptions more likely when we call this
+            # directly, so delay it a bit
+            gobject.timeout_add(10, _cancel, pk_xn)
+
+    def _InstRemovePackages(self, package_ids, progress_cb, install,
+        allow_deps, auto_remove):
+        '''Shared implementation of InstallPackages and RemovePackages.'''
+
+        self._status = None
+        self._allow_cancel = False
+
+        pk_xn = self._get_xn()
+        if progress_cb:
+            pk_xn.connect_to_signal('StatusChanged', self._h_status)
+            pk_xn.connect_to_signal('AllowCancel', self._h_allowcancel)
+            pk_xn.connect_to_signal('ProgressChanged', self._h_progress)
+            self._progress_cb = progress_cb
+        pk_xn.connect_to_signal('ErrorCode', self._h_error)
+        pk_xn.connect_to_signal('Finished', self._h_finished)
+        if install:
+            pk_xn.InstallPackages(package_ids)
+        else:
+            pk_xn.RemovePackages(package_ids, allow_deps, auto_remove)
+        self._wait()
+        if self._error_enum:
+            raise PackageKitError(self._error_enum)
+        if self._finished_status != 'success':
+            raise PackageKitError('internal-error')
+
+    def _get_xn(self):
+        '''Create a new PackageKit Transaction object.'''
+
+        self._error_enum = None
+        self._finished_status = None
+        try:
+            tid = self.pk_control.GetTid()
+        except (AttributeError, dbus.DBusException), e:
+            if self.pk_control == None or (hasattr(e, '_dbus_error_name') and \
+                e._dbus_error_name == 'org.freedesktop.DBus.Error.ServiceUnknown'):
+                # first initialization (lazy) or timeout
+                self.pk_control = dbus.Interface(self.bus.get_object(
+                    'org.freedesktop.PackageKit', '/org/freedesktop/PackageKit',
+                    False), 'org.freedesktop.PackageKit')
+                tid = self.pk_control.GetTid()
+            else:
+                raise
+
+        return dbus.Interface(self.bus.get_object('org.freedesktop.PackageKit',
+            tid, False), 'org.freedesktop.PackageKit.Transaction')
+
+    # Constants used around the place
+    # Filters
+    PK_FILTER_ENUM_NONE			= 0
+    PK_FILTER_ENUM_INSTALLED		= 1 << 0
+    PK_FILTER_ENUM_NOT_INSTALLED	= 1 << 1
+    PK_FILTER_ENUM_DEVELOPMENT		= 1 << 2
+    PK_FILTER_ENUM_NOT_DEVELOPMENT	= 1 << 3
+    PK_FILTER_ENUM_GUI			= 1 << 4
+    PK_FILTER_ENUM_NOT_                 = 1 << 5
+    PK_FILTER_ENUM_FREE			= 1 << 6
+    PK_FILTER_ENUM_NOT_FREE		= 1 << 7
+    PK_FILTER_ENUM_VISIBLE		= 1 << 8
+    PK_FILTER_ENUM_NOT_VISIBLE		= 1 << 9
+    PK_FILTER_ENUM_SUPPORTED		= 1 << 10
+    PK_FILTER_ENUM_NOT_SUPPORTED	= 1 << 11
+    PK_FILTER_ENUM_BASENAME		= 1 << 12
+    PK_FILTER_ENUM_NOT_BASENAME		= 1 << 13
+    PK_FILTER_ENUM_NEWEST		= 1 << 14
+    PK_FILTER_ENUM_NOT_NEWEST		= 1 << 15
+    PK_FILTER_ENUM_ARCH			= 1 << 16
+    PK_FILTER_ENUM_NOT_ARCH		= 1 << 17
+    PK_FILTER_ENUM_SOURCE		= 1 << 18
+    PK_FILTER_ENUM_NOT_SOURCE		= 1 << 19
+    PK_FILTER_ENUM_UNKNOWN		= 1 << 20
+
+
+
+#
+# Test code
+#
+
+if __name__ == '__main__':
+    import subprocess, sys
+
+    pk = PackageKitClient()
+
+    print '---- RefreshCache() -----'''
+    print pk.RefreshCache()
+
+    print '---- Resolve() -----'
+    print pk.Resolve('none', 'pmount')
+    print pk.Resolve('none', 'quilt')
+    print pk.Resolve('none', 'foobar')
+    print pk.Resolve('installed', 'coreutils')
+    print pk.Resolve('installed', 'pmount')
+
+    print '---- GetDetails() -----'
+    print pk.GetDetails('installation-guide-powerpc;20080520ubuntu1;all;Ubuntu')
+
+    print '---- SearchName() -----'
+    print pk.SearchName('available', 'coreutils')
+    print pk.SearchName('installed', 'coreutils')
+
+    #sys.exit(0)
+
+    def cb(status, pc, spc, el, rem, c):
+        print 'install pkg: %s, %i%%, cancel allowed: %s' % (status, pc, str(c))
+        return True
+        #return pc < 12
+
+    print '---- InstallPackages() -----'
+    pk.InstallPackages(['pmount;0.9.17-2;i386;Ubuntu', 'quilt;0.46-6;all;Ubuntu'], cb)
+
+    subprocess.call(['dpkg', '-l', 'pmount', 'quilt'])
+
+    print '---- RemovePackages() -----'
+    pk.RemovePackages(['pmount;0.9.17-2;i386;Ubuntu', 'quilt;0.46-6;all;Ubuntu'], cb)
+
+    subprocess.call(['dpkg', '-l', 'pmount', 'quilt'])
+
+    pk.SuggestDaemonQuit()
commit 466617d7e3233beb49fe67965128a83e5067a022
Author: Marcin Banasiak <megabajt at pld-linux.org>
Date:   Wed Jul 16 21:29:43 2008 +0200

    poldek: implement DownloadPackages

diff --git a/backends/poldek/pk-backend-poldek.c b/backends/poldek/pk-backend-poldek.c
index a2bc44b..0f2e0ab 100644
--- a/backends/poldek/pk-backend-poldek.c
+++ b/backends/poldek/pk-backend-poldek.c
@@ -37,7 +37,7 @@
 
 static gchar* poldek_pkg_evr (const struct pkg *pkg);
 static void poldek_backend_package (PkBackend *backend, struct pkg *pkg, PkInfoEnum infoenum, PkFilterEnum filters);
-static long do_get_bytes_to_download (const struct poldek_ts *ts, const gchar *mark);
+static long do_get_bytes_to_download (struct poldek_ts *ts, tn_array *pkgs);
 static gint do_get_files_to_download (const struct poldek_ts *ts, const gchar *mark);
 static void pb_load_packages (PkBackend *backend);
 static void poldek_backend_set_allow_cancel (PkBackend *backend, gboolean allow_cancel, gboolean reset);
@@ -170,43 +170,54 @@ do_get_files_to_download (const struct poldek_ts *ts, const gchar *mark)
  * Returns: bytes to download
  */
 static long
-poldek_get_bytes_to_download (const struct poldek_ts *ts)
+poldek_get_bytes_to_download (struct poldek_ts *ts, tn_array *pkgs)
 {
-	long	bytes = 0;
-
-	bytes += do_get_bytes_to_download (ts, "I");
-	bytes += do_get_bytes_to_download (ts, "D");
-
-	return bytes;
+	return do_get_bytes_to_download (ts, pkgs);
 }
 
 static long
-do_get_bytes_to_download (const struct poldek_ts *ts, const gchar *mark)
+poldek_get_bytes_to_download_from_ts (struct poldek_ts *ts)
 {
-	tn_array	*pkgs = NULL;
-	gint		i;
-	long		bytes = 0;
+	gchar mark[2][2] = {"I", "D"};
+	long bytes = 0;
+	gint i = 0;
 
-	pkgs = poldek_ts_get_summary (ts, mark);
+	while (mark[i]) {
+		tn_array *pkgs = poldek_ts_get_summary (ts, mark[i]);
 
-	if (pkgs) {
-		for (i = 0; i < n_array_size (pkgs); i++) {
-			struct pkg	*pkg = n_array_nth (pkgs, i);
-			gchar		path[1024];
+		if (pkgs) {
+			bytes += do_get_bytes_to_download (ts, pkgs);
+
+			n_array_free (pkgs);
+		}
+
+		i++;
+	}
+
+	return bytes;
+}
 
-			if (pkg->pkgdir && (vf_url_type (pkg->pkgdir->path) & VFURL_REMOTE)) {
-				if (pkg_localpath (pkg, path, sizeof(path), ts->cachedir)) {
-					if (access(path, R_OK) != 0) {
+static long
+do_get_bytes_to_download (struct poldek_ts *ts, tn_array *pkgs)
+{
+	gint i;
+	long bytes = 0;
+
+	for (i = 0; i < n_array_size (pkgs); i++) {
+		struct pkg	*pkg = n_array_nth (pkgs, i);
+		gchar		path[1024];
+
+		if (pkg->pkgdir && (vf_url_type (pkg->pkgdir->path) & VFURL_REMOTE)) {
+			if (pkg_localpath (pkg, path, sizeof(path), ts->cachedir)) {
+				if (access(path, R_OK) != 0) {
+					bytes += pkg->fsize;
+				} else {
+					if (!pm_verify_signature(ts->pmctx, path, PKGVERIFY_MD)) {
 						bytes += pkg->fsize;
-					} else {
-						if (!pm_verify_signature(ts->pmctx, path, PKGVERIFY_MD)) {
-							bytes += pkg->fsize;
-						}
 					}
 				}
 			}
 		}
-		n_array_free (pkgs);
 	}
 
 	return bytes;
@@ -340,6 +351,8 @@ ts_confirm (void *data, struct poldek_ts *ts)
 	PkBackend	*backend = (PkBackend *)data;
 	gint		i = 0, result = 1;
 
+	pk_debug ("START\n");
+
 	ipkgs = poldek_ts_get_summary (ts, "I");
 	dpkgs = poldek_ts_get_summary (ts, "D");
 	rpkgs = poldek_ts_get_summary (ts, "R");
@@ -356,7 +369,7 @@ ts_confirm (void *data, struct poldek_ts *ts)
 		pd->step = 0;
 
 		pd->bytesget = 0;
-		pd->bytesdownload = poldek_get_bytes_to_download (ts);
+		pd->bytesdownload = poldek_get_bytes_to_download_from_ts (ts);
 
 		pd->filesget = 0;
 		pd->filesdownload = poldek_get_files_to_download (ts);
@@ -1200,9 +1213,11 @@ search_package_thread (PkBackend *backend)
 			search_cmd = g_strdup_printf ("search -qp mimetype(%s)", search);
 		}
 	} else if (mode == SEARCH_ENUM_RESOLVE) {
-		search = pk_backend_get_string (backend, "package_id");
+		gchar **package_ids;
 
-		search_cmd = g_strdup_printf ("ls -q %s", search);
+		package_ids = pk_backend_get_strv (backend, "package_ids");
+
+		search_cmd = g_strdup_printf ("ls -q %s", package_ids[0]);
 	}
 
 	if (cmd != NULL && search_cmd)
@@ -1794,6 +1809,67 @@ backend_destroy (PkBackend *backend)
 }
 
 /**
+ * backend_download_packages:
+ */
+static gboolean
+backend_download_packages_thread (PkBackend *backend)
+{
+	PercentageData *pd = pk_backend_get_pointer (backend, "percentage_ptr");
+	struct poldek_ts *ts;
+	struct vf_progress vf_progress;
+	tn_array *pkgs;
+	gchar **package_ids;
+	const gchar *destdir;
+	gint i;
+
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+	destdir = pk_backend_get_string (backend, "directory");
+
+	pkgs = n_array_new (10, (tn_fn_free)pkg_free, NULL);
+
+	ts = poldek_ts_new (ctx, 0);
+
+	setup_vf_progress (&vf_progress, backend);
+
+	pb_load_packages (backend);
+
+	for (i = 0; i < g_strv_length (package_ids); i++) {
+		struct pkg *pkg = poldek_get_pkg_from_package_id (package_ids[i]);
+
+		n_array_push (pkgs, pkg_link (pkg));
+
+		pkg_free (pkg);
+	}
+
+	pd->bytesget = 0;
+	pd->bytesdownload = poldek_get_bytes_to_download (ts, pkgs);
+
+	if (!packages_fetch (poldek_get_pmctx (ts->ctx), pkgs, destdir, 1)) {
+		/* something goes wrong */
+	}
+
+	poldek_ts_free (ts);
+
+	poldek_backend_percentage_data_destroy (backend);
+
+	pk_backend_finished (backend);
+
+	return TRUE;
+}
+
+static void
+backend_download_packages (PkBackend *backend, gchar **package_ids,
+			   const gchar *directory)
+{
+	pk_backend_set_status (backend, PK_STATUS_ENUM_DOWNLOAD);
+	poldek_backend_set_allow_cancel (backend, FALSE, TRUE);
+	pb_error_clean ();
+
+	poldek_backend_percentage_data_create (backend);
+	pk_backend_thread_create (backend, backend_download_packages_thread);
+}
+
+/**
  * backend_get_groups:
  **/
 static PkGroupEnum
@@ -2506,6 +2582,7 @@ backend_resolve (PkBackend *backend, PkFilterEnum filters, gchar **package_ids)
 {
 	pk_backend_set_status (backend, PK_STATUS_ENUM_QUERY);
 	poldek_backend_set_allow_cancel (backend, TRUE, TRUE);
+
 	pk_backend_set_uint (backend, "mode", SEARCH_ENUM_RESOLVE);
 	pk_backend_thread_create (backend, search_package_thread);
 }
@@ -2658,7 +2735,7 @@ PK_BACKEND_OPTIONS (
 	backend_get_groups,				/* get_groups */
 	backend_get_filters,				/* get_filters */
 	backend_get_cancel,				/* cancel */
-	NULL,						/* download_packages */
+	backend_download_packages,			/* download_packages */
 	backend_get_depends,				/* get_depends */
 	backend_get_details,				/* get_details */
 	backend_get_files,				/* get_files */
commit 2ff0c4c64a53654b9cdf9e2bb4419ddd90487b1a
Merge: 452f58f... 8edaa12...
Author: Marcin Banasiak <megabajt at pld-linux.org>
Date:   Tue Jul 15 21:02:35 2008 +0200

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

commit 8edaa12993aefdf44129b45f8fbfec0bc2a5140d
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 18:15:16 2008 +0100

    bugfix: don't leak the package_ids in pk_transaction_get_update_detail()

diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index 493b300..05503fb 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1854,7 +1854,7 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 
 	/* alter list */
 	g_strfreev (transaction->priv->cached_package_ids);
-	transaction->priv->cached_package_ids = g_strdupv (package_ids_new);
+	transaction->priv->cached_package_ids = package_ids_new;
 
 	/* try to commit this */
 	ret = pk_transaction_commit (transaction);
commit 3cae5eb1b2048ec4c70b41cc1838ea9c573f76ad
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 17:11:16 2008 +0100

    bugfix: to try to fix an invalid read found by valgrind, add some unit tests to PkTransactionList.
    
    To do this, I needed to slightly change the internal ABI, and make other changes to make the test suite run

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index b58911b..76f2af2 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -74,14 +74,15 @@ G_DEFINE_TYPE (PkTransactionList, pk_transaction_list, G_TYPE_OBJECT)
 static gpointer pk_transaction_list_object = NULL;
 
 /**
- * pk_transaction_list_get_from_transaction:
+ * pk_transaction_list_get_from_tid:
  **/
 static PkTransactionItem *
-pk_transaction_list_get_from_transaction (PkTransactionList *tlist, PkTransaction *transaction)
+pk_transaction_list_get_from_tid (PkTransactionList *tlist, const gchar *tid)
 {
 	guint i;
 	guint length;
 	PkTransactionItem *item;
+	const gchar *tmptid;
 
 	g_return_val_if_fail (tlist != NULL, NULL);
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), NULL);
@@ -90,7 +91,8 @@ pk_transaction_list_get_from_transaction (PkTransactionList *tlist, PkTransactio
 	length = tlist->priv->array->len;
 	for (i=0; i<length; i++) {
 		item = (PkTransactionItem *) g_ptr_array_index (tlist->priv->array, i);
-		if (item->transaction == transaction) {
+		tmptid = pk_transaction_get_tid (item->transaction);
+		if (pk_strequal (tmptid, tid)) {
 			return item;
 		}
 	}
@@ -134,26 +136,18 @@ pk_transaction_list_role_present (PkTransactionList *tlist, PkRoleEnum role)
 }
 
 /**
- * pk_transaction_list_remove:
+ * pk_transaction_list_remove_internal:
  **/
 gboolean
-pk_transaction_list_remove (PkTransactionList *tlist, PkTransaction *transaction)
+pk_transaction_list_remove_internal (PkTransactionList *tlist, PkTransactionItem *item)
 {
 	gboolean ret;
-	PkTransactionItem *item;
-	const gchar *tid;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
-	g_return_val_if_fail (transaction != NULL, FALSE);
+	g_return_val_if_fail (item != NULL, FALSE);
 
-	item = pk_transaction_list_get_from_transaction (tlist, transaction);
-	if (item == NULL) {
-		pk_warning ("could not get item");
-		return FALSE;
-	}
 	/* valid item */
-	tid = pk_transaction_get_tid (item->transaction);
-	pk_debug ("remove transaction %s, item %p", tid, item);
+	pk_debug ("remove transaction %s, item %p", item->tid, item);
 	ret = g_ptr_array_remove (tlist->priv->array, item);
 	if (ret == FALSE) {
 		pk_warning ("could not remove %p as not present in list", item);
@@ -166,6 +160,31 @@ pk_transaction_list_remove (PkTransactionList *tlist, PkTransaction *transaction
 	return TRUE;
 }
 
+/**
+ * pk_transaction_list_remove:
+ **/
+gboolean
+pk_transaction_list_remove (PkTransactionList *tlist, const gchar *tid)
+{
+	PkTransactionItem *item;
+	gboolean ret;
+
+	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
+	g_return_val_if_fail (tid != NULL, FALSE);
+
+	item = pk_transaction_list_get_from_tid (tlist, tid);
+	if (item == NULL) {
+		pk_warning ("could not get item");
+		return FALSE;
+	}
+	if (item->finished) {
+		pk_warning ("already finished, so waiting to timeout");
+		return FALSE;
+	}
+	ret = pk_transaction_list_remove_internal (tlist, item);
+	return ret;
+}
+
 /* we need this for the finished data */
 typedef struct {
 	PkTransactionList *tlist;
@@ -181,7 +200,7 @@ pk_transaction_list_remove_item_timeout (gpointer data)
 	PkTransactionFinished *finished = (PkTransactionFinished *) data;
 
 	pk_debug ("transaction %s completed, removing", finished->item->tid);
-	pk_transaction_list_remove (finished->tlist, finished->item->transaction);
+	pk_transaction_list_remove_internal (finished->tlist, finished->item);
 	g_free (finished);
 	return FALSE;
 }
@@ -197,10 +216,12 @@ pk_transaction_list_transaction_finished_cb (PkTransaction *transaction, const g
 	gboolean ret;
 	PkTransactionItem *item;
 	PkTransactionFinished *finished;
+	const gchar *tid;
 
 	g_return_if_fail (PK_IS_TRANSACTION_LIST (tlist));
 
-	item = pk_transaction_list_get_from_transaction (tlist, transaction);
+	tid = pk_transaction_get_tid (transaction);
+	item = pk_transaction_list_get_from_tid (tlist, tid);
 	if (item == NULL) {
 		pk_error ("no transaction list item found!");
 	}
@@ -254,6 +275,13 @@ pk_transaction_list_create (PkTransactionList *tlist, const gchar *tid)
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
 	g_return_val_if_fail (tid != NULL, FALSE);
 
+	/* already added? */
+	item = pk_transaction_list_get_from_tid (tlist, tid);
+	if (item != NULL) {
+		pk_warning ("already added %s to list", tid);
+		return FALSE;
+	}
+
 	/* add to the array */
 	item = g_new0 (PkTransactionItem, 1);
 	item->committed = FALSE;
@@ -310,17 +338,17 @@ pk_transaction_list_number_running (PkTransactionList *tlist)
  * pk_transaction_list_commit:
  **/
 gboolean
-pk_transaction_list_commit (PkTransactionList *tlist, PkTransaction *transaction)
+pk_transaction_list_commit (PkTransactionList *tlist, const gchar *tid)
 {
 	gboolean ret;
 	PkTransactionItem *item;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
-	g_return_val_if_fail (transaction != NULL, FALSE);
+	g_return_val_if_fail (tid != NULL, FALSE);
 
-	item = pk_transaction_list_get_from_transaction (tlist, transaction);
+	item = pk_transaction_list_get_from_tid (tlist, tid);
 	if (item == NULL) {
-		pk_warning ("could not get transaction: %p", transaction);
+		pk_warning ("could not get transaction: %s", tid);
 		return FALSE;
 	}
 
@@ -461,18 +489,48 @@ pk_transaction_list_new (void)
  ***************************************************************************/
 #ifdef PK_BUILD_TESTS
 #include <libselftest.h>
+#include "pk-backend-internal.h"
+
+/**
+ * libst_transaction_list_finished_cb:
+ **/
+static void
+libst_transaction_list_finished_cb (PkTransaction *transaction, const gchar *exit_text, guint time, LibSelfTest *test)
+{
+	libst_loopquit (test);
+}
+
+/**
+ * libst_transaction_list_delay_cb:
+ **/
+static void
+libst_transaction_list_delay_cb (LibSelfTest *test)
+{
+	libst_loopquit (test);
+}
 
 void
 libst_transaction_list (LibSelfTest *test)
 {
 	PkTransactionList *tlist;
+	gboolean ret;
 	gchar *tid;
+	guint size;
+	gchar **array;
+	PkTransactionItem *item;
 
 	if (libst_start (test, "PkTransactionList", CLASS_AUTO) == FALSE) {
 		return;
 	}
 
+	/************************************************************/
+	libst_title (test, "get a transaction list object");
 	tlist = pk_transaction_list_new ();
+	if (tlist != NULL) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, NULL);
+	}
 
 	/************************************************************/
 	libst_title (test, "make sure we get a valid tid");
@@ -482,9 +540,209 @@ libst_transaction_list (LibSelfTest *test)
 	} else {
 		libst_failed (test, "failed to get tid");
 	}
+
+	/************************************************************/
+	libst_title (test, "make sure we get a valid tid");
+	ret = pk_transaction_list_create (tlist, tid);
+	if (ret) {
+		libst_success (test, "created transaction %s", tid);
+	} else {
+		libst_failed (test, "failed to create transaction");
+	}
+
+	/************************************************************/
+	libst_title (test, "get from db");
+	item = pk_transaction_list_get_from_tid (tlist, tid);
+	if (item != NULL &&
+	    pk_strequal (item->tid, tid) &&
+	    item->transaction != NULL) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "could not find in db");
+	}
+
+	/************************************************************/
+	libst_title (test, "get size one we have in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 1) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/************************************************************/
+	libst_title (test, "get transactions in progress");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 0) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/************************************************************/
+	libst_title (test, "add again the same tid (should fail)");
+	ret = pk_transaction_list_create (tlist, tid);
+	if (!ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "added the same tid twice");
+	}
+
+	/************************************************************/
+	libst_title (test, "remove without ever committing");
+	ret = pk_transaction_list_remove (tlist, tid);
+	if (ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "failed to remove");
+	}
+
+	/************************************************************/
+	libst_title (test, "get size none we have in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 0) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/* get a new tid */
+	g_free (tid);
+	tid = pk_transaction_id_generate ();
+
+	/************************************************************/
+	libst_title (test, "create another item");
+	ret = pk_transaction_list_create (tlist, tid);
+	if (ret) {
+		libst_success (test, "created transaction %s", tid);
+	} else {
+		libst_failed (test, "failed to create transaction");
+	}
+
+	/************************************************************/
+	PkBackend *backend;
+	backend = pk_backend_new ();
+	libst_title (test, "try to load a valid backend");
+	ret = pk_backend_set_name (backend, "dummy");
+	if (ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, NULL);
+	}
+
+	/************************************************************/
+	libst_title (test, "lock an valid backend");
+	ret = pk_backend_lock (backend);
+	if (ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "failed to lock");
+	}
+
+	/************************************************************/
+	libst_title (test, "get from db");
+	item = pk_transaction_list_get_from_tid (tlist, tid);
+	if (item != NULL &&
+	    pk_strequal (item->tid, tid) &&
+	    item->transaction != NULL) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "could not find in db");
+	}
+
+	g_signal_connect (item->transaction, "finished",
+				G_CALLBACK (libst_transaction_list_finished_cb), test);
+
+	pk_transaction_get_updates (item->transaction, "none", NULL);
+
+	/************************************************************/
+	libst_title (test, "get present role");
+	ret = pk_transaction_list_role_present (tlist, PK_ROLE_ENUM_GET_UPDATES);
+	if (ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "did not get role");
+	}
+
+	/************************************************************/
+	libst_title (test, "get non-present role");
+	ret = pk_transaction_list_role_present (tlist, PK_ROLE_ENUM_SEARCH_NAME);
+	if (!ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "got missing role");
+	}
+
+	/************************************************************/
+	libst_title (test, "get size one we have in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 1) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/************************************************************/
+	libst_title (test, "get transactions in progress");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 1) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/* wait for Finished */
+	libst_loopwait (test, 2000);
+	libst_loopcheck (test);
+
+	/************************************************************/
+	libst_title (test, "get size one we have in queue");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 1) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/************************************************************/
+	libst_title (test, "get transactions in progress (none)");
+	array = pk_transaction_list_get_array (tlist);
+	size = g_strv_length (array);
+	if (size == 0) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
+	/************************************************************/
+	libst_title (test, "remove already removed");
+	ret = pk_transaction_list_remove (tlist, tid);
+	if (!ret) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "tried to remove");
+	}
+
+	/* wait for Cleanup */
+	g_timeout_add_seconds (5, (GSourceFunc) libst_transaction_list_delay_cb, test);
+	libst_loopwait (test, 6000);
+	libst_loopcheck (test);
+
+	/************************************************************/
+	libst_title (test, "make sure queue empty");
+	size = pk_transaction_list_get_size (tlist);
+	if (size == 0) {
+		libst_success (test, NULL);
+	} else {
+		libst_failed (test, "size %i", size);
+	}
+
 	g_free (tid);
 
 	g_object_unref (tlist);
+	g_object_unref (backend);
 
 	libst_end (test);
 }
diff --git a/src/pk-transaction-list.h b/src/pk-transaction-list.h
index f1e7d17..6aa90fc 100644
--- a/src/pk-transaction-list.h
+++ b/src/pk-transaction-list.h
@@ -56,9 +56,9 @@ PkTransactionList *pk_transaction_list_new		(void);
 gboolean	 pk_transaction_list_create		(PkTransactionList	*tlist,
 							 const gchar		*tid);
 gboolean	 pk_transaction_list_remove		(PkTransactionList	*tlist,
-							 PkTransaction		*transaction);
+							 const gchar		*tid);
 gboolean	 pk_transaction_list_commit		(PkTransactionList	*tlist,
-							 PkTransaction		*transaction)
+							 const gchar		*tid)
 							 G_GNUC_WARN_UNUSED_RESULT;
 gboolean	 pk_transaction_list_role_present	(PkTransactionList	*tlist,
 							 PkRoleEnum		 role);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index e7ce7a3..493b300 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -943,9 +943,11 @@ pk_transaction_commit (PkTransaction *transaction)
 	g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
 
 	/* commit, so it appears in the JobList */
-	ret = pk_transaction_list_commit (transaction->priv->transaction_list, transaction);
+	ret = pk_transaction_list_commit (transaction->priv->transaction_list,
+					  transaction->priv->tid);
 	if (!ret) {
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		pk_warning ("failed to commit (job not run?)");
 		return FALSE;
 	}
@@ -1164,7 +1166,8 @@ pk_transaction_cancel (PkTransaction *transaction, GError **error)
 
 	/* if it's never been run, just remove this transaction from the list */
 	if (!transaction->priv->has_been_run) {
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		return TRUE;
 	}
 
@@ -1229,8 +1232,8 @@ pk_transaction_download_packages (PkTransaction *transaction, gchar **package_id
 	if (transaction->priv->backend->desc->download_packages == NULL) {
 	        error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 	                             "Operation not yet supported by backend");
-	        pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
-	        dbus_g_method_return_error (context, error);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 	        return;
 	}
 
@@ -1246,7 +1249,10 @@ pk_transaction_download_packages (PkTransaction *transaction, gchar **package_id
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -1259,8 +1265,8 @@ pk_transaction_download_packages (PkTransaction *transaction, gchar **package_id
 	if (!ret) {
 	        error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_COMMIT_FAILED,
 	                             "Could not commit to a transaction object");
-	        pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
-	        dbus_g_method_return_error (context, error);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 	        return;
 	}
 
@@ -1327,7 +1333,10 @@ pk_transaction_get_depends (PkTransaction *transaction, const gchar *filter, gch
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -1386,7 +1395,10 @@ pk_transaction_get_details (PkTransaction *transaction, gchar **package_ids, DBu
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -1443,7 +1455,10 @@ pk_transaction_get_files (PkTransaction *transaction, gchar **package_ids, DBusG
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -1493,7 +1508,10 @@ pk_transaction_get_packages (PkTransaction *transaction, const gchar *filter, DB
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -1609,7 +1627,10 @@ pk_transaction_get_repo_list (PkTransaction *transaction, const gchar *filter, D
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -1674,7 +1695,10 @@ pk_transaction_get_requires (PkTransaction *transaction, const gchar *filter, gc
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -1785,7 +1809,10 @@ pk_transaction_get_update_detail (PkTransaction *transaction, gchar **package_id
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -1876,7 +1903,10 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -1923,7 +1953,10 @@ pk_transaction_get_updates (PkTransaction *transaction, const gchar *filter, DBu
 		return;
 	}
 
-	dbus_g_method_return (context);
+	if (context != NULL) {
+		/* not set inside the test suite */
+		dbus_g_method_return (context);
+	}
 }
 
 /**
@@ -1951,7 +1984,8 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 	if (transaction->priv->backend->desc->install_files == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -1978,7 +2012,10 @@ pk_transaction_install_files (PkTransaction *transaction, gboolean trusted,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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;
@@ -2021,7 +2058,8 @@ pk_transaction_install_packages (PkTransaction *transaction, gchar **package_ids
 	if (transaction->priv->backend->desc->install_packages == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2047,7 +2085,10 @@ pk_transaction_install_packages (PkTransaction *transaction, gchar **package_ids
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2087,7 +2128,8 @@ pk_transaction_install_signature (PkTransaction *transaction, const gchar *sig_t
 	if (transaction->priv->backend->desc->install_signature == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2120,7 +2162,10 @@ pk_transaction_install_signature (PkTransaction *transaction, const gchar *sig_t
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2174,7 +2219,8 @@ pk_transaction_refresh_cache (PkTransaction *transaction, gboolean force, DBusGM
 	if (transaction->priv->backend->desc->refresh_cache == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 			     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2189,7 +2235,10 @@ pk_transaction_refresh_cache (PkTransaction *transaction, gboolean force, DBusGM
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2235,7 +2284,8 @@ pk_transaction_remove_packages (PkTransaction *transaction, gchar **package_ids,
 	if (transaction->priv->backend->desc->remove_packages == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2261,7 +2311,10 @@ pk_transaction_remove_packages (PkTransaction *transaction, gchar **package_ids,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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;
@@ -2301,7 +2354,8 @@ pk_transaction_repo_enable (PkTransaction *transaction, const gchar *repo_id, gb
 	if (transaction->priv->backend->desc->repo_enable == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2326,7 +2380,10 @@ pk_transaction_repo_enable (PkTransaction *transaction, const gchar *repo_id, gb
 
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2367,7 +2424,8 @@ pk_transaction_repo_set_data (PkTransaction *transaction, const gchar *repo_id,
 	if (transaction->priv->backend->desc->repo_set_data == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2391,7 +2449,10 @@ pk_transaction_repo_set_data (PkTransaction *transaction, const gchar *repo_id,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2461,7 +2522,10 @@ pk_transaction_resolve (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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 (packages);
@@ -2501,7 +2565,8 @@ pk_transaction_rollback (PkTransaction *transaction, const gchar *transaction_id
 	if (transaction->priv->backend->desc->rollback == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2525,7 +2590,10 @@ pk_transaction_rollback (PkTransaction *transaction, const gchar *transaction_id
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2583,7 +2651,10 @@ pk_transaction_search_details (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -2642,7 +2713,10 @@ pk_transaction_search_file (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -2701,7 +2775,10 @@ pk_transaction_search_group (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -2760,7 +2837,10 @@ pk_transaction_search_name (PkTransaction *transaction, const gchar *filter,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
@@ -2824,7 +2904,8 @@ pk_transaction_update_packages (PkTransaction *transaction, gchar **package_ids,
 	if (transaction->priv->backend->desc->update_packages == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2850,7 +2931,10 @@ pk_transaction_update_packages (PkTransaction *transaction, gchar **package_ids,
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2888,7 +2972,8 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 	if (transaction->priv->backend->desc->update_system == NULL) {
 		error = g_error_new (PK_TRANSACTION_ERROR, PK_TRANSACTION_ERROR_NOT_SUPPORTED,
 				     "Operation not yet supported by backend");
-		pk_transaction_list_remove (transaction->priv->transaction_list, transaction);
+		pk_transaction_list_remove (transaction->priv->transaction_list,
+					    transaction->priv->tid);
 		dbus_g_method_return_error (context, error);
 		return;
 	}
@@ -2911,7 +2996,10 @@ pk_transaction_update_system (PkTransaction *transaction, DBusGMethodInvocation
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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);
@@ -2969,7 +3057,10 @@ pk_transaction_what_provides (PkTransaction *transaction, const gchar *filter, c
 	}
 
 	/* set the dbus name, so we can get the disconnect */
-	pk_transaction_set_dbus_name (transaction, dbus_g_method_get_sender (context));
+	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_filters = pk_filter_enums_from_text (filter);
commit 8864a09cd4cffd36ddd0bb0674564acfa8071ef8
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 17:09:42 2008 +0100

    trivial: add a silly warning in the self check code

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 4b67422..292cff9 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -2213,7 +2213,7 @@ libst_backend (LibSelfTest *test)
 	if (text == NULL) {
 		libst_success (test, NULL);
 	} else {
-		libst_failed (test, "invalid name %s", text);
+		libst_failed (test, "invalid name %s (test suite needs to unref backend?)", text);
 	}
 	g_free (text);
 
commit 9957f6a0e820d1392786c91f87972e2b079c6dd0
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Jul 4 13:18:57 2008 +0100

    Release version 0.2.3

diff --git a/NEWS b/NEWS
index 5d89b82..2b5fbfc 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,55 @@
+Version 0.2.3
+~~~~~~~~~~~~~~
+Released: 2008-07-04
+
+* Backends
+ - alpm: fixed critical error in package_source_free (Valeriy Lyasotskiy)
+ - alpm: fixed install_packages (Valeriy Lyasotskiy)
+ - alpm: added download notification support for install_packages (Valeriy Lyasotskiy)
+ - alpm: fixes related to local/installed things change (Valeriy Lyasotskiy)
+ - alpm: added get_cancel (Valeriy Lyasotskiy)
+ - alpm: added get_depends (Valeriy Lyasotskiy)
+ - alpm: added get_updates, added get_update_detail (Valeriy Lyasotskiy)
+ - conary: updated the get_details call (Ken VanDine)
+ - poldek: install all suggested packages (Marcin Banasiak)
+ - poldek: implement percentage for installing / updating (Marcin Banasiak)
+ - poldek: now GetUpdateDetail returns obsoleted packages too (Marcin Banasiak)
+ - smart: use smart status flags, fixes fd#16525 (Anders F Bjorklund)
+ - urpmi: fix installation of more than one package (Aurelien Lefebvre)
+ - urpmi: in remove-packages.pl (Aurelien Lefebvre)
+ - urpmi: update-packages of the urpmi backend (Aurelien Lefebvre)
+ - urpmi: Added update-system implementation  (Aurelien Lefebvre)
+ - urpmi: get-updates now take care of update importance (Aurelien Lefebvre)
+ - yum: implemented the newest filter (Tim Lauridsen)
+ - yum: added newest support to group-search and get_packages (Tim Lauridsen)
+ - yum: use the proper package group when we do ::Details() (Richard Hughes)
+ - yum: limit the error text to 1024 chars. fixes rh#450594 (Richard Hughes)
+ - yum: allow more than one package to be removed in one transaction (Richard Hughes)
+ - yum: methods should have 'self' as the first argument, fixes rh#451458 (Robin Norwood)
+ - zypp: roll in zypp backend from openSUSE branch (Scott Reeves)
+ - zypp: change to return all restart_suggested patches not just the first one (Scott Reeves)
+
+* Translations
+ - Updated Catalan translation (Xavier Conde)
+ - Updated Polish translation (Piotr DrÄ…g)
+
+* New features:
+ - Add PkCatalog for installing catalogs of applications. (Richard Hughes)
+ - Add a mime handler for .catalog files (Richard Hughes)
+
+* Bugfixes:
+ - Fix building with -Wformat-security, fixes fd#16431 (Martin Pitt)
+ - Make pk_client_get_package() actually work (Richard Hughes)
+ - Don't convert stdout from the C locale to UTF-8 (Richard Hughes)
+ - Add Catalan locale to LINGUAS -- fixes fd#451550 (Richard Hughes)
+ - Properly document the method and signal descriptions (Richard Hughes)
+ - Fix the permissions of the cron helper, fixes rh#451870 (Richard Hughes)
+ - Check all the internal and public functions with flawfinder (Richard Hughes)
+ - Check the package_id for utf8 validity (Richard Hughes)
+ - Don't use-after-free in pk_task_list_status_changed_cb (Richard Hughes)
+ - Audit the use of FIXME and TODO and fix up some of the issues (Richard Hughes)
+ - Update release with typo fixes, new step, and new version #s (Robin Norwood)
+
 Version 0.2.2
 ~~~~~~~~~~~~~
 Released: 2008-06-05
diff --git a/RELEASE b/RELEASE
index 60ebd78..40cace6 100644
--- a/RELEASE
+++ b/RELEASE
@@ -3,7 +3,7 @@ PackageKit Release Notes
 1. Write NEWS entries for PackageKit and gnome-packagekit in the same
    format as usual. Ignore any trivial commits.
 
-$ git-shortlog GNOME_PACKAGEKIT_0_2_2.. | grep -v trivial > NEWS.new
+$ git-shortlog PACKAGEKIT_0_2_2.. | grep -v trivial | grep -v Merge > NEWS.new
 
 2. Add download date to docs/html/pk-download.html, save file.
 
diff --git a/docs/html/pk-download.html b/docs/html/pk-download.html
index ffaf65e..cd9bf8f 100644
--- a/docs/html/pk-download.html
+++ b/docs/html/pk-download.html
@@ -63,6 +63,7 @@ Released versions are found on
 <tr><td>0.2.0</td><td></td><td>2008-05-06</td></tr>
 <tr><td>0.2.1</td><td></td><td>2008-05-09</td></tr>
 <tr><td>0.2.2</td><td></td><td>2008-06-05</td></tr>
+<tr><td>0.2.3</td><td></td><td>2008-07-04</td></tr>
 </table>
 
 <h2>Dependencies</h2>
commit 19eb75067b34ea6bbfb0f33619efd6fb8994eb8c
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 15:36:01 2008 +0100

    trivial: remove an unused variable

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index 615a1c3..b58911b 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -53,7 +53,6 @@ static void     pk_transaction_list_finalize	(GObject        *object);
 struct PkTransactionListPrivate
 {
 	GPtrArray		*array;
-	gchar			*current_tid;
 };
 
 typedef struct {
commit ddbbdba6082101b3f7ec59174f125bf499888b94
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 14:59:14 2008 +0100

    bugfix: fix a small memory leak in pk_engine_transaction_list_changed_cb()

diff --git a/src/pk-engine.c b/src/pk-engine.c
index f8df943..d818bc5 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -190,6 +190,8 @@ pk_engine_transaction_list_changed_cb (PkTransactionList *tlist, PkEngine *engin
 	pk_debug ("emitting transaction-list-changed");
 	g_signal_emit (engine, signals [PK_ENGINE_TRANSACTION_LIST_CHANGED], 0, transaction_list);
 	pk_engine_reset_timer (engine);
+
+	g_strfreev (transaction_list);
 }
 
 /**
commit 12df4e76b02b9f1921b1b2ebbc4e5e2784c555be
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 14:58:46 2008 +0100

    trivial: improve some debugging output to be actually useful

diff --git a/src/pk-transaction-list.c b/src/pk-transaction-list.c
index f325f94..615a1c3 100644
--- a/src/pk-transaction-list.c
+++ b/src/pk-transaction-list.c
@@ -142,6 +142,7 @@ pk_transaction_list_remove (PkTransactionList *tlist, PkTransaction *transaction
 {
 	gboolean ret;
 	PkTransactionItem *item;
+	const gchar *tid;
 
 	g_return_val_if_fail (PK_IS_TRANSACTION_LIST (tlist), FALSE);
 	g_return_val_if_fail (transaction != NULL, FALSE);
@@ -152,7 +153,8 @@ pk_transaction_list_remove (PkTransactionList *tlist, PkTransaction *transaction
 		return FALSE;
 	}
 	/* valid item */
-	pk_debug ("remove transaction %p, item %p", item->transaction, item);
+	tid = pk_transaction_get_tid (item->transaction);
+	pk_debug ("remove transaction %s, item %p", tid, item);
 	ret = g_ptr_array_remove (tlist->priv->array, item);
 	if (ret == FALSE) {
 		pk_warning ("could not remove %p as not present in list", item);
diff --git a/src/pk-transaction.c b/src/pk-transaction.c
index a47df87..e7ce7a3 100644
--- a/src/pk-transaction.c
+++ b/src/pk-transaction.c
@@ -1160,7 +1160,7 @@ pk_transaction_cancel (PkTransaction *transaction, GError **error)
 	g_return_val_if_fail (PK_IS_TRANSACTION (transaction), FALSE);
 	g_return_val_if_fail (transaction->priv->tid != NULL, FALSE);
 
-	pk_debug ("Cancel method called");
+	pk_debug ("Cancel method called on %s", transaction->priv->tid);
 
 	/* if it's never been run, just remove this transaction from the list */
 	if (!transaction->priv->has_been_run) {
commit ac4c35b9e37b9f920028058a7e2bb581aa4f90ba
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 14:56:19 2008 +0100

    trivial: remove some debug spew from yumComps

diff --git a/backends/yum/helpers/yumComps.py b/backends/yum/helpers/yumComps.py
index e12bd57..a9aa037 100644
--- a/backends/yum/helpers/yumComps.py
+++ b/backends/yum/helpers/yumComps.py
@@ -220,7 +220,6 @@ class yumComps:
             return False
 
         # store to sqlite
-        print 'storing in db'
         for category in cats:
             grps = map(lambda x: self.yumbase.comps.return_group(x),
                filter(lambda x: self.yumbase.comps.has_group(x),category.groups))
commit 5d1adf9e76b2c24a8723051fd18537147e597518
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 13:36:16 2008 +0100

    bugfix: plug a memory leak in the new abstract code in pk_client_package_cb()

diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 8fdf878..3706e32 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -571,6 +571,7 @@ pk_client_package_cb (DBusGProxy   *proxy,
 	if (client->priv->use_buffer || client->priv->synchronous) {
 		pk_package_list_add_obj (client->priv->package_list, obj);
 	}
+	pk_package_id_free (id);
 	pk_package_obj_free (obj);
 }
 
commit 5e405b5f3a98291034c1ccddd88b6df65ab12d9a
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Jul 15 13:35:37 2008 +0100

    trivial: add a convenience function pk_argv_to_ptr_array()

diff --git a/libpackagekit/pk-common.c b/libpackagekit/pk-common.c
index e502477..c7f8b6a 100644
--- a/libpackagekit/pk-common.c
+++ b/libpackagekit/pk-common.c
@@ -677,6 +677,33 @@ pk_ptr_array_to_argv (GPtrArray *array)
 }
 
 /**
+ * pk_argv_to_ptr_array:
+ * @array: the gchar** array of strings
+ *
+ * Form a GPtrArray array of strings.
+ * The data in the array is copied.
+ *
+ * Return value: the string array, or %NULL if invalid
+ **/
+GPtrArray *
+pk_argv_to_ptr_array (gchar **array)
+{
+	guint i;
+	guint length;
+	GPtrArray *parray;
+
+	g_return_val_if_fail (array != NULL, NULL);
+
+	parray = g_ptr_array_new ();
+	length = g_strv_length (array);
+	for (i=0; i<length; i++) {
+		g_ptr_array_add (parray, g_strdup (array[i]));
+	}
+	return parray;
+}
+
+
+/**
  * pk_va_list_to_argv_string:
  **/
 static void
diff --git a/libpackagekit/pk-common.h b/libpackagekit/pk-common.h
index d4b9824..fb20184 100644
--- a/libpackagekit/pk-common.h
+++ b/libpackagekit/pk-common.h
@@ -89,6 +89,8 @@ gchar		*pk_strreplace				(const gchar	*text,
 							 const gchar	*replace);
 gchar		**pk_ptr_array_to_argv			(GPtrArray	*array)
 							 G_GNUC_WARN_UNUSED_RESULT;
+GPtrArray	*pk_argv_to_ptr_array			(gchar		**array)
+							 G_GNUC_WARN_UNUSED_RESULT;
 gchar		**pk_va_list_to_argv			(const gchar	*string_first,
 							 va_list	*args)
 							 G_GNUC_WARN_UNUSED_RESULT;
commit 452f58f5d88cd29bc2329d48cfc05f6ffbcf0dc4
Author: Marcin Banasiak <megabajt at pld-linux.org>
Date:   Mon Jul 14 23:48:39 2008 +0200

    poldek: build fix

diff --git a/backends/poldek/pk-backend-poldek.c b/backends/poldek/pk-backend-poldek.c
index 42d691d..a2bc44b 100644
--- a/backends/poldek/pk-backend-poldek.c
+++ b/backends/poldek/pk-backend-poldek.c
@@ -1857,9 +1857,9 @@ backend_get_depends_thread (PkBackend *backend)
 
 	installed = poldek_get_installed_packages ();
 	available = poldek_get_avail_packages (ctx);
-	package_id = pk_backend_get_string (backend, "package_id");
+	package_ids = pk_backend_get_strv (backend, "package_ids");
 
-	pkg = poldek_get_pkg_from_package_id (package_id);
+	pkg = poldek_get_pkg_from_package_id (package_ids[0]);
 
 	do_depends (installed, available, deppkgs, pkg, backend);
 
@@ -1900,11 +1900,11 @@ backend_get_details_thread (PkBackend *backend)
 	gchar **package_ids;
 	struct pkg	*pkg = NULL;
 
-	package_id = pk_backend_get_string (backend, "package_id");
+	package_ids = pk_backend_get_strv (backend, "package_ids");
 
 	pb_load_packages (backend);
 
-	pkg = poldek_get_pkg_from_package_id (package_id);
+	pkg = poldek_get_pkg_from_package_id (package_ids[0]);
 
 	if (pkg) {
 		struct pkguinf	*pkgu = NULL;
@@ -1916,7 +1916,7 @@ backend_get_details_thread (PkBackend *backend)
 
 		if (pkgu) {
 			pk_backend_details (backend,
-						package_id,
+						package_ids[0],
 						pkguinf_get (pkgu, PKGUINF_LICENSE),
 						group,
 						pkguinf_get (pkgu, PKGUINF_DESCRIPTION),
@@ -1925,7 +1925,7 @@ backend_get_details_thread (PkBackend *backend)
 			pkguinf_free (pkgu);
 		} else {
 			pk_backend_details (backend,
-						package_id,
+						package_ids[0],
 						"",
 						group,
 						"",
@@ -1959,11 +1959,11 @@ backend_get_files_thread (PkBackend *backend)
 	gchar **package_ids;
 	struct pkg	*pkg;
 
-	package_id = pk_backend_get_string (backend, "package_id");
+	package_ids = pk_backend_get_strv (backend, "package_ids");
 
 	pb_load_packages (backend);
 
-	pkg = poldek_get_pkg_from_package_id (package_id);
+	pkg = poldek_get_pkg_from_package_id (package_ids[0]);
 
 	if (pkg) {
 		struct pkgflist		*flist = pkg_get_flist (pkg);
@@ -2002,7 +2002,7 @@ backend_get_files_thread (PkBackend *backend)
 
 		result = g_string_free (filelist, FALSE);
 
-		pk_backend_files (backend, package_id, result);
+		pk_backend_files (backend, package_ids[0], result);
 
 		g_free (result);
 
@@ -2052,8 +2052,8 @@ backend_get_requires_thread (PkBackend *backend)
 
 	reqpkgs = n_array_new (2, NULL, NULL);
 
-	package_id = pk_backend_get_string (backend, "package_id");
-	pkg = poldek_get_pkg_from_package_id (package_id);
+	package_ids = pk_backend_get_strv (backend, "package_ids");
+	pkg = poldek_get_pkg_from_package_id (package_ids[0]);
 	installed = poldek_get_installed_packages ();
 	available = poldek_get_avail_packages (ctx);
 
@@ -2134,11 +2134,11 @@ backend_get_update_detail_thread (PkBackend *backend)
 	struct poclidek_rcmd	*rcmd;
 	gchar		*command;
 
-	package_id = pk_backend_get_string (backend, "package_id");
+	package_ids = pk_backend_get_strv (backend, "package_ids");
 
 	pb_load_packages (backend);
 
-	pi = pk_package_id_new_from_string (package_id);
+	pi = pk_package_id_new_from_string (package_ids[0]);
 
 	rcmd = poclidek_rcmd_new (cctx, NULL);
 
@@ -2159,7 +2159,7 @@ backend_get_update_detail_thread (PkBackend *backend)
 
 			updates = package_id_from_pkg (pkg, "installed");
 
-			upkg = poldek_get_pkg_from_package_id (package_id);
+			upkg = poldek_get_pkg_from_package_id (package_ids[0]);
 
 			obsoletes = get_obsoletedby_pkg (upkg);
 
@@ -2184,7 +2184,7 @@ backend_get_update_detail_thread (PkBackend *backend)
 			}
 
 			pk_backend_update_detail (backend,
-						  package_id,
+						  package_ids[0],
 						  updates,
 						  obsoletes ? obsoletes : "",
 						  "",
@@ -2203,7 +2203,7 @@ backend_get_update_detail_thread (PkBackend *backend)
 		n_array_free (pkgs);
 	} else {
 		pk_backend_update_detail (backend,
-					  package_id,
+					  package_ids[0],
 					  "",
 					  "",
 					  "",


More information about the PackageKit-commit mailing list