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 <ngaba@bibl.u-szeged.hu>
[Dan: slight doc reword]
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
Nagy Gabor 2009-05-14 18:25:16 +02:00 committed by Dan McGee
parent ca6ef852f9
commit 1d19f0896c
8 changed files with 38 additions and 11 deletions

View file

@ -327,7 +327,10 @@ linkman:pacman.conf[5].
report of all packages to upgrade will be presented and the operation report of all packages to upgrade will be presented and the operation
will not proceed without user confirmation. Dependencies are will not proceed without user confirmation. Dependencies are
automatically resolved at this level and will be installed/upgraded if 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*:: *-w, \--downloadonly*::
Retrieve all packages from the server, but do not install/upgrade Retrieve all packages from the server, but do not install/upgrade

View file

@ -397,7 +397,7 @@ alpm_list_t * alpm_trans_get_pkgs();
int alpm_trans_init(pmtranstype_t type, pmtransflag_t flags, int alpm_trans_init(pmtranstype_t type, pmtransflag_t flags,
alpm_trans_cb_event cb_event, alpm_trans_cb_conv conv, alpm_trans_cb_event cb_event, alpm_trans_cb_conv conv,
alpm_trans_cb_progress cb_progress); 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_addtarget(char *target);
int alpm_trans_prepare(alpm_list_t **data); int alpm_trans_prepare(alpm_list_t **data);
int alpm_trans_commit(alpm_list_t **data); int alpm_trans_commit(alpm_list_t **data);

View file

@ -80,7 +80,7 @@ pmpkg_t SYMEXPORT *alpm_sync_newversion(pmpkg_t *pkg, alpm_list_t *dbs_sync)
return(NULL); 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; alpm_list_t *i, *j, *k;
@ -116,9 +116,21 @@ int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_s
trans->packages = alpm_list_add(trans->packages, spkg); trans->packages = alpm_list_add(trans->packages, spkg);
} }
} else if(cmp < 0) { } else if(cmp < 0) {
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"), _alpm_log(PM_LOG_WARNING, _("%s: local (%s) is newer than %s (%s)\n"),
lpkg->name, lpkg->version, sdb->treename, spkg->version); lpkg->name, lpkg->version, sdb->treename, spkg->version);
} }
}
break; /* jump to next local package */ break; /* jump to next local package */
} else { /* 2. search for replacers in sdb */ } else { /* 2. search for replacers in sdb */
int found = 0; int found = 0;

View file

@ -24,7 +24,7 @@
#include "alpm.h" #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_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); int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, alpm_list_t **data);

View file

@ -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. /** Search for packages to upgrade and add them to the transaction.
* @return 0 on success, -1 on error (pm_errno is set accordingly) * @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; 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->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)); 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. /** Add a target to the transaction.

12
pactest/tests/sync104.py Normal file
View file

@ -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")

View file

@ -130,7 +130,7 @@ static void usage(int op, const char * const myname)
printf(_(" -l, --list <repo> view a list of packages in a repo\n")); printf(_(" -l, --list <repo> view a list of packages in a repo\n"));
printf(_(" -p, --print-uris print out URIs for given packages and their dependencies\n")); printf(_(" -p, --print-uris print out URIs for given packages and their dependencies\n"));
printf(_(" -s, --search <regex> search remote repositories for matching strings\n")); printf(_(" -s, --search <regex> 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(_(" -w, --downloadonly download packages but do not install/upgrade anything\n"));
printf(_(" -y, --refresh download fresh package databases from the server\n")); printf(_(" -y, --refresh download fresh package databases from the server\n"));
printf(_(" --needed don't reinstall up to date packages\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; config->op_q_unrequired = 1;
break; break;
case 'u': case 'u':
config->op_s_upgrade = 1; (config->op_s_upgrade)++;
config->op_q_upgrade = 1; config->op_q_upgrade = 1;
config->flags |= PM_TRANS_FLAG_UNNEEDED; config->flags |= PM_TRANS_FLAG_UNNEEDED;
break; break;

View file

@ -563,7 +563,7 @@ static int sync_trans(alpm_list_t *targets)
if(config->op_s_upgrade) { if(config->op_s_upgrade) {
printf(_(":: Starting full system upgrade...\n")); printf(_(":: Starting full system upgrade...\n"));
alpm_logaction("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()); pm_fprintf(stderr, PM_LOG_ERROR, "%s\n", alpm_strerrorlast());
retval = 1; retval = 1;
goto cleanup; goto cleanup;