]>
Commit | Line | Data |
---|---|---|
72f8af12 MB |
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 | |
4 | @@ -87,6 +87,38 @@ | |
5 | return answer; | |
6 | } | |
7 | ||
8 | +static int term_sugs_confirm(void *foo, const struct poldek_ts *ts, int hint, | |
9 | + const char *question) | |
10 | +{ | |
11 | + const char *yn = "[Y/n/c]"; | |
12 | + int a; | |
13 | + | |
14 | + foo = foo; | |
15 | + ts = ts; | |
16 | + | |
17 | + if (!isatty(STDIN_FILENO)) | |
18 | + return hint; | |
19 | + | |
20 | + if (hint == 0) /* no */ | |
21 | + yn = "[N/y/c]"; | |
22 | + | |
23 | + poldek_log(LOGINFO, "%s %s", question, yn); | |
24 | + | |
25 | + a = poldek_term_ask(STDIN_FILENO, "YyNnCc\n", NULL); | |
26 | + a = toupper(a); | |
27 | + switch(a) { | |
28 | + case 'Y': a = 1; break; | |
29 | + case 'N': a = 0; break; | |
30 | + case 'C': a = -1; break; | |
31 | + case '\n': a = hint; break; | |
32 | + default: | |
33 | + n_assert(0); | |
34 | + } | |
35 | + | |
36 | + msg(-1, "_\n"); | |
37 | + return a; | |
38 | +} | |
39 | + | |
40 | static int term_choose_pkg(void *foo, const struct poldek_ts *ts, | |
41 | const char *capname, tn_array *pkgs, int hint) | |
42 | { | |
43 | @@ -152,6 +184,15 @@ | |
44 | return ts->ctx->ts_confirm_fn(ts->ctx->data_ts_confirm_fn, ts); | |
45 | } | |
46 | ||
47 | +int poldek__sugs_confirm(const struct poldek_ts *ts, int hint, const char *message) | |
48 | +{ | |
49 | + if (ts->ctx->sugs_confirm_fn == NULL) | |
50 | + return hint; | |
51 | + | |
52 | + return ts->ctx->sugs_confirm_fn(ts->ctx->data_sugs_confirm_fn, ts, hint, message); | |
53 | +} | |
54 | + | |
55 | + | |
56 | int poldek__choose_equiv(const struct poldek_ts *ts, | |
57 | const char *capname, tn_array *pkgs, struct pkg *hint) | |
58 | { | |
59 | @@ -181,6 +222,9 @@ | |
60 | ctx->data_ts_confirm_fn = NULL; | |
61 | ctx->ts_confirm_fn = term_ts_confirm; | |
62 | ||
63 | + ctx->data_sugs_confirm_fn = NULL; | |
64 | + ctx->sugs_confirm_fn = term_sugs_confirm; | |
65 | + | |
66 | ctx->data_choose_equiv_fn = NULL; | |
67 | ctx->choose_equiv_fn = term_choose_pkg; | |
68 | } | |
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 | |
72 | @@ -244,46 +244,94 @@ | |
73 | } | |
74 | ||
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) | |
78 | { | |
79 | char *confirmation, message[2048]; | |
80 | - tn_array *reqs; | |
81 | + tn_array *reqs, *sugs; | |
82 | tn_buf *nbuf; | |
83 | - int n; | |
84 | + int i, j, n; | |
85 | ||
86 | reqs = pkg->reqs; | |
87 | ||
88 | - if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ts)) | |
89 | + if (pkg->sugs == NULL || !in_is_user_choosable_equiv(ictx->ts)) | |
90 | return reqs; | |
91 | ||
92 | - if (!ts->getop(ts, POLDEK_OP_SUGGESTS)) | |
93 | + if (!ictx->ts->getop(ictx->ts, POLDEK_OP_SUGGESTS)) | |
94 | return reqs; | |
95 | ||
96 | - nbuf = capreq_arr_join(pkg->sugs, NULL, NULL); | |
97 | - | |
98 | - | |
99 | + /* Array sugs will contain packages which are suggested and not installed */ | |
100 | + sugs = capreq_arr_new(n_array_size(pkg->sugs)); | |
101 | + | |
102 | + for (i = 0; i < n_array_size(pkg->sugs); i++) | |
103 | + { | |
104 | + struct capreq *suggest = n_array_nth(pkg->sugs, i); | |
105 | + | |
106 | + /* Check if package is already installed */ | |
107 | + if (!pkgdb_match_req(ictx->ts->db, suggest, ictx->strict, ictx->uninst_set->dbpkgs)) | |
108 | + { | |
109 | + n_array_push(sugs, suggest); | |
110 | + } | |
111 | + } | |
112 | + | |
113 | + if (n_array_size(sugs) == 0) | |
114 | + return reqs; | |
115 | + | |
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)); | |
119 | n_buf_free(nbuf); | |
120 | ||
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); | |
125 | ||
126 | - if (poldek__confirm(ts, 0, message)) { | |
127 | - int i; | |
128 | - | |
129 | - reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(pkg->sugs)); | |
130 | + if (n_array_size(sugs) > 1) | |
131 | + { | |
132 | + int answer; | |
133 | + | |
134 | + answer = poldek__sugs_confirm(ictx->ts, 0, message); | |
135 | + | |
136 | + /* Install all suggested packages */ | |
137 | + if (answer == 1) | |
138 | + { | |
139 | + reqs = capreq_arr_new(n_array_size(pkg->reqs) + n_array_size(sugs)); | |
140 | ||
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)); | |
147 | + | |
148 | + n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */ | |
149 | + | |
150 | + return reqs; | |
151 | + } | |
152 | + /* Don't install */ | |
153 | + else if (answer == 0) | |
154 | + return reqs; | |
155 | + } | |
156 | + | |
157 | + for (j = 0; j < n_array_size(sugs); j++) | |
158 | + { | |
159 | + n = n_snprintf(message, sizeof(message), _("%s suggests installation of: %s"), | |
160 | + pkg_id(pkg), capreq_snprintf_s(n_array_nth(sugs, j))); | |
161 | ||
162 | - for (i=0; i < n_array_size(pkg->sugs); i++) | |
163 | - n_array_push(reqs, n_array_nth(pkg->sugs, i)); | |
164 | - | |
165 | - n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */ | |
166 | + n_snprintf(&message[n], sizeof(message) - n, "\n%s", _("Try to install it?")); | |
167 | + | |
168 | + if (poldek__confirm(ictx->ts, 0, message)) | |
169 | + { | |
170 | + tn_array *tmpreqs; | |
171 | + | |
172 | + tmpreqs = capreq_arr_new(n_array_size(reqs) + 1); | |
173 | + | |
174 | + for (i = 0; i < n_array_size(reqs); i++) | |
175 | + n_array_push(tmpreqs, n_array_nth(reqs, i)); | |
176 | + | |
177 | + n_array_push(tmpreqs, n_array_nth(sugs, j)); | |
178 | + | |
179 | + reqs = tmpreqs; | |
180 | + | |
181 | + n_array_ctl_set_freefn(reqs, NULL); /* "weak" refs */ | |
182 | + } | |
183 | } | |
184 | - | |
185 | return reqs; | |
186 | } | |
187 | ||
188 | @@ -345,7 +393,7 @@ | |
189 | ||
190 | reqs = pkg->reqs; | |
191 | if (process_as == PROCESS_AS_NEW) | |
192 | - reqs = process_suggets(pkg, ictx->ts); | |
193 | + reqs = process_suggests(pkg, ictx); | |
194 | ||
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; | |
202 | break; | |
203 | ||
204 | + case POLDEK_CONF_SUGSCONFIRM_CB: | |
205 | + if ((vv = va_arg(ap, void*))) | |
206 | + ctx->sugs_confirm_fn = vv; | |
207 | + | |
208 | + if ((vv = va_arg(ap, void*))) | |
209 | + ctx->data_sugs_confirm_fn = vv; | |
210 | + | |
211 | + break; | |
212 | + | |
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 | |
219 | @@ -53,7 +53,8 @@ | |
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 | |
226 | ||
227 | int poldek_configure(struct poldek_ctx *ctx, int param, ...); | |
228 | ||
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 | |
232 | @@ -38,6 +38,10 @@ | |
233 | void *data_ts_confirm_fn; | |
234 | int (*ts_confirm_fn)(void *data, const struct poldek_ts *ts); /* confirm transaction */ | |
235 | ||
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 */ | |
239 | + | |
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); | |
243 | @@ -74,6 +78,10 @@ | |
244 | ||
245 | int poldek__ts_confirm(const struct poldek_ts *ts); | |
246 | ||
247 | +int poldek__sugs_confirm(const struct poldek_ts *ts, | |
248 | + int default_answer, const char *message); | |
249 | + | |
250 | + | |
251 | int poldek__choose_equiv(const struct poldek_ts *ts, | |
252 | const char *capname, tn_array *pkgs, struct pkg *hint); | |
253 | ||
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 | |
257 | @@ -54,6 +54,7 @@ | |
258 | ||
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, | |
263 | struct pkg *hint); | |
264 |