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;
}