commit:     90fe066073722807b6a48f391e6500b28398830b
Author:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 14 09:30:23 2021 +0000
Commit:     Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon Jun 14 09:30:23 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=90fe0660

libq/tree: make tree_match_atom produce valid meta for binpkgs

copy meta appropriately in populate_cb when we deal with binpkgs
directly

Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>

 libq/tree.c | 54 ++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 36 insertions(+), 18 deletions(-)

diff --git a/libq/tree.c b/libq/tree.c
index 5a505f2..847a343 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -546,7 +546,10 @@ tree_next_pkg(tree_cat_ctx *cat_ctx)
        tree_ctx *ctx = cat_ctx->ctx;
        tree_pkg_ctx *ret = NULL;
 
-       if (ctx->cachetype == CACHE_EBUILD) {
+       if (ctx->do_sort && cat_ctx->pkg_ctxs != NULL) {
+               /* bypass to use the cache if it exists */
+               ret = tree_next_pkg_int(cat_ctx);
+       } else if (ctx->cachetype == CACHE_EBUILD) {
                char *p;
 
                /* serve *.ebuild files each as separate pkg_ctx with name set
@@ -1600,9 +1603,6 @@ tree_get_atom(tree_pkg_ctx *pkg_ctx, bool complete)
                                }
                                pkg_ctx->atom->REPO = pkg_ctx->repo;
                        }
-
-                       if (meta != NULL)
-                               tree_close_meta(meta);
                }
 
                /* this is a bit atom territory, but since we pulled in SLOT we
@@ -1659,12 +1659,12 @@ tree_get_atoms(tree_ctx *ctx, bool fullcpv, set *satoms)
 static int
 tree_match_atom_cache_populate_cb(tree_pkg_ctx *ctx, void *priv)
 {
-       set *cache = priv;
-       tree_cat_ctx *cat_ctx;
-       tree_pkg_ctx *pkg;
-       tree_ctx *tctx = ctx->cat_ctx->ctx;
-       depend_atom *atom = tree_get_atom(ctx, true);
-       tree_pkg_meta *meta = tree_pkg_read(ctx);
+       tree_cat_ctx  *cat_ctx;
+       tree_pkg_ctx  *pkg;
+       set           *cache   = priv;
+       tree_ctx      *tctx    = ctx->cat_ctx->ctx;
+       depend_atom   *atom    = tree_get_atom(ctx, true);
+       tree_pkg_meta *meta    = tree_pkg_read(ctx);
 
        (void)priv;
 
@@ -1686,10 +1686,31 @@ tree_match_atom_cache_populate_cb(tree_pkg_ctx *ctx, 
void *priv)
        pkg->name = xstrdup(pkg->atom->PF);
        pkg->repo = tctx->repo != NULL ? xstrdup(tctx->repo) : NULL;
        if (meta != NULL) {
+               pkg->fd = -2;  /* don't try to read, we fill it in here */
                pkg->meta = xmalloc(sizeof(*pkg->meta));
                memcpy(pkg->meta, meta, sizeof(*pkg->meta));
-               pkg->meta->Q__data = NULL;  /* avoid free here (just to be 
sure) */
-               pkg->fd = -2;  /* don't try to read, we already got it */
+               if (ctx->cat_ctx->ctx->cachetype == CACHE_PACKAGES) {
+                       pkg->meta->Q__data = NULL;  /* avoid free here (just to 
be sure) */
+               } else {  /* CACHE_BINPKG */
+                       char **newdata;
+                       int    elems;
+                       size_t datasize = (size_t)meta->Q__eclasses_;
+
+                       pkg->meta->Q__data = xmalloc(sizeof(char) * datasize);
+                       memcpy(pkg->meta->Q__data, meta->Q__data, datasize);
+
+                       /* re-position keys */
+                       newdata = (char **)pkg->meta;
+                       elems   = sizeof(tree_pkg_meta) / sizeof(char *);
+                       while (elems-- > 1)  /* skip Q__data itself */
+                               if (newdata[elems] != NULL)
+                                       newdata[elems] = pkg->meta->Q__data +
+                                               (newdata[elems] - 
meta->Q__data);
+
+                       /* drop garbage used for Q__data admin in original case 
*/
+                       pkg->meta->Q__eclasses_ = NULL;
+                       pkg->meta->Q__md5_      = NULL;
+               }
        } else {
                pkg->meta = NULL;
        }
@@ -1728,12 +1749,9 @@ tree_match_atom(tree_ctx *ctx, const depend_atom *query, 
int flags)
                else
                        cache = create_set();
 
-               if (ctx->cachetype == CACHE_PACKAGES)
-                       tree_foreach_packages(ctx,
-                                       tree_match_atom_cache_populate_cb, 
cache);
-               else  /* BINPKG */
-                       tree_foreach_pkg(ctx,
-                                       tree_match_atom_cache_populate_cb, 
cache, true, NULL);
+               tree_foreach_pkg(ctx,
+                               tree_match_atom_cache_populate_cb, cache, true, 
NULL);
+
                ctx->do_sort = true;  /* turn it back on */
                ctx->cache.all_categories = true;
 

Reply via email to