X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=tools%2Fcommon_write.c;h=e20f64f279f1c5804b03c3fd5d5e1ccfc3678810;hb=c948f862b552adbe2cdee24096357b887dfbb088;hp=bb4bd197668d17e17cce2d6e028b94d66cf0a97d;hpb=b4385f9ff9404d65d5bf57c35e2a24488c41b436;p=platform%2Fupstream%2Flibsolv.git diff --git a/tools/common_write.c b/tools/common_write.c index bb4bd19..e20f64f 100644 --- a/tools/common_write.c +++ b/tools/common_write.c @@ -6,8 +6,6 @@ */ #include -#include -#include #include #include #include @@ -16,6 +14,12 @@ #include "repo.h" #include "repo_write.h" #include "common_write.h" +#include "solvversion.h" + +/* toolversion history + * 1.0: initial tool version + * 1.1: changed PRODUCT_ENDOFLIFE parsing +*/ static Id verticals[] = { SOLVABLE_AUTHORS, @@ -25,6 +29,8 @@ static Id verticals[] = { SOLVABLE_EULA, SOLVABLE_DISKUSAGE, SOLVABLE_FILELIST, + SOLVABLE_CHANGELOG_AUTHOR, + SOLVABLE_CHANGELOG_TEXT, 0 }; @@ -62,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; @@ -76,13 +82,13 @@ keyfilter_attr(Repo *data, Repokey *key, void *kfdata) const char *keyname; if (key->storage == KEY_STORAGE_SOLVABLE) return KEY_STORAGE_DROPPED; - /* those two must only be in the main solv file */ - if (key->name == REPOSITORY_EXTERNAL || key->name == REPOSITORY_ADDEDFILEPROVIDES) + /* those must only be in the main solv file */ + if (key->name == REPOSITORY_EXTERNAL || key->name == REPOSITORY_ADDEDFILEPROVIDES || key->name == REPOSITORY_TOOLVERSION) 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); + 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; @@ -92,22 +98,21 @@ keyfilter_attr(Repo *data, Repokey *key, void *kfdata) static int keyfilter_language(Repo *repo, Repokey *key, void *kfdata) { + Pool *pool = repo->pool; const char *name, *p; - char *lang = kfdata, *bname; + char *lang = kfdata; int i; - Id id; - 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; - /* find base name id */ - bname = strdup(name); - bname[p - name] = 0; - id = str2id(repo->pool, bname, 1); for (i = 0; verticals[i]; i++) - if (id == verticals[i]) - return KEY_STORAGE_VERTICAL_OFFSET; + { + const char *vname = pool_id2str(pool, verticals[i]); + if (!strncmp(name, vname, p - name) && vname[p - name] == 0) + return KEY_STORAGE_VERTICAL_OFFSET; + } return KEY_STORAGE_INCORE; } @@ -150,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) { @@ -175,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; @@ -199,19 +206,22 @@ 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); - 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 */ if (basename) { @@ -221,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) @@ -243,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); } } @@ -296,26 +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); - repo->nrepodata--; - 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); - repo->nrepodata--; - return 0; }