commit:     070f64a84544f74ad633f08c9c07f99a06aea551
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Thu Feb  4 17:57:36 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Thu Feb  4 17:57:36 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=070f64a8

qfile: drop the --from option

Apparently the --from option is slightly buggy.  Rather than debug/fix
it, let's punt the option entirely.  The same behavior can be obtained
with the xargs program:
$ qfile -f ./files.txt -m 100
$ xargs -a ./files.txt -L 100 qfile

The xargs util also has way more fine grained control over the format
of the file.  No other q applet has this option either.

URL: https://bugs.gentoo.org/573574
Reported-by: Agostino Sarubbo <ago <AT> gentoo.org>

 qfile.c            | 123 +++++++++--------------------------------------------
 tests/qfile/dotest |   6 ---
 2 files changed, 20 insertions(+), 109 deletions(-)

diff --git a/qfile.c b/qfile.c
index 5082093..2848129 100644
--- a/qfile.c
+++ b/qfile.c
@@ -8,16 +8,10 @@
 
 #ifdef APPLET_qfile
 
-#define QFILE_MAX_MAX_ARGS 5000000
-#define QFILE_DEFAULT_MAX_ARGS 5000
-#define QFILE_DEFAULT_MAX_ARGS_STR "5000"
-
-#define QFILE_FLAGS "bef:m:oRx:S" COMMON_FLAGS
+#define QFILE_FLAGS "beoRx:S" COMMON_FLAGS
 static struct option const qfile_long_opts[] = {
        {"slots",       no_argument, NULL, 'S'},
        {"root-prefix", no_argument, NULL, 'R'},
-       {"from",         a_argument, NULL, 'f'},
-       {"max-args",     a_argument, NULL, 'm'},
        {"basename",    no_argument, NULL, 'b'},
        {"orphans",     no_argument, NULL, 'o'},
        {"exclude",      a_argument, NULL, 'x'},
@@ -27,8 +21,6 @@ static struct option const qfile_long_opts[] = {
 static const char * const qfile_opts_help[] = {
        "Display installed packages with slots",
        "Assume arguments are already prefixed by $ROOT",
-       "Read arguments from file <arg> (\"-\" for stdin)",
-       "Treat from file arguments by groups of <arg> (defaults to " 
QFILE_DEFAULT_MAX_ARGS_STR ")",
        "Match any component of the path",
        "List orphan files",
        "Don't look in package <arg> (used with --orphans)",
@@ -402,10 +394,6 @@ int qfile_main(int argc, char **argv)
        };
        int i, nb_of_queries, found = 0;
        char *p;
-       int qargc = 0;
-       char **qargv = NULL;
-       FILE *args_file = NULL;
-       int max_args = QFILE_DEFAULT_MAX_ARGS;
 
        while ((i = GETOPT_LONG(QFILE, qfile, "")) != -1) {
                switch (i) {
@@ -413,31 +401,6 @@ int qfile_main(int argc, char **argv)
                        case 'S': state.slotted = true; break;
                        case 'b': state.basename = true; break;
                        case 'e': state.exact = true; break;
-                       case 'f':
-                               if (args_file)
-                                       err("Don't use -f twice!");
-                               if (strcmp(optarg, "-") == 0)
-                                       args_file = stdin;
-                               else if ((args_file = fopen(optarg, "r")) == 
NULL) {
-                                       warnp("%s", optarg);
-                                       goto exit;
-                               }
-                               break;
-                       case 'm':
-                               errno = 0;
-                               max_args = strtol(optarg, &p, 10);
-                               if (errno != 0) {
-                                       warnp("%s: not a valid integer", 
optarg);
-                                       goto exit;
-                               } else if (p == optarg || *p != '\0') {
-                                       warn("%s: not a valid integer", optarg);
-                                       goto exit;
-                               }
-                               if (max_args <= 0 || max_args > 
QFILE_MAX_MAX_ARGS) {
-                                       warn("%s: silly value!", optarg);
-                                       goto exit;
-                               }
-                               break;
                        case 'o': state.orphans = true; break;
                        case 'R': state.assume_root_prefix = true; break;
                        case 'x':
@@ -454,20 +417,11 @@ int qfile_main(int argc, char **argv)
        }
        if (!state.exact && verbose)
                state.exact = true;
-       if ((argc == optind) && (args_file == NULL))
+       if (argc == optind)
                qfile_usage(EXIT_FAILURE);
 
-       if ((args_file == NULL) && (max_args != QFILE_DEFAULT_MAX_ARGS))
-               warn("--max-args is only used when reading arguments from a 
file (with -f)");
-
-       /* Are we using --from ? */
-       if (args_file == NULL) {
-               qargc = argc - optind;
-               qargv = argv + optind;
-       } else {
-               qargc = 0;
-               qargv = xcalloc(max_args, sizeof(char*));
-       }
+       argc -= optind;
+       argv += optind;
 
        state.buf = xmalloc(state.buflen);
        if (state.assume_root_prefix) {
@@ -504,62 +458,25 @@ int qfile_main(int argc, char **argv)
        state.real_root = p;
        state.real_root_len = strlen(p);
 
-       do { /* This block may be repeated if using --from with a big files 
list */
-               if (args_file) {
-                       /* Read up to max_args files from the input file */
-                       for (i = 0; i < qargc; ++i)
-                               free(qargv[i]);
-                       qargc = 0;
-                       size_t linelen;
-                       while ((linelen = getline(&state.buf, &state.buflen, 
args_file)) != -1) {
-                               rmspace_len(state.buf, linelen);
-                               if (state.buf[0] == '\0')
-                                       continue;
-                               qargv[qargc] = xstrdup(state.buf);
-                               if (++qargc >= max_args)
+       /* Prepare the qfile(...) arguments structure */
+       nb_of_queries = prepare_qfile_args(argc, (const char **) argv, &state);
+       /* Now do the actual `qfile` checking */
+       if (nb_of_queries > 0)
+               found += q_vdb_foreach_pkg(qfile_cb, &state, NULL);
+
+       if (state.args.non_orphans) {
+               /* display orphan files */
+               for (i = 0; i < state.args.length; i++) {
+                       if (state.args.non_orphans[i])
+                               continue;
+                       if (state.args.basenames[i]) {
+                               found = 0; /* ~inverse return code (as soon as 
an orphan is found, return non-zero) */
+                               if (!quiet)
+                                       puts(argv[i]);
+                               else
                                        break;
                        }
                }
-               if (qargc == 0)
-                       break;
-
-               /* Prepare the qfile(...) arguments structure */
-               nb_of_queries = prepare_qfile_args(qargc, (const char **) 
qargv, &state);
-               if (nb_of_queries < 0)
-                       break;
-
-               /* Now do the actual `qfile` checking */
-               if (nb_of_queries)
-                       found += q_vdb_foreach_pkg(qfile_cb, &state, NULL);
-
-               if (state.args.non_orphans) {
-                       /* display orphan files */
-                       for (i = 0; i < state.args.length; i++) {
-                               if (state.args.non_orphans[i])
-                                       continue;
-                               if (state.args.basenames[i]) {
-                                       found = 0; /* ~inverse return code (as 
soon as an orphan is found, return non-zero) */
-                                       if (!quiet)
-                                               puts(qargv[i]);
-                                       else
-                                               break;
-                               }
-                       }
-               }
-
-               destroy_qfile_args(&state.args);
-       } while (args_file && qargc == max_args);
-
- exit:
-       if (args_file) {
-               if (qargv) {
-                       for (i = 0; i < qargc; ++i)
-                               free(qargv[i]);
-                       free(qargv);
-               }
-
-               if (args_file != stdin)
-                       fclose(args_file);
        }
 
        destroy_qfile_args(&state.args);

diff --git a/tests/qfile/dotest b/tests/qfile/dotest
index 889aa95..8e8d842 100755
--- a/tests/qfile/dotest
+++ b/tests/qfile/dotest
@@ -15,12 +15,6 @@ tests=(
        "q file -Co /bin/bash /bin/XXXXX"
        "/bin/XXXXX"
 
-       "printf \"/bin/bash\n/bin/XXXXX\" | q file -Cq -f -"
-       "app-shells/bash"
-
-       "printf \"/bin/bash\n/bin/XXXXX\" | q file -Co -f -"
-       "/bin/XXXXX"
-
        "q file -Co -x bash /bin/bash"
        "/bin/bash"
 

Reply via email to