See http://projects.archlinux.org/git/?p=pacman.git;a=commit;h=63000584b6442412d... TODO: move the implementation to upgrades.c, and reimplement the sync_sysupgrade function in terms of this: trans->packages = alpm_get_upgrades(); I took a slightly different approach : change sync_sysupgrade slightly to also return a list of sync packages. So sync_sysupgrade might still ask questions to the user, but this can be disabled by passing a NULL trans argument. In case trans is not null, sync_sysupgrade will set trans->packages to the list of upgrades. In both cases, it'll return the list of upgrades.
From ddbfb04293e28738d859da53ad09192889afbb6d Mon Sep 17 00:00:00 2001 From: Chantry Xavier <shiningxc@gmail.com> Date: Sat, 25 Aug 2007 00:10:40 +0200 Subject: [PATCH] Remove duplicated get_upgrades function, use sysupgrade instead.
The alpm_get_upgrades was exactly the same as _alpm_sync_sysupgrade, except that it didn't ask for confirmation. There are two kind of questions asked : %s is in IgnorePkg. Install anyway? [Y/n] Replace %s with %s/%s? [Y/n] The first question was actually never asked, because alpm_pkg_compare_versions already ignored the packages in IgnorePkg. I removed the IgnorePkg handling from alpm_pkg_compare_versions, but kept the same behavior with _alpm_sync_sysupgrade, that is ignore packages automatically, without confirmation. The replace question is asked in _alpm_find_replacements. This question can be skipped by using a NULL trans argument, so that we get the same behavior as with alpm_get_upgrades. alpm_db_get_upgrades() can now be replaced by : alpm_sync_sysupgrade(NULL, db_local, syncdbs). Signed-off-by: Chantry Xavier <shiningxc@gmail.com> --- lib/libalpm/alpm.h | 3 +- lib/libalpm/db.c | 141 -------------------------------- lib/libalpm/package.c | 10 --- lib/libalpm/sync.c | 213 +++++++++++++++++++++++++++---------------------- lib/libalpm/sync.h | 1 - lib/libalpm/trans.c | 3 +- src/pacman/query.c | 4 +- 7 files changed, 124 insertions(+), 251 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 844d9bf..62de9a1 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -163,8 +163,6 @@ alpm_list_t *alpm_db_getgrpcache(pmdb_t *db); alpm_list_t *alpm_db_test(pmdb_t *db); alpm_list_t *alpm_db_search(pmdb_t *db, const alpm_list_t* needles); -alpm_list_t *alpm_db_get_upgrades(void); - /* * Packages */ @@ -237,6 +235,7 @@ typedef enum _pmsynctype_t { pmsynctype_t alpm_sync_get_type(const pmsyncpkg_t *sync); pmpkg_t *alpm_sync_get_pkg(const pmsyncpkg_t *sync); void *alpm_sync_get_data(const pmsyncpkg_t *sync); +alpm_list_t *alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync); /* * Transactions diff --git a/lib/libalpm/db.c b/lib/libalpm/db.c index 0cb375d..0da935e 100644 --- a/lib/libalpm/db.c +++ b/lib/libalpm/db.c @@ -46,8 +46,6 @@ #include "cache.h" #include "alpm.h" -#include "sync.h" /* alpm_db_get_upgrades() */ - /** \addtogroup alpm_databases Database Functions * @brief Functions to query and manipulate the database of libalpm * @{ @@ -440,145 +438,6 @@ alpm_list_t SYMEXPORT *alpm_db_search(pmdb_t *db, const alpm_list_t* needles) return(_alpm_db_search(db, needles)); } -/* This function is mostly the same as sync.c find_replacements and sysupgrade - * functions, and we should be able to combine them - this is an interim - * solution made for -Qu operation */ -/** Get a list of upgradable packages on the current system - * @return a pmsyncpkg_t list of packages that are out of date - */ -alpm_list_t SYMEXPORT *alpm_db_get_upgrades(void) -{ - alpm_list_t *syncpkgs = NULL; - const alpm_list_t *i, *j, *k, *m; - - ALPM_LOG_FUNC; - - /* TODO holy nested loops, Batman! */ - /* check for "recommended" package replacements */ - _alpm_log(PM_LOG_DEBUG, "checking for package replacements"); - for(i = handle->dbs_sync; i; i = i->next) { - for(j = _alpm_db_get_pkgcache(i->data); j; j = j->next) { - pmpkg_t *spkg = j->data; - - for(k = alpm_pkg_get_replaces(spkg); k; k = k->next) { - - for(m = _alpm_db_get_pkgcache(handle->db_local); m; m = m->next) { - pmpkg_t *lpkg = m->data; - - if(strcmp(k->data, alpm_pkg_get_name(lpkg)) == 0) { - _alpm_log(PM_LOG_DEBUG, "checking replacement '%s' for package '%s'", - k->data, alpm_pkg_get_name(spkg)); - if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(lpkg))) { - _alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (to be replaced by %s-%s)"), - alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), - alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); - } else { - /* assume all replaces=() packages are accepted */ - pmsyncpkg_t *sync = NULL; - pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL); - if(dummy == NULL) { - pm_errno = PM_ERR_MEMORY; - goto error; - } - dummy->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(lpkg)); - - pmsyncpkg_t *syncpkg; - syncpkg = _alpm_sync_find(syncpkgs, alpm_pkg_get_name(spkg)); - - if(syncpkg) { - /* found it -- just append to the replaces list */ - sync->data = alpm_list_add(sync->data, dummy); - } else { - /* none found -- enter pkg into the final sync list */ - sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL); - if(sync == NULL) { - _alpm_pkg_free(dummy); - pm_errno = PM_ERR_MEMORY; - goto error; - } - sync->data = alpm_list_add(NULL, dummy); - syncpkgs = alpm_list_add(syncpkgs, sync); - } - _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)", - alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), - alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); - } - break; - } - } - } - } - } - - /* now do normal upgrades */ - for(i = _alpm_db_get_pkgcache(handle->db_local); i; i = i->next) { - int replace=0; - pmpkg_t *local = i->data; - pmpkg_t *spkg = NULL; - pmsyncpkg_t *sync; - - for(j = handle->dbs_sync; !spkg && j; j = j->next) { - spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local)); - } - if(spkg == NULL) { - _alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping", - alpm_pkg_get_name(local)); - continue; - } - - /* we don't care about a to-be-replaced package's newer version */ - for(j = syncpkgs; j && !replace; j=j->next) { - sync = j->data; - if(sync->type == PM_SYNC_TYPE_REPLACE) { - if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) { - replace=1; - } - } - } - if(replace) { - _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping", - alpm_pkg_get_name(local)); - continue; - } - - if(alpm_pkg_compare_versions(local, spkg)) { - _alpm_log(PM_LOG_DEBUG, "%s elected for upgrade (%s => %s)", - alpm_pkg_get_name(local), alpm_pkg_get_version(local), - alpm_pkg_get_version(spkg)); - - pmsyncpkg_t *syncpkg; - syncpkg = _alpm_sync_find(syncpkgs, alpm_pkg_get_name(local)); - - if(!syncpkg) { - pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(local), - alpm_pkg_get_version(local)); - if(dummy == NULL) { - goto error; - } - sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, dummy); - if(sync == NULL) { - _alpm_pkg_free(dummy); - goto error; - } - syncpkgs = alpm_list_add(syncpkgs, sync); - } - } - } - - return(syncpkgs); -error: - if(syncpkgs) { - alpm_list_t *tmp; - for(tmp = syncpkgs; tmp; tmp = alpm_list_next(tmp)) { - if(tmp->data) { - _alpm_sync_free(tmp->data); - } - } - alpm_list_free(syncpkgs); - } - return(NULL); -} - /** @} */ pmdb_t *_alpm_db_new(const char *dbpath, const char *treename) diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c index 86c19d3..b630102 100644 --- a/lib/libalpm/package.c +++ b/lib/libalpm/package.c @@ -727,16 +727,6 @@ int alpm_pkg_compare_versions(pmpkg_t *local_pkg, pmpkg_t *pkg) /* compare versions and see if we need to upgrade */ cmp = _alpm_versioncmp(alpm_pkg_get_version(pkg), alpm_pkg_get_version(local_pkg)); - if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(pkg))) { - /* package should be ignored (IgnorePkg) */ - if(cmp > 0) { - _alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s)"), - alpm_pkg_get_name(local_pkg), alpm_pkg_get_version(local_pkg), - alpm_pkg_get_version(pkg)); - } - return(0); - } - if(cmp != 0 && pkg->force) { cmp = 1; _alpm_log(PM_LOG_WARNING, _("%s: forcing upgrade to version %s"), diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 8aabcdb..edb406f 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -90,13 +90,27 @@ void _alpm_sync_free(pmsyncpkg_t *sync) FREE(sync); } +void _alpm_synclist_free(alpm_list_t *syncpkgs) +{ + if(syncpkgs) { + alpm_list_t *tmp; + for(tmp = syncpkgs; tmp; tmp = alpm_list_next(tmp)) { + if(tmp->data) { + _alpm_sync_free(tmp->data); + } + } + alpm_list_free(syncpkgs); + } + +} + /* Find recommended replacements for packages during a sync. - * (refactored from _alpm_sync_prepare) */ -static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, +static alpm_list_t *_alpm_find_replacements(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync) { alpm_list_t *i, *j, *k; /* wow */ + alpm_list_t *syncpkgs = NULL; ALPM_LOG_FUNC; @@ -127,124 +141,133 @@ static int find_replacements(pmtrans_t *trans, pmdb_t *db_local, alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); } else { /* get confirmation for the replacement */ - int doreplace = 0; - QUESTION(trans, PM_TRANS_CONV_REPLACE_PKG, lpkg, spkg, db->treename, &doreplace); + if(trans) { + int doreplace = 0; + QUESTION(trans, PM_TRANS_CONV_REPLACE_PKG, lpkg, spkg, db->treename, &doreplace); + if(!doreplace) { + continue; + } + } - if(doreplace) { - /* if confirmed, add this to the 'final' list, designating 'lpkg' as - * the package to replace. - */ - pmsyncpkg_t *sync; - pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL); - if(dummy == NULL) { + /* if confirmed, add this to the 'final' list, designating 'lpkg' as + * the package to replace. + */ + pmsyncpkg_t *sync; + pmpkg_t *dummy = _alpm_pkg_new(alpm_pkg_get_name(lpkg), NULL); + if(dummy == NULL) { + pm_errno = PM_ERR_MEMORY; + _alpm_synclist_free(syncpkgs); + return(NULL); + } + dummy->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(lpkg)); + /* check if spkg->name is already in the packages list. */ + sync = _alpm_sync_find(syncpkgs, alpm_pkg_get_name(spkg)); + if(sync) { + /* found it -- just append to the replaces list */ + sync->data = alpm_list_add(sync->data, dummy); + } else { + /* none found -- enter pkg into the final sync list */ + sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL); + if(sync == NULL) { + _alpm_pkg_free(dummy); pm_errno = PM_ERR_MEMORY; - goto error; + _alpm_synclist_free(syncpkgs); + return(NULL); } - dummy->requiredby = alpm_list_strdup(alpm_pkg_get_requiredby(lpkg)); - /* check if spkg->name is already in the packages list. */ - sync = _alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg)); - if(sync) { - /* found it -- just append to the replaces list */ - sync->data = alpm_list_add(sync->data, dummy); - } else { - /* none found -- enter pkg into the final sync list */ - sync = _alpm_sync_new(PM_SYNC_TYPE_REPLACE, spkg, NULL); - if(sync == NULL) { - _alpm_pkg_free(dummy); - pm_errno = PM_ERR_MEMORY; - goto error; - } - sync->data = alpm_list_add(NULL, dummy); - trans->packages = alpm_list_add(trans->packages, sync); - } - _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)", - alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), - alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); + sync->data = alpm_list_add(NULL, dummy); + syncpkgs = alpm_list_add(syncpkgs, sync); } + _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (to be replaced by %s-%s)", + alpm_pkg_get_name(lpkg), alpm_pkg_get_version(lpkg), + alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); } } } } - return(0); -error: - return(-1); + return(syncpkgs); } -/* TODO reimplement this in terms of alpm_get_upgrades */ -int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync) +/** Get a list of upgradable packages on the current system + * @return a pmsyncpkg_t list of packages that are out of date + */ +alpm_list_t SYMEXPORT *alpm_sync_sysupgrade(pmtrans_t *trans, + pmdb_t *db_local, alpm_list_t *dbs_sync) { + alpm_list_t *syncpkgs = NULL; alpm_list_t *i, *j; ALPM_LOG_FUNC; /* check for "recommended" package replacements */ - if(find_replacements(trans, db_local, dbs_sync) == 0) { - /* match installed packages with the sync dbs and compare versions */ - _alpm_log(PM_LOG_DEBUG, "checking for package upgrades"); - for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) { - int replace=0; - pmpkg_t *local = i->data; - pmpkg_t *spkg = NULL; - pmsyncpkg_t *sync; - - for(j = dbs_sync; !spkg && j; j = j->next) { - spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local)); - } - if(spkg == NULL) { - _alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping", - alpm_pkg_get_name(local)); - continue; - } + syncpkgs = _alpm_find_replacements(trans, db_local, dbs_sync); + + /* match installed packages with the sync dbs and compare versions */ + _alpm_log(PM_LOG_DEBUG, "checking for package upgrades"); + for(i = _alpm_db_get_pkgcache(db_local); i; i = i->next) { + int replace=0; + pmpkg_t *local = i->data; + pmpkg_t *spkg = NULL; + pmsyncpkg_t *sync; + + for(j = dbs_sync; !spkg && j; j = j->next) { + spkg = _alpm_db_get_pkgfromcache(j->data, alpm_pkg_get_name(local)); + } + if(spkg == NULL) { + _alpm_log(PM_LOG_DEBUG, "'%s' not found in sync db -- skipping", + alpm_pkg_get_name(local)); + continue; + } - /* we don't care about a to-be-replaced package's newer version */ - for(j = trans->packages; j && !replace; j=j->next) { - sync = j->data; - if(sync->type == PM_SYNC_TYPE_REPLACE) { - if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) { - replace=1; - } + /* we don't care about a to-be-replaced package's newer version */ + for(j = syncpkgs; j && !replace; j=j->next) { + sync = j->data; + if(sync->type == PM_SYNC_TYPE_REPLACE) { + if(_alpm_pkg_find(alpm_pkg_get_name(spkg), sync->data)) { + replace=1; } } - if(replace) { - _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping", - alpm_pkg_get_name(local)); - continue; - } + } + if(replace) { + _alpm_log(PM_LOG_DEBUG, "'%s' is already elected for removal -- skipping", + alpm_pkg_get_name(local)); + continue; + } - /* compare versions and see if we need to upgrade */ - if(alpm_pkg_compare_versions(local, spkg)) { - _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (%s => %s)", - alpm_pkg_get_name(local), alpm_pkg_get_version(local), - alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); - if(!_alpm_sync_find(trans->packages, alpm_pkg_get_name(spkg))) { - /* If package is in the ignorepkg list, ask before we add it to - * the transaction */ - if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(local))) { - int resp = 0; - QUESTION(trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, local, NULL, NULL, &resp); - if(!resp) { - continue; - } - } - pmpkg_t *tmp = _alpm_pkg_dup(local); - if(tmp == NULL) { - goto error; - } - sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, tmp); - if(sync == NULL) { - _alpm_pkg_free(tmp); - goto error; - } - trans->packages = alpm_list_add(trans->packages, sync); + /* compare versions and see if we need to upgrade */ + if(alpm_pkg_compare_versions(local, spkg)) { + _alpm_log(PM_LOG_DEBUG, "%s-%s elected for upgrade (%s => %s)", + alpm_pkg_get_name(local), alpm_pkg_get_version(local), + alpm_pkg_get_name(spkg), alpm_pkg_get_version(spkg)); + if(!_alpm_sync_find(syncpkgs, alpm_pkg_get_name(spkg))) { + /* If package is in the ignorepkg list, skip it */ + if(alpm_list_find_str(handle->ignorepkg, alpm_pkg_get_name(local))) { + _alpm_log(PM_LOG_WARNING, _("%s-%s: ignoring package upgrade (%s)"), + alpm_pkg_get_name(local), alpm_pkg_get_version(local), + alpm_pkg_get_version(spkg)); + continue; + } + + pmpkg_t *tmp = _alpm_pkg_dup(local); + if(tmp == NULL) { + _alpm_synclist_free(syncpkgs); + return(NULL); + } + sync = _alpm_sync_new(PM_SYNC_TYPE_UPGRADE, spkg, tmp); + if(sync == NULL) { + _alpm_pkg_free(tmp); + _alpm_synclist_free(syncpkgs); + return(NULL); } + syncpkgs = alpm_list_add(syncpkgs, sync); } } + } - return(0); + if(trans) { + trans->packages = syncpkgs; } -error: - /* if we're here, it's an error */ - return(-1); + + return(syncpkgs); } int _alpm_sync_addtarget(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync, char *name) diff --git a/lib/libalpm/sync.h b/lib/libalpm/sync.h index ef094b5..0d91d25 100644 --- a/lib/libalpm/sync.h +++ b/lib/libalpm/sync.h @@ -35,7 +35,6 @@ struct __pmsyncpkg_t { pmsyncpkg_t *_alpm_sync_new(int type, pmpkg_t *spkg, void *data); void _alpm_sync_free(pmsyncpkg_t *data); -int _alpm_sync_sysupgrade(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync); 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_commit(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t **data); diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index 5382014..c0d4b3d 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -292,7 +292,8 @@ int _alpm_trans_sysupgrade(pmtrans_t *trans) /* Sanity checks */ ASSERT(trans != NULL, RET_ERR(PM_ERR_TRANS_NULL, -1)); - return(_alpm_sync_sysupgrade(trans, handle->db_local, handle->dbs_sync)); + alpm_sync_sysupgrade(trans, handle->db_local, handle->dbs_sync); + return(0); } /** Add a target to the transaction. diff --git a/src/pacman/query.c b/src/pacman/query.c index 8ef47e6..7849e84 100644 --- a/src/pacman/query.c +++ b/src/pacman/query.c @@ -239,7 +239,9 @@ static int query_upgrades(void) printf(_("Checking for package upgrades... \n")); alpm_list_t *syncpkgs; - if((syncpkgs = alpm_db_get_upgrades()) != NULL) { + alpm_list_t *syncdbs = alpm_option_get_syncdbs(); + if((syncpkgs = alpm_sync_sysupgrade(NULL, + db_local, syncdbs)) != NULL) { display_targets(syncpkgs); return(0); } -- 1.5.2.5