commit:     7fa57849a692a2900417ed13f67b6c6385a2932e
Author:     Joakim Tjernlund <joakim.tjernlund <AT> infinera <DOT> com>
AuthorDate: Thu Mar  8 21:53:52 2018 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Fri Mar 23 11:18:49 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=7fa57849

qmerge: Choose SLOTed packages correctly

Ex. packages are readeline, ncurses which can be installed
in several SLOTs

Signed-off-by: Joakim Tjernlund <joakim.tjernlund <AT> infinera.com>
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 qmerge.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/qmerge.c b/qmerge.c
index ebd4960..1f75acc 100644
--- a/qmerge.c
+++ b/qmerge.c
@@ -203,6 +203,7 @@ qmerge_initialize(void)
 struct qmerge_bv_state {
        const char *catname;
        const char *pkgname;
+       const char *slot;
        char buf[4096];
        char *retbuf;
 };
@@ -219,19 +220,20 @@ qmerge_best_version_cb(q_vdb_pkg_ctx *pkg_ctx, void *priv)
 {
        struct qmerge_bv_state *state = priv;
        if (qlist_match(pkg_ctx, state->buf, NULL, true))
-               snprintf(state->retbuf, sizeof(state->buf), "%s/%s",
-                       pkg_ctx->cat_ctx->name, pkg_ctx->name);
+               snprintf(state->retbuf, sizeof(state->buf), "%s/%s:%s",
+                        pkg_ctx->cat_ctx->name, pkg_ctx->name, state->slot);
        return 0;
 }
 
 static char *
-best_version(const char *catname, const char *pkgname)
+best_version(const char *catname, const char *pkgname, const char *slot)
 {
        static int vdb_check = 1;
        static char retbuf[4096];
        struct qmerge_bv_state state = {
                .catname = catname,
                .pkgname = pkgname,
+               .slot = slot,
                .retbuf = retbuf,
        };
 
@@ -252,8 +254,8 @@ best_version(const char *catname, const char *pkgname)
        }
 
        retbuf[0] = '\0';
-       snprintf(state.buf, sizeof(state.buf), "%s%s%s",
-               catname ? : "", catname ? "/" : "", pkgname);
+       snprintf(state.buf, sizeof(state.buf), "%s%s%s:%s",
+                catname ? : "", catname ? "/" : "", pkgname, slot);
        q_vdb_foreach_pkg(qmerge_best_version_cb, &state, qmerge_filter_cat);
 
  done:
@@ -359,7 +361,8 @@ qprint_tree_node(int level, const depend_atom *atom, const 
struct pkg_t *pkg)
        if (!pretend)
                return 0;
 
-       p = best_version(pkg->CATEGORY, atom->PN);
+       p = best_version(pkg->CATEGORY, atom->PN, pkg->SLOT);
+
        if (strlen(p) < 1) {
                c = 'N';
                snprintf(buf, sizeof(buf), "%sN%s", GREEN, NORM);
@@ -844,7 +847,8 @@ pkg_merge(int level, const depend_atom *atom, const struct 
pkg_t *pkg)
 
                                                ratom = atom_explode(buf);
 
-                                               p = 
best_version(subpkg->CATEGORY, subpkg->PF);
+                                               p = 
best_version(subpkg->CATEGORY, subpkg->PF, subpkg->SLOT);
+
                                                /* we dont want to remerge 
equal versions here */
                                                IF_DEBUG(fprintf(stderr, 
"+Installed: %s\n", p));
                                                if (strlen(p) < 1)
@@ -1373,7 +1377,7 @@ print_Pkg(int full, const depend_atom *atom, const struct 
pkg_t *pkg)
                if (strcmp(pkg->REPO, "gentoo") != 0)
                        printf(" %sRepo%s:%s %s\n", DKGREEN, YELLOW, NORM, 
pkg->REPO);
 
-       if ((p = best_version(pkg->CATEGORY, atom->PN)) != NULL) {
+       if ((p = best_version(pkg->CATEGORY, atom->PN, pkg->SLOT)) != NULL) {
                if (*p) {
                        int ret;
                        const char *icolor = RED;
@@ -1475,6 +1479,7 @@ grab_binpkg_info(const char *name)
        static char best_match[sizeof(Pkg.PF)+2+sizeof(Pkg.CATEGORY)];
 
        best_match[0] = 0;
+       strcpy(pkg->SLOT,"0");
 
        fp = open_binpkg_index();
 
@@ -1511,6 +1516,7 @@ grab_binpkg_info(const char *name)
                                        atom_implode(atom);
                                }
                                memset(pkg, 0, sizeof(struct pkg_t));
+                               strcpy(pkg->SLOT,"0");
                        }
                        continue;
                }

Reply via email to