Signed-off-by: Benedikt Morbach <[email protected]>
---
 src/pacman/util.c |   40 ++++++++++++++++++++++++++--------------
 1 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/pacman/util.c b/src/pacman/util.c
index afe6840..1f54f65 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -1053,26 +1053,38 @@ alpm_list_t *optdep_string_list(const alpm_list_t 
*optlist, int include_installe
 {
        alpm_list_t *optstrings = NULL;
        alpm_optdepend_t *optdep;
-       alpm_db_t *db_local;
+       alpm_db_t *db_local = alpm_option_get_localdb(config->handle);
 
-       db_local = alpm_option_get_localdb(config->handle);
+       /* calculate these outside the loop. */
+       alpm_list_t *pkgcache = alpm_db_get_pkgcache(db_local);
+       alpm_list_t *remove = alpm_trans_get_remove(config->handle);
+       alpm_list_t *add = alpm_trans_get_add(config->handle);
 
-       /* turn optdepends list into a text list */
+       /* turn optdepends list into a text list. */
        for( ; optlist; optlist = alpm_list_next(optlist)) {
                optdep = alpm_list_getdata(optlist);
-               if(include_installed && alpm_db_get_pkg(db_local, 
optdep->depend->name)) {
-                       const char * const installed = _(" [installed]");
-                       char *str, *tmp;
-                       tmp = alpm_optdep_compute_string(optdep);
-                       if((str = realloc(tmp, strlen(tmp) + strlen(installed) 
+ 1)) != NULL) {
-                               strcpy(str + strlen(str), installed);
-                               optstrings = alpm_list_add(optstrings, str);
-                       } else {
-                               free(tmp);
-                       }
+               char *depstr = alpm_dep_compute_string(optdep->depend);
+               char *tmp, *str = alpm_optdep_compute_string(optdep);
+               const char *state = NULL;
+
+               if(alpm_find_satisfier(pkgcache, depstr) && 
alpm_find_satisfier(remove, depstr) == NULL) {
+                       state = include_installed ? _(" [installed]") : NULL;
+               } else if(alpm_find_satisfier(add, depstr)) {
+                       state = include_installed ? _(" [installing]") : NULL;
+               } else if(alpm_find_satisfier(remove, depstr)) {
+                       state = _(" [removing]");
                } else {
-                       optstrings = alpm_list_add(optstrings, 
alpm_optdep_compute_string(optdep));
+                       optstrings = alpm_list_add(optstrings, str);
                }
+
+               if(state) {
+                       if((tmp = realloc(str, strlen(str) + strlen(state) + 
1)) != NULL) {
+                               strcpy(tmp + strlen(tmp), state);
+                               str = tmp;
+                       } /* if realloc fails, we only loose the state 
information, which is nonfatal. */
+                       optstrings = alpm_list_add(optstrings, str);
+               }
+               free(depstr);
        }
        return optstrings;
 }
-- 
1.7.6.1


Reply via email to