SOURCES: poldek-suggests-one-package.patch (NEW) - fixes #38 (pold...
megabajt
megabajt at pld-linux.org
Mon Nov 26 18:23:51 CET 2007
Author: megabajt Date: Mon Nov 26 17:23:51 2007 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- fixes #38 (poldek suggests already installed packages)
- adds one future (user can choose each suggested package separately)
---- Files affected:
SOURCES:
poldek-suggests-one-package.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/poldek-suggests-one-package.patch
diff -u /dev/null SOURCES/poldek-suggests-one-package.patch:1.1
--- /dev/null Mon Nov 26 18:23:51 2007
+++ SOURCES/poldek-suggests-one-package.patch Mon Nov 26 18:23:46 2007
@@ -0,0 +1,264 @@
+diff -urN poldek/ask.c poldek.new/ask.c
+--- poldek/ask.c 2007-07-08 18:48:11.000000000 +0200
++++ poldek.new/ask.c 2007-11-18 18:55:32.000000000 +0100
+@@ -87,6 +87,38 @@
+ return answer;
+ }
+
++static int term_sugs_confirm(void *foo, const struct poldek_ts *ts, int hint,
++ const char *question)
++{
++ const char *yn = "[Y/n/c]";
++ int a;
++
++ foo = foo;
++ ts = ts;
++
++ if (!isatty(STDIN_FILENO))
++ return hint;
++
++ if (hint == 0) /* no */
++ yn = "[N/y/c]";
++
++ poldek_log(LOGINFO, "%s %s", question, yn);
++
++ a = poldek_term_ask(STDIN_FILENO, "YyNnCc\n", NULL);
++ a = toupper(a);
++ switch(a) {
++ case 'Y': a = 1; break;
++ case 'N': a = 0; break;
++ case 'C': a = -1; break;
++ case '\n': a = hint; break;
++ default:
++ n_assert(0);
++ }
++
++ msg(-1, "_\n");
++ return a;
++}
++
+ static int term_choose_pkg(void *foo, const struct poldek_ts *ts,
+ const char *capname, tn_array *pkgs, int hint)
+ {
+@@ -152,6 +184,15 @@
+ return ts->ctx->ts_confirm_fn(ts->ctx->data_ts_confirm_fn, ts);
+ }
+
++int poldek__sugs_confirm(const struct poldek_ts *ts, int hint, const char *message)
++{
++ if (ts->ctx->sugs_confirm_fn == NULL)
++ return hint;
++
++ return ts->ctx->sugs_confirm_fn(ts->ctx->data_sugs_confirm_fn, ts, hint, message);
++}
++
++
+ int poldek__choose_equiv(const struct poldek_ts *ts,
+ const char *capname, tn_array *pkgs, struct pkg *hint)
+ {
+@@ -181,6 +222,9 @@
+ ctx->data_ts_confirm_fn = NULL;
+ ctx->ts_confirm_fn = term_ts_confirm;
+
++ ctx->data_sugs_confirm_fn = NULL;
++ ctx->sugs_confirm_fn = term_sugs_confirm;
++
+ ctx->data_choose_equiv_fn = NULL;
+ ctx->choose_equiv_fn = term_choose_pkg;
+ }
+diff -urN poldek/install/requirements.c poldek.new/install/requirements.c
+--- poldek/install/requirements.c 2007-07-12 23:29:26.000000000 +0200
++++ poldek.new/install/requirements.c 2007-11-18 18:42:27.000000000 +0100
+@@ -244,46 +244,94 @@
+ }
+
+ /* just append sugs to reqs if user wants to */
+-static tn_array *process_suggets(struct pkg *pkg, struct poldek_ts *ts)
++static tn_array *process_suggests(struct pkg *pkg, struct install_ctx *ictx)
+ {
+ char *confirmation, message[2048];
+- tn_array *reqs;
++ tn_array *reqs, *sugs;
+ tn_buf *nbuf;
+- int n;
++ int i, j, n;
+
+ reqs = pkg->reqs;
+
+- if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ts))
++ if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ictx->ts))
+ return reqs;
+
+- if (!ts->getop(ts, POLDEK_OP_SUGGESTS))
++ if (!ictx->ts->getop(ictx->ts, POLDEK_OP_SUGGESTS))
+ return reqs;
+
+- nbuf = capreq_arr_join(pkg->sugs, NULL, NULL);
+-
+-
++ /* Array sugs will contain packages which are suggested and not installed */
++ sugs = capreq_arr_new(n_array_size(pkg->sugs));
++
++ for (i = 0; i < n_array_size(pkg->sugs); i++)
++ {
++ struct capreq *suggest = n_array_nth(pkg->sugs, i);
++
++ /* Check if package is already installed */
++ if (!pkgdb_match_req(ictx->ts->db, suggest, ictx->strict, ictx->uninst_set->dbpkgs))
++ {
++ n_array_push(sugs, suggest);
++ }
++ }
++
++ if (n_array_size(sugs) == 0)
++ return reqs;
++
++ nbuf = capreq_arr_join(sugs, NULL, NULL);
+ n = n_snprintf(message, sizeof(message), _("%s suggests installation of: %s"),
+ pkg_id(pkg), n_buf_ptr(nbuf));
+ n_buf_free(nbuf);
+
+- confirmation = ngettext("Try to install it?", "Try to install them?",
+- n_array_size(pkg->sugs));
++ confirmation = ngettext("Try to install it?", "Try to install them?", n_array_size(sugs));
+ n_snprintf(&message[n], sizeof(message) - n, "\n%s", confirmation);
+
+- if (poldek__confirm(ts, 0, message)) {
+- int i;
+-
+- reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(pkg->sugs));
++ if (n_array_size(sugs) > 1)
++ {
++ int answer;
++
++ answer = poldek__sugs_confirm(ictx->ts, 0, message);
++
++ /* Install all suggested packages */
++ if (answer == 1)
++ {
++ reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(sugs));
+
+- for (i=0; i < n_array_size(pkg->reqs); i++)
+- n_array_push(reqs, n_array_nth(pkg->reqs, i));
++ for (i=0; i < n_array_size(pkg->reqs); i++)
++ n_array_push(reqs, n_array_nth(pkg->reqs, i));
++ for (i=0; i < n_array_size(sugs); i++)
++ n_array_push(reqs, n_array_nth(sugs, i));
++
++ n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
++
++ return reqs;
++ }
++ /* Don't install */
++ else if (answer == 0)
++ return reqs;
++ }
++
++ for (j = 0; j < n_array_size(sugs); j++)
++ {
++ n = n_snprintf(message, sizeof(message), _("%s suggests installation of: %s"),
++ pkg_id(pkg), capreq_snprintf_s(n_array_nth(sugs, j)));
+
+- for (i=0; i < n_array_size(pkg->sugs); i++)
+- n_array_push(reqs, n_array_nth(pkg->sugs, i));
+-
+- n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
++ n_snprintf(&message[n], sizeof(message) - n, "\n%s", _("Try to install it?"));
++
++ if (poldek__confirm(ictx->ts, 0, message))
++ {
++ tn_array *tmpreqs;
++
++ tmpreqs = capreq_arr_new(n_array_size(reqs) + 1);
++
++ for (i = 0; i < n_array_size(reqs); i++)
++ n_array_push(tmpreqs, n_array_nth(reqs, i));
++
++ n_array_push(tmpreqs, n_array_nth(sugs, j));
++
++ reqs = tmpreqs;
++
++ n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
++ }
+ }
+-
+ return reqs;
+ }
+
+@@ -345,7 +393,7 @@
+
+ reqs = pkg->reqs;
+ if (process_as == PROCESS_AS_NEW)
+- reqs = process_suggets(pkg, ictx->ts);
++ reqs = process_suggests(pkg, ictx);
+
+ for (i=0; i < n_array_size(reqs); i++) {
+ struct capreq *req = n_array_nth(reqs, i);
+diff -urN poldek/lib_init.c poldek.new/lib_init.c
+--- poldek/lib_init.c 2007-07-09 20:31:14.000000000 +0200
++++ poldek.new/lib_init.c 2007-11-17 22:42:56.000000000 +0100
+@@ -1226,6 +1226,15 @@
+ ctx->data_ts_confirm_fn = vv;
+ break;
+
++ case POLDEK_CONF_SUGSCONFIRM_CB:
++ if ((vv = va_arg(ap, void*)))
++ ctx->sugs_confirm_fn = vv;
++
++ if ((vv = va_arg(ap, void*)))
++ ctx->data_sugs_confirm_fn = vv;
++
++ break;
++
+ case POLDEK_CONF_CHOOSEEQUIV_CB:
+ if ((vv = va_arg(ap, void*)))
+ ctx->choose_equiv_fn = vv;
+diff -urN poldek/poldek.h poldek.new/poldek.h
+--- poldek/poldek.h 2007-07-01 23:04:26.000000000 +0200
++++ poldek.new/poldek.h 2007-11-17 21:33:31.000000000 +0100
+@@ -53,7 +53,8 @@
+ #define POLDEK_CONF_GOODBYE_CB 22
+ #define POLDEK_CONF_CONFIRM_CB 23
+ #define POLDEK_CONF_TSCONFIRM_CB 24
+-#define POLDEK_CONF_CHOOSEEQUIV_CB 25
++#define POLDEK_CONF_SUGSCONFIRM_CB 25
++#define POLDEK_CONF_CHOOSEEQUIV_CB 26
+
+ int poldek_configure(struct poldek_ctx *ctx, int param, ...);
+
+diff -urN poldek/poldek_intern.h poldek.new/poldek_intern.h
+--- poldek/poldek_intern.h 2007-07-08 18:59:15.000000000 +0200
++++ poldek.new/poldek_intern.h 2007-11-17 22:47:39.000000000 +0100
+@@ -38,6 +38,10 @@
+ void *data_ts_confirm_fn;
+ int (*ts_confirm_fn)(void *data, const struct poldek_ts *ts); /* confirm transaction */
+
++ void *data_sugs_confirm_fn;
++ int (*sugs_confirm_fn)(void *data, const struct poldek_ts *ts, int hint,
++ const char *message); /* confirm suggests */
++
+ void *data_choose_equiv_fn;
+ int (*choose_equiv_fn)(void *data, const struct poldek_ts *ts,
+ const char *cap, tn_array *pkgs, int hint);
+@@ -74,6 +78,10 @@
+
+ int poldek__ts_confirm(const struct poldek_ts *ts);
+
++int poldek__sugs_confirm(const struct poldek_ts *ts,
++ int default_answer, const char *message);
++
++
+ int poldek__choose_equiv(const struct poldek_ts *ts,
+ const char *capname, tn_array *pkgs, struct pkg *hint);
+
+diff -urN poldek/poldek_ts.c poldek.new/poldek_ts.c
+--- poldek/poldek_ts.c 2007-07-11 00:56:17.000000000 +0200
++++ poldek.new/poldek_ts.c 2007-11-17 22:56:19.000000000 +0100
+@@ -54,6 +54,7 @@
+
+ extern int poldek_term_confirm(int default_answer, const char *msg);
+ extern int poldek_term_ts_confirm(const struct poldek_ts *ts);
++extern int poldek_term_sugs_confirm(int default_answer, const char *msg);
+ extern int poldek_term_choose_pkg(const char *capname, tn_array *pkgs,
+ struct pkg *hint);
+
================================================================
More information about the pld-cvs-commit
mailing list