[pacman-dev] bogus reinstalling message

Xavier shiningxc at gmail.com
Fri Aug 22 12:19:32 EDT 2008


On Fri, Aug 22, 2008 at 4:55 PM, Nagy Gabor <ngaba at bibl.u-szeged.hu> wrote:
>
> I am talking about "-S target" not about -Su (sync_newversion).
> 1. Target is newer:
> usual case, no warning
> 2. Reinstall was requested (local_ver == target_ver):
> Skipping/Reinstalling foo... (1.0-1 => 1.0-1)
> 3. Target is older:
> Downgrading foo... (2.0-1 => 1.0-1)
>

Ok then, I guess we more or less keep the same behavior.
We just need to make a better distinction between 2 and 3, which is
why I changed the _alpm_pkg_compare_versions function.

Here is a new patch (inlined for comments, attached to be sure that it
will apply cleanly)

>From 0cbe750a2fbaf0e43055d8c2c9a1b3dcec7089b9 Mon Sep 17 00:00:00 2001
From: Xavier Chantry <shiningxc at gmail.com>
Date: Sat, 31 May 2008 15:06:30 +0200
Subject: [PATCH] Cleanup of _alpm_pkg_compare_versions.

* Change the return values to be more informative.

It was previously boolean, only indicating if one package was newer than the
other or not.

Now it is a simple wrapper to vercmp, handling the force flag.

* Remove the verbose output. This belongs somewhere else.

* Don't display the "up to date -- skipping" and "up to date -- reinstalling"
messages, when the local version is newer than the sync one.

* Fix the behavior of --needed option to not skip a target when the local
version is newer, and clarify its description.

* Add a new alpm_pkg_has_force function

This allows us to access the pkg->force field like any other package fields.

Signed-off-by: Xavier Chantry <shiningxc at gmail.com>
---
 doc/pacman.8.txt      |    2 +-
 lib/libalpm/alpm.h    |    1 +
 lib/libalpm/package.c |   37 ++++++++++++++++++-------------------
 lib/libalpm/sync.c    |   20 +++++++++++++-------
 src/pacman/pacman.c   |    2 +-
 5 files changed, 34 insertions(+), 28 deletions(-)

diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 0a632ea..6f071ba 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -308,7 +308,7 @@ linkman:pacman.conf[5].
 	to date.

 *\--needed*::
-	Only install the targets that are not already installed and up-to-date.
+	Don't reinstall the targets that are already up-to-date.

 *\--ignore* <'package'>::
 	Directs pacman to ignore upgrades of package even if there is one
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index fbef057..16b48a0 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -224,6 +224,7 @@ size_t alpm_pkg_changelog_read(void *ptr, size_t size,
 /*int alpm_pkg_changelog_feof(const pmpkg_t *pkg, void *fp);*/
 int alpm_pkg_changelog_close(const pmpkg_t *pkg, void *fp);
 unsigned short alpm_pkg_has_scriptlet(pmpkg_t *pkg);
+unsigned short alpm_pkg_has_force(pmpkg_t *pkg);

 off_t alpm_pkg_download_size(pmpkg_t *newpkg);

diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index 49238ea..b1b688b 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -295,6 +295,20 @@ alpm_list_t SYMEXPORT *alpm_pkg_get_groups(pmpkg_t *pkg)
 	return pkg->groups;
 }

+unsigned short SYMEXPORT alpm_pkg_has_force(pmpkg_t *pkg)
+{
+	ALPM_LOG_FUNC;
+
+	/* Sanity checks */
+	ASSERT(handle != NULL, return(-1));
+	ASSERT(pkg != NULL, return(-1));
+
+	if(pkg->origin == PKG_FROM_CACHE && !(pkg->infolevel & INFRQ_DESC)) {
+		_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);
+	}
+	return pkg->force;
+}
+
 alpm_list_t SYMEXPORT *alpm_pkg_get_depends(pmpkg_t *pkg)
 {
 	ALPM_LOG_FUNC;
@@ -827,32 +841,17 @@ void _alpm_pkg_free(pmpkg_t *pkg)
 	FREE(pkg);
 }

-/* Is pkgB an upgrade for pkgA ? */
-int _alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg)
+/* Compare the versions of two packages, handling the force flag */
+int _alpm_pkg_compare_versions(pmpkg_t *pkg1, pmpkg_t *pkg2)
 {
 	int cmp = 0;

 	ALPM_LOG_FUNC;

-	if(pkg->origin == PKG_FROM_CACHE) {
-		/* ensure we have the /desc file, which contains the 'force' option */
-		_alpm_db_read(pkg->origin_data.db, pkg, INFRQ_DESC);
-	}
-
-	/* compare versions and see if we need to upgrade */
-	cmp = alpm_pkg_vercmp(alpm_pkg_get_version(pkg),
alpm_pkg_get_version(local_pkg));
+	cmp = alpm_pkg_vercmp(alpm_pkg_get_version(pkg1), alpm_pkg_get_version(pkg2));

-	if(cmp != 0 && pkg->force) {
+	if(cmp < 0 && alpm_pkg_has_force(pkg)) {
 		cmp = 1;
-		_alpm_log(PM_LOG_WARNING, _("%s: forcing upgrade to version %s\n"),
-							alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg));
-	} else if(cmp < 0) {
-		/* local version is newer */
-		pmdb_t *db = pkg->origin_data.db;
-		_alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"),
-							alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg),
-							alpm_db_get_name(db), alpm_pkg_get_version(pkg));
-		cmp = 0;
 	}

 	return(cmp);
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index 7a577a1..b78e7d3 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -182,7 +182,7 @@ pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t
*pkg, alpm_list_t *dbs_sync)
 	}

 	/* compare versions and see if spkg is an upgrade */
-	if(_alpm_pkg_compare_versions(pkg, spkg)) {
+	if(_alpm_pkg_compare_versions(pkg, spkg) > 0) {
 		_alpm_log(PM_LOG_DEBUG, "new version of '%s' found (%s => %s)\n",
 					alpm_pkg_get_name(pkg), alpm_pkg_get_version(pkg),
 					alpm_pkg_get_version(spkg));
@@ -326,18 +326,24 @@ int _alpm_sync_addtarget(pmtrans_t *trans,
pmdb_t *db_local, alpm_list_t *dbs_sy

 	local = _alpm_db_get_pkgfromcache(db_local, alpm_pkg_get_name(spkg));
 	if(local) {
-		if(_alpm_pkg_compare_versions(local, spkg) == 0) {
-			/* spkg is NOT an upgrade */
+		int cmp = _alpm_pkg_compare_versions(spkg, local);
+		if(cmp == 0) {
 			if(trans->flags & PM_TRANS_FLAG_NEEDED) {
+				/* with the NEEDED flag, packages up to date are not reinstalled */
 				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- skipping\n"),
 						alpm_pkg_get_name(local), alpm_pkg_get_version(local));
 				return(0);
 			} else {
-				if(!(trans->flags & PM_TRANS_FLAG_DOWNLOADONLY)) {
-					_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"),
-							alpm_pkg_get_name(local), alpm_pkg_get_version(local));
-				}
+				_alpm_log(PM_LOG_WARNING, _("%s-%s is up to date -- reinstalling\n"),
+						alpm_pkg_get_name(local), alpm_pkg_get_version(local));
+
 			}
+		} else if(cmp < 0) {
+			/* local version is newer */
+			pmdb_t *db = spkg->origin_data.db;
+			_alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"),
+					alpm_pkg_get_name(local), alpm_pkg_get_version(local),
+					alpm_db_get_name(db), alpm_pkg_get_version(spkg));
 		}
 	}

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 33df4e1..04b5e49 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -130,7 +130,7 @@ static void usage(int op, const char * const myname)
 			printf(_("  -u, --sysupgrade     upgrade all packages that are out
of date\n"));
 			printf(_("  -w, --downloadonly   download packages but do not
install/upgrade anything\n"));
 			printf(_("  -y, --refresh        download fresh package databases
from the server\n"));
-			printf(_("      --needed         only upgrade outdated or not yet
installed packages\n"));
+			printf(_("      --needed         don't reinstall up to date packages\n"));
 			printf(_("      --ignore <pkg>   ignore a package upgrade (can be
used more than once)\n"));
 			printf(_("      --ignoregroup <grp>\n"
 			         "                       ignore a group upgrade (can be
used more than once)\n"));
-- 
1.5.6.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0008-Cleanup-of-_alpm_pkg_compare_versions.patch
Type: application/mbox
Size: 6787 bytes
Desc: not available
URL: <http://archlinux.org/pipermail/pacman-dev/attachments/20080822/f318aad3/attachment.bin>


More information about the pacman-dev mailing list