main.c
author Kristian H?gsberg <krh@redhat.com>
Mon Nov 05 21:55:31 2007 -0500 (2007-11-05)
changeset 72 4fddfa5f29fa
parent 71 befb5208c022
child 73 0ff316e24339
permissions -rw-r--r--
Only download yum files if they're not there.
krh@43
     1
#include <stdlib.h>
krh@43
     2
#include <stddef.h>
krh@43
     3
#include <stdio.h>
krh@43
     4
#include <string.h>
krh@72
     5
#include <sys/types.h>
krh@72
     6
#include <sys/stat.h>
krh@43
     7
#include <unistd.h>
krh@43
     8
krh@71
     9
#include <curl/curl.h>
krh@43
    10
#include "razor.h"
krh@43
    11
krh@43
    12
static const char *repo_filename = "system.repo";
krh@44
    13
static const char *rawhide_repo_filename = "rawhide.repo";
krh@44
    14
static const char *updated_repo_filename = "system-updated.repo";
krh@43
    15
krh@43
    16
static int
krh@43
    17
command_list(int argc, const char *argv[])
krh@43
    18
{
krh@43
    19
	struct razor_set *set;
krh@43
    20
krh@43
    21
	set = razor_set_open(repo_filename);
krh@54
    22
	razor_set_list(set, argv[0]);
krh@43
    23
	razor_set_destroy(set);
krh@43
    24
krh@43
    25
	return 0;
krh@43
    26
}
krh@43
    27
krh@43
    28
static int
krh@43
    29
command_list_requires(int argc, const char *argv[])
krh@43
    30
{
krh@43
    31
	struct razor_set *set;
krh@43
    32
krh@43
    33
	set = razor_set_open(repo_filename);
krh@66
    34
	razor_set_list_properties(set, argv[0], RAZOR_PROPERTY_REQUIRES);
krh@43
    35
	razor_set_destroy(set);
krh@43
    36
krh@43
    37
	return 0;
krh@43
    38
}
krh@43
    39
krh@43
    40
static int
krh@43
    41
command_list_provides(int argc, const char *argv[])
krh@43
    42
{
krh@43
    43
	struct razor_set *set;
krh@43
    44
krh@43
    45
	set = razor_set_open(repo_filename);
krh@66
    46
	razor_set_list_properties(set, argv[0], RAZOR_PROPERTY_PROVIDES);
krh@43
    47
	razor_set_destroy(set);
krh@43
    48
krh@43
    49
	return 0;
krh@43
    50
}
krh@43
    51
krh@43
    52
static int
krh@67
    53
command_list_obsoletes(int argc, const char *argv[])
krh@67
    54
{
krh@67
    55
	struct razor_set *set;
krh@67
    56
krh@67
    57
	set = razor_set_open(repo_filename);
krh@67
    58
	razor_set_list_properties(set, argv[0], RAZOR_PROPERTY_OBSOLETES);
krh@67
    59
	razor_set_destroy(set);
krh@67
    60
krh@67
    61
	return 0;
krh@67
    62
}
krh@67
    63
krh@67
    64
static int
krh@67
    65
command_list_conflicts(int argc, const char *argv[])
krh@67
    66
{
krh@67
    67
	struct razor_set *set;
krh@67
    68
krh@67
    69
	set = razor_set_open(repo_filename);
krh@67
    70
	razor_set_list_properties(set, argv[0], RAZOR_PROPERTY_CONFLICTS);
krh@67
    71
	razor_set_destroy(set);
krh@67
    72
krh@67
    73
	return 0;
krh@67
    74
}
krh@67
    75
krh@67
    76
static int
krh@48
    77
command_list_files(int argc, const char *argv[])
krh@48
    78
{
krh@48
    79
	struct razor_set *set;
krh@48
    80
krh@48
    81
	set = razor_set_open(repo_filename);
krh@48
    82
	if (set == NULL)
krh@48
    83
		return 1;
krh@49
    84
	razor_set_list_files(set, argv[0]);
krh@48
    85
	razor_set_destroy(set);
krh@48
    86
krh@48
    87
	return 0;
krh@48
    88
}
krh@48
    89
krh@48
    90
static int
krh@52
    91
command_list_file_packages(int argc, const char *argv[])
krh@52
    92
{
krh@52
    93
	struct razor_set *set;
krh@52
    94
krh@52
    95
	set = razor_set_open(repo_filename);
krh@52
    96
	if (set == NULL)
krh@52
    97
		return 1;
krh@52
    98
	razor_set_list_file_packages(set, argv[0]);
krh@52
    99
	razor_set_destroy(set);
krh@52
   100
krh@52
   101
	return 0;
krh@52
   102
}
krh@52
   103
krh@56
   104
static int
krh@56
   105
command_list_package_files(int argc, const char *argv[])
krh@56
   106
{
krh@56
   107
	struct razor_set *set;
krh@56
   108
krh@56
   109
	set = razor_set_open(repo_filename);
krh@56
   110
	if (set == NULL)
krh@56
   111
		return 1;
krh@56
   112
	razor_set_list_package_files(set, argv[0]);
krh@56
   113
	razor_set_destroy(set);
krh@56
   114
krh@56
   115
	return 0;
krh@56
   116
}
krh@52
   117
krh@52
   118
static int
krh@43
   119
command_what_requires(int argc, const char *argv[])
krh@43
   120
{
krh@43
   121
	struct razor_set *set;
krh@43
   122
krh@43
   123
	set = razor_set_open(repo_filename);
krh@66
   124
	razor_set_list_property_packages(set, argv[0], argv[1],
krh@66
   125
					 RAZOR_PROPERTY_REQUIRES);
krh@43
   126
	razor_set_destroy(set);
krh@43
   127
krh@43
   128
	return 0;
krh@43
   129
}
krh@43
   130
krh@43
   131
static int
krh@43
   132
command_what_provides(int argc, const char *argv[])
krh@43
   133
{
krh@43
   134
	struct razor_set *set;
krh@43
   135
krh@43
   136
	set = razor_set_open(repo_filename);
krh@66
   137
	razor_set_list_property_packages(set, argv[0], argv[1],
krh@66
   138
					 RAZOR_PROPERTY_PROVIDES);
krh@43
   139
	razor_set_destroy(set);
krh@43
   140
krh@43
   141
	return 0;
krh@43
   142
}
krh@43
   143
krh@71
   144
#define REPO_URL "http://download.fedora.redhat.com" \
krh@71
   145
	"/pub/fedora/linux/development/i386/os/repodata"
krh@71
   146
krh@43
   147
static int
krh@43
   148
command_import_yum(int argc, const char *argv[])
krh@43
   149
{
krh@43
   150
	struct razor_set *set;
krh@71
   151
	CURL *curl;
krh@71
   152
	CURLcode res;
krh@71
   153
	FILE *fp;
krh@72
   154
	struct stat buf;
krh@71
   155
krh@71
   156
	curl = curl_easy_init();
krh@71
   157
	if (curl == NULL)
krh@71
   158
		return 1;
krh@71
   159
krh@72
   160
	if (stat("primary.xml.gz", &buf) < 0) {
krh@72
   161
		curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
krh@72
   162
		fp = fopen("primary.xml.gz", "w");
krh@72
   163
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
krh@72
   164
		curl_easy_setopt(curl, CURLOPT_URL,
krh@72
   165
				 REPO_URL "/primary.xml.gz");
krh@72
   166
		res = curl_easy_perform(curl);
krh@72
   167
		fclose(fp);
krh@72
   168
	}
krh@71
   169
krh@72
   170
	if (stat("filelist.xml.gz", &buf) < 0) {
krh@72
   171
		fp = fopen("filelists.xml.gz", "w");
krh@72
   172
		curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
krh@72
   173
		curl_easy_setopt(curl, CURLOPT_URL,
krh@72
   174
				 REPO_URL "/filelists.xml.gz");
krh@72
   175
		res = curl_easy_perform(curl);
krh@72
   176
		fclose(fp);
krh@72
   177
	}
krh@71
   178
krh@71
   179
	curl_easy_cleanup(curl);
krh@43
   180
krh@70
   181
	set = razor_set_create_from_yum();
krh@43
   182
	if (set == NULL)
krh@43
   183
		return 1;
krh@43
   184
	razor_set_write(set, rawhide_repo_filename);
krh@43
   185
	razor_set_destroy(set);
krh@43
   186
	printf("wrote %s\n", rawhide_repo_filename);
krh@43
   187
krh@43
   188
	return 0;
krh@43
   189
}
krh@43
   190
krh@43
   191
static int
krh@43
   192
command_import_rpmdb(int argc, const char *argv[])
krh@43
   193
{
krh@43
   194
	struct razor_set *set;
krh@43
   195
krh@43
   196
	set = razor_set_create_from_rpmdb();
krh@43
   197
	if (set == NULL)
krh@43
   198
		return 1;
krh@43
   199
	razor_set_write(set, repo_filename);
krh@43
   200
	razor_set_destroy(set);
krh@43
   201
	printf("wrote %s\n", repo_filename);
krh@43
   202
krh@43
   203
	return 0;
krh@43
   204
}
krh@43
   205
krh@43
   206
static int
krh@43
   207
command_validate(int argc, const char *argv[])
krh@43
   208
{
krh@43
   209
	struct razor_set *set;
krh@43
   210
krh@43
   211
	set = razor_set_open(repo_filename);
krh@43
   212
	if (set == NULL)
krh@43
   213
		return 1;
krh@43
   214
	razor_set_list_unsatisfied(set);
krh@43
   215
	razor_set_destroy(set);
krh@43
   216
krh@43
   217
	return 0;
krh@43
   218
}
krh@43
   219
krh@43
   220
static int
krh@43
   221
command_update(int argc, const char *argv[])
krh@43
   222
{
krh@43
   223
	struct razor_set *set, *upstream;
krh@43
   224
krh@43
   225
	set = razor_set_open(repo_filename);
krh@43
   226
	upstream = razor_set_open(rawhide_repo_filename);
krh@43
   227
	if (set == NULL || upstream == NULL)
krh@43
   228
		return 1;
krh@45
   229
	set = razor_set_update(set, upstream, argc, argv);
krh@44
   230
	razor_set_write(set, updated_repo_filename);
krh@43
   231
	razor_set_destroy(set);
krh@43
   232
	razor_set_destroy(upstream);
krh@43
   233
	printf("wrote system-updated.repo\n");
krh@43
   234
krh@43
   235
	return 0;
krh@43
   236
}
krh@43
   237
krh@44
   238
static void
krh@44
   239
print_diff(const char *name,
krh@44
   240
	   const char *old_version, const char *new_version, void *data)
krh@44
   241
{
krh@44
   242
	if (old_version)
krh@44
   243
		printf("removing %s %s\n", name, old_version);
krh@44
   244
	else
krh@44
   245
		printf("install %s %s\n", name, new_version);
krh@44
   246
}
krh@44
   247
krh@44
   248
static int
krh@44
   249
command_diff(int argc, const char *argv[])
krh@44
   250
{
krh@44
   251
	struct razor_set *set, *updated;
krh@44
   252
krh@44
   253
	set = razor_set_open(repo_filename);
krh@44
   254
	updated = razor_set_open(updated_repo_filename);
krh@44
   255
	if (set == NULL || updated == NULL)
krh@44
   256
		return 1;
krh@44
   257
krh@44
   258
	razor_set_diff(set, updated, print_diff, NULL);	
krh@44
   259
krh@44
   260
	razor_set_destroy(set);
krh@44
   261
	razor_set_destroy(updated);
krh@44
   262
krh@44
   263
	return 0;
krh@44
   264
}
krh@44
   265
krh@43
   266
static struct {
krh@43
   267
	const char *name;
krh@43
   268
	const char *description;
krh@43
   269
	int (*func)(int argc, const char *argv[]);
krh@43
   270
} razor_commands[] = {
krh@43
   271
	{ "list", "list all packages", command_list },
krh@67
   272
	{ "list-requires", "list all requires for the given package", command_list_requires },
krh@67
   273
	{ "list-provides", "list all provides for the give package", command_list_provides },
krh@67
   274
	{ "list-obsoletes", "list all obsoletes for the give package", command_list_obsoletes },
krh@67
   275
	{ "list-conflicts", "list all conflicts for the give package", command_list_conflicts },
krh@48
   276
	{ "list-files", "list files for package set", command_list_files },
krh@52
   277
	{ "list-file-packages", "list packages owning file", command_list_file_packages },
krh@56
   278
	{ "list-package-files", "list files in package", command_list_package_files },
krh@43
   279
	{ "what-requires", "list the packages that have the given requires", command_what_requires },
krh@43
   280
	{ "what-provides", "list the packages that have the given provides", command_what_provides },
krh@43
   281
	{ "import-yum", "import yum filelist.xml on stdin", command_import_yum },
krh@43
   282
	{ "import-rpmdb", "import the system rpm database", command_import_rpmdb },
krh@43
   283
	{ "validate", "validate a package set", command_validate },
krh@44
   284
	{ "update", "update all or specified packages", command_update },
krh@44
   285
	{ "diff", "show diff between two package sets", command_diff }
krh@43
   286
};
krh@43
   287
krh@43
   288
static int
krh@43
   289
usage(void)
krh@43
   290
{
krh@43
   291
	int i;
krh@43
   292
krh@43
   293
	printf("usage:\n");
krh@43
   294
	for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
krh@43
   295
		printf("  %-20s%s\n",
krh@43
   296
		       razor_commands[i].name, razor_commands[i].description);
krh@43
   297
krh@43
   298
	return 1;
krh@43
   299
}
krh@43
   300
krh@43
   301
int
krh@43
   302
main(int argc, const char *argv[])
krh@43
   303
{
krh@43
   304
	char *repo;
krh@43
   305
	int i;
krh@43
   306
krh@43
   307
	repo = getenv("RAZOR_REPO");
krh@43
   308
	if (repo != NULL)
krh@43
   309
		repo_filename = repo;
krh@43
   310
krh@43
   311
	if (argc < 2)
krh@43
   312
		return usage();
krh@43
   313
krh@43
   314
	for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
krh@43
   315
		if (strcmp(razor_commands[i].name, argv[1]) == 0)
krh@43
   316
			return razor_commands[i].func(argc - 2, argv + 2);
krh@43
   317
krh@43
   318
	return usage();
krh@43
   319
}