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

Richard Hughes hughsient at kemper.freedesktop.org
Tue Oct 2 09:25:19 PDT 2007


 TODO                                     |   11 +++++
 backends/BACKENDS                        |    2 
 backends/box/pk-backend-box.c            |    4 +
 backends/conary/helpers/conaryBackend.py |    4 +
 backends/dummy/pk-backend-dummy.c        |    4 +
 backends/yum/helpers/resolve.py          |   18 ++++++++
 backends/yum/helpers/yumBackend.py       |   66 ++++++++++++++++++++++++++++---
 client/pk-console.c                      |    6 ++
 docs/backends.xml                        |    2 
 docs/introduction.xml                    |   12 +++++
 libpackagekit/pk-client.c                |   14 ++++--
 python/packagekit/backend.py             |   13 +++++-
 python/packagekit/frontend.py            |   12 +++--
 python/pk-frontend-test.py               |    6 ++
 src/pk-backend.c                         |   21 ++++++---
 src/pk-backend.h                         |    4 +
 src/pk-engine.c                          |   13 +++---
 src/pk-interface.xml                     |    2 
 src/pk-marshal.list                      |    3 -
 19 files changed, 178 insertions(+), 39 deletions(-)

New commits:
diff-tree 4b18b9c8a328d00de0a1f4e1f8b22abf56750b29 (from fc87623193abc49701ea39f07503647666e7038e)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 17:25:06 2007 +0100

    update TODO

diff --git a/TODO b/TODO
index 1f2eb3d..9249822 100644
--- a/TODO
+++ b/TODO
@@ -8,6 +8,12 @@ NOTE: RELEASE BLOCKER
 *** don't output the same package in different repos ***
 Need to store Package() in the server properly, and compare the first chunk
 (not the data) to avoid reporting the same package more than once.
+Have pk-package-cache.c object which is created in pk-backend for each instance
+Instead of Gstring have PkPackageCache instance.
+pk_package_cache_add (i=role, s=package_id, s=summary) s=pk_package_cache_get_string()
+We can also use this in the client library (perhaps?)
+Also: pk_package_id_compare (gboolean use_data)
+Need to unit test...
 NOTE: RELEASE BLOCKER
 
 *** Add new callback for status ***
diff-tree fc87623193abc49701ea39f07503647666e7038e (from parents)
Merge: 51f028d6ce5c7a76ddc195e664abb0376abe4754 dd98fa856c9d4d01af36c0c7dc2e13a13143e247
Author: Robin Norwood <rnorwood at redhat.com>
Date:   Tue Oct 2 09:49:27 2007 -0400

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

diff-tree 51f028d6ce5c7a76ddc195e664abb0376abe4754 (from d549164970eb52827a21a456930dca5707a7ab38)
Author: Robin Norwood <rnorwood at redhat.com>
Date:   Tue Oct 2 09:49:10 2007 -0400

    Add support for size of package and list of included files from the description signal.

diff --git a/backends/box/pk-backend-box.c b/backends/box/pk-backend-box.c
index 35f5434..1a908d9 100644
--- a/backends/box/pk-backend-box.c
+++ b/backends/box/pk-backend-box.c
@@ -286,7 +286,9 @@ backend_get_description_thread (PkBacken
 		return FALSE;
 	}
 
-	pk_backend_description (backend, pi->name, "unknown", PK_GROUP_ENUM_OTHER, ps->description, "");
+	/* Package size and file list go here, but I don't know how to find those for 'boxes'. */
+	/* Also, if I ever write a packaging system, they will be called 'presents'. Or perhaps 'parcels'. */
+	pk_backend_description (backend, pi->name, "unknown", PK_GROUP_ENUM_OTHER, ps->description, "", 0, "");
 
 	pk_package_id_free (pi);
 	box_db_repos_package_list_free (list);
diff --git a/backends/conary/helpers/conaryBackend.py b/backends/conary/helpers/conaryBackend.py
index 8543d8c..07ddfae 100644
--- a/backends/conary/helpers/conaryBackend.py
+++ b/backends/conary/helpers/conaryBackend.py
@@ -243,7 +243,9 @@ class PackageKitConaryBackend(PackageKit
             longDesc = self._get_metadata(id, 'longDesc') or ""
             url = "http://www.foresightlinux.org/packages/" + name + ".html"
             categories = self._get_metadata(id, 'categories') or "unknown"
-            self.description(shortDesc, id, categories, longDesc, url)
+
+            # Package size and file list go here, but I don't know how to find those for conary packages.
+            self.description(shortDesc, id, categories, longDesc, url, 0, "")
         else:
             self.error(ERROR_INTERNAL_ERROR,'Package was not found')
 
diff --git a/backends/dummy/pk-backend-dummy.c b/backends/dummy/pk-backend-dummy.c
index 9f31248..215b124 100644
--- a/backends/dummy/pk-backend-dummy.c
+++ b/backends/dummy/pk-backend-dummy.c
@@ -111,7 +111,9 @@ backend_get_description (PkBackend *back
 "While the goals of the program are for ease of use and simple easy to "
 "understand tools, Scribus offers support for professional publishing "
 "features, such as CMYK color, easy PDF creation, Encapsulated Postscript "
-"import/export and creation of color separations.", "http://live.gnome.org/GnomePowerManager");
+"import/export and creation of color separations.", "http://live.gnome.org/GnomePowerManager",
+				11214665, "/usr/share/man/man1;/usr/share/man/man1/gnome-power-manager.1.gz"
+				);
 	pk_backend_finished (backend);
 }
 
diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 65acde4..6aa0499 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -387,8 +387,14 @@ class PackageKitYumBackend(PackageKitBas
             desc = pkg.description
             desc = desc.replace('\n\n',';')
             desc = desc.replace('\n',' ')            
+            
+            files = pkg.returnFileEntries('dir')
+            files.extend(pkg.returnFileEntries()) # regular files
+
+            file_list = ";".join(files)
+
             self.description(id, "%s-%s" % (pkg.version, pkg.release),
-                                 "unknown", desc, pkg.url)
+                                 "unknown", desc, pkg.url, pkg.size, file_list)
         else:
             self.error(ERROR_INTERNAL_ERROR,'Package was not found')
     
diff --git a/client/pk-console.c b/client/pk-console.c
index df2b7c7..6efa360 100644
--- a/client/pk-console.c
+++ b/client/pk-console.c
@@ -406,13 +406,17 @@ pk_console_error_code_cb (PkClient *clie
 static void
 pk_console_description_cb (PkClient *client, const gchar *package_id,
 			   const gchar *licence, PkGroupEnum group,
-			   const gchar *description, const gchar *url, gpointer data)
+			   const gchar *description, const gchar *url, gulong size, const gchar *filelist,
+			   gpointer data)
 {
 	g_print ("description\n");
 	g_print ("  package:     '%s'\n", package_id);
 	g_print ("  licence:     '%s'\n", licence);
 	g_print ("  group:       '%s'\n", pk_group_enum_to_text (group));
 	g_print ("  description: '%s'\n", description);
+	g_print ("  size:        '%ld' bytes\n", size);
+	/* filelist is probably too long to just dump to the screen */
+	/* g_print ("  files:       '%s'\n", filelist); */
 	g_print ("  url:         '%s'\n", url);
 }
 
diff --git a/docs/backends.xml b/docs/backends.xml
index a44cb25..059cb23 100644
--- a/docs/backends.xml
+++ b/docs/backends.xml
@@ -166,7 +166,7 @@
           </row>
           <row>
             <entry>Description</entry>
-            <entry><literal>description[tab]package_id[tab]group[tab]detail[tab]url</literal></entry>
+            <entry><literal>description[tab]package_id[tab]group[tab]detail[tab]url[tab]size_in_bytes[tab]file_list</literal></entry>
             <entry><literal>stdout</literal></entry>
           </row>
           <row>
diff --git a/docs/introduction.xml b/docs/introduction.xml
index 9e74280..6ba5264 100644
--- a/docs/introduction.xml
+++ b/docs/introduction.xml
@@ -1385,6 +1385,18 @@
               <entry><literal>url</literal></entry>
               <entry>The upstream project homepage</entry>
             </row>
+            <row>
+              <entry><literal>size</literal></entry>
+              <entry>
+		The size of the package in bytes.  This should be the
+		size of the entire package file, not the size of the
+		files installed on the system.
+	      </entry>
+            </row>
+            <row>
+              <entry><literal>file_list</literal></entry>
+              <entry>A list of all files and directories created by the package at install time.  Separated by the ';' character.</entry>
+            </row>
           </tbody>
         </tgroup>
       </informaltable>
diff --git a/libpackagekit/pk-client.c b/libpackagekit/pk-client.c
index 9488d5d..1a4d969 100644
--- a/libpackagekit/pk-client.c
+++ b/libpackagekit/pk-client.c
@@ -426,6 +426,8 @@ pk_client_description_cb (DBusGProxy  *p
 			  const gchar *group_text,
 			  const gchar *description,
 			  const gchar *url,
+			  gulong size,
+			  const gchar *filelist,
 			  PkClient    *client)
 {
 	PkGroupEnum group;
@@ -434,8 +436,8 @@ pk_client_description_cb (DBusGProxy  *p
 
 	if (pk_transaction_id_equal (tid, client->priv->tid) == TRUE) {
 		group = pk_group_enum_from_text (group_text);
-		pk_debug ("emit description %s, %s, %i, %s, %s", package_id, licence, group, description, url);
-		g_signal_emit (client , signals [PK_CLIENT_DESCRIPTION], 0, package_id, licence, group, description, url);
+		pk_debug ("emit description %s, %s, %i, %s, %s, %ld, %s", package_id, licence, group, description, url, size, filelist);
+		g_signal_emit (client , signals [PK_CLIENT_DESCRIPTION], 0, package_id, licence, group, description, url, size, filelist);
 	}
 }
 
@@ -1714,8 +1716,9 @@ pk_client_class_init (PkClientClass *kla
 	signals [PK_CLIENT_DESCRIPTION] =
 		g_signal_new ("description",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_UINT_STRING_STRING,
-			      G_TYPE_NONE, 5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
+			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_UINT_STRING_STRING_ULONG_STRING,
+			      G_TYPE_NONE, 7, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING,
+			      G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_STRING);
 	signals [PK_CLIENT_ERROR_CODE] =
 		g_signal_new ("error-code",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
@@ -1876,7 +1879,8 @@ pk_client_init (PkClient *client)
 
 	dbus_g_proxy_add_signal (proxy, "Description",
 				 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
-				 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
+				 G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ULONG,
+				 G_TYPE_STRING, G_TYPE_INVALID);
 	dbus_g_proxy_connect_signal (proxy, "Description",
 				     G_CALLBACK (pk_client_description_cb), client, NULL);
 
diff --git a/python/packagekit/backend.py b/python/packagekit/backend.py
index 8eca7b4..17dede9 100644
--- a/python/packagekit/backend.py
+++ b/python/packagekit/backend.py
@@ -115,7 +115,7 @@ class PackageKitBaseBackend:
         '''
         print >> sys.stderr,"data\t%s" % (data)
 
-    def description(self,id,licence,group,desc,url):
+    def description(self,id,licence,group,desc,url,bytes,file_list):
         '''
         Send 'description' signal
         @param id: The package ID name, e.g. openoffice-clipart;2.6.22;ppc64;fedora
@@ -123,8 +123,10 @@ class PackageKitBaseBackend:
         @param group: The enumerated group
         @param desc: The multi line package description
         @param url: The upstream project homepage
+        @param bytes: The size of the package, in bytes
+        @param file_list: List of the files in the package, separated by ';'
         '''
-        print >> sys.stdout,"description\t%s\t%s\t%s\t%s\t%s" % (id,licence,group,desc,url)
+        print >> sys.stdout,"description\t%s\t%s\t%s\t%s\t%s\t%ld\t%s" % (id,licence,group,desc,url,bytes,file_list)
 
     def require_restart(self,restart_type,details):
         '''
diff --git a/python/packagekit/frontend.py b/python/packagekit/frontend.py
index 9dc5a85..9f974b7 100644
--- a/python/packagekit/frontend.py
+++ b/python/packagekit/frontend.py
@@ -121,7 +121,7 @@ class PackageKit:
 		elif kwargs['member'] == "UpdateDetail":
 			self.UpdateDetail(args[0],args[1],args[2],args[3],args[4],args[5],args[6])
 		elif kwargs['member'] == "Description":
-			self.Description(args[0],args[1],args[2],args[3],args[4],args[5])
+			self.Description(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7])
 		elif kwargs['member'] == "ErrorCode":
 			self.ErrorCode(args[0],args[1],args[2])
 		elif kwargs['member'] == "RequireRestart":
@@ -183,7 +183,9 @@ class PackageKit:
 			license,
 			group,
 			detail,
-			url
+			url,
+			size,       # in bytes
+			file_list   # separated by ';'
 			):
 		pass
 
diff --git a/python/pk-frontend-test.py b/python/pk-frontend-test.py
index 8f8eb25..2020d89 100755
--- a/python/pk-frontend-test.py
+++ b/python/pk-frontend-test.py
@@ -29,10 +29,14 @@ class pkt(PackageKit):
 	def Package(self,jid,value,name,summary):
 		print "Package: %s - %s"%(name,summary)
 
-	def Description(self,jid,package_id,license,group,detail,url):
+	def Description(self,jid,package_id,license,group,detail,url,size,file_list):
 		print "Package: %s" % package_id
 		print "  %s" % url
 		print "  %s" % detail
+		print "  %s bytes" % size
+		print "  Files:"
+		for file in file_list.split(";"):
+			print "    %s" % file
 
 	def Transaction(self,jid,old_jid,timespec,succeeded,role,duration):
 		success = "Failed"
diff --git a/src/pk-backend.c b/src/pk-backend.c
index 7cdeba2..d2e3754 100644
--- a/src/pk-backend.c
+++ b/src/pk-backend.c
@@ -241,6 +241,7 @@ pk_backend_parse_common_output (PkBacken
 	gboolean ret = TRUE;
 	PkInfoEnum info;
 	PkGroupEnum group;
+	gulong package_size;
 
 	/* check if output line */
 	if (line == NULL || strstr (line, "\t") == NULL)
@@ -274,13 +275,15 @@ pk_backend_parse_common_output (PkBacken
 			pk_warning ("invalid package_id");
 		}
 	} else if (strcmp (command, "description") == 0) {
-		if (size != 6) {
+		if (size != 8) {
 			g_error ("invalid command '%s'", command);
 			ret = FALSE;
 			goto out;
 		}
 		group = pk_group_enum_from_text (sections[3]);
-		pk_backend_description (backend, sections[1], sections[2], group, sections[4], sections[5]);
+		package_size = atol(sections[6]);
+		pk_backend_description (backend, sections[1], sections[2], group, sections[4], sections[5],
+					package_size, sections[7]);
 	} else {
 		pk_warning ("invalid command '%s'", command);
 	}
@@ -728,13 +731,16 @@ pk_backend_require_restart (PkBackend *b
 gboolean
 pk_backend_description (PkBackend *backend, const gchar *package_id,
 			const gchar *licence, PkGroupEnum group,
-			const gchar *description, const gchar *url)
+			const gchar *description, const gchar *url,
+			gulong size, const gchar *filelist)
 {
 	g_return_val_if_fail (backend != NULL, FALSE);
 	g_return_val_if_fail (PK_IS_BACKEND (backend), FALSE);
 
-	pk_debug ("emit description %s, %s, %i, %s, %s", package_id, licence, group, description, url);
-	g_signal_emit (backend, signals [PK_BACKEND_DESCRIPTION], 0, package_id, licence, group, description, url);
+	pk_debug ("emit description %s, %s, %i, %s, %s, %ld, %s", package_id, licence, group, description, url,
+		  size, filelist);
+	g_signal_emit (backend, signals [PK_BACKEND_DESCRIPTION], 0, package_id, licence, group, description, url,
+		       size, filelist);
 
 	return TRUE;
 }
@@ -1479,8 +1485,9 @@ pk_backend_class_init (PkBackendClass *k
 	signals [PK_BACKEND_DESCRIPTION] =
 		g_signal_new ("description",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_UINT_STRING_STRING,
-			      G_TYPE_NONE, 5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
+			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_UINT_STRING_STRING_ULONG_STRING,
+			      G_TYPE_NONE, 7, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING,
+			      G_TYPE_ULONG,G_TYPE_STRING);
 	signals [PK_BACKEND_ERROR_CODE] =
 		g_signal_new ("error-code",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
diff --git a/src/pk-backend.h b/src/pk-backend.h
index d9be55f..64a25fb 100644
--- a/src/pk-backend.h
+++ b/src/pk-backend.h
@@ -61,7 +61,9 @@ gboolean	 pk_backend_description			(PkBa
 							 const gchar	*licence,
 							 PkGroupEnum	 group,
 							 const gchar	*description,
-							 const gchar	*url);
+							 const gchar	*url,
+							 gulong          size,
+							 const gchar    *filelist);
 gboolean	 pk_backend_error_code			(PkBackend	*backend,
 							 guint		 code,
 							 const gchar	*details, ...);
diff --git a/src/pk-engine.c b/src/pk-engine.c
index 7faf3a7..de49f30 100644
--- a/src/pk-engine.c
+++ b/src/pk-engine.c
@@ -387,7 +387,8 @@ pk_engine_require_restart_cb (PkBackend 
  **/
 static void
 pk_engine_description_cb (PkBackend *backend, const gchar *package_id, const gchar *licence, PkGroupEnum group,
-			  const gchar *detail, const gchar *url, PkEngine *engine)
+			  const gchar *detail, const gchar *url, gulong size, const gchar *filelist, 
+			  PkEngine *engine)
 {
 	PkTransactionItem *item;
 	const gchar *group_text;
@@ -402,8 +403,8 @@ pk_engine_description_cb (PkBackend *bac
 	}
 	group_text = pk_group_enum_to_text (group);
 
-	pk_debug ("emitting description tid:%s, %s, %s, %s, %s, %s", item->tid, package_id, licence, group_text, detail, url);
-	g_signal_emit (engine, signals [PK_ENGINE_DESCRIPTION], 0, item->tid, package_id, licence, group_text, detail, url);
+	pk_debug ("emitting description tid:%s, %s, %s, %s, %s, %s, %ld, %s", item->tid, package_id, licence, group_text, detail, url, size, filelist);
+	g_signal_emit (engine, signals [PK_ENGINE_DESCRIPTION], 0, item->tid, package_id, licence, group_text, detail, url, size, filelist);
 }
 
 /**
@@ -1947,9 +1948,9 @@ pk_engine_class_init (PkEngineClass *kla
 	signals [PK_ENGINE_DESCRIPTION] =
 		g_signal_new ("description",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
-			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_STRING_STRING_STRING_STRING,
-			      G_TYPE_NONE, 6, G_TYPE_STRING, G_TYPE_STRING,
-			      G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+			      0, NULL, NULL, pk_marshal_VOID__STRING_STRING_STRING_STRING_STRING_STRING_ULONG_STRING,
+			      G_TYPE_NONE, 8, G_TYPE_STRING, G_TYPE_STRING,
+			      G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_ULONG, G_TYPE_STRING);
 	signals [PK_ENGINE_FINISHED] =
 		g_signal_new ("finished",
 			      G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST,
diff --git a/src/pk-interface.xml b/src/pk-interface.xml
index fa6b524..e7bb6ab 100644
--- a/src/pk-interface.xml
+++ b/src/pk-interface.xml
@@ -108,6 +108,8 @@
       <arg type="s" name="group" direction="out"/>
       <arg type="s" name="detail" direction="out"/>
       <arg type="s" name="url" direction="out"/>
+      <arg type="u" name="size" direction="out"/> <!-- size of package file in bytes -->
+      <arg type="s" name="file_list" direction="out"/> <!-- list of files and dirs separated by ';' -->
     </signal>
     <signal name="UpdateDetail">
       <arg type="s" name="tid" direction="out"/>
diff --git a/src/pk-marshal.list b/src/pk-marshal.list
index 6713374..f1cd591 100644
--- a/src/pk-marshal.list
+++ b/src/pk-marshal.list
@@ -13,7 +13,8 @@ VOID:STRING,STRING,STRING,STRING
 VOID:STRING,STRING,STRING,STRING,STRING
 VOID:STRING,STRING,STRING,STRING,STRING,STRING
 VOID:STRING,STRING,STRING,STRING,STRING,STRING,STRING
-VOID:STRING,STRING,UINT,STRING,STRING
+VOID:STRING,STRING,UINT,STRING,STRING,ULONG,STRING
+VOID:STRING,STRING,STRING,STRING,STRING,STRING,ULONG,STRING
 VOID:STRING,UINT,STRING,STRING
 VOID:STRING,STRING,UINT,UINT,UINT
 VOID:STRING,STRING,BOOL,UINT,UINT,STRING
diff-tree dd98fa856c9d4d01af36c0c7dc2e13a13143e247 (from 4671b3f59f349441ede15635347f2fb66a359b05)
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Tue Oct 2 13:52:39 2007 +0200

    updated yum status i BACKENDS

diff --git a/backends/BACKENDS b/backends/BACKENDS
index c7962ca..da20006 100644
--- a/backends/BACKENDS
+++ b/backends/BACKENDS
@@ -2,7 +2,7 @@ Current status of the backends
 
                   | conary | yum | apt | box | alpm |
 -----------------------------------------------------
-resolve           |        |     |     |  X  |      |
+resolve           |        |  X  |     |  X  |      |
 refresh-cache     |   X    |  X  |  X  |  X  |      |
 get-updates       |   X    |  X  |     |  X  |      |
 update-system     |   X    |  X  |     |     |      |
diff-tree 4671b3f59f349441ede15635347f2fb66a359b05 (from f5d813eb393f365d144d30b82643bb4b2558471f)
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Tue Oct 2 13:47:18 2007 +0200

    make remove yes/no package work right in the yum backend (don't remove dependencies if not yes is used as first parameter

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 7a7bba8..2f5082c 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -372,7 +372,7 @@ class PackageKitYumBackend(PackageKitBas
                 self.require_restart(RESTART_SYSTEM,"")
                 break
     
-    def _runYumTransaction(self):
+    def _runYumTransaction(self,removedeps=None):
         '''
         Run the yum Transaction
         This will only work with yum 3.2.4 or higher
@@ -383,6 +383,12 @@ class PackageKitYumBackend(PackageKitBas
             self.error(ERROR_DEP_RESOLUTION_FAILED,retmsg)
         else:
             self._check_for_reboot()
+            if removedeps == False:
+                if len(self.yumbase.tsInfo) > 1:
+                    retmsg = 'package could not be remove, because something depends on it'
+                    self.error(ERROR_DEP_RESOLUTION_FAILED,retmsg)
+                    return
+
             try:
                 rpmDisplay = PackageKitCallback(self)
                 callback = ProcessTransPackageKitCallback(self)
@@ -409,7 +415,10 @@ class PackageKitYumBackend(PackageKitBas
         if pkg and inst:        
             txmbr = self.yumbase.remove(name=pkg.name)
             if txmbr:
-                self._runYumTransaction()
+                if allowdep != 'yes':
+                    self._runYumTransaction(removedeps=False)
+                else:
+                    self._runYumTransaction(removedeps=True)
             else:
                 self.error(ERROR_PACKAGE_NOT_INSTALLED,"Package is not installed")
         else:
diff-tree f5d813eb393f365d144d30b82643bb4b2558471f (from dba78a006f41de938bdd7e0b9bd6b7428e2c8a37)
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Tue Oct 2 13:29:13 2007 +0200

    Added restart require check and fixed epoch bug

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index ccf4a24..7a7bba8 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -34,6 +34,12 @@ from yum.callbacks import *
 
 class PackageKitYumBackend(PackageKitBaseBackend):
 
+    # Packages there require a reboot     
+    rebootpkgs = ("kernel", "kernel-smp", "kernel-xen-hypervisor", "kernel-PAE",
+              "kernel-xen0", "kernel-xenU", "kernel-xen", "kernel-xen-guest",
+              "glibc", "hal", "dbus", "xen")
+
+
     def __init__(self,args):
         PackageKitBaseBackend.__init__(self,args)
         self.yumbase = yum.YumBase()
@@ -192,7 +198,7 @@ class PackageKitYumBackend(PackageKitBas
         cpos = idver.find(':')
         if cpos != -1:
             epoch = idver[:cpos]
-            idver = idver[cpos:]
+            idver = idver[cpos+1:]
         else:
             epoch = '0'
         (version,release) = tuple(idver.split('-'))
@@ -207,6 +213,7 @@ class PackageKitYumBackend(PackageKitBas
         # get e,v,r from package id version
         e,v,r = self._getEVR(idver)
         # search the rpmdb for the nevra
+        print n,e,v,r,a
         pkgs = self.yumbase.rpmdb.searchNevra(name=n,epoch=e,ver=v,rel=r,arch=a)
         # if the package is found, then return it
         if len(pkgs) != 0:
@@ -356,6 +363,14 @@ class PackageKitYumBackend(PackageKitBas
         else:
             self.error(ERROR_PACKAGE_ALREADY_INSTALLED,"No available updates")
 
+    def _check_for_reboot(self):
+        for txmbr in self.yumbase.tsInfo:
+            pkg = txmbr.po
+            # check if package is in reboot list and is installed/updated etc
+            print pkg.name,txmbr.output_state
+            if pkg.name in self.rebootpkgs and txmbr.ts_state in TS_INSTALL_STATES:
+                self.require_restart(RESTART_SYSTEM,"")
+                break
     
     def _runYumTransaction(self):
         '''
@@ -367,6 +382,7 @@ class PackageKitYumBackend(PackageKitBas
             retmsg = "Error in Dependency Resolution;" +";".join(msgs)
             self.error(ERROR_DEP_RESOLUTION_FAILED,retmsg)
         else:
+            self._check_for_reboot()
             try:
                 rpmDisplay = PackageKitCallback(self)
                 callback = ProcessTransPackageKitCallback(self)
diff-tree dba78a006f41de938bdd7e0b9bd6b7428e2c8a37 (from 6db6670f1cbb85bb4ef2f638d4ece7ca2d91d505)
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Tue Oct 2 12:32:21 2007 +0200

    fixed typo

diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 6febdeb..ccf4a24 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -395,7 +395,7 @@ class PackageKitYumBackend(PackageKitBas
             if txmbr:
                 self._runYumTransaction()
             else:
-                self.erhror(ERROR_PACKAGE_NOT_INSTALLED,"Package is not installed")
+                self.error(ERROR_PACKAGE_NOT_INSTALLED,"Package is not installed")
         else:
             self.error(ERROR_PACKAGE_NOT_INSTALLED,"Package is not installed")
 
diff-tree 6db6670f1cbb85bb4ef2f638d4ece7ca2d91d505 (from d549164970eb52827a21a456930dca5707a7ab38)
Author: Tim Lauridsen <tla at rasmil.dk>
Date:   Tue Oct 2 12:12:42 2007 +0200

    implement resolve in backend base & in yum backend

diff --git a/backends/yum/helpers/resolve.py b/backends/yum/helpers/resolve.py
new file mode 100755
index 0000000..bfb1216
--- /dev/null
+++ b/backends/yum/helpers/resolve.py
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+#
+# Copyright (C) 2007 Richard Hughes <richard at hughsie.com>
+#
+# Licensed under the GNU General Public License Version 2
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+import sys
+
+from yumBackend import PackageKitYumBackend
+name=sys.argv[1]
+backend = PackageKitYumBackend(sys.argv[1:])
+backend.resolve(name)
+sys.exit(0)
diff --git a/backends/yum/helpers/yumBackend.py b/backends/yum/helpers/yumBackend.py
index 65acde4..6febdeb 100644
--- a/backends/yum/helpers/yumBackend.py
+++ b/backends/yum/helpers/yumBackend.py
@@ -293,6 +293,31 @@ class PackageKitYumBackend(PackageKitBas
         except yum.Errors.YumBaseError, e:
             self.error(ERROR_INTERNAL_ERROR,str(e))
 
+    def _is_inst(self,name): # fast check for if package is installed
+        mi = self.yumbase.ts.ts.dbMatch('name', name)
+        if mi.count() > 0:
+            return True
+        return False         
+
+    def resolve(self, name):
+        '''
+        Implement the {backend}-resolve functionality
+        '''
+        # Get installed packages
+        installedByKey = self.yumbase.rpmdb.searchNevra(name=name)
+        for pkg in installedByKey:
+            self._show_package(pkg,INFO_INSTALLED)      
+        # Get availabe packages
+        for pkg in self.yumbase.pkgSack.returnNewestByNameArch():
+            if pkg.name == name:
+                show = True
+                for instpo in installedByKey:
+                    if pkg.EVR < instpo.EVR or pkg.EVR == instpo.EVR:  # Check if package have a smaller & equal EVR to a inst pkg
+                        show = False
+                if show:
+                    self._show_package(pkg,INFO_AVAILABLE)
+                    break
+
     def install(self, package):
         '''
         Implement the {backend}-install functionality
diff --git a/python/packagekit/backend.py b/python/packagekit/backend.py
index 8eca7b4..ca91976 100644
--- a/python/packagekit/backend.py
+++ b/python/packagekit/backend.py
@@ -229,6 +229,13 @@ class PackageKitBaseBackend:
         '''
         self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
 
+    def resolve(self, name):
+        '''
+        Implement the {backend}-resolve functionality
+        Needed to be implemented in a sub class
+        '''
+        self.error(ERROR_NOT_SUPPORTED,"This function is not implemented in this backend")
+
     def remove(self, allowdep, package):
         '''
         Implement the {backend}-remove functionality
diff-tree d549164970eb52827a21a456930dca5707a7ab38 (from 1dafd936ba21cfa0d8cd233fa05ae82b8511f145)
Author: Richard Hughes <richard at hughsie.com>
Date:   Tue Oct 2 00:20:06 2007 +0100

    update TODO

diff --git a/TODO b/TODO
index f5a2387..1f2eb3d 100644
--- a/TODO
+++ b/TODO
@@ -5,6 +5,11 @@ Do automatic updates at login time when 
  * needs gnome-screensaver integration
 NOTE: RELEASE BLOCKER
 
+*** don't output the same package in different repos ***
+Need to store Package() in the server properly, and compare the first chunk
+(not the data) to avoid reporting the same package more than once.
+NOTE: RELEASE BLOCKER
+
 *** Add new callback for status ***
 TimeRemaining()
  
diff-tree 1dafd936ba21cfa0d8cd233fa05ae82b8511f145 (from parents)
Merge: 1259cf9206fe47ba3de5b3249f1847163b1f70fc 48297dbb9e4af55686af6ccd272a441b035fa5f2
Author: Robin Norwood <rnorwood at redhat.com>
Date:   Mon Oct 1 16:08:24 2007 -0400

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

diff-tree 1259cf9206fe47ba3de5b3249f1847163b1f70fc (from f5432fe0048a6edffd53536a420f5a76650d707f)
Author: Robin Norwood <rnorwood at redhat.com>
Date:   Mon Oct 1 16:08:14 2007 -0400

    fix description of Resolve

diff --git a/python/packagekit/frontend.py b/python/packagekit/frontend.py
index 1ee56f9..9dc5a85 100644
--- a/python/packagekit/frontend.py
+++ b/python/packagekit/frontend.py
@@ -245,10 +245,10 @@ class PackageKit:
 
 	@dbusException
 	@job_id
-	def Resolve(self,package_id):
+	def Resolve(self,package_name):
 		"""
-		Resolves dependancies.
-		(description is a guess, since this not yet supported in yum backend, and maybe others)
+		Finds a package with the given name, and gives back a Package that matches that name exactly
+		(not yet supported in yum backend, and maybe others)
 		"""
 		return self.pk_iface.Resolve(self.tid(),package_id)
 


More information about the PackageKit mailing list