}
Repo *id2repo(Id id) {
- if (id < 1 || id > $self->nrepos)
+ if (id < 1 || id >= $self->nrepos)
return 0;
return pool_id2repo($self, id);
}
%newobject __next__;
Repo *__next__() {
Pool *pool = $self->pool;
- if ($self->id >= pool->nrepos + 1)
+ if ($self->id >= pool->nrepos)
return 0;
- while (++$self->id < pool->nrepos + 1) {
+ while (++$self->id < pool->nrepos) {
Repo *r = pool_id2repo(pool, $self->id);
if (r)
return r;
#endif
Repo *__getitem__(Id key) {
Pool *pool = $self->pool;
- if (key > 0 && key < pool->nrepos + 1)
+ if (key > 0 && key < pool->nrepos)
return pool_id2repo(pool, key);
return 0;
}
int __len__() {
- return $self->pool->nrepos + 1;
+ return $self->pool->nrepos;
}
}
pool->solvables = solv_extend_resize(0, 2, sizeof(Solvable), SOLVABLE_BLOCK);
pool->nsolvables = 2;
memset(pool->solvables, 0, 2 * sizeof(Solvable));
+
+ /* initialize the system solvable */
s = pool->solvables + SYSTEMSOLVABLE;
s->name = SYSTEM_SYSTEM;
s->arch = ARCH_NOARCH;
int i;
pool_freewhatprovides(pool);
- for (i = 0; i < pool->nrepos; i++)
+ for (i = 1; i < pool->nrepos; i++)
repo_freedata(pool->repos[i]);
pool->repos = solv_free(pool->repos);
pool->nrepos = 0;
+ pool->urepos = 0;
/* the first two solvables don't belong to a repo */
pool_free_solvable_block(pool, 2, pool->nsolvables - 2, reuseids);
}
Map donemap;
int ndone, incomplete;
- if (!pool->nrepos)
+ if (!pool->urepos)
return;
cbd->nfiles = sf->nfiles;
cbd->dids = solv_realloc2(cbd->dids, sf->nfiles, sizeof(Id));
map_init(&cbd->providedids, pool->ss.nstrings);
- repoid = 0;
- repo = repoonly ? repoonly : pool->repos[0];
+ repoid = 1;
+ repo = repoonly ? repoonly : pool->repos[repoid];
map_init(&donemap, pool->nsolvables);
queue_init(&fileprovidesq);
provstart = provend = 0;
for (;;)
{
- if (repo->disabled)
+ if (!repo || repo->disabled)
{
if (repoonly || ++repoid == pool->nrepos)
break;
struct _Repo **repos;
int nrepos; /* repos allocated */
+ int urepos; /* repos in use */
struct _Repo *installed; /* packages considered installed */
for (vp = pool_whatprovides(pool, d) ; (v = pool->whatprovidesdata[vp++]) != 0; )
/* loop over all repositories */
-/* note that idx is not the repoid */
-#define FOR_REPOS(idx, r) \
- for (idx = 0; idx < pool->nrepos; idx++) \
- if ((r = pool->repos[idx]) != 0)
+#define FOR_REPOS(repoid, r) \
+ for (repoid = 1; repoid < pool->nrepos; repoid++) \
+ if ((r = pool->repos[repoid]) != 0)
#define POOL_DEBUG(type, ...) do {if ((pool->debugmask & (type)) != 0) pool_debug(pool, (type), __VA_ARGS__);} while (0)
pool_freewhatprovides(pool);
repo = (Repo *)solv_calloc(1, sizeof(*repo));
+ if (!pool->nrepos)
+ pool->nrepos = 1; /* start with repoid 1 */
pool->repos = (Repo **)solv_realloc2(pool->repos, pool->nrepos + 1, sizeof(Repo *));
- pool->repos[pool->nrepos++] = repo;
- repo->repoid = pool->nrepos;
+ pool->repos[pool->nrepos] = repo;
+ pool->urepos++;
+ repo->repoid = pool->nrepos++;
repo->name = name ? solv_strdup(name) : 0;
repo->pool = pool;
repo->start = pool->nsolvables;
if (repo == pool->installed)
pool->installed = 0;
repo_empty(repo, reuseids);
- for (i = 0; i < pool->nrepos; i++) /* find repo in pool */
+ for (i = 1; i < pool->nrepos; i++) /* find repo in pool */
if (pool->repos[i] == repo)
break;
if (i == pool->nrepos) /* repo not in pool, return */
return;
- if (i < pool->nrepos - 1)
- {
- memmove(pool->repos + i, pool->repos + i + 1, (pool->nrepos - 1 - i) * sizeof(Repo *));
- /* fix repo ids */
- for (; i < pool->nrepos - 1; i++)
- pool->repos[i]->repoid = i + 1;
- }
- pool->nrepos--;
+ if (i == pool->nrepos - 1 && reuseids)
+ pool->nrepos--;
+ else
+ pool->repos[i] = 0;
+ pool->urepos--;
repo_freedata(repo);
}
static inline Repo *pool_id2repo(Pool *pool, Id repoid)
{
- return repoid ? pool->repos[repoid - 1] : 0;
+ return repoid < pool->nrepos ? pool->repos[repoid] : 0;
}
static inline int pool_installable(const Pool *pool, Solvable *s)
di->nparents = 0;
di->rootlevel = 0;
di->repodataid = 0;
- if (!di->pool->nrepos)
+ if (!di->pool->urepos)
{
di->state = di_bye;
return;
if (!repo)
{
di->repoid = 1;
- di->repo = di->pool->repos[0];
+ di->repo = di->pool->repos[di->repoid];
}
di->state = di_enterrepo;
if (p)
switch (di->state)
{
case di_enterrepo: di_enterrepo:
- if (!di->repo)
- goto di_bye;
- if (di->repo->disabled && !(di->flags & SEARCH_DISABLED_REPOS))
+ if (!di->repo || (di->repo->disabled && !(di->flags & SEARCH_DISABLED_REPOS)))
goto di_nextrepo;
if (!(di->flags & SEARCH_THISSOLVID))
{
{
di->repoid++;
di->repodataid = 0;
- if (di->repoid - 1 < di->pool->nrepos)
+ if (di->repoid < di->pool->nrepos)
{
- di->repo = di->pool->repos[di->repoid - 1];
+ di->repo = di->pool->repos[di->repoid];
goto di_enterrepo;
}
}
}
else if (di->repoid > 0)
{
- if (!di->pool->nrepos)
+ if (!di->pool->urepos)
{
di->state = di_bye;
return;
}
di->repoid = 1;
- di->repo = di->pool->repos[0];
+ di->repo = di->pool->repos[di->repoid];
}
di->repodataid = 0;
di->solvid = solvid;
if (repo_add_solv(repo, stdin))
printf("could not read repository\n");
}
- if (!pool->nrepos)
+ if (!pool->urepos)
{
repo = repo_create(pool, argc != 1 ? argv[1] : "<stdin>");
if (repo_add_solv(repo, stdin))