]> git.ipfire.org Git - thirdparty/libsolv.git/commitdiff
Implement the REPOWRITER_KEEP_TYPE_DELETED flag
authorMichael Schroeder <mls@suse.de>
Wed, 19 Sep 2018 11:18:42 +0000 (13:18 +0200)
committerMichael Schroeder <mls@suse.de>
Wed, 19 Sep 2018 11:18:42 +0000 (13:18 +0200)
src/dataiterator.h
src/repo.c
src/repo_write.c
src/repodata.c

index a6f2b028895259e88092dbc9086efd42e7103fe6..95877f3a4b2c7d3e88691ecc0e391b483a474399 100644 (file)
@@ -52,7 +52,7 @@ typedef struct _KeyValue {
 #define SEARCH_SUB                     (1<<9)
 #define SEARCH_ARRAYSENTINEL           (1<<10)
 #define SEARCH_DISABLED_REPOS          (1<<11)
-#define SEARCH_COMPLETE_FILELIST       (1<<12)         /* ignored, this is the default */
+#define SEARCH_KEEP_TYPE_DELETED       (1<<12)         /* only has effect if no keyname is given */
 
 /* stringification flags */
 #define SEARCH_SKIP_KIND               (1<<16)
@@ -65,6 +65,9 @@ typedef struct _KeyValue {
 /* dataiterator internal */
 #define SEARCH_THISSOLVID              (1<<31)
 
+/* obsolete */
+#define SEARCH_COMPLETE_FILELIST       0               /* ignored, this is the default */
+
 /*
  * Datamatcher: match a string against a query
  */
index 30acb43b4c9f38d8f1827c6ddc4ef16e9ce2e86f..f0c11ab1efd3649312c9b0957be7c939ebfa9bf3 100644 (file)
@@ -1048,7 +1048,6 @@ repo_create_keyskip(Repo *repo, Id entry, Id **oldkeyskip)
       last = data;
       cnt++;
     }
-printf("repo_create_keyskip: cnt %d\n", cnt);
   if (cnt <= 1)
     {
       if (oldkeyskip)
index 6b1dc06f399961d28444f51517463057fd37b43b..9de1646bca7fc266428fad9b2c384f441fa57cc7 100644 (file)
@@ -1176,6 +1176,7 @@ repowriter_write(Repowriter *writer, FILE *fp)
   unsigned int solv_flags;
   Id *oldkeyskip = 0;
   Id *keyskip = 0;
+  int searchflags = 0;
 
   Id id, *sp;
 
@@ -1496,6 +1497,10 @@ for (i = 1; i < target.nkeys; i++)
 
 /********************************************************************/
 
+  searchflags = SEARCH_SUB|SEARCH_ARRAYSENTINEL;
+  if ((writer->flags & REPOWRITER_KEEP_TYPE_DELETED) != 0)
+    searchflags |= SEARCH_KEEP_TYPE_DELETED;
+
   /* set needed count of all strings and rels,
    * find which keys are used in the solvables
    * put all strings in own spool
@@ -1523,7 +1528,7 @@ for (i = 1; i < target.nkeys; i++)
        continue;
       cbdata.keymap = keymap + keymapstart[j];
       cbdata.lastdirid = 0;            /* clear dir mapping cache */
-      repodata_search_keyskip(data, SOLVID_META, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_needed_cb, &cbdata);
+      repodata_search_keyskip(data, SOLVID_META, 0, searchflags, keyskip, collect_needed_cb, &cbdata);
     }
   needid = cbdata.needid;              /* maybe relocated */
   sp = cbdata.sp;
@@ -1560,7 +1565,7 @@ for (i = 1; i < target.nkeys; i++)
                continue;
              cbdata.keymap = keymap + keymapstart[j];
              cbdata.lastdirid = 0;
-             repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_needed_cb, &cbdata);
+             repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_needed_cb, &cbdata);
            }
          needid = cbdata.needid;               /* maybe relocated */
        }
@@ -1795,7 +1800,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
        continue;
       cbdata.keymap = keymap + keymapstart[j];
       cbdata.lastdirid = 0;
-      repodata_search_keyskip(data, SOLVID_META, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata);
+      repodata_search_keyskip(data, SOLVID_META, 0, searchflags, keyskip, collect_data_cb, &cbdata);
     }
 
   if (xd->len - cbdata.lastlen > cbdata.maxdata)
@@ -1835,7 +1840,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
                    continue;
                  cbdata.keymap = keymap + keymapstart[j];
                  cbdata.lastdirid = 0;
-                 repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata);
+                 repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_data_cb, &cbdata);
                }
            }
          if (xd->len - cbdata.lastlen > cbdata.maxdata)
@@ -2009,7 +2014,7 @@ fprintf(stderr, "dir %d used %d\n", i, cbdata.dirused ? cbdata.dirused[i] : 1);
                    continue;
                  cbdata.keymap = keymap + keymapstart[j];
                  cbdata.lastdirid = 0;
-                 repodata_search_keyskip(data, i, 0, SEARCH_SUB|SEARCH_ARRAYSENTINEL, keyskip, collect_data_cb, &cbdata);
+                 repodata_search_keyskip(data, i, 0, searchflags, keyskip, collect_data_cb, &cbdata);
                }
              if (xd->len > 1024 * 1024)
                {
index 9c65776d4f2cb5d71dd5e643daa0770973ed07bc..52d68ba258eefd4afcfe723fb46ed644fe259f37 100644 (file)
@@ -1188,7 +1188,7 @@ repodata_search_keyskip(Repodata *data, Id solvid, Id keyname, int flags, Id *ke
            return;
          continue;
        }
-      if (key->type == REPOKEY_TYPE_DELETED)
+      if (key->type == REPOKEY_TYPE_DELETED && !(flags & SEARCH_KEEP_TYPE_DELETED))
        {
          if (onekey)
            return;
@@ -1712,7 +1712,7 @@ dataiterator_step(Dataiterator *di)
            goto di_nextkey;
          if (di->keyskip && (di->key->name >= di->keyskip[0] || di->keyskip[3 + di->key->name] != di->keyskip[1] + di->data->repodataid))
            goto di_nextkey;
-          if (di->key->type == REPOKEY_TYPE_DELETED)
+          if (di->key->type == REPOKEY_TYPE_DELETED && !(di->flags & SEARCH_KEEP_TYPE_DELETED))
            goto di_nextkey;
          if (di->key->type == REPOKEY_TYPE_FIXARRAY || di->key->type == REPOKEY_TYPE_FLEXARRAY)
            goto di_enterarray;
@@ -2954,7 +2954,6 @@ repodata_unset_uninternalized(Repodata *data, Id solvid, Id keyname)
   *pp = 0;
 }
 
-/* XXX: does not work correctly, needs fix in iterators! */
 void
 repodata_unset(Repodata *data, Id solvid, Id keyname)
 {