From 1d19f0896ccc1560a7e2f5b93cfe095b4aefe84a Mon Sep 17 00:00:00 2001 From: Nagy Gabor Date: Thu, 14 May 2009 18:25:16 +0200 Subject: Introduce -Suu If the user switches from unstable repo to a stable one, it is quite hard to sync its system with the new repo (the user will see many "Local is newer than stable" messages, nothing more). That's why I introduced -Suu, which treats a sync package like an upgrade, iff the package version doesn't match with the local one's. I added a new pactest (sync104.py) to test this, and I updated the documentation of -Su. Signed-off-by: Nagy Gabor [Dan: slight doc reword] Signed-off-by: Dan McGee --- doc/pacman.8.txt | 5 ++++- lib/libalpm/alpm.h | 2 +- lib/libalpm/sync.c | 18 +++++++++++++++--- lib/libalpm/sync.h | 2 +- lib/libalpm/trans.c | 4 ++-- pactest/tests/sync104.py | 12 ++++++++++++ src/pacman/pacman.c | 4 ++-- src/pacman/sync.c | 2 +- 8 files changed, 38 insertions(+), 11 deletions(-) create mode 100644 pactest/tests/sync104.py diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt index b56ad6b5..b288a592 100644 --- a/doc/pacman.8.txt +++ b/doc/pacman.8.txt @@ -327,7 +327,10 @@ linkman:pacman.conf[5]. report of all packages to upgrade will be presented and the operation will not proceed without user confirmation. Dependencies are automatically resolved at this level and will be installed/upgraded if - necessary. + necessary. Pass this option twice to enable package downgrade; in this + case pacman will select sync packages whose version does not match with + the local version. This can be useful when the user switches from a testing + repo to a stable one. *-w, \--downloadonly*:: Retrieve all packages from the server, but do not install/upgrade diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index e46942d9..5285ac39 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -397,7 +397,7 @@ alpm_list_t * alpm_trans_get_pkgs(); int alpm_trans_init(pmtranstype_t type, pmtransflag_t flags, alpm_trans_cb_event cb_event, alpm_trans_cb_conv conv, alpm_trans_cb_progress cb_progress); -int alpm_trans_sysupgrade(void); +int alpm_trans_sysupgrade(int enable_downgrade); int alpm_trans_addtarget(char *target); int alpm_trans_prepare(alpm_list_t **data); int alpm_trans_commit(alpm_list_t **data); diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index ffcddf98..47639248 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -80,7 +80,7 @@ pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync) return(NULL); } -int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync) +int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, int enable_downgrade) { alpm_list_t *i, *j, *k; @@ -116,8 +116,20 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s trans->packages = alpm_list_add(trans->packages, spkg); } } else if(cmp < 0) { - _alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"), - lpkg->name, lpkg->version, sdb->treename, spkg->version); + if(enable_downgrade) { + /* check IgnorePkg/IgnoreGroup */ + if(_alpm_pkg_should_ignore(spkg) || _alpm_pkg_should_ignore(lpkg)) { + _alpm_log(PM_LOG_WARNING, _("%s: ignoring package downgrade (%s => %s)\n"), + lpkg->name, lpkg->version, spkg->version); + } else { + _alpm_log(PM_LOG_WARNING, _("%s: downgrading from version %s to version %s\n"), + lpkg->name, lpkg->version, spkg->version); + trans->packages = alpm_list_add(trans->packages, spkg); + } + } else { + _alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"), + lpkg->name, lpkg->version, sdb->treename, spkg->version); + } } break; /* jump to next local package */ } else { /* 2. search for replacers in sdb */ diff --git a/lib/libalpm/sync.h b/lib/libalpm/sync.h index 5d642073..c2905a45 100644 --- a/lib/libalpm/sync.h +++ b/lib/libalpm/sync.h @@ -24,7 +24,7 @@ #include "alpm.h" -int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync); +int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, int enable_downgrade); int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, char *name); int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data); diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index d1c0e930..6e847e64 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -89,7 +89,7 @@ int SYMEXPORT alpm_trans_init(pmtranstype_t type, pmtransflag_t flags, /** Search for packages to upgrade and add them to the transaction. * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int SYMEXPORT alpm_trans_sysupgrade() +int SYMEXPORT alpm_trans_sysupgrade(int enable_downgrade) { pmtrans_t *trans; @@ -102,7 +102,7 @@ int SYMEXPORT alpm_trans_sysupgrade() ASSERT(trans->state == STATE_INITIALIZED, RET_ERR(PM_ERR_TRANS_NOT_INITIALIZED, -1)); ASSERT(trans->type == PM_TRANS_TYPE_SYNC, RET_ERR(PM_ERR_TRANS_TYPE, -1)); - return(_alpm_sync_sysupgrade(trans, handle->db_local, handle->dbs_sync)); + return(_alpm_sync_sysupgrade(trans, handle->db_local, handle->dbs_sync, enable_downgrade)); } /** Add a target to the transaction. diff --git a/pactest/tests/sync104.py b/pactest/tests/sync104.py new file mode 100644 index 00000000..6d51b85a --- /dev/null +++ b/pactest/tests/sync104.py @@ -0,0 +1,12 @@ +self.description = "-Suu" + +sp = pmpkg("dummy", "0.9-1") +lp = pmpkg("dummy", "1.0-1") + +self.addpkg2db("sync", sp) +self.addpkg2db("local", lp) + +self.args = "-Suu" + +self.addrule("PACMAN_RETCODE=0") +self.addrule("PKG_VERSION=dummy|0.9-1") diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c index 48d45ad1..d5e600a5 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(_(" -l, --list view a list of packages in a repo\n")); printf(_(" -p, --print-uris print out URIs for given packages and their dependencies\n")); printf(_(" -s, --search search remote repositories for matching strings\n")); - printf(_(" -u, --sysupgrade upgrade all packages that are out of date\n")); + printf(_(" -u, --sysupgrade upgrade all outdated packages (-uu enables downgrade)\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 don't reinstall up to date packages\n")); @@ -508,7 +508,7 @@ static int parseargs(int argc, char *argv[]) config->op_q_unrequired = 1; break; case 'u': - config->op_s_upgrade = 1; + (config->op_s_upgrade)++; config->op_q_upgrade = 1; config->flags |= PM_TRANS_FLAG_UNNEEDED; break; diff --git a/src/pacman/sync.c b/src/pacman/sync.c index cb0b8b19..4da65400 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -563,7 +563,7 @@ static int sync_trans(alpm_list_t *targets) if(config->op_s_upgrade) { printf(_(":: Starting full system upgrade...\n")); alpm_logaction("starting full system upgrade\n"); - if(alpm_trans_sysupgrade() == -1) { + if(alpm_trans_sysupgrade(config->op_s_upgrade >= 2) == -1) { pm_fprintf(stderr, PM_LOG_ERROR, "%s\n", alpm_strerrorlast()); retval = 1; goto cleanup; -- cgit v1.2.3-24-g4f1b