]> git.pld-linux.org Git - packages/poldek.git/blob - poldek-suggests-one-package.patch
- release 0.5
[packages/poldek.git] / poldek-suggests-one-package.patch
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  
This page took 0.04632 seconds and 3 git commands to generate.