Also import requires.
authorKristian H?gsberg <krh@redhat.com>
Thu Sep 06 15:11:49 2007 -0400 (2007-09-06)
changeset 87820b7d94662
parent 7 235f7daf817c
child 9 c4338a14dd9f
Also import requires.

Needs more work though, only 10% of requires are unique.
TODO
razor.c
     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);