[pacman-dev] [PATCH] Cleanup of _alpm_pkg_compare_versions.
From d8d35bb85e5f3eb89a1f68e528e25cafe2719790 Mon Sep 17 00:00:00 2001 From: Xavier Chantry <shiningxc@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 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 <shiningxc@gmail.com> --- 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
participants (1)
-
Xavier