[PATCH v2] pactree: Hide dependency satisfiers in more cases

Sebastian Jakubiak jakseb.dev at gmail.com
Wed Sep 2 17:41:08 UTC 2020


Pactree takes care not to print both a dependency and the package to
which it resolves if they are equal. Extend (fix?) this to cover
versioned dependencies and optional dependencies containing
descriptions, so that e.g. `gnupg provides gnupg>=2` and `clang provides
clang: for qdoc` will be made more compact.

Implementation suggested by Eli Schwartz.

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

Note that, in addition to the completely changed commit message and
implementation, this version produces compact output for more cases than
v1. To get v1's behavior, the condition should be changed to:

    result = dep->mod != ALPM_DEP_MOD_ANY || strcmp...

 src/pactree.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/pactree.c b/src/pactree.c
index e34ecc84..ad3dd737 100644
--- a/src/pactree.c
+++ b/src/pactree.c
@@ -383,6 +383,16 @@ static int parse_options(int argc, char *argv[])
 	return 0;
 }
 
+static int should_show_satisfier(const char *pkg, const char *depstring)
+{
+	int result;
+	alpm_depend_t *dep = alpm_dep_from_string(depstring);
+	if(!dep) return 1;
+	result = strcmp(pkg, dep->name) != 0;
+	free(dep);
+	return result;
+}
+
 /* pkg provides provision */
 static void print_text(const char *pkg, const char *provision,
 		tdepth *depth, int last, int opt_dep)
@@ -419,12 +429,12 @@ static void print_text(const char *pkg, const char *provision,
 	if(!pkg && provision) {
 		printf("%s%s%s%s [unresolvable]%s%s\n", tip, color->leaf1,
 				provision, color->branch1, opt_str, color->off);
-	} else if(provision && strcmp(pkg, provision) != 0 && *(style->provides) != '\0') {
+	} else if(provision && *(style->provides) != '\0' && should_show_satisfier(pkg, provision)) {
 		printf("%s%s%s%s%s %s%s%s%s\n", tip, color->leaf1, pkg,
 				color->leaf2, style->provides, color->leaf1, provision, opt_str,
 				color->off);
 	} else {
-		printf("%s%s%s%s%s\n", tip, color->leaf1, pkg, opt_str, color->off);
+		printf("%s%s%s%s%s\n", tip, color->leaf1, provision ? provision : pkg, opt_str, color->off);
 	}
 }
 
-- 
2.28.0


More information about the pacman-contrib mailing list