[pacman-dev] crappy version of -Qu (query upgrades)
Dan McGee
dpmcgee at gmail.com
Mon Aug 27 09:55:02 EDT 2007
On 8/24/07, Xavier <shiningxc at gmail.com> wrote:
> >From ddbfb04293e28738d859da53ad09192889afbb6d Mon Sep 17 00:00:00 2001
> From: Chantry Xavier <shiningxc at 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 at gmail.com>
> ---
> 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)
Can't this be static, and thus not have the _alpm prefix? (static =
only use is in this file, _alpm = only use is internal to the
library).
> +{
> + 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)
I don't know why, but I seem reluctant to change the return type here,
unless we can no longer really error in this function.
> {
> + 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);
Same here- can _alpm_find_replacements never fail anymore?
> +
> + /* 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);
Not sure why we should move something that is sync specific out of the
sync header.
> 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) {
You know I don't like fun syntax like this. :) Break it into two lines
for clarity. Obviously it was already like it before, but this will
clean it up for the future.
foo = (alpm_sync_sysupgrade();
if(foo) { ...
> display_targets(syncpkgs);
> return(0);
> }
> --
> 1.5.2.5
>
>
> _______________________________________________
> pacman-dev mailing list
> pacman-dev at archlinux.org
> http://archlinux.org/mailman/listinfo/pacman-dev
>
More information about the pacman-dev
mailing list