src/main.c
changeset 369 f8c27fe9fe63
parent 363 c75a2d5caae9
child 372 6e93e5485947
     1.1 --- a/src/main.c	Fri May 01 16:48:47 2009 +0100
     1.2 +++ b/src/main.c	Fri Jun 12 16:59:11 2009 +0100
     1.3 @@ -50,8 +50,8 @@
     1.4  #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     1.5  
     1.6  static int
     1.7 -update_packages(struct razor_set *system, struct razor_set *next,
     1.8 -		struct razor_relocations *relocations);
     1.9 +update_packages(struct razor_transaction *trans, struct razor_set *system,
    1.10 +		struct razor_set *next, struct razor_relocations *relocations);
    1.11  
    1.12  static struct razor_package_iterator *
    1.13  create_iterator_from_argv(struct razor_set *set, int argc, const char *argv[])
    1.14 @@ -222,6 +222,44 @@
    1.15  }
    1.16  
    1.17  static int
    1.18 +command_list_scripts(int argc, const char *argv[])
    1.19 +{
    1.20 +	struct razor_set *set;
    1.21 +	struct razor_package *package;
    1.22 +	struct razor_package_iterator *pi;
    1.23 +	const char *preunprog, *preun, *postunprog, *postun;
    1.24 +
    1.25 +	set = razor_root_open_read_only(install_root);
    1.26 +	if (set == NULL)
    1.27 +		return 1;
    1.28 +
    1.29 +	pi = create_iterator_from_argv(set, argc, argv);
    1.30 +	while (razor_package_iterator_next(pi, &package,
    1.31 +					   RAZOR_DETAIL_PREUNPROG, &preunprog,
    1.32 +					   RAZOR_DETAIL_PREUN, &preun,
    1.33 +					   RAZOR_DETAIL_POSTUNPROG, &postunprog,
    1.34 +					   RAZOR_DETAIL_POSTUN, &postun,
    1.35 +					   RAZOR_DETAIL_LAST)) {
    1.36 +		if (preun && *preun) {
    1.37 +			printf("preuninstall scriptlet");
    1.38 +			if (preunprog && *preunprog)
    1.39 +				printf(" (using %s)",preunprog);
    1.40 +			printf(":\n%s\n",preun);
    1.41 +		}
    1.42 +		if (postun && *postun) {
    1.43 +			printf("postuninstall scriptlet");
    1.44 +			if (postunprog && *postunprog)
    1.45 +				printf(" (using %s)",postunprog);
    1.46 +			printf(":\n%s\n",postun);
    1.47 +		}
    1.48 +	}
    1.49 +	razor_package_iterator_destroy(pi);
    1.50 +	razor_set_destroy(set);
    1.51 +
    1.52 +	return 0;
    1.53 +}
    1.54 +
    1.55 +static int
    1.56  command_list_files(int argc, const char *argv[])
    1.57  {
    1.58  	struct razor_set *set;
    1.59 @@ -542,6 +580,7 @@
    1.60  	for (i = 0; i < argc; i++) {
    1.61  		if (mark_packages_for_update(trans, set, argv[i]) == 0) {
    1.62  			fprintf(stderr, "no match for %s\n", argv[i]);
    1.63 +			razor_transaction_destroy(trans);
    1.64  			return 1;
    1.65  		}
    1.66  	}
    1.67 @@ -550,11 +589,13 @@
    1.68  	errors = razor_transaction_describe(trans);
    1.69  	if (errors) {
    1.70  		fprintf(stderr, "unresolved dependencies\n");
    1.71 +		razor_transaction_destroy(trans);
    1.72  		return 1;
    1.73  	}
    1.74  
    1.75 -	set = razor_transaction_finish(trans);
    1.76 +	set = razor_transaction_commit(trans);
    1.77  	razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
    1.78 +	razor_transaction_destroy(trans);
    1.79  	razor_set_destroy(set);
    1.80  	razor_set_destroy(upstream);
    1.81  	printf("wrote system-updated.rzdb\n");
    1.82 @@ -598,10 +639,11 @@
    1.83  		return 1;
    1.84  	}
    1.85  
    1.86 -	next = razor_transaction_finish(trans);
    1.87 -	update_packages(system, next, NULL);
    1.88 +	next = razor_transaction_commit(trans);
    1.89 +	update_packages(trans, system, next, NULL);
    1.90  	razor_root_update(root, next);
    1.91  
    1.92 +	razor_transaction_destroy(trans);
    1.93  	razor_set_destroy(next);
    1.94  	razor_set_destroy(upstream);
    1.95  
    1.96 @@ -774,6 +816,7 @@
    1.97  	struct razor_property *property;
    1.98  	struct razor_rpm *rpm;
    1.99  	const char *name, *version, *arch, *summary, *desc, *url, *license;
   1.100 +	const char *preunprog, *preun, *postunprog, *postun;
   1.101  	char file[PATH_MAX];
   1.102  	uint32_t flags;
   1.103  
   1.104 @@ -788,6 +831,10 @@
   1.105  					   RAZOR_DETAIL_DESCRIPTION, &desc,
   1.106  					   RAZOR_DETAIL_URL, &url,
   1.107  					   RAZOR_DETAIL_LICENSE, &license,
   1.108 +					   RAZOR_DETAIL_PREUNPROG, &preunprog,
   1.109 +					   RAZOR_DETAIL_PREUN, &preun,
   1.110 +					   RAZOR_DETAIL_POSTUNPROG, &postunprog,
   1.111 +					   RAZOR_DETAIL_POSTUN, &postun,
   1.112  					   RAZOR_DETAIL_LAST)) {
   1.113  		snprintf(file, sizeof file,
   1.114  			 "rpms/%s", rpm_filename(name, version, arch));
   1.115 @@ -820,6 +867,11 @@
   1.116  		}
   1.117  		razor_file_iterator_destroy(file_iter);
   1.118  
   1.119 +		razor_importer_add_script(importer, RAZOR_PROPERTY_PREUN,
   1.120 +					  preunprog, preun);
   1.121 +		razor_importer_add_script(importer, RAZOR_PROPERTY_POSTUN,
   1.122 +					  postunprog, postun);
   1.123 +
   1.124  		razor_importer_finish_package(importer);
   1.125  	}
   1.126  
   1.127 @@ -828,7 +880,8 @@
   1.128  }
   1.129  
   1.130  static int
   1.131 -install_package(struct razor_set *set, struct razor_package *package,
   1.132 +install_package(struct razor_transaction *trans, struct razor_set *set,
   1.133 +		struct razor_package *package,
   1.134  		struct razor_relocations *relocations)
   1.135  {
   1.136  	int retval;
   1.137 @@ -853,6 +906,7 @@
   1.138  	}
   1.139  	if (relocations)
   1.140  		razor_rpm_set_relocations(rpm, relocations);
   1.141 +	razor_transaction_fixup_package(trans, package, rpm);
   1.142  	retval = razor_rpm_install(rpm, install_root);
   1.143  	if (retval < 0)
   1.144  		fprintf(stderr, "failed to install rpm %s\n", file);
   1.145 @@ -861,37 +915,8 @@
   1.146  }
   1.147  
   1.148  static int
   1.149 -remove_package(struct razor_set *set, struct razor_package *package)
   1.150 -{
   1.151 -	struct razor_file_iterator *fi;
   1.152 -	struct razor_package_iterator *pi;
   1.153 -	struct razor_package *p;
   1.154 -	char buffer[PATH_MAX];
   1.155 -	const char *name;
   1.156 -	int retval = 0, count;
   1.157 -
   1.158 -	fi = razor_file_iterator_create(set, package);
   1.159 -
   1.160 -	while (!retval && razor_file_iterator_next(fi, &name)) {
   1.161 -		pi = razor_package_iterator_create_for_file(set, name);
   1.162 -		count = 0;
   1.163 -		while (razor_package_iterator_next(pi, &p, RAZOR_DETAIL_LAST))
   1.164 -			count++;
   1.165 -		razor_package_iterator_destroy(pi);
   1.166 -		if (count <= 1) {
   1.167 -			snprintf(buffer, sizeof buffer, "%s%s", install_root,
   1.168 -				 name);
   1.169 -			retval = remove(buffer);
   1.170 -		}
   1.171 -	}
   1.172 -
   1.173 -	razor_file_iterator_destroy(fi);
   1.174 -	return retval;
   1.175 -}
   1.176 -
   1.177 -static int
   1.178 -update_packages(struct razor_set *system, struct razor_set *next,
   1.179 -		struct razor_relocations *relocations)
   1.180 +update_packages(struct razor_transaction *trans, struct razor_set *system,
   1.181 +		struct razor_set *next, struct razor_relocations *relocations)
   1.182  {
   1.183  	struct razor_install_iterator *ii;
   1.184  	struct razor_package *package;
   1.185 @@ -903,9 +928,11 @@
   1.186  	while (!retval && razor_install_iterator_next(ii, &set, &package,
   1.187  						      &action, &count)) {
   1.188  		if (action == RAZOR_INSTALL_ACTION_ADD)
   1.189 -			retval = install_package(set, package, relocations);
   1.190 +			retval = install_package(trans, set, package,
   1.191 +						 relocations);
   1.192  		else if (action == RAZOR_INSTALL_ACTION_REMOVE)
   1.193 -			retval = remove_package(set, package);
   1.194 +			retval = razor_package_remove(set, package,
   1.195 +						      install_root);
   1.196  	}
   1.197  	razor_install_iterator_destroy(ii);
   1.198  
   1.199 @@ -974,6 +1001,7 @@
   1.200  	for (; i < argc; i++) {
   1.201  		if (mark_packages_for_update(trans, upstream, argv[i]) == 0) {
   1.202  			fprintf(stderr, "no package matched %s\n", argv[i]);
   1.203 +			razor_transaction_destroy(trans);
   1.204  			razor_root_close(root);
   1.205  			return 1;
   1.206  		}
   1.207 @@ -982,28 +1010,32 @@
   1.208  	if (dependencies) {
   1.209  		razor_transaction_resolve(trans);
   1.210  		if (razor_transaction_describe(trans) > 0) {
   1.211 +			razor_transaction_destroy(trans);
   1.212  			razor_root_close(root);
   1.213  			return 1;
   1.214  		}
   1.215  	}
   1.216  
   1.217 -	next = razor_transaction_finish(trans);
   1.218 -
   1.219 -	razor_root_update(root, next);
   1.220 +	next = razor_transaction_commit(trans);
   1.221  
   1.222  	if (mkdir("rpms", 0777) && errno != EEXIST) {
   1.223  		fprintf(stderr, "failed to create rpms directory.\n");
   1.224 +		razor_transaction_destroy(trans);
   1.225  		razor_root_close(root);
   1.226  		return 1;
   1.227  	}
   1.228  
   1.229  	if (download_packages(system, next) < 0) {
   1.230 +		razor_transaction_destroy(trans);
   1.231  		razor_root_close(root);
   1.232                  return 1;
   1.233          }
   1.234  
   1.235 -	update_packages(system, next, relocations);
   1.236 +	update_packages(trans, system, next, relocations);
   1.237  
   1.238 +	razor_root_update(root, next);
   1.239 +
   1.240 +	razor_transaction_destroy(trans);
   1.241  	if (relocations)
   1.242  		razor_relocations_destroy(relocations);
   1.243  	razor_set_destroy(next);
   1.244 @@ -1167,6 +1199,7 @@
   1.245  	{ "list-provides", "list all provides for the given package", command_list_provides },
   1.246  	{ "list-obsoletes", "list all obsoletes for the given package", command_list_obsoletes },
   1.247  	{ "list-conflicts", "list all conflicts for the given package", command_list_conflicts },
   1.248 +	{ "list-scripts", "list all scripts for the given package", command_list_scripts },
   1.249  	{ "list-files", "list files for package set", command_list_files },
   1.250  	{ "list-file-packages", "list packages owning file", command_list_file_packages },
   1.251  	{ "list-package-files", "list files in package", command_list_package_files },