>From d8d35bb85e5f3eb89a1f68e528e25cafe2719790 Mon Sep 17 00:00:00 2001
From: Xavier Chantry <[EMAIL PROTECTED]>
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 the sync pkg was newer than
local pkg or not.
Now it is a cmp function : -1 if sync pkg is older, 0 if same version, 1 if
newer.

* Add a new alpm_pkg_has_force function to access the pkg->force field like
any other package fields.

* Remove the not so useful and confusing "skipping" and "reinstalling"
messages, which were also cluttering the -Sp and -Sw output.

* Clarify the description of the --needed option.

Signed-off-by: Xavier Chantry <[EMAIL PROTECTED]>
---
 doc/pacman.8.txt      |    2 +-
 lib/libalpm/alpm.h    |    1 +
 lib/libalpm/package.c |   25 ++++++++++++++++---------
 lib/libalpm/sync.c    |   19 ++++++-------------
 src/pacman/pacman.c   |    2 +-
 5 files changed, 25 insertions(+), 24 deletions(-)

diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index a6bc3d9..ccdabe6 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -291,7 +291,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 62a517b..9c08033 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -220,6 +220,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);

 unsigned long alpm_pkg_download_size(pmpkg_t *newpkg);

diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index 07b5fa3..4d6da01 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;
@@ -817,22 +831,16 @@ void _alpm_pkg_free(pmpkg_t *pkg)
        FREE(pkg);
 }

-/* Is pkgB an upgrade for pkgA ? */
+/* Compare the versions of two packages, handling the force flag */
 int _alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg)
 {
        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));

-       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));
@@ -842,7 +850,6 @@ int _alpm_pkg_compare_versions(pmpkg_t *local_pkg,
pmpkg_t *pkg)
                _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 0d6a6ee..d44f445 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -179,7 +179,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));
@@ -322,6 +322,7 @@ int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t
*db_local, alpm_list_t *dbs_sy
                RET_ERR(PM_ERR_TRANS_DUP_TARGET, -1);
        }

+       /* this is especially useful when installing a group */
        if(_alpm_pkg_should_ignore(spkg)) {
                int resp;
                QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, spkg, NULL, 
NULL, &resp);
@@ -332,18 +333,10 @@ 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 */
-                       if(trans->flags & PM_TRANS_FLAG_NEEDED) {
-                               _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));
-                               }
-                       }
+               int cmp = _alpm_pkg_compare_versions(local, spkg);
+               if(cmp == 0 && trans->flags & PM_TRANS_FLAG_NEEDED) {
+                       /* with the NEEDED flag, packages up to date are not 
reinstalled */
+                       return(0);
                }
        }

diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index 66fafa1..8e8f058 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -123,7 +123,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.5.1

_______________________________________________
pacman-dev mailing list
[email protected]
http://archlinux.org/mailman/listinfo/pacman-dev

Reply via email to