X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ext%2Ftestcase.c;h=32547c85aa4503aec49c9ad860fa346d8794200a;hb=67ba071573efb19964719240734e2f16d27a6bab;hp=ba4b6906c9095349d2bc29cd60899795fb81a153;hpb=ca1d509d28858cd9d74a4ee7724e774b58ec459c;p=platform%2Fupstream%2Flibsolv.git diff --git a/ext/testcase.c b/ext/testcase.c index ba4b690..32547c8 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -23,6 +23,7 @@ #include "solverdebug.h" #include "chksum.h" #include "testcase.h" +#include "selection.h" #include "solv_xfopen.h" #define DISABLE_JOIN2 @@ -37,7 +38,8 @@ static struct job2str { { SOLVER_ERASE, "erase" }, { SOLVER_UPDATE, "update" }, { SOLVER_WEAKENDEPS, "weakendeps" }, - { SOLVER_NOOBSOLETES, "noobsoletes" }, + { SOLVER_MULTIVERSION, "multiversion" }, + { SOLVER_MULTIVERSION, "noobsoletes" }, /* old name */ { SOLVER_LOCK, "lock" }, { SOLVER_DISTUPGRADE, "distupgrade" }, { SOLVER_VERIFY, "verify" }, @@ -53,6 +55,10 @@ static struct jobflags2str { { SOLVER_WEAK, "weak" }, { SOLVER_ESSENTIAL, "essential" }, { SOLVER_CLEANDEPS, "cleandeps" }, + { SOLVER_ORUPDATE, "orupdate" }, + { SOLVER_FORCEBEST, "forcebest" }, + { SOLVER_TARGETED, "targeted" }, + { SOLVER_NOTBYUSER, "notbyuser" }, { SOLVER_SETEV, "setev" }, { SOLVER_SETEVR, "setevr" }, { SOLVER_SETARCH, "setarch" }, @@ -90,6 +96,14 @@ static struct solverflags2str { { SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, "addalreadyrecommended", 0 }, { SOLVER_FLAG_NO_INFARCHCHECK, "noinfarchcheck", 0 }, { SOLVER_FLAG_KEEP_EXPLICIT_OBSOLETES, "keepexplicitobsoletes", 0 }, + { SOLVER_FLAG_BEST_OBEY_POLICY, "bestobeypolicy", 0 }, + { SOLVER_FLAG_NO_AUTOTARGET, "noautotarget", 0 }, + { SOLVER_FLAG_DUP_ALLOW_DOWNGRADE, "dupallowdowngrade", 1 }, + { SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE, "dupallowarchchange", 1 }, + { SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE, "dupallowvendorchange", 1 }, + { SOLVER_FLAG_DUP_ALLOW_NAMECHANGE, "dupallownamechange", 1 }, + { SOLVER_FLAG_KEEP_ORPHANS, "keeporphans", 0 }, + { SOLVER_FLAG_BREAK_ORPHANS, "breakorphans", 0 }, { 0, 0, 0 } }; @@ -103,11 +117,44 @@ static struct poolflags2str { { POOL_FLAG_OBSOLETEUSESPROVIDES, "obsoleteusesprovides", 0 }, { POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES, "implicitobsoleteusesprovides", 0 }, { POOL_FLAG_OBSOLETEUSESCOLORS, "obsoleteusescolors", 0 }, + { POOL_FLAG_IMPLICITOBSOLETEUSESCOLORS, "implicitobsoleteusescolors", 0 }, { POOL_FLAG_NOINSTALLEDOBSOLETES, "noinstalledobsoletes", 0 }, { POOL_FLAG_HAVEDISTEPOCH, "havedistepoch", 0 }, + { POOL_FLAG_NOOBSOLETESMULTIVERSION, "noobsoletesmultiversion", 0 }, + { POOL_FLAG_ADDFILEPROVIDESFILTERED, "addfileprovidesfiltered", 0 }, { 0, 0, 0 } }; +static struct disttype2str { + Id type; + const char *str; +} disttype2str[] = { + { DISTTYPE_RPM, "rpm" }, + { DISTTYPE_DEB, "deb" }, + { DISTTYPE_ARCH, "arch" }, + { DISTTYPE_HAIKU, "haiku" }, + { 0, 0 } +}; + +static struct selflags2str { + Id flag; + const char *str; +} selflags2str[] = { + { SELECTION_NAME, "name" }, + { SELECTION_PROVIDES, "provides" }, + { SELECTION_FILELIST, "filelist" }, + { SELECTION_CANON, "canon" }, + { SELECTION_DOTARCH, "dotarch" }, + { SELECTION_REL, "rel" }, + { SELECTION_INSTALLED_ONLY, "installedonly" }, + { SELECTION_GLOB, "glob" }, + { SELECTION_FLAT, "flat" }, + { SELECTION_NOCASE, "nocase" }, + { SELECTION_SOURCE_ONLY, "sourceonly" }, + { SELECTION_WITH_SOURCE, "withsource" }, + { 0, 0 } +}; + typedef struct strqueue { char **str; @@ -247,21 +294,14 @@ pool_isknownarch(Pool *pool, Id id) return 1; } -Id -testcase_str2dep(Pool *pool, char *s) +static Id +testcase_str2dep_simple(Pool *pool, const char **sp) { - char *n, *a; - Id id; + const char *s = *sp; + const char *n, *a; + Id id, evr; int flags; - if ((n = strchr(s, '|')) != 0) - { - id = testcase_str2dep(pool, n + 1); - *n = 0; - id = pool_rel2id(pool, testcase_str2dep(pool, s), id, REL_OR, 1); - *n = '|'; - return id; - } while (*s == ' ' || *s == '\t') s++; n = s; @@ -271,9 +311,9 @@ testcase_str2dep(Pool *pool, char *s) { while (*s && *s != ')') s++; + continue; } - else - s++; + s++; } if ((a = strchr(n, '.')) != 0 && a + 1 < s && s[-1] != ')') { @@ -286,32 +326,105 @@ testcase_str2dep(Pool *pool, char *s) else id = pool_strn2id(pool, n, s - n, 1); } + else if (s - n > 4 && s[-4] == ':' && !strncmp(s - 4, ":any", 4)) + { + id = pool_strn2id(pool, n, s - n - 4, 1); + id = pool_rel2id(pool, id, ARCH_ANY, REL_MULTIARCH, 1); + } else id = pool_strn2id(pool, n, s - n, 1); if (!*s) - return id; + { + *sp = s; + return id; + } while (*s == ' ' || *s == '\t') s++; flags = 0; + if (*s == '!' && s[1] == '=') /* support != as synonym for <> */ + { + flags = REL_LT | REL_GT; + s += 2; + } for (;;s++) - { + { if (*s == '<') - flags |= REL_LT; + flags |= REL_LT; else if (*s == '=') - flags |= REL_EQ; + flags |= REL_EQ; else if (*s == '>') - flags |= REL_GT; + flags |= REL_GT; else - break; + break; } if (!flags) - return id; + { + *sp = s; + return id; + } while (*s == ' ' || *s == '\t') s++; n = s; while (*s && *s != ' ' && *s != '\t') s++; - return pool_rel2id(pool, id, pool_strn2id(pool, n, s - n, 1), flags, 1); + evr = pool_strn2id(pool, n, s - n, 1); + if (*s == ' ' && !strcmp(s, " compat >= ")) + { + s += 11; + while (*s == ' ' || *s == '\t') + s++; + n = s; + while (*s && *s != ' ' && *s != '\t') + s++; + evr = pool_rel2id(pool, evr, pool_strn2id(pool, n, s - n, 1), REL_COMPAT, 1); + } + *sp = s; + return pool_rel2id(pool, id, evr, flags, 1); +} + +static Id +testcase_str2dep_complex(Pool *pool, const char **sp) +{ + const char *s = *sp; + Id id; +#ifdef ENABLE_COMPLEX_DEPS + while (*s == ' ' || *s == '\t') + s++; + if (*s == '(') + { + s++; + id = testcase_str2dep_complex(pool, &s); + if (*s == ')') + s++; + while (*s == ' ' || *s == '\t') + s++; + } + else +#endif + id = testcase_str2dep_simple(pool, &s); + if (*s == '|') + { + s++; + id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_OR, 1); + } + else if (*s == '&') + { + s++; + id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_AND, 1); + } + else if (*s == 'I' && s[1] == 'F' && (s[2] == ' ' || s[2] == '\t')) + { + s += 2; + id = pool_rel2id(pool, id, testcase_str2dep_complex(pool, &s), REL_COND, 1); + } + *sp = s; + return id; +} + +Id +testcase_str2dep(Pool *pool, const char *s) +{ + return testcase_str2dep_complex(pool, &s); } const char * @@ -347,8 +460,8 @@ testcase_solvid2str(Pool *pool, Id p) n = pool_id2str(pool, s->name); e = pool_id2str(pool, s->evr); a = pool_id2str(pool, s->arch); - str = pool_alloctmpspace(pool, strlen(n) + strlen(e) + strlen(a) + 3); - sprintf(str, "%s-%s.%s", n, e, a); + str = pool_alloctmpspace(pool, strlen(n) + strlen(e) + strlen(a) + 3); + sprintf(str, "%s-%s.%s", n, e, a); if (!s->repo) return pool_tmpappend(pool, str, "@", 0); if (s->repo->name) @@ -547,6 +660,50 @@ testcase_job2str(Pool *pool, Id how, Id what) return ret; } +static int +str2selflags(Pool *pool, char *s) /* modifies the string! */ +{ + int i, selflags = 0; + while (s) + { + char *se = strchr(s, ','); + if (se) + *se++ = 0; + for (i = 0; selflags2str[i].str; i++) + if (!strcmp(s, selflags2str[i].str)) + { + selflags |= selflags2str[i].flag; + break; + } + if (!selflags2str[i].str) + pool_debug(pool, SOLV_ERROR, "str2job: unknown selection flag '%s'\n", s); + s = se; + } + return selflags; +} + +static int +str2jobflags(Pool *pool, char *s) /* modifies the string */ +{ + int i, jobflags = 0; + while (s) + { + char *se = strchr(s, ','); + if (se) + *se++ = 0; + for (i = 0; jobflags2str[i].str; i++) + if (!strcmp(s, jobflags2str[i].str)) + { + jobflags |= jobflags2str[i].flag; + break; + } + if (!jobflags2str[i].str) + pool_debug(pool, SOLV_ERROR, "str2job: unknown job flag '%s'\n", s); + s = se; + } + return jobflags; +} + Id testcase_str2job(Pool *pool, const char *str, Id *whatp) { @@ -578,7 +735,7 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: bad line '%s'\n", str); solv_free(pieces); - return 0; + return -1; } for (i = 0; job2str[i].str; i++) @@ -588,35 +745,19 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: unknown job '%s'\n", str); solv_free(pieces); - return 0; + return -1; } job = job2str[i].job; + what = 0; if (npieces > 3) { char *flags = pieces[npieces - 1]; - char *nf; if (*flags == '[' && flags[strlen(flags) - 1] == ']') { npieces--; flags++; - flags[strlen(flags) - 1] = ','; - while (*flags) - { - for (nf = flags; *nf != ','; nf++) - ; - *nf++ = 0; - for (i = 0; jobflags2str[i].str; i++) - if (!strcmp(flags, jobflags2str[i].str)) - break; - if (!jobflags2str[i].str) - { - pool_debug(pool, SOLV_ERROR, "str2job: unknown jobflags in '%s'\n", str); - solv_free(pieces); - return 0; - } - job |= jobflags2str[i].flag; - flags = nf; - } + flags[strlen(flags) - 1] = 0; + job |= str2jobflags(pool, flags); } } if (!strcmp(pieces[1], "pkg")) @@ -625,7 +766,7 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: bad pkg selector in '%s'\n", str); solv_free(pieces); - return 0; + return -1; } job |= SOLVER_SOLVABLE; what = testcase_str2solvid(pool, pieces[2]); @@ -633,7 +774,7 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: unknown package '%s'\n", pieces[2]); solv_free(pieces); - return 0; + return -1; } } else if (!strcmp(pieces[1], "name") || !strcmp(pieces[1], "provides")) @@ -643,7 +784,25 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) for (sp = pieces[2]; sp < pieces[npieces - 1]; sp++) if (*sp == 0) *sp = ' '; - what = testcase_str2dep(pool, pieces[2]); + what = 0; + if (pieces[1][0] == 'p' && strncmp(pieces[2], "namespace:", 10) == 0) + { + char *spe = strchr(pieces[2], '('); + int l = strlen(pieces[2]); + if (spe && pieces[2][l - 1] == ')') + { + /* special namespace provides */ + if (strcmp(spe, "()") != 0) + { + pieces[2][l - 1] = 0; + what = testcase_str2dep(pool, spe + 1); + pieces[2][l - 1] = ')'; + } + what = pool_rel2id(pool, pool_strn2id(pool, pieces[2], spe - pieces[2], 1), what, REL_NAMESPACE, 1); + } + } + if (!what) + what = testcase_str2dep(pool, pieces[2]); if (pieces[1][0] == 'n') job |= SOLVER_SOLVABLE_NAME; else @@ -664,7 +823,7 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) pool_debug(pool, SOLV_ERROR, "str2job: unknown package '%s'\n", pieces[i]); queue_free(&q); solv_free(pieces); - return 0; + return -1; } queue_push(&q, p); } @@ -679,14 +838,14 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: bad line '%s'\n", str); solv_free(pieces); - return 0; + return -1; } repo = testcase_str2repo(pool, pieces[2]); if (!repo) { pool_debug(pool, SOLV_ERROR, "str2job: unknown repo '%s'\n", pieces[2]); solv_free(pieces); - return 0; + return -1; } job |= SOLVER_SOLVABLE_REPO; what = repo->repoid; @@ -697,7 +856,7 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: bad line '%s'\n", str); solv_free(pieces); - return 0; + return -1; } job |= SOLVER_SOLVABLE_ALL; what = 0; @@ -706,13 +865,55 @@ testcase_str2job(Pool *pool, const char *str, Id *whatp) { pool_debug(pool, SOLV_ERROR, "str2job: unknown selection in '%s'\n", str); solv_free(pieces); - return 0; + return -1; } *whatp = what; solv_free(pieces); return job; } +int +addselectionjob(Pool *pool, char **pieces, int npieces, Queue *jobqueue) +{ + Id job; + int i, r; + int selflags; + Queue sel; + + for (i = 0; job2str[i].str; i++) + if (!strcmp(pieces[0], job2str[i].str)) + break; + if (!job2str[i].str) + { + pool_debug(pool, SOLV_ERROR, "selstr2job: unknown job '%s'\n", pieces[0]); + return -1; + } + job = job2str[i].job; + if (npieces > 3) + { + char *flags = pieces[npieces - 1]; + if (*flags == '[' && flags[strlen(flags) - 1] == ']') + { + npieces--; + flags++; + flags[strlen(flags) - 1] = 0; + job |= str2jobflags(pool, flags); + } + } + if (npieces < 4) + { + pool_debug(pool, SOLV_ERROR, "selstr2job: no selection flags\n"); + return -1; + } + selflags = str2selflags(pool, pieces[3]); + queue_init(&sel); + r = selection_make(pool, &sel, pieces[2], selflags); + for (i = 0; i < sel.count; i += 2) + queue_push2(jobqueue, job | sel.elements[i], sel.elements[i + 1]); + queue_free(&sel); + return r; +} + static void writedeps(Repo *repo, FILE *fp, const char *tag, Id key, Solvable *s, Offset off) { @@ -893,15 +1094,15 @@ finish_solvable(Pool *pool, Repodata *data, Solvable *s, char *filelist, int nfi if (nfilelist) { int l; - Id did; - for (l = 0; l < nfilelist; l += strlen(filelist + l) + 1) + Id did; + for (l = 0; l < nfilelist; l += strlen(filelist + l) + 1) { char *p = strrchr(filelist + l, '/'); - if (!p) + if (!p) continue; - *p++ = 0; + *p++ = 0; did = repodata_str2dir(data, filelist + l, 1); - p[-1] = '/'; + p[-1] = '/'; if (!did) did = repodata_str2dir(data, "/", 1); repodata_add_dirstr(data, s - pool->solvables, SOLVABLE_FILELIST, did, p); @@ -951,7 +1152,7 @@ testcase_add_testtags(Repo *repo, FILE *fp, int flags) linep += strlen(linep); if (linep == line || linep[-1] != '\n') continue; - *--linep = 0; + linep[-1] = 0; linep = line + intag; if (intag) { @@ -1182,7 +1383,7 @@ testcase_ruleid(Solver *solv, Id rid) Strqueue sq; Queue q; int i; - void *chk; + Chksum *chk; const unsigned char *md5; int md5l; const char *s; @@ -1215,7 +1416,7 @@ testcase_problemid(Solver *solv, Id problem) { Strqueue sq; Queue q; - void *chk; + Chksum *chk; const unsigned char *md5; int i, md5l; const char *s; @@ -1242,7 +1443,7 @@ static const char * testcase_solutionid(Solver *solv, Id problem, Id solution) { Id intid; - void *chk; + Chksum *chk; const unsigned char *md5; int md5l; const char *s; @@ -1402,16 +1603,26 @@ testcase_solverresult(Solver *solv, int resultflags) if ((resultflags & TESTCASE_RESULT_UNNEEDED) != 0) { - Queue q; + Queue q, qf; queue_init(&q); + queue_init(&qf); solver_get_unneeded(solv, &q, 0); - for (i = 0; i < q.count; i++) + solver_get_unneeded(solv, &qf, 1); + for (i = j = 0; i < q.count; i++) { - s = pool_tmpjoin(pool, "unneeded ", testcase_solvid2str(pool, q.elements[i]), 0); + /* we rely on qf containing a subset of q in the same order */ + if (j < qf.count && q.elements[i] == qf.elements[j]) + { + s = pool_tmpjoin(pool, "unneeded_filtered ", testcase_solvid2str(pool, q.elements[i]), 0); + j++; + } + else + s = pool_tmpjoin(pool, "unneeded ", testcase_solvid2str(pool, q.elements[i]), 0); strqueue_push(&sq, s); } queue_free(&q); + queue_free(&qf); } strqueue_sort(&sq); @@ -1475,7 +1686,7 @@ testcase_write(Solver *solv, char *dir, int resultflags, const char *testcasenam } /* hmm, this is not optimal... we currently search for the lowest score */ lowscore = 0; - arch = ARCH_NOARCH; + arch = pool->solvables[SYSTEMSOLVABLE].arch; for (i = 0; i < pool->lastarch; i++) { if (pool->id2arch[i] == 1 && !lowscore) @@ -1486,7 +1697,11 @@ testcase_write(Solver *solv, char *dir, int resultflags, const char *testcasenam lowscore = pool->id2arch[i]; } } - cmd = pool_tmpjoin(pool, "system ", pool_id2str(pool, arch), pool->disttype == DISTTYPE_DEB ? " deb" : " rpm"); + cmd = pool_tmpjoin(pool, "system ", pool->lastarch ? pool_id2str(pool, arch) : "unset", 0); + for (i = 0; disttype2str[i].str != 0; i++) + if (pool->disttype == disttype2str[i].type) + break; + pool_tmpappend(pool, cmd, " ", disttype2str[i].str ? disttype2str[i].str : "unknown"); if (pool->installed) cmd = pool_tmpappend(pool, cmd, " ", testcase_repoid2str(pool, pool->installed->repoid)); strqueue_push(&sq, cmd); @@ -1529,8 +1744,9 @@ testcase_write(Solver *solv, char *dir, int resultflags, const char *testcasenam Reldep *rd = pool->rels + rid; if (rd->flags != REL_NAMESPACE || rd->name == NAMESPACE_OTHERPROVIDERS) continue; - /* check if we evaluated it, also skip empty results */ - if (!(d = pool->whatprovides_rel[rid]) || !pool->whatprovidesdata[d]) + /* evaluate all namespace ids, skip empty results */ + d = pool_whatprovides(pool, MAKERELDEP(rid)); + if (!d || !pool->whatprovidesdata[d]) continue; cmd = pool_tmpjoin(pool, "namespace ", pool_id2str(pool, rd->name), "("); cmd = pool_tmpappend(pool, cmd, pool_id2str(pool, rd->evr), ")"); @@ -1586,6 +1802,7 @@ testcase_write(Solver *solv, char *dir, int resultflags, const char *testcasenam pool_debug(solv->pool, SOLV_ERROR, "testcase_write: write error\n"); solv_free(result); strqueue_free(&sq); + fclose(fp); return 0; } if (fclose(fp)) @@ -1610,6 +1827,7 @@ testcase_write(Solver *solv, char *dir, int resultflags, const char *testcasenam { pool_debug(solv->pool, SOLV_ERROR, "testcase_write: write error\n"); strqueue_free(&sq); + fclose(fp); return 0; } if (fclose(fp)) @@ -1629,7 +1847,7 @@ read_inline_file(FILE *fp, char **bufp, char **bufpp, int *buflp) char *result = solv_malloc(1024); char *rp = result; int resultl = 1024; - + for (;;) { size_t rl; @@ -1684,7 +1902,7 @@ read_file(FILE *fp) char *result = solv_malloc(1024); char *rp = result; int resultl = 1024; - + for (;;) { size_t rl; @@ -1706,6 +1924,28 @@ read_file(FILE *fp) return result; } +static int +str2resultflags(Pool *pool, char *s) /* modifies the string! */ +{ + int i, resultflags = 0; + while (s) + { + char *se = strchr(s, ','); + if (se) + *se++ = 0; + for (i = 0; resultflags2str[i].str; i++) + if (!strcmp(s, resultflags2str[i].str)) + { + resultflags |= resultflags2str[i].flag; + break; + } + if (!resultflags2str[i].str) + pool_debug(pool, SOLV_ERROR, "result: unknown flag '%s'\n", s); + s = se; + } + return resultflags; +} + Solver * testcase_read(Pool *pool, FILE *fp, char *testcase, Queue *job, char **resultp, int *resultflagsp) { @@ -1823,6 +2063,14 @@ testcase_read(Pool *pool, FILE *fp, char *testcase, Queue *job, char **resultp, repo_add_solv(repo, rfp, 0); fclose(rfp); } +#if 0 + else if (!strcmp(repotype, "helix")) + { + extern int repo_add_helix(Repo *repo, FILE *fp, int flags); + repo_add_helix(repo, rfp, 0); + fclose(rfp); + } +#endif else { fclose(rfp); @@ -1832,8 +2080,28 @@ testcase_read(Pool *pool, FILE *fp, char *testcase, Queue *job, char **resultp, } else if (!strcmp(pieces[0], "system") && npieces >= 3) { + int i; prepared = 0; - pool_setarch(pool, pieces[1]); + /* must set the disttype before the arch */ + for (i = 0; disttype2str[i].str != 0; i++) + if (!strcmp(disttype2str[i].str, pieces[2])) + break; + if (!disttype2str[i].str) + pool_debug(pool, SOLV_ERROR, "testcase_read: system: unknown disttype '%s'\n", pieces[2]); + else if (pool->disttype != disttype2str[i].type) + { +#ifdef MULTI_SEMANTICS + pool_setdisttype(pool, disttype2str[i].type); +#else + pool_debug(pool, SOLV_ERROR, "testcase_read: system: cannot change disttype to '%s'\n", pieces[2]); +#endif + } + if (strcmp(pieces[1], "unset") == 0) + pool_setarch(pool, 0); + else if (pieces[1][0] == ':') + pool_setarchpolicy(pool, pieces[1] + 1); + else + pool_setarch(pool, pieces[1]); if (npieces > 3) { Repo *repo = testcase_str2repo(pool, pieces[3]); @@ -1853,6 +2121,11 @@ testcase_read(Pool *pool, FILE *fp, char *testcase, Queue *job, char **resultp, pool_createwhatprovides(pool); prepared = 1; } + if (npieces >= 3 && !strcmp(pieces[2], "selection")) + { + addselectionjob(pool, pieces + 1, npieces - 1, job); + continue; + } /* rejoin */ for (sp = pieces[1]; sp < pieces[npieces - 1]; sp++) if (*sp == 0) @@ -1920,41 +2193,26 @@ testcase_read(Pool *pool, FILE *fp, char *testcase, Queue *job, char **resultp, for (i = 1; i < npieces; i++) testcase_setsolverflags(solv, pieces[i]); } - else if (!strcmp(pieces[0], "result") && npieces > 2) + else if (!strcmp(pieces[0], "result") && npieces > 1) { - const char *rdata; char *result = 0; - int resultflags = 0; - char *s = pieces[1]; - int i; - while (s) - { - char *se = strchr(s, ','); - if (se) - *se++ = 0; - for (i = 0; resultflags2str[i].str; i++) - if (!strcmp(s, resultflags2str[i].str)) - { - resultflags |= resultflags2str[i].flag; - break; - } - if (!resultflags2str[i].str) - pool_debug(pool, SOLV_ERROR, "result: unknown flag '%s'\n", s); - s = se; - } - - rdata = pool_tmpjoin(pool, testcasedir, pieces[2], 0); - if (!strcmp(pieces[2], "")) - result = read_inline_file(fp, &buf, &bufp, &bufl); - else + int resultflags = str2resultflags(pool, pieces[1]); + const char *rdata; + if (npieces > 2) { - FILE *rfp = fopen(rdata, "r"); - if (!rfp) - pool_debug(pool, SOLV_ERROR, "testcase_read: could not open '%s'\n", rdata); + rdata = pool_tmpjoin(pool, testcasedir, pieces[2], 0); + if (!strcmp(pieces[2], "")) + result = read_inline_file(fp, &buf, &bufp, &bufl); else { - result = read_file(rfp); - fclose(rfp); + FILE *rfp = fopen(rdata, "r"); + if (!rfp) + pool_debug(pool, SOLV_ERROR, "testcase_read: could not open '%s'\n", rdata); + else + { + result = read_file(rfp); + fclose(rfp); + } } } if (resultp)