pactree: Compress self-provided optional dependencies

Message ID 20200731160029.34268-1-jakseb.dev@gmail.com
State Deferred
Headers show
Series pactree: Compress self-provided optional dependencies | expand

Commit Message

Sebastian Jakubiak July 31, 2020, 4 p.m. UTC
Remove `provides X` from `X provides X: ...` lines describing optional
dependencies to make the output more compact.

Signed-off-by: Sebastian Jakubiak <jakseb.dev@gmail.com>
---
I noticed that most optional dependencies in the output of `pactree
--optional` have this unneeded repetition. With this patch the
following:

    vim-runtime
    ├─bash provides sh: support for some tools and macros (optional)
    ├─python provides python: demoserver example tool (optional)
    └─gawk provides gawk: mve tools upport (optional)

will change to:

    vim-runtime
    ├─bash provides sh: support for some tools and macros (optional)
    ├─python: demoserver example tool (optional)
    └─gawk: mve tools upport (optional)

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

Comments

Eli Schwartz July 31, 2020, 5:53 p.m. UTC | #1
On 7/31/20 12:00 PM, Sebastian Jakubiak wrote:
> Remove `provides X` from `X provides X: ...` lines describing optional
> dependencies to make the output more compact.
> 
> Signed-off-by: Sebastian Jakubiak <jakseb.dev@gmail.com>
> ---
> I noticed that most optional dependencies in the output of `pactree
> --optional` have this unneeded repetition. With this patch the
> following:
> 
>     vim-runtime
>     ├─bash provides sh: support for some tools and macros (optional)
>     ├─python provides python: demoserver example tool (optional)
>     └─gawk provides gawk: mve tools upport (optional)
> 
> will change to:
> 
>     vim-runtime
>     ├─bash provides sh: support for some tools and macros (optional)
>     ├─python: demoserver example tool (optional)
>     └─gawk: mve tools upport (optional)

Just for the record: these don't "provide themselves" at all. However,
pactree might not distinguish between matching on the package name vs.
matching on the package provides, since either one is a route to a valid
*satisfier*.

Looking at pactree.c the "provision" variable in print_text starts life as:

dep_pkg = alpm_dbs_find_satisfier()
 ->
depname = alpm_pkg_get_name(dep_pkg)

...

The "pkg_provides_itself" function name sounds weird, and furthermore
seems to be a *fix* for

strcmp(pkg, provision) != 0

not performing its intended purpose since provision can be a freeform
string containing e.g. descriptions. (The comment message should specify
this, rather than implying it adds a new functionality.)

I think you should instead use alpm_dep_from_string to turn the
provision string into something you can get a properly formatted name
from. Essentially reversing the work from get_pkg_deps.

Patch

diff --git a/src/pactree.c b/src/pactree.c
index e34ecc8..4bd4601 100644
--- a/src/pactree.c
+++ b/src/pactree.c
@@ -383,6 +383,14 @@  static int parse_options(int argc, char *argv[])
 	return 0;
 }
 
+int pkg_provides_itself(const char *pkg, const char *depstring)
+{
+	size_t pkglen = strlen(pkg);
+	return (strncmp(pkg, depstring, pkglen) == 0 &&
+			(depstring[pkglen] == '\0' ||
+			 strncmp(": ", depstring + pkglen, 2) == 0));
+}
+
 /* pkg provides provision */
 static void print_text(const char *pkg, const char *provision,
 		tdepth *depth, int last, int opt_dep)
@@ -419,12 +427,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' && !pkg_provides_itself(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);
 	}
 }