Pfeww. I'm tired, but now you can add refers from repo SOLV files to
[platform/upstream/libsolv.git] / tools / dumpsolv.c
1 /*
2  * Copyright (c) 2007, Novell Inc.
3  *
4  * This program is licensed under the BSD license, read LICENSE.BSD
5  * for further information
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <unistd.h>
11 #include <string.h>
12
13 #include "pool.h"
14 #include "repo_solv.h"
15 #include "attr_store.h"
16 #include "attr_store_p.h"
17
18 static void
19 dump_attrs_1 (Attrstore *s, unsigned int entry)
20 {
21   attr_iterator ai;
22   FOR_ATTRS (s, entry, &ai)
23     {
24       fprintf (stdout, "%s:", id2str (s->pool, ai.name));
25       switch (ai.type)
26         {
27         case TYPE_ATTR_INT:
28           fprintf (stdout, "int  %u\n", ai.as_int);
29           break;
30         case TYPE_ATTR_CHUNK:
31           {
32             const char *str = attr_retrieve_blob (s, ai.as_chunk[0], ai.as_chunk[1]);
33             if (str)
34               fprintf (stdout, "blob %s\n", str);
35             else
36               fprintf (stdout, "blob %u+%u\n", ai.as_chunk[0], ai.as_chunk[1]);
37           }
38           break;
39         case TYPE_ATTR_STRING:
40           fprintf (stdout, "str  %s\n", ai.as_string);
41           break;
42         case TYPE_ATTR_INTLIST:
43           {
44             fprintf (stdout, "lint\n ");
45             while (1)
46               {
47                 int val;
48                 get_num (ai.as_numlist, val);
49                 if (!val)
50                   break;
51                 fprintf (stdout, " %d", val);
52               }
53             fprintf (stdout, "\n");
54             break;
55           }
56         case TYPE_ATTR_LOCALIDS:
57           {
58             fprintf (stdout, "lids");
59             while (1)
60               {
61                 Id val;
62                 get_num (ai.as_numlist, val);
63                 if (!val)
64                   break;
65                 fprintf (stdout, "\n  %s(%d)", localid2str (s, val), val);
66               }
67             fprintf (stdout, "\n");
68             break;
69           }
70         default:
71           break;
72         }
73     }
74 }
75
76 static void
77 dump_attrs (Repo *repo, unsigned int entry)
78 {
79   unsigned i;
80   for (i = 0; i < repo->nrepodata; i++)
81     {
82       Attrstore *s = repo->repodata[i].s;
83       if (s && entry < s->entries)
84         dump_attrs_1 (s, entry);
85     }
86 }
87
88 static void
89 dump_repodata (Repo *repo)
90 {
91   unsigned i;
92   Repodata *d;
93   if (repo->nrepodata == 0)
94     return;
95   printf ("repo refers to %d attribute stores:\n", repo->nrepodata);
96   for (i = 0, d = repo->repodata; i < repo->nrepodata; i++, d++)
97     {
98       unsigned j;
99       printf ("%s has %d keys", d->name ? d->name : "**EMBED**", d->nkeys);
100       for (j = 0; j < d->nkeys; j++)
101         printf ("\n  %s", id2str (repo->pool, d->keys[j].name));
102       printf ("\n");
103     }
104   printf ("\n");
105 }
106
107 static void
108 printids(Repo *repo, char *kind, Offset ido)
109 {
110   Pool *pool = repo->pool;
111   Id id, *ids;
112   if (!ido)
113     return;
114   printf("%s:\n", kind);
115   ids = repo->idarraydata + ido;
116   while((id = *ids++) != 0)
117     printf("  %s\n", dep2str(pool, id));
118 }
119
120 int main(int argc, char **argv)
121 {
122   Repo *repo;
123   Pool *pool;
124   int i, n;
125   Solvable *s;
126
127   if (argc != 1)
128     {
129       if (freopen(argv[1], "r", stdin) == 0)
130         {
131           perror(argv[1]);
132           exit(1);
133         }
134     }
135   pool = pool_create();
136   repo = repo_create(pool, argc != 1 ? argv[1] : "<stdin>");
137   repo_add_solv(repo, stdin);
138   dump_repodata (repo);
139   printf("repo contains %d solvables\n", repo->nsolvables);
140   for (i = repo->start, n = 1; i < repo->end; i++)
141     {
142       s = pool->solvables + i;
143       if (s->repo != repo)
144         continue;
145       printf("\n");
146       printf("solvable %d:\n", n);
147       if (s->name || s->evr || s->arch)
148         printf("name: %s %s %s\n", id2str(pool, s->name), id2str(pool, s->evr), id2str(pool, s->arch));
149       if (s->vendor)
150         printf("vendor: %s\n", id2str(pool, s->vendor));
151       printids(repo, "provides", s->provides);
152       printids(repo, "obsoletes", s->obsoletes);
153       printids(repo, "conflicts", s->conflicts);
154       printids(repo, "requires", s->requires);
155       printids(repo, "recommends", s->recommends);
156       printids(repo, "suggests", s->suggests);
157       printids(repo, "supplements", s->supplements);
158       printids(repo, "enhances", s->enhances);
159       printids(repo, "freshens", s->freshens);
160       dump_attrs (repo, n - 1);
161       n++;
162     }
163   pool_free(pool);
164   exit(0);
165 }