Also import requires.
Needs more work though, only 10% of requires are unique.
1.1 --- a/TODO Wed Sep 05 00:32:09 2007 -0400
1.2 +++ b/TODO Thu Sep 06 15:11:49 2007 -0400
1.3 @@ -1,9 +1,3 @@
1.4 -- pkg manifest is list of files
1.5 -
1.6 - /usr/bin/bash 1321321372198798
1.7 -
1.8 - plus provides, requires and version?
1.9 -
1.10 - keep history of installed packages/journal of package transaction,
1.11 so we can roll back to yesterday, or see what got installed in the
1.12 latest yum update.
1.13 @@ -48,4 +42,13 @@
1.14 a word from every entry.
1.15
1.16 - signed pkgs
1.17 -- gzip pkg xml files somehow?
1.18 +
1.19 +- gzip repository of look-aside pkg xml files somehow?
1.20 +
1.21 +- transactions, proper recovery, make sure we don't poop our package
1.22 + database (no more rm /var/lib/rpm/__cache*).
1.23 +
1.24 +- no external dependencies, forget about bdb, sqlite. It's *simple*
1.25 + and we need to control the on-disk format for these tools.
1.26 +
1.27 +- 20740 requires, 2246 unique... hmm.
2.1 --- a/razor.c Wed Sep 05 00:32:09 2007 -0400
2.2 +++ b/razor.c Thu Sep 06 15:11:49 2007 -0400
2.3 @@ -92,17 +92,19 @@
2.4
2.5 #define RAZOR_MAGIC 0x7a7a7a7a
2.6 #define RAZOR_VERSION 1
2.7 +
2.8 #define RAZOR_BUCKETS 1
2.9 #define RAZOR_STRINGS 2
2.10 #define RAZOR_PACKAGES 3
2.11 -#define RAZOR_PROVIDES 4
2.12 +#define RAZOR_REQUIRES 4
2.13 +#define RAZOR_PROVIDES 5
2.14
2.15 struct razor_package {
2.16 unsigned long name;
2.17 unsigned long version;
2.18 };
2.19
2.20 -struct razor_provides {
2.21 +struct razor_property {
2.22 unsigned long name;
2.23 unsigned long version;
2.24 };
2.25 @@ -111,6 +113,7 @@
2.26 struct array buckets;
2.27 struct array string_pool;
2.28 struct array packages;
2.29 + struct array requires;
2.30 struct array provides;
2.31 struct razor_set_header *header;
2.32 };
2.33 @@ -166,6 +169,11 @@
2.34 set->packages.size = size;
2.35 set->packages.size = size;
2.36 break;
2.37 + case RAZOR_REQUIRES:
2.38 + set->requires.data = (void *) set->header + offset;
2.39 + set->requires.size = size;
2.40 + set->requires.size = size;
2.41 + break;
2.42 case RAZOR_PROVIDES:
2.43 set->provides.data = (void *) set->header + offset;
2.44 set->provides.size = size;
2.45 @@ -203,11 +211,12 @@
2.46 {
2.47 char data[4096];
2.48 struct razor_set_header *header = (struct razor_set_header *) data;
2.49 - int fd, pool_size, packages_size, provides_size;
2.50 + int fd, pool_size, packages_size, requires_size, provides_size;
2.51
2.52 /* Align these to pages sizes */
2.53 pool_size = (set->string_pool.size + 4095) & ~4095;
2.54 packages_size = (set->packages.size + 4095) & ~4095;
2.55 + requires_size = (set->requires.size + 4095) & ~4095;
2.56 provides_size = (set->provides.size + 4095) & ~4095;
2.57
2.58 memset(data, 0, sizeof data);
2.59 @@ -225,13 +234,17 @@
2.60 header->sections[2].offset =
2.61 header->sections[1].offset + pool_size;
2.62
2.63 - header->sections[3].type = RAZOR_PROVIDES;
2.64 + header->sections[3].type = RAZOR_REQUIRES;
2.65 header->sections[3].offset =
2.66 header->sections[2].offset + packages_size;
2.67
2.68 - header->sections[4].type = 0;
2.69 + header->sections[4].type = RAZOR_PROVIDES;
2.70 header->sections[4].offset =
2.71 - header->sections[3].offset + provides_size;
2.72 + header->sections[3].offset + requires_size;
2.73 +
2.74 + header->sections[5].type = 0;
2.75 + header->sections[5].offset =
2.76 + header->sections[4].offset + provides_size;
2.77
2.78 fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0666);
2.79 if (fd < 0)
2.80 @@ -241,6 +254,7 @@
2.81 write_to_fd(fd, set->buckets.data, set->buckets.alloc);
2.82 write_to_fd(fd, set->string_pool.data, pool_size);
2.83 write_to_fd(fd, set->packages.data, packages_size);
2.84 + write_to_fd(fd, set->requires.data, requires_size);
2.85 write_to_fd(fd, set->provides.data, provides_size);
2.86
2.87 return 0;
2.88 @@ -356,17 +370,31 @@
2.89 }
2.90
2.91 static unsigned long
2.92 +razor_set_add_requires(struct razor_set *set,
2.93 + unsigned long name, unsigned long version)
2.94 +{
2.95 + struct razor_property *p;
2.96 +
2.97 + p = array_add(&set->requires, sizeof *p);
2.98 +
2.99 + p->name = name;
2.100 + p->version = version;
2.101 +
2.102 + return p - (struct razor_property *) set->requires.data;
2.103 +}
2.104 +
2.105 +static unsigned long
2.106 razor_set_add_provides(struct razor_set *set,
2.107 unsigned long name, unsigned long version)
2.108 {
2.109 - struct razor_provides *p;
2.110 + struct razor_property *p;
2.111
2.112 p = array_add(&set->provides, sizeof *p);
2.113
2.114 p->name = name;
2.115 p->version = version;
2.116
2.117 - return p - (struct razor_provides *) set->packages.data;
2.118 + return p - (struct razor_property *) set->provides.data;
2.119 }
2.120
2.121 unsigned long
2.122 @@ -393,12 +421,12 @@
2.123 }
2.124
2.125 static int
2.126 -compare_provides(const void *p1, const void *p2)
2.127 +compare_properties(const void *p1, const void *p2)
2.128 {
2.129 - const struct razor_provides *prv1 = p1, *prv2 = p2;
2.130 + const struct razor_property *prop1 = p1, *prop2 = p2;
2.131 char *pool = qsort_set->string_pool.data;
2.132
2.133 - return strcmp(&pool[prv1->name], &pool[prv2->name]);
2.134 + return strcmp(&pool[prop1->name], &pool[prop2->name]);
2.135 }
2.136
2.137 static void
2.138 @@ -408,9 +436,12 @@
2.139 qsort(set->packages.data,
2.140 set->packages.size / sizeof(struct razor_package),
2.141 sizeof(struct razor_package), compare_packages);
2.142 + qsort(set->requires.data,
2.143 + set->requires.size / sizeof(struct razor_property),
2.144 + sizeof(struct razor_property), compare_properties);
2.145 qsort(set->provides.data,
2.146 - set->provides.size / sizeof(struct razor_provides),
2.147 - sizeof(struct razor_provides), compare_provides);
2.148 + set->provides.size / sizeof(struct razor_property),
2.149 + sizeof(struct razor_property), compare_properties);
2.150 }
2.151
2.152 struct parsing_context {
2.153 @@ -443,6 +474,26 @@
2.154 }
2.155
2.156 static void
2.157 +parse_requires(struct parsing_context *ctx, const char **atts)
2.158 +{
2.159 + unsigned long name = 0, version = 0;
2.160 + int i;
2.161 +
2.162 + for (i = 0; atts[i]; i += 2) {
2.163 + if (strcmp(atts[i], "name") == 0)
2.164 + name = razor_set_tokenize(ctx->set, atts[i + 1]);
2.165 + }
2.166 +
2.167 + if (name == 0) {
2.168 + fprintf(stderr, "invalid requires tag, "
2.169 + "missing name attribute\n");
2.170 + return;
2.171 + }
2.172 +
2.173 + ctx->pkg_id = razor_set_add_requires(ctx->set, name, version);
2.174 +}
2.175 +
2.176 +static void
2.177 parse_provides(struct parsing_context *ctx, const char **atts)
2.178 {
2.179 unsigned long name = 0, version = 0;
2.180 @@ -470,6 +521,8 @@
2.181
2.182 if (strcmp(name, "package") == 0)
2.183 parse_package(ctx, atts);
2.184 + else if (strcmp(name, "requires") == 0)
2.185 + parse_requires(ctx, atts);
2.186 else if (strcmp(name, "provides") == 0)
2.187 parse_provides(ctx, atts);
2.188
2.189 @@ -566,9 +619,21 @@
2.190 }
2.191
2.192 void
2.193 +razor_set_list_requires(struct razor_set *set)
2.194 +{
2.195 + struct razor_property *p, *end;
2.196 + char *pool;
2.197 +
2.198 + pool = set->string_pool.data;
2.199 + end = set->requires.data + set->requires.size;
2.200 + for (p = set->requires.data; p < end && p->name; p++)
2.201 + printf("%s %s\n", &pool[p->name], &pool[p->version]);
2.202 +}
2.203 +
2.204 +void
2.205 razor_set_list_provides(struct razor_set *set)
2.206 {
2.207 - struct razor_provides *p, *end;
2.208 + struct razor_property *p, *end;
2.209 char *pool;
2.210
2.211 pool = set->string_pool.data;
2.212 @@ -597,6 +662,9 @@
2.213 case RAZOR_PACKAGES:
2.214 printf("package section:\t%dkb\n", size / 1024);
2.215 break;
2.216 + case RAZOR_REQUIRES:
2.217 + printf("requires section:\t%dkb\n", size / 1024);
2.218 + break;
2.219 case RAZOR_PROVIDES:
2.220 printf("provides section:\t%dkb\n", size / 1024);
2.221 break;
2.222 @@ -608,7 +676,7 @@
2.223 usage(void)
2.224 {
2.225 printf("usage: razor [ import FILES | lookup <key> | "
2.226 - "list | list-provides | info ]\n");
2.227 + "list | list-requires | list-provides | info ]\n");
2.228 exit(1);
2.229 }
2.230
2.231 @@ -645,6 +713,7 @@
2.232 * should probably just have a size field in the
2.233 * header section. */
2.234 razor_set_add_package(set, 0, 0);
2.235 + razor_set_add_requires(set, 0, 0);
2.236 razor_set_add_provides(set, 0, 0);
2.237
2.238 printf("bucket allocation: %d\n", set->buckets.alloc);
2.239 @@ -652,8 +721,10 @@
2.240 printf("pool allocation: %d\n", set->string_pool.alloc);
2.241 printf("packages: %d\n",
2.242 set->packages.size / sizeof(struct razor_package));
2.243 + printf("requires: %d\n",
2.244 + set->requires.size / sizeof(struct razor_property));
2.245 printf("provides: %d\n",
2.246 - set->provides.size / sizeof(struct razor_provides));
2.247 + set->provides.size / sizeof(struct razor_property));
2.248
2.249 razor_set_write(set, repo_filename);
2.250
2.251 @@ -667,6 +738,10 @@
2.252 set = razor_set_open(repo_filename);
2.253 razor_set_list(set);
2.254 razor_set_destroy(set);
2.255 + } else if (strcmp(argv[1], "list-requires") == 0) {
2.256 + set = razor_set_open(repo_filename);
2.257 + razor_set_list_requires(set);
2.258 + razor_set_destroy(set);
2.259 } else if (strcmp(argv[1], "list-provides") == 0) {
2.260 set = razor_set_open(repo_filename);
2.261 razor_set_list_provides(set);