#include <sys/types.h>
#include <sys/stat.h>
-#include <limits.h>
-#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "testcase.h"
#include "selection.h"
#include "solv_xfopen.h"
+#if ENABLE_TESTCASE_HELIXREPO
+#include "ext/repo_helix.h"
+#endif
#define DISABLE_JOIN2
#include "tools_util.h"
{ SOLVER_FLAG_NEED_UPDATEPROVIDE, "needupdateprovide", 0 },
{ SOLVER_FLAG_URPM_REORDER, "urpmreorder", 0 },
{ SOLVER_FLAG_FOCUS_BEST, "focusbest", 0 },
+ { SOLVER_FLAG_STRONG_RECOMMENDS, "strongrecommends", 0 },
+ { SOLVER_FLAG_INSTALL_ALSO_UPDATES, "installalsoupdates", 0 },
{ 0, 0, 0 }
};
#ifdef ENABLE_COMPLEX_DEPS
"complex_deps",
#endif
+#if ENABLE_TESTCASE_HELIXREPO
+ "testcase_helixrepo",
+#endif
0
};
{ REL_COMPAT, "compat >=" },
{ REL_KIND, "<KIND>" },
{ REL_ELSE, "<ELSE>" },
+ { REL_ERROR, "<ERROR>" },
{ REL_LT, "<" },
{ 0, 0 }
};
-static const char *
-testcase_dep2str_complex(Pool *pool, Id id, int addparens)
+static char *
+testcase_dep2str_complex(Pool *pool, char *s, Id id, int addparens)
{
Reldep *rd;
- char *s;
const char *s2;
int needparens;
struct oplist *op;
if (!ISRELDEP(id))
- return testcase_id2str(pool, id, 1);
+ {
+ s2 = testcase_id2str(pool, id, 1);
+ s = pool_tmpappend(pool, s, s2, 0);
+ pool_freetmpspace(pool, s2);
+ return s;
+ }
rd = GETRELDEP(pool, id);
/* check for special shortcuts */
if (rd->flags == REL_NAMESPACE && !ISRELDEP(rd->name) && !strncmp(pool_id2str(pool, rd->name), "namespace:", 10))
{
- const char *ns = pool_id2str(pool, rd->name);
- int nslen = strlen(ns);
- /* special namespace formatting */
- const char *evrs = testcase_dep2str_complex(pool, rd->evr, 0);
- s = pool_tmpappend(pool, evrs, ns, "()");
- memmove(s + nslen + 1, s, strlen(s) - nslen - 2);
- memcpy(s, ns, nslen);
- s[nslen] = '(';
- return s;
+ s = pool_tmpappend(pool, s, pool_id2str(pool, rd->name), "(");
+ s = testcase_dep2str_complex(pool, s, rd->evr, 0);
+ return pool_tmpappend(pool, s, ")", 0);
}
if (rd->flags == REL_MULTIARCH && !ISRELDEP(rd->name) && rd->evr == ARCH_ANY)
{
- /* special :any suffix */
- const char *ns = testcase_id2str(pool, rd->name, 1);
- return pool_tmpappend(pool, ns, ":any", 0);
+ /* append special :any suffix */
+ s2 = testcase_id2str(pool, rd->name, 1);
+ s = pool_tmpappend(pool, s, s2, ":any");
+ pool_freetmpspace(pool, s2);
+ return s;
}
needparens = 0;
if (rd->flags > 7 && rd->flags != REL_COMPAT && rd2->flags && rd2->flags <= 7)
needparens = 0;
}
- s = (char *)testcase_dep2str_complex(pool, rd->name, needparens);
if (addparens)
- {
- s = pool_tmpappend(pool, s, "(", 0);
- memmove(s + 1, s, strlen(s + 1));
- s[0] = '(';
- }
+ s = pool_tmpappend(pool, s, "(", 0);
+ s = testcase_dep2str_complex(pool, s, rd->name, needparens);
+
for (op = oplist; op->flags; op++)
if (rd->flags == op->flags)
break;
needparens = 0; /* chain */
}
if (!ISRELDEP(rd->evr))
- s2 = testcase_id2str(pool, rd->evr, 0);
+ {
+ s2 = testcase_id2str(pool, rd->evr, 0);
+ s = pool_tmpappend(pool, s, s2, 0);
+ pool_freetmpspace(pool, s2);
+ }
else
- s2 = testcase_dep2str_complex(pool, rd->evr, needparens);
+ s = (char *)testcase_dep2str_complex(pool, s, rd->evr, needparens);
if (addparens)
- s = pool_tmpappend(pool, s, s2, ")");
- else
- s = pool_tmpappend(pool, s, s2, 0);
- pool_freetmpspace(pool, s2);
+ s = pool_tmpappend(pool, s, ")", 0);
return s;
}
const char *
testcase_dep2str(Pool *pool, Id id)
{
- return testcase_dep2str_complex(pool, id, 0);
+ char *s;
+ if (!ISRELDEP(id))
+ return testcase_id2str(pool, id, 1);
+ s = pool_alloctmpspace(pool, 1);
+ *s = 0;
+ return testcase_dep2str_complex(pool, s, id, 0);
}
return job;
}
-int
+static int
addselectionjob(Pool *pool, char **pieces, int npieces, Queue *jobqueue)
{
Id job;
strqueue_push(&sq, cmd);
}
- if (resultflags)
+ if ((resultflags & ~TESTCASE_RESULT_REUSE_SOLVER) != 0)
{
char *result;
cmd = 0;
int ngenid = 0;
Queue autoinstq;
+ if (resultp)
+ *resultp = 0;
+ if (resultflagsp)
+ *resultflagsp = 0;
if (!fp && !(fp = fopen(testcase, "r")))
{
pool_debug(pool, SOLV_ERROR, "testcase_read: could not open '%s'\n", testcase);
repo_add_solv(repo, rfp, 0);
fclose(rfp);
}
-#if 0
+#if ENABLE_TESTCASE_HELIXREPO
else if (!strcmp(repotype, "helix"))
{
- extern int repo_add_helix(Repo *repo, FILE *fp, int flags);
repo_add_helix(repo, rfp, 0);
fclose(rfp);
}
if (resultflagsp)
*resultflagsp = resultflags;
}
- else if (!strcmp(pieces[0], "nextjob") && npieces == 1)
+ else if (!strcmp(pieces[0], "nextjob"))
{
+ if (npieces == 2 && resultflagsp && !strcmp(pieces[1], "reusesolver"))
+ *resultflagsp |= TESTCASE_RESULT_REUSE_SOLVER;
break;
}
else if (!strcmp(pieces[0], "disable") && npieces == 3)