2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
17 #include "repo_write.h"
18 #include "common_write.h"
20 static Id verticals[] = {
31 static char *languagetags[] = {
33 "solvable:description:",
34 "solvable:messageins:",
35 "solvable:messagedel:",
40 static int test_separate = 0;
43 keyfilter_solv(Repo *data, Repokey *key, void *kfdata)
47 if (test_separate && key->storage != KEY_STORAGE_SOLVABLE)
48 return KEY_STORAGE_DROPPED;
49 for (i = 0; verticals[i]; i++)
50 if (key->name == verticals[i])
51 return KEY_STORAGE_VERTICAL_OFFSET;
52 keyname = id2str(data->pool, key->name);
53 for (i = 0; languagetags[i] != 0; i++)
54 if (!strncmp(keyname, languagetags[i], strlen(languagetags[i])))
55 return KEY_STORAGE_VERTICAL_OFFSET;
56 return KEY_STORAGE_INCORE;
60 keyfilter_attr(Repo *data, Repokey *key, void *kfdata)
64 if (key->storage == KEY_STORAGE_SOLVABLE)
65 return KEY_STORAGE_DROPPED;
66 for (i = 0; verticals[i]; i++)
67 if (key->name == verticals[i])
68 return KEY_STORAGE_VERTICAL_OFFSET;
69 keyname = id2str(data->pool, key->name);
70 for (i = 0; languagetags[i] != 0; i++)
71 if (!strncmp(keyname, languagetags[i], strlen(languagetags[i])))
72 return KEY_STORAGE_VERTICAL_OFFSET;
73 return KEY_STORAGE_INCORE;
77 keyfilter_language(Repo *repo, Repokey *key, void *kfdata)
80 char *lang = kfdata, *bname;
84 name = id2str(repo->pool, key->name);
85 p = strrchr(name, ':');
86 if (!p || strcmp(p + 1, lang) != 0)
87 return KEY_STORAGE_DROPPED;
88 /* find base name id */
91 id = str2id(repo->pool, bname, 1);
92 for (i = 0; verticals[i]; i++)
93 if (id == verticals[i])
94 return KEY_STORAGE_VERTICAL_OFFSET;
95 return KEY_STORAGE_INCORE;
99 keyfilter_DU(Repo *repo, Repokey *key, void *kfdata)
102 if (key->name != SOLVABLE_DISKUSAGE)
103 return KEY_STORAGE_DROPPED;
104 for (i = 0; verticals[i]; i++)
105 if (key->name == verticals[i])
106 return KEY_STORAGE_VERTICAL_OFFSET;
107 return KEY_STORAGE_INCORE;
111 keyfilter_FL(Repo *repo, Repokey *key, void *kfdata)
114 if (key->name != SOLVABLE_FILELIST)
115 return KEY_STORAGE_DROPPED;
116 for (i = 0; verticals[i]; i++)
117 if (key->name == verticals[i])
118 return KEY_STORAGE_VERTICAL_OFFSET;
119 return KEY_STORAGE_INCORE;
122 struct keyfilter_other_data {
128 keyfilter_other(Repo *repo, Repokey *key, void *kfdata)
130 const char *name, *p;
131 struct keyfilter_other_data *kd = kfdata;
134 if (key->name == SOLVABLE_FILELIST || key->name == SOLVABLE_DISKUSAGE)
135 return KEY_STORAGE_DROPPED;
137 name = id2str(repo->pool, key->name);
138 p = strrchr(name, ':');
141 for (i = 0; i < kd->nlanguages; i++)
142 if (!strcmp(p + 1, kd->languages[i]))
143 return KEY_STORAGE_DROPPED;
145 for (i = 0; verticals[i]; i++)
146 if (key->name == verticals[i])
147 return KEY_STORAGE_VERTICAL_OFFSET;
148 return KEY_STORAGE_INCORE;
152 * Write <repo> to stdout
153 * If <attrname> is given, write attributes to <attrname>
154 * If <basename> is given, split attributes
157 #define REPODATAFILE_BLOCK 15
160 tool_write(Repo *repo, const char *basename, const char *attrname)
164 Repodatafile *fileinfos = 0;
166 char **languages = 0;
170 fileinfos = sat_zextend(fileinfos, nfileinfos, 1, sizeof(Repodatafile), REPODATAFILE_BLOCK);
171 pool_addfileprovides_ids(repo->pool, 0, &fileinfos[nfileinfos].addedfileprovides);
172 if (fileinfos[nfileinfos].addedfileprovides)
177 struct keyfilter_other_data kd;
183 /* find languages and other info */
184 for (i = 0, data = repo->repodata; i < repo->nrepodata; i++, data++)
186 for (j = 1, key = data->keys + j; j < data->nkeys; j++, key++)
188 const char *keyname = id2str(repo->pool, key->name);
189 if (key->name == SOLVABLE_DISKUSAGE)
191 if (key->name == SOLVABLE_FILELIST)
193 for (k = 0; languagetags[k] != 0; k++)
194 if (!strncmp(keyname, languagetags[k], strlen(languagetags[k])))
196 if (!languagetags[k])
198 l = strlen(languagetags[k]);
199 if (strlen(keyname + l) > 5)
201 for (k = 0; k < nlanguages; k++)
202 if (!strcmp(languages[k], keyname + l))
206 languages = sat_realloc2(languages, nlanguages + 1, sizeof(char *));
207 languages[nlanguages++] = strdup(keyname + l);
210 fileinfos = sat_zextend(fileinfos, nfileinfos, nlanguages + 2, sizeof(Repodatafile), REPODATAFILE_BLOCK);
211 /* write language subfiles */
212 for (i = 0; i < nlanguages; i++)
214 sprintf(fn, "%s.%s.solv", basename, languages[i]);
215 if (!(fp = fopen(fn, "w")))
220 repo_write(repo, fp, keyfilter_language, languages[i], fileinfos + nfileinfos, 0);
221 fileinfos[nfileinfos].location = strdup(fn);
225 /* write DU subfile */
228 sprintf(fn, "%s.DU.solv", basename);
229 if (!(fp = fopen(fn, "w")))
234 repo_write(repo, fp, keyfilter_DU, 0, fileinfos + nfileinfos, 0);
235 fileinfos[nfileinfos].location = strdup(fn);
242 sprintf(fn, "%s.FL.solv", basename);
243 if (!(fp = fopen(fn, "w")))
248 repo_write(repo, fp, keyfilter_FL, 0, fileinfos + nfileinfos, 0);
249 fileinfos[nfileinfos].location = strdup(fn);
253 /* write everything else */
254 sprintf(fn, "%s.solv", basename);
255 if (!(fp = fopen(fn, "w")))
260 kd.languages = languages;
261 kd.nlanguages = nlanguages;
262 repo_write(repo, fp, keyfilter_other, &kd, nfileinfos ? fileinfos : 0, nfileinfos);
264 for (i = 0; i < nlanguages; i++)
267 for (i = 0; i < nfileinfos; i++)
269 sat_free(fileinfos[i].addedfileprovides);
270 sat_free(fileinfos[i].location);
271 sat_free(fileinfos[i].keys);
278 fileinfos = sat_zextend(fileinfos, nfileinfos, 1, sizeof(Repodatafile), REPODATAFILE_BLOCK);
280 FILE *fp = fopen (attrname, "w");
281 repo_write(repo, fp, keyfilter_attr, 0, fileinfos + nfileinfos, 0);
282 fileinfos[nfileinfos].location = strdup(attrname);
286 repo_write(repo, stdout, keyfilter_solv, 0, nfileinfos ? fileinfos : 0, nfileinfos);
287 for (i = 0; i < nfileinfos; i++)
289 sat_free(fileinfos[i].addedfileprovides);
290 sat_free(fileinfos[i].location);
291 sat_free(fileinfos[i].keys);