Kamil Dziedzic wrote:
> Krystian Tomczyk wrote:
> > wine-0.9.49-1.i686 suggests installation of: binfmt-detector
> > Try to install it? [N/y]
> >
> > Maybe first test if package is installed and if not then write this
> > question?
>
> ... and one more thing. When there are more than one Suggest it ask to 
> install 
> them all. It should ask for each separately. Example:

I made patch for that, please test it.

-- 
Marcin Banasiak
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);
 
_______________________________________________
pld-devel-en mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-devel-en

Reply via email to