From e8625cebd2daa1c299f545ab10f1212eae789f34 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Wed, 17 Oct 2007 01:17:56 +0000 Subject: Bug #196043 - Implement a `portageq owners []+` command that is suitable for identifying all packages that own one or more files when a file collision has occurred. This uses dblink.isowner() so that the query works properly even when paths are ambiguous due to symlinked directories. svn path=/main/trunk/; revision=8154 --- bin/portageq | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/bin/portageq b/bin/portageq index d97f08cb0..f3177cb50 100755 --- a/bin/portageq +++ b/bin/portageq @@ -123,6 +123,69 @@ def metadata(argv): metadata.uses_root = True +def owners(argv): + """ []+ + Given a list of files, print the packages that own the files and which + files belong to each package. Files owned by a package are listed on + the lines below it, indented by a single tab character (\\t). All file + paths must start with . Returns 1 if no owners could be found, + and 0 otherwise. + """ + if len(argv) < 2: + sys.stderr.write("ERROR: insufficient parameters!\n") + sys.stderr.flush() + return 2 + + from portage import catsplit, dblink + settings = portage.settings + root = settings["ROOT"] + vardb = portage.db[root]["vartree"].dbapi + + cwd = None + try: + cwd = os.getcwd() + except OSError: + pass + + files = [] + for f in argv[1:]: + f = portage.normalize_path(f) + if not f.startswith(os.path.sep): + if cwd is None: + sys.stderr.write("ERROR: cwd does not exist!\n") + sys.stderr.flush() + return 2 + f = os.path.join(cwd, f) + f = portage.normalize_path(f) + if not f.startswith(root): + sys.stderr.write("ERROR: file paths must begin with !\n") + sys.stderr.flush() + return 2 + files.append(f[len(root):]) + + found_owner = False + for cpv in vardb.cpv_all(): + cat, pkg = catsplit(cpv) + mylink = dblink(cat, pkg, root, settings, vartree=vardb.vartree) + myfiles = [] + for f in files: + if mylink.isowner(f, root): + myfiles.append(f) + if myfiles: + found_owner = True + sys.stdout.write("%s\n" % cpv) + for f in myfiles: + sys.stdout.write("\t%s\n" % \ + os.path.join(root, f.lstrip(os.path.sep))) + sys.stdout.flush() + if not found_owner: + sys.stderr.write("None of the installed packages claim the file(s).\n") + sys.stderr.flush() + return 1 + return 0 + +owners.uses_root = True + def best_visible(argv): """ []+ Returns category/package-version (without .ebuild). @@ -373,7 +436,9 @@ def main(): import portage if uses_root: sys.argv[2] = portage.root - function(sys.argv[2:]) + retval = function(sys.argv[2:]) + if retval: + sys.exit(retval) except KeyError: usage(sys.argv) sys.exit(os.EX_USAGE) -- cgit v1.2.3-1-g7c22