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; }