commit: 28e06dd13f80b12c36278e39e5b7a76344d1ba79
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Tue Feb 17 18:57:03 2026 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Tue Feb 17 18:57:03 2026 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=28e06dd1
libq/dep: add resolver-related functions
allow constructing a dep-tree from an atom, and to retrieve the resolved
tree_pkg_ctx instances
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
libq/dep.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
libq/dep.h | 17 ++++++++++-----
libq/set.h | 1 -
3 files changed, 81 insertions(+), 11 deletions(-)
diff --git a/libq/dep.c b/libq/dep.c
index 930086da..044304b7 100644
--- a/libq/dep.c
+++ b/libq/dep.c
@@ -404,6 +404,23 @@ dep_grow_tree_fail:
return ret;
}
+dep_node_t *dep_new_atom
+(
+ atom_ctx *atom
+)
+{
+ dep_node_t *ret;
+
+ if (atom == NULL)
+ return NULL;
+
+ ret = xzalloc(sizeof(*ret));
+ ret->type = DEP_ATOM;
+ ret->atom = atom_clone(atom);
+
+ return ret;
+}
+
static void dep_print_tree_int
(
FILE *fp,
@@ -799,7 +816,8 @@ dep_status_t dep_resolve_tree
static void dep_flatten_tree_int
(
dep_node_t *root,
- array *out
+ array *out,
+ bool atom
)
{
if (root->type == DEP_NULL ||
@@ -812,11 +830,14 @@ static void dep_flatten_tree_int
size_t n;
array_for_each(root->members, n, memb)
- dep_flatten_tree_int(memb, out);
+ dep_flatten_tree_int(memb, out, atom);
}
else if (root->atom != NULL)
{
- array_append(out, root->atom);
+ if (atom)
+ array_append(out, root->atom);
+ else
+ array_append(out, root);
}
}
@@ -834,9 +855,54 @@ array *dep_flatten_tree
/* simple wrapper around weird interface which is very suitable for
* recursive behaviour */
- dep_flatten_tree_int(root, out);
+ dep_flatten_tree_int(root, out, true);
return out;
}
+array *dep_nodes
+(
+ dep_node_t *root
+)
+{
+ array *out = array_new();
+
+ dep_flatten_tree_int(root, out, false);
+
+ return out;
+}
+
+tree_pkg_ctx *dep_node_pkg
+(
+ dep_node_t *node
+)
+{
+ if (node == NULL)
+ return NULL;
+
+ return node->pkg;
+}
+
+tree_pkg_ctx *dep_node_ipkg
+(
+ dep_node_t *node
+)
+{
+ if (node == NULL)
+ return NULL;
+
+ return node->ipkg;
+}
+
+atom_ctx *dep_node_atom
+(
+ dep_node_t *node
+)
+{
+ if (node == NULL)
+ return NULL;
+
+ return node->atom;
+}
+
/* vim: set ts=2 sw=2 expandtab cino+=\:0 foldmethod=marker: */
diff --git a/libq/dep.h b/libq/dep.h
index db5eeb7e..705f9172 100644
--- a/libq/dep.h
+++ b/libq/dep.h
@@ -34,12 +34,17 @@ array *dep_flatten_tree(dep_node_t *root);
void dep_burn_tree(dep_node_t *root);
/* 2026 API boring (but predictable) names */
-#define dep_new(D) dep_grow_tree(D)
-#define dep_print(F,D,S,M,C,V) dep_print_tree(F,D,S,M,C,V)
-#define dep_resolve(D,T,U,B) dep_resolve_tree(D,T,U,B)
-#define dep_prune(D,U) dep_prune_use(D,U)
-#define dep_flatten(D) dep_flatten_tree(D);
-#define dep_free(D) dep_burn_tree(D)
+#define dep_new(D) dep_grow_tree(D)
+dep_node_t *dep_new_atom(atom_ctx *atom);
+#define dep_print(F,D,S,M,C,V) dep_print_tree(F,D,S,M,C,V)
+#define dep_resolve(D,T,U,B) dep_resolve_tree(D,T,U,B)
+#define dep_prune(D,U) dep_prune_use(D,U)
+#define dep_flatten(D) dep_flatten_tree(D);
+#define dep_free(D) dep_burn_tree(D)
+array *dep_nodes(dep_node_t *node);
+tree_pkg_ctx *dep_node_pkg(dep_node_t *node);
+tree_pkg_ctx *dep_node_ipkg(dep_node_t *node);
+atom_ctx *dep_node_atom(dep_node_t *node);
#endif
diff --git a/libq/set.h b/libq/set.h
index cb30832c..6df627a3 100644
--- a/libq/set.h
+++ b/libq/set.h
@@ -51,7 +51,6 @@ typedef struct set_ set;
#define clear_set(S) set_clear(S)
#define free_set(S) set_free(S)
-
#endif
/* vim: set ts=2 sw=2 expandtab cino+=\:0 foldmethod=marker: */