Imported Upstream version 0.6.27
[platform/upstream/libsolv.git] / tools / common_write.c
index 00e1c11..e20f64f 100644 (file)
@@ -6,8 +6,6 @@
  */
 
 #include <sys/types.h>
-#include <limits.h>
-#include <fcntl.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include "repo.h"
 #include "repo_write.h"
 #include "common_write.h"
+#include "solvversion.h"
 
-#define SATSOLVER_TOOLVERSION "1.0"
+/* toolversion history
+ * 1.0: initial tool version
+ * 1.1: changed PRODUCT_ENDOFLIFE parsing
+*/
 
 static Id verticals[] = {
   SOLVABLE_AUTHORS,
@@ -27,6 +29,8 @@ static Id verticals[] = {
   SOLVABLE_EULA,
   SOLVABLE_DISKUSAGE,
   SOLVABLE_FILELIST,
+  SOLVABLE_CHANGELOG_AUTHOR,
+  SOLVABLE_CHANGELOG_TEXT,
   0
 };
 
@@ -64,7 +68,7 @@ keyfilter_solv(Repo *data, Repokey *key, void *kfdata)
   for (i = 0; verticals[i]; i++)
     if (key->name == verticals[i])
       return KEY_STORAGE_VERTICAL_OFFSET;
-  keyname = id2str(data->pool, key->name);
+  keyname = pool_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;
@@ -84,7 +88,7 @@ keyfilter_attr(Repo *data, Repokey *key, void *kfdata)
   for (i = 0; verticals[i]; i++)
     if (key->name == verticals[i])
       return KEY_STORAGE_VERTICAL_OFFSET;
-  keyname = id2str(data->pool, key->name);
+  keyname = pool_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;
@@ -99,13 +103,13 @@ keyfilter_language(Repo *repo, Repokey *key, void *kfdata)
   char *lang = kfdata;
   int i;
 
-  name = id2str(repo->pool, key->name);
+  name = pool_id2str(repo->pool, key->name);
   p = strrchr(name, ':');
   if (!p || strcmp(p + 1, lang) != 0)
     return KEY_STORAGE_DROPPED;
   for (i = 0; verticals[i]; i++)
     {
-      const char *vname = id2str(pool, verticals[i]);
+      const char *vname = pool_id2str(pool, verticals[i]);
       if (!strncmp(name, vname, p - name) && vname[p - name] == 0)
        return KEY_STORAGE_VERTICAL_OFFSET;
     }
@@ -151,7 +155,7 @@ keyfilter_other(Repo *repo, Repokey *key, void *kfdata)
   if (key->name == SOLVABLE_FILELIST || key->name == SOLVABLE_DISKUSAGE)
     return KEY_STORAGE_DROPPED;
 
-  name = id2str(repo->pool, key->name);
+  name = pool_id2str(repo->pool, key->name);
   p = strrchr(name, ':');
   if (p)
     {
@@ -176,22 +180,24 @@ keyfilter_other(Repo *repo, Repokey *key, void *kfdata)
 static void
 write_info(Repo *repo, FILE *fp, int (*keyfilter)(Repo *repo, Repokey *key, void *kfdata), void *kfdata, Repodata *info, const char *location)
 {
-  Id h, *keyarray = 0;
-  int i;
+  Id h;
+  Queue keyq;
 
-  repo_write(repo, fp, keyfilter, kfdata, &keyarray);
-  h = repodata_new_handle(info);
-  if (keyarray)
+  queue_init(&keyq);
+  if (repo_write_filtered(repo, fp, keyfilter, kfdata, &keyq) != 0)
     {
-      for (i = 0; keyarray[i]; i++)
-        repodata_add_idarray(info, h, REPOSITORY_KEYS, keyarray[i]);
+      fprintf(stderr, "repo_write failed\n");
+      exit(1);
     }
-  sat_free(keyarray);
+  h = repodata_new_handle(info);
+  if (keyq.count)
+    repodata_set_idarray(info, h, REPOSITORY_KEYS, &keyq);
+  queue_free(&keyq);
   repodata_set_str(info, h, REPOSITORY_LOCATION, location);
   repodata_add_flexarray(info, SOLVID_META, REPOSITORY_EXTERNAL, h);
 }
 
-int
+void
 tool_write(Repo *repo, const char *basename, const char *attrname)
 {
   Repodata *data;
@@ -200,20 +206,20 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
   char **languages = 0;
   int nlanguages = 0;
   int i, j, k, l;
-  Id *addedfileprovides = 0;
   struct keyfilter_data kd;
+  Queue addedfileprovides;
 
   memset(&kd, 0, sizeof(kd));
   info = repo_add_repodata(repo, 0);
-  repodata_set_str(info, SOLVID_META, REPOSITORY_TOOLVERSION, SATSOLVER_TOOLVERSION);
-  pool_addfileprovides_ids(repo->pool, 0, &addedfileprovides);
-  if (addedfileprovides && *addedfileprovides)
+  repodata_set_str(info, SOLVID_META, REPOSITORY_TOOLVERSION, LIBSOLV_TOOLVERSION);
+  queue_init(&addedfileprovides);
+  pool_addfileprovides_queue(repo->pool, &addedfileprovides, 0);
+  if (addedfileprovides.count)
     {
       kd.haveaddedfileprovides = 1;
-      for (i = 0; addedfileprovides[i]; i++)
-        repodata_add_idarray(info, SOLVID_META, REPOSITORY_ADDEDFILEPROVIDES, addedfileprovides[i]);
+      repodata_set_idarray(info, SOLVID_META, REPOSITORY_ADDEDFILEPROVIDES, &addedfileprovides);
     }
-  sat_free(addedfileprovides);
+  queue_free(&addedfileprovides);
 
   pool_freeidhashes(repo->pool);       /* free some mem */
 
@@ -225,11 +231,11 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
       int has_FL = 0;
 
       /* find languages and other info */
-      for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
+      FOR_REPODATAS(repo, i, data)
        {
          for (j = 1, key = data->keys + j; j < data->nkeys; j++, key++)
            {
-             const char *keyname = id2str(repo->pool, key->name);
+             const char *keyname = pool_id2str(repo->pool, key->name);
              if (key->name == SOLVABLE_DISKUSAGE)
                has_DU = 1;
              if (key->name == SOLVABLE_FILELIST)
@@ -247,7 +253,7 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
                  break;
              if (k < nlanguages)
                continue;
-             languages = sat_realloc2(languages, nlanguages + 1, sizeof(char *));
+             languages = solv_realloc2(languages, nlanguages + 1, sizeof(char *));
              languages[nlanguages++] = strdup(keyname + l);
            }
        }
@@ -300,24 +306,35 @@ tool_write(Repo *repo, const char *basename, const char *attrname)
       kd.languages = languages;
       kd.nlanguages = nlanguages;
       repodata_internalize(info);
-      repo_write(repo, fp, keyfilter_other, &kd, 0);
-      fclose(fp);
+      if (repo_write_filtered(repo, fp, keyfilter_other, &kd, 0) != 0)
+       {
+         fprintf(stderr, "repo_write failed\n");
+         exit(1);
+       }
+      if (fclose(fp) != 0)
+       {
+         perror("fclose");
+         exit(1);
+       }
       for (i = 0; i < nlanguages; i++)
        free(languages[i]);
-      sat_free(languages);
+      solv_free(languages);
       repodata_free(info);
-      return 0;
     }
   if (attrname)
     {
+      FILE *fp;
       test_separate = 1;
-      FILE *fp = fopen(attrname, "w");
+      fp = fopen(attrname, "w");
       write_info(repo, fp, keyfilter_attr, 0, info, attrname);
       fclose(fp);
       kd.haveexternal = 1;
     }
   repodata_internalize(info);
-  repo_write(repo, stdout, keyfilter_solv, &kd, 0);
+  if (repo_write_filtered(repo, stdout, keyfilter_solv, &kd, 0) != 0)
+    {
+      fprintf(stderr, "repo_write failed\n");
+      exit(1);
+    }
   repodata_free(info);
-  return 0;
 }