[pacman-dev] [PATCH 1/2] Enabled new interactive prompt and updated some tests.
Dan McGee
dpmcgee at gmail.com
Mon Feb 23 21:33:50 EST 2009
On Sun, Feb 22, 2009 at 4:25 AM, Bryan Ischo
<bji-keyword-pacman.3644cb at www.ischo.com> wrote:
> From: Bryan Ischo <bryan at ischo.com>
>
> Enabled a new prompt to ask the user if they'd like to remove
> unresolvable packages from the transaction rather than failing it.
>
> Many pactest tests that used to fail not return success codes, because
> pacman now issues a prompt allowing the user to cancel rather than
> failing many transactions, and the pactest scripts always choose to
> cancel with no error rather than failing. The only net effect is that
> the return status of pacman is now 0 in cases where it used to be
> nonzero.
>
> Signed-off-by: Bryan Ischo <bryan at ischo.com>
> ---
> lib/libalpm/alpm.h | 3 ++-
> lib/libalpm/deps.c | 6 +++---
> lib/libalpm/sync.c | 23 ++++++++++++++++++-----
> pactest/tests/provision020.py | 2 +-
> pactest/tests/provision022.py | 2 +-
> pactest/tests/sync1008.py | 2 +-
> pactest/tests/sync300.py | 2 +-
> src/pacman/callback.c | 16 ++++++++++++++++
> 8 files changed, 43 insertions(+), 13 deletions(-)
>
> diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
> index 7b7ca4e..3836d60 100644
> --- a/lib/libalpm/alpm.h
> +++ b/lib/libalpm/alpm.h
> @@ -371,7 +371,8 @@ typedef enum _pmtransconv_t {
> PM_TRANS_CONV_REPLACE_PKG = 0x02,
> PM_TRANS_CONV_CONFLICT_PKG = 0x04,
> PM_TRANS_CONV_CORRUPTED_PKG = 0x08,
> - PM_TRANS_CONV_LOCAL_NEWER = 0x10
> + PM_TRANS_CONV_LOCAL_NEWER = 0x10,
> + PM_TRANS_CONV_REMOVE_PKGS = 0x20,
> } pmtransconv_t;
>
> /* Transaction Progress */
> diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
> index 41d2a83..ebcd18d 100644
> --- a/lib/libalpm/deps.c
> +++ b/lib/libalpm/deps.c
> @@ -531,8 +531,8 @@ pmpkg_t *_alpm_resolvedep(pmdepend_t *dep, alpm_list_t *dbs, alpm_list_t *exclud
> !_alpm_pkg_find(excluding, pkg->name)) {
> if(_alpm_pkg_should_ignore(pkg)) {
> int install;
> - QUESTION(handle->trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, pkg,
> - tpkg, NULL, &install);
> + QUESTION(handle->trans, PM_TRANS_CONV_INSTALL_IGNOREPKG,
> + pkg, tpkg, NULL, &install);
> if(!install) {
> continue;
> }
> @@ -609,7 +609,7 @@ int _alpm_resolvedeps(pmdb_t *local, alpm_list_t *dbs_sync, pmpkg_t *pkg,
> if(!spkg) {
> pm_errno = PM_ERR_UNSATISFIED_DEPS;
> char *missdepstring = alpm_dep_compute_string(missdep);
> - _alpm_log(PM_LOG_ERROR, _("cannot resolve \"%s\", a dependency of \"%s\"\n"),
> + _alpm_log(PM_LOG_WARNING, _("cannot resolve \"%s\", a dependency of \"%s\"\n"),
> missdepstring, tpkg->name);
> free(missdepstring);
> if(data) {
> diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
> index 5e5ca92..ea903f4 100644
> --- a/lib/libalpm/sync.c
> +++ b/lib/libalpm/sync.c
> @@ -442,12 +442,25 @@ int _alpm_sync_prepare(pmtrans_t *trans, pmdb_t *db_local, alpm_list_t *dbs_sync
> dependencies not already on the list */
> }
>
> - /* If there were unresolvable top-level packages, fail the
> - transaction. */
> + /* If there were unresolvable top-level packages, prompt the user to
> + see if they'd like to ignore them rather than failing the sync */
> if(unresolvable != NULL) {
> - /* pm_errno is set by resolvedeps */
> - ret = -1;
> - goto cleanup;
> + int remove_unresolvable = 0;
> + QUESTION(handle->trans, PM_TRANS_CONV_REMOVE_PKGS, unresolvable, NULL, NULL, &remove_unresolvable);
> + if (remove_unresolvable) {
> + /* User wants to remove the unresolvable packages from the
> + transaction, so simply drop the unresolvable list. The
> + packages will be removed from the actual transaction when
> + the transaction packages are replaced with a
> + dependency-reordered list below */
> + alpm_list_free(unresolvable);
> + unresolvable = NULL;
> + }
> + else {
> + /* pm_errno is set by resolvedeps */
> + ret = -1;
> + goto cleanup;
> + }
> }
>
> /* Add all packages which were "pulled" (i.e. weren't already in the
> diff --git a/pactest/tests/provision020.py b/pactest/tests/provision020.py
> index 7cb0a01..c9c0ac3 100644
> --- a/pactest/tests/provision020.py
> +++ b/pactest/tests/provision020.py
> @@ -10,6 +10,6 @@
>
> self.args = "-S %s" % p.name
>
> -self.addrule("PACMAN_RETCODE=1")
> +self.addrule("PACMAN_RETCODE=0")
> self.addrule("!PKG_EXIST=pkg1")
> self.addrule("PKG_EXIST=pkg2")
> diff --git a/pactest/tests/provision022.py b/pactest/tests/provision022.py
> index 4883d42..190a8b6 100644
> --- a/pactest/tests/provision022.py
> +++ b/pactest/tests/provision022.py
> @@ -10,6 +10,6 @@
>
> self.args = "-S %s" % p.name
>
> -self.addrule("PACMAN_RETCODE=1")
> +self.addrule("PACMAN_RETCODE=0")
> self.addrule("!PKG_EXIST=pkg1")
> self.addrule("PKG_EXIST=pkg2")
> diff --git a/pactest/tests/sync1008.py b/pactest/tests/sync1008.py
> index a606459..90c61df 100644
> --- a/pactest/tests/sync1008.py
> +++ b/pactest/tests/sync1008.py
> @@ -14,6 +14,6 @@
>
> self.args = "-S pkg"
>
> -self.addrule("PACMAN_RETCODE=1")
> +self.addrule("PACMAN_RETCODE=0")
> self.addrule("!PKG_EXIST=pkg")
> self.addrule("!PKG_EXIST=cpkg")
> diff --git a/pactest/tests/sync300.py b/pactest/tests/sync300.py
> index 31b520a..36d6758 100644
> --- a/pactest/tests/sync300.py
> +++ b/pactest/tests/sync300.py
> @@ -9,6 +9,6 @@
>
> self.args = "-S %s" % sp1.name
>
> -self.addrule("PACMAN_RETCODE=1")
> +self.addrule("PACMAN_RETCODE=0")
> self.addrule("!PKG_EXIST=pkg1")
> self.addrule("!PKG_EXIST=pkg2")
> diff --git a/src/pacman/callback.c b/src/pacman/callback.c
> index 6e7930c..d6b5b01 100644
> --- a/src/pacman/callback.c
> +++ b/src/pacman/callback.c
> @@ -270,6 +270,22 @@ void cb_trans_conv(pmtransconv_t event, void *data1, void *data2,
> (char *)data2,
> (char *)data2);
> break;
> + case PM_TRANS_CONV_REMOVE_PKGS:
> + {
> + alpm_list_t *unresolved = (alpm_list_t *) data1;
> + alpm_list_t *namelist = NULL, *i;
> + for (i = unresolved; i; i = i->next) {
> + namelist = alpm_list_add(namelist,
> + (char *) alpm_pkg_get_name(i->data));
> + }
> + printf(":: the following package(s) cannot be upgraded due to "
> + "unresolvable dependencies:\n");
> + list_display(" ", namelist);
> + *response = yesno(_("\nDo you want to skip the above "
> + "package(s) for this upgrade?"));
> + alpm_list_free(namelist);
> + }
> + break;
You have a ton of tab/space issues in here, btw. I cleaned it up, but
please be more careful next time.
> case PM_TRANS_CONV_LOCAL_NEWER:
> if(!config->op_s_downloadonly) {
> *response = yesno(_(":: %s-%s: local version is newer. Upgrade anyway?"),
> --
> 1.6.1
>
> _______________________________________________
> pacman-dev mailing list
> pacman-dev at archlinux.org
> http://www.archlinux.org/mailman/listinfo/pacman-dev
>
More information about the pacman-dev
mailing list