commit:     5331295005f585ec0ae1aea4dcfc4d10bc521a19
Author:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
AuthorDate: Mon Feb 22 17:05:28 2016 +0000
Commit:     Mike Frysinger <vapier <AT> gentoo <DOT> org>
CommitDate: Mon Feb 22 17:05:28 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=53312950

qcheck: change interface to operate on atoms

This drops the --exact flag as it's now redundant -- we always do
exact matching on the provided atoms.

We also drop the --all flag as it's now the default behavior.  If
no atoms are specified, we just check everything.

 man/qcheck.1        | 10 ++-----
 qcheck.c            | 85 ++++++++++++++++++++++-------------------------------
 tests/qcheck/dotest | 10 +++----
 3 files changed, 42 insertions(+), 63 deletions(-)

diff --git a/man/qcheck.1 b/man/qcheck.1
index 3633311..b686662 100644
--- a/man/qcheck.1
+++ b/man/qcheck.1
@@ -1,4 +1,4 @@
-.TH qcheck "1" "Mar 2014" "Gentoo Foundation" "qcheck"
+.TH qcheck "1" "Feb 2016" "Gentoo Foundation" "qcheck"
 .SH NAME
 qcheck \- verify integrity of installed packages
 .SH SYNOPSIS
@@ -8,12 +8,6 @@ qcheck \- verify integrity of installed packages
 
 .SH OPTIONS
 .TP
-\fB\-a\fR, \fB\-\-all\fR
-List all packages
-.TP
-\fB\-e\fR, \fB\-\-exact\fR
-Exact match (only CAT/PN or PN without PV)
-.TP
 \fB\-s\fR \fI<arg>\fR, \fB\-\-skip\fR \fI<arg>\fR
 Ignore files matching the regular expression <arg>
 .TP
@@ -32,7 +26,7 @@ Ignore differing/unknown file chksums
 \fB\-T\fR, \fB\-\-nomtime\fR
 Ignore differing file mtimes
 .TP
-\fB\-\-skip\-protected\fR
+\fB\-P\fR, \fB\-\-skip\-protected\fR
 Ignore files in CONFIG_PROTECT-ed paths
 .TP
 \fB\-p\fR, \fB\-\-prelink\fR

diff --git a/qcheck.c b/qcheck.c
index 3718f94..7f8031e 100644
--- a/qcheck.c
+++ b/qcheck.c
@@ -8,10 +8,8 @@
 
 #ifdef APPLET_qcheck
 
-#define QCHECK_FLAGS "aes:uABHTPp" COMMON_FLAGS
+#define QCHECK_FLAGS "s:uABHTPp" COMMON_FLAGS
 static struct option const qcheck_long_opts[] = {
-       {"all",            no_argument, NULL, 'a'},
-       {"exact",          no_argument, NULL, 'e'},
        {"skip",            a_argument, NULL, 's'},
        {"update",         no_argument, NULL, 'u'},
        {"noafk",          no_argument, NULL, 'A'},
@@ -23,8 +21,6 @@ static struct option const qcheck_long_opts[] = {
        COMMON_LONG_OPTS
 };
 static const char * const qcheck_opts_help[] = {
-       "List all packages",
-       "Exact match (only CAT/PN or PN without PV)",
        "Ignore files matching the regular expression <arg>",
        "Update missing files, chksum and mtimes for packages",
        "Ignore missing files",
@@ -40,18 +36,15 @@ static const char * const qcheck_opts_help[] = {
 #define qcprintf(fmt, args...) do { if (!state->bad_only) printf(_(fmt), ## 
args); } while (0)
 
 struct qcheck_opt_state {
-       int argc;
-       char **argv;
+       array_t *atoms;
        array_t *regex_arr;
        bool bad_only;
-       bool search_all;
        bool qc_update;
        bool chk_afk;
        bool chk_hash;
        bool chk_mtime;
        bool chk_config_protect;
        bool undo_prelink;
-       bool exact;
 };
 
 static int qcheck_process_contents(q_vdb_pkg_ctx *pkg_ctx, struct 
qcheck_opt_state *state)
@@ -317,70 +310,51 @@ _q_static int qcheck_cb(q_vdb_pkg_ctx *pkg_ctx, void 
*priv)
        struct qcheck_opt_state *state = priv;
        const char *catname = pkg_ctx->cat_ctx->name;
        const char *pkgname = pkg_ctx->name;
+       bool showit = false;
 
        /* see if this cat/pkg is requested */
-       if (!state->search_all) {
-               char *buf = NULL;
-               int i;
+       if (array_cnt(state->atoms)) {
+               char *buf;
+               size_t i;
+               depend_atom *qatom, *atom;
 
-               for (i = optind; i < state->argc; ++i) {
-                       free(buf);
-                       xasprintf(&buf, "%s/%s", catname, pkgname);
-                       if (!state->exact) {
-                               if (rematch(state->argv[i], buf, REG_EXTENDED) 
== 0)
-                                       break;
-                               if (rematch(state->argv[i], pkgname, 
REG_EXTENDED) == 0)
-                                       break;
-                       } else {
-                               depend_atom *atom;
-                               char swap[_Q_PATH_MAX];
-                               if ((atom = atom_explode(buf)) == NULL) {
-                                       warn("invalid atom %s", buf);
-                                       continue;
-                               }
-                               snprintf(swap, sizeof(swap), "%s/%s", 
atom->CATEGORY, atom->PN);
-                               atom_implode(atom);
-                               if (strcmp(state->argv[i], swap) == 0 ||
-                                   strcmp(state->argv[i], buf) == 0)
-                                       break;
-                               if (strcmp(state->argv[i], strstr(swap, "/") + 
1) == 0 ||
-                                   strcmp(state->argv[i], strstr(buf, "/") + 
1) == 0)
-                                       break;
+               xasprintf(&buf, "%s/%s", catname, pkgname);
+               qatom = atom_explode(buf);
+               array_for_each(state->atoms, i, atom)
+                       if (atom_compare(atom, qatom) == EQUAL) {
+                               showit = true;
+                               break;
                        }
-               }
+               atom_implode(qatom);
                free(buf);
+       } else
+               showit = true;
 
-               if (i == state->argc)
-                       return 0;
-       }
-
-       return qcheck_process_contents(pkg_ctx, priv);
+       return showit ? qcheck_process_contents(pkg_ctx, priv) : 0;
 }
 
 int qcheck_main(int argc, char **argv)
 {
-       int i, ret;
+       size_t i;
+       int ret;
        DECLARE_ARRAY(regex_arr);
+       depend_atom *atom;
+       DECLARE_ARRAY(atoms);
        struct qcheck_opt_state state = {
-               .argc = argc,
-               .argv = argv,
+               .atoms = atoms,
                .regex_arr = regex_arr,
                .bad_only = false,
-               .search_all = false,
                .qc_update = false,
                .chk_afk = true,
                .chk_hash = true,
                .chk_mtime = true,
                .chk_config_protect = true,
                .undo_prelink = false,
-               .exact = false,
        };
 
        while ((i = GETOPT_LONG(QCHECK, qcheck, "")) != -1) {
                switch (i) {
                COMMON_GETOPTS_CASES(qcheck)
-               case 'a': state.search_all = true; break;
-               case 'e': state.exact = true; break;
                case 's': {
                        regex_t regex;
                        xregcomp(&regex, optarg, REG_EXTENDED|REG_NOSUB);
@@ -396,11 +370,22 @@ int qcheck_main(int argc, char **argv)
                case 'p': state.undo_prelink = prelink_available(); break;
                }
        }
-       if ((argc == optind) && !state.search_all)
-               qcheck_usage(EXIT_FAILURE);
+
+       argc -= optind;
+       argv += optind;
+       for (i = 0; i < argc; ++i) {
+               atom = atom_explode(argv[i]);
+               if (!atom)
+                       warn("invalid atom: %s", argv[i]);
+               else
+                       xarraypush_ptr(atoms, atom);
+       }
 
        ret = q_vdb_foreach_pkg_sorted(qcheck_cb, &state);
        xarrayfree(regex_arr);
+       array_for_each(atoms, i, atom)
+               atom_implode(atom);
+       xarrayfree_int(atoms);
        return ret;
 }
 

diff --git a/tests/qcheck/dotest b/tests/qcheck/dotest
index a0e91fa..d7c337b 100755
--- a/tests/qcheck/dotest
+++ b/tests/qcheck/dotest
@@ -35,19 +35,19 @@ test 01 1 "qcheck a-b/pkg"
 test 02 1 "qcheck a-b/pkg -s ^/missing-dir/.*"
 
 # bad-only check
-test 03 1 "qcheck -Ba"
+test 03 1 "qcheck -B"
 
 # hash mismatch ignore check
-test 04 1 "qcheck -Ha"
+test 04 1 "qcheck -H"
 
 # mtime mismatch ignore check
-test 05 1 "qcheck -Ta"
+test 05 1 "qcheck -T"
 
 # missing ignore check
-test 06 1 "qcheck -Aa"
+test 06 1 "qcheck -A"
 
 # hash+mtime+missing mismatch ignore check
-test 07 0 "qcheck -AHTa"
+test 07 0 "qcheck -AHT"
 
 # verbose check
 test 08 1 "qcheck -v a-b/pkg"

Reply via email to