void repo_empty(Repo *repo, int reuseids) { Pool *pool = repo->pool; Solvable *s; int i; pool_freewhatprovides(pool); if (reuseids && repo->end == pool->nsolvables) { /* it's ok to reuse the ids. As this is the last repo, we can just shrink the solvable array */ for (i = repo->end - 1, s = pool->solvables + i; i >= repo->start; i--, s--) if (s->repo != repo) break; pool_free_solvable_block(pool, i + 1, repo->end - (i + 1), reuseids); } /* zero out (i.e. free) solvables belonging to this repo */ for (i = repo->start, s = pool->solvables + i; i < repo->end; i++, s++) if (s->repo == repo) memset(s, 0, sizeof(*s)); repo->nsolvables = 0; /* free all data belonging to this repo */ repo->idarraydata = solv_free(repo->idarraydata); repo->idarraysize = 0; repo->lastoff = 0; repo->rpmdbid = solv_free(repo->rpmdbid); for (i = 1; i < repo->nrepodata; i++) repodata_freedata(repo->repodata + i); solv_free(repo->repodata); repo->repodata = 0; repo->nrepodata = 0; }
Repo * repo_create(Pool *pool, const char *name) { Repo *repo; pool_freewhatprovides(pool); repo = (Repo *)solv_calloc(1, sizeof(*repo)); if (!pool->nrepos) { pool->nrepos = 1; /* start with repoid 1 */ pool->repos = (Repo **)solv_calloc(2, sizeof(Repo *)); } else pool->repos = (Repo **)solv_realloc2(pool->repos, pool->nrepos + 1, sizeof(Repo *)); 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; repo->end = pool->nsolvables; repo->nsolvables = 0; return repo; }
void pool_addfileprovides_queue(Pool *pool, Queue *idq, Queue *idqinst) { Solvable *s; Repo *installed, *repo; struct searchfiles sf, isf, *isfp; struct addfileprovides_cbdata cbd; int i; unsigned int now; installed = pool->installed; now = solv_timems(0); memset(&cbd, 0, sizeof(cbd)); memset(&sf, 0, sizeof(sf)); map_init(&sf.seen, pool->ss.nstrings + pool->nrels); memset(&isf, 0, sizeof(isf)); map_init(&isf.seen, pool->ss.nstrings + pool->nrels); pool->addedfileprovides = pool->addfileprovidesfiltered ? 1 : 2; if (idq) queue_empty(idq); if (idqinst) queue_empty(idqinst); isfp = installed ? &isf : 0; for (i = 1, s = pool->solvables + i; i < pool->nsolvables; i++, s++) { repo = s->repo; if (!repo) continue; if (s->obsoletes) pool_addfileprovides_dep(pool, repo->idarraydata + s->obsoletes, &sf, isfp); if (s->conflicts) pool_addfileprovides_dep(pool, repo->idarraydata + s->conflicts, &sf, isfp); if (s->requires) pool_addfileprovides_dep(pool, repo->idarraydata + s->requires, &sf, isfp); if (s->recommends) pool_addfileprovides_dep(pool, repo->idarraydata + s->recommends, &sf, isfp); if (s->suggests) pool_addfileprovides_dep(pool, repo->idarraydata + s->suggests, &sf, isfp); if (s->supplements) pool_addfileprovides_dep(pool, repo->idarraydata + s->supplements, &sf, isfp); if (s->enhances) pool_addfileprovides_dep(pool, repo->idarraydata + s->enhances, &sf, isfp); } map_free(&sf.seen); map_free(&isf.seen); POOL_DEBUG(SOLV_DEBUG_STATS, "found %d file dependencies, %d installed file dependencies\n", sf.nfiles, isf.nfiles); if (sf.nfiles) { #if 0 for (i = 0; i < sf.nfiles; i++) POOL_DEBUG(SOLV_DEBUG_STATS, "looking up %s in filelist\n", pool_id2str(pool, sf.ids[i])); #endif FOR_REPOS(i, repo) repo_addfileprovides_search(repo, &cbd, &sf); if (idq) queue_insertn(idq, idq->count, sf.nfiles, sf.ids); if (idqinst) queue_insertn(idqinst, idqinst->count, sf.nfiles, sf.ids); solv_free(sf.ids); } if (isf.nfiles) { #if 0 for (i = 0; i < isf.nfiles; i++) POOL_DEBUG(SOLV_DEBUG_STATS, "looking up %s in installed filelist\n", pool_id2str(pool, isf.ids[i])); #endif if (installed) repo_addfileprovides_search(installed, &cbd, &isf); if (installed && idqinst) for (i = 0; i < isf.nfiles; i++) queue_pushunique(idqinst, isf.ids[i]); solv_free(isf.ids); } free_dirs_names_array(&cbd); solv_free(cbd.dids); pool_freewhatprovides(pool); /* as we have added provides */ POOL_DEBUG(SOLV_DEBUG_STATS, "addfileprovides took %d ms\n", solv_timems(now)); }