[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