From: "Fabian Groffen" <grobian@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage-utils:master commit in: /
Date: Mon, 25 May 2020 10:43:56 +0000 (UTC) [thread overview]
Message-ID: <1590403145.f2e63b4a1280d0a2c18cb1a66ceffd9699d1b9ac.grobian@gentoo> (raw)
commit: f2e63b4a1280d0a2c18cb1a66ceffd9699d1b9ac
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon May 25 10:39:05 2020 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon May 25 10:39:05 2020 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=f2e63b4a
qmerge: use libq/tree for binpkg/Packages needs
Instead of manual parsing of Packages file and traversing binpkgs, use
the functionality provided by libq/tree, most notably tree_match_atom().
This is just phase one, where we replace the custom code with libq/tree
code and then fill in the Pkg structure. In a next phase we should skip
this and directly use tree_match_ctx, with atom and meta in there.
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
qmerge.c | 596 +++++++++++++--------------------------------------------------
1 file changed, 116 insertions(+), 480 deletions(-)
diff --git a/qmerge.c b/qmerge.c
index 087c5f2..554e3dc 100644
--- a/qmerge.c
+++ b/qmerge.c
@@ -120,8 +120,7 @@ typedef struct llist_char_t llist_char;
static void pkg_fetch(int, const depend_atom *, const struct pkg_t *);
static void pkg_merge(int, const depend_atom *, const struct pkg_t *);
static int pkg_unmerge(tree_pkg_ctx *, set *, int, char **, int, char **);
-static struct pkg_t *grab_binpkg_info(const char *);
-static char *find_binpkg(const char *);
+static struct pkg_t *grab_binpkg_info(depend_atom *);
static bool
prompt(const char *p)
@@ -129,12 +128,12 @@ prompt(const char *p)
printf("%s? [Y/n] ", p);
fflush(stdout);
switch (getc(stdin)) {
- case '\n':
- case 'y':
- case 'Y':
- return true;
- default:
- return false;
+ case '\n':
+ case 'y':
+ case 'Y':
+ return true;
+ default:
+ return false;
}
}
@@ -579,7 +578,7 @@ qprint_tree_node(int level, const depend_atom *atom, const struct pkg_t *pkg)
} else {
depend_atom *subatom = atom_explode(p);
if (subatom != NULL) {
- ret = atom_compare(atom, subatom);
+ ret = atom_compare(subatom, atom);
switch (ret) {
case EQUAL: c = 'R'; break;
case NEWER: c = 'U'; break;
@@ -1009,7 +1008,7 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
if (((c == 'R') || (c == 'D')) && update_only)
return;
- if (pkg->RDEPEND[0] && follow_rdepends) {
+ if (pkg->RDEPEND[0] != '\0' && follow_rdepends) {
const char *rdepend;
IF_DEBUG(fprintf(stderr, "\n+Parent: %s/%s\n", pkg->CATEGORY, pkg->PF));
@@ -1040,30 +1039,17 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
case '\0':
break;
default:
- if (*name == '~') {
- name = ARGV[i] + 1;
- /* warn("newname = %s", name); */
- }
if ((subatom = atom_explode(name)) != NULL) {
struct pkg_t *subpkg;
- char *resolved = NULL;
-
- resolved = find_binpkg(name);
- IF_DEBUG(fprintf(stderr,
- "+Atom: argv0(%s) resolved(%s)\n",
- name, resolved));
-
- if (strlen(resolved) < 1) {
- warn("Cant find a binpkg for %s from rdepend(%s)",
+ subpkg = grab_binpkg_info(subatom); /* free me later */
+ if (subpkg == NULL) {
+ warn("Cannot find a binpkg for %s from rdepend(%s)",
name, pkg->RDEPEND);
atom_implode(subatom);
continue;
}
- /* ratom = atom_explode(resolved); */
- subpkg = grab_binpkg_info(resolved); /* free me later */
-
assert(subpkg != NULL);
IF_DEBUG(fprintf(stderr, "+Subpkg: %s/%s\n",
subpkg->CATEGORY, subpkg->PF));
@@ -1182,7 +1168,8 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
} else if (mlen == 257+6 &&
magic[257] == 'u' && magic[258] == 's' &&
magic[259] == 't' && magic[260] == 'a' &&
- magic[261] == 'r' && magic[262] == '\0')
+ magic[261] == 'r' &&
+ (magic[262] == '\0' || magic[262] == ' '))
{
compr = "";
} else if (mlen >= 4 &&
@@ -1399,7 +1386,7 @@ pkg_merge(int level, const depend_atom *atom, const struct pkg_t *pkg)
rmdir("../qmerge");
printf("%s>>>%s %s%s%s/%s%s%s\n",
- YELLOW, NORM, WHITE, atom->CATEGORY, NORM, CYAN, pkg->PF, NORM);
+ YELLOW, NORM, WHITE, pkg->CATEGORY, NORM, CYAN, pkg->PF, NORM);
tree_close_cat(cat_ctx);
tree_close(vdb);
@@ -1622,7 +1609,7 @@ pkg_verify_checksums(
}
if (pkg->MD5[0]) {
- if (md5 != NULL && strcmp(md5, pkg->MD5) == 0) {
+ if (strcmp(md5, pkg->MD5) == 0) {
if (display)
printf("MD5: [%sOK%s] %s %s/%s\n",
GREEN, NORM, md5, atom->CATEGORY, pkg->PF);
@@ -1634,7 +1621,7 @@ pkg_verify_checksums(
}
}
- if (sha1 != NULL && pkg->SHA1[0]) {
+ if (pkg->SHA1[0]) {
if (strcmp(sha1, pkg->SHA1) == 0) {
if (display)
qprintf("SHA1: [%sOK%s] %s %s/%s\n",
@@ -1663,7 +1650,8 @@ pkg_fetch(int level, const depend_atom *atom, const struct pkg_t *pkg)
/* qmerge -pv patch */
if (pretend) {
- if (!install) install++;
+ if (!install)
+ install++;
/* qprint_tree_node(level, atom, pkg); */
pkg_merge(level, atom, pkg);
return;
@@ -1679,13 +1667,12 @@ pkg_fetch(int level, const depend_atom *atom, const struct pkg_t *pkg)
return;
}
- /* XXX: should do a size check here for partial downloads */
-
if (force_download && (access(buf, R_OK) == 0) &&
(pkg->SHA1[0] || pkg->MD5[0]))
{
if (pkg_verify_checksums(buf, pkg, atom, 0, 0) != 0)
- unlink(buf);
+ if (getenv("QMERGE") == NULL)
+ unlink(buf);
}
if (access(buf, R_OK) == 0) {
if (!pkg->SHA1[0] && !pkg->MD5[0]) {
@@ -1742,7 +1729,7 @@ print_Pkg(int full, const depend_atom *atom, const struct pkg_t *pkg)
char *p = NULL;
char buf[512];
- printf("%s%s/%s%s:%s%s%s%s%s\n", BOLD, atom->CATEGORY, BLUE, pkg->PF, pkg->SLOT, NORM,
+ printf("%s%s%s%s\n", atom_format("%[CAT]%[PF]%[SLOT]", atom),
!quiet ? " [" : "",
!quiet ? make_human_readable_str(pkg->SIZE, 1, KILOBYTE) : "",
!quiet ? " KiB]" : "");
@@ -1757,7 +1744,8 @@ print_Pkg(int full, const depend_atom *atom, const struct pkg_t *pkg)
if (pkg->MD5[0])
printf(" %sMd5%s:%s %s\n", DKGREEN, YELLOW, NORM, pkg->MD5);
if (!pkg->MD5[0] && !pkg->SHA1[0])
- printf(" %sSums%s:%s %s(MISSING!)%s\n", DKGREEN, YELLOW, NORM, RED, NORM);
+ printf(" %sSums%s:%s %s(MISSING!)%s\n",
+ DKGREEN, YELLOW, NORM, RED, NORM);
if (pkg->SLOT[0])
printf(" %sSlot%s:%s %s\n", DKGREEN, YELLOW, NORM, pkg->SLOT);
if (pkg->LICENSE[0])
@@ -1781,7 +1769,8 @@ print_Pkg(int full, const depend_atom *atom, const struct pkg_t *pkg)
case OLDER: icolor = BLUE; break;
default: icolor = NORM; break;
}
- printf(" %sInstalled%s:%s %s%s%s\n", DKGREEN, YELLOW, NORM, icolor, p, NORM);
+ printf(" %sInstalled%s:%s %s%s%s\n",
+ DKGREEN, YELLOW, NORM, icolor, p, NORM);
}
}
}
@@ -1833,453 +1822,70 @@ unmerge_packages(set *todo)
return ret;
}
-static FILE *
-open_binpkg_index(void)
-{
- FILE *fp;
- char *path;
-
- xasprintf(&path, "%s/portage/%s", port_tmpdir, Packages);
- fp = fopen(path, "r");
- if (fp)
- goto done;
- free(path);
-
- xasprintf(&path, "%s/%s", pkgdir, Packages);
- fp = fopen(path, "r");
- if (fp)
- goto done;
-
- /* This is normal when installing from local repo only. */
- warnp("Unable to open package file %s in %s/portage or %s",
- Packages, port_tmpdir, pkgdir);
- warn("Attempting to manually regen via `emaint binhost`");
-
- pid_t p;
- int status;
-
- char argv_emaint[] = "emaint";
- char argv_binhost[] = "binhost";
- char argv_fix[] = "--fix";
- char *argv[] = {
- argv_emaint,
- argv_binhost,
- argv_fix,
- NULL,
- };
-
- p = vfork();
- switch (p) {
- case 0:
- _exit(execvp(argv[0], argv));
- case -1:
- errp("vfork failed");
- }
- waitpid(p, &status, 0);
-
- fp = fopen(path, "r");
-
- done:
- free(path);
- return fp;
-}
-
+static tree_ctx *_grab_binpkg_info_tree = NULL;
static struct pkg_t *
-grab_binpkg_info(const char *name)
-{
- FILE *fp;
- char buf[BUFSIZ];
- char *p;
- depend_atom *atom;
-
- struct pkg_t Pkg;
- struct pkg_t *pkg = xzalloc(sizeof(struct pkg_t));
- struct pkg_t *rpkg = xzalloc(sizeof(struct pkg_t));
-
- static char best_match[sizeof(Pkg.PF)+2+sizeof(Pkg.CATEGORY)];
-
- best_match[0] = 0;
- strcpy(pkg->SLOT,"0");
-
- fp = open_binpkg_index();
-
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- if (*buf == '\n') {
- if (pkg->PF[0] && pkg->CATEGORY[0]) {
- int ret;
-
- snprintf(buf, sizeof(buf), "%s/%s", pkg->CATEGORY, pkg->PF);
- if (strstr(buf, name) != NULL) {
- if (!best_match[0])
- snprintf(best_match, sizeof(best_match), "%.*s",
- (int)sizeof(best_match) - 1, buf);
-
- atom = atom_explode(buf);
- if (atom->PR_int) {
- snprintf(buf, sizeof(buf), "%s/%s-%s-r%i",
- atom->CATEGORY, atom->PN,
- atom->PV, atom->PR_int);
- } else {
- snprintf(buf, sizeof(buf), "%s/%s-%s",
- atom->CATEGORY, atom->PN, atom->PV);
- }
- ret = atom_compare_str(name, buf);
- IF_DEBUG(fprintf(stderr,
- "=== atom_compare(%s, %s) = %d %s\n",
- name, buf, ret, booga[ret]));
- /* buf(%s) depend(%s)\n", ret, pkg->CATEGORY,
- * pkg->PF, name, pkg->RDEPEND); */
- switch (ret) {
- case EQUAL:
- case NEWER:
- snprintf(buf, sizeof(buf), "%s/%s",
- pkg->CATEGORY, pkg->PF);
- ret = atom_compare_str(buf, best_match);
- if (ret == NEWER || ret == EQUAL) {
- snprintf(best_match, sizeof(best_match), "%.*s",
- (int)sizeof(best_match) - 1, buf);
- memcpy(rpkg, pkg, sizeof(struct pkg_t));
- IF_DEBUG(fprintf(stderr,
- "--- %s/%s depend(%s)\n",
- rpkg->CATEGORY, rpkg->PF,
- rpkg->RDEPEND));
- }
- case OLDER: break;
- default:
- break;
- }
- atom_implode(atom);
- }
- memset(pkg, 0, sizeof(struct pkg_t));
- strcpy(pkg->SLOT,"0");
- }
- continue;
- }
-
- if ((p = strchr(buf, '\n')) != NULL)
- *p = 0;
- if ((p = strchr(buf, ':')) == NULL)
- continue;
- if (p[1] != ' ')
- continue;
- *p = 0;
- p += 2;
-
- if (*buf) {
- /* we dont need all the info */
- if (strcmp(buf, "RDEPEND") == 0)
- snprintf(pkg->RDEPEND, sizeof(Pkg.RDEPEND), "%.*s",
- (int)sizeof(Pkg.RDEPEND) - 1, p);
- if (strcmp(buf, "PF") == 0)
- snprintf(pkg->PF, sizeof(Pkg.PF), "%.*s",
- (int)sizeof(Pkg.PF) - 1, p);
- if (strcmp(buf, "CATEGORY") == 0)
- snprintf(pkg->CATEGORY, sizeof(Pkg.CATEGORY), "%.*s",
- (int)sizeof(Pkg.CATEGORY) - 1, p);
- if (strcmp(buf, "REPO") == 0)
- snprintf(pkg->REPO, sizeof(Pkg.REPO), "%.*s",
- (int)sizeof(Pkg.REPO) - 1, p);
-
- if (strcmp(buf, "CPV") == 0) {
- if ((atom = atom_explode(p)) != NULL) {
- if (atom->PR_int) {
- snprintf(buf, sizeof(buf), "%s-%s-r%i",
- atom->PN, atom->PV, atom->PR_int);
- } else {
- snprintf(buf, sizeof(buf), "%s-%s", atom->PN, atom->PV);
- }
- snprintf(pkg->PF, sizeof(Pkg.PF), "%.*s",
- (int)sizeof(Pkg.PF) - 1, buf);
- snprintf(pkg->CATEGORY, sizeof(Pkg.CATEGORY), "%.*s",
- (int)sizeof(Pkg.CATEGORY) - 1, atom->CATEGORY);
- atom_implode(atom);
- }
- }
- if (strcmp(buf, "SLOT") == 0)
- snprintf(pkg->SLOT, sizeof(Pkg.SLOT), "%.*s",
- (int)sizeof(Pkg.SLOT) - 1, p);
- if (strcmp(buf, "USE") == 0)
- snprintf(pkg->USE, sizeof(Pkg.USE), "%.*s",
- (int)sizeof(Pkg.USE) - 1, p);
- /* checksums. We must have 1 or the other unless --*/
- if (strcmp(buf, "MD5") == 0)
- snprintf(pkg->MD5, sizeof(Pkg.MD5), "%.*s",
- (int)sizeof(Pkg.MD5) - 1, p);
- if (strcmp(buf, "SHA1") == 0)
- snprintf(pkg->SHA1, sizeof(Pkg.SHA1), "%.*s",
- (int)sizeof(Pkg.SHA1) - 1, p);
- }
- }
- fclose(fp);
- free(pkg);
- return rpkg;
-}
-
-static char *
-find_binpkg(const char *name)
+grab_binpkg_info(depend_atom *atom)
{
- FILE *fp;
- char buf[BUFSIZ];
- char *p;
- struct pkg_t Pkg;
- char PF[sizeof(Pkg.PF)];
- char CATEGORY[sizeof(Pkg.CATEGORY)];
-
- static char best_match[sizeof(Pkg.PF)+2+sizeof(Pkg.CATEGORY)];
-
- best_match[0] = 0;
- if (NULL == name)
- return best_match;
-
- fp = open_binpkg_index();
- PF[0] = CATEGORY[0] = '\0';
-
- while (fgets(buf, sizeof(buf), fp) != NULL) {
- if (*buf == '\n') {
- if (PF[0] && CATEGORY[0]) {
- int ret;
- snprintf(buf, sizeof(buf), "%s/%s", CATEGORY, PF);
- if (strstr(buf, name) != NULL) {
- depend_atom *atom;
-
- if (!best_match[0])
- snprintf(best_match, sizeof(best_match), "%.*s",
- (int)sizeof(best_match) - 1, buf);
-
- atom = atom_explode(buf);
- snprintf(buf, sizeof(buf), "%s/%s",
- atom->CATEGORY, atom->PN);
- ret = atom_compare_str(name, buf);
- switch (ret) {
- case OLDER: break;
- case NEWER:
- case EQUAL:
- snprintf(buf, sizeof(buf), "%s/%s", CATEGORY, PF);
- ret = atom_compare_str(buf, best_match);
- if (ret == NEWER || ret == EQUAL)
- snprintf(best_match, sizeof(best_match), "%.*s",
- (int)sizeof(best_match) - 1, buf);
- /* printf("[%s == %s] = %d; %s/%s\n",
- * name, buf, ret, CATEGORY, PF); */
- default:
- break;
- }
- atom_implode(atom);
- }
- }
- continue;
- }
-
- if ((p = strchr(buf, '\n')) != NULL)
- *p = 0;
- if ((p = strchr(buf, ':')) == NULL)
- continue;
- if (p[1] != ' ')
- continue;
- *p = 0;
- p += 2;
-
- if (*buf) {
- if (strcmp(buf, "CPV") == 0) {
- depend_atom *atom;
- if ((atom = atom_explode(p)) != NULL) {
- if (atom->PR_int) {
- snprintf(buf, sizeof(buf), "%s-%s-r%i",
- atom->PN, atom->PV, atom->PR_int);
- } else {
- snprintf(buf, sizeof(buf), "%s-%s", atom->PN, atom->PV);
- }
- snprintf(PF, sizeof(PF), "%.*s", (int)sizeof(PF) - 1, buf);
- snprintf(CATEGORY, sizeof(CATEGORY), "%.*s",
- (int)sizeof(CATEGORY) - 1, atom->CATEGORY);
- atom_implode(atom);
- }
- }
- if (strcmp(buf, "PF") == 0)
- snprintf(PF, sizeof(PF), "%.*s", (int)sizeof(PF) - 1, p);
- if (strcmp(buf, "CATEGORY") == 0)
- snprintf(CATEGORY, sizeof(CATEGORY), "%.*s",
- (int)sizeof(CATEGORY) - 1, p);
- }
- }
- fclose(fp);
- return best_match;
-}
-
-static int
-parse_packages(set *todo)
-{
- FILE *fp;
- int linelen;
- size_t buflen;
- char *buf, *p;
- struct pkg_t Pkg;
- depend_atom *pkg_atom;
- char repo[sizeof(Pkg.REPO)];
- depend_atom **todo_atoms = NULL;
- size_t todo_cnt = 0;
- size_t i;
-
- fp = open_binpkg_index();
- if (fp == NULL)
- return EXIT_FAILURE;
-
- buf = NULL;
- buflen = 0; /* make getline allocate */
- repo[0] = '\0';
-
- /* First consume the header with the common data. */
- while ((linelen = getline(&buf, &buflen, fp)) >= 0) {
- rmspace_len(buf, (size_t)linelen);
- if (buf[0] == '\0')
- break;
-
- if ((p = strchr(buf, ':')) == NULL)
- continue;
- if (p[1] != ' ')
- continue;
- *p = 0;
- p += 2;
-
- switch (*buf) {
- case 'R':
- if (!strcmp(buf, "REPO"))
- snprintf(repo, sizeof(repo), "%.*s", (int)sizeof(repo) - 1, p);
- break;
+ tree_ctx *tree = _grab_binpkg_info_tree;
+ tree_match_ctx *tpkg;
+ struct pkg_t *pkg = NULL;
+ char path[BUFSIZ];
+ FILE *d;
+
+ /* reuse previously opened tree, so we really employ the cache
+ * from libq/tree */
+ if (tree == NULL) {
+ snprintf(path, sizeof(path), "%s/portage/Packages", port_tmpdir);
+ /* we don't use ROOT on package tree here, operating on ROOT
+ * should be for package merges/unmerges, but be able to pull
+ * binpkgs from current system */
+ if ((d = fopen(path, "r")) != NULL) {
+ fclose(d);
+ snprintf(path, sizeof(path), "%s/portage", port_tmpdir);
+ tree = tree_open_binpkg("/", path);
+ } else {
+ tree = tree_open_binpkg("/", pkgdir);
}
- }
+ _grab_binpkg_info_tree = tree;
- pkg_atom = NULL;
- memset(&Pkg, 0, sizeof(Pkg));
- strcpy(Pkg.SLOT, "0");
-
- /* build list with exploded atoms for each access below */
- if (todo != NULL) {
- char **todo_strs;
- todo_cnt = list_set(todo, &todo_strs);
- todo_atoms = xmalloc(sizeof(*todo_atoms) * todo_cnt);
- for (i = 0; i < todo_cnt; i++)
- todo_atoms[i] = atom_explode(todo_strs[i]);
- free(todo_strs);
+ /* if opening the tree failed somehow, we can't return anything */
+ if (tree == NULL)
+ return NULL;
}
- /* Then walk all the package entries. */
- while (getline(&buf, &buflen, fp) != -1) {
- if (*buf == '\n') {
- if (pkg_atom) {
- if (search_pkgs && !todo) {
- print_Pkg(verbose, pkg_atom, &Pkg);
- } else {
- for (i = 0; i < todo_cnt; i++) {
- pkg_atom->REPO = todo_atoms[i]->REPO ? Pkg.REPO : NULL;
- pkg_atom->SLOT = todo_atoms[i]->SLOT ? Pkg.SLOT : NULL;
- if (atom_compare(pkg_atom, todo_atoms[i]) == EQUAL) {
- if (search_pkgs)
- print_Pkg(verbose, pkg_atom, &Pkg);
- else
- pkg_fetch(0, pkg_atom, &Pkg);
- }
- }
- }
- atom_implode(pkg_atom);
- pkg_atom = NULL;
- }
- memset(&Pkg, 0, sizeof(Pkg));
- strcpy(Pkg.SLOT, "0");
- strcpy(Pkg.REPO, repo);
- continue;
- }
-
- if ((p = strchr(buf, '\n')) != NULL)
- *p = 0;
- if ((p = strchr(buf, ':')) == NULL)
- continue;
- if (p[1] != ' ')
- continue;
- *p = 0;
- p += 2;
-
- switch (*buf) {
- case 'U':
- if (strcmp(buf, "USE") == 0)
- snprintf(Pkg.USE, sizeof(Pkg.USE), "%.*s",
- (int)sizeof(Pkg.USE) - 1, p);
- break;
- case 'P':
- if (strcmp(buf, "PF") == 0)
- snprintf(Pkg.PF, sizeof(Pkg.PF), "%.*s",
- (int)sizeof(Pkg.PF) - 1, p);
- break;
- case 'S':
- if (strcmp(buf, "SIZE") == 0)
- Pkg.SIZE = atol(p);
- if (strcmp(buf, "SLOT") == 0)
- snprintf(Pkg.SLOT, sizeof(Pkg.SLOT), "%.*s",
- (int)sizeof(Pkg.SLOT) - 1, p);
- if (strcmp(buf, "SHA1") == 0)
- snprintf(Pkg.SHA1, sizeof(Pkg.SHA1), "%.*s",
- (int)sizeof(Pkg.SHA1) - 1, p);
- break;
- case 'M':
- if (strcmp(buf, "MD5") == 0)
- snprintf(Pkg.MD5, sizeof(Pkg.MD5), "%.*s",
- (int)sizeof(Pkg.MD5) - 1, p);
- break;
- case 'R':
- if (strcmp(buf, "REPO") == 0)
- snprintf(Pkg.REPO, sizeof(Pkg.REPO), "%.*s",
- (int)sizeof(Pkg.REPO) - 1, p);
- if (strcmp(buf, "RDEPEND") == 0)
- snprintf(Pkg.RDEPEND, sizeof(Pkg.RDEPEND), "%.*s",
- (int)sizeof(Pkg.RDEPEND) - 1, p);
- break;
- case 'L':
- if (strcmp(buf, "LICENSE") == 0)
- snprintf(Pkg.LICENSE, sizeof(Pkg.LICENSE), "%.*s",
- (int)sizeof(Pkg.LICENSE) - 1, p);
- break;
- case 'C':
- if (strcmp(buf, "CATEGORY") == 0)
- snprintf(Pkg.CATEGORY, sizeof(Pkg.CATEGORY), "%.*s",
- (int)sizeof(Pkg.CATEGORY) - 1, p);
- if (strcmp(buf, "CPV") == 0) {
- if (pkg_atom != NULL) /* hypothetical Coverity case */
- atom_implode(pkg_atom);
- if ((pkg_atom = atom_explode(p)) != NULL) {
- if (pkg_atom->PR_int)
- snprintf(Pkg.PF, sizeof(Pkg.PF), "%s-%s-r%i",
- pkg_atom->PN, pkg_atom->PV,
- pkg_atom->PR_int);
- else
- snprintf(Pkg.PF, sizeof(Pkg.PF), "%s-%s",
- pkg_atom->PN, pkg_atom->PV);
- snprintf(Pkg.CATEGORY, sizeof(Pkg.CATEGORY),
- "%.*s", (int)sizeof(Pkg.CATEGORY) - 1,
- pkg_atom->CATEGORY);
- }
- }
- break;
- case 'D':
- if (strcmp(buf, "DESC") == 0)
- snprintf(Pkg.DESC, sizeof(Pkg.DESC), "%.*s",
- (int)sizeof(Pkg.DESC) - 1, p);
- break;
- default:
- break;
- }
+ tpkg = tree_match_atom(tree, atom,
+ TREE_MATCH_FIRST | TREE_MATCH_VIRTUAL | TREE_MATCH_METADATA);
+ if (tpkg != NULL) {
+ depend_atom *tatom = tpkg->atom;
+ tree_pkg_meta *meta = tpkg->meta;
+ pkg = xzalloc(sizeof(struct pkg_t));
+
+ snprintf(pkg->PF, sizeof(pkg->PF), "%s", tatom->PF);
+ snprintf(pkg->CATEGORY, sizeof(pkg->CATEGORY), "%s", tatom->CATEGORY);
+ if (meta->Q_DESCRIPTION != NULL)
+ snprintf(pkg->DESC, sizeof(pkg->DESC), "%s", meta->Q_DESCRIPTION);
+ if (meta->Q_LICENSE != NULL)
+ snprintf(pkg->LICENSE, sizeof(pkg->LICENSE), "%s", meta->Q_LICENSE);
+ if (meta->Q_RDEPEND != NULL)
+ snprintf(pkg->RDEPEND, sizeof(pkg->RDEPEND), "%s", meta->Q_RDEPEND);
+ if (meta->Q_MD5 != NULL)
+ snprintf(pkg->MD5, sizeof(pkg->MD5), "%s", meta->Q_MD5);
+ if (meta->Q_SHA1 != NULL)
+ snprintf(pkg->SHA1, sizeof(pkg->SHA1), "%s", meta->Q_SHA1);
+ if (meta->Q_USE != NULL)
+ snprintf(pkg->USE, sizeof(pkg->USE), "%s", meta->Q_USE);
+ if (meta->Q_repository != NULL)
+ snprintf(pkg->REPO, sizeof(pkg->REPO), "%s", meta->Q_repository);
+ if (meta->Q_SLOT != NULL)
+ snprintf(pkg->REPO, sizeof(pkg->REPO), "%s", meta->Q_SLOT);
+ if (meta->Q_SIZE != NULL)
+ pkg->SIZE = atoi(meta->Q_SIZE);
+
+ tree_match_close(tpkg);
}
- free(buf);
- fclose(fp);
- if (pkg_atom)
- atom_implode(pkg_atom);
-
- for (i = 0; i < todo_cnt; i++)
- atom_implode(todo_atoms[i]);
- free(todo_atoms);
-
- return EXIT_SUCCESS;
+ return pkg;
}
static set *
@@ -2366,10 +1972,40 @@ qmerge_add_set(char *buf, set *q)
static int
qmerge_run(set *todo)
{
- if (uninstall)
+ if (uninstall) {
return unmerge_packages(todo);
- else
- return parse_packages(todo);
+ } else {
+ if (todo == NULL && search_pkgs) {
+ /* disputable, this should be qlist -kIv or something */
+ warn("please use qlist -kI");
+
+ return EXIT_SUCCESS;
+ } else {
+ char **todo_strs;
+ size_t todo_cnt = list_set(todo, &todo_strs);
+ size_t i;
+ depend_atom *atom;
+ struct pkg_t *pkg;
+ int ret = EXIT_FAILURE;
+
+ for (i = 0; i < todo_cnt; i++) {
+ atom = atom_explode(todo_strs[i]);
+ pkg = grab_binpkg_info(atom);
+ if (pkg != NULL) {
+ if (search_pkgs)
+ print_Pkg(verbose, atom, pkg);
+ else
+ pkg_fetch(0, atom, pkg);
+ free(pkg);
+ ret = EXIT_SUCCESS;
+ }
+ atom_implode(atom);
+ }
+ free(todo_strs);
+
+ return ret;
+ }
+ }
}
int qmerge_main(int argc, char **argv)
@@ -2437,10 +2073,10 @@ int qmerge_main(int argc, char **argv)
if (uninstall) {
if (!prompt("OK to unmerge these packages"))
- return 0;
+ return EXIT_FAILURE;
} else {
if (!prompt("OK to merge these packages"))
- return 0;
+ return EXIT_FAILURE;
}
pretend = save_pretend;
next reply other threads:[~2020-05-25 10:44 UTC|newest]
Thread overview: 593+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-25 10:43 Fabian Groffen [this message]
-- strict thread matches above, loose matches on Subject: below --
2024-12-02 7:26 [gentoo-commits] proj/portage-utils:master commit in: / Fabian Groffen
2024-07-03 19:44 Fabian Groffen
2024-06-28 19:51 Fabian Groffen
2024-06-27 19:19 Fabian Groffen
2024-04-20 13:05 Fabian Groffen
2024-03-29 11:22 Fabian Groffen
2024-03-29 10:58 Fabian Groffen
2024-03-29 10:57 Fabian Groffen
2024-01-02 13:16 Fabian Groffen
2024-01-02 13:16 Fabian Groffen
2024-01-02 7:57 Fabian Groffen
2024-01-01 10:37 Fabian Groffen
2023-12-20 21:32 Mike Frysinger
2023-07-18 6:28 Fabian Groffen
2023-07-18 6:28 Fabian Groffen
2023-04-21 19:11 Fabian Groffen
2023-03-01 21:00 Fabian Groffen
2023-02-22 20:06 Fabian Groffen
2023-02-07 8:10 Fabian Groffen
2022-12-15 9:13 Fabian Groffen
2022-12-15 9:03 Fabian Groffen
2022-12-15 9:03 Fabian Groffen
2022-11-16 8:59 Fabian Groffen
2022-08-29 8:44 Fabian Groffen
2022-08-29 8:44 Fabian Groffen
2022-08-28 12:26 Fabian Groffen
2022-08-28 12:26 Fabian Groffen
2022-06-14 6:36 Fabian Groffen
2022-05-26 14:53 Fabian Groffen
2022-05-20 17:15 Fabian Groffen
2022-04-06 19:31 Fabian Groffen
2022-02-27 12:29 Fabian Groffen
2022-02-23 11:57 Fabian Groffen
2022-02-23 11:57 Fabian Groffen
2022-02-12 18:31 Fabian Groffen
2022-02-12 18:31 Fabian Groffen
2022-02-12 18:31 Fabian Groffen
2022-02-12 17:13 Fabian Groffen
2022-02-12 17:13 Fabian Groffen
2022-02-12 17:13 Fabian Groffen
2022-02-12 17:13 Fabian Groffen
2022-02-12 17:13 Fabian Groffen
2022-02-12 16:14 Fabian Groffen
2022-02-07 7:16 Fabian Groffen
2022-02-06 15:21 Fabian Groffen
2022-02-06 14:51 Fabian Groffen
2022-02-06 14:29 Fabian Groffen
2022-02-06 14:29 Fabian Groffen
2022-01-31 8:01 Fabian Groffen
2021-12-31 15:36 Fabian Groffen
2021-12-31 15:36 Fabian Groffen
2021-12-31 15:36 Fabian Groffen
2021-12-29 12:20 Fabian Groffen
2021-12-27 18:13 Fabian Groffen
2021-12-26 13:59 Fabian Groffen
2021-12-25 9:15 Fabian Groffen
2021-12-23 12:55 Fabian Groffen
2021-12-21 11:30 Fabian Groffen
2021-12-13 8:39 Fabian Groffen
2021-12-13 8:39 Fabian Groffen
2021-12-13 8:39 Fabian Groffen
2021-11-13 14:27 Fabian Groffen
2021-11-13 14:27 Fabian Groffen
2021-11-07 10:53 Fabian Groffen
2021-10-09 12:03 Fabian Groffen
2021-10-03 11:15 Fabian Groffen
2021-10-03 8:54 Fabian Groffen
2021-09-27 18:14 Fabian Groffen
2021-07-06 6:43 Fabian Groffen
2021-07-05 8:40 Fabian Groffen
2021-07-01 10:07 Fabian Groffen
2021-07-01 10:05 Fabian Groffen
2021-06-30 6:26 Fabian Groffen
2021-06-24 6:44 Fabian Groffen
2021-06-23 7:14 Fabian Groffen
2021-06-21 20:04 Fabian Groffen
2021-06-17 6:27 Fabian Groffen
2021-06-16 20:11 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:21 Fabian Groffen
2021-06-16 19:19 Fabian Groffen
2021-06-01 19:43 Fabian Groffen
2021-06-01 19:43 Fabian Groffen
2021-05-31 19:14 Fabian Groffen
2021-05-15 12:19 Fabian Groffen
2021-05-10 9:16 Fabian Groffen
2021-05-02 11:32 Fabian Groffen
2021-05-02 11:25 Fabian Groffen
2021-05-02 11:25 Fabian Groffen
2021-05-01 19:32 Fabian Groffen
2021-05-01 8:40 Fabian Groffen
2021-03-13 20:32 Fabian Groffen
2021-02-20 12:06 Fabian Groffen
2021-02-20 11:44 Fabian Groffen
2021-02-20 11:44 Fabian Groffen
2021-02-17 20:23 Fabian Groffen
2020-11-29 9:13 Fabian Groffen
2020-11-21 10:53 Fabian Groffen
2020-11-21 10:45 Fabian Groffen
2020-11-21 10:00 Fabian Groffen
2020-11-21 9:53 Fabian Groffen
2020-11-21 8:53 Fabian Groffen
2020-11-14 17:06 Fabian Groffen
2020-11-14 17:06 Fabian Groffen
2020-11-13 9:32 Fabian Groffen
2020-10-04 19:30 Fabian Groffen
2020-10-04 19:06 Fabian Groffen
2020-10-04 18:46 Fabian Groffen
2020-10-04 18:44 Fabian Groffen
2020-10-04 12:33 Fabian Groffen
2020-10-04 11:54 Fabian Groffen
2020-10-04 11:31 Fabian Groffen
2020-10-04 11:09 Fabian Groffen
2020-08-17 14:34 Fabian Groffen
2020-08-17 13:08 Fabian Groffen
2020-08-17 13:08 Fabian Groffen
2020-08-14 10:44 Fabian Groffen
2020-08-14 10:09 Fabian Groffen
2020-08-14 9:35 Fabian Groffen
2020-08-14 9:35 Fabian Groffen
2020-08-02 7:39 Fabian Groffen
2020-07-08 8:12 Fabian Groffen
2020-06-28 19:11 Fabian Groffen
2020-06-28 15:58 Fabian Groffen
2020-06-27 9:38 Fabian Groffen
2020-06-27 9:38 Fabian Groffen
2020-05-25 19:01 Fabian Groffen
2020-05-25 18:29 Fabian Groffen
2020-05-25 18:25 Fabian Groffen
2020-05-25 18:08 Fabian Groffen
2020-05-25 18:05 Fabian Groffen
2020-05-25 11:20 Fabian Groffen
2020-05-25 11:12 Fabian Groffen
2020-05-25 10:43 Fabian Groffen
2020-05-21 11:13 Fabian Groffen
2020-05-17 12:35 Fabian Groffen
2020-05-17 12:35 Fabian Groffen
2020-05-17 12:35 Fabian Groffen
2020-05-17 12:35 Fabian Groffen
2020-05-17 8:27 Fabian Groffen
2020-05-17 8:27 Fabian Groffen
2020-05-17 8:15 Fabian Groffen
2020-05-16 18:51 Fabian Groffen
2020-05-16 14:30 Fabian Groffen
2020-05-16 13:06 Fabian Groffen
2020-05-16 13:06 Fabian Groffen
2020-05-02 8:45 Fabian Groffen
2020-04-27 7:46 Fabian Groffen
2020-02-21 8:50 Fabian Groffen
2020-02-21 8:18 Fabian Groffen
2020-01-31 14:45 Fabian Groffen
2020-01-31 13:26 Fabian Groffen
2020-01-31 13:26 Fabian Groffen
2020-01-31 13:26 Fabian Groffen
2020-01-31 10:49 Fabian Groffen
2020-01-31 10:49 Fabian Groffen
2020-01-31 10:49 Fabian Groffen
2020-01-26 19:31 Fabian Groffen
2020-01-25 12:20 Fabian Groffen
2020-01-25 12:20 Fabian Groffen
2020-01-25 12:11 Fabian Groffen
2020-01-25 10:01 Fabian Groffen
2020-01-25 9:45 Fabian Groffen
2020-01-25 9:11 Fabian Groffen
2020-01-25 9:11 Fabian Groffen
2020-01-25 9:03 Fabian Groffen
2020-01-25 9:03 Fabian Groffen
2020-01-25 9:03 Fabian Groffen
2020-01-25 9:03 Fabian Groffen
2020-01-25 9:03 Fabian Groffen
2020-01-22 20:11 Fabian Groffen
2020-01-22 20:11 Fabian Groffen
2020-01-22 20:11 Fabian Groffen
2020-01-22 20:04 Fabian Groffen
2020-01-22 20:04 Fabian Groffen
2020-01-22 20:04 Fabian Groffen
2020-01-22 20:04 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-22 19:54 Fabian Groffen
2020-01-20 19:54 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:36 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 19:09 Fabian Groffen
2020-01-19 16:40 Fabian Groffen
2020-01-19 16:37 Fabian Groffen
2020-01-19 16:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-19 12:37 Fabian Groffen
2020-01-18 13:09 Fabian Groffen
2020-01-06 8:03 Fabian Groffen
2020-01-06 7:36 Fabian Groffen
2020-01-05 16:08 Fabian Groffen
2020-01-05 16:08 Fabian Groffen
2020-01-05 16:08 Fabian Groffen
2020-01-05 13:28 Fabian Groffen
2020-01-04 20:02 Fabian Groffen
2020-01-04 19:48 Fabian Groffen
2020-01-04 13:28 Fabian Groffen
2020-01-04 10:44 Fabian Groffen
2020-01-04 10:38 Fabian Groffen
2020-01-04 10:27 Fabian Groffen
2020-01-04 10:20 Fabian Groffen
2020-01-03 15:05 Fabian Groffen
2020-01-03 14:58 Fabian Groffen
2020-01-03 10:36 Fabian Groffen
2020-01-02 20:27 Fabian Groffen
2020-01-02 20:00 Fabian Groffen
2020-01-02 15:32 Fabian Groffen
2020-01-02 15:09 Fabian Groffen
2020-01-02 15:09 Fabian Groffen
2020-01-02 14:07 Fabian Groffen
2020-01-02 14:07 Fabian Groffen
2020-01-02 14:07 Fabian Groffen
2020-01-02 14:07 Fabian Groffen
2020-01-02 11:55 Fabian Groffen
2020-01-02 9:47 Fabian Groffen
2020-01-01 19:57 Fabian Groffen
2019-12-31 9:10 Fabian Groffen
2019-12-31 9:05 Fabian Groffen
2019-12-29 12:35 Fabian Groffen
2019-12-29 9:57 Fabian Groffen
2019-12-27 21:45 Fabian Groffen
2019-12-27 21:14 Fabian Groffen
2019-12-27 19:16 Fabian Groffen
2019-12-14 17:01 Fabian Groffen
2019-12-14 17:01 Fabian Groffen
2019-12-14 17:01 Fabian Groffen
2019-12-08 11:53 Fabian Groffen
2019-11-29 13:56 Fabian Groffen
2019-11-29 13:22 Fabian Groffen
2019-11-25 19:51 Fabian Groffen
2019-11-25 19:39 Fabian Groffen
2019-11-19 20:28 Fabian Groffen
2019-11-19 20:28 Fabian Groffen
2019-11-17 15:12 Fabian Groffen
2019-11-17 15:12 Fabian Groffen
2019-11-17 15:12 Fabian Groffen
2019-11-17 15:12 Fabian Groffen
2019-11-17 15:12 Fabian Groffen
2019-11-15 13:52 Fabian Groffen
2019-11-13 18:19 Fabian Groffen
2019-11-13 12:59 Fabian Groffen
2019-11-13 12:53 Fabian Groffen
2019-11-13 12:53 Fabian Groffen
2019-11-09 10:35 Fabian Groffen
2019-10-27 12:23 Fabian Groffen
2019-10-20 10:11 Fabian Groffen
2019-10-12 12:47 Fabian Groffen
2019-10-03 11:50 Fabian Groffen
2019-09-29 12:18 Fabian Groffen
2019-09-28 13:28 Fabian Groffen
2019-09-28 13:06 Fabian Groffen
2019-09-26 19:28 Fabian Groffen
2019-09-26 19:28 Fabian Groffen
2019-09-26 14:06 Fabian Groffen
2019-09-26 14:06 Fabian Groffen
2019-09-21 20:23 Fabian Groffen
2019-09-21 20:17 Fabian Groffen
2019-09-21 19:53 Fabian Groffen
2019-09-10 18:25 Fabian Groffen
2019-08-17 8:37 Fabian Groffen
2019-07-18 17:55 Fabian Groffen
2019-07-14 18:51 Fabian Groffen
2019-07-14 16:27 Fabian Groffen
2019-07-14 16:27 Fabian Groffen
2019-07-14 16:00 Fabian Groffen
2019-07-14 13:09 Fabian Groffen
2019-07-14 13:09 Fabian Groffen
2019-07-14 8:37 Fabian Groffen
2019-06-27 8:54 Fabian Groffen
2019-06-26 19:32 Fabian Groffen
2019-06-19 10:44 Fabian Groffen
2019-06-13 10:52 Fabian Groffen
2019-06-13 9:28 Fabian Groffen
2019-06-13 8:41 Fabian Groffen
2019-06-11 17:55 Fabian Groffen
2019-06-10 18:38 Fabian Groffen
2019-06-10 15:29 Fabian Groffen
2019-06-10 13:31 Fabian Groffen
2019-06-10 12:50 Fabian Groffen
2019-06-10 10:12 Fabian Groffen
2019-06-10 10:09 Fabian Groffen
2019-06-10 10:09 Fabian Groffen
2019-06-10 10:09 Fabian Groffen
2019-06-10 10:09 Fabian Groffen
2019-06-10 10:09 Fabian Groffen
2019-06-09 9:23 Fabian Groffen
2019-06-08 18:42 Fabian Groffen
2019-06-08 18:25 Fabian Groffen
2019-06-08 18:13 Fabian Groffen
2019-06-08 18:13 Fabian Groffen
2019-06-08 18:13 Fabian Groffen
2019-06-08 18:13 Fabian Groffen
2019-06-07 12:20 Fabian Groffen
2019-06-06 13:52 Fabian Groffen
2019-06-06 13:46 Fabian Groffen
2019-06-06 13:46 Fabian Groffen
2019-06-06 8:14 Fabian Groffen
2019-06-05 7:57 Fabian Groffen
2019-05-30 10:23 Fabian Groffen
2019-05-30 10:09 Fabian Groffen
2019-05-30 8:55 Fabian Groffen
2019-05-25 16:04 Fabian Groffen
2019-05-25 14:54 Fabian Groffen
2019-05-25 14:04 Fabian Groffen
2019-05-25 12:19 Fabian Groffen
2019-05-24 12:26 Fabian Groffen
2019-05-22 8:54 Fabian Groffen
2019-05-21 14:42 Fabian Groffen
2019-05-21 14:37 Fabian Groffen
2019-05-21 14:12 Fabian Groffen
2019-05-21 14:12 Fabian Groffen
2019-05-20 12:15 Fabian Groffen
2019-05-20 10:46 Fabian Groffen
2019-05-16 17:13 Fabian Groffen
2019-05-16 17:13 Fabian Groffen
2019-05-16 17:13 Fabian Groffen
2019-05-16 17:13 Fabian Groffen
2019-05-16 13:18 Fabian Groffen
2019-05-15 9:42 Fabian Groffen
2019-05-13 13:39 Fabian Groffen
2019-05-12 9:58 Fabian Groffen
2019-05-12 9:58 Fabian Groffen
2019-05-12 9:58 Fabian Groffen
2019-05-11 11:11 Fabian Groffen
2019-05-11 7:14 Fabian Groffen
2019-05-11 7:14 Fabian Groffen
2019-05-11 7:14 Fabian Groffen
2019-05-11 7:14 Fabian Groffen
2019-05-10 15:32 Fabian Groffen
2019-05-10 15:32 Fabian Groffen
2019-05-10 7:30 Fabian Groffen
2019-05-10 7:30 Fabian Groffen
2019-05-10 7:30 Fabian Groffen
2019-05-07 6:19 Fabian Groffen
2019-05-07 6:19 Fabian Groffen
2019-05-06 16:04 Fabian Groffen
2019-05-06 6:41 Fabian Groffen
2019-05-04 17:23 Fabian Groffen
2019-05-04 11:53 Fabian Groffen
2019-05-03 11:45 Fabian Groffen
2019-05-03 8:50 Fabian Groffen
2019-05-03 8:50 Fabian Groffen
2019-05-03 8:50 Fabian Groffen
2019-05-03 8:50 Fabian Groffen
2019-05-02 16:09 Fabian Groffen
2019-05-02 8:29 Fabian Groffen
2019-04-30 8:02 Fabian Groffen
2019-04-30 7:54 Fabian Groffen
2019-04-28 18:10 Fabian Groffen
2019-04-27 9:01 Fabian Groffen
2019-04-27 8:33 Fabian Groffen
2019-04-25 17:36 Fabian Groffen
2019-04-25 9:48 Fabian Groffen
2019-04-25 9:48 Fabian Groffen
2019-04-25 9:48 Fabian Groffen
2019-04-25 9:22 Fabian Groffen
2019-04-25 9:22 Fabian Groffen
2019-04-25 9:22 Fabian Groffen
2019-04-25 9:22 Fabian Groffen
2019-04-14 10:52 Fabian Groffen
2019-03-27 20:52 Fabian Groffen
2019-03-27 20:37 Fabian Groffen
2019-03-27 20:18 Fabian Groffen
2019-03-18 13:14 Fabian Groffen
2019-03-18 13:14 Fabian Groffen
2019-03-18 13:14 Fabian Groffen
2019-03-12 8:05 Fabian Groffen
2019-03-01 13:51 Fabian Groffen
2019-02-28 18:37 Fabian Groffen
2019-02-28 18:37 Fabian Groffen
2019-02-27 21:18 Fabian Groffen
2019-02-27 20:53 Fabian Groffen
2019-02-23 15:22 Fabian Groffen
2018-12-28 9:08 Fabian Groffen
2018-12-24 16:02 Fabian Groffen
2018-12-20 18:24 Fabian Groffen
2018-12-20 18:24 Fabian Groffen
2018-12-09 10:42 Fabian Groffen
2018-11-20 14:25 Fabian Groffen
2018-10-26 13:50 Fabian Groffen
2018-10-26 13:50 Fabian Groffen
2018-08-06 7:25 Fabian Groffen
2018-08-06 7:25 Fabian Groffen
2018-08-01 13:28 Fabian Groffen
2018-07-18 20:20 Fabian Groffen
2018-06-28 9:35 Fabian Groffen
2018-06-28 9:35 Fabian Groffen
2018-05-18 16:58 Fabian Groffen
2018-05-18 12:19 Fabian Groffen
2018-05-18 12:19 Fabian Groffen
2018-05-18 10:15 Fabian Groffen
2018-04-18 13:58 Fabian Groffen
2018-04-17 20:12 Fabian Groffen
2018-04-15 15:41 Fabian Groffen
2018-04-15 15:38 Fabian Groffen
2018-04-09 7:15 Fabian Groffen
2018-04-09 7:15 Fabian Groffen
2018-04-04 13:16 Fabian Groffen
2018-04-03 20:13 Fabian Groffen
2018-04-03 13:39 Fabian Groffen
2018-04-02 17:27 Fabian Groffen
2018-04-01 10:22 Fabian Groffen
2018-04-01 10:22 Fabian Groffen
2018-03-31 6:54 Fabian Groffen
2018-03-31 6:54 Fabian Groffen
2018-03-31 6:54 Fabian Groffen
2018-03-31 6:54 Fabian Groffen
2018-03-30 5:56 Fabian Groffen
2018-03-30 5:56 Fabian Groffen
2018-03-26 19:08 Fabian Groffen
2018-03-25 14:00 Fabian Groffen
2018-03-23 20:17 Fabian Groffen
2018-03-23 20:17 Fabian Groffen
2018-03-23 15:27 Fabian Groffen
2018-03-23 15:27 Fabian Groffen
2018-03-23 13:17 Fabian Groffen
2018-03-23 11:29 Fabian Groffen
2018-03-23 11:08 Fabian Groffen
2018-03-23 9:37 Fabian Groffen
2018-01-08 12:33 Fabian Groffen
2018-01-08 12:33 Fabian Groffen
2017-12-29 11:45 Fabian Groffen
2017-12-29 11:45 Fabian Groffen
2017-12-29 11:45 Fabian Groffen
2017-11-27 7:55 Robin H. Johnson
2017-11-27 7:55 Robin H. Johnson
2017-02-07 3:03 Mike Frysinger
2016-12-29 2:33 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-29 2:25 Mike Frysinger
2016-12-20 19:15 Mike Frysinger
2016-12-20 16:55 Mike Frysinger
2016-11-27 5:46 Mike Frysinger
2016-11-27 5:46 Mike Frysinger
2016-11-27 5:46 Mike Frysinger
2016-11-27 1:52 Mike Frysinger
2016-11-27 1:50 Mike Frysinger
2016-11-27 0:00 Mike Frysinger
2016-11-26 23:48 Mike Frysinger
2016-11-26 23:46 Mike Frysinger
2016-11-26 23:24 Mike Frysinger
2016-11-26 23:17 Mike Frysinger
2016-11-15 3:34 Mike Frysinger
2016-11-15 3:34 Mike Frysinger
2016-11-15 3:34 Mike Frysinger
2016-11-15 3:34 Mike Frysinger
2016-11-15 3:34 Mike Frysinger
2016-11-12 17:17 Mike Frysinger
2016-06-21 20:53 Mike Frysinger
2016-06-20 3:22 Mike Frysinger
2016-04-04 15:47 Mike Frysinger
2016-04-01 21:42 Mike Frysinger
2016-04-01 21:42 Mike Frysinger
2016-03-28 4:53 Mike Frysinger
2016-03-28 4:53 Mike Frysinger
2016-03-28 4:53 Mike Frysinger
2016-02-22 20:37 Mike Frysinger
2016-02-22 20:37 Mike Frysinger
2016-02-22 20:37 Mike Frysinger
2016-02-22 20:37 Mike Frysinger
2016-02-17 7:15 Mike Frysinger
2016-02-14 1:26 Mike Frysinger
2016-02-14 1:26 Mike Frysinger
2016-02-14 1:26 Mike Frysinger
2016-01-29 5:53 Mike Frysinger
2016-01-05 0:25 Mike Frysinger
2015-12-17 5:06 Mike Frysinger
2015-12-17 5:06 Mike Frysinger
2015-12-17 5:06 Mike Frysinger
2015-12-17 5:06 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-28 2:44 Mike Frysinger
2015-11-26 10:52 Mike Frysinger
2015-11-26 10:52 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 10:39 Mike Frysinger
2015-11-26 8:59 Mike Frysinger
2015-11-26 8:00 Mike Frysinger
2015-09-15 18:27 Mike Frysinger
2015-06-23 8:58 Mike Frysinger
2015-06-06 6:20 Mike Frysinger
2015-06-06 6:20 Mike Frysinger
2015-06-06 6:20 Mike Frysinger
2015-06-06 6:20 Mike Frysinger
2015-06-03 15:44 Mike Frysinger
2015-06-03 15:44 Mike Frysinger
2015-05-31 8:31 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-05-19 17:37 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-24 1:26 Mike Frysinger
2015-02-21 18:06 Mike Frysinger
2015-02-21 0:00 Mike Frysinger
2015-02-21 0:00 Mike Frysinger
2015-02-20 22:28 Mike Frysinger
2015-02-19 7:49 Mike Frysinger
2014-10-19 16:56 Mike Frysinger
2014-06-16 18:01 Mike Frysinger
2014-03-16 6:34 Mike Frysinger
2014-03-16 6:34 Mike Frysinger
2014-03-16 6:14 Mike Frysinger
2014-03-16 6:14 Mike Frysinger
2014-03-16 6:14 Mike Frysinger
2014-03-15 6:02 Mike Frysinger
2014-03-11 4:53 Mike Frysinger
2014-03-11 4:53 Mike Frysinger
2014-03-10 8:45 Mike Frysinger
2014-03-10 8:45 Mike Frysinger
2014-03-10 8:45 Mike Frysinger
2014-03-10 6:00 Mike Frysinger
2014-03-10 6:00 Mike Frysinger
2014-03-10 6:00 Mike Frysinger
2014-03-10 6:00 Mike Frysinger
2014-03-10 6:00 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
2014-03-08 5:51 Mike Frysinger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1590403145.f2e63b4a1280d0a2c18cb1a66ceffd9699d1b9ac.grobian@gentoo \
--to=grobian@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox