More subtle errors in (up to now) untested code paths, this time dealing
authorMichael Matz <matz@suse.de>
Mon, 11 Feb 2008 10:40:58 +0000 (10:40 +0000)
committerMichael Matz <matz@suse.de>
Mon, 11 Feb 2008 10:40:58 +0000 (10:40 +0000)
with loading multiple SOLV files with attributes into one repo.

src/repo_solv.c
tools/repo_write.c

index 8fae8dc..695e5f4 100644 (file)
@@ -541,6 +541,7 @@ repo_add_solv_parent(Repo *repo, FILE *fp, Repodata *parent)
   Id *schemadata, *schemadatap, *schemadataend;
   Id *schemata, key;
   int have_xdata;
+  unsigned oldnrepodata;
 
   struct _Stringpool *spool;
 
@@ -1001,6 +1002,7 @@ repo_add_solv_parent(Repo *repo, FILE *fp, Repodata *parent)
 
 
   /*******  Part 6: Info  ***********************************************/
+  oldnrepodata = repo->nrepodata;
   for (i = 0; i < numinfo; i++)
     {
       /* for now we're just interested in data that starts with
@@ -1074,7 +1076,7 @@ repo_add_solv_parent(Repo *repo, FILE *fp, Repodata *parent)
       data.end = data.start + numsolv;
       /* In case we have subfiles, make them refer to our part of the 
         repository now.  */
-      for (i = 0; i < repo->nrepodata; i++)
+      for (i = oldnrepodata; i < repo->nrepodata; i++)
         {
          repo->repodata[i].start = data.start;
          repo->repodata[i].end = data.end;
index f44ffa3..141d783 100644 (file)
@@ -537,9 +537,9 @@ repo_write_cb_needed(void *vcbdata, Solvable *s, Repodata *data, Repokey *key, K
   int rm;
 
 #if 0
-  fprintf(stderr, "solvable %d (%s): key %d %d\n", s ? s - s->repo->pool->solvables : 0, s ? id2str(s->repo->pool, s->name) : "", key->name, key->type);
+  fprintf(stderr, "solvable %d (%s): key (%d)%s %d\n", s ? s - s->repo->pool->solvables : 0, s ? id2str(s->repo->pool, s->name) : "", key->name, id2str(repo->pool, key->name), key->type);
 #endif
-  rm = cbdata->keymap[cbdata->keymapstart[data->repo->repodata - data] + (key - data->keys)];
+  rm = cbdata->keymap[cbdata->keymapstart[data - data->repo->repodata] + (key - data->keys)];
   if (!rm)
     return SEARCH_NEXT_KEY;    /* we do not want this one */
   if (cbdata->sp == cbdata->schema || cbdata->sp[-1] != rm)
@@ -577,7 +577,7 @@ repo_write_cb_sizes(void *vcbdata, Solvable *s, Repodata *data, Repokey *key, Ke
   unsigned char v[4];
   struct extdata *xd;
 
-  rm = cbdata->keymap[cbdata->keymapstart[data->repo->repodata - data] + (key - data->keys)];
+  rm = cbdata->keymap[cbdata->keymapstart[data - data->repo->repodata] + (key - data->keys)];
   if (!rm)
     return 0;  /* we do not want this one */
   
@@ -858,7 +858,8 @@ repo_write(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void
            }
          if (k < cbdata.nmykeys)
            {
-             cbdata.keymap[n++] = 0;
+             repodataused[i] = 1;
+             cbdata.keymap[n++] = k;
              continue;
            }
          cbdata.mykeys[cbdata.nmykeys] = *key;