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

Richard Hughes hughsient at kemper.freedesktop.org
Mon Sep 15 00:19:10 PDT 2008


 backends/apt/aptDBUSBackend.py                     |    2 
 backends/dummy/pk-backend-dummy.c                  |   45 +-
 backends/smart/helpers/resolve.py                  |    4 
 backends/smart/helpers/smartBackend.py             |  186 +++++++-
 backends/smart/pk-backend-smart.c                  |    3 
 backends/test/helpers/search-name.sh               |    2 
 backends/urpmi/helpers/get-distro-upgrades.pl      |    1 
 backends/urpmi/helpers/get-updates.pl              |   12 
 backends/urpmi/helpers/install-packages.pl         |    9 
 backends/urpmi/helpers/urpmi-dispatched-backend.pl |  443 +++++++++++++++++++++
 backends/urpmi/helpers/urpmi_backend/actions.pm    |    6 
 backends/yum/pk-backend-yum.c                      |    1 
 backends/yum/yumBackend.py                         |  226 ++++++++--
 backends/yum/yumComps.py                           |   64 ++-
 contrib/PackageKit.spec.in                         |    1 
 data/Makefile.am                                   |    4 
 data/pk-upgrade-distro.sh                          |   26 +
 libpackagekit/pk-enum.c                            |    6 
 libpackagekit/pk-enum.h                            |    6 
 libpackagekit/pk-extra.c                           |   36 +
 src/pk-backend-spawn.c                             |   11 
 src/pk-backend.c                                   |   11 
 22 files changed, 976 insertions(+), 129 deletions(-)

New commits:
commit e0739826d88716387c075d903ffd782667a5c928
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 20:36:22 2008 +0200

    yum: handle unknown group in search-group

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 9b4a626..a909715 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -100,6 +100,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
                 except yum.Errors.RepoError,e:
                     self.error(ERROR_NO_CACHE,str(e))
 
+
         return wrapper
 
     def __init__(self,args,lock=True):
@@ -179,7 +180,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
     def _get_nevra(self,pkg):
         ''' gets the NEVRA for a pkg '''
-        return "%s-%s:%s-%s.%s" % (pkg.name,pkg.epoch,pkg.version,pkg.release,pkg.arch);
+        return "%s-%s:%s-%s.%s" % (pkg.name,pkg.epoch,pkg.version,pkg.release,pkg.arch)
 
     def _do_meta_package_search(self,filters,key):
         grps = self.comps.get_meta_packages()
@@ -294,7 +295,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
                 if show_avail:
                     self.package(id,INFO_COLLECTION_AVAILABLE,grp.description)
 
-    @handle_repo_error
+    #@handle_repo_error
     def search_group(self,filters,group_key):
         '''
         Implement the {backend}-search-group functionality
@@ -317,6 +318,10 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         # get the packagelist for this group
         all_packages = self.comps.get_package_list(group_key)
 
+        # group don't exits, just bail out
+        if not all_packages:
+            return
+
         # get installed packages
         self.percentage(10)
         pkgfilter.add_installed(self._get_installed_from_names(all_packages))
@@ -1753,7 +1758,7 @@ class DownloadCallback(BaseMeter):
         @param name: filename
         @param frac: Progress fracment (0 -> 1)
         @param fread: formated string containing BytesRead
-        @param ftime : formated string containing remaining or elapsed time
+        @param ftime: formated string containing remaining or elapsed time
         '''
         pct = int(frac*100)
         if name != self.oldName: # If this a new package
commit 833e2b600c58e4f82b92aa0296a70ff7569ae29e
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 16:58:12 2008 +0200

    smart: report get_fileserror when package not found or in wrong channel

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index c98992d..3228318 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -558,8 +558,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             packages = self._process_search_results(results)
 
             if len(packages) == 0:
+                packagestring = self._string_packageid(packageid)
                 self.error(ERROR_PACKAGE_NOT_FOUND,
-                           'Package %s was not found' % package)
+                           'Package %s was not found' % packagestring)
                 return
 
             channels = self._search_channels(packageid)
@@ -622,18 +623,30 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
             packages = self._process_search_results(results)
 
-            if len(packages) != 1:
+            if len(packages) == 0:
+                packagestring = self._string_packageid(packageid)
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % packagestring)
                 return
 
+            channels = self._search_channels(packageid)
+
             package = packages[0]
             # FIXME: Only installed packages have path lists.
-            paths = []
+            paths = None
             for loader in package.loaders:
+                if channels and loader.getChannel() not in channels:
+                    continue
                 info = loader.getInfo(package)
                 paths = info.getPathList()
                 if len(paths) > 0:
                     break
 
+            if paths == None:
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s in other repo' % package)
+                return
+
             self.files(packageid, ";".join(paths))
 
     def _text_to_boolean(self,text):
commit fb5ec07f1a81498fb9fbc4817e8aca69ada24c29
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 16:42:52 2008 +0200

    smart: report get_details error when package not found or in wrong channel

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 16b6baf..c98992d 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -558,6 +558,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             packages = self._process_search_results(results)
 
             if len(packages) == 0:
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s was not found' % package)
                 return
 
             channels = self._search_channels(packageid)
@@ -565,12 +567,14 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             package = packages[0]
             infos = []
             for loader in package.loaders:
-                if loader.getChannel() not in channels:
+                if channels and loader.getChannel() not in channels:
                     continue
                 info = loader.getInfo(package)
                 infos.append(info)
 
-            if len(infos) != 1:
+            if len(infos) == 0:
+                self.error(ERROR_PACKAGE_NOT_FOUND,
+                           'Package %s in other repo' % package)
                 return
 
             infos.sort()
@@ -835,12 +839,13 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         repoid = idparts[3]
         if repoid == 'local':
             channels = self.ctrl.getFileChannels()
-        else:
+        elif repoid:
+            if repoid == 'installed':
+                repoid = self.systemchannel
             channels = self.ctrl.getChannels()
-            if repoid:
-                if repoid == 'installed':
-                    repoid = self.systemchannel
-                channels = [x for x in channels if x.getAlias() == repoid]
+            channels = [x for x in channels if x.getAlias() == repoid]
+        else:
+            channels = None
         return channels
 
     def _package_is_collection(self, package):
commit a1200b5c949f55059c4783e7519790ab4303afa1
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 16:28:24 2008 +0200

    smart: make sure that get_details results matches package_id repoid

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index f7dbd1c..16b6baf 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -557,15 +557,22 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
             packages = self._process_search_results(results)
 
-            if len(packages) != 1:
+            if len(packages) == 0:
                 return
 
+            channels = self._search_channels(packageid)
+
             package = packages[0]
             infos = []
             for loader in package.loaders:
+                if loader.getChannel() not in channels:
+                    continue
                 info = loader.getInfo(package)
                 infos.append(info)
 
+            if len(infos) != 1:
+                return
+
             infos.sort()
             info = infos[0]
 
@@ -820,6 +827,22 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
         return (ratio, results, suggestions)
 
+    def _channel_is_local(self, channel):
+        return isinstance(channel, smart.channel.FileChannel)
+
+    def _search_channels(self, packageid):
+        idparts = packageid.split(';')
+        repoid = idparts[3]
+        if repoid == 'local':
+            channels = self.ctrl.getFileChannels()
+        else:
+            channels = self.ctrl.getChannels()
+            if repoid:
+                if repoid == 'installed':
+                    repoid = self.systemchannel
+                channels = [x for x in channels if x.getAlias() == repoid]
+        return channels
+
     def _package_is_collection(self, package):
         return package.name.startswith('^')
 
@@ -865,7 +888,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             info = loader.getInfo(package)
             if package.installed:
                 data = 'installed'
-            elif isinstance(channel, smart.channel.FileChannel):
+            elif self._channel_is_local(channel):
                 data = 'local'
             else:
                 data = channel.getAlias()
commit 6390edc59448a4b0c11d92a7f5d87bd8d4be67c0
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 15:31:38 2008 +0200

    smart: use @ instead of ^ for rpm collection name prefix

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 6f063aa..f7dbd1c 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -810,6 +810,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         idparts = packageid.split(';')
         # note: currently you can only search in channels native to system
         packagestring = self._joinpackage(idparts[0], idparts[1], idparts[2])
+        if packagestring.startswith('@'):
+            packagestring = packagestring.replace('@', '^', 1)
         return packagestring
 
     def _search_packageid(self, packageid):
@@ -855,7 +857,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         collection = False
         if name.startswith('^'):
             collection = True
-            # FIXME: replace ^
+            name = name.replace('^', '@', 1)
         for loader in package.loaders:
             channel = loader.getChannel()
             if package.installed and not channel.getType().endswith('-sys'):
commit 6da37878fcf036ff2befdea81e916eaea2ddee52
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 14:12:43 2008 +0200

    smart: set special status for collection packages

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 3886441..6f063aa 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -818,12 +818,21 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
         return (ratio, results, suggestions)
 
+    def _package_is_collection(self, package):
+        return package.name.startswith('^')
+
     def _add_package(self, package, status=None):
         if not status:
-            if package.installed:
-                status = INFO_INSTALLED
+            if self._package_is_collection(package):
+                if package.installed:
+                    status = INFO_COLLECTION_INSTALLED
+                else:
+                    status = INFO_COLLECTION_AVAILABLE
             else:
-                status = INFO_AVAILABLE
+                if package.installed:
+                    status = INFO_INSTALLED
+                else:
+                    status = INFO_AVAILABLE
         self._package_list.append((package, status))
 
     def _show_package_list(self):
@@ -917,9 +926,6 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                     return False
         return True
 
-    def _package_is_collection(self, package):
-        return package.name.startswith('^')
-
     def _package_is_graphical(self, package):
         from smart.backends.rpm.base import RPMPackage
         from smart.backends.deb.base import DebPackage
commit 4e432cd12c6771dfbd059aaee27f5d79dab9cfaa
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 13:59:08 2008 +0200

    smart: add collections_filtering

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 9b2b87c..3886441 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -843,6 +843,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             else:
                 status = INFO_UNKNOWN
         name, version, arch = self._splitpackage(package)
+        collection = False
+        if name.startswith('^'):
+            collection = True
+            # FIXME: replace ^
         for loader in package.loaders:
             channel = loader.getChannel()
             if package.installed and not channel.getType().endswith('-sys'):
@@ -913,6 +917,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                     return False
         return True
 
+    def _package_is_collection(self, package):
+        return package.name.startswith('^')
+
     def _package_is_graphical(self, package):
         from smart.backends.rpm.base import RPMPackage
         from smart.backends.deb.base import DebPackage
@@ -961,6 +968,12 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                         return False
                     if filter == FILTER_NOT_ARCH and same:
                         return False
+                if filter in (FILTER_COLLECTIONS, FILTER_NOT_COLLECTIONS):
+                    collection = self._package_is_collection(package)
+                    if filter == FILTER_COLLECTIONS and not collection:
+                        return False
+                    if filter == FILTER_NOT_COLLECTIONS and collection:
+                        return False
                 if filter in (FILTER_GUI, FILTER_NOT_GUI):
                     graphical = self._package_is_graphical(package)
                     if graphical is None: # tristate boolean
diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index e4e75d5..a63a43d 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -101,6 +101,7 @@ backend_get_filters (PkBackend *backend)
 		PK_FILTER_ENUM_GUI,
 		PK_FILTER_ENUM_DEVELOPMENT,
 		PK_FILTER_ENUM_BASENAME,
+		PK_FILTER_ENUM_COLLECTIONS,
 	/* FIXME: These depend on a newer Smart API: */
 		PK_FILTER_ENUM_FREE,
 		-1);
commit 5d9469020d306c045d3fef08f633a287aa1dcc9a
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 13:37:06 2008 +0200

    trivial: put collections outside the regular groups

diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index 58a5b59..e4e75d5 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -62,6 +62,7 @@ static PkBitfield
 backend_get_groups (PkBackend *backend)
 {
 	return pk_bitfield_from_enums (
+		PK_GROUP_ENUM_COLLECTIONS,
 	/* FIXME: These depend on the Smart backends: */
 		PK_GROUP_ENUM_ACCESSORIES,
 		PK_GROUP_ENUM_ADMIN_TOOLS,
@@ -77,7 +78,6 @@ backend_get_groups (PkBackend *backend)
 		PK_GROUP_ENUM_INTERNET,
 		PK_GROUP_ENUM_LEGACY,
 		PK_GROUP_ENUM_LOCALIZATION,
-		PK_GROUP_ENUM_COLLECTIONS,
 		PK_GROUP_ENUM_MULTIMEDIA,
 		PK_GROUP_ENUM_NETWORK,
 		PK_GROUP_ENUM_OTHER,
commit 1ffd991fbdb2a4ae253f0aa97d9ce471274b1bba
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sun Sep 14 13:28:17 2008 +0200

    make smart compile again, after the latest rename

diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index 36e6e8f..58a5b59 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -77,7 +77,7 @@ backend_get_groups (PkBackend *backend)
 		PK_GROUP_ENUM_INTERNET,
 		PK_GROUP_ENUM_LEGACY,
 		PK_GROUP_ENUM_LOCALIZATION,
-		PK_GROUP_ENUM_META_PACKAGES,
+		PK_GROUP_ENUM_COLLECTIONS,
 		PK_GROUP_ENUM_MULTIMEDIA,
 		PK_GROUP_ENUM_NETWORK,
 		PK_GROUP_ENUM_OTHER,
commit f36fa2bf0e7aa4da8f137448849a625db6a403cd
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 12:02:48 2008 +0100

    yum: support the collections group

diff --git a/backends/yum/pk-backend-yum.c b/backends/yum/pk-backend-yum.c
index b12fd4c..be6f420 100644
--- a/backends/yum/pk-backend-yum.c
+++ b/backends/yum/pk-backend-yum.c
@@ -55,6 +55,7 @@ static PkBitfield
 backend_get_groups (PkBackend *backend)
 {
 	return pk_bitfield_from_enums (
+		PK_GROUP_ENUM_COLLECTIONS,
 		PK_GROUP_ENUM_ADMIN_TOOLS,
 		PK_GROUP_ENUM_DESKTOP_GNOME,
 		PK_GROUP_ENUM_DESKTOP_KDE,
commit a7eb8bcdc4f8a842886891f37c89ee5e4e6c9345
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 12:01:17 2008 +0100

    trivial: rename PK_FILTER_ENUM_META_PACKAGES to PK_FILTER_ENUM_COLLECTIONS : save file this time

diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 9507cfc..0c15d20 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -183,8 +183,8 @@ typedef enum {
 	PK_FILTER_ENUM_NOT_ARCH,
 	PK_FILTER_ENUM_SOURCE,
 	PK_FILTER_ENUM_NOT_SOURCE,
-	PK_FILTER_ENUM_META_PACKAGES,
-	PK_FILTER_ENUM_NOT_META_PACKAGES,
+	PK_FILTER_ENUM_COLLECTIONS,
+	PK_FILTER_ENUM_NOT_COLLECTIONS,
 	PK_FILTER_ENUM_UNKNOWN
 } PkFilterEnum;
 
commit e635f08e565616ccddbfb79aded99cae6ef31317
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 12:00:28 2008 +0100

    rename PK_FILTER_ENUM_META_PACKAGES to PK_FILTER_ENUM_COLLECTIONS

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index daeaf41..9b4a626 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -203,7 +203,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         installed = []
         available = []
 
-        if FILTER_META_PACKAGES in fltlist:
+        if FILTER_COLLECTIONS in fltlist:
             self._do_meta_package_search(fltlist,key)
 
         for (pkg,values) in res:
diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index f652031..c9446c7 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -215,8 +215,8 @@ static PkEnumMatch enum_filter[] = {
 	{PK_FILTER_ENUM_NOT_ARCH,		"~arch"},
 	{PK_FILTER_ENUM_SOURCE,			"source"},
 	{PK_FILTER_ENUM_NOT_SOURCE,		"~source"},
-	{PK_FILTER_ENUM_META_PACKAGES,		"meta"},
-	{PK_FILTER_ENUM_NOT_META_PACKAGES,	"~meta"},
+	{PK_FILTER_ENUM_COLLECTIONS,		"collections"},
+	{PK_FILTER_ENUM_NOT_COLLECTIONS,	"~collections"},
 	{0, NULL}
 };
 
commit c2d42a972976b6848d6b7f2da065ed37a1e2a066
Merge: 471590e... 24b6238...
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 11:58:03 2008 +0100

    trivial: fix conflicts

diff --cc backends/yum/yumBackend.py
index 2b7ce3d,1828068..daeaf41
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@@ -269,16 -278,23 +278,22 @@@ class PackageKitYumBackend(PackageKitBa
              if i % 10 == 0:
                  pct += step
                  self.percentage(pct)
-             id = "%s;meta;meta;meta" % col
-             grp = self.yumbase.comps.return_group(col)
-             if grp:
-                 if grp.installed:
-                     self.package(id,INFO_COLLECTION_INSTALLED,grp.description)
-                 else:
-                     if show_avail:
-                         self.package(id,INFO_COLLECTION_AVAILABLE,grp.description)
+             self._show_meta_package(col,fltlist)
          self.percentage(100)
  
+     def _show_meta_package(self,grpid,fltlist=[]):
+         show_avail = FILTER_INSTALLED not in fltlist
+         show_inst = FILTER_NOT_INSTALLED not in fltlist
+         id = "%s;meta;meta;meta" % grpid
+         grp = self.yumbase.comps.return_group(grpid)
+         if grp:
+             if grp.installed:
+                 if show_inst:
 -                    self.package(id,INFO_INSTALLED,grp.description)
++                    self.package(id,INFO_COLLECTION_INSTALLED,grp.description)
+             else:
+                 if show_avail:
 -                    self.package(id,INFO_AVAILABLE,grp.description)
 -
++                    self.package(id,INFO_COLLECTION_AVAILABLE,grp.description)
+ 
      @handle_repo_error
      def search_group(self,filters,group_key):
          '''
commit 471590ed4e5a04e2d2ff47737dc0451104a71fcf
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 11:55:59 2008 +0100

    feature: add PK_INFO_ENUM_COLLECTION_INSTALLED and PK_INFO_ENUM_COLLECTION_AVAILABLE

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 3e18bf4..2b7ce3d 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -273,14 +273,12 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
             grp = self.yumbase.comps.return_group(col)
             if grp:
                 if grp.installed:
-                    self.package(id,INFO_INSTALLED,grp.description)
+                    self.package(id,INFO_COLLECTION_INSTALLED,grp.description)
                 else:
                     if show_avail:
-                        self.package(id,INFO_AVAILABLE,grp.description)
+                        self.package(id,INFO_COLLECTION_AVAILABLE,grp.description)
         self.percentage(100)
 
-
-
     @handle_repo_error
     def search_group(self,filters,group_key):
         '''
diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index 1fe20dc..aecc7e5 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -297,6 +297,8 @@ static PkEnumMatch enum_info[] = {
 	{PK_INFO_ENUM_REMOVING,			"removing"},
 	{PK_INFO_ENUM_CLEANUP,			"cleanup"},
 	{PK_INFO_ENUM_OBSOLETING,		"obsoleting"},
+	{PK_INFO_ENUM_COLLECTION_INSTALLED,	"collection-installed"},
+	{PK_INFO_ENUM_COLLECTION_AVAILABLE,	"collection-available"},
 	{0, NULL}
 };
 
diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 4c88fe9..5700aae 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -372,6 +372,8 @@ typedef enum {
 	PK_INFO_ENUM_REMOVING,
 	PK_INFO_ENUM_CLEANUP,
 	PK_INFO_ENUM_OBSOLETING,
+	PK_INFO_ENUM_COLLECTION_INSTALLED,
+	PK_INFO_ENUM_COLLECTION_AVAILABLE,
 	PK_INFO_ENUM_UNKNOWN
 } PkInfoEnum;
 
commit b3f27588a218c5a865e0a17428e6e689cb731372
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 11:48:06 2008 +0100

    trivial: rename PK_GROUP_ENUM_META_PACKAGES to PK_GROUP_ENUM_COLLECTIONS

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 2fc7a35..9b2b87c 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -468,13 +468,13 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'User Interface/X'                        : GROUP_DESKTOP_OTHER,
     'User Interface/X Hardware Support'       : GROUP_DESKTOP_OTHER,
     # Yum
-    'Virtual'                                 : GROUP_META_PACKAGES,
-    'Virtual/Applications'                    : GROUP_META_PACKAGES,
-    'Virtual/Base System'                     : GROUP_META_PACKAGES,
-    'Virtual/Desktop Environments'            : GROUP_META_PACKAGES,
-    'Virtual/Development'                     : GROUP_META_PACKAGES,
-    'Virtual/Languages'                       : GROUP_META_PACKAGES,
-    'Virtual/Servers'                         : GROUP_META_PACKAGES,
+    'Virtual'                                 : GROUP_COLLECTIONS,
+    'Virtual/Applications'                    : GROUP_COLLECTIONS,
+    'Virtual/Base System'                     : GROUP_COLLECTIONS,
+    'Virtual/Desktop Environments'            : GROUP_COLLECTIONS,
+    'Virtual/Development'                     : GROUP_COLLECTIONS,
+    'Virtual/Languages'                       : GROUP_COLLECTIONS,
+    'Virtual/Servers'                         : GROUP_COLLECTIONS,
     # RPM (novell)
     'Productivity/Archiving'                  : GROUP_OTHER, ### FIXME
     'Productivity/Databases'                  : GROUP_OTHER, ### FIXME
@@ -499,14 +499,14 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'System/GUI/Other'                        : GROUP_DESKTOP_OTHER,
     'System/GUI/XFCE'                         : GROUP_DESKTOP_XFCE,
     # YaST2
-#   'Virtual'                                 : GROUP_META_PACKAGES,
-    'Virtual/Base Technologies'               : GROUP_META_PACKAGES,
-    'Virtual/Desktop Functions'               : GROUP_META_PACKAGES,
-#   'Virtual/Development'                     : GROUP_META_PACKAGES,
-    'Virtual/GNOME Desktop'                   : GROUP_META_PACKAGES,
-    'Virtual/Graphical Environments'          : GROUP_META_PACKAGES,
-    'Virtual/KDE Desktop'                     : GROUP_META_PACKAGES,
-    'Virtual/Server Functions'                : GROUP_META_PACKAGES,
+#   'Virtual'                                 : GROUP_COLLECTIONS,
+    'Virtual/Base Technologies'               : GROUP_COLLECTIONS,
+    'Virtual/Desktop Functions'               : GROUP_COLLECTIONS,
+#   'Virtual/Development'                     : GROUP_COLLECTIONS,
+    'Virtual/GNOME Desktop'                   : GROUP_COLLECTIONS,
+    'Virtual/Graphical Environments'          : GROUP_COLLECTIONS,
+    'Virtual/KDE Desktop'                     : GROUP_COLLECTIONS,
+    'Virtual/Server Functions'                : GROUP_COLLECTIONS,
     # DEB
     "admin"                                   : GROUP_ADMIN_TOOLS,
     "base"                                    : GROUP_SYSTEM,
diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 49f66d8..3e18bf4 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -297,7 +297,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         # Handle collections
         # FIXME: add the right enum here
-        if group_key == GROUP_META_PACKAGES:
+        if group_key == GROUP_COLLECTIONS:
             self._handle_collections(fltlist)
             return
 
diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index 1aa9217..1fe20dc 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -251,7 +251,7 @@ static PkEnumMatch enum_group[] = {
 	{PK_GROUP_ENUM_SCIENCE,			"science"},
 	{PK_GROUP_ENUM_DOCUMENTATION,		"documentation"},
 	{PK_GROUP_ENUM_ELECTRONICS,		"electronics"},
-	{PK_GROUP_ENUM_META_PACKAGES,		"meta-packages"},
+	{PK_GROUP_ENUM_COLLECTIONS,		"collections"},
 	{0, NULL}
 };
 
diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 937841a..4c88fe9 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -309,7 +309,7 @@ typedef enum {
 	PK_GROUP_ENUM_SCIENCE,
 	PK_GROUP_ENUM_DOCUMENTATION,
 	PK_GROUP_ENUM_ELECTRONICS,
-	PK_GROUP_ENUM_META_PACKAGES,
+	PK_GROUP_ENUM_COLLECTIONS,
 	PK_GROUP_ENUM_UNKNOWN
 } PkGroupEnum;
 
commit 24b62387ce9cb7e7eeb1062d09439dc23f3f1667
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 12:42:50 2008 +0200

    Added PK_FILTER_ENUM_META_PACKAGES and PK_FILTER_ENUM_NOT_META_PACKAGES enums and make the yum backend search support this

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 08d23a9..1828068 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -181,6 +181,13 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         ''' gets the NEVRA for a pkg '''
         return "%s-%s:%s-%s.%s" % (pkg.name,pkg.epoch,pkg.version,pkg.release,pkg.arch);
 
+    def _do_meta_package_search(self,filters,key):
+        grps = self.comps.get_meta_packages()
+        for grpid in grps:
+            if key in grpid:
+                self._show_meta_package(grpid,filters)
+
+
     @handle_repo_error
     def _do_search(self,searchlist,filters,key):
         '''
@@ -196,6 +203,9 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         installed = []
         available = []
 
+        if FILTER_META_PACKAGES in fltlist:
+            self._do_meta_package_search(fltlist,key)
+
         for (pkg,values) in res:
             if pkg.repo.id == 'installed':
                 installed.append(pkg)
@@ -259,7 +269,6 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         collections = self.comps.get_meta_packages()
         self.percentage(20)
 
-        show_avail = FILTER_INSTALLED not in fltlist
         step = int(800/len(collections))
         print step
         pct=20
@@ -269,16 +278,21 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
             if i % 10 == 0:
                 pct += step
                 self.percentage(pct)
-            id = "%s;meta;meta;meta" % col
-            grp = self.yumbase.comps.return_group(col)
-            if grp:
-                if grp.installed:
-                    self.package(id,INFO_INSTALLED,grp.description)
-                else:
-                    if show_avail:
-                        self.package(id,INFO_AVAILABLE,grp.description)
+            self._show_meta_package(col,fltlist)
         self.percentage(100)
 
+    def _show_meta_package(self,grpid,fltlist=[]):
+        show_avail = FILTER_INSTALLED not in fltlist
+        show_inst = FILTER_NOT_INSTALLED not in fltlist
+        id = "%s;meta;meta;meta" % grpid
+        grp = self.yumbase.comps.return_group(grpid)
+        if grp:
+            if grp.installed:
+                if show_inst:
+                    self.package(id,INFO_INSTALLED,grp.description)
+            else:
+                if show_avail:
+                    self.package(id,INFO_AVAILABLE,grp.description)
 
 
     @handle_repo_error
diff --git a/libpackagekit/pk-enum.c b/libpackagekit/pk-enum.c
index 1aa9217..4197c29 100644
--- a/libpackagekit/pk-enum.c
+++ b/libpackagekit/pk-enum.c
@@ -215,6 +215,8 @@ static PkEnumMatch enum_filter[] = {
 	{PK_FILTER_ENUM_NOT_ARCH,		"~arch"},
 	{PK_FILTER_ENUM_SOURCE,			"source"},
 	{PK_FILTER_ENUM_NOT_SOURCE,		"~source"},
+	{PK_FILTER_ENUM_META_PACKAGES,		"meta"},
+	{PK_FILTER_ENUM_NOT_META_PACKAGES,	"~meta"},
 	{0, NULL}
 };
 
diff --git a/libpackagekit/pk-enum.h b/libpackagekit/pk-enum.h
index 937841a..98fcb47 100644
--- a/libpackagekit/pk-enum.h
+++ b/libpackagekit/pk-enum.h
@@ -183,6 +183,8 @@ typedef enum {
 	PK_FILTER_ENUM_NOT_ARCH,
 	PK_FILTER_ENUM_SOURCE,
 	PK_FILTER_ENUM_NOT_SOURCE,
+	PK_FILTER_ENUM_META_PACKAGES,
+	PK_FILTER_ENUM_NOT_META_PACKAGES,
 	PK_FILTER_ENUM_UNKNOWN
 } PkFilterEnum;
 
commit c2001b5b2176fd5af50117c543ca7b9c574db37e
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 11:53:57 2008 +0200

    yum: metapackage code refactoring, bug fixes and support for get-depends

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index c9d73d5..08d23a9 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -477,13 +477,16 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         return epoch,version,release
 
     def _is_meta_package(self,id):
-        meta = None
+        grp = None
         if len(id.split(';')) > 1:
             # Split up the id
             (n,idver,a,d) = self.get_package_from_id(id)
             if idver == 'meta' and a == 'meta' and d == 'meta':
                 meta = n
-        return meta
+                grp = self.yumbase.comps.return_group(meta)
+                if not grp:
+                    self.error(ERROR_PACKAGE_NOT_FOUND,"The Group %s dont exist" % meta)
+        return grp
 
     def _findPackage(self,id):
         '''
@@ -492,7 +495,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         # Bailout if meta packages, just to be sure
         if self._is_meta_package(id):
             return None,False
-            
+
         # is this an real id or just an name
         if len(id.split(';')) > 1:
             # Split up the id
@@ -566,15 +569,12 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         for package in package_ids:
             self.percentage(percentage)
-            meta = self._is_meta_package(package)
-            if meta:
-                grp = self.yumbase.comps.return_group(meta)
-                if not grp:
-                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s dont exist" % meta)
+            grp = self._is_meta_package(package)
+            if grp:
                 if not grp.installed:
-                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s is not installed" % meta)
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s is not installed" % grp.groupid)
                 else:
-                    txmbr = self.yumbase.groupRemove(meta)
+                    txmbr = self.yumbase.groupRemove(grp.groupid)
                     rc,msgs =  self.yumbase.buildTransaction()
                     if rc !=2:
                         self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
@@ -739,6 +739,25 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         return deps_list
 
+    def _get_group_packages(self,grp):
+        '''
+        Get the packages there will be installed when a comps group
+        is installed
+        '''
+        if not grp.installed:
+            txmbrs = self.yumbase.selectGroup(grp.groupid)
+        else:
+            txmbrs = self.yumbase.groupRemove(grp.groupid)
+        pkgs = []
+        for t in txmbrs:
+            pkgs.append(t.po)
+        if not grp.installed:
+            self.yumbase.deselectGroup(grp.groupid)
+        else:
+            self.yumbase.groupUnremove(grp.groupid)
+        return pkgs
+
+
     def get_depends(self,filters,package_ids,recursive_text):
         '''
         Print a list of depends for a given package
@@ -761,13 +780,18 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         # 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)
-            if pkg:
-                resolve_list.append(pkg)
+            grp = self._is_meta_package(package)
+            if grp:
+                pkgs = self._get_group_packages(grp)
+                resolve_list.extend(pkgs)
             else:
-                self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
-                break
+                name = package.split(';')[0]
+                pkg,inst = self._findPackage(package)
+                if pkg:
+                    resolve_list.append(pkg)
+                else:
+                    self.error(ERROR_PACKAGE_NOT_FOUND,'Package %s was not found' % package)
+                    break
             percentage += bump
 
         # get the best deps
@@ -905,14 +929,11 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         txmbrs = []
         already_warned = False
         for package in package_ids:
-            meta = self._is_meta_package(package)
-            if meta:
-                grp = self.yumbase.comps.return_group(meta)
-                if not grp:
-                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The Group %s dont exist" % meta)
+            grp = self._is_meta_package(package)
+            if grp:
                 if grp.installed:
-                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"This Group %s is already installed" % meta)
-                txmbr = self.yumbase.selectGroup(meta)
+                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"This Group %s is already installed" % grp.groupid)
+                txmbr = self.yumbase.selectGroup(grp.groupid)
                 for t in txmbr:
                     repo = self.yumbase.repos.getRepo(t.po.repoid)
                     if not already_warned and not repo.gpgcheck:
@@ -1231,14 +1252,11 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         txmbrs = []
         for package in package_ids:
-            meta = self._is_meta_package(package)
-            if meta:
-                grp = self.yumbase.comps.return_group(meta)
-                if not grp:
-                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s dont exist" % meta)
+            grp = self._is_meta_package(package)
+            if grp:
                 if not grp.installed:
-                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"This Group %s is not installed" % meta)
-                txmbr = self.yumbase.groupRemove(meta)
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"This Group %s is not installed" % grp.groupid)
+                txmbr = self.yumbase.groupRemove(grp.groupid)
                 txmbrs.extend(txmbr)
             else:
                 pkg,inst = self._findPackage(package)
@@ -1788,10 +1806,10 @@ class PackageKitCallback(RPMBaseCallback):
 
     def _showName(self,status):
         if type(self.curpkg) in types.StringTypes:
-            id = self.get_package_id(self.curpkg,'','','')
+            id = self.base.get_package_id(self.curpkg,'','','')
         else:
             pkgver = self.base._get_package_ver(self.curpkg)
-            id = self.get_package_id(self.curpkg.name,pkgver,self.curpkg.arch,self.curpkg.repo)
+            id = self.base.get_package_id(self.curpkg.name,pkgver,self.curpkg.arch,self.curpkg.repo)
         self.base.package(id,status,"")
 
     def event(self,package,action,te_current,te_total,ts_current,ts_total):
commit 4abe306bc887cb7830eee9a16bbcba38099072bb
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 10:01:38 2008 +0200

    yum: make get-requires handle meta packages (comps groups)

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 49f66d8..c9d73d5 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -566,20 +566,36 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         for package in package_ids:
             self.percentage(percentage)
-            pkg,inst = self._findPackage(package)
-            # FIXME: This is a hack, it simulates a removal of the
-            # package and return the transaction
-            if inst and pkg:
-                resolve_list.append(pkg)
-                txmbrs = self.yumbase.remove(po=pkg)
-                if txmbrs:
+            meta = self._is_meta_package(package)
+            if meta:
+                grp = self.yumbase.comps.return_group(meta)
+                if not grp:
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s dont exist" % meta)
+                if not grp.installed:
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s is not installed" % meta)
+                else:
+                    txmbr = self.yumbase.groupRemove(meta)
                     rc,msgs =  self.yumbase.buildTransaction()
                     if rc !=2:
                         self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
                     else:
                         for txmbr in self.yumbase.tsInfo:
-                            if pkg not in deps_list:
-                                deps_list.append(txmbr.po)
+                            deps_list.append(txmbr.po)
+            else:
+                pkg,inst = self._findPackage(package)
+                # FIXME: This is a hack, it simulates a removal of the
+                # package and return the transaction
+                if inst and pkg:
+                    resolve_list.append(pkg)
+                    txmbrs = self.yumbase.remove(po=pkg)
+                    if txmbrs:
+                        rc,msgs =  self.yumbase.buildTransaction()
+                        if rc !=2:
+                            self.error(ERROR_DEP_RESOLUTION_FAILED,self._format_msgs(msgs))
+                        else:
+                            for txmbr in self.yumbase.tsInfo:
+                                if pkg not in deps_list:
+                                    deps_list.append(txmbr.po)
             percentage += bump
 
         # remove any of the original names
commit 027544e109eb1eab459fbd15f630efea257556f5
Author: Richard Hughes <richard at hughsie.com>
Date:   Sun Sep 14 09:30:51 2008 +0100

    trivial: when using pk_extra_set_locale(extra,NULL) use the session default as it sucks to do this in every app

diff --git a/libpackagekit/pk-extra.c b/libpackagekit/pk-extra.c
index f4d1b36..321f0bc 100644
--- a/libpackagekit/pk-extra.c
+++ b/libpackagekit/pk-extra.c
@@ -36,6 +36,7 @@
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif /* HAVE_UNISTD_H */
+#include <locale.h>
 
 #include <glib/gi18n.h>
 #include <sqlite3.h>
@@ -267,7 +268,7 @@ pk_extra_populate_package_cache (PkExtra *extra)
 /**
  * pk_extra_set_locale:
  * @extra: a valid #PkExtra instance
- * @locale: a correct locale
+ * @locale: a correct locale, or NULL if the session default should be used
  *
  * Return value: %TRUE if set correctly
  **/
@@ -276,16 +277,34 @@ pk_extra_set_locale (PkExtra *extra, const gchar *locale)
 {
 	guint i;
 	guint len;
+	gchar *locale_default; /* does not need to be freed */
 
 	g_return_val_if_fail (PK_IS_EXTRA (extra), FALSE);
-	g_return_val_if_fail (locale != NULL, FALSE);
 
+	/* old locale no longer valid */
 	g_free (extra->priv->locale);
-	extra->priv->locale = g_strdup (locale);
-	extra->priv->locale_base = g_strdup (locale);
+	g_free (extra->priv->locale_base);
+	extra->priv->locale = NULL;
+	extra->priv->locale_base = NULL;
+
+	/* using hardcoded locale */
+	if (locale != NULL) {
+		extra->priv->locale = g_strdup (locale);
+	} else {
+		/* using default */
+		locale_default = setlocale (LC_ALL, NULL);
+		if (locale_default == NULL) {
+			egg_warning ("cannot find default locale");
+			return FALSE;
+		}
+		extra->priv->locale = g_strdup (locale_default);
+	}
+
+	/* copy as we modify */
+	extra->priv->locale_base = g_strdup (extra->priv->locale);
 
 	/* we only want the first section to compare */
-	len = egg_strlen (locale, 10);
+	len = egg_strlen (extra->priv->locale, 10);
 	for (i=0; i<len; i++) {
 		if (extra->priv->locale_base[i] == '_') {
 			extra->priv->locale_base[i] = '\0';
commit 6620767d171725528e3988c053f66c4f1e34706d
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 09:27:33 2008 +0200

    yum: make remove-packages handle meta packages (comps groups) and add detection of non existing groups

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index d94c1e5..49f66d8 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -891,9 +891,12 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         for package in package_ids:
             meta = self._is_meta_package(package)
             if meta:
-                txmbr = self.yumbase.selectGroup(meta)
-                if not txmbr:
+                grp = self.yumbase.comps.return_group(meta)
+                if not grp:
+                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The Group %s dont exist" % meta)
+                if grp.installed:
                     self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"This Group %s is already installed" % meta)
+                txmbr = self.yumbase.selectGroup(meta)
                 for t in txmbr:
                     repo = self.yumbase.repos.getRepo(t.po.repoid)
                     if not already_warned and not repo.gpgcheck:
@@ -1212,12 +1215,22 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
         txmbrs = []
         for package in package_ids:
-            pkg,inst = self._findPackage(package)
-            if pkg and inst:
-                txmbr = self.yumbase.remove(po=pkg)
+            meta = self._is_meta_package(package)
+            if meta:
+                grp = self.yumbase.comps.return_group(meta)
+                if not grp:
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The Group %s dont exist" % meta)
+                if not grp.installed:
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"This Group %s is not installed" % meta)
+                txmbr = self.yumbase.groupRemove(meta)
                 txmbrs.extend(txmbr)
-            if pkg and not inst:
-                self.error(ERROR_PACKAGE_NOT_INSTALLED,"The package %s is not installed" % pkg.name)
+            else:
+                pkg,inst = self._findPackage(package)
+                if pkg and inst:
+                    txmbr = self.yumbase.remove(po=pkg)
+                    txmbrs.extend(txmbr)
+                if pkg and not inst:
+                    self.error(ERROR_PACKAGE_NOT_INSTALLED,"The package %s is not installed" % pkg.name)
         if txmbrs:
             if allowdep != 'yes':
                 self._runYumTransaction(removedeps=False)
commit f94c0a83b587728488a4fffe8f07df609eaf72cf
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 09:04:25 2008 +0200

    yum: remove-packages should not fail on meta package, just report remove failed for now

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 4835c77..d94c1e5 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -490,7 +490,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         find a package based on a package id (name;version;arch;repoid)
         '''
         # Bailout if meta packages, just to be sure
-        if _is_meta_package(id):
+        if self._is_meta_package(id):
             return None,False
             
         # is this an real id or just an name
@@ -1216,7 +1216,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
             if pkg and inst:
                 txmbr = self.yumbase.remove(po=pkg)
                 txmbrs.extend(txmbr)
-            if not inst:
+            if pkg and not inst:
                 self.error(ERROR_PACKAGE_NOT_INSTALLED,"The package %s is not installed" % pkg.name)
         if txmbrs:
             if allowdep != 'yes':
commit c99040f107158c79af18c05630edaa8b2facf0d9
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 08:57:26 2008 +0200

    yum: minor cleanup

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index 2922f14..4835c77 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -489,6 +489,10 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         '''
         find a package based on a package id (name;version;arch;repoid)
         '''
+        # Bailout if meta packages, just to be sure
+        if _is_meta_package(id):
+            return None,False
+            
         # is this an real id or just an name
         if len(id.split(';')) > 1:
             # Split up the id
commit eb72ab5c41e37d0e3ea2f6cd922266bd76c5f31e
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 08:53:39 2008 +0200

    yum: add some percentage to collections

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index f6fca56..2922f14 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -256,9 +256,19 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         Handle the special collection group
         """
         # Fixme: Add some real code.
-        colections = self.comps.get_meta_packages()
+        collections = self.comps.get_meta_packages()
+        self.percentage(20)
+
         show_avail = FILTER_INSTALLED not in fltlist
-        for col in colections:
+        step = int(800/len(collections))
+        print step
+        pct=20
+        i = 0
+        for col in collections:
+            i += 1
+            if i % 10 == 0:
+                pct += step
+                self.percentage(pct)
             id = "%s;meta;meta;meta" % col
             grp = self.yumbase.comps.return_group(col)
             if grp:
@@ -267,6 +277,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
                 else:
                     if show_avail:
                         self.package(id,INFO_AVAILABLE,grp.description)
+        self.percentage(100)
 
 
 
commit fdec2a8c74f33dbfa3595edd8d814ed80714cdf5
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 08:43:23 2008 +0200

    yum: strip trailing spaces

diff --git a/backends/yum/yumComps.py b/backends/yum/yumComps.py
index 2565fe4..7b00ae2 100755
--- a/backends/yum/yumComps.py
+++ b/backends/yum/yumComps.py
@@ -270,15 +270,15 @@ class yumComps:
             group = row[0]
 
         return group
-        
+
     def get_meta_packages(self):
         metapkgs = set()
         self.cursor.execute('SELECT groupid FROM groups')
         for row in self.cursor:
             metapkgs.add(row[0])
-        return list(metapkgs)    
+        return list(metapkgs)
+
 
-                
 
     def get_meta_package_list(self,groupid):
         ''' for a comps group, get the packagelist for this group (mandatory,default)'''
commit 696ba3acf5c8a27ad590e2d55baa5cb56347021e
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sun Sep 14 08:42:16 2008 +0200

    yum: more metapackage functionality

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index db3762f..f6fca56 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -247,10 +247,29 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
             pkgs = self.yumbase.rpmdb.searchNevra(name=package)
             found.extend(pkgs)
         return found
-        
+
     def _get_available_from_names(self,name_list):
         return self.yumbase.pkgSack.searchNames(names=name_list)
 
+    def _handle_collections(self,fltlist):
+        """
+        Handle the special collection group
+        """
+        # Fixme: Add some real code.
+        colections = self.comps.get_meta_packages()
+        show_avail = FILTER_INSTALLED not in fltlist
+        for col in colections:
+            id = "%s;meta;meta;meta" % col
+            grp = self.yumbase.comps.return_group(col)
+            if grp:
+                if grp.installed:
+                    self.package(id,INFO_INSTALLED,grp.description)
+                else:
+                    if show_avail:
+                        self.package(id,INFO_AVAILABLE,grp.description)
+
+
+
     @handle_repo_error
     def search_group(self,filters,group_key):
         '''
@@ -265,6 +284,12 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
         fltlist = filters.split(';')
         pkgfilter = YumFilter(fltlist)
 
+        # Handle collections
+        # FIXME: add the right enum here
+        if group_key == GROUP_META_PACKAGES:
+            self._handle_collections(fltlist)
+            return
+
         # get the packagelist for this group
         all_packages = self.comps.get_package_list(group_key)
 
@@ -448,7 +473,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
             if idver == 'meta' and a == 'meta' and d == 'meta':
                 meta = n
         return meta
-               
+
     def _findPackage(self,id):
         '''
         find a package based on a package id (name;version;arch;repoid)
@@ -834,7 +859,7 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
                                 show = False
                         if show:
                             self._show_package(pkg,INFO_AVAILABLE)
-        
+
     @handle_repo_error
     def install_packages(self,package_ids):
         '''
@@ -859,9 +884,9 @@ class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
                     if not already_warned and not repo.gpgcheck:
                         self.message(MESSAGE_UNTRUSTED_PACKAGE,"The untrusted package %s will be installed from %s." % (t.po.name, repo))
                         already_warned = True
-                    
-                txmbrs.extend(txmbr)   
-            else:           
+
+                txmbrs.extend(txmbr)
+            else:
                 pkg,inst = self._findPackage(package)
                 if pkg and not inst:
                     repo = self.yumbase.repos.getRepo(pkg.repoid)
diff --git a/backends/yum/yumComps.py b/backends/yum/yumComps.py
index 2ea2871..2565fe4 100755
--- a/backends/yum/yumComps.py
+++ b/backends/yum/yumComps.py
@@ -270,6 +270,15 @@ class yumComps:
             group = row[0]
 
         return group
+        
+    def get_meta_packages(self):
+        metapkgs = set()
+        self.cursor.execute('SELECT groupid FROM groups')
+        for row in self.cursor:
+            metapkgs.add(row[0])
+        return list(metapkgs)    
+
+                
 
     def get_meta_package_list(self,groupid):
         ''' for a comps group, get the packagelist for this group (mandatory,default)'''
commit 3861ddfda05c97b8427bd4475a892051f1335b19
Author: Tim Lauridsen <timlau at fedoraproject.org>
Date:   Sat Sep 13 15:52:48 2008 +0200

    yum: add some code to support metapackage( comps/ yum group) installation

diff --git a/backends/yum/yumBackend.py b/backends/yum/yumBackend.py
index de91359..db3762f 100755
--- a/backends/yum/yumBackend.py
+++ b/backends/yum/yumBackend.py
@@ -29,7 +29,7 @@ import re
 
 from packagekit.backend import *
 from packagekit.progress import *
-from packagekit.package import *
+from packagekit.package import PackagekitPackage
 import yum
 from urlgrabber.progress import BaseMeter,format_time,format_number
 from yum.rpmtrans import RPMBaseCallback
@@ -45,6 +45,7 @@ import types
 import signal
 import time
 import os.path
+import logging
 
 import tarfile
 import tempfile
@@ -57,7 +58,6 @@ from yumComps import *
 # Global vars
 yumbase = None
 progress = PackagekitProgress()  # Progress object to store the progress
-pkpackage = PackagekitPackage()
 
 MetaDataMap = {
     'repomd'        : STATUS_DOWNLOAD_REPOSITORY,
@@ -79,7 +79,7 @@ def sigquit(signum,frame):
         yumbase.doUnlock(YUM_PID_FILE)
     sys.exit(1)
 
-class PackageKitYumBackend(PackageKitBaseBackend):
+class PackageKitYumBackend(PackageKitBaseBackend,PackagekitPackage):
 
     # Packages there require a reboot
     rebootpkgs = ("kernel","kernel-smp","kernel-xen-hypervisor","kernel-PAE",
@@ -241,6 +241,16 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.status(STATUS_QUERY)
         self._do_search(searchlist,filters,key)
 
+    def _get_installed_from_names(self,name_list):
+        found = []
+        for package in name_list:
+            pkgs = self.yumbase.rpmdb.searchNevra(name=package)
+            found.extend(pkgs)
+        return found
+        
+    def _get_available_from_names(self,name_list):
+        return self.yumbase.pkgSack.searchNames(names=name_list)
+
     @handle_repo_error
     def search_group(self,filters,group_key):
         '''
@@ -260,15 +270,12 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
         # get installed packages
         self.percentage(10)
-        for package in all_packages:
-            pkgs = self.yumbase.rpmdb.searchNevra(name=package)
-            pkgfilter.add_installed(pkgs)
+        pkgfilter.add_installed(self._get_installed_from_names(all_packages))
 
         # get available packages
         self.percentage(20)
         if FILTER_INSTALLED not in fltlist:
-            pkgs = self.yumbase.pkgSack.searchNames(names=all_packages)
-            pkgfilter.add_available(pkgs)
+            pkgfilter.add_available(self._get_available_from_names(all_packages))
 
         # we couldn't do this when generating the list
         package_list = pkgfilter.post_process()
@@ -433,6 +440,15 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         (version,release) = tuple(idver.split('-'))
         return epoch,version,release
 
+    def _is_meta_package(self,id):
+        meta = None
+        if len(id.split(';')) > 1:
+            # Split up the id
+            (n,idver,a,d) = self.get_package_from_id(id)
+            if idver == 'meta' and a == 'meta' and d == 'meta':
+                meta = n
+        return meta
+               
     def _findPackage(self,id):
         '''
         find a package based on a package id (name;version;arch;repoid)
@@ -440,7 +456,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         # is this an real id or just an name
         if len(id.split(';')) > 1:
             # Split up the id
-            (n,idver,a,d) = pkpackage.get_package_from_id(id)
+            (n,idver,a,d) = self.get_package_from_id(id)
             # get e,v,r from package id version
             e,v,r = self._getEVR(idver)
         else:
@@ -818,7 +834,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
                                 show = False
                         if show:
                             self._show_package(pkg,INFO_AVAILABLE)
-
+        
     @handle_repo_error
     def install_packages(self,package_ids):
         '''
@@ -833,16 +849,29 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         txmbrs = []
         already_warned = False
         for package in package_ids:
-            pkg,inst = self._findPackage(package)
-            if pkg and not inst:
-                repo = self.yumbase.repos.getRepo(pkg.repoid)
-                if not already_warned and not repo.gpgcheck:
-                    self.message(MESSAGE_UNTRUSTED_PACKAGE,"The untrusted package %s will be installed from %s." % (pkg.name, repo))
-                    already_warned = True
-                txmbr = self.yumbase.install(po=pkg)
-                txmbrs.extend(txmbr)
-            if inst:
-                self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The package %s is already installed" % pkg.name)
+            meta = self._is_meta_package(package)
+            if meta:
+                txmbr = self.yumbase.selectGroup(meta)
+                if not txmbr:
+                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"This Group %s is already installed" % meta)
+                for t in txmbr:
+                    repo = self.yumbase.repos.getRepo(t.po.repoid)
+                    if not already_warned and not repo.gpgcheck:
+                        self.message(MESSAGE_UNTRUSTED_PACKAGE,"The untrusted package %s will be installed from %s." % (t.po.name, repo))
+                        already_warned = True
+                    
+                txmbrs.extend(txmbr)   
+            else:           
+                pkg,inst = self._findPackage(package)
+                if pkg and not inst:
+                    repo = self.yumbase.repos.getRepo(pkg.repoid)
+                    if not already_warned and not repo.gpgcheck:
+                        self.message(MESSAGE_UNTRUSTED_PACKAGE,"The untrusted package %s will be installed from %s." % (pkg.name, repo))
+                        already_warned = True
+                    txmbr = self.yumbase.install(po=pkg)
+                    txmbrs.extend(txmbr)
+                if inst:
+                    self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"The package %s is already installed" % pkg.name)
         if txmbrs:
             self._runYumTransaction()
         else:
@@ -1177,7 +1206,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
     def _show_details_pkg(self,pkg):
 
         pkgver = self._get_package_ver(pkg)
-        id = pkpackage.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repo)
+        id = self.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repo)
         desc = pkg.description
         desc = desc.replace('\n\n',';')
         desc = desc.replace('\n',' ')
@@ -1205,7 +1234,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
 
     def _pkg_to_id(self,pkg):
         pkgver = self._get_package_ver(pkg)
-        id = pkpackage.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repo)
+        id = self.get_package_id(pkg.name,pkgver,pkg.arch,pkg.repo)
         return id
 
     def _show_package(self,pkg,status):
@@ -1545,7 +1574,7 @@ class PackageKitYumBackend(PackageKitBaseBackend):
         self.yumbase.repos.setCache(old_cache_setting)
 
     def _setup_yum(self):
-        self.yumbase.doConfigSetup(errorlevel=0,debuglevel=0)     # Setup Yum Config
+        self.yumbase._getConfig(errorlevel=-1,debuglevel=-1)     # Setup Yum Config
         self.yumbase.conf.throttle = "90%"                        # Set bandwidth throttle to 40%
         self.dnlCallback = DownloadCallback(self,showNames=True)  # Download callback
         self.yumbase.repos.setProgressBar(self.dnlCallback)       # Setup the download callback class
@@ -1690,10 +1719,10 @@ class PackageKitCallback(RPMBaseCallback):
 
     def _showName(self,status):
         if type(self.curpkg) in types.StringTypes:
-            id = pkpackage.get_package_id(self.curpkg,'','','')
+            id = self.get_package_id(self.curpkg,'','','')
         else:
             pkgver = self.base._get_package_ver(self.curpkg)
-            id = pkpackage.get_package_id(self.curpkg.name,pkgver,self.curpkg.arch,self.curpkg.repo)
+            id = self.get_package_id(self.curpkg.name,pkgver,self.curpkg.arch,self.curpkg.repo)
         self.base.package(id,status,"")
 
     def event(self,package,action,te_current,te_total,ts_current,ts_total):
diff --git a/backends/yum/yumComps.py b/backends/yum/yumComps.py
old mode 100644
new mode 100755
index 4d0b34a..2ea2871
--- a/backends/yum/yumComps.py
+++ b/backends/yum/yumComps.py
@@ -185,33 +185,35 @@ groupMap = {
 
 class yumComps:
 
-    def __init__(self,yumbase):
+    def __init__(self,yumbase,db = None):
         self.yumbase = yumbase
         self.cursor = None
         self.connection = None
+        if not db:
+            db = '/var/cache/yum/packagekit-groups-V2.sqlite'
+        self.db = db
 
     def connect(self):
         ''' connect to database '''
-        database = '/var/cache/yum/packagekit-groups.sqlite'
         try:
             # will be created if it does not exist
-            self.connection = sqlite.connect(database)
+            self.connection = sqlite.connect(self.db)
             self.cursor = self.connection.cursor()
         except Exception, e:
-            print 'cannot connect to database %s: %s' % (database,str(e))
+            print 'cannot connect to database %s: %s' % (self.db,str(e))
             return False
 
         # test if we can get a group for a common package, create if fail
         try:
             self.cursor.execute('SELECT group_enum FROM groups WHERE name = ?;',['hal'])
         except Exception, e:
-            self.cursor.execute('CREATE TABLE groups (name TEXT,category TEXT,group_enum TEXT);')
+            self.cursor.execute('CREATE TABLE groups (name TEXT,category TEXT,groupid TEXT,group_enum TEXT,pkgtype Text);')
             self.refresh()
 
         return True
 
-    def _add_db(self,name,category,group):
-        self.cursor.execute('INSERT INTO groups values(?,?,?);',(name,category,group))
+    def _add_db(self,name,category,groupid,pkgroup,pkgtype):
+        self.cursor.execute('INSERT INTO groups values(?,?,?,?,?);',(name,category,groupid,pkgroup,pkgtype))
 
     def refresh(self,force=False):
         ''' get the data from yum (slow, REALLY SLOW) '''
@@ -220,8 +222,8 @@ class yumComps:
         if self.yumbase.comps.compscount == 0:
             return False
 
-	# delete old data else we get multiple entries
-	self.cursor.execute('DELETE FROM groups;')
+        # delete old data else we get multiple entries
+        self.cursor.execute('DELETE FROM groups;')
 
         # store to sqlite
         for category in cats:
@@ -242,11 +244,11 @@ class yumComps:
                     print 'unknown group enum',group_id
 
                 for package in group.mandatory_packages:
-                    self._add_db(package,group_id,group_enum)
+                    self._add_db(package,category.categoryid,group_name,group_enum,'mandatory')
                 for package in group.default_packages:
-                    self._add_db(package,group_id,group_enum)
+                    self._add_db(package,category.categoryid,group_name,group_enum,'default')
                 for package in group.optional_packages:
-                    self._add_db(package,group_id,group_enum)
+                    self._add_db(package,category.categoryid,group_name,group_enum,'optional')
 
         # write to disk
         self.connection.commit()
@@ -269,3 +271,32 @@ class yumComps:
 
         return group
 
+    def get_meta_package_list(self,groupid):
+        ''' for a comps group, get the packagelist for this group (mandatory,default)'''
+        all_packages = [];
+        self.cursor.execute('SELECT name FROM groups WHERE groupid = ? AND ( pkgtype = "mandatory" OR pkgtype = "default");',[groupid])
+        for row in self.cursor:
+            all_packages.append(row[0])
+        return all_packages
+
+if __name__ == "__main__":
+    import yum
+    import os
+    yb = yum.YumBase()
+    db = "packagekit-groupsV2.sqlite"
+    comps = yumComps(yb,db)
+    comps.connect()
+    comps.refresh()
+    print "pk group system"
+    print 40 * "="
+    pkgs = comps.get_package_list('system')
+    print pkgs
+    print "comps group games"
+    print 40 * "="
+    pkgs = comps.get_meta_package_list('games')
+    print pkgs
+    print "comps group kde-desktop"
+    print 40 * "="
+    pkgs = comps.get_meta_package_list('kde-desktop')
+    print pkgs
+    os.unlink(db) # kill the db
commit 31e5628c69661df9292d1de1923f16299041d3b2
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Sat Sep 13 10:22:26 2008 -0400

    urpmi: added install-packages in dispatched backend

diff --git a/backends/urpmi/helpers/install-packages.pl b/backends/urpmi/helpers/install-packages.pl
index 2e55c3e..fe80b1f 100755
--- a/backends/urpmi/helpers/install-packages.pl
+++ b/backends/urpmi/helpers/install-packages.pl
@@ -47,4 +47,7 @@ urpm::select::search_packages($urpm, \%requested, \@names,
   caseinsensitive => 0,
   all => 0);
 
-perform_installation($urpm, \%requested);
+eval {
+  perform_installation($urpm, \%requested);
+};
+pk_print_status(PK_STATUS_ENUM_FINISHED);
diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index fc068af..65442d7 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -21,7 +21,7 @@
 # get-requires                  DONE
 # get-update-detail             DONE
 # get-updates                   DONE
-# install-packages
+# install-packages		DONE
 # refresh-cache
 # remove-packages
 # resolve
@@ -282,7 +282,27 @@ sub get_updates {
 }
 
 sub install_packages {
-  # TODO
+
+  my ($urpm, $packageids) = @_;
+
+  my @packageidstab = split(/\|/, $packageids);
+  
+  my @names;
+  foreach(@packageidstab) {
+    my @pkg_id = (split(/;/, $_));
+    push @names, $pkg_id[0];
+  }
+  
+  my %requested;
+  
+  urpm::select::search_packages($urpm, \%requested, \@names, 
+    fuzzy => 0, 
+    caseinsensitive => 0,
+    all => 0);
+  eval {
+    perform_installation($urpm, \%requested);
+  };
+  _finished();
 }
 
 sub search_name {
diff --git a/backends/urpmi/helpers/urpmi_backend/actions.pm b/backends/urpmi/helpers/urpmi_backend/actions.pm
index 005bdcd..2400e47 100644
--- a/backends/urpmi/helpers/urpmi_backend/actions.pm
+++ b/backends/urpmi/helpers/urpmi_backend/actions.pm
@@ -90,7 +90,7 @@ sub perform_installation {
       # Fix me
       # Display message to prevent that the installation cannot continue because some
       # packages has to be removed for others to be upgraded.
-      exit 0;
+      die;
     }
     # Else, it's ok.
     # Here we can display $list, which describe packages which has to be removed for
@@ -157,10 +157,9 @@ sub perform_installation {
       },
       bad_signature => sub {
         pk_print_error(PK_ERROR_ENUM_GPG_FAILURE, "Bad or missing GPG signatures");
-        pk_print_status(PK_STATUS_ENUM_FINISHED);
         undef $lock;
         undef $rpm_lock;
-        exit 1;
+        die;
       },
       ask_yes_or_no => sub {
         # Return 1 = Return Yes
@@ -173,7 +172,6 @@ sub perform_installation {
       completed => sub {
         undef $lock;
         undef $rpm_lock;
-        pk_print_status(PK_STATUS_ENUM_FINISHED);
       },
       post_download => sub {
         # Fix me !
commit 002fd6277d3e7cdeb85b818cf720cab324b0d142
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat Sep 13 13:27:04 2008 +0100

    dummy: make what-provides take some time, and also special case some codec names for a demo

diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index 5b04140..1b00355 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -30,6 +30,7 @@
 static guint _progress_percentage = 0;
 static gulong _signal_timeout = 0;
 static gchar **_package_ids;
+static const gchar *_search;
 static guint _package_current = 0;
 static gboolean _has_service_pack = FALSE;
 static gboolean _repo_enabled_local = FALSE;
@@ -807,19 +808,49 @@ backend_service_pack (PkBackend *backend, const gchar *location, gboolean enable
 }
 
 /**
+ * backend_what_provides_timeout:
+ */
+static gboolean
+backend_what_provides_timeout (gpointer data)
+{
+	PkBackend *backend = (PkBackend *) data;
+	if (_progress_percentage == 100) {
+		if (egg_strequal (_search, "gstreamer0.10(decoder-audio/x-wma)(wmaversion=3)")) {
+			pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
+					    "gstreamer-plugins-bad;0.10.3-5.lvn;i386;available",
+					    "GStreamer streaming media framework \"bad\" plug-ins");
+		} else if (egg_strequal (_search, "gstreamer0.10(decoder-video/x-wma)(wmaversion=3)")) {
+			pk_backend_package (backend, PK_INFO_ENUM_AVAILABLE,
+					    "gstreamer-plugins-flumpegdemux;0.10.15-5.lvn;i386;available",
+					    "MPEG demuxer for GStreamer");
+		} 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_AVAILABLE,
+					    "scribus;1.3.4-1.fc8;i386;fedora",
+					    "Scribus is an desktop open source page layout program");
+		}
+		pk_backend_finished (backend);
+		return FALSE;
+	}
+	_progress_percentage += 10;
+	pk_backend_set_percentage (backend, _progress_percentage);
+	return TRUE;
+}
+
+/**
  * backend_what_provides:
  */
 static void
 backend_what_provides (PkBackend *backend, PkBitfield filters, PkProvidesEnum provides, const gchar *search)
 {
+	_progress_percentage = 0;
+	_search = search;
+	_signal_timeout = g_timeout_add (200, backend_what_provides_timeout, backend);
 	pk_backend_set_status (backend, PK_STATUS_ENUM_REQUEST);
-	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_AVAILABLE,
-			    "scribus;1.3.4-1.fc8;i386;fedora",
-			    "Scribus is an desktop open source page layout program");
-	pk_backend_finished (backend);
+	pk_backend_set_allow_cancel (backend, TRUE);
+	pk_backend_set_percentage (backend, _progress_percentage);
 }
 
 /**
commit f1a69a4fb691174004b9ec01931de345e4701a4e
Merge: 99d3daa... d30ad44...
Author: Richard Hughes <richard at hughsie.com>
Date:   Sat Sep 13 13:03:27 2008 +0100

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

commit d30ad4489f6b2db8d430b4938715d3e520e91ed9
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 11:59:40 2008 +0200

    trivial: refactor name for translating

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index f5d7626..2fc7a35 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -772,15 +772,18 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         from smart.backends.deb.base import DebPackage
         from smart.backends.slack.base import SlackPackage
         if isinstance(package, RPMPackage):
+            name = package.name
             version, arch = package.version.split('@')
         elif isinstance(package, DebPackage):
+            name = package.name
             version, arch = package.version, smart.backends.deb.base.DEBARCH
         elif isinstance(package, SlackPackage):
+            name = package.name
             ver, arch, rel = package.version.rsplit('-')
             version = "%s-%s" % (ver, rel)
         else:
             version, arch = package.version, self._machine()
-        return package.name, version, arch
+        return name, version, arch
 
     def _joinpackage(self, name, version, arch):
         if not self.systemchannel:
commit 54702536e48a5c4aa2c8da65d7e06290b6bc2b56
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:48:47 2008 +0200

    trivial: add parent metapkg group

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index b7950d2..f5d7626 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -499,6 +499,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'System/GUI/Other'                        : GROUP_DESKTOP_OTHER,
     'System/GUI/XFCE'                         : GROUP_DESKTOP_XFCE,
     # YaST2
+#   'Virtual'                                 : GROUP_META_PACKAGES,
     'Virtual/Base Technologies'               : GROUP_META_PACKAGES,
     'Virtual/Desktop Functions'               : GROUP_META_PACKAGES,
 #   'Virtual/Development'                     : GROUP_META_PACKAGES,
commit c52faff48e9851ed2f2a8aa5e983aacf1ca4b38a
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:34:52 2008 +0200

    trival: add FIXME for the groups lumped into OTHER

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 571201f..b7950d2 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -440,16 +440,16 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     # RPM (redhat)
     'Amusements/Games'                        : GROUP_GAMES,
     'Amusements/Graphics'                     : GROUP_GRAPHICS,
-    'Applications/Archiving'                  : GROUP_OTHER,
+    'Applications/Archiving'                  : GROUP_OTHER, ### FIXME
     'Applications/Communications'             : GROUP_COMMUNICATION,
-    'Applications/Databases'                  : GROUP_OTHER,
+    'Applications/Databases'                  : GROUP_OTHER, ### FIXME
     'Applications/Editors'                    : GROUP_PUBLISHING,
-    'Applications/Emulators'                  : GROUP_OTHER,
-    'Applications/Engineering'                : GROUP_OTHER,
-    'Applications/File'                       : GROUP_OTHER,
+    'Applications/Emulators'                  : GROUP_OTHER, ### FIXME
+    'Applications/Engineering'                : GROUP_OTHER, ### FIXME
+    'Applications/File'                       : GROUP_OTHER, ### FIXME
     'Applications/Internet'                   : GROUP_INTERNET,
     'Applications/Multimedia'                 : GROUP_MULTIMEDIA,
-    'Applications/Productivity'               : GROUP_OTHER,
+    'Applications/Productivity'               : GROUP_OTHER, ### FIXME
     'Applications/Publishing'                 : GROUP_PUBLISHING,
     'Applications/System'                     : GROUP_SYSTEM,
     'Applications/Text'                       : GROUP_PUBLISHING,
@@ -476,10 +476,10 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'Virtual/Languages'                       : GROUP_META_PACKAGES,
     'Virtual/Servers'                         : GROUP_META_PACKAGES,
     # RPM (novell)
-    'Productivity/Archiving'                  : GROUP_OTHER,
-    'Productivity/Databases'                  : GROUP_OTHER,
+    'Productivity/Archiving'                  : GROUP_OTHER, ### FIXME
+    'Productivity/Databases'                  : GROUP_OTHER, ### FIXME
     'Productivity/Editors'                    : GROUP_PUBLISHING,
-    'Productivity/File utilities'             : GROUP_OTHER,
+    'Productivity/File utilities'             : GROUP_OTHER, ### FIXME
     'Productivity/Graphics'                   : GROUP_GRAPHICS,
     'Productivity/Multimedia'                 : GROUP_MULTIMEDIA,
     'Productivity/Networking'                 : GROUP_NETWORK,
commit 4379a648b67bb62401eeac64cc786087ba2a5aca
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:31:32 2008 +0200

    trivial: unknown -> other

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 14481cd..571201f 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -476,15 +476,15 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'Virtual/Languages'                       : GROUP_META_PACKAGES,
     'Virtual/Servers'                         : GROUP_META_PACKAGES,
     # RPM (novell)
-    'Productivity/Archiving'                  : GROUP_UNKNOWN,
-    'Productivity/Databases'                  : GROUP_UNKNOWN,
+    'Productivity/Archiving'                  : GROUP_OTHER,
+    'Productivity/Databases'                  : GROUP_OTHER,
     'Productivity/Editors'                    : GROUP_PUBLISHING,
-    'Productivity/File utilities'             : GROUP_UNKNOWN,
+    'Productivity/File utilities'             : GROUP_OTHER,
     'Productivity/Graphics'                   : GROUP_GRAPHICS,
     'Productivity/Multimedia'                 : GROUP_MULTIMEDIA,
     'Productivity/Networking'                 : GROUP_NETWORK,
     'Productivity/Office'                     : GROUP_OFFICE,
-    'Productivity/Other'                      : GROUP_UNKNOWN,
+    'Productivity/Other'                      : GROUP_OTHER,
     'Productivity/Publishing'                 : GROUP_PUBLISHING,
     'Productivity/Scientific'                 : GROUP_SCIENCE,
     'Productivity/Security'                   : GROUP_SECURITY,
commit 5528d1a2fa457a5cb74c7acd0c8fff703e799f08
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:25:45 2008 +0200

    trivial: add comments

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 1eb0e04..14481cd 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -437,7 +437,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         self.ctrl.saveSysConf()
 
     GROUPS = {
-    # RPM
+    # RPM (redhat)
     'Amusements/Games'                        : GROUP_GAMES,
     'Amusements/Graphics'                     : GROUP_GRAPHICS,
     'Applications/Archiving'                  : GROUP_OTHER,
@@ -475,7 +475,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'Virtual/Development'                     : GROUP_META_PACKAGES,
     'Virtual/Languages'                       : GROUP_META_PACKAGES,
     'Virtual/Servers'                         : GROUP_META_PACKAGES,
-    # RPM
+    # RPM (novell)
     'Productivity/Archiving'                  : GROUP_UNKNOWN,
     'Productivity/Databases'                  : GROUP_UNKNOWN,
     'Productivity/Editors'                    : GROUP_PUBLISHING,
commit c488b9483ddd62a5a368bafb19398899958d4ed3
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:22:38 2008 +0200

    smart: add desktop-xfce group

diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index cd0f910..36e6e8f 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -69,6 +69,7 @@ backend_get_groups (PkBackend *backend)
 		PK_GROUP_ENUM_DESKTOP_GNOME,
 		PK_GROUP_ENUM_DESKTOP_KDE,
 		PK_GROUP_ENUM_DESKTOP_OTHER,
+		PK_GROUP_ENUM_DESKTOP_XFCE,
 		PK_GROUP_ENUM_DOCUMENTATION,
 		PK_GROUP_ENUM_ELECTRONICS,
 		PK_GROUP_ENUM_GAMES,
commit d43bdd5af883aa399855407a6a3ffb69c283680b
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:14:55 2008 +0200

    smart: search for rpm subgroups, if no group matches

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index e8dffef..1eb0e04 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -385,11 +385,9 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         for package in packages:
             if self._package_passes_filters(package, filters):
                 info = package.loaders.keys()[0].getInfo(package)
-                group = info.getGroup()
-                if group in self.GROUPS:
-                    group = self.GROUPS[group]
-                    if searchstring in group:
-                        self._add_package(package)
+                group = self._get_group(info)
+                if searchstring in group:
+                    self._add_package(package)
         self._post_process_package_list(filters)
         self._show_package_list()
 
@@ -598,11 +596,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             else:
                 license = LICENSE_UNKNOWN
 
-            group = info.getGroup()
-            if group in self.GROUPS:
-                group = self.GROUPS[group]
-            else:
-                group = GROUP_UNKNOWN
+            group = self._get_group(info)
 
             self.details(packageid, license, group, description, url,
                     pkgsize)
@@ -860,6 +854,20 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
             self.package(pkpackage.get_package_id(name, version, arch, data),
                 status, summary)
 
+    def _get_group(self, info):
+        group = info.getGroup()
+        if group in self.GROUPS:
+            group = self.GROUPS[group]
+        else:
+            while group.find('/') != -1:
+                group = group.rsplit('/', 1)[0]
+                if group in self.GROUPS:
+                    group = self.GROUPS[group]
+                    break
+            else:
+                group = GROUP_UNKNOWN
+        return group
+
     def _get_status(self, package):
         flags = smart.pkgconf.testAllFlags(package)
         for flag in flags:
commit 37f631fb9cc32e5e82b9144add78188def2b3a37
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 10:00:14 2008 +0200

    smart: add alternative groups from opensuse rpm

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 0cb822d..e8dffef 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -477,6 +477,29 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'Virtual/Development'                     : GROUP_META_PACKAGES,
     'Virtual/Languages'                       : GROUP_META_PACKAGES,
     'Virtual/Servers'                         : GROUP_META_PACKAGES,
+    # RPM
+    'Productivity/Archiving'                  : GROUP_UNKNOWN,
+    'Productivity/Databases'                  : GROUP_UNKNOWN,
+    'Productivity/Editors'                    : GROUP_PUBLISHING,
+    'Productivity/File utilities'             : GROUP_UNKNOWN,
+    'Productivity/Graphics'                   : GROUP_GRAPHICS,
+    'Productivity/Multimedia'                 : GROUP_MULTIMEDIA,
+    'Productivity/Networking'                 : GROUP_NETWORK,
+    'Productivity/Office'                     : GROUP_OFFICE,
+    'Productivity/Other'                      : GROUP_UNKNOWN,
+    'Productivity/Publishing'                 : GROUP_PUBLISHING,
+    'Productivity/Scientific'                 : GROUP_SCIENCE,
+    'Productivity/Security'                   : GROUP_SECURITY,
+    'Productivity/Text'                       : GROUP_PUBLISHING,
+    'System/Base'                             : GROUP_SYSTEM,
+    'System/Boot'                             : GROUP_SYSTEM,
+    'System/Kernel'                           : GROUP_SYSTEM,
+    'System/Libraries'                        : GROUP_SYSTEM,
+    'System/Shells'                           : GROUP_SYSTEM,
+    'System/GUI/GNOME'                        : GROUP_DESKTOP_GNOME,
+    'System/GUI/KDE'                          : GROUP_DESKTOP_KDE,
+    'System/GUI/Other'                        : GROUP_DESKTOP_OTHER,
+    'System/GUI/XFCE'                         : GROUP_DESKTOP_XFCE,
     # YaST2
     'Virtual/Base Technologies'               : GROUP_META_PACKAGES,
     'Virtual/Desktop Functions'               : GROUP_META_PACKAGES,
commit b2f2f028e4ec44ce8432c25d29b12ba531d97643
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Sat Sep 13 09:29:20 2008 +0200

    smart: add yum/yast metapackages group

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index e4bc532..0cb822d 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -469,6 +469,22 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
     'User Interface/Desktops'                 : GROUP_DESKTOP_OTHER,
     'User Interface/X'                        : GROUP_DESKTOP_OTHER,
     'User Interface/X Hardware Support'       : GROUP_DESKTOP_OTHER,
+    # Yum
+    'Virtual'                                 : GROUP_META_PACKAGES,
+    'Virtual/Applications'                    : GROUP_META_PACKAGES,
+    'Virtual/Base System'                     : GROUP_META_PACKAGES,
+    'Virtual/Desktop Environments'            : GROUP_META_PACKAGES,
+    'Virtual/Development'                     : GROUP_META_PACKAGES,
+    'Virtual/Languages'                       : GROUP_META_PACKAGES,
+    'Virtual/Servers'                         : GROUP_META_PACKAGES,
+    # YaST2
+    'Virtual/Base Technologies'               : GROUP_META_PACKAGES,
+    'Virtual/Desktop Functions'               : GROUP_META_PACKAGES,
+#   'Virtual/Development'                     : GROUP_META_PACKAGES,
+    'Virtual/GNOME Desktop'                   : GROUP_META_PACKAGES,
+    'Virtual/Graphical Environments'          : GROUP_META_PACKAGES,
+    'Virtual/KDE Desktop'                     : GROUP_META_PACKAGES,
+    'Virtual/Server Functions'                : GROUP_META_PACKAGES,
     # DEB
     "admin"                                   : GROUP_ADMIN_TOOLS,
     "base"                                    : GROUP_SYSTEM,
diff --git a/backends/smart/pk-backend-smart.c b/backends/smart/pk-backend-smart.c
index 94bf176..cd0f910 100644
--- a/backends/smart/pk-backend-smart.c
+++ b/backends/smart/pk-backend-smart.c
@@ -76,6 +76,7 @@ backend_get_groups (PkBackend *backend)
 		PK_GROUP_ENUM_INTERNET,
 		PK_GROUP_ENUM_LEGACY,
 		PK_GROUP_ENUM_LOCALIZATION,
+		PK_GROUP_ENUM_META_PACKAGES,
 		PK_GROUP_ENUM_MULTIMEDIA,
 		PK_GROUP_ENUM_NETWORK,
 		PK_GROUP_ENUM_OTHER,
commit 522597ae75424e08f67e6ca259ee491c0c162793
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Fri Sep 12 20:31:31 2008 +0200

    avoid KeyError when no extra deps

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 7a1003c..e4bc532 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -635,7 +635,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 if package and not extras.has_key(package):
                     extras[package] = True
 
-            del extras[original]
+            if original in extras:
+                del extras[original]
             for package in extras.keys():
                 if self._package_passes_filters(package, filters):
                     self._add_package(package)
@@ -669,7 +670,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
                 if package and not extras.has_key(package):
                     extras[package] = True
 
-            del extras[original]
+            if original in extras:
+                del extras[original]
             for package in extras.keys():
                 if self._package_passes_filters(package, filters):
                     self._add_package(package)
commit 1f2a53517c745e716fe0f077f93c8be38385c6c5
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Fri Sep 12 20:27:57 2008 +0200

    smart: send more status updates when using dispatcher

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 58b3972..7a1003c 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -283,6 +283,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
     @needs_cache
     def update_system(self):
+        self.status(STATUS_INFO)
         cache = self.ctrl.getCache()
 
         trans = smart.transaction.Transaction(cache,
@@ -305,6 +306,7 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
     @needs_cache
     def get_updates(self, filters):
+        self.status(STATUS_INFO)
         cache = self.ctrl.getCache()
 
         trans = smart.transaction.Transaction(cache,
commit 6e47fab8dafecdbde6098c8d60556e5fd8c127ea
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Fri Sep 12 20:20:29 2008 +0200

    resolve now takes array

diff --git a/backends/smart/helpers/resolve.py b/backends/smart/helpers/resolve.py
index fe2fff0..0d6b392 100755
--- a/backends/smart/helpers/resolve.py
+++ b/backends/smart/helpers/resolve.py
@@ -13,7 +13,9 @@
 import sys
 import smartBackend
 
+filters = sys.argv[1]
+packages = sys.argv[2:]
 backend = smartBackend.PackageKitSmartBackend(sys.argv[2:])
-backend.resolve(sys.argv[1], sys.argv[2])
+backend.resolve(filters, packages)
 
 sys.exit()
diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 5a5a346..58b3972 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -327,13 +327,14 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
         self._show_package_list()
 
     @needs_cache
-    def resolve(self, filters, packagename):
+    def resolve(self, filters, packages):
         self.status(STATUS_QUERY)
         self.allow_cancel(True)
-        ratio, results, suggestions = self.ctrl.search(packagename)
-        for result in results:
-            if self._package_passes_filters(result, filters):
-                self._add_package(result)
+        for packagename in packages:
+            ratio, results, suggestions = self.ctrl.search(packagename)
+            for result in results:
+                if self._package_passes_filters(result, filters):
+                    self._add_package(result)
         self._post_process_package_list(filters)
         self._show_package_list()
 
commit 99d3daa22ce70bf95c9afe5388f032f8e9984b2c
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 16:52:43 2008 +0100

    trivial: fix up whitespace in 701441d2b272ee12cda3f77c7eba0447aed96c1f

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index 2ff44c6..1c4fb4f 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -489,7 +489,7 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
 	gchar **argv;
 	gchar **envp;
 #if PK_BUILD_LOCAL
-  const gchar *directory;
+	const gchar *directory;
 #endif
 
 	g_return_val_if_fail (PK_IS_BACKEND_SPAWN (backend_spawn), FALSE);
@@ -503,9 +503,9 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
 
 #if PK_BUILD_LOCAL
 	/* prefer the local version */
-  directory = backend_spawn->priv->name;
-  if (g_str_has_prefix (directory, "test_"))
-      directory = "test";
+	directory = backend_spawn->priv->name;
+	if (g_str_has_prefix (directory, "test_"))
+		directory = "test";
 
 	filename = g_build_filename ("..", "backends", directory, "helpers", argv[0], NULL);
 	if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE) {
commit 701441d2b272ee12cda3f77c7eba0447aed96c1f
Author: James Westby <jw+debian at jameswestby.net>
Date:   Fri Sep 12 15:21:48 2008 +0100

    bugfix: complete handling of local backend directory for test
    
    In b6eeefd7a4730852436f24cc62370aadf811496c the local backend location for
    tests was corrected to use "test", however the same needs to be done for
    the helpers used in pk-backend-spawn.c

diff --git a/src/pk-backend-spawn.c b/src/pk-backend-spawn.c
index c59c646..2ff44c6 100644
--- a/src/pk-backend-spawn.c
+++ b/src/pk-backend-spawn.c
@@ -488,6 +488,9 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
 	gchar *filename;
 	gchar **argv;
 	gchar **envp;
+#if PK_BUILD_LOCAL
+  const gchar *directory;
+#endif
 
 	g_return_val_if_fail (PK_IS_BACKEND_SPAWN (backend_spawn), FALSE);
 
@@ -500,11 +503,15 @@ pk_backend_spawn_helper_va_list (PkBackendSpawn *backend_spawn, const gchar *exe
 
 #if PK_BUILD_LOCAL
 	/* prefer the local version */
-	filename = g_build_filename ("..", "backends", backend_spawn->priv->name, "helpers", argv[0], NULL);
+  directory = backend_spawn->priv->name;
+  if (g_str_has_prefix (directory, "test_"))
+      directory = "test";
+
+	filename = g_build_filename ("..", "backends", directory, "helpers", argv[0], NULL);
 	if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE) {
 		egg_debug ("local helper not found '%s'", filename);
 		g_free (filename);
-		filename = g_build_filename ("..", "backends", backend_spawn->priv->name, argv[0], NULL);
+		filename = g_build_filename ("..", "backends", directory, argv[0], NULL);
 	}
 	if (g_file_test (filename, G_FILE_TEST_EXISTS) == FALSE) {
 		egg_debug ("local helper not found '%s'", filename);
commit 8c5504bffac2ef1ff2f240695dfefacded7e48e5
Author: James Westby <jw+debian at jameswestby.net>
Date:   Fri Sep 12 14:59:31 2008 +0100

    Don't assume /bin/sh supports echo -e
    
    backends/test/helpers/search-name.sh is uses echo -e to return tab-separated
    values to the caller, but declares itself #!/bin/sh. If /bin/sh is dash
    then the caller receives "-e package\t...", which is invalid.

diff --git a/backends/test/helpers/search-name.sh b/backends/test/helpers/search-name.sh
index 58ace84..271751d 100755
--- a/backends/test/helpers/search-name.sh
+++ b/backends/test/helpers/search-name.sh
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 #
 # Copyright (C) 2007 Richard Hughes <richard at hughsie.com>
 #
commit 163547429ebdd202708567de633c5fcbdf9cf085
Author: James Westby <jw+debian at jameswestby.net>
Date:   Wed Sep 10 19:30:23 2008 +0100

    apt: handle inconsistent source repo state.
    
    If deb-src lines aren't available for every deb line then
    softwareproperties will report it as inconsistent, with
    None. The apt backend tried to pass this directly as
    the "enabled" parameter, which fails as it should be able to
    be considered an integer. We instead substitute False.
    
    Thanks to Baptiste Mille-Mathias for reporting and testing.

diff --git a/backends/apt/aptDBUSBackend.py b/backends/apt/aptDBUSBackend.py
index 2cfe72d..79fe73b 100755
--- a/backends/apt/aptDBUSBackend.py
+++ b/backends/apt/aptDBUSBackend.py
@@ -827,7 +827,7 @@ class PackageKitAptBackend(PackageKitBaseBackend):
         # Emit distro's virtual source code repositoriy
         if not FILTER_NOT_DEVELOPMENT in filter_list:
             repo_id = "%s_source" % repos.distro.id
-            enabled = repos.get_source_code_state()
+            enabled = repos.get_source_code_state() or False
             #FIXME: no translation :(
             description = "%s %s - Source code" % (repos.distro.id, 
                                                    repos.distro.release)
commit 9161d1593de87a2833eb11add2e13d11c762c89b
Merge: 84e46e3... f00306c...
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 17:52:30 2008 +0200

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

commit 84e46e39c3afc4c3b03c62053f51536b40510e18
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 17:32:21 2008 +0200

    urpmi: Added support for install-packages to install more than one package with one call

diff --git a/backends/urpmi/helpers/install-packages.pl b/backends/urpmi/helpers/install-packages.pl
index 73e6fad..2e55c3e 100755
--- a/backends/urpmi/helpers/install-packages.pl
+++ b/backends/urpmi/helpers/install-packages.pl
@@ -29,8 +29,10 @@ use urpmi_backend::tools;
 # One or more arguments (Package ids)
 exit if($#ARGV < 0);
 
+my @packageidstab = split(/\|/, $ARGV[0]);
+
 my @names;
-foreach(@ARGV) {
+foreach(@packageidstab) {
   my @pkg_id = (split(/;/, $_));
   push @names, $pkg_id[0];
 }
diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index c050551..fc068af 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -89,6 +89,9 @@ while(<STDIN>) {
   elsif($command eq "get-updates") {
     get_updates($urpm, @args);
   }
+  elsif($command eq "install-packages") {
+    install_packages($urpm, @args);
+  }
 }
 
 
@@ -278,6 +281,10 @@ sub get_updates {
   _finished();
 }
 
+sub install_packages {
+  # TODO
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
commit 62479ae58a81e3dac0ecba180aa93257f8b74d7b
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 17:23:18 2008 +0200

    urpmi: added get-updates in dispatched backend

diff --git a/backends/urpmi/helpers/get-updates.pl b/backends/urpmi/helpers/get-updates.pl
index 5dcf0d0..cb9b881 100755
--- a/backends/urpmi/helpers/get-updates.pl
+++ b/backends/urpmi/helpers/get-updates.pl
@@ -50,13 +50,7 @@ my $updates_descr = urpm::get_updates_description($urpm);
 
 foreach(@to_install) {
   my $updesc = $updates_descr->{URPM::pkg2media($urpm->{media}, $_)->{name}}{$_->name};
-  if($updesc->{importance} eq "bugfix") {
-    pk_print_package(INFO_BUGFIX, get_package_id($_), $_->summary);
-  }
-  elsif($updesc->{importance} eq "security") {
-    pk_print_package(INFO_SECURITY, get_package_id($_), $_->summary);
-  }
-  else {
-    pk_print_package(INFO_NORMAL, get_package_id($_), $_->summary);
-  }
+  pk_print_package($updesc->{importance} eq "bugfix" ? INFO_BUGFIX :
+                      $updesc->{importance} eq "security" ? INFO_SECURITY :
+                      INFO_NORMAL, get_package_id($_), $_->summary);
 }
diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index 9004aae..c050551 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -20,7 +20,7 @@
 # get-packages                  DONE
 # get-requires                  DONE
 # get-update-detail             DONE
-# get-updates
+# get-updates                   DONE
 # install-packages
 # refresh-cache
 # remove-packages
@@ -86,6 +86,9 @@ while(<STDIN>) {
   elsif($command eq "get-update-detail") {
     get_update_detail($urpm, @args);
   }
+  elsif($command eq "get-updates") {
+    get_updates($urpm, @args);
+  }
 }
 
 
@@ -246,6 +249,35 @@ sub get_update_detail {
   _finished();
 }
 
+sub get_updates {
+
+  my ($urpm, $filters) = @_;
+  # Fix me
+  # Filter are to be implemented.
+  
+  pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
+
+  my $state = {};
+  my %requested;
+  my $restart = urpm::select::resolve_dependencies($urpm, $state, \%requested,
+    auto_select => 1);
+  
+  my %selected = %{$state->{selected} || {}};
+  my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
+  my @to_remove = urpm::select::removed_packages($urpm, $state);
+  my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}]; 
+  @to_install = grep { $_->arch ne 'src' } @to_install;
+  my $updates_descr = urpm::get_updates_description($urpm);
+  
+  foreach(@to_install) {
+    my $updesc = $updates_descr->{URPM::pkg2media($urpm->{media}, $_)->{name}}{$_->name};
+    pk_print_package($updesc->{importance} eq "bugfix" ? INFO_BUGFIX :
+                        $updesc->{importance} eq "security" ? INFO_SECURITY :
+                        INFO_NORMAL, get_package_id($_), $_->summary);
+  }
+  _finished();
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
commit f00306c60cdc1c7e92e7addfc61cc68c64607f4a
Author: Anders F Bjorklund <afb at users.sourceforge.net>
Date:   Fri Sep 12 17:21:26 2008 +0200

    smart: yet another groups typo

diff --git a/backends/smart/helpers/smartBackend.py b/backends/smart/helpers/smartBackend.py
index 01d2b88..5a5a346 100755
--- a/backends/smart/helpers/smartBackend.py
+++ b/backends/smart/helpers/smartBackend.py
@@ -437,8 +437,8 @@ class PackageKitSmartBackend(PackageKitBaseBackend):
 
     GROUPS = {
     # RPM
-    'Amusement/Games'                         : GROUP_GAMES,
-    'Amusement/Graphics'                      : GROUP_GRAPHICS,
+    'Amusements/Games'                        : GROUP_GAMES,
+    'Amusements/Graphics'                     : GROUP_GRAPHICS,
     'Applications/Archiving'                  : GROUP_OTHER,
     'Applications/Communications'             : GROUP_COMMUNICATION,
     'Applications/Databases'                  : GROUP_OTHER,
commit 46c9dfdf88ad9b9713ad34074e28b5b7e9c32db9
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 17:16:59 2008 +0200

    urpmi: added get-update-detail in dispatched backend

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index 92fad94..9004aae 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -19,7 +19,7 @@
 # get-files                     DONE
 # get-packages                  DONE
 # get-requires                  DONE
-# get-update-detail
+# get-update-detail             DONE
 # get-updates
 # install-packages
 # refresh-cache
@@ -83,6 +83,9 @@ while(<STDIN>) {
   elsif($command eq "get-requires") {
     get_requires($urpm, @args);
   }
+  elsif($command eq "get-update-detail") {
+    get_update_detail($urpm, @args);
+  }
 }
 
 
@@ -230,6 +233,19 @@ sub get_requires {
   _finished();
 }
 
+sub get_update_detail {
+
+  my ($urpm, $packageids) = @_;
+  
+  pk_print_status(PK_STATUS_ENUM_QUERY);
+  my @packageidstab = split(/\|/, $packageids);
+  
+  foreach (@packageidstab) {
+    _print_package_update_details($urpm, $_);
+  }
+  _finished();
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
@@ -327,3 +343,42 @@ sub _print_package_files {
   
   pk_print_files(get_package_id($pkg), join(';', @files));
 }
+
+sub _print_package_update_details {
+
+  my ($urpm, $pkgid) = @_;
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+
+  my %requested;
+  $requested{$pkg->id} = 1;
+  my $state = {};
+  my $restart = urpm::select::resolve_dependencies($urpm, $state, \%requested);
+  my @ask_unselect = urpm::select::unselected_packages($urpm, $state);
+  my @to_remove = urpm::select::removed_packages($urpm, $state);
+  my @to_install = @{$urpm->{depslist}}[sort { $a <=> $b } keys %{$state->{selected}}]; 
+  my ($src, $binary) = partition { $_->arch eq 'src' } @to_install;
+  @to_install = @$binary;
+  my $updates_descr = urpm::get_updates_description($urpm);
+  my $updesc = $updates_descr->{URPM::pkg2media($urpm->{media}, $pkg)->{name}}{$pkg->name};
+  my $desc;
+  if($updesc) {
+    $desc = $updesc->{pre};
+    $desc =~ s/\n/;/g;
+  }
+  
+  my @to_upgrade_pkids;
+  foreach(@to_install) {
+    my $pkid = get_installed_version_pkid($_);
+    push @to_upgrade_pkids, $pkid if $pkid;
+  }
+  
+  pk_print_update_detail(get_package_id($pkg),
+    join("^", @to_upgrade_pkids),
+    join("^", map(fullname_to_package_id($_), @to_remove)),
+    "http://qa.mandriva.com",
+    "http://qa.mandriva.com",
+    "http://qa.mandriva.com",
+    $restart ? PK_RESTART_ENUM_SYSTEM : PK_RESTART_ENUM_APPLICATION,
+    $desc);
+}
commit e94c3bda7eb2fadae988e16a3753ed0cda59e610
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 16:10:30 2008 +0100

    bugfix: only return the icon name in PkExtra if it's an icon name, and not an actual icon

diff --git a/libpackagekit/pk-extra.c b/libpackagekit/pk-extra.c
index 18683aa..f4d1b36 100644
--- a/libpackagekit/pk-extra.c
+++ b/libpackagekit/pk-extra.c
@@ -106,7 +106,12 @@ pk_extra_populate_package_cache_callback (void *data, gint argc, gchar **argv, g
 		if (egg_strequal (col, "package") && value != NULL) {
 			package = g_strdup (argv[i]);
 		} else if (egg_strequal (col, "icon") && value != NULL) {
-			icon_name = g_strdup (argv[i]);
+			/* filter out icons that are not icon names, but files */
+			if (!egg_strzero (argv[i]) &&
+			    !g_str_has_suffix (argv[i], ".xpm") &&
+			    !g_str_has_suffix (argv[i], ".png") &&
+			    !g_str_has_suffix (argv[i], ".svg"))
+				icon_name = g_strdup (argv[i]);
 		} else if (egg_strequal (col, "exec") && value != NULL) {
 			exec = g_strdup (argv[i]);
 		}
commit 78629c58cf6670ef90afb63b5c20ad93796445b1
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 16:09:50 2008 +0100

    trivial: fix the fedora spec file

diff --git a/contrib/PackageKit.spec.in b/contrib/PackageKit.spec.in
index 72a5e0c..ca0a09e 100644
--- a/contrib/PackageKit.spec.in
+++ b/contrib/PackageKit.spec.in
@@ -195,6 +195,7 @@ update-mime-database %{_datadir}/mime &> /dev/null || :
 %{_datadir}/man/man1/*.1.gz
 %{_datadir}/PolicyKit/policy/*.policy
 %{_datadir}/mime/packages/packagekit-*.xml
+%{_datadir}/PackageKit/pk-upgrade-distro.sh
 %{_sbindir}/packagekitd
 %{_bindir}/pkmon
 %{_bindir}/pkcon
commit 916d9ad4e699fca167429fcd117fa54ad5bde8c8
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:58:13 2008 +0200

    urpmi: added get-requires in dispatched backend

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index abfea65..92fad94 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -18,7 +18,7 @@
 # get-distro-upgrades
 # get-files                     DONE
 # get-packages                  DONE
-# get-requires
+# get-requires                  DONE
 # get-update-detail
 # get-updates
 # install-packages
@@ -44,6 +44,7 @@ use urpm::media;
 use urpm::args;
 use urpm::select;
 
+use urpmi_backend::actions;
 use urpmi_backend::open_db;
 use urpmi_backend::tools;
 use urpmi_backend::filters;
@@ -79,6 +80,9 @@ while(<STDIN>) {
   elsif($command eq "get-packages") {
     get_packages($urpm, @args);
   }
+  elsif($command eq "get-requires") {
+    get_requires($urpm, @args);
+  }
 }
 
 
@@ -196,6 +200,36 @@ sub get_packages {
   _finished();
 }
 
+sub get_requires {
+  
+  my ($urpm, $filters, $packageids, $recursive_option) = @_;
+  
+  my @filterstab = split(/;/, $filters);
+  my @packageidstab = split(/\|/, $packageids);
+  my $recursive = $recursive_option eq "yes" ? 1 : 0;
+  
+  my @pkgnames;
+  foreach (@packageidstab) {
+    my $pkg = get_package_by_package_id($urpm, $_);
+    $pkg and push(@pkgnames, $pkg->name);
+  }
+  
+  pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
+  my @requires = perform_requires_search($urpm, \@pkgnames, $recursive);
+  
+  foreach(@requires) {
+    if(filter($_, \@filterstab, { FILTER_GUI => 1, FILTER_DEVELOPMENT => 1 })) {
+      if(package_version_is_installed($_)) {
+        grep(/^${\FILTER_NOT_INSTALLED}$/, @filterstab) or pk_print_package(INFO_INSTALLED, get_package_id($_), $_->summary);
+      }
+      else {
+        grep(/^${\FILTER_INSTALLED}$/, @filterstab) or pk_print_package(INFO_AVAILABLE, get_package_id($_), $_->summary);
+      }
+    }
+  }
+  _finished();
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
commit 7de3bbbd5d73a2545a8d83fa8e89ca470a3fbbd6
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:45:09 2008 +0200

    urpmi: some status print added

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index ac28ba3..abfea65 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -142,7 +142,6 @@ sub get_details {
   my ($urpm, $packageids) = @_;
   
   my @packageidstab = split(/\|/, $packageids);
-  
   pk_print_status(PK_STATUS_ENUM_QUERY);
 
   foreach (@packageidstab) {
@@ -156,11 +155,12 @@ sub get_files {
   my ($urpm, $packageids) = @_;
   
   my @packageidstab = split(/\|/, $packageids);
+  pk_print_status(PK_STATUS_ENUM_QUERY);
   
   foreach (@packageidstab) {
     _print_package_files($urpm, $_);
   }
-
+  _finished();
 }
 
 sub get_packages {
@@ -168,6 +168,8 @@ sub get_packages {
   my ($urpm, $filters) = @_;
   my @filterstab = split(/;/, $filters);
   
+  pk_print_status(PK_STATUS_ENUM_QUERY);
+  
   my $db = open_rpm_db();
   $urpm->compute_installed_flags($db);
   
@@ -191,6 +193,7 @@ sub get_packages {
       }  
     }
   }
+  _finished();
 }
 
 sub search_name {
commit d87ed1830bb0b606aa4a8db181f41eb0980ba8f8
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:42:44 2008 +0200

    urpmi: added get-packages in dispatched backend

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index 12faa18..ac28ba3 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -17,7 +17,7 @@
 # get-details                   DONE
 # get-distro-upgrades
 # get-files                     DONE
-# get-packages
+# get-packages                  DONE
 # get-requires
 # get-update-detail
 # get-updates
@@ -76,6 +76,9 @@ while(<STDIN>) {
   elsif($command eq "get-files") {
     get_files($urpm, @args);
   }
+  elsif($command eq "get-packages") {
+    get_packages($urpm, @args);
+  }
 }
 
 
@@ -160,6 +163,36 @@ sub get_files {
 
 }
 
+sub get_packages {
+
+  my ($urpm, $filters) = @_;
+  my @filterstab = split(/;/, $filters);
+  
+  my $db = open_rpm_db();
+  $urpm->compute_installed_flags($db);
+  
+  # Here we display installed packages
+  if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filterstab)) {
+    $db->traverse(sub {
+        my ($pkg) = @_;
+        if(filter($pkg, \@filterstab, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
+          pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
+        }
+      });
+  }
+  
+  # Here are package which can be installed
+  if(not grep(/^${\FILTER_INSTALLED}$/, @filterstab)) {
+    foreach my $pkg(@{$urpm->{depslist}}) {
+      if($pkg->flag_upgrade) {
+        if(filter($pkg, \@filterstab, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
+          pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
+        }
+      }  
+    }
+  }
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
commit 4f3b331ad7c1c6bb5d0668436146909e32be862d
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:33:44 2008 +0200

    urpmi: added get-files in dispatched backend

diff --git a/backends/urpmi/helpers/get-distro-upgrades.pl b/backends/urpmi/helpers/get-distro-upgrades.pl
index e81ef3f..137cf1d 100755
--- a/backends/urpmi/helpers/get-distro-upgrades.pl
+++ b/backends/urpmi/helpers/get-distro-upgrades.pl
@@ -41,6 +41,7 @@ while(<DISTRIB_FILE>) {
   my %distrib = parse_line($_);
   push(@distribs, \%distrib);
 }
+close(DISTRIB_FILE);
 
 my $distrib;
 foreach (@distribs) {
diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index e61e591..12faa18 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -16,7 +16,7 @@
 # get-depends                   DONE
 # get-details                   DONE
 # get-distro-upgrades
-# get-files
+# get-files                     DONE
 # get-packages
 # get-requires
 # get-update-detail
@@ -31,7 +31,6 @@
 # search-name                   DONE
 # update-packages
 # update-system
-# urpmi-dispatched-backend
 #
 
 use strict;
@@ -74,6 +73,9 @@ while(<STDIN>) {
   elsif($command eq "get-details") {
     get_details($urpm, @args);
   }
+  elsif($command eq "get-files") {
+    get_files($urpm, @args);
+  }
 }
 
 
@@ -146,6 +148,18 @@ sub get_details {
   _finished();
 }
 
+sub get_files {
+  
+  my ($urpm, $packageids) = @_;
+  
+  my @packageidstab = split(/\|/, $packageids);
+  
+  foreach (@packageidstab) {
+    _print_package_files($urpm, $_);
+  }
+
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
@@ -222,3 +236,24 @@ sub _print_package_details {
   
   pk_print_details(get_package_id($pkg), "N/A", $pkg->group, ensure_utf8($description), "N/A", $pkg->size);
 }
+
+sub _print_package_files {
+
+  my ($urpm, $pkgid) = @_;
+
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+  
+  my $medium = pkg2medium($pkg, $urpm);
+  my $xml_info = 'files';
+  my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
+  require urpm::xml_info;
+  require urpm::xml_info_pkg;
+  my $name = urpm_name($pkg);
+  my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
+  my %xml_info_pkgs;
+  put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
+  my @files = map { chomp_($_) } split("\n", $xml_info_pkgs{$name}{files});
+  
+  pk_print_files(get_package_id($pkg), join(';', @files));
+}
commit 57304f03af41727bcc8c88912cc30681b955e221
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 15:28:23 2008 +0100

    trivial: dist upgradescript_SCRIPTS

diff --git a/data/Makefile.am b/data/Makefile.am
index d360476..4668de1 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -85,6 +85,7 @@ EXTRA_DIST =						\
 	$(mime_in_files)				\
 	$(localcache_DATA)				\
 	$(database_DATA)				\
+	$(upgradescript_SCRIPTS)			\
 	$(NULL)
 
 clean-local:
commit 3f72e0075b56b6b65acfeed444371fce568a6fd1
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 15:26:28 2008 +0100

    trivial: fix build failure with ndef PK_BUILD_LOCAL

diff --git a/src/pk-backend.c b/src/pk-backend.c
index 8b469a3..ed5ccb9 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -530,14 +530,14 @@ pk_backend_build_library_path (PkBackend *backend, const gchar *name)
 {
 	gchar *path;
 	gchar *filename;
+#if PK_BUILD_LOCAL
 	const gchar *directory;
-
+#endif
 	g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
 	g_return_val_if_fail (name != NULL, NULL);
 
 	filename = g_strdup_printf ("libpk_backend_%s.so", name);
 #if PK_BUILD_LOCAL
-
 	/* test_spawn, test_dbus, test_fail, etc. are in the 'test' folder */
 	directory = name;
 	if (g_str_has_prefix (name, "test_"))
commit 3ef34f6d7bad899c76cc7af21969687384b4045d
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:21:56 2008 +0200

    urpmi: added get-details in dispatched backend

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
index 1ed600d..e61e591 100755
--- a/backends/urpmi/helpers/urpmi-dispatched-backend.pl
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -14,7 +14,7 @@
 # Dispatched backend implementation progress
 #
 # get-depends                   DONE
-# get-details
+# get-details                   DONE
 # get-distro-upgrades
 # get-files
 # get-packages
@@ -52,6 +52,8 @@ use urpmi_backend::filters;
 use perl_packagekit::enums;
 use perl_packagekit::prints;
 
+use MDK::Common;
+
 BEGIN {
   push @INC, dirname($0);
 }
@@ -69,6 +71,9 @@ while(<STDIN>) {
   elsif($command eq "get-depends") {
     get_depends($urpm, @args);
   }
+  elsif($command eq "get-details") {
+    get_details($urpm, @args);
+  }
 }
 
 
@@ -127,9 +132,25 @@ sub get_depends {
   _finished();
 }
 
+sub get_details {
+
+  my ($urpm, $packageids) = @_;
+  
+  my @packageidstab = split(/\|/, $packageids);
+  
+  pk_print_status(PK_STATUS_ENUM_QUERY);
+
+  foreach (@packageidstab) {
+    _print_package_details($urpm, $_);
+  }
+  _finished();
+}
+
 sub search_name {
 
   my ($urpm, $filters, $search_term) = @_;
+  
+  pk_print_status(PK_STATUS_ENUM_QUERY);
 
   my @filterstab = split(/;/, $filters);
   
@@ -138,7 +159,6 @@ sub search_name {
 
   my $db = open_rpm_db();
   $urpm->compute_installed_flags($db);
-  $db->close();
   
   # Here we display installed packages
   if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filterstab)) {
@@ -173,3 +193,32 @@ sub search_name {
 sub _finished {
   pk_print_status(PK_STATUS_ENUM_FINISHED);
 }
+
+sub _print_package_details {
+
+  my ($urpm, $pkgid) = @_;
+  
+  my $pkg = get_package_by_package_id($urpm, $pkgid);
+  $pkg or return;
+
+  my $medium = pkg2medium($pkg, $urpm);
+  my $xml_info = 'info';
+  my $xml_info_file = urpm::media::any_xml_info($urpm, $medium, $xml_info, undef, undef);
+  
+  if(!$xml_info_file) {
+    pk_print_details(get_package_id($pkg), "N/A", $pkg->group, "N/A", "N/A", 0);
+    return;
+  }
+  
+  require urpm::xml_info;
+  require urpm::xml_info_pkg;
+  my $name = urpm_name($pkg);
+  my %nodes = eval { urpm::xml_info::get_nodes($xml_info, $xml_info_file, [ $name ]) };
+  my %xml_info_pkgs;
+  put_in_hash($xml_info_pkgs{$name} ||= {}, $nodes{$name});
+  my $description = $xml_info_pkgs{$name}{description};
+  $description =~ s/\n/;/g;
+  $description =~ s/\t/ /g;
+  
+  pk_print_details(get_package_id($pkg), "N/A", $pkg->group, ensure_utf8($description), "N/A", $pkg->size);
+}
commit 2115874a21dcc33fa2eb20e4e1d72cc8838d834e
Author: Aurelien Lefebvre <alefebvre at mandriva.com>
Date:   Fri Sep 12 16:11:05 2008 +0200

    urpmi: dispatched backend implementation starts

diff --git a/backends/urpmi/helpers/urpmi-dispatched-backend.pl b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
new file mode 100755
index 0000000..1ed600d
--- /dev/null
+++ b/backends/urpmi/helpers/urpmi-dispatched-backend.pl
@@ -0,0 +1,175 @@
+#!/usr/bin/perl
+#
+# Copyright (C) 2008 Aurelien Lefebvre <alefebvre at mandriva.com>
+#
+# Licensed under the GNU General Public License Version 2
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+
+#
+# Dispatched backend implementation progress
+#
+# get-depends                   DONE
+# get-details
+# get-distro-upgrades
+# get-files
+# get-packages
+# get-requires
+# get-update-detail
+# get-updates
+# install-packages
+# refresh-cache
+# remove-packages
+# resolve
+# search-details
+# search-file
+# search-group
+# search-name                   DONE
+# update-packages
+# update-system
+# urpmi-dispatched-backend
+#
+
+use strict;
+
+use lib;
+use File::Basename;
+
+use URPM;
+use urpm;
+use urpm::media;
+use urpm::args;
+use urpm::select;
+
+use urpmi_backend::open_db;
+use urpmi_backend::tools;
+use urpmi_backend::filters;
+
+use perl_packagekit::enums;
+use perl_packagekit::prints;
+
+BEGIN {
+  push @INC, dirname($0);
+}
+
+my $urpm = urpm->new_parse_cmdline;
+urpm::media::configure($urpm);
+  
+while(<STDIN>) {
+  chomp($_);
+  my @args = split (/ /, $_);
+  my $command = shift(@args);
+  if($command eq "search-name") {
+    search_name($urpm, @args);
+  }
+  elsif($command eq "get-depends") {
+    get_depends($urpm, @args);
+  }
+}
+
+
+
+sub get_depends {
+
+  my ($urpm, $filters, $packageids, $recursive_option) = @_;
+  
+  my @filterstab = split(/;/, $filters);
+  my @packageidstab = split(/\|/, $packageids);
+  $recursive_option = 1;
+  
+  pk_print_status(PK_STATUS_ENUM_DEP_RESOLVE);
+  
+  my @pkgnames;
+  foreach (@packageidstab) {
+    my @pkgid = split(/;/, $_);
+    push(@pkgnames, $pkgid[0]);
+  }
+  
+  my %requested;
+  my $results = urpm::select::search_packages($urpm, \%requested, \@pkgnames,
+    fuzzy => 0,
+    caseinsensitive => 0,
+    all => 0
+  );
+  
+  $results 
+      or (_finished() and return);
+  
+  my $empty_db = new URPM;
+  my $state = {};
+  $urpm->resolve_requested($empty_db,
+    $state,
+    \%requested,
+  );
+  
+  my $db = open_rpm_db();
+  $urpm->compute_installed_flags($db);
+  
+  my %selected = %{$state->{selected}};
+  my @selected_keys = keys %selected;
+  my @depslist = @{$urpm->{depslist}};
+  
+  foreach(sort {@depslist[$b]->flag_installed <=> @depslist[$a]->flag_installed} @selected_keys) {
+    my $pkg = @depslist[$_];
+    if($pkg->flag_installed) {
+      grep(/^${\FILTER_NOT_INSTALLED}$/, @filterstab) and next;
+      pk_print_package(INFO_INSTALLED, get_package_id($pkg), $pkg->summary);
+    }
+    else {
+      grep(/^${\FILTER_INSTALLED}$/, @filterstab) and next;
+      pk_print_package(INFO_AVAILABLE, get_package_id($pkg), $pkg->summary);
+    }
+  }
+  _finished();
+}
+
+sub search_name {
+
+  my ($urpm, $filters, $search_term) = @_;
+
+  my @filterstab = split(/;/, $filters);
+  
+  my $basename_option = FILTER_BASENAME;
+  $basename_option = grep(/$basename_option/, @filterstab);
+
+  my $db = open_rpm_db();
+  $urpm->compute_installed_flags($db);
+  $db->close();
+  
+  # Here we display installed packages
+  if(not grep(/^${\FILTER_NOT_INSTALLED}$/, @filterstab)) {
+    $db->traverse(sub {
+        my ($pkg) = @_;
+        if(filter($pkg, \@filterstab, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
+          if( (!$basename_option && $pkg->name =~ /$search_term/)
+            || $pkg->name =~ /^$search_term$/ ) {
+            pk_print_package(INFO_INSTALLED, get_package_id($pkg), ensure_utf8($pkg->summary));
+          }
+        }
+      });
+  }
+  
+  # Here are packages which can be installed
+  grep(/^${\FILTER_INSTALLED}$/, @filterstab) 
+    and _finished()
+    and return;
+  
+  foreach my $pkg(@{$urpm->{depslist}}) {
+    if($pkg->flag_upgrade && filter($pkg, \@filterstab, {FILTER_DEVELOPMENT => 1, FILTER_GUI => 1})) {
+      if( (!$basename_option && $pkg->name =~ /$search_term/)
+        || $pkg->name =~ /^$search_term$/ ) {
+        pk_print_package(INFO_AVAILABLE, get_package_id($pkg), ensure_utf8($pkg->summary));
+      }
+    }
+  }
+
+  _finished();
+}
+
+sub _finished {
+  pk_print_status(PK_STATUS_ENUM_FINISHED);
+}
commit b6eeefd7a4730852436f24cc62370aadf811496c
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 14:57:12 2008 +0100

    bugfix: when we are using the test backends, allow use to reference them without doing make install when PK_BUILD_LOCAL is set

diff --git a/src/pk-backend.c b/src/pk-backend.c
index d6f147b..8b469a3 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -530,14 +530,21 @@ pk_backend_build_library_path (PkBackend *backend, const gchar *name)
 {
 	gchar *path;
 	gchar *filename;
+	const gchar *directory;
 
 	g_return_val_if_fail (PK_IS_BACKEND (backend), NULL);
 	g_return_val_if_fail (name != NULL, NULL);
 
 	filename = g_strdup_printf ("libpk_backend_%s.so", name);
 #if PK_BUILD_LOCAL
+
+	/* test_spawn, test_dbus, test_fail, etc. are in the 'test' folder */
+	directory = name;
+	if (g_str_has_prefix (name, "test_"))
+		directory = "test";
+
 	/* prefer the local version */
-	path = g_build_filename ("..", "backends", name, ".libs", filename, NULL);
+	path = g_build_filename ("..", "backends", directory, ".libs", filename, NULL);
 	if (g_file_test (path, G_FILE_TEST_EXISTS) == FALSE) {
 		egg_debug ("local backend not found '%s'", path);
 		g_free (path);
commit b144bc0b882f6e11a2075a444857b2c2124613ce
Author: Richard Hughes <richard at hughsie.com>
Date:   Fri Sep 12 14:30:58 2008 +0100

    feature: add pk-upgrade-distro.sh so we can actually do the distro upgrade action

diff --git a/data/Makefile.am b/data/Makefile.am
index 07dc239..d360476 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -19,6 +19,9 @@ crondata_SCRIPTS = packagekit-background
 pmutilsdir = $(libdir)/pm-utils/sleep.d
 pmutils_DATA = 95packagekit
 
+upgradescriptdir = $(datadir)/PackageKit
+upgradescript_SCRIPTS = pk-upgrade-distro.sh
+
 if BACKEND_TYPE_APT
 aptconfdir = ${SYSCONFDIR}/apt.conf.d
 aptconf_DATA = 20packagekit
diff --git a/data/pk-upgrade-distro.sh b/data/pk-upgrade-distro.sh
new file mode 100755
index 0000000..670e781
--- /dev/null
+++ b/data/pk-upgrade-distro.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Copyright (C) 2008 Richard Hughes <richard at hughsie.com>
+#
+# This file is designed to be run by a not privileged user, NOT ROOT.
+# The tool which is invoked will have to use consolehelper or PolicyKit
+# if privileged changes are required.
+#
+# 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.
+
+# Fedora uses preupgrade
+if [ -e /etc/fedora-release ]; then
+	if [ -e /usr/bin/preupgrade ]; then
+		/usr/bin/preupgrade
+	else
+		xdg-open http://fedoraproject.org/en/get-fedora
+	fi
+else
+	# do not dep on zenity in build scripts
+	zenity --warning --title "System is not recognised" \
+	       --text "Your distribution was not recognised by the upgrade script.\nPlease file a but in your distribution bug tracker under the component PackageKit."
+fi
+


More information about the PackageKit-commit mailing list