add repodata_translate_id to get rid of some "implement me" assertions
authorMichael Schroeder <mls@suse.de>
Tue, 23 Apr 2013 13:49:53 +0000 (15:49 +0200)
committerMichael Schroeder <mls@suse.de>
Tue, 23 Apr 2013 13:49:53 +0000 (15:49 +0200)
ext/repo_rpmdb.c
src/libsolv.ver
src/repodata.c
src/repodata.h

index e33ad32..0c3323e 100644 (file)
@@ -1396,8 +1396,8 @@ copydir_complex(Pool *pool, Repodata *data, Repodata *fromdata, Id did, Id *cach
   Id compid = dirpool_compid(&fromdata->dirpool, did);
   if (parent)
     parent = copydir(pool, data, fromdata, parent, cache);
-  if (fromdata->localpool)
-    compid = repodata_globalize_id(fromdata, compid, 1);
+  if (data->localpool || fromdata->localpool)
+    compid = repodata_translate_id(data, fromdata, compid, 1);
   compid = dirpool_add_dir(&data->dirpool, parent, compid, 1);
   if (cache)
     {
@@ -1430,9 +1430,8 @@ solvable_copy_cb(void *vcbdata, Solvable *r, Repodata *fromdata, Repokey *key, K
     case REPOKEY_TYPE_CONSTANTID:
     case REPOKEY_TYPE_IDARRAY: /* used for triggers */
       id = kv->id;
-      if (fromdata->localpool)
-       id = repodata_globalize_id(fromdata, id, 1);
-      assert(!data->localpool);        /* implement me! */
+      if (data->localpool || fromdata->localpool)
+       id = repodata_translate_id(data, fromdata, id, 1);
       if (key->type == REPOKEY_TYPE_ID)
         repodata_set_id(data, handle, keyname, id);
       else if (key->type == REPOKEY_TYPE_CONSTANTID)
@@ -1455,13 +1454,11 @@ solvable_copy_cb(void *vcbdata, Solvable *r, Repodata *fromdata, Repokey *key, K
     case REPOKEY_TYPE_DIRNUMNUMARRAY:
       id = kv->id;
       id = copydir(pool, data, fromdata, id, cbdata->dircache);
-      assert(!data->localpool);        /* implement me! */
       repodata_add_dirnumnum(data, handle, keyname, id, kv->num, kv->num2);
       break;
     case REPOKEY_TYPE_DIRSTRARRAY:
       id = kv->id;
       id = copydir(pool, data, fromdata, id, cbdata->dircache);
-      assert(!data->localpool);        /* implement me! */
       repodata_add_dirstr(data, handle, keyname, id, kv->str);
       break;
     case REPOKEY_TYPE_FLEXARRAY:
index ffeb498..e17bb7e 100644 (file)
@@ -227,6 +227,7 @@ SOLV_1.0 {
                repodata_str2dir;
                repodata_stringify;
                repodata_swap_attrs;
+               repodata_translate_id;
                repodata_unset;
                repodata_unset_uninternalized;
                repodata_write;
index 2462c10..c150e6f 100644 (file)
@@ -782,6 +782,23 @@ repodata_localize_id(Repodata *data, Id id, int create)
 }
 
 Id
+repodata_translate_id(Repodata *data, Repodata *fromdata, Id id, int create)
+{
+  if (!id || !data || !fromdata)
+    return id;
+  if (!data->localpool || !fromdata->localpool)
+    {
+      if (fromdata->localpool)
+       id = repodata_globalize_id(fromdata, id, create);
+      if (data->localpool)
+       id = repodata_localize_id(data, id, create);
+      return id;
+    }
+  /* localpool is set in both data and fromdata */
+  return stringpool_str2id(&data->spool, stringpool_id2str(&fromdata->spool, id), create);
+}
+
+Id
 repodata_lookup_id_uninternalized(Repodata *data, Id solvid, Id keyname, Id voidid)
 {
   Id *ap;
index 2b45886..029a7f9 100644 (file)
@@ -289,6 +289,8 @@ void repodata_disable_paging(Repodata *data);
 /* helper functions */
 Id repodata_globalize_id(Repodata *data, Id id, int create);
 Id repodata_localize_id(Repodata *data, Id id, int create);
+Id repodata_translate_id(Repodata *data, Repodata *fromdata, Id id, int create);
+
 Id repodata_str2dir(Repodata *data, const char *dir, int create);
 const char *repodata_dir2str(Repodata *data, Id did, const char *suf);
 const char *repodata_chk2str(Repodata *data, Id type, const unsigned char *buf);