fclose(fp);
if (!cinfo->baseurl)
return 0;
- if (!chksumtype && mlchksumtype)
+ if (!chksumtype && mlchksumtype && !strcmp(file, "repodata/repomd.xml"))
{
chksumtype = mlchksumtype;
chksum = mlchksum;
snprintf(url, sizeof(url), "%s/%s", baseurl, file);
}
fd = opentmpfile();
+ // printf("url: %s\n", url);
if ((pid = fork()) == (pid_t)-1)
{
perror("fork");
{
/* main repo */
repo_empty(repo, 1);
- if (repo_add_solv(repo, fp))
+ if (repo_add_solv_flags(repo, fp, SOLV_ADD_NO_STUBS))
{
/* oops, no way to recover from here */
fprintf(stderr, "internal error\n");
printf(" loading]\n"); fflush(stdout);
filename = repodata_lookup_str(data, SOLVID_META, REPOSITORY_REPOMD_LOCATION);
filechksumtype = 0;
- filechksum = repodata_lookup_bin_checksum(data, SOLVID_META, SUSETAGS_FILE_CHECKSUM, &filechksumtype);
+ filechksum = repodata_lookup_bin_checksum(data, SOLVID_META, REPOSITORY_REPOMD_CHECKSUM, &filechksumtype);
if ((fp = curlfopen(cinfo, filename, iscompressed(filename), filechksum, filechksumtype, 0)) == 0)
return 0;
if (!strcmp(ext, "FL"))
repodata_internalize(data);
if (!badchecksum)
writecachedrepo(repo, data, 0, cinfo->cookie);
- repodata_create_stubs(data);
+ repodata_create_stubs(repo_last_repodata(repo));
break;
case TYPE_SUSETAGS:
repodata_internalize(data);
if (!badchecksum)
writecachedrepo(repo, data, 0, cinfo->cookie);
- repodata_create_stubs(data);
+ repodata_create_stubs(repo_last_repodata(repo));
break;
default:
printf("unsupported repo '%s': skipped\n", cinfo->alias);
}
/* create stub repodata entries for all external */
- for (key = 1 ; key < data.nkeys; key++)
- if (data.keys[key].name == REPOSITORY_EXTERNAL && data.keys[key].type == REPOKEY_TYPE_FLEXARRAY)
- break;
- if (key < data.nkeys && !parent)
- repodata_create_stubs(&data);
+ if (!(flags & SOLV_ADD_NO_STUBS) && !parent)
+ {
+ for (key = 1 ; key < data.nkeys; key++)
+ if (data.keys[key].name == REPOSITORY_EXTERNAL && data.keys[key].type == REPOKEY_TYPE_FLEXARRAY)
+ break;
+ if (key < data.nkeys)
+ repodata_create_stubs(repo->repodata + (repo->nrepodata - 1));
+ }
POOL_DEBUG(SAT_DEBUG_STATS, "repo_add_solv took %d ms\n", sat_timems(now));
POOL_DEBUG(SAT_DEBUG_STATS, "repo size: %d solvables\n", repo->nsolvables);
extern int repo_add_solv(Repo *repo, FILE *fp);
extern int repo_add_solv_flags(Repo *repo, FILE *fp, int flags);
+#define SOLV_ADD_NO_STUBS (1 << 8)
+
#ifdef __cplusplus
}
#endif
Dataiterator di;
Id xkeyname = 0;
int i, cnt = 0;
+ int repodataid;
+ int datastart, dataend;
+ repodataid = data - repo->repodata;
+ datastart = data->start;
+ dataend = data->end;
dataiterator_init(&di, pool, repo, SOLVID_META, REPOSITORY_EXTERNAL, 0, 0);
while (dataiterator_step(&di))
- cnt++;
+ {
+ if (di.data - repo->repodata != repodataid)
+ continue;
+ cnt++;
+ }
dataiterator_free(&di);
if (!cnt)
return;
for (i = 0; i < cnt; i++)
{
sdata = repo_add_repodata(repo, 0);
- if (data->end > data->start)
- {
- repodata_extend(sdata, data->start);
- repodata_extend(sdata, data->end - 1);
- }
+ if (dataend > datastart)
+ repodata_extend_block(sdata, datastart, dataend - datastart);
stubdataids[i] = sdata - repo->repodata;
sdata->state = REPODATA_STUB;
sdata->loadcallback = repodata_load_stub;
sdata = 0;
while (dataiterator_step(&di))
{
+ if (di.data - repo->repodata != repodataid)
+ continue;
if (di.key->name == REPOSITORY_EXTERNAL && !di.nparents)
{
dataiterator_entersub(&di);
case REPOKEY_TYPE_MD5:
case REPOKEY_TYPE_SHA1:
case REPOKEY_TYPE_SHA256:
- repodata_set_checksum(sdata, SOLVID_META, di.key->name, di.key->type, di.kv.str);
+ repodata_set_bin_checksum(sdata, SOLVID_META, di.key->name, di.key->type, (const unsigned char *)di.kv.str);
break;
case REPOKEY_TYPE_IDARRAY:
repodata_add_idarray(sdata, SOLVID_META, di.key->name, di.kv.id);