SOURCES: poldek-ask-abort.patch (NEW) - possiblity to exit ask equ...
glen
glen at pld-linux.org
Thu Nov 3 22:01:03 CET 2005
Author: glen Date: Thu Nov 3 21:01:03 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- possiblity to exit ask equivalents prompt
---- Files affected:
SOURCES:
poldek-ask-abort.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/poldek-ask-abort.patch
diff -u /dev/null SOURCES/poldek-ask-abort.patch:1.1
--- /dev/null Thu Nov 3 22:01:03 2005
+++ SOURCES/poldek-ask-abort.patch Thu Nov 3 22:00:58 2005
@@ -0,0 +1,503 @@
+Index: ask.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/ask.c,v
+retrieving revision 1.6
+retrieving revision 1.7
+diff -u -r1.6 -r1.7
+--- ask.c 14 Apr 2003 16:28:09 -0000 1.6
++++ ask.c 3 Nov 2005 00:16:58 -0000 1.7
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #ifdef HAVE_CONFIG_H
+@@ -92,13 +92,18 @@
+ *p++ = 'a' + i;
+ i++;
+ }
++ *p++ = 'Q';
+
+- msg(-1, _("Which one do you want to install? [%c]"), 'a' + default_i);
++ msg(-1, _("Which one do you want to install ('Q' to abort)? [%c]"),
++ 'a' + default_i);
+ a = poldek_term_ask(STDIN_FILENO, validchrs, NULL);
+ msg(-1, "_\n");
+
+ if (a == '\n')
+ return default_i;
++
++ if (a == 'Q')
++ return -1;
+
+ a -= 'a';
+ //printf("Selected %d\n", a);
+Index: pkgset-install.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/pkgset-install.c,v
+retrieving revision 1.148
+retrieving revision 1.149
+diff -u -r1.148 -r1.149
+--- pkgset-install.c 1 Nov 2005 19:36:36 -0000 1.148
++++ pkgset-install.c 3 Nov 2005 00:21:00 -0000 1.149
+@@ -1243,7 +1249,8 @@
+
+ DBGF("req %s\n", capreq_snprintf_s(req));
+
+- if (upg->ts->getop(upg->ts, POLDEK_OP_EQPKG_ASKUSER) && upg->ts->askpkg_fn)
++ if (upg->ts->getop(upg->ts, POLDEK_OP_EQPKG_ASKUSER) &&
++ upg->ts->askpkg_fn)
+ tomark_candidates_ptr = &tomark_candidates;
+
+ if (find_req(pkg, req, &tomark, tomark_candidates_ptr, ps, upg)) {
+@@ -1301,6 +1308,14 @@
+ int n;
+ n = upg->ts->askpkg_fn(capreq_snprintf_s(req),
+ tomark_candidates, tomark);
++
++ if (n == -1) { /* user abort */
++ free(tomark_candidates);
++ tomark_candidates = NULL;
++ upg->nerr_fatal++;
++ return 0;
++ }
++
+ real_tomark = tomark_candidates[n];
+ free(tomark_candidates);
+ tomark_candidates = NULL;
+@@ -1437,12 +1452,15 @@
+
+ if (pkg->reqs)
+ process_pkg_reqs(indent, pkg, ps, upg, process_as);
+-
++
+ if (process_as == PROCESS_AS_NEW) {
+ process_pkg_conflicts(indent, pkg, ps, upg);
+ //process_pkg_obsl(pkg, ps, upg, indent);
+ }
+
++ if (upg->nerr_fatal || sigint_reached())
++ return 0;
++
+ DBGF("END PROCESSING [%d] %s as %s\n", indent, pkg_id(pkg),
+ process_as == PROCESS_AS_NEW ? "NEW" : "ORPHAN");
+
+@@ -1532,7 +1550,14 @@
+ struct pkg *real_tomark = tomark;
+ if (tomark_candidates) {
+ int n;
+- n = upg->ts->askpkg_fn(capreq_snprintf_s(req), tomark_candidates, tomark);
++ n = upg->ts->askpkg_fn(capreq_snprintf_s(req), tomark_candidates,
++ tomark);
++ if (n == -1) {
++ n_cfree(&tomark_candidates);
++ upg->nerr_fatal++;
++ goto l_end;
++ }
++
+ real_tomark = tomark_candidates[n];
+ n_cfree(&tomark_candidates);
+ }
+@@ -1808,6 +1833,9 @@
+
+ db = upg->ts->db;
+
++ if (upg->nerr_fatal || sigint_reached())
++ return 0;
++
+ if (!upg->ts->getop(upg->ts, POLDEK_OP_CONFLICTS))
+ return 1;
+
+@@ -1850,7 +1878,9 @@
+ if (n)
+ pkg_set_unmetdeps(upg->unmetpms, pkg);
+ }
+-
++
++ if (upg->nerr_fatal || sigint_reached())
++ return 0;
+
+ if (pkg->cnfls != NULL)
+ for (i = 0; i < n_array_size(pkg->cnfls); i++) {
+@@ -2317,103 +2347,8 @@
+ return nmarked;
+ }
+
+-static
+-int prepare_icap(struct poldek_ts *ts, const char *capname, tn_array *pkgs)
+-{
+- int i, found = 0;
+- tn_array *dbpkgs;
+- struct capreq *cap;
+-
+- capreq_new_name_a(capname, cap);
+- dbpkgs = pkgdb_get_provides_dbpkgs(ts->db, cap, NULL, 0);
+- if (dbpkgs == NULL) {
+- struct pkg *pkg;
+- if (ts->getop(ts, POLDEK_OP_FRESHEN))
+- return 0;
+-
+- n_array_sort_ex(pkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev);
+- pkg = n_array_nth(pkgs, 0);
+- pkg_hand_mark(ts->pms, pkg);
+- return 1;
+- }
+-
+- n_array_sort_ex(pkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev);
+- for (i=0; i < n_array_size(dbpkgs); i++) {
+- struct pkg *dbpkg = n_array_nth(dbpkgs, i);
+- int n = n_array_bsearch_idx_ex(pkgs, dbpkg,
+- (tn_fn_cmp)pkg_cmp_name);
+-
+- DBGF("%s: %s\n", capname, pkg_id(dbpkg));
+-
+- if (n < 0)
+- continue;
+-
+- for (; n < n_array_size(pkgs); n++) {
+- struct pkg *pkg = n_array_nth(pkgs, n);
+- int cmprc, mark = 0;
+-
+- DBGF("%s: %s cmp %s\n", capname, pkg_id(pkg),
+- pkg_id(dbpkg));
+- if (pkg_cmp_name(pkg, dbpkg) != 0)
+- break;
+-
+- cmprc = pkg_cmp_name_evr(pkg, dbpkg);
+- if (cmprc > 0)
+- mark = 1;
+-
+- else if (cmprc == 0 && poldek_ts_issetf(ts, POLDEK_TS_REINSTALL))
+- mark = 1;
+-
+- else if (cmprc < 0 && poldek_ts_issetf(ts, POLDEK_TS_DOWNGRADE))
+- mark = 1;
+-
+- if (mark) {
+- found = 1;
+- msgn(1, _("%s: marked as %s's provider"), pkg_id(pkg),
+- capname);
+-
+- pkg_hand_mark(ts->pms, pkg);
+- goto l_end;
+-
+- } else if (cmprc <= 0) {
+- char *eqs = cmprc == 0 ? "equal" : "newer";
+- msgn(1, _("%s: %s version of %s is installed (%s), skipped"),
+- capname, eqs, pkg_id(dbpkg),
+- pkg_id(pkg));
+-
+- } else {
+- n_assert(0);
+-
+- }
+- }
+- }
+-l_end:
+- if (dbpkgs)
+- n_array_free(dbpkgs);
+-
+- return found;
+-}
+-
+-static
+-int prepare_icaps(struct poldek_ts *ts)
+-{
+- tn_array *keys;
+- tn_hash *icaps;
+- int i;
+-
+- icaps = arg_packages_get_resolved_caps(ts->aps);
+- keys = n_hash_keys_cp(icaps);
+- for (i=0; i < n_array_size(keys); i++) {
+- const char *cap = n_array_nth(keys, i);
+- tn_array *pkgs = n_hash_get(icaps, cap);
+- prepare_icap(ts, cap, pkgs);
+- }
+- n_array_free(keys);
+- n_hash_free(icaps);
+- return 1;
+-}
+-
+-
++/* use install/ in_prepare_icaps() */
++extern int in_prepare_icaps(struct poldek_ts *ts);
+
+ int do_poldek_ts_install(struct poldek_ts *ts, struct poldek_iinf *iinf)
+ {
+@@ -2424,7 +2359,9 @@
+
+ n_assert(ts->type == POLDEK_TS_INSTALL);
+
+- prepare_icaps(ts);
++ if (in_prepare_icaps(ts) == -1) /* user abort */
++ return 1;
++
+ if (unmark_name_dups(ts->pms, ps->pkgs) == 0) {
+ msgn(1, _("Nothing to do"));
+ return 1;
+Index: install/conflicts.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/conflicts.c,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- install/conflicts.c 9 Jul 2005 17:51:18 -0000 1.1
++++ install/conflicts.c 3 Nov 2005 00:21:05 -0000 1.2
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include "ictx.h"
+@@ -96,10 +96,13 @@
+ if (found) {
+ struct pkg *real_tomark = tomark;
+ if (tomark_candidates) {
+- int n;
+- n = ictx->ts->askpkg_fn(capreq_snprintf_s(req), tomark_candidates, tomark);
+- real_tomark = tomark_candidates[n];
++ real_tomark = in_choose_equiv(ictx->ts, req, tomark_candidates,
++ tomark);
+ n_cfree(&tomark_candidates);
++ if (real_tomark == NULL) { /* user aborts */
++ ictx->nerr_fatal++;
++ found = 0;
++ }
+ }
+ tomark = real_tomark;
+
+Index: install/icaps.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/icaps.c,v
+retrieving revision 1.1
+retrieving revision 1.2
+diff -u -r1.1 -r1.2
+--- install/icaps.c 9 Jul 2005 17:51:18 -0000 1.1
++++ install/icaps.c 3 Nov 2005 00:21:05 -0000 1.2
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include "ictx.h"
+@@ -25,13 +25,32 @@
+
+ capreq_new_name_a(capname, cap);
+ dbpkgs = pkgdb_get_provides_dbpkgs(ts->db, cap, NULL, 0);
++
+ if (dbpkgs == NULL) {
+- struct pkg *pkg;
++ struct pkg *pkg = NULL;
++
+ if (ts->getop(ts, POLDEK_OP_FRESHEN))
+ return 0;
+
+ n_array_sort_ex(pkgs, (tn_fn_cmp)pkg_cmp_name_evr_rev);
+- pkg = n_array_nth(pkgs, 0);
++
++ if (ts->getop(ts, POLDEK_OP_EQPKG_ASKUSER) && ts->askpkg_fn) {
++ struct pkg **candidates = alloca(sizeof(struct pkg *) *
++ (n_array_size(pkgs) + 1));
++ for (i=0; i < n_array_size(pkgs); i++)
++ candidates[i] = n_array_nth(pkgs, i);
++ candidates[i] = NULL;
++
++ pkg = in_choose_equiv(ts, cap, candidates, NULL);
++ if (pkg == NULL) { /* user aborts */
++ found = -1;
++ goto l_end;
++ }
++ }
++
++ if (pkg == NULL)
++ pkg = n_array_nth(pkgs, 0);
++
+ pkg_hand_mark(ts->pms, pkg);
+ return 1;
+ }
+@@ -65,7 +84,7 @@
+
+ else if (cmprc < 0 && poldek_ts_issetf(ts, POLDEK_TS_DOWNGRADE))
+ mark = 1;
+-
++
+ if (mark) {
+ found = 1;
+ msgn(1, _("%s: marked as %s's provider"), pkg_id(pkg),
+@@ -82,10 +101,10 @@
+
+ } else {
+ n_assert(0);
+-
+ }
+ }
+ }
++
+ l_end:
+ if (dbpkgs)
+ n_array_free(dbpkgs);
+@@ -93,20 +112,26 @@
+ return found;
+ }
+
++/* handles --caplookup */
+ int in_prepare_icaps(struct poldek_ts *ts)
+ {
+ tn_array *keys;
+ tn_hash *icaps;
+- int i;
+-
++ int i, rc = 1;
++
+ icaps = arg_packages_get_resolved_caps(ts->aps);
+ keys = n_hash_keys_cp(icaps);
+ for (i=0; i < n_array_size(keys); i++) {
+ const char *cap = n_array_nth(keys, i);
+ tn_array *pkgs = n_hash_get(icaps, cap);
+- prepare_icap(ts, cap, pkgs);
++
++ if (prepare_icap(ts, cap, pkgs) == -1) {
++ rc = -1;
++ break;
++ }
+ }
++
+ n_array_free(keys);
+ n_hash_free(icaps);
+- return 1;
++ return rc;
+ }
+Index: install/ictx.h
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/ictx.h,v
+retrieving revision 1.2
+retrieving revision 1.3
+diff -u -r1.2 -r1.3
+--- install/ictx.h 20 Oct 2005 18:19:16 -0000 1.2
++++ install/ictx.h 3 Nov 2005 00:21:05 -0000 1.3
+@@ -138,4 +138,7 @@
+ int in_process_package(int indent, struct install_ctx *ictx,
+ struct pkg *pkg, int process_as);
+
++
++struct pkg *in_choose_equiv(struct poldek_ts *ts, struct capreq *cap,
++ struct pkg **candidates, struct pkg *defaultpkg);
+ #endif
+Index: install/install.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/install.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- install/install.c 15 Sep 2005 18:00:35 -0000 1.3
++++ install/install.c 3 Nov 2005 00:21:05 -0000 1.4
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include <vfile/vfile.h>
+@@ -352,7 +352,9 @@
+ struct install_ctx ictx;
+ n_assert(ts->type == POLDEK_TS_INSTALL);
+
+- in_prepare_icaps(ts);
++ if (in_prepare_icaps(ts) < 0) /* user aborts, no error */
++ return 1;
++
+ if (unmark_name_dups(ts->pms, ts->ctx->ps->pkgs) == 0) {
+ msgn(1, _("Nothing to do"));
+ return 1;
+Index: install/misc.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/misc.c,v
+retrieving revision 1.4
+retrieving revision 1.5
+diff -u -r1.4 -r1.5
+--- install/misc.c 20 Oct 2005 17:57:51 -0000 1.4
++++ install/misc.c 3 Nov 2005 00:18:36 -0000 1.5
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include "ictx.h"
+@@ -439,7 +439,7 @@
+
+ l_end:
+
+- if (candidates && nsuspkgs) {
++ if (candidates && nsuspkgs > 1) {
+ n_assert(suspkgs);
+ *candidates = suspkgs;
+
+@@ -460,3 +460,16 @@
+ ictx->uninst_set->dbpkgs);
+ }
+
++struct pkg *in_choose_equiv(struct poldek_ts *ts, struct capreq *cap,
++ struct pkg **candidates, struct pkg *defaultpkg)
++{
++ int n;
++
++ if (defaultpkg == NULL)
++ defaultpkg = candidates[0];
++
++ n = ts->askpkg_fn(capreq_snprintf_s(cap), candidates, defaultpkg);
++ if (n == -1)
++ return NULL;
++ return candidates[n];
++}
+Index: install/requirements.c
+===================================================================
+RCS file: /cvsroot/installer/poldek/install/requirements.c,v
+retrieving revision 1.3
+retrieving revision 1.4
+diff -u -r1.3 -r1.4
+--- install/requirements.c 20 Oct 2005 18:19:16 -0000 1.3
++++ install/requirements.c 3 Nov 2005 00:21:05 -0000 1.4
+@@ -11,7 +11,7 @@
+ */
+
+ /*
+- $Id$
++ $Id$
+ */
+
+ #include "ictx.h"
+@@ -165,12 +165,15 @@
+
+ struct pkg *real_tomark = tomark;
+ if (tomark_candidates) {
+- int n;
+- n = ictx->ts->askpkg_fn(capreq_snprintf_s(req),
+- tomark_candidates, tomark);
+- real_tomark = tomark_candidates[n];
++ real_tomark = in_choose_equiv(ictx->ts, req, tomark_candidates,
++ tomark);
+ free(tomark_candidates);
+ tomark_candidates = NULL;
++
++ if (real_tomark == NULL) { /* user abort */
++ ictx->nerr_fatal++;
++ return 0;
++ }
+ }
+
+ if (in_is_marked_for_removal_by_req(ictx, real_tomark, req)) {
================================================================
More information about the pld-cvs-commit
mailing list