1 diff -urN poldek/ask.c poldek.new/ask.c
2 --- poldek/ask.c 2007-07-08 18:48:11.000000000 +0200
3 +++ poldek.new/ask.c 2007-11-18 18:55:32.000000000 +0100
8 +static int term_sugs_confirm(void *foo, const struct poldek_ts *ts, int hint,
9 + const char *question)
11 + const char *yn = "[Y/n/c]";
17 + if (!isatty(STDIN_FILENO))
20 + if (hint == 0) /* no */
23 + poldek_log(LOGINFO, "%s %s", question, yn);
25 + a = poldek_term_ask(STDIN_FILENO, "YyNnCc\n", NULL);
28 + case 'Y': a = 1; break;
29 + case 'N': a = 0; break;
30 + case 'C': a = -1; break;
31 + case '\n': a = hint; break;
40 static int term_choose_pkg(void *foo, const struct poldek_ts *ts,
41 const char *capname, tn_array *pkgs, int hint)
44 return ts->ctx->ts_confirm_fn(ts->ctx->data_ts_confirm_fn, ts);
47 +int poldek__sugs_confirm(const struct poldek_ts *ts, int hint, const char *message)
49 + if (ts->ctx->sugs_confirm_fn == NULL)
52 + return ts->ctx->sugs_confirm_fn(ts->ctx->data_sugs_confirm_fn, ts, hint, message);
56 int poldek__choose_equiv(const struct poldek_ts *ts,
57 const char *capname, tn_array *pkgs, struct pkg *hint)
60 ctx->data_ts_confirm_fn = NULL;
61 ctx->ts_confirm_fn = term_ts_confirm;
63 + ctx->data_sugs_confirm_fn = NULL;
64 + ctx->sugs_confirm_fn = term_sugs_confirm;
66 ctx->data_choose_equiv_fn = NULL;
67 ctx->choose_equiv_fn = term_choose_pkg;
69 diff -urN poldek/install/requirements.c poldek.new/install/requirements.c
70 --- poldek/install/requirements.c 2007-07-12 23:29:26.000000000 +0200
71 +++ poldek.new/install/requirements.c 2007-11-18 18:42:27.000000000 +0100
75 /* just append sugs to reqs if user wants to */
76 -static tn_array *process_suggets(struct pkg *pkg, struct poldek_ts *ts)
77 +static tn_array *process_suggests(struct pkg *pkg, struct install_ctx *ictx)
79 char *confirmation, message[2048];
81 + tn_array *reqs, *sugs;
88 - if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ts))
89 + if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ictx->ts))
92 - if (!ts->getop(ts, POLDEK_OP_SUGGESTS))
93 + if (!ictx->ts->getop(ictx->ts, POLDEK_OP_SUGGESTS))
96 - nbuf = capreq_arr_join(pkg->sugs, NULL, NULL);
99 + /* Array sugs will contain packages which are suggested and not installed */
100 + sugs = capreq_arr_new(n_array_size(pkg->sugs));
102 + for (i = 0; i < n_array_size(pkg->sugs); i++)
104 + struct capreq *suggest = n_array_nth(pkg->sugs, i);
106 + /* Check if package is already installed */
107 + if (!pkgdb_match_req(ictx->ts->db, suggest, ictx->strict, ictx->uninst_set->dbpkgs))
109 + n_array_push(sugs, suggest);
113 + if (n_array_size(sugs) == 0)
116 + nbuf = capreq_arr_join(sugs, NULL, NULL);
117 n = n_snprintf(message, sizeof(message), _("%s suggests installation of: %s"),
118 pkg_id(pkg), n_buf_ptr(nbuf));
121 - confirmation = ngettext("Try to install it?", "Try to install them?",
122 - n_array_size(pkg->sugs));
123 + confirmation = ngettext("Try to install it?", "Try to install them?", n_array_size(sugs));
124 n_snprintf(&message[n], sizeof(message) - n, "\n%s", confirmation);
126 - if (poldek__confirm(ts, 0, message)) {
129 - reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(pkg->sugs));
130 + if (n_array_size(sugs) > 1)
134 + answer = poldek__sugs_confirm(ictx->ts, 0, message);
136 + /* Install all suggested packages */
139 + reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(sugs));
141 - for (i=0; i < n_array_size(pkg->reqs); i++)
142 - n_array_push(reqs, n_array_nth(pkg->reqs, i));
143 + for (i=0; i < n_array_size(pkg->reqs); i++)
144 + n_array_push(reqs, n_array_nth(pkg->reqs, i));
145 + for (i=0; i < n_array_size(sugs); i++)
146 + n_array_push(reqs, n_array_nth(sugs, i));
148 + n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
152 + /* Don't install */
153 + else if (answer == 0)
157 + for (j = 0; j < n_array_size(sugs); j++)
159 + n = n_snprintf(message, sizeof(message), _("%s suggests installation of: %s"),
160 + pkg_id(pkg), capreq_snprintf_s(n_array_nth(sugs, j)));
162 - for (i=0; i < n_array_size(pkg->sugs); i++)
163 - n_array_push(reqs, n_array_nth(pkg->sugs, i));
165 - n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
166 + n_snprintf(&message[n], sizeof(message) - n, "\n%s", _("Try to install it?"));
168 + if (poldek__confirm(ictx->ts, 0, message))
172 + tmpreqs = capreq_arr_new(n_array_size(reqs) + 1);
174 + for (i = 0; i < n_array_size(reqs); i++)
175 + n_array_push(tmpreqs, n_array_nth(reqs, i));
177 + n_array_push(tmpreqs, n_array_nth(sugs, j));
181 + n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */
191 if (process_as == PROCESS_AS_NEW)
192 - reqs = process_suggets(pkg, ictx->ts);
193 + reqs = process_suggests(pkg, ictx);
195 for (i=0; i < n_array_size(reqs); i++) {
196 struct capreq *req = n_array_nth(reqs, i);
197 diff -urN poldek/lib_init.c poldek.new/lib_init.c
198 --- poldek/lib_init.c 2007-07-09 20:31:14.000000000 +0200
199 +++ poldek.new/lib_init.c 2007-11-17 22:42:56.000000000 +0100
200 @@ -1226,6 +1226,15 @@
201 ctx->data_ts_confirm_fn = vv;
204 + case POLDEK_CONF_SUGSCONFIRM_CB:
205 + if ((vv = va_arg(ap, void*)))
206 + ctx->sugs_confirm_fn = vv;
208 + if ((vv = va_arg(ap, void*)))
209 + ctx->data_sugs_confirm_fn = vv;
213 case POLDEK_CONF_CHOOSEEQUIV_CB:
214 if ((vv = va_arg(ap, void*)))
215 ctx->choose_equiv_fn = vv;
216 diff -urN poldek/poldek.h poldek.new/poldek.h
217 --- poldek/poldek.h 2007-07-01 23:04:26.000000000 +0200
218 +++ poldek.new/poldek.h 2007-11-17 21:33:31.000000000 +0100
220 #define POLDEK_CONF_GOODBYE_CB 22
221 #define POLDEK_CONF_CONFIRM_CB 23
222 #define POLDEK_CONF_TSCONFIRM_CB 24
223 -#define POLDEK_CONF_CHOOSEEQUIV_CB 25
224 +#define POLDEK_CONF_SUGSCONFIRM_CB 25
225 +#define POLDEK_CONF_CHOOSEEQUIV_CB 26
227 int poldek_configure(struct poldek_ctx *ctx, int param, ...);
229 diff -urN poldek/poldek_intern.h poldek.new/poldek_intern.h
230 --- poldek/poldek_intern.h 2007-07-08 18:59:15.000000000 +0200
231 +++ poldek.new/poldek_intern.h 2007-11-17 22:47:39.000000000 +0100
233 void *data_ts_confirm_fn;
234 int (*ts_confirm_fn)(void *data, const struct poldek_ts *ts); /* confirm transaction */
236 + void *data_sugs_confirm_fn;
237 + int (*sugs_confirm_fn)(void *data, const struct poldek_ts *ts, int hint,
238 + const char *message); /* confirm suggests */
240 void *data_choose_equiv_fn;
241 int (*choose_equiv_fn)(void *data, const struct poldek_ts *ts,
242 const char *cap, tn_array *pkgs, int hint);
245 int poldek__ts_confirm(const struct poldek_ts *ts);
247 +int poldek__sugs_confirm(const struct poldek_ts *ts,
248 + int default_answer, const char *message);
251 int poldek__choose_equiv(const struct poldek_ts *ts,
252 const char *capname, tn_array *pkgs, struct pkg *hint);
254 diff -urN poldek/poldek_ts.c poldek.new/poldek_ts.c
255 --- poldek/poldek_ts.c 2007-07-11 00:56:17.000000000 +0200
256 +++ poldek.new/poldek_ts.c 2007-11-17 22:56:19.000000000 +0100
259 extern int poldek_term_confirm(int default_answer, const char *msg);
260 extern int poldek_term_ts_confirm(const struct poldek_ts *ts);
261 +extern int poldek_term_sugs_confirm(int default_answer, const char *msg);
262 extern int poldek_term_choose_pkg(const char *capname, tn_array *pkgs,