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: */

Reply via email to