commit: e0c54a00b159e72f60aa1b02368455684cdd5bf0
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Thu Jan 1 15:28:21 2026 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Thu Jan 1 15:28:21 2026 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=e0c54a00
libq/tree: support xpak extension for tbz2 binpkgs
Another plot-twist in Portage's binpkg support is to name tbz2
binpackages as xpak (which is the extension for the xpak format, but
YOLO) when FEATURES="binpkg-multi-instance" is set. It only complicates
a little bit further on the already convoluted logic.
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/tree.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/libq/tree.c b/libq/tree.c
index 3f67d42..6f5492a 100644
--- a/libq/tree.c
+++ b/libq/tree.c
@@ -542,7 +542,8 @@ tree_open_pkg(tree_cat_ctx *cat_ctx, const char *name)
if (!isgpkg &&
(len > sizeof(".tbz2") - 1 &&
(p = (char *)&name[len - (sizeof(".tbz2") - 1)]) !=
NULL &&
- memcmp(p, ".tbz2", sizeof(".tbz2") - 1) == 0))
+ (memcmp(p, ".tbz2", sizeof(".tbz2") - 1) == 0 ||
+ memcmp(p, ".xpak", sizeof(".xpak") - 1) == 0)))
{
isxpk = true;
patom = atom_explode_cat(name, cat_ctx->name);
@@ -1310,7 +1311,8 @@ tree_pkg_read_openfd_int(tree_pkg_ctx *pkg_ctx)
char buf[_Q_PATH_MAX];
snprintf(buf, sizeof(buf), "%s.%s", pkg_ctx->name,
ctx->treetype == TREE_EBUILD ?
"ebuild" :
- pkg_ctx->binpkg_isgpkg ? "gpkg.tar" :
"tbz2");
+ pkg_ctx->binpkg_isgpkg ? "gpkg.tar" :
+ pkg_ctx->binpkg_ismulti ? "xpak" :
"tbz2");
pkg_ctx->fd = openat(pkg_ctx->cat_ctx->fd, buf,
O_RDONLY |
O_CLOEXEC);
} else {
@@ -1771,6 +1773,14 @@ tree_foreach_packages(tree_ctx *ctx, tree_pkg_cb
callback, void *priv)
pkgnamelen = snprintf(pkgname,
sizeof(pkgname),
"%s.tbz2", atom->PF);
pkgname[pkgnamelen -
(sizeof(".tbz2") - 1)] = '\0';
+ } else if (plen > sizeof(".xpak") - 1 &&
+ memcmp(meta.Q_PATH +
plen -
+
(sizeof(".xpak") - 1),
+
".xpak", sizeof(".xpak") - 1) == 0)
+ {
+ pkgnamelen = snprintf(pkgname,
sizeof(pkgname),
+
"%s.xpak", atom->PF);
+ pkgname[pkgnamelen -
(sizeof(".xpak") - 1)] = '\0';
} else if (plen > sizeof(".gpkg.tar") -
1 &&
memcmp(meta.Q_PATH + plen -
(sizeof(".gpkg.tar") - 1),
".gpkg.tar",
sizeof(".gpkg.tar") - 1) == 0)
@@ -2366,7 +2376,7 @@ tree_match_search_cat_int(
cat_ctx->ctx->treetype ==
TREE_EBUILD ? ".ebuild" :
(cat_ctx->ctx->treetype ==
TREE_BINPKGS ||
cat_ctx->ctx->treetype ==
TREE_PACKAGES) ?
- (pkg_ctx->binpkg_isgpkg ?
".gpkg.tar" : ".tbz2") :
+ (pkg_ctx->binpkg_isgpkg ?
".gpkg.tar" : ".xpak") :
"");
} else {
snprintf(n->path, sizeof(n->path), "%s/%s/%s%s",