Use depsolver to verify rpm -e, flush out more options.
authorKristian H?gsberg <krh@redhat.com>
Sun Jun 15 22:33:15 2008 -0400 (2008-06-15)
changeset 2397a1b0282ae3c
parent 238 d19dc7950c76
child 240 edd5fe0a00ba
Use depsolver to verify rpm -e, flush out more options.
main.c
razor.c
razor.h
rpm-razor.c
     1.1 --- a/main.c	Mon Jun 09 23:51:52 2008 -0400
     1.2 +++ b/main.c	Sun Jun 15 22:33:15 2008 -0400
     1.3 @@ -446,7 +446,7 @@
     1.4  static int
     1.5  command_remove(int argc, const char *argv[])
     1.6  {
     1.7 -	struct razor_set *set;
     1.8 +	struct razor_set *set, *upstream;
     1.9  	struct razor_transaction *trans;
    1.10  	int i, errors;
    1.11  
    1.12 @@ -454,7 +454,8 @@
    1.13  	if (set == NULL)
    1.14  		return 1;
    1.15  
    1.16 -	trans = razor_transaction_create(set, NULL);
    1.17 +	upstream = razor_set_create();
    1.18 +	trans = razor_transaction_create(set, upstream);
    1.19  	for (i = 0; i < argc; i++) {
    1.20  		if (mark_packages_for_removal(trans, set, argv[i]) == 0) {
    1.21  			fprintf(stderr, "no match for %s\n", argv[i]);
    1.22 @@ -469,6 +470,7 @@
    1.23  	set = razor_transaction_finish(trans);
    1.24  	razor_set_write(set, updated_repo_filename);
    1.25  	razor_set_destroy(set);
    1.26 +	razor_set_destroy(upstream);
    1.27  	printf("wrote system-updated.repo\n");
    1.28  
    1.29  	return 0;
     2.1 --- a/razor.c	Mon Jun 09 23:51:52 2008 -0400
     2.2 +++ b/razor.c	Sun Jun 15 22:33:15 2008 -0400
     2.3 @@ -2391,39 +2391,54 @@
     2.4  	const char *name, *version, *arch, *pool;
     2.5  
     2.6  	pool = set->string_pool.data;
     2.7 -	fprintf(stderr, "could not satisfy %s %s %s, required by",
     2.8 -		&pool[rp->name],
     2.9 -		relation_string[rp->relation],
    2.10 -		&pool[rp->version]);
    2.11 -
    2.12 -	razor_package_iterator_init_for_property(&pi, set, rp);
    2.13 -	while (razor_package_iterator_next(&pi, &pkg, &name, &version, &arch))
    2.14 -		fprintf(stderr, " %s-%s", name, version);
    2.15 -
    2.16 -	fprintf(stderr, "\n");
    2.17 +	if (pool[rp->version] == '\0') {
    2.18 +		razor_package_iterator_init_for_property(&pi, set, rp);
    2.19 +		while (razor_package_iterator_next(&pi, &pkg,
    2.20 +						   &name, &version, &arch))
    2.21 +			fprintf(stderr, "%s is needed by %s-%s.%s\n",
    2.22 +				&pool[rp->name],
    2.23 +				name, version, arch);
    2.24 +	} else {
    2.25 +		razor_package_iterator_init_for_property(&pi, set, rp);
    2.26 +		while (razor_package_iterator_next(&pi, &pkg,
    2.27 +						   &name, &version, &arch))
    2.28 +			fprintf(stderr, "%s %s %s is needed by %s-%s.%s\n",
    2.29 +				&pool[rp->name],
    2.30 +				relation_string[rp->relation],
    2.31 +				&pool[rp->version],
    2.32 +				name, version, arch);
    2.33 +	}
    2.34  }
    2.35  
    2.36 -void
    2.37 +int
    2.38  razor_transaction_describe(struct razor_transaction *trans)
    2.39  {
    2.40  	struct prop_iter rpi;
    2.41  	struct razor_property *rp;
    2.42 +	int unsatisfied;
    2.43  
    2.44  	flush_scheduled_system_updates(trans);
    2.45  	flush_scheduled_upstream_updates(trans);
    2.46  	mark_all_satisfied_requires(trans);
    2.47  
    2.48 +	unsatisfied = 0;
    2.49  	prop_iter_init(&rpi, &trans->system);
    2.50  	while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
    2.51 -		if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
    2.52 +		if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
    2.53  			describe_unsatisfied(trans->system.set, rp);
    2.54 +		        unsatisfied++;
    2.55 +		}
    2.56  	}
    2.57  
    2.58  	prop_iter_init(&rpi, &trans->upstream);
    2.59  	while (prop_iter_next(&rpi, RAZOR_PROPERTY_REQUIRES, &rp)) {
    2.60 -		if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED))
    2.61 +		if (!(rpi.present[rp - rpi.start] & TRANS_PROPERTY_SATISFIED)) {
    2.62  			describe_unsatisfied(trans->upstream.set, rp);
    2.63 +			unsatisfied++;
    2.64 +		}
    2.65  	}
    2.66 +
    2.67 +	return unsatisfied;
    2.68  }
    2.69  
    2.70  int
    2.71 @@ -2518,8 +2533,6 @@
    2.72  	transaction_set_release(&trans->system);
    2.73  	transaction_set_release(&trans->upstream);
    2.74  	free(trans);
    2.75 -
    2.76 -	/* FIXME: free upstream if it was created as an empty set */
    2.77  }
    2.78  
    2.79  struct razor_package_query {
     3.1 --- a/razor.h	Mon Jun 09 23:51:52 2008 -0400
     3.2 +++ b/razor.h	Sun Jun 15 22:33:15 2008 -0400
     3.3 @@ -118,7 +118,7 @@
     3.4  				      struct razor_package *package);
     3.5  void razor_transaction_update_all(struct razor_transaction *transaction);
     3.6  int razor_transaction_resolve(struct razor_transaction *trans);
     3.7 -void razor_transaction_describe(struct razor_transaction *trans);
     3.8 +int razor_transaction_describe(struct razor_transaction *trans);
     3.9  struct razor_set *razor_transaction_finish(struct razor_transaction *trans);
    3.10  void razor_transaction_destroy(struct razor_transaction *trans);
    3.11  
     4.1 --- a/rpm-razor.c	Mon Jun 09 23:51:52 2008 -0400
     4.2 +++ b/rpm-razor.c	Sun Jun 15 22:33:15 2008 -0400
     4.3 @@ -73,10 +73,12 @@
     4.4  	{ }
     4.5  };
     4.6  
     4.7 +static int option_nodeps;
     4.8 +
     4.9  static const struct option verify_options[] = {
    4.10  	{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL },
    4.11  	{ OPTION_BOOL, "nofiles", 0, NULL, "don't verify files in package", NULL },
    4.12 -	{ OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", NULL },
    4.13 +	{ OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", &option_nodeps },
    4.14  	{ OPTION_BOOL, "noscript", 0, NULL, "don't execute verify script(s)", NULL, },
    4.15  	{ OPTION_BOOL, "all", 'a', NULL, "query/verify all packages", &option_all },
    4.16  	{ OPTION_BOOL, "file", 'f', NULL, "query/verify package(s) owning file", NULL },
    4.17 @@ -125,7 +127,8 @@
    4.18  	{ }
    4.19  };
    4.20  
    4.21 -static int option_erase, option_install, option_upgrade;
    4.22 +static int option_erase, option_install, option_upgrade, option_justdb;
    4.23 +static int option_test;
    4.24  
    4.25  static const struct option install_options[] = {
    4.26  	{ OPTION_BOOL, "aid", 0, NULL, "add suggested packages to transaction", NULL, },
    4.27 @@ -143,8 +146,8 @@
    4.28  	{ OPTION_BOOL, "ignoreos", 0, NULL, "don't verify package operating system", NULL, },
    4.29  	{ OPTION_BOOL, "ignoresize", 0, NULL, "don't check disk space before installing", NULL },
    4.30  	{ OPTION_BOOL, "install", 'i', NULL, "install package(s)", &option_install },
    4.31 -	{ OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", NULL, },
    4.32 -	{ OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", NULL, },
    4.33 +	{ OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", &option_justdb, },
    4.34 +	{ OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", &option_nodeps, },
    4.35  	{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL, },
    4.36  	{ OPTION_BOOL, "nocontexts", 0, NULL, "don't install file security contexts", NULL, },
    4.37  	{ OPTION_BOOL, "noorder", 0, NULL, "do not reorder package installation to satisfy dependencies", NULL, },
    4.38 @@ -158,7 +161,7 @@
    4.39  	{ OPTION_BOOL, "repackage", 0, NULL, "save erased package files by repackaging", NULL, },
    4.40  	{ OPTION_BOOL, "replacefiles", 0, NULL, "ignore file conflicts between packages", NULL, },
    4.41  	{ OPTION_BOOL, "replacepkgs", 0, NULL, "reinstall if the package is already present", NULL, },
    4.42 -	{ OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", NULL },
    4.43 +	{ OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", &option_test },
    4.44  	{ OPTION_BOOL, "upgrade", 'U', "<packagefile>+", "upgrade package(s)", &option_upgrade },
    4.45  	{ }
    4.46  };
    4.47 @@ -298,17 +301,20 @@
    4.48  	struct razor_package *package;
    4.49  	struct razor_package_iterator *pi;
    4.50  	const char *name, *version, *arch;
    4.51 -	int i, cmp;
    4.52 +	int i, cmp, errors;
    4.53  
    4.54  	qsort(argv, argc, sizeof(*argv), strcmpp);
    4.55  	i = 0;
    4.56 +	errors = 0;
    4.57  
    4.58  	pi = razor_package_iterator_create(set);
    4.59  
    4.60  	while (razor_package_iterator_next(pi, &package,
    4.61  					   &name, &version, &arch)) {
    4.62  		while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
    4.63 -			printf("package %s is not installed\n", argv[i]);
    4.64 +			fprintf(stderr, "error: package %s is not installed\n",
    4.65 +				argv[i]);
    4.66 +			errors++;
    4.67  			i++;
    4.68  		}
    4.69  
    4.70 @@ -319,6 +325,9 @@
    4.71  	}
    4.72  
    4.73  	razor_package_iterator_destroy(pi);
    4.74 +
    4.75 +	if (errors)
    4.76 +		exit(1);
    4.77  }
    4.78  
    4.79  static struct razor_package_iterator *
    4.80 @@ -500,9 +509,18 @@
    4.81  }
    4.82  
    4.83  static void
    4.84 +remove_package(const char *name,
    4.85 +	       const char *old_version, const char *new_version,
    4.86 +	       const char *arch, void *data)
    4.87 +{
    4.88 +	if (old_version)
    4.89 +		printf("remove %s-%s.%s\n", name, old_version, arch);
    4.90 +}
    4.91 +
    4.92 +static void
    4.93  command_erase(int argc, const char *argv[])
    4.94  {
    4.95 -	struct razor_set *set, *next;
    4.96 +	struct razor_set *set, *upstream, *next;
    4.97  	struct razor_transaction *trans;
    4.98  	struct razor_package_query *query;
    4.99  	struct razor_package_iterator *pi;
   4.100 @@ -515,8 +533,9 @@
   4.101  	}
   4.102  
   4.103  	set = razor_set_open(repo_filename);
   4.104 +	upstream = razor_set_create();
   4.105  
   4.106 -	trans = razor_transaction_create(set, NULL);
   4.107 +	trans = razor_transaction_create(set, upstream);
   4.108  
   4.109  	query = razor_package_query_create(set);
   4.110  	add_command_line_packages(set, query, argc, argv);
   4.111 @@ -527,8 +546,23 @@
   4.112  		razor_transaction_remove_package(trans, package);
   4.113  	razor_package_iterator_destroy(pi);
   4.114  
   4.115 +	if (!option_nodeps) {
   4.116 +		if (razor_transaction_describe(trans) > 0) {
   4.117 +			printf("unsatisfied dependencies.\n");
   4.118 +			exit(1);
   4.119 +		}
   4.120 +	}
   4.121 +
   4.122 +	if (option_test)
   4.123 +		exit(0);
   4.124 +
   4.125  	next = razor_transaction_finish(trans);
   4.126 +
   4.127 +	if (!option_justdb)
   4.128 +		razor_set_diff(set, next, remove_package, NULL);
   4.129 +
   4.130  	razor_set_destroy(set);
   4.131 +	razor_set_destroy(upstream);
   4.132  
   4.133  	razor_set_destroy(next);
   4.134  }