]> git.pld-linux.org Git - packages/poldek.git/blame - poldek-suggests-one-package.patch
- prepare for new snap 0.30 (will be available later)
[packages/poldek.git] / poldek-suggests-one-package.patch
CommitLineData
72f8af12
MB
1diff -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 }
69diff -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);
197diff -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;
216diff -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
229diff -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
254diff -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
This page took 0.099457 seconds and 4 git commands to generate.