aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Groffen <grobian@gentoo.org>2019-04-07 22:06:20 +0200
committerFabian Groffen <grobian@gentoo.org>2019-04-07 22:14:35 +0200
commit199e4f62b4ede5f2319ef6795a15737ac0882d09 (patch)
tree5a6998481b693ed8e03b82a1662174c1a59293a2 /qatom.c
parentqlop: support standard date output format in parse_date (diff)
downloadportage-utils-199e4f62b4ede5f2319ef6795a15737ac0882d09.tar.gz
portage-utils-199e4f62b4ede5f2319ef6795a15737ac0882d09.tar.bz2
portage-utils-199e4f62b4ede5f2319ef6795a15737ac0882d09.zip
atoms: add proper support for blockers and USE dependencies
- ignore SLOT in atom_compare when not set on both sides - parse USE-dependencies, properly removing it from PV - parse blockers (! and !!) separate from version ranges, such that the original meaning can be restored and differentiated from Signed-off-by: Fabian Groffen <grobian@gentoo.org>
Diffstat (limited to 'qatom.c')
-rw-r--r--qatom.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/qatom.c b/qatom.c
index c1af10de..20e2dcb7 100644
--- a/qatom.c
+++ b/qatom.c
@@ -16,15 +16,17 @@
#define QATOM_FORMAT "%{CATEGORY} %{PN} %{PV} %[PR] %[SLOT] %[pfx] %[sfx]"
-#define QATOM_FLAGS "F:c" COMMON_FLAGS
+#define QATOM_FLAGS "F:cp" COMMON_FLAGS
static struct option const qatom_long_opts[] = {
{"format", a_argument, NULL, 'F'},
{"compare", no_argument, NULL, 'c'},
+ {"print", no_argument, NULL, 'p'},
COMMON_LONG_OPTS
};
static const char * const qatom_opts_help[] = {
"Custom output format (default: " QATOM_FORMAT ")",
"Compare two atoms",
+ "Print reconstructed atom",
COMMON_OPTS_HELP
};
#define qatom_usage(ret) usage(ret, QATOM_FLAGS, qatom_long_opts, qatom_opts_help, NULL, lookup_applet_idx("qatom"))
@@ -92,7 +94,9 @@ qatom_printf(const char *format, const depend_atom *atom, int pverbose)
printf("r%i", atom->PR_int);
} else if (!strncmp("SLOT", fmt, len)) {
if (showit || atom->SLOT)
- printf(":%s", atom->SLOT ? atom->SLOT : "-");
+ printf(":%s%s",
+ atom->SLOT ? atom->SLOT : "-",
+ atom_slotdep_str[atom->slotdep]);
} else if (!strncmp("REPO", fmt, len)) {
if (showit || atom->REPO)
printf("::%s", HN(atom->REPO));
@@ -117,15 +121,17 @@ qatom_printf(const char *format, const depend_atom *atom, int pverbose)
int qatom_main(int argc, char **argv)
{
- enum qatom_atom { _EXPLODE=0, _COMPARE } action = _EXPLODE;
+ enum qatom_atom { _EXPLODE=0, _COMPARE, _PRINT } action = _EXPLODE;
const char *format = QATOM_FORMAT;
depend_atom *atom;
+ depend_atom *atomc;
int i;
while ((i = GETOPT_LONG(QATOM, qatom, "")) != -1) {
switch (i) {
case 'F': format = optarg; break;
case 'c': action = _COMPARE; break;
+ case 'p': action = _PRINT; break;
COMMON_GETOPTS_CASES(qatom)
}
}
@@ -137,19 +143,37 @@ int qatom_main(int argc, char **argv)
err("compare needs even number of arguments");
for (i = optind; i < argc; ++i) {
+ atom = atom_explode(argv[i]);
+ if (atom == NULL) {
+ warnf("invalid atom: %s\n", argv[i]);
+ continue;
+ }
+
switch (action) {
case _COMPARE:
- printf("%s %s %s\n", argv[i],
- booga[atom_compare_str(argv[i], argv[i+1])], argv[i+1]);
- ++i;
+ i++;
+ atomc = atom_explode(argv[i]);
+ if (atomc == NULL) {
+ warnf("invalid atom: %s\n", argv[i]);
+ break;
+ }
+ printf("%s %s ",
+ atom_to_string(atom),
+ booga[atom_compare(atom, atomc)]);
+ printf("%s\n",
+ atom_to_string(atomc));
+ atom_implode(atomc);
break;
case _EXPLODE:
- atom = atom_explode(argv[i]);
qatom_printf(format, atom, verbose);
putchar('\n');
- atom_implode(atom);
+ break;
+ case _PRINT:
+ printf("%s\n", atom_to_string(atom));
break;
}
+
+ atom_implode(atom);
}
return EXIT_SUCCESS;