From: Michael Schroeder Date: Thu, 22 Dec 2011 13:00:02 +0000 (+0100) Subject: - INCOMPATIBLE CHANGE: index with repoid (thus pool->repos[repoid] == repo->repoid) X-Git-Tag: BASE-SuSE-Code-12_2-Branch~224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1a04759b6b594876286af072f25b28d3b0db4ed6;p=thirdparty%2Flibsolv.git - INCOMPATIBLE CHANGE: index with repoid (thus pool->repos[repoid] == repo->repoid) Also make repo->free not renumber the repos, instead we leave a hole (like with the solvables). --- diff --git a/bindings/solv.i b/bindings/solv.i index a5b019ae..16e60d02 100644 --- a/bindings/solv.i +++ b/bindings/solv.i @@ -981,7 +981,7 @@ typedef struct { } Repo *id2repo(Id id) { - if (id < 1 || id > $self->nrepos) + if (id < 1 || id >= $self->nrepos) return 0; return pool_id2repo($self, id); } @@ -1456,9 +1456,9 @@ typedef struct { %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; @@ -1475,12 +1475,12 @@ typedef struct { #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; } } diff --git a/src/pool.c b/src/pool.c index 9c2d7098..ebc80163 100644 --- a/src/pool.c +++ b/src/pool.c @@ -53,6 +53,8 @@ pool_create(void) 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; @@ -108,10 +110,11 @@ pool_freeallrepos(Pool *pool, int reuseids) 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); } @@ -969,7 +972,7 @@ pool_addfileprovides_search(Pool *pool, struct addfileprovides_cbdata *cbd, stru Map donemap; int ndone, incomplete; - if (!pool->nrepos) + if (!pool->urepos) return; cbd->nfiles = sf->nfiles; @@ -979,14 +982,14 @@ pool_addfileprovides_search(Pool *pool, struct addfileprovides_cbdata *cbd, stru 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; diff --git a/src/pool.h b/src/pool.h index de2f41b9..535fd698 100644 --- a/src/pool.h +++ b/src/pool.h @@ -70,6 +70,7 @@ struct _Pool { struct _Repo **repos; int nrepos; /* repos allocated */ + int urepos; /* repos in use */ struct _Repo *installed; /* packages considered installed */ @@ -323,10 +324,9 @@ void pool_add_fileconflicts_deps(Pool *pool, Queue *conflicts); 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) diff --git a/src/repo.c b/src/repo.c index f4b835b4..be9db37b 100644 --- a/src/repo.c +++ b/src/repo.c @@ -42,9 +42,12 @@ repo_create(Pool *pool, const char *name) 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; @@ -118,19 +121,16 @@ repo_free(Repo *repo, int reuseids) 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); } diff --git a/src/repo.h b/src/repo.h index 42e333c2..e96751d2 100644 --- a/src/repo.h +++ b/src/repo.h @@ -83,7 +83,7 @@ static inline const char *repo_name(const Repo *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) diff --git a/src/repodata.c b/src/repodata.c index 802730d5..c9dd25ed 100644 --- a/src/repodata.c +++ b/src/repodata.c @@ -1181,7 +1181,7 @@ dataiterator_set_search(Dataiterator *di, Repo *repo, Id p) di->nparents = 0; di->rootlevel = 0; di->repodataid = 0; - if (!di->pool->nrepos) + if (!di->pool->urepos) { di->state = di_bye; return; @@ -1189,7 +1189,7 @@ dataiterator_set_search(Dataiterator *di, Repo *repo, Id p) if (!repo) { di->repoid = 1; - di->repo = di->pool->repos[0]; + di->repo = di->pool->repos[di->repoid]; } di->state = di_enterrepo; if (p) @@ -1277,9 +1277,7 @@ dataiterator_step(Dataiterator *di) 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)) { @@ -1387,9 +1385,9 @@ dataiterator_step(Dataiterator *di) { 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; } } @@ -1691,13 +1689,13 @@ dataiterator_jump_to_solvid(Dataiterator *di, Id solvid) } 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; diff --git a/tools/dumpsolv.c b/tools/dumpsolv.c index ceabd6eb..681e98bb 100644 --- a/tools/dumpsolv.c +++ b/tools/dumpsolv.c @@ -278,7 +278,7 @@ int main(int argc, char **argv) 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] : ""); if (repo_add_solv(repo, stdin))