/*
- * add dependency (as Id) to repo
+ * add dependency (as Id) to repo, also unifies dependencies
* olddeps = offset into idarraydata
- * isreq = 0 for normal dep
- * isreq = 1 for requires
- * isreq = 2 for pre-requires
+ * marker= 0 for normal dep
+ * marker > 0 add dep after marker
+ * marker < 0 add dep after -marker
*
*/
-
Offset
-repo_addid_dep(Repo *repo, Offset olddeps, Id id, int isreq)
+repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker)
{
- Id oid, *oidp, *marker = 0;
+ Id oid, *oidp, *markerp;
+ int before;
if (!olddeps)
- return repo_addid(repo, olddeps, id);
+ {
+ if (marker > 0)
+ olddeps = repo_addid(repo, olddeps, marker);
+ return repo_addid(repo, olddeps, id);
+ }
- if (!isreq)
+ if (!marker)
{
for (oidp = repo->idarraydata + olddeps; (oid = *oidp) != ID_NULL; oidp++)
{
return repo_addid(repo, olddeps, id);
}
+ before = 0;
+ markerp = 0;
+ if (marker < 0)
+ {
+ before = 1;
+ marker = -marker;
+ }
for (oidp = repo->idarraydata + olddeps; (oid = *oidp) != ID_NULL; oidp++)
{
- if (oid == SOLVABLE_PREREQMARKER)
- marker = oidp;
+ if (oid == marker)
+ markerp = oidp;
else if (oid == id)
break;
}
if (oid)
{
- if (marker || isreq == 1)
+ if (markerp || before)
return olddeps;
- marker = oidp++;
+ /* we found it, but in the wrong half */
+ markerp = oidp++;
for (; (oid = *oidp) != ID_NULL; oidp++)
- if (oid == SOLVABLE_PREREQMARKER)
+ if (oid == marker)
break;
if (!oid)
{
+ /* no marker in array yet */
oidp--;
- if (marker < oidp)
- memmove(marker, marker + 1, (oidp - marker) * sizeof(Id));
- *oidp = SOLVABLE_PREREQMARKER;
+ if (markerp < oidp)
+ memmove(markerp, markerp + 1, (oidp - markerp) * sizeof(Id));
+ *oidp = marker;
return repo_addid(repo, olddeps, id);
}
while (oidp[1])
oidp++;
- memmove(marker, marker + 1, (oidp - marker) * sizeof(Id));
+ memmove(markerp, markerp + 1, (oidp - markerp) * sizeof(Id));
*oidp = id;
return olddeps;
}
- if (isreq == 2 && !marker)
- olddeps = repo_addid(repo, olddeps, SOLVABLE_PREREQMARKER);
- else if (isreq == 1 && marker)
+ /* id not yet in array */
+ if (!before && !markerp)
+ olddeps = repo_addid(repo, olddeps, marker);
+ else if (before && markerp)
{
- *marker++ = id;
+ *markerp++ = id;
id = *--oidp;
- if (marker < oidp)
- memmove(marker + 1, marker, (oidp - marker) * sizeof(Id));
- *marker = SOLVABLE_PREREQMARKER;
+ if (markerp < oidp)
+ memmove(markerp + 1, markerp, (oidp - markerp) * sizeof(Id));
+ *markerp = marker;
}
return repo_addid(repo, olddeps, id);
}
extern void repo_freeallrepos(Pool *pool, int reuseids);
extern Offset repo_addid(Repo *repo, Offset olddeps, Id id);
-extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, int isreq);
+extern Offset repo_addid_dep(Repo *repo, Offset olddeps, Id id, Id marker);
extern Offset repo_reserve_ids(Repo *repo, Offset olddeps, int num);
extern Offset repo_fix_legacy(Repo *repo, Offset provides, Offset supplements);
}
static unsigned int
-adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, int isreq)
+adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, Id marker)
{
int flags, words;
Id id, evrid;
if (words == 3)
line = sp[2], words = 2;
}
- olddeps = repo_addid_dep(pd->repo, olddeps, id, isreq);
+ olddeps = repo_addid_dep(pd->repo, olddeps, id, marker);
if (!line)
break;
}
arch. We don't know the latter here, though. */
s->arch = ARCH_NOARCH;
else if (istag ("PREREQUIRES"))
- s->requires = adddep(pool, &pd, s->requires, value, 2);
+ s->requires = adddep(pool, &pd, s->requires, value, SOLVABLE_PREREQMARKER);
else if (istag ("REQUIRES"))
- s->requires = adddep(pool, &pd, s->requires, value, 1);
+ s->requires = adddep(pool, &pd, s->requires, value, -SOLVABLE_PREREQMARKER);
else if (istag ("PROVIDES"))
s->provides = adddep(pool, &pd, s->provides, value, 0);
else if (istag ("CONFLICTS"))
static unsigned int
adddep(Pool *pool, Parsedata *pd, unsigned int olddeps, const char **atts, int isreq)
{
- Id id, name;
+ Id id, name, marker;
const char *n, *f, *k;
const char **a;
n = f = k = NULL;
+ marker = isreq ? -SOLVABLE_PREREQMARKER : 0;
/* loop over name,value pairs */
for (a = atts; *a; a += 2)
else if (!strcmp(*a, "op"))
f = a[1];
else if (isreq && !strcmp(*a, "pre") && a[1][0] == '1')
- isreq = 2;
+ marker = SOLVABLE_PREREQMARKER;
}
if (!n) /* quit if no name found */
return olddeps;
sprintf(pd->content, "%s:%s", k, n);
name = str2id(pool, pd->content, 1);
}
- else {
+ else
+ {
name = str2id(pool, n, 1); /* package: just intern <name> */
- }
+ }
if (f) /* operator ? */
{
id = name; /* no operator */
/* add new dependency to repo */
- return repo_addid_dep(pd->repo, olddeps, id, isreq);
+ return repo_addid_dep(pd->repo, olddeps, id, marker);
}
static unsigned int
adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, const char **atts, int isreq)
{
- Id id, name;
+ Id id, name, marker;
const char *n, *f, *k;
const char **a;
n = f = k = 0;
+ marker = isreq ? -SOLVABLE_PREREQMARKER : 0;
for (a = atts; *a; a += 2)
{
if (!strcmp(*a, "name"))
else if (!strcmp(*a, "kind"))
k = a[1];
else if (isreq && !strcmp(*a, "pre") && a[1][0] == '1')
- isreq = 2;
+ marker = SOLVABLE_PREREQMARKER;
}
if (!n)
return olddeps;
#if 0
fprintf(stderr, "new dep %s%s%s\n", id2str(pool, d), id2rel(pool, d), id2evr(pool, d));
#endif
- return repo_addid_dep(pd->repo, olddeps, id, isreq);
+ return repo_addid_dep(pd->repo, olddeps, id, marker);
}
static unsigned int
adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, const char **atts, int isreq)
{
- Id id, name;
+ Id id, name, marker;
const char *n, *f, *k;
const char **a;
n = f = k = 0;
+ marker = isreq ? -SOLVABLE_PREREQMARKER : 0;
for (a = atts; *a; a += 2)
{
if (!strcmp(*a, "name"))
else if (!strcmp(*a, "kind"))
k = a[1];
else if (isreq && !strcmp(*a, "pre") && a[1][0] == '1')
- isreq = 2;
+ marker = SOLVABLE_PREREQMARKER;
}
if (!n)
return olddeps;
#if 0
fprintf(stderr, "new dep %s%s%s\n", id2str(pool, d), id2rel(pool, d), id2evr(pool, d));
#endif
- return repo_addid_dep(pd->repo, olddeps, id, isreq);
+ return repo_addid_dep(pd->repo, olddeps, id, marker);
}
}
static unsigned int
-adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, int isreq, char *kind)
+adddep(Pool *pool, struct parsedata *pd, unsigned int olddeps, char *line, Id marker, char *kind)
{
int i, flags;
Id id, evrid;
}
id = rel2id(pool, id, evrid, flags + 1, 1);
}
- return repo_addid_dep(pd->repo, olddeps, id, isreq);
+ return repo_addid_dep(pd->repo, olddeps, id, marker);
}
Attrstore *attr;
s->provides = adddep(pool, &pd, s->provides, line, 0, pd.kind);
continue;
case CTAG('=', 'R', 'e', 'q'):
- s->requires = adddep(pool, &pd, s->requires, line, 1, pd.kind);
+ s->requires = adddep(pool, &pd, s->requires, line, -SOLVABLE_PREREQMARKER, pd.kind);
continue;
case CTAG('=', 'P', 'r', 'q'):
if (pd.kind)
s->requires = adddep(pool, &pd, s->requires, line, 0, 0);
else
- s->requires = adddep(pool, &pd, s->requires, line, 2, 0);
+ s->requires = adddep(pool, &pd, s->requires, line, SOLVABLE_PREREQMARKER, 0);
continue;
case CTAG('=', 'O', 'b', 's'):
s->obsoletes = adddep(pool, &pd, s->obsoletes, line, 0, pd.kind);