for (i = j = 0; i < selection->count; i += 2)
{
Id select = selection->elements[i] & SOLVER_SELECTMASK;
+ Id id = selection->elements[i + 1];
if (select != SOLVER_SOLVABLE_NAME && select != SOLVER_SOLVABLE_PROVIDES)
continue; /* actually internal error */
- selection->elements[i + 1] = pool_rel2id(pool, selection->elements[i + 1], relevr, relflags, 1);
+ if (relflags == REL_ARCH && (relevr == ARCH_SRC || relevr == ARCH_NOSRC) && ISRELDEP(id))
+ {
+ Reldep *rd = GETRELDEP(pool, id);
+ if (rd->flags == REL_ARCH && rd->evr == ARCH_SRC)
+ id = rd->name;
+ }
+ selection->elements[i + 1] = pool_rel2id(pool, id, relevr, relflags, 1);
if (relflags == REL_ARCH)
selection->elements[i] |= SOLVER_SETARCH;
if (relflags == REL_EQ && select == SOLVER_SOLVABLE_NAME && selection->elements[i])
int doglob = 0;
int globflags = 0;
+ if ((flags & SELECTION_SOURCE) != 0)
+ flags &= ~SELECTION_PROVIDES; /* sources don't provide anything */
+
if (!(flags & (SELECTION_NAME|SELECTION_PROVIDES)))
return 0;
id = pool_str2id(pool, name, 0);
if (id)
{
- if ((flags & SELECTION_MAYBESRC) != 0 && (flags & SELECTION_NAME) != 0)
+ if ((flags & SELECTION_SOURCE) != 0 && (flags & SELECTION_NAME) != 0)
{
/* src rpms don't have provides, so we must check every solvable */
FOR_PROVIDES(p, pp, id) /* try fast path first */
{
if ((flags & SELECTION_INSTALLED_ONLY) != 0 && s->repo != pool->installed)
continue;
+ id = pool_rel2id(pool, id, ARCH_SRC, REL_ARCH, 1);
queue_push2(selection, SOLVER_SOLVABLE_NAME, id);
return SELECTION_NAME;
}
{
if ((flags & SELECTION_INSTALLED_ONLY) != 0 && s->repo != pool->installed)
continue; /* just in case... src rpms can't be installed */
+ id = pool_rel2id(pool, id, ARCH_SRC, REL_ARCH, 1);
queue_push2(selection, SOLVER_SOLVABLE_NAME, id);
return SELECTION_NAME;
}
match = 1;
if (s->name == id && (flags & SELECTION_NAME) != 0)
{
+ if ((flags & SELECTION_SOURCE) != 0)
+ id = pool_rel2id(pool, id, ARCH_SRC, REL_ARCH, 1);
queue_push2(selection, SOLVER_SOLVABLE_NAME, id);
return SELECTION_NAME;
}
{
Solvable *s = pool->solvables + p;
if (!pool_installable(pool, s))
- if (!(flags & SELECTION_MAYBESRC) || (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC))
+ if (!(flags & SELECTION_SOURCE) || (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC))
continue;
if ((flags & SELECTION_INSTALLED_ONLY) != 0 && s->repo != pool->installed)
continue;
id = s->name;
if ((doglob ? fnmatch(name, pool_id2str(pool, id), globflags) : strcasecmp(name, pool_id2str(pool, id))) == 0)
{
+ if ((flags & SELECTION_SOURCE) != 0)
+ id = pool_rel2id(pool, id, ARCH_SRC, REL_ARCH, 1);
+ /* queue_pushunique2 */
for (i = 0; i < selection->count; i += 2)
if (selection->elements[i] == SOLVER_SOLVABLE_NAME && selection->elements[i + 1] == id)
break;
char *rname = solv_strdup(name);
rname[r - name] = 0;
if (archid == ARCH_SRC || archid == ARCH_NOSRC)
- flags |= SELECTION_MAYBESRC;
+ flags |= SELECTION_SOURCE;
if ((ret = selection_depglob(pool, selection, rname, flags)) != 0)
{
selection_limit_rel(pool, selection, REL_ARCH, archid);
while (dataiterator_step(&di))
{
Solvable *s = pool->solvables + di.solvid;
- if (!s->repo || !pool_installable(pool, s))
+ if (!s->repo)
+ continue;
+ if (!pool_installable(pool, s))
+ if (!(flags & SELECTION_SOURCE) || (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC))
+ continue;
+ if ((flags & SELECTION_INSTALLED_ONLY) != 0 && s->repo != pool->installed)
continue;
queue_push(&q, di.solvid);
dataiterator_skip_solvable(&di);
if ((r2 = strrchr(r + 1, '.')) != 0 && r2[1] && (archid = str2archid(pool, r2 + 1)) != 0)
*r2 = 0; /* found valid arch, split it off */
if (archid == ARCH_SRC || archid == ARCH_NOSRC)
- flags |= SELECTION_MAYBESRC;
+ flags |= SELECTION_SOURCE;
/* try with just the version */
if ((ret = selection_depglob(pool, selection, rname, flags)) == 0)