2 * Copyright (c) 2007, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
10 #include <sys/types.h>
22 #include "repo_susetags.h"
23 #include "repo_content.h"
24 #include "common_write.h"
29 fprintf(stderr, "\nUsage:\n"
30 "susetags2solv [-b <base>][-c <content>][-d <descrdir>][-h][-k][-n <name>]\n"
31 " reads a 'susetags' repository from <stdin> and writes a .solv file to <stdout>\n"
32 " -b <base>: save as multiple files starting with <base>\n"
33 " -c <contentfile> : parse given contentfile (for product information)\n"
34 " -d <descrdir> : do not read from stdin, but use data in descrdir\n"
35 " -h : print help & exit\n"
36 " -k : don't mix kinds (experimental!)\n"
37 " -n <name>: save attributes as <name>.attr\n"
43 cookie_gzread(void *cookie, char *buf, size_t nbytes)
45 return gzread((gzFile *)cookie, buf, nbytes);
49 cookie_gzclose(void *cookie)
51 return gzclose((gzFile *)cookie);
55 myfopen(const char *fn)
57 cookie_io_functions_t cio;
63 suf = strrchr(fn, '.');
64 if (!suf || strcmp(suf, ".gz") != 0)
65 return fopen(fn, "r");
66 gzf = gzopen(fn, "r");
69 memset(&cio, 0, sizeof(cio));
70 cio.read = cookie_gzread;
71 cio.close = cookie_gzclose;
72 return fopencookie(gzf, "r", cio);
75 /* content file query */
77 doquery(Pool *pool, Repo *repo, const char *arg)
83 snprintf(qbuf, sizeof(qbuf), "susetags:%s", arg);
84 id = str2id(pool, qbuf, 0);
87 str = repo_lookup_str(repo, SOLVID_META, id);
93 main(int argc, char **argv)
95 const char *contentfile = 0;
96 const char *attrname = 0;
97 const char *descrdir = 0;
98 const char *basefile = 0;
99 const char *query = 0;
104 while ((c = getopt(argc, argv, "hkn:c:d:b:q:")) >= 0)
112 flags |= SUSETAGS_KINDS_SEPARATELY; /* do not use! */
118 contentfile = optarg;
134 Pool *pool = pool_create();
135 Repo *repo = repo_create(pool, "<susetags>");
137 repo_add_repodata(repo, 0);
141 FILE *fp = fopen (contentfile, "r");
147 repo_add_content(repo, fp, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
148 if (repo->start < repo->end)
149 if (!strncmp(id2str(pool, pool->solvables[repo->start].name), "product:", 8))
150 defvendor = pool->solvables[repo->start].vendor;
156 /* ensure '.attr' suffix */
157 const char *dot = strrchr(attrname, '.');
158 if (!dot || strcmp(dot, ".attr"))
160 int len = strlen (attrname);
161 char *newname = (char *)malloc(len + 6); /* alloc for <attrname>+'.attr'+'\0' */
162 strcpy (newname, attrname);
163 strcpy (newname+len, ".attr");
169 * descrdir path given, open files and read from there
176 struct dirent **files;
178 ndirs = scandir(descrdir, &files, 0, alphasort);
185 /* bring packages to front */
186 for (i = 0; i < ndirs; i++)
188 char *fn = files[i]->d_name;
189 if (!strcmp(fn, "packages") || !strcmp(fn, "packages.gz"))
194 fprintf(stderr, "found no packages file\n");
199 struct dirent *de = files[i];
200 memmove(files + 1, files, i * sizeof(de));
204 fnp = sat_malloc(strlen(descrdir) + 128);
205 for (i = 0; i < ndirs; i++)
207 char *fn = files[i]->d_name;
209 if (!strcmp(fn, "packages") || !strcmp(fn, "packages.gz"))
211 sprintf(fnp, "%s/%s", descrdir, fn);
212 FILE *fp = myfopen(fnp);
218 repo_add_susetags(repo, fp, defvendor, 0, flags | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
221 else if (!strcmp(fn, "packages.DU") || !strcmp(fn, "packages.DU.gz"))
223 sprintf(fnp, "%s/%s", descrdir, fn);
224 FILE *fp = myfopen(fnp);
230 repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
233 else if (!strcmp(fn, "packages.FL") || !strcmp(fn, "packages.FL.gz"))
236 sprintf(fnp, "%s/%s", descrdir, fn);
237 FILE *fp = myfopen(fnp);
243 repo_add_susetags(repo, fp, defvendor, 0, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
246 /* ignore for now. reactivate when filters work */
250 else if (!strncmp(fn, "packages.", 9))
254 sprintf(fnp, "%s/%s", descrdir, fn);
255 p = strrchr(fnp, '.');
256 if (p && !strcmp(p, ".gz"))
259 p = strrchr(fnp, '.');
261 if (!p || !p[1] || strlen(p + 1) > 5)
264 sprintf(fnp, "%s/%s", descrdir, fn);
265 FILE *fp = myfopen(fnp);
271 repo_add_susetags(repo, fp, defvendor, lang, flags | SUSETAGS_EXTEND | REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
275 for (i = 0; i < ndirs; i++)
279 repo_internalize(repo);
282 /* read data from stdin */
283 repo_add_susetags(repo, stdin, defvendor, 0, REPO_REUSE_REPODATA | REPO_NO_INTERNALIZE);
284 repo_internalize(repo);
287 doquery(pool, repo, query);
289 tool_write(repo, basefile, attrname);