repo = (Repo *)sat_calloc(1, sizeof(*repo));
pool->repos = (Repo **)sat_realloc2(pool->repos, pool->nrepos + 1, sizeof(Repo *));
pool->repos[pool->nrepos++] = repo;
+ repo->repoid = pool->nrepos;
repo->name = name ? strdup(name) : 0;
repo->pool = pool;
repo->start = pool->nsolvables;
int i;
pool_freewhatprovides(pool);
+ if (repo == pool->installed)
+ pool->installed = 0;
if (reuseids && repo->end == pool->nsolvables)
{
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 *));
+ {
+ 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--;
repo_freedata(repo);
}
{
int d = repo->start - p;
b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
- memmove(b + d * size, b, n * size);
+ memmove((char*)b + d * size, b, n * size);
memset(b, 0, d * size);
n += d;
}
{
int d = p + count - repo->end;
b = sat_extend(b, n, d, size, REPO_SIDEDATA_BLOCK);
- memset(b + n * size, 0, d * size);
+ memset((char*)b + n * size, 0, d * size);
}
return b;
}
struct matchdata
{
Pool *pool;
- const char *match;
int flags;
-#if 0
- regex_t regex;
-#endif
+ Datamatcher matcher;
int stop;
int (*callback)(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv);
void *callback_data;
repo_matchvalue(void *cbdata, Solvable *s, Repodata *data, Repokey *key, KeyValue *kv)
{
struct matchdata *md = cbdata;
- int flags = md->flags;
- if ((flags & SEARCH_STRINGMASK) != 0)
+ if (md->matcher.match)
{
- switch (key->type)
- {
- case REPOKEY_TYPE_ID:
- case REPOKEY_TYPE_IDARRAY:
- if (data && data->localpool)
- kv->str = stringpool_id2str(&data->spool, kv->id);
- else
- kv->str = id2str(s->repo->pool, kv->id);
- break;
- case REPOKEY_TYPE_STR:
- break;
- default:
- return 0;
- }
- switch ((flags & SEARCH_STRINGMASK))
- {
- case SEARCH_SUBSTRING:
- if (flags & SEARCH_NOCASE)
- {
- if (!strcasestr(kv->str, md->match))
- return 0;
- }
- else
- {
- if (!strstr(kv->str, md->match))
- return 0;
- }
- break;
- case SEARCH_STRING:
- if (flags & SEARCH_NOCASE)
- {
- if (strcasecmp(md->match, kv->str))
- return 0;
- }
- else
- {
- if (strcmp(md->match, kv->str))
- return 0;
- }
- break;
- case SEARCH_GLOB:
- if (fnmatch(md->match, kv->str, (flags & SEARCH_NOCASE) ? FNM_CASEFOLD : 0))
- return 0;
- break;
-#if 0
- case SEARCH_REGEX:
- if (regexec(&md->regexp, kv->str, 0, NULL, 0))
- return 0;
-#endif
- default:
- return 0;
- }
+ if (!repodata_stringify(md->pool, data, key, kv, md->flags))
+ return 0;
+ if (!datamatcher_match(&md->matcher, kv->str))
+ return 0;
}
md->stop = md->callback(md->callback_data, s, data, key, kv);
return md->stop;
}
if (data->state == REPODATA_ERROR)
continue;
- repodata_search(data, p, keyname, repo_matchvalue, md);
+ repodata_search(data, p, keyname, md->flags, repo_matchvalue, md);
if (md->stop > SEARCH_NEXT_KEY)
break;
}
memset(&md, 0, sizeof(md));
md.pool = repo->pool;
- md.match = match;
md.flags = flags;
md.callback = callback;
md.callback_data = cbdata;
+ if (match)
+ datamatcher_init(&md.matcher, match, flags);
repo_search_md(repo, p, keyname, &md);
+ if (match)
+ datamatcher_free(&md.matcher);
}
const char *
}
for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
{
- if (entry && (entry < data->start || entry >= data->end))
+ if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
continue;
if (!repodata_precheck_keyname(data, keyname))
continue;
if (keyname == RPM_RPMDBID)
{
- if (repo->rpmdbid && entry && entry >= repo->start && entry < repo->end)
+ if (repo->rpmdbid && entry >= repo->start && entry < repo->end)
return repo->rpmdbid[entry - repo->start];
return notfound;
}
for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
{
- if (entry && (entry < data->start || entry >= data->end))
+ if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
continue;
if (!repodata_precheck_keyname(data, keyname))
continue;
}
for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
{
- if (entry && (entry < data->start || entry >= data->end))
+ if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
continue;
if (!repodata_precheck_keyname(data, keyname))
continue;
int i, j;
for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
{
- if (entry && (entry < data->start || entry >= data->end))
+ if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
continue;
if (!repodata_precheck_keyname(data, keyname))
continue;
int i, j;
for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
{
- if (entry && (entry < data->start || entry >= data->end))
+ if (entry != SOLVID_META && (entry < data->start || entry >= data->end))
continue;
if (!repodata_precheck_keyname(data, keyname))
continue;