From 58a13407d60303cabd9a5f2072a12c9d70c917d1 Mon Sep 17 00:00:00 2001 From: Martinez Date: Tue, 3 Jan 2017 23:15:54 +0100 Subject: [PATCH] added a half-assed version-less mode to cave-rdep --- bin/cave-rdep | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/bin/cave-rdep b/bin/cave-rdep index cfc030f..dafaffa 100755 --- a/bin/cave-rdep +++ b/bin/cave-rdep @@ -5,25 +5,64 @@ import glob import re import sys +def is_a_version(token): + """ + Returns True iff token is a portage version spec (i.e. contains only numbers or "."). + """ + + for A in token: + a = ord(A) + if not (0x30 <= a <= 0x39 or a == 0x2e): + return False + + return True + +def strip_version(atom): + """ + Removes the =version-123 spec from a portage atom. + + Works like 99% of the time. Good enough for the girls I go out with. + """ + + parts = atom[1:].split("-") + wanted = [] + + for part in parts: + if is_a_version(part): + break + + wanted.append(part) + + return "-".join(wanted) + def grep(exp, filename): with open(filename) as f: matches = re.findall(exp, f.read()) return matches -def find_reverse_deps(deps): +def find_reverse_deps(deps, version=True): all_dep_files = glob.glob("/var/db/pkg/*/*/*DEPEND") regexp = "(%s)[^:]*:[^/]+/[^=]+=" %("|".join(deps)) matching_files = set(f for f in all_dep_files if grep(regexp, f)) - atoms = set("=" + f[12:].rsplit("/", 1)[0] for f in matching_files) + atoms = {"=" + f[12:].rsplit("/", 1)[0] for f in matching_files} + + if not version: + atoms = {strip_version(a) for a in atoms} return atoms - if __name__ == "__main__": if len(sys.argv) > 1: - atoms = find_reverse_deps(sys.argv[1:]) + if sys.argv[1] == "-v": + version = False + targets = sys.argv[2:] + else: + version = True + targets = sys.argv[1:] + + atoms = find_reverse_deps(targets, version) print(" ".join(sorted(atoms))) else: print("Usage: %s DEPENDENCY [more DEPENDENCIES...]" %(sys.argv[0]))