use sed instead of grep to get rid of the <?xml...> line
[platform/upstream/libsolv.git] / tools / repomdxml2solv.c
1 /*
2  * Copyright (c) 2007-2009, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 #include <sys/types.h>
9 #include <limits.h>
10 #include <fcntl.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <unistd.h>
15
16 #include "pool.h"
17 #include "repo.h"
18 #include "chksum.h"
19 #include "repo_repomdxml.h"
20 #include "common_write.h"
21
22 static void
23 usage(int status)
24 {
25   fprintf(stderr, "\nUsage:\n"
26           "repomdxml2solv [-q query]\n"
27           "  reads a 'repomd.xml' file from <stdin> and writes a .solv file to <stdout>\n"
28           "  -q : query a repomd data entry\n"
29           "  -h : print help & exit\n"
30          );
31    exit(status);
32 }
33
34 static void
35 doquery(Pool *pool, Repo *repo, const char *query)
36 {
37   Id id, type = 0;
38   char qbuf[256];
39   const char *qp;
40   Dataiterator di;
41
42   qp = strchr(query, ':');
43   if (qp)
44     {
45       type = pool_strn2id(pool, query, qp - query, 0);
46       if (!type)
47         exit(0);
48       qp++;
49     }
50   else
51     qp = query;
52   snprintf(qbuf, sizeof(qbuf), "repository:repomd:%s", qp);
53   id = pool_str2id(pool, qbuf, 0);
54   if (!id)
55     exit(0);
56   dataiterator_init(&di, pool, repo, SOLVID_META, id, 0, 0);
57   dataiterator_prepend_keyname(&di, REPOSITORY_REPOMD);
58   while (dataiterator_step(&di))
59     {
60       if (type)
61         {
62           dataiterator_setpos_parent(&di);
63           if (pool_lookup_id(pool, SOLVID_POS, REPOSITORY_REPOMD_TYPE) != type)
64             continue;
65         }
66       switch (di.key->type)
67         {
68         case REPOKEY_TYPE_ID:
69         case REPOKEY_TYPE_CONSTANTID:
70           printf("%s\n", pool_id2str(pool, di.kv.id));
71           break;
72         case REPOKEY_TYPE_STR:
73           printf("%s\n", di.kv.str);
74           break;
75         case REPOKEY_TYPE_NUM:
76         case REPOKEY_TYPE_CONSTANT:
77           printf("%llu\n", SOLV_KV_NUM64(&di.kv));
78           break;
79         default:
80           if (solv_chksum_len(di.key->type))
81             printf("%s:%s\n", solv_chksum_type2str(di.key->type), repodata_chk2str(di.data, di.key->type, (unsigned char *)di.kv.str));
82           break;
83         }
84     }
85   dataiterator_free(&di);
86 }
87
88 int
89 main(int argc, char **argv)
90 {
91   int c, flags = 0;
92   const char *query = 0;
93   
94   Pool *pool = pool_create();
95   Repo *repo = repo_create(pool, "<stdin>");
96
97   while ((c = getopt (argc, argv, "hq:")) >= 0)
98     {
99       switch(c)
100         {
101         case 'h':
102           usage(0);
103           break;
104         case 'q':
105           query = optarg;
106           break;
107         default:
108           usage(1);
109           break;
110         }
111     }
112   if (repo_add_repomdxml(repo, stdin, flags))
113     {
114       fprintf(stderr, "repomdxml2solv: %s\n", pool_errstr(pool));
115       exit(1);
116     }
117   if (query)
118     doquery(pool, repo, query);
119   else
120     tool_write(repo, 0, 0);
121   pool_free(pool);
122   exit(0);
123 }