public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] proj/portage-utils:master commit in: tests/, /, tests/quse/
@ 2015-11-26 10:39 Mike Frysinger
  0 siblings, 0 replies; only message in thread
From: Mike Frysinger @ 2015-11-26 10:39 UTC (permalink / raw
  To: gentoo-commits

commit:     c59331531a36c9d3a9e56aca35e5a71760c73c93
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Nov 26 10:08:35 2015 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Nov 26 10:08:35 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=c5933153

quse: walk all available overlays when describing flags

The main logic still needs updating, but that relies on the
cache file being overlay aware (which it isn't currently).

URL: https://bugs.gentoo.org/553260

 quse.c            | 42 +++++++++++++++++++++++++++++-------------
 tests/init.sh     | 13 +++++++++++++
 tests/quse/dotest |  6 +++---
 3 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/quse.c b/quse.c
index 5ef88da..ab257bf 100644
--- a/quse.c
+++ b/quse.c
@@ -78,8 +78,8 @@ print_highlighted_use_flags(char *string, int ind, int argc, char **argv)
 	}
 }
 
-static int
-quse_describe_flag(unsigned int ind, unsigned int argc, char **argv)
+static void
+quse_describe_flag(const char *overlay, unsigned int ind, unsigned int argc, char **argv)
 {
 #define NUM_SEARCH_FILES ARRAY_SIZE(search_files)
 	size_t buflen;
@@ -88,15 +88,16 @@ quse_describe_flag(unsigned int ind, unsigned int argc, char **argv)
 	size_t s;
 	const char * const search_files[] = { "use.desc", "use.local.desc", "arch.list", };
 	FILE *fp[NUM_SEARCH_FILES];
+	int dfd, fd;
 	DIR *d;
 	struct dirent *de;
 
 	/* pick 1000 arbitrarily long enough for all files under desc/ */
-	buflen = strlen(portdir) + 1000;
+	buflen = strlen(overlay) + 1000;
 	buf = xmalloc(buflen);
 
 	for (i = 0; i < NUM_SEARCH_FILES; ++i) {
-		snprintf(buf, buflen, "%s/profiles/%s", portdir, search_files[i]);
+		snprintf(buf, buflen, "%s/profiles/%s", overlay, search_files[i]);
 		fp[i] = fopen(buf, "r");
 		if (verbose && fp[i] == NULL)
 			warnp("skipping %s", buf);
@@ -156,12 +157,18 @@ quse_describe_flag(unsigned int ind, unsigned int argc, char **argv)
 			fclose(fp[f]);
 
 	/* now scan the desc dir */
-	snprintf(buf, buflen, "%s/profiles/desc/", portdir);
-	if ((d = opendir(buf)) == NULL) {
+	snprintf(buf, buflen, "%s/profiles/desc/", overlay);
+	dfd = open(buf, O_RDONLY|O_CLOEXEC);
+	if (dfd == -1) {
 		if (verbose)
 			warnp("skipping %s", buf);
 		goto done;
 	}
+	d = fdopendir(dfd);
+	if (!d) {
+		close(dfd);
+		goto done;
+	}
 
 	while ((de = readdir(d)) != NULL) {
 		s = strlen(de->d_name);
@@ -171,10 +178,15 @@ quse_describe_flag(unsigned int ind, unsigned int argc, char **argv)
 		if (strcmp(p, ".desc"))
 			continue;
 
-		snprintf(buf, buflen, "%s/profiles/desc/%s", portdir, de->d_name);
-		if ((fp[0] = fopen(buf, "r")) == NULL) {
+		fd = openat(dfd, de->d_name, O_RDONLY|O_CLOEXEC);
+		if (fd == -1) {
 			if (verbose)
-				warnp("skipping %s", buf);
+				warnp("skipping %s/profiles/desc/%s", overlay, de->d_name);
+			continue;
+		}
+		fp[0] = fdopen(fd, "r");
+		if (!fp[0]) {
+			close(fd);
 			continue;
 		}
 
@@ -211,7 +223,6 @@ quse_describe_flag(unsigned int ind, unsigned int argc, char **argv)
 
  done:
 	free(buf);
-	return 0;
 }
 
 int quse_main(int argc, char **argv)
@@ -251,8 +262,13 @@ int quse_main(int argc, char **argv)
 	if (argc == optind && !quse_all && idx >= 0)
 		quse_usage(EXIT_FAILURE);
 
-	if (idx == -1)
-		return quse_describe_flag(optind, argc, argv);
+	if (idx == -1) {
+		size_t n;
+		const char *overlay;
+		array_for_each(overlays, n, overlay)
+			quse_describe_flag(overlay, optind, argc, argv);
+		return 0;
+	}
 
 	if (quse_all) optind = argc;
 	cache_file = initialize_ebuild_flat();
@@ -406,7 +422,7 @@ int quse_main(int argc, char **argv)
 						char **ARGV;
 						int ARGC;
 						makeargv(&buf0[search_len + 1], &ARGC, &ARGV);
-						quse_describe_flag(1, ARGC, ARGV);
+						quse_describe_flag(portdir, 1, ARGC, ARGV);
 						freeargv(ARGC, ARGV);
 					}
 				}

diff --git a/tests/init.sh b/tests/init.sh
index 11fd379..a17821d 100644
--- a/tests/init.sh
+++ b/tests/init.sh
@@ -96,3 +96,16 @@ treedir() {
 		ls -R "${d}"
 	fi
 }
+
+mkportdir() {
+	export PORTDIR=$1
+
+	export PORTAGE_CONFIGROOT=${PWD}
+	mkdir -p etc/portage/
+	cat <<-EOF >etc/portage/repos.conf
+	[DEFAULT]
+	main-repo = utils-test
+	[utils-test]
+	location = ${PORTDIR}
+	EOF
+}

diff --git a/tests/quse/dotest b/tests/quse/dotest
index da7d95e..0dadd8f 100755
--- a/tests/quse/dotest
+++ b/tests/quse/dotest
@@ -4,10 +4,10 @@
 
 set -e
 
-export PORTDIR=${as}/portdir
-
 mktmpdir
 
+mkportdir "${as}/portdir"
+
 d=${PORTDIR}/profiles
 entries() {
 	sed -e 's:#.*::' -e '/^$/d' "$1"
@@ -80,7 +80,7 @@ diff -u ${as}/list01.good x
 rm x
 tpass "multi file match"
 
-trimtmpdir
+cleantmpdir
 
 ###### faster test needed.########
 end


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2015-11-26 10:39 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-26 10:39 [gentoo-commits] proj/portage-utils:master commit in: tests/, /, tests/quse/ Mike Frysinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox