- add rpmdbcookie support
[platform/upstream/libsolv.git] / tools / common_write.c
index 747388a..884b417 100644 (file)
@@ -33,6 +33,7 @@ static char *languagetags[] = {
   "solvable:description:",
   "solvable:messageins:",
   "solvable:messagedel:",
+  "solvable:eula:",
   0
 };
 
@@ -42,11 +43,16 @@ static int
 keyfilter_solv(Repo *data, Repokey *key, void *kfdata)
 {
   int i;
+  const char *keyname;
   if (test_separate && key->storage != KEY_STORAGE_SOLVABLE)
     return KEY_STORAGE_DROPPED;
   for (i = 0; verticals[i]; i++)
     if (key->name == verticals[i])
       return KEY_STORAGE_VERTICAL_OFFSET;
+  keyname = id2str(data->pool, key->name);
+  for (i = 0; languagetags[i] != 0; i++)
+    if (!strncmp(keyname, languagetags[i], strlen(languagetags[i])))
+      return KEY_STORAGE_VERTICAL_OFFSET;
   return KEY_STORAGE_INCORE;
 }
 
@@ -54,11 +60,16 @@ static int
 keyfilter_attr(Repo *data, Repokey *key, void *kfdata)
 {
   int i;
+  const char *keyname;
   if (key->storage == KEY_STORAGE_SOLVABLE)
     return KEY_STORAGE_DROPPED;
   for (i = 0; verticals[i]; i++)
     if (key->name == verticals[i])
       return KEY_STORAGE_VERTICAL_OFFSET;
+  keyname = id2str(data->pool, key->name);
+  for (i = 0; languagetags[i] != 0; i++)
+    if (!strncmp(keyname, languagetags[i], strlen(languagetags[i])))
+      return KEY_STORAGE_VERTICAL_OFFSET;
   return KEY_STORAGE_INCORE;
 }
 
@@ -143,6 +154,8 @@ keyfilter_other(Repo *repo, Repokey *key, void *kfdata)
  * If <basename> is given, split attributes
  */
 
+#define REPODATAFILE_BLOCK 15
+
 int
 tool_write(Repo *repo, const char *basename, const char *attrname)
 {
@@ -154,6 +167,13 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
   int nlanguages = 0;
   int i, j, k, l;
 
+  fileinfos = sat_zextend(fileinfos, nfileinfos, 1, sizeof(Repodatafile), REPODATAFILE_BLOCK);
+  pool_addfileprovides_ids(repo->pool, 0, &fileinfos[nfileinfos].addedfileprovides);
+  if (repo->rpmdbcookie)
+    fileinfos[nfileinfos].rpmdbcookie = repo->rpmdbcookie;
+  if (fileinfos[nfileinfos].addedfileprovides || fileinfos[nfileinfos].rpmdbcookie)
+    nfileinfos++;
+
   if (basename)
     {
       struct keyfilter_other_data kd;
@@ -189,7 +209,7 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
              languages[nlanguages++] = strdup(keyname + l);
            }
        }
-      fileinfos = sat_calloc(nlanguages + 2, sizeof(Repodatafile));
+      fileinfos = sat_zextend(fileinfos, nfileinfos, nlanguages + 2, sizeof(Repodatafile), REPODATAFILE_BLOCK);
       /* write language subfiles */
       for (i = 0; i < nlanguages; i++)
         {
@@ -200,8 +220,9 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
              exit(1);
            }
           repo_write(repo, fp, keyfilter_language, languages[i], fileinfos + nfileinfos, 0);
-         fileinfos[nfileinfos++].location = strdup(fn);
+         fileinfos[nfileinfos].location = strdup(fn);
          fclose(fp);
+         nfileinfos++;
         }
       /* write DU subfile */
       if (has_DU)
@@ -213,8 +234,9 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
              exit(1);
            }
          repo_write(repo, fp, keyfilter_DU, 0, fileinfos + nfileinfos, 0);
-         fileinfos[nfileinfos++].location = strdup(fn);
+         fileinfos[nfileinfos].location = strdup(fn);
          fclose(fp);
+         nfileinfos++;
        }
       /* write filelist */
       if (has_FL)
@@ -226,8 +248,9 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
              exit(1);
            }
          repo_write(repo, fp, keyfilter_FL, 0, fileinfos + nfileinfos, 0);
-         fileinfos[nfileinfos++].location = strdup(fn);
+         fileinfos[nfileinfos].location = strdup(fn);
          fclose(fp);
+         nfileinfos++;
        }
       /* write everything else */
       sprintf(fn, "%s.solv", basename);
@@ -238,13 +261,14 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
        }
       kd.languages = languages;
       kd.nlanguages = nlanguages;
-      repo_write(repo, fp, keyfilter_other, &kd, fileinfos, nfileinfos);
+      repo_write(repo, fp, keyfilter_other, &kd, nfileinfos ? fileinfos : 0, nfileinfos);
       fclose(fp);
       for (i = 0; i < nlanguages; i++)
        free(languages[i]);
       sat_free(languages);
       for (i = 0; i < nfileinfos; i++)
        {
+         sat_free(fileinfos[i].addedfileprovides);
          sat_free(fileinfos[i].location);
          sat_free(fileinfos[i].keys);
        }
@@ -253,19 +277,21 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
     }
   if (attrname)
     {
-      fileinfos = sat_calloc(1, sizeof(Repodatafile));
+      fileinfos = sat_zextend(fileinfos, nfileinfos, 1, sizeof(Repodatafile), REPODATAFILE_BLOCK);
       test_separate = 1;
       FILE *fp = fopen (attrname, "w");
-      repo_write(repo, fp, keyfilter_attr, 0, fileinfos + nfileinfos++, 0);
-      fileinfos[nfileinfos - 1].location = strdup(attrname);
+      repo_write(repo, fp, keyfilter_attr, 0, fileinfos + nfileinfos, 0);
+      fileinfos[nfileinfos].location = strdup(attrname);
       fclose(fp);
+      nfileinfos++;
     }
-  repo_write(repo, stdout, keyfilter_solv, 0, fileinfos, nfileinfos);
-  if (fileinfos)
+  repo_write(repo, stdout, keyfilter_solv, 0, nfileinfos ? fileinfos : 0, nfileinfos);
+  for (i = 0; i < nfileinfos; i++)
     {
-      free(fileinfos[0].location);
-      free(fileinfos[0].keys);
-      free(fileinfos);
+      sat_free(fileinfos[i].addedfileprovides);
+      sat_free(fileinfos[i].location);
+      sat_free(fileinfos[i].keys);
     }
+  sat_free(fileinfos);
   return 0;
 }