[PATCH] pactree: Implement handling of multiple packages

Sebastian Jakubiak jakseb.dev at gmail.com
Fri Mar 6 02:10:38 UTC 2020


Make it possible to invoke pactree for multiple packages at once.

Signed-off-by: Sebastian Jakubiak <jakseb.dev at gmail.com>
---

This patch is designed to be applied on top of the one from the parent
message.

 src/pactree.c | 51 ++++++++++++++++++++++++++++++++-------------------
 1 file changed, 32 insertions(+), 19 deletions(-)

diff --git a/src/pactree.c b/src/pactree.c
index 9f074fe..1775587 100644
--- a/src/pactree.c
+++ b/src/pactree.c
@@ -354,7 +354,7 @@ static int parse_options(int argc, char *argv[])
 		}
 	}
 
-	if(!argv[optind] || argv[optind + 1]) {
+	if(!argv[optind]) {
 		usage();
 		return 1;
 	}
@@ -430,12 +430,18 @@ static void print(const char *parentname, const char *pkgname,
 	}
 }
 
-static void print_start(const char *pkgname, const char *provname)
+static void print_start(void)
 {
 	if(graphviz) {
 		printf("digraph G { START [color=red, style=filled];\n"
-				"node [style=filled, color=green];\n"
-				" \"START\" -> \"%s\";\n", pkgname);
+				"node [style=filled, color=green];\n");
+	}
+}
+
+static void print_target(const char *pkgname, const char *provname)
+{
+	if(graphviz) {
+		printf(" \"START\" -> \"%s\";\n", pkgname);
 	} else {
 		tdepth d = {
 			NULL,
@@ -526,7 +532,7 @@ static void walk_deps(alpm_list_t *dblist, alpm_pkg_t *pkg, tdepth *depth, int r
 
 int main(int argc, char *argv[])
 {
-	int freelist = 0, ret;
+	int freelist = 0, ret, target_ind;
 	alpm_errno_t err;
 	const char *target_name;
 	alpm_pkg_t *pkg;
@@ -560,23 +566,30 @@ int main(int argc, char *argv[])
 		freelist = 1;
 	}
 
-	/* we only care about the first non option arg for walking */
-	target_name = argv[optind];
-
-	pkg = alpm_find_dbs_satisfier(handle, dblist, target_name);
-	if(!pkg) {
-		fprintf(stderr, "error: package '%s' not found\n", target_name);
-		cleanup(1);
-	}
+	for(target_ind = optind; argv[target_ind]; ++target_ind) {
+		target_name = argv[target_ind];
+		pkg = alpm_find_dbs_satisfier(handle, dblist, target_name);
+		if(!pkg) {
+			fprintf(stderr, "error: package '%s' not found\n", target_name);
+			cleanup(1);
+		}
+	}
 
+	print_start();
+
-	print_start(alpm_pkg_get_name(pkg), target_name);
-
-	tdepth d = {
-		NULL,
-		NULL,
-		1
-	};
-	walk_deps(dblist, pkg, &d, reverse);
+	for(target_ind = optind; argv[target_ind]; ++target_ind) {
+		target_name = argv[target_ind];
+		pkg = alpm_find_dbs_satisfier(handle, dblist, target_name);
+
+		print_target(alpm_pkg_get_name(pkg), target_name);
+
+		tdepth d = {
+			NULL,
+			NULL,
+			1
+		};
+		walk_deps(dblist, pkg, &d, reverse);
+	}
 
 	print_end();
 
-- 
2.25.0


More information about the pacman-contrib mailing list