From: "Fabian Groffen" <grobian@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage-utils:master commit in: libq/, /
Date: Mon, 30 Dec 2019 17:24:49 +0000 (UTC) [thread overview]
Message-ID: <1577726481.c9e89dfa7cc3ae22bc3c731a3d617e4912bd831a.grobian@gentoo> (raw)
commit: c9e89dfa7cc3ae22bc3c731a3d617e4912bd831a
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon Dec 30 17:21:21 2019 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon Dec 30 17:21:21 2019 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=c9e89dfa
libq/tree: introduce a wrapper for retrieving ebuild metadata
To further hide the difference between trees, add a wrapper around
tree_get_meta, which deals with the underlying storage format. This is
most notably useful when dealing with vdb-based and binpkgs because they
have a specific or more expensive way of retrieval. This can now
properly be hidden from the q applets.
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/tree.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++------------
libq/tree.h | 55 +++++++++++---------
qdepends.c | 36 +++++--------
qkeyword.c | 6 +--
qlist.c | 71 +++-----------------------
qsearch.c | 16 ++----
quse.c | 71 +++++++++-----------------
7 files changed, 213 insertions(+), 208 deletions(-)
diff --git a/libq/tree.c b/libq/tree.c
index d9eec76..bac9d00 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -326,6 +326,7 @@ tree_open_pkg(tree_cat_ctx *cat_ctx, const char *name)
pkg_ctx->fd = -1;
pkg_ctx->cat_ctx = cat_ctx;
pkg_ctx->atom = NULL;
+ pkg_ctx->meta = NULL;
return pkg_ctx;
}
@@ -418,8 +419,7 @@ tree_next_pkg(tree_cat_ctx *cat_ctx)
tree_ctx *pkgdir = ctx->ebuilddir_ctx;
if (pkgdir == NULL)
- pkgdir = ctx->ebuilddir_ctx = xmalloc(sizeof(tree_ctx));
- memset(ctx->ebuilddir_ctx, '\0', sizeof(*ctx->ebuilddir_ctx));
+ pkgdir = ctx->ebuilddir_ctx = xzalloc(sizeof(tree_ctx));
ctx->ebuilddir_pkg_ctx = tree_next_pkg_int(cat_ctx);
if (ctx->ebuilddir_pkg_ctx == NULL)
@@ -554,13 +554,13 @@ tree_read_file_pms(tree_pkg_ctx *pkg_ctx)
if ((off_t)fread(ptr, 1, s.st_size, f) != s.st_size)
goto err;
- ret->DEPEND = ptr;
+ ret->Q_DEPEND = ptr;
#define next_line(curr, next) \
- if ((ptr = strchr(ret->curr, '\n')) == NULL) { \
+ if ((ptr = strchr(ret->Q_##curr, '\n')) == NULL) { \
warn("Invalid cache file for '%s'", buf); \
goto err; \
} \
- ret->next = ptr+1; \
+ ret->Q_##next = ptr+1; \
*ptr = '\0';
next_line(DEPEND, RDEPEND)
next_line(RDEPEND, SLOT)
@@ -630,7 +630,7 @@ tree_read_file_md5(tree_pkg_ctx *pkg_ctx)
* */
#define assign_var_cmp(keyname, cmpkey) \
if (strncmp(keyptr, cmpkey, strlen(cmpkey)) == 0) { \
- ret->keyname = valptr; \
+ ret->Q_##keyname = valptr; \
continue; \
}
#define assign_var(keyname) \
@@ -741,7 +741,7 @@ tree_read_file_ebuild(tree_pkg_ctx *pkg_ctx)
if (q < p && *p == '=') {
*p++ = '\0';
/* match variable against which ones we look for */
-#define match_key(X) else if (strcmp(q, #X) == 0) key = &ret->X
+#define match_key(X) else if (strcmp(q, #X) == 0) key = &ret->Q_##X
if (1 == 0); /* dummy for syntax */
match_key(DEPEND);
match_key(RDEPEND);
@@ -840,7 +840,7 @@ tree_read_file_binpkg_xpak_cb(
#define match_path(K) \
else if (pathname_len == (sizeof(#K) - 1) && strcmp(pathname, #K) == 0) \
- key = &m->K
+ key = &m->Q_##K
if (1 == 0); /* dummy for syntax */
match_path(DEPEND);
match_path(RDEPEND);
@@ -868,33 +868,33 @@ tree_read_file_binpkg_xpak_cb(
#undef match_path
/* hijack unused members */
- pos = (size_t)m->_eclasses_;
- len = (size_t)m->_md5_;
+ pos = (size_t)m->Q__eclasses_;
+ len = (size_t)m->Q__md5_;
/* trim whitespace (mostly trailing newline) */
while (isspace((int)data[data_offset + data_len - 1]))
data_len--;
if (len - pos < (size_t)data_len) {
- char *old_data = m->_data;
+ char *old_data = m->Q__data;
len += (((data_len + 1) / BUFSIZ) + 1) * BUFSIZ;
- m->_data = xrealloc(m->_data, len);
- m->_md5_ = (char *)len;
+ m->Q__data = xrealloc(m->Q__data, len);
+ m->Q__md5_ = (char *)len;
/* re-position existing keys */
- if (old_data != NULL && m->_data != old_data) {
+ if (old_data != NULL && m->Q__data != old_data) {
char **newdata = (char **)m;
int elems = sizeof(tree_pkg_meta) / sizeof(char *);
while (elems-- > 0)
if (newdata[elems] != NULL)
- newdata[elems] = m->_data + (newdata[elems] - old_data);
+ newdata[elems] = m->Q__data + (newdata[elems] - old_data);
}
}
- *key = m->_data + pos;
+ *key = m->Q__data + pos;
snprintf(*key, len - pos, "%.*s", data_len, data + data_offset);
pos += data_len + 1;
- m->_eclasses_ = (char *)pos;
+ m->Q__eclasses_ = (char *)pos;
}
static tree_pkg_meta *
@@ -941,7 +941,7 @@ tree_pkg_read(tree_pkg_ctx *pkg_ctx)
return (tree_pkg_meta *)pkg_ctx->cat_ctx->ctx->pkgs;
}
- warn("Unknown metadata cache type!");
+ warn("Unknown/unsupported metadata cache type!");
return NULL;
}
@@ -950,11 +950,101 @@ tree_close_meta(tree_pkg_meta *cache)
{
if (cache == NULL)
errf("Cache is empty !");
- if (cache->_data != NULL)
- free(cache->_data);
+ if (cache->Q__data != NULL)
+ free(cache->Q__data);
free(cache);
}
+char *
+tree_pkg_meta_get_int(tree_pkg_ctx *pkg_ctx, size_t offset, const char *keyn)
+{
+ tree_ctx *ctx = pkg_ctx->cat_ctx->ctx;
+ char **key;
+
+ /* offset is a byte offset in the tree_pkg_meta struct, pointing to
+ * key, the tree_pkg_meta_get macro takes care of this */
+
+ if (ctx->cachetype == CACHE_VDB) {
+ if (pkg_ctx->meta == NULL)
+ pkg_ctx->meta = xzalloc(sizeof(tree_pkg_meta));
+
+ key = (char **)((char *)&pkg_ctx->meta->Q__data + offset);
+
+ /* just eat the file if we haven't yet */
+ if (*key == NULL) {
+ int fd = tree_pkg_vdb_openat(pkg_ctx, keyn, O_RDONLY, 0);
+ struct stat s;
+ size_t pos;
+ size_t len;
+ tree_pkg_meta *m = pkg_ctx->meta;
+
+ if (fd < 0)
+ return NULL;
+ if (fstat(fd, &s) != 0 || s.st_size == 0) {
+ close(fd);
+ return NULL;
+ }
+
+ /* hijack unused members */
+ pos = (size_t)m->Q__eclasses_;
+ len = (size_t)m->Q__md5_;
+
+ /* TODO: this is an exact copy from tree_read_file_binpkg_xpak_cb */
+ if (len - pos < (size_t)s.st_size) {
+ char *old_data = m->Q__data;
+ len += (((s.st_size + 1) / BUFSIZ) + 1) * BUFSIZ;
+ m->Q__data = xrealloc(m->Q__data, len);
+ m->Q__md5_ = (char *)len;
+
+ /* re-position existing keys */
+ if (old_data != NULL && m->Q__data != old_data) {
+ char **newdata = (char **)m;
+ int elems = sizeof(tree_pkg_meta) / sizeof(char *);
+ while (elems-- > 0)
+ if (newdata[elems] != NULL)
+ newdata[elems] =
+ m->Q__data + (newdata[elems] - old_data);
+ }
+ }
+
+ if (read(fd, &m->Q__data[pos], s.st_size) == (ssize_t)s.st_size) {
+ char *p = *key = m->Q__data + pos;
+ p[s.st_size] = '\0';
+ while (s.st_size > 0 && isspace((int)p[s.st_size - 1]))
+ p[s.st_size--] = '\0';
+ pos += s.st_size + 1;
+ m->Q__eclasses_ = (char *)pos;
+ }
+ close(fd);
+ }
+ } else {
+ if (pkg_ctx->meta == NULL)
+ pkg_ctx->meta = tree_pkg_read(pkg_ctx);
+ if (pkg_ctx->meta == NULL)
+ return NULL;
+
+ key = (char **)((char *)&pkg_ctx->meta->Q__data + offset);
+
+ /* Packages are nice, but also a bit daft, because they don't
+ * contain everything available (for a semi-good reason though)
+ * We cannot downgrade the tree execution to BINPKGS, because
+ * we're running from tree_foreach_packages */
+ if (*key == NULL && ctx->cachetype == CACHE_PACKAGES) {
+ ctx->cachetype = CACHE_BINPKGS;
+ pkg_ctx->fd = -1;
+ pkg_ctx->meta = tree_pkg_read(pkg_ctx);
+ ctx->cachetype = CACHE_PACKAGES;
+ if (pkg_ctx->meta == NULL) {
+ /* hrmffff. */
+ pkg_ctx->fd = 0;
+ pkg_ctx->meta = tree_pkg_read(pkg_ctx);
+ }
+ key = (char **)((char *)&pkg_ctx->meta->Q__data + offset);
+ }
+ }
+ return *key;
+}
+
tree_metadata_xml *
tree_pkg_metadata(tree_pkg_ctx *pkg_ctx)
{
@@ -1058,6 +1148,9 @@ tree_close_pkg(tree_pkg_ctx *pkg_ctx)
if (pkg_ctx->cat_ctx->ctx->do_sort)
free((char *)pkg_ctx->name);
free(pkg_ctx->slot);
+ if (pkg_ctx->meta != NULL &&
+ (void *)pkg_ctx->meta != (void *)pkg_ctx->cat_ctx->ctx->pkgs)
+ tree_close_meta(pkg_ctx->meta);
free(pkg_ctx);
}
@@ -1067,18 +1160,16 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb callback, void *priv)
char *p = ctx->pkgs;
char *q;
char *c;
+ char pkgname[_Q_PATH_MAX];
size_t len = ctx->pkgslen;
int ret = 0;
/* reused for every entry */
- tree_cat_ctx *cat = xzalloc(sizeof(tree_cat_ctx));
+ tree_cat_ctx *cat = NULL;
tree_pkg_ctx *pkg = xzalloc(sizeof(tree_pkg_ctx));
tree_pkg_meta *meta = xzalloc(sizeof(tree_pkg_meta));
depend_atom *atom = NULL;
- cat->ctx = ctx;
- pkg->cat_ctx = cat;
-
do {
/* find next line */
c = NULL;
@@ -1093,15 +1184,26 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb callback, void *priv)
if (p == q) {
/* make callback with populated atom */
if (atom != NULL) {
+ size_t pkgnamelen;
+
/* store meta ptr in repo->pkgs, such that get_pkg_meta
* can grab it from there (for free) */
ctx->pkgs = (char *)meta;
- cat->name = atom->CATEGORY;
- pkg->name = atom->PN;
- pkg->slot = meta->SLOT == NULL ? (char *)"0" : meta->SLOT;
+ if (cat == NULL || strcmp(cat->name, atom->CATEGORY) != 0)
+ {
+ if (cat != NULL)
+ tree_close_cat(cat);
+ pkg->cat_ctx = cat = tree_open_cat(ctx, atom->CATEGORY);
+ }
+ pkgnamelen = snprintf(pkgname, sizeof(pkgname), "%s-%s.tbz2",
+ atom->PN, atom->PR_int > 0 ? atom->PVR : atom->PV);
+ pkgname[pkgnamelen - (sizeof(".tbz2") - 1)] = '\0';
+ pkg->name = pkgname;
+ pkg->slot = meta->Q_SLOT == NULL ? (char *)"0" : meta->Q_SLOT;
pkg->repo = ctx->repo;
pkg->atom = atom;
+ pkg->fd = 0; /* intentional, meta has already been read */
/* do call callback with pkg_atom (populate cat and pkg) */
ret |= callback(pkg, priv);
@@ -1140,7 +1242,7 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb callback, void *priv)
#define match_key(X) match_key2(X,X)
#define match_key2(X,Y) \
} else if (strcmp(p, #X) == 0) { \
- meta->Y = c
+ meta->Q_##Y = c
match_key(DEFINED_PHASES);
match_key(DEPEND);
match_key2(DESC, DESCRIPTION);
@@ -1234,8 +1336,8 @@ tree_get_atom(tree_pkg_ctx *pkg_ctx, bool complete)
if (pkg_ctx->slot == NULL) {
meta = tree_pkg_read(pkg_ctx);
if (meta != NULL) {
- if (meta->SLOT != NULL) {
- pkg_ctx->slot = xstrdup(meta->SLOT);
+ if (meta->Q_SLOT != NULL) {
+ pkg_ctx->slot = xstrdup(meta->Q_SLOT);
pkg_ctx->slot_len = strlen(pkg_ctx->slot);
}
}
@@ -1247,8 +1349,8 @@ tree_get_atom(tree_pkg_ctx *pkg_ctx, bool complete)
if (pkg_ctx->repo == NULL && ctx->cachetype == CACHE_BINPKGS) {
if (meta == NULL)
meta = tree_pkg_read(pkg_ctx);
- if (meta != NULL && meta->repository != NULL) {
- pkg_ctx->repo = xstrdup(meta->repository);
+ if (meta != NULL && meta->Q_repository != NULL) {
+ pkg_ctx->repo = xstrdup(meta->Q_repository);
pkg_ctx->repo_len = strlen(pkg_ctx->repo);
}
}
diff --git a/libq/tree.h b/libq/tree.h
index aacfb14..8a37cbb 100644
--- a/libq/tree.h
+++ b/libq/tree.h
@@ -8,6 +8,7 @@
#include <dirent.h>
#include <stdbool.h>
+#include <stddef.h>
#include "atom.h"
#include "set.h"
@@ -67,37 +68,38 @@ struct tree_pkg_ctx {
int fd;
tree_cat_ctx *cat_ctx;
depend_atom *atom;
+ tree_pkg_meta *meta;
};
/* Ebuild data */
struct tree_pkg_meta {
- char *_data;
- char *DEPEND; /* line 1 */
- char *RDEPEND;
- char *SLOT;
- char *SRC_URI;
- char *RESTRICT; /* line 5 */
- char *HOMEPAGE;
- char *LICENSE;
- char *DESCRIPTION;
- char *KEYWORDS;
- char *INHERITED; /* line 10 */
- char *IUSE;
- char *CDEPEND;
- char *PDEPEND;
- char *PROVIDE; /* line 14 */
- char *EAPI;
- char *PROPERTIES;
+ char *Q__data;
+ char *Q_DEPEND; /* line 1 */
+ char *Q_RDEPEND;
+ char *Q_SLOT;
+ char *Q_SRC_URI;
+ char *Q_RESTRICT; /* line 5 */
+ char *Q_HOMEPAGE;
+ char *Q_LICENSE;
+ char *Q_DESCRIPTION;
+ char *Q_KEYWORDS;
+ char *Q_INHERITED; /* line 10 */
+ char *Q_IUSE;
+ char *Q_CDEPEND;
+ char *Q_PDEPEND;
+ char *Q_PROVIDE; /* line 14 */
+ char *Q_EAPI;
+ char *Q_PROPERTIES;
/* These are MD5-Cache only */
- char *DEFINED_PHASES;
- char *REQUIRED_USE;
- char *BDEPEND;
- char *_eclasses_;
- char *_md5_;
+ char *Q_DEFINED_PHASES;
+ char *Q_REQUIRED_USE;
+ char *Q_BDEPEND;
+ char *Q__eclasses_;
+ char *Q__md5_;
/* binpkgs/vdb */
- char *CONTENTS;
- char *USE;
- char *repository;
+ char *Q_CONTENTS;
+ char *Q_USE;
+ char *Q_repository;
};
/* Metadata.xml */
@@ -132,6 +134,9 @@ FILE *tree_pkg_vdb_fopenat(tree_pkg_ctx *pkg_ctx, const char *file,
bool tree_pkg_vdb_eat(tree_pkg_ctx *pkg_ctx, const char *file, char **bufptr, size_t *buflen);
tree_pkg_meta *tree_pkg_read(tree_pkg_ctx *pkg_ctx);
void tree_close_meta(tree_pkg_meta *cache);
+char *tree_pkg_meta_get_int(tree_pkg_ctx *pkg_ctx, size_t offset, const char *key);
+#define tree_pkg_meta_get(P,X) \
+ tree_pkg_meta_get_int(P, offsetof(tree_pkg_meta, Q_##X), #X)
tree_metadata_xml *tree_pkg_metadata(tree_pkg_ctx *pkg_ctx);
void tree_close_metadata(tree_metadata_xml *meta_ctx);
void tree_close_pkg(tree_pkg_ctx *pkg_ctx);
diff --git a/qdepends.c b/qdepends.c
index 6f89835..9969d90 100644
--- a/qdepends.c
+++ b/qdepends.c
@@ -114,7 +114,6 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
int ret = 0;
dep_node *dep_tree;
char **d;
- tree_pkg_meta *meta = NULL;
char *depstr;
/* matrix consists of:
@@ -155,27 +154,17 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
xarrayfree_int(state->deps);
clear_set(state->udeps);
- if (state->qmode & QMODE_TREE)
- if ((meta = tree_pkg_read(pkg_ctx)) == NULL)
- return ret;
dfile = depend_files;
for (i = QMODE_DEPEND; i <= QMODE_BDEPEND; i <<= 1, dfile++) {
if (!(state->qmode & i))
continue;
- if (state->qmode & QMODE_INSTALLED) {
- if (!tree_pkg_vdb_eat(pkg_ctx, *dfile,
- &state->depend, &state->depend_len))
- continue;
- depstr = state->depend;
- } else {
- depstr = i == 1<<0 ? meta->DEPEND :
- i == 1<<1 ? meta->RDEPEND :
- i == 1<<2 ? meta->PDEPEND :
- i == 1<<3 ? meta->BDEPEND : NULL;
- if (depstr == NULL)
- continue;
- }
+ depstr = i == 1<<0 ? tree_pkg_meta_get(pkg_ctx, DEPEND) :
+ i == 1<<1 ? tree_pkg_meta_get(pkg_ctx, RDEPEND) :
+ i == 1<<2 ? tree_pkg_meta_get(pkg_ctx, PDEPEND) :
+ i == 1<<3 ? tree_pkg_meta_get(pkg_ctx, BDEPEND) : NULL;
+ if (depstr == NULL)
+ continue;
dep_tree = dep_grow_tree(depstr);
if (dep_tree == NULL)
continue;
@@ -188,10 +177,13 @@ qdepends_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
tree_pkg_ctx *vpkg =
tree_open_pkg(vcat, pkg_ctx->name);
if (vpkg != NULL) {
- if (tree_pkg_vdb_eat(vpkg, *dfile,
- &state->depend, &state->depend_len))
- {
- dep_node *dep_vdb = dep_grow_tree(state->depend);
+ depstr = i == 1<<0 ? tree_pkg_meta_get(vpkg, DEPEND) :
+ i == 1<<1 ? tree_pkg_meta_get(vpkg, RDEPEND) :
+ i == 1<<2 ? tree_pkg_meta_get(vpkg, PDEPEND) :
+ i == 1<<3 ? tree_pkg_meta_get(vpkg, BDEPEND) :
+ NULL;
+ if (depstr != NULL) {
+ dep_node *dep_vdb = dep_grow_tree(depstr);
if (dep_vdb != NULL)
dep_flatten_tree(dep_vdb, state->deps);
}
@@ -299,8 +291,6 @@ int qdepends_main(int argc, char **argv)
.deps = deps,
.udeps = create_set(),
.qmode = 0,
- .depend = NULL,
- .depend_len = 0,
.format = "%[CATEGORY]%[PF]",
.vdb = NULL,
};
diff --git a/qkeyword.c b/qkeyword.c
index 4e84ebd..70f75de 100644
--- a/qkeyword.c
+++ b/qkeyword.c
@@ -643,7 +643,6 @@ qkeyword_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
qkeyword_data *data = (qkeyword_data *)priv;
char buf[_Q_PATH_MAX];
depend_atom *patom = NULL;
- tree_pkg_meta *meta;
tree_metadata_xml *metadata;
struct elist *emailw;
int ret;
@@ -679,11 +678,8 @@ qkeyword_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
}
keywords = data->keywordsbuf;
- meta = tree_pkg_read(pkg_ctx);
- if (meta == NULL)
- return EXIT_FAILURE;
- if (read_keywords(meta->KEYWORDS, keywords) < 0) {
+ if (read_keywords(tree_pkg_meta_get(pkg_ctx, KEYWORDS), keywords) < 0) {
if (verbose)
warn("Failed to read keywords for %s%s/%s%s%s",
BOLD, pkg_ctx->cat_ctx->name, BLUE, pkg_ctx->name, NORM);
diff --git a/qlist.c b/qlist.c
index 3f20ced..1d4862f 100644
--- a/qlist.c
+++ b/qlist.c
@@ -329,45 +329,14 @@ struct qlist_opt_state {
const char *fmt;
};
-struct qlist_xpakcbctx {
- const char *key;
- char *retdata;
- size_t retlen;
-};
-
-static void
-_qlist_xpakcb(
- void *ctx,
- char *pathname,
- int pathname_len,
- int data_offset,
- int data_len,
- char *data)
-{
- struct qlist_xpakcbctx *xctx = ctx;
- (void)pathname_len;
-
- /* see if this path matches what we're looking for */
- if (strcmp(pathname, xctx->key) != 0)
- return;
-
- xctx->retdata = xrealloc(xctx->retdata, data_len + 1);
- memcpy(xctx->retdata, data + data_offset, data_len + 1);
- xctx->retlen = data_len;
-}
-
static int
qlist_cb(tree_pkg_ctx *pkg_ctx, void *priv)
{
struct qlist_opt_state *state = priv;
int i;
- FILE *fp;
+ char *contents;
+ char *line;
depend_atom *atom;
- struct qlist_xpakcbctx cbctx = {
- .key = "CONTENTS",
- .retdata = NULL,
- .retlen = 0,
- };
/* see if this cat/pkg is requested */
if (!state->all) {
@@ -392,38 +361,15 @@ qlist_cb(tree_pkg_ctx *pkg_ctx, void *priv)
printf("%s %sCONTENTS%s:\n",
atom_format(state->fmt, atom), DKBLUE, NORM);
- if (state->do_binpkgs) {
- char xpak[_Q_PATH_MAX];
- int ret;
- snprintf(xpak, sizeof(xpak), "%s/%s/%s/%s-%s.tbz2",
- portroot, pkgdir, atom->CATEGORY, atom->PN,
- atom->PR_int > 0 ? atom->PVR : atom->PV);
- ret = xpak_extract(xpak, &cbctx, &_qlist_xpakcb);
- if (ret != 0 || cbctx.retdata == NULL)
- fp = NULL;
- else
-#ifdef HAVE_FMEMOPEN
- fp = fmemopen(cbctx.retdata, cbctx.retlen, "r");
-#else
- {
- /* resort to writing a file in tmpspace */
- fp = tmpfile();
- if (fp != NULL) {
- fwrite(cbctx.retdata, 1, cbctx.retlen, fp);
- fseek(fp, 0, SEEK_SET);
- }
- }
-#endif
- } else {
- fp = tree_pkg_vdb_fopenat_ro(pkg_ctx, "CONTENTS");
- }
- if (fp == NULL)
+ if ((contents = tree_pkg_meta_get(pkg_ctx, CONTENTS)) == NULL)
return 1;
- while (getline(&state->buf, &state->buflen, fp) != -1) {
+ while ((line = strtok(contents, "\n")) != NULL) {
contents_entry *e;
- e = contents_parse_line(state->buf);
+ contents = NULL; /* for strtok */
+
+ e = contents_parse_line(line);
if (!e)
continue;
@@ -455,9 +401,6 @@ qlist_cb(tree_pkg_ctx *pkg_ctx, void *priv)
break;
}
}
- fclose(fp);
- if (state->do_binpkgs && cbctx.retdata != NULL)
- free(cbctx.retdata);
return 1;
}
diff --git a/qsearch.c b/qsearch.c
index d6470f6..a26e2d6 100644
--- a/qsearch.c
+++ b/qsearch.c
@@ -66,7 +66,6 @@ qsearch_cb(tree_pkg_ctx *pkg_ctx, void *priv)
struct qsearch_state *state = (struct qsearch_state *)priv;
depend_atom *atom;
- tree_pkg_meta *meta;
char *desc;
bool match;
@@ -84,17 +83,13 @@ qsearch_cb(tree_pkg_ctx *pkg_ctx, void *priv)
match = true;
desc = NULL;
- meta = NULL;
if ((match && (state->show_homepage || state->show_desc)) ||
(!match && state->search_desc))
{
- meta = tree_pkg_read(pkg_ctx);
- if (meta != NULL) {
- if (state->show_homepage)
- desc = meta->HOMEPAGE;
- else if (state->show_desc)
- desc = meta->DESCRIPTION;
- }
+ if (state->show_homepage)
+ desc = tree_pkg_meta_get(pkg_ctx, HOMEPAGE);
+ else if (state->show_desc)
+ desc = tree_pkg_meta_get(pkg_ctx, DESCRIPTION);
}
if (!match && state->search_desc && desc != NULL &&
@@ -109,9 +104,6 @@ qsearch_cb(tree_pkg_ctx *pkg_ctx, void *priv)
(state->show_name ? "" : desc ? desc : ""));
}
- if (meta != NULL)
- tree_close_meta(meta);
-
if (last_atom != NULL)
atom_implode(last_atom);
last_atom = atom;
diff --git a/quse.c b/quse.c
index df8626e..be34e48 100644
--- a/quse.c
+++ b/quse.c
@@ -412,7 +412,6 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
struct quse_state *state = (struct quse_state *)priv;
depend_atom *atom = NULL; /* pacify compiler */
char buf[8192];
- tree_pkg_meta *meta;
set *use = NULL;
bool match;
char *p;
@@ -439,52 +438,38 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
}
}
- if (state->overlay != NULL) {
- meta = tree_pkg_read(pkg_ctx);
- if (meta == NULL)
+ if (!state->do_licence) {
+ if (tree_pkg_meta_get(pkg_ctx, IUSE) == NULL)
return 0;
- if (meta->IUSE == NULL)
- return 0;
- } else {
- size_t dummy;
-
- meta = xzalloc(sizeof(*meta));
- dummy = 0;
- if (!tree_pkg_vdb_eat(pkg_ctx, "IUSE", &meta->IUSE, &dummy)) {
- free(meta);
- return 0;
+ if (state->do_describe) {
+ portdirfd = openat(pkg_ctx->cat_ctx->ctx->portroot_fd,
+ state->overlay == NULL ? main_overlay : state->overlay,
+ O_RDONLY | O_CLOEXEC | O_PATH);
+ if (portdirfd == -1)
+ return 0;
}
- dummy = 0;
- tree_pkg_vdb_eat(pkg_ctx, "LICENSE", &meta->LICENSE, &dummy);
-
- s = NULL;
- dummy = 0;
- tree_pkg_vdb_eat(pkg_ctx, "USE", &s, &dummy);
- p = s;
- while ((q = strchr(p, (int)' ')) != NULL) {
- *q++ = '\0';
- use = add_set(p, use);
- p = q;
+ /* available when dealing with VDB or binpkgs */
+ if ((p = tree_pkg_meta_get(pkg_ctx, USE)) != NULL) {
+ while ((q = strchr(p, (int)' ')) != NULL) {
+ *q++ = '\0';
+ use = add_set(p, use);
+ p = q;
+ }
+ if (*p != '\0')
+ use = add_set(p, use);
}
- if (*p != '\0')
- use = add_set(p, use);
- free(s);
- }
-
- if (state->do_describe) {
- portdirfd = openat(pkg_ctx->cat_ctx->ctx->portroot_fd,
- state->overlay == NULL ? main_overlay : state->overlay,
- O_RDONLY | O_CLOEXEC | O_PATH);
- if (portdirfd == -1)
+ } else {
+ if (tree_pkg_meta_get(pkg_ctx, LICENSE) == NULL)
return 0;
}
maxlen = 0;
cnt = 0;
match = false;
- q = p = state->do_licence ? meta->LICENSE : meta->IUSE;
+ q = p = state->do_licence ?
+ tree_pkg_meta_get(pkg_ctx, LICENSE) : tree_pkg_meta_get(pkg_ctx, IUSE);
buf[0] = '\0';
v = buf;
w = buf + sizeof(buf);
@@ -567,7 +552,7 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
printf("%s\n", atom_format(state->fmt, atom));
- q = p = meta->IUSE;
+ q = p = tree_pkg_meta_get(pkg_ctx, IUSE);
buf[0] = '\0';
v = buf;
w = buf + sizeof(buf);
@@ -652,16 +637,8 @@ quse_results_cb(tree_pkg_ctx *pkg_ctx, void *priv)
}
}
- if (state->overlay != NULL) {
- tree_close_meta(meta);
- } else {
- free(meta->IUSE);
- if (meta->LICENSE != NULL)
- free(meta->LICENSE);
- free(meta);
- if (use != NULL)
- free_set(use);
- }
+ if (use != NULL)
+ free_set(use);
if (state->do_describe)
close(portdirfd);
next reply other threads:[~2019-12-30 17:24 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-30 17:24 Fabian Groffen [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-06-27 19:19 [gentoo-commits] proj/portage-utils:master commit in: libq/, / Fabian Groffen
2024-03-29 10:57 Fabian Groffen
2024-01-02 7:57 Fabian Groffen
2023-02-07 8:25 Fabian Groffen
2023-02-07 8:10 Fabian Groffen
2021-08-16 13:23 Fabian Groffen
2020-02-21 8:18 Fabian Groffen
2020-01-05 13:28 Fabian Groffen
2020-01-02 11:19 Fabian Groffen
2020-01-01 19:52 Fabian Groffen
2019-12-31 9:05 Fabian Groffen
2019-12-29 13:26 Fabian Groffen
2019-12-27 16:57 Fabian Groffen
2019-07-13 10:04 Fabian Groffen
2019-06-19 10:44 Fabian Groffen
2019-06-05 9:15 Fabian Groffen
2019-05-09 20:19 Fabian Groffen
2019-05-05 18:13 Fabian Groffen
2019-04-28 15:20 Fabian Groffen
2019-03-27 20:18 Fabian Groffen
2019-03-27 10:55 Fabian Groffen
2019-03-22 9:57 Fabian Groffen
2019-03-19 20:32 Fabian Groffen
2019-03-19 20:32 Fabian Groffen
2019-03-09 18:58 Fabian Groffen
2018-03-23 11:56 Fabian Groffen
2016-12-29 2:25 Mike Frysinger
2016-11-26 23:17 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1577726481.c9e89dfa7cc3ae22bc3c731a3d617e4912bd831a.grobian@gentoo \
--to=grobian@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox