rpm-razor.c
changeset 239 7a1b0282ae3c
parent 238 d19dc7950c76
child 240 edd5fe0a00ba
     1.1 --- a/rpm-razor.c	Mon Jun 09 23:51:52 2008 -0400
     1.2 +++ b/rpm-razor.c	Sun Jun 15 22:33:15 2008 -0400
     1.3 @@ -73,10 +73,12 @@
     1.4  	{ }
     1.5  };
     1.6  
     1.7 +static int option_nodeps;
     1.8 +
     1.9  static const struct option verify_options[] = {
    1.10  	{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL },
    1.11  	{ OPTION_BOOL, "nofiles", 0, NULL, "don't verify files in package", NULL },
    1.12 -	{ OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", NULL },
    1.13 +	{ OPTION_BOOL, "nodeps", 0, NULL, "don't verify package dependencies", &option_nodeps },
    1.14  	{ OPTION_BOOL, "noscript", 0, NULL, "don't execute verify script(s)", NULL, },
    1.15  	{ OPTION_BOOL, "all", 'a', NULL, "query/verify all packages", &option_all },
    1.16  	{ OPTION_BOOL, "file", 'f', NULL, "query/verify package(s) owning file", NULL },
    1.17 @@ -125,7 +127,8 @@
    1.18  	{ }
    1.19  };
    1.20  
    1.21 -static int option_erase, option_install, option_upgrade;
    1.22 +static int option_erase, option_install, option_upgrade, option_justdb;
    1.23 +static int option_test;
    1.24  
    1.25  static const struct option install_options[] = {
    1.26  	{ OPTION_BOOL, "aid", 0, NULL, "add suggested packages to transaction", NULL, },
    1.27 @@ -143,8 +146,8 @@
    1.28  	{ OPTION_BOOL, "ignoreos", 0, NULL, "don't verify package operating system", NULL, },
    1.29  	{ OPTION_BOOL, "ignoresize", 0, NULL, "don't check disk space before installing", NULL },
    1.30  	{ OPTION_BOOL, "install", 'i', NULL, "install package(s)", &option_install },
    1.31 -	{ OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", NULL, },
    1.32 -	{ OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", NULL, },
    1.33 +	{ OPTION_BOOL, "justdb", 0, NULL, "update the database, but do not modify the filesystem", &option_justdb, },
    1.34 +	{ OPTION_BOOL, "nodeps", 0, NULL, "do not verify package dependencies", &option_nodeps, },
    1.35  	{ OPTION_BOOL, "nomd5", 0, NULL, "don't verify MD5 digest of files", NULL, },
    1.36  	{ OPTION_BOOL, "nocontexts", 0, NULL, "don't install file security contexts", NULL, },
    1.37  	{ OPTION_BOOL, "noorder", 0, NULL, "do not reorder package installation to satisfy dependencies", NULL, },
    1.38 @@ -158,7 +161,7 @@
    1.39  	{ OPTION_BOOL, "repackage", 0, NULL, "save erased package files by repackaging", NULL, },
    1.40  	{ OPTION_BOOL, "replacefiles", 0, NULL, "ignore file conflicts between packages", NULL, },
    1.41  	{ OPTION_BOOL, "replacepkgs", 0, NULL, "reinstall if the package is already present", NULL, },
    1.42 -	{ OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", NULL },
    1.43 +	{ OPTION_BOOL, "test", 0, NULL, "don't install, but tell if it would work or not", &option_test },
    1.44  	{ OPTION_BOOL, "upgrade", 'U', "<packagefile>+", "upgrade package(s)", &option_upgrade },
    1.45  	{ }
    1.46  };
    1.47 @@ -298,17 +301,20 @@
    1.48  	struct razor_package *package;
    1.49  	struct razor_package_iterator *pi;
    1.50  	const char *name, *version, *arch;
    1.51 -	int i, cmp;
    1.52 +	int i, cmp, errors;
    1.53  
    1.54  	qsort(argv, argc, sizeof(*argv), strcmpp);
    1.55  	i = 0;
    1.56 +	errors = 0;
    1.57  
    1.58  	pi = razor_package_iterator_create(set);
    1.59  
    1.60  	while (razor_package_iterator_next(pi, &package,
    1.61  					   &name, &version, &arch)) {
    1.62  		while (cmp = strcmp(argv[i], name), cmp < 0 && i < argc) {
    1.63 -			printf("package %s is not installed\n", argv[i]);
    1.64 +			fprintf(stderr, "error: package %s is not installed\n",
    1.65 +				argv[i]);
    1.66 +			errors++;
    1.67  			i++;
    1.68  		}
    1.69  
    1.70 @@ -319,6 +325,9 @@
    1.71  	}
    1.72  
    1.73  	razor_package_iterator_destroy(pi);
    1.74 +
    1.75 +	if (errors)
    1.76 +		exit(1);
    1.77  }
    1.78  
    1.79  static struct razor_package_iterator *
    1.80 @@ -500,9 +509,18 @@
    1.81  }
    1.82  
    1.83  static void
    1.84 +remove_package(const char *name,
    1.85 +	       const char *old_version, const char *new_version,
    1.86 +	       const char *arch, void *data)
    1.87 +{
    1.88 +	if (old_version)
    1.89 +		printf("remove %s-%s.%s\n", name, old_version, arch);
    1.90 +}
    1.91 +
    1.92 +static void
    1.93  command_erase(int argc, const char *argv[])
    1.94  {
    1.95 -	struct razor_set *set, *next;
    1.96 +	struct razor_set *set, *upstream, *next;
    1.97  	struct razor_transaction *trans;
    1.98  	struct razor_package_query *query;
    1.99  	struct razor_package_iterator *pi;
   1.100 @@ -515,8 +533,9 @@
   1.101  	}
   1.102  
   1.103  	set = razor_set_open(repo_filename);
   1.104 +	upstream = razor_set_create();
   1.105  
   1.106 -	trans = razor_transaction_create(set, NULL);
   1.107 +	trans = razor_transaction_create(set, upstream);
   1.108  
   1.109  	query = razor_package_query_create(set);
   1.110  	add_command_line_packages(set, query, argc, argv);
   1.111 @@ -527,8 +546,23 @@
   1.112  		razor_transaction_remove_package(trans, package);
   1.113  	razor_package_iterator_destroy(pi);
   1.114  
   1.115 +	if (!option_nodeps) {
   1.116 +		if (razor_transaction_describe(trans) > 0) {
   1.117 +			printf("unsatisfied dependencies.\n");
   1.118 +			exit(1);
   1.119 +		}
   1.120 +	}
   1.121 +
   1.122 +	if (option_test)
   1.123 +		exit(0);
   1.124 +
   1.125  	next = razor_transaction_finish(trans);
   1.126 +
   1.127 +	if (!option_justdb)
   1.128 +		razor_set_diff(set, next, remove_package, NULL);
   1.129 +
   1.130  	razor_set_destroy(set);
   1.131 +	razor_set_destroy(upstream);
   1.132  
   1.133  	razor_set_destroy(next);
   1.134  }