This patch returns the highest package version installed instead of the
first one found (as was the case before). It avoids always suggesting
update to already installed version. It works at least with
kernel-source (the only one test case I have).  Comments are welcome.

-andrej

--- utils.c.orig        Fri Dec  7 21:35:29 2001
+++ utils.c     Sat Feb  2 14:42:20 2002
@@ -252,6 +252,21 @@
   return strcmp(pack->name, name);
 }
 
+gint compare_rpm_version(int old_epoch, gchar *old_ver, gchar *old_rel, int 
+new_epoch, gchar *new_ver, gchar *new_rel)
+{
+  int compare;
+
+  compare = new_epoch >= 0 ? new_epoch - old_epoch : 0;
+  if (compare == 0) {
+    compare = rpmvercmp(old_ver, new_ver);
+    if (compare == 0) {
+      compare = rpmvercmp(old_rel, new_rel);
+    }
+  }
+
+  return compare;
+}
+
 /**
 * \brief Check if a package is currently installed, and return its version
 *        and release
@@ -269,20 +284,31 @@
 {
   gboolean  ret_val = FALSE;
   GSList   *package;
+  int       cur_epoch = 0;
+  gchar    *cur_ver = NULL;
+  gchar    *cur_rel = NULL;
 
+  *epoch = 0;
   *release = NULL;
   *version = NULL;
   
-  package = g_slist_find_custom(installed_packages, name,
-                                (GCompareFunc)is_installed_compare_func);
-  
-  if (package)
+  for (package = installed_packages; package; package = g_slist_next(package)) 
+    if (is_installed_compare_func(package->data, name) == 0) {
+      installed_list_package *pack = package->data;
+      if (cur_ver == NULL ||
+         compare_rpm_version (cur_epoch, cur_ver, cur_rel,
+                              pack->epoch, pack->version, pack->release)) {
+       cur_epoch = pack->epoch;
+       cur_ver   = pack->version;
+       cur_rel   = pack->release;
+      }
+    }
+  if (cur_ver)
   {
-    installed_list_package *pack = package->data;
-    ret_val = TRUE;
-    *release = g_strdup(pack->release);
-    *version = g_strdup(pack->version);
-    *epoch = pack->epoch;
+    ret_val  = TRUE;
+    *release = g_strdup(cur_rel);
+    *version = g_strdup(cur_ver);
+    *epoch   = cur_epoch;
   }
   return ret_val;
 }



Reply via email to