X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=inline;f=tools%2Fcommon_write.c;h=e20f64f279f1c5804b03c3fd5d5e1ccfc3678810;hb=97330b5a608c2213fdf3f49bfbaa268bf9627920;hp=00e1c11688675642f456aefc3524bbdb1bdec0cc;hpb=5d0a993646ad70ecc97610f9b9227c75e2b99516;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/common_write.c b/tools/common_write.c index 00e1c11..e20f64f 100644 --- a/tools/common_write.c +++ b/tools/common_write.c @@ -6,8 +6,6 @@ */ #include -#include -#include #include #include #include @@ -16,8 +14,12 @@ #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; }