rhughes@241: /* rhughes@241: * Copyright (C) 2008 Kristian Høgsberg rhughes@241: * Copyright (C) 2008 Red Hat, Inc rhughes@241: * rhughes@241: * This program is free software; you can redistribute it and/or modify rhughes@241: * it under the terms of the GNU General Public License as published by rhughes@241: * the Free Software Foundation; either version 2 of the License, or rhughes@241: * (at your option) any later version. rhughes@241: * rhughes@241: * This program is distributed in the hope that it will be useful, rhughes@241: * but WITHOUT ANY WARRANTY; without even the implied warranty of rhughes@241: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the rhughes@241: * GNU General Public License for more details. rhughes@241: * rhughes@241: * You should have received a copy of the GNU General Public License along rhughes@241: * with this program; if not, write to the Free Software Foundation, Inc., rhughes@241: * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. rhughes@241: */ rhughes@241: rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include rhughes@241: #include "razor.h" rhughes@241: rhughes@241: static const char system_repo_filename[] = "system.repo"; rhughes@241: static const char next_repo_filename[] = "system-next.repo"; rhughes@241: static const char rawhide_repo_filename[] = "rawhide.repo"; rhughes@241: static const char updated_repo_filename[] = "system-updated.repo"; rhughes@241: static const char install_root[] = "install"; rhughes@241: static const char *repo_filename = system_repo_filename; rhughes@241: static const char *yum_url; rhughes@241: rhughes@241: static int rhughes@241: command_list(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *pattern, *name, *version, *arch; rhughes@241: int only_names = 0, i = 0; rhughes@241: rhughes@241: if (i < argc && strcmp(argv[i], "--only-names") == 0) { rhughes@241: only_names = 1; rhughes@241: i++; rhughes@241: } rhughes@241: rhughes@241: pattern = argv[i]; rhughes@241: set = razor_set_open(repo_filename); rhughes@241: pi = razor_package_iterator_create(set); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) { rhughes@241: if (pattern && fnmatch(pattern, name, 0) != 0) rhughes@241: continue; rhughes@241: rhughes@241: if (only_names) rhughes@241: printf("%s\n", name); rhughes@241: else rhughes@241: printf("%s-%s.%s\n", name, version, arch); rhughes@241: } rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int krh@247: list_properties(const char *package_name, uint32_t type) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: struct razor_property *property; rhughes@241: struct razor_package *package; rhughes@241: struct razor_property_iterator *pi; rhughes@241: const char *name, *version; krh@247: uint32_t flags; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (package_name) rhughes@241: package = razor_set_get_package(set, package_name); rhughes@241: else rhughes@241: package = NULL; rhughes@241: rhughes@241: pi = razor_property_iterator_create(set, package); rhughes@241: while (razor_property_iterator_next(pi, &property, krh@247: &name, &flags, &version)) { krh@247: if ((flags & RAZOR_PROPERTY_TYPE_MASK) != type) rhughes@241: continue; krh@247: printf("%s", name); krh@247: if (version[0] != '\0') krh@247: printf(" %s %s", krh@247: razor_property_relation_to_string(property), krh@247: version); krh@247: krh@247: if (flags & ~(RAZOR_PROPERTY_RELATION_MASK | RAZOR_PROPERTY_TYPE_MASK)) { krh@247: printf(" ["); krh@247: if (flags & RAZOR_PROPERTY_PRE) krh@247: printf(" pre"); krh@247: if (flags & RAZOR_PROPERTY_POST) krh@247: printf(" post"); krh@247: if (flags & RAZOR_PROPERTY_PREUN) krh@247: printf(" preun"); krh@247: if (flags & RAZOR_PROPERTY_POSTUN) krh@247: printf(" postun"); krh@247: printf(" ]"); krh@247: } krh@247: printf("\n"); rhughes@241: } rhughes@241: razor_property_iterator_destroy(pi); rhughes@241: rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_requires(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_properties(argv[0], RAZOR_PROPERTY_REQUIRES); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_provides(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_properties(argv[0], RAZOR_PROPERTY_PROVIDES); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_obsoletes(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_properties(argv[0], RAZOR_PROPERTY_OBSOLETES); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_conflicts(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_properties(argv[0], RAZOR_PROPERTY_CONFLICTS); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_files(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: razor_set_list_files(set, argv[0]); rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_file_packages(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *name, *version, *arch; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: pi = razor_package_iterator_create_for_file(set, argv[0]); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) rhughes@241: printf("%s-%s\n", name, version); rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_list_package_files(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: razor_set_list_package_files(set, argv[0]); rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static void rhughes@241: list_packages_for_property(struct razor_set *set, rhughes@241: struct razor_property *property) rhughes@241: { rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *name, *version, *arch; rhughes@241: rhughes@241: pi = razor_package_iterator_create_for_property(set, property); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) rhughes@241: printf("%s-%s.%s\n", name, version, arch); rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: list_property_packages(const char *ref_name, rhughes@241: const char *ref_version, krh@247: uint32_t type) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: struct razor_property *property; rhughes@241: struct razor_property_iterator *pi; rhughes@241: const char *name, *version; krh@247: uint32_t flags; rhughes@241: rhughes@241: if (ref_name == NULL) rhughes@241: return 0; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: pi = razor_property_iterator_create(set, NULL); rhughes@241: while (razor_property_iterator_next(pi, &property, krh@247: &name, &flags, &version)) { rhughes@241: if (strcmp(ref_name, name) != 0) rhughes@241: continue; krh@247: if (ref_version && krh@247: (flags & RAZOR_PROPERTY_RELATION_MASK) == RAZOR_PROPERTY_EQUAL && rhughes@241: strcmp(ref_version, version) != 0) rhughes@241: continue; krh@247: if ((flags & RAZOR_PROPERTY_TYPE_MASK) != type) rhughes@241: continue; rhughes@241: rhughes@241: list_packages_for_property(set, property); rhughes@241: } rhughes@241: razor_property_iterator_destroy(pi); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_what_requires(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_property_packages(argv[0], argv[1], rhughes@241: RAZOR_PROPERTY_REQUIRES); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_what_provides(int argc, const char *argv[]) rhughes@241: { rhughes@241: return list_property_packages(argv[0], argv[1], rhughes@241: RAZOR_PROPERTY_PROVIDES); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: show_progress(void *clientp, rhughes@241: double dltotal, double dlnow, double ultotal, double ulnow) rhughes@241: { rhughes@241: const char *file = clientp; rhughes@241: rhughes@241: if (!dlnow < dltotal) rhughes@241: fprintf(stderr, "\rdownloading %s, %dkB/%dkB", rhughes@241: file, (int) dlnow / 1024, (int) dltotal / 1024); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: download_if_missing(const char *url, const char *file) rhughes@241: { rhughes@241: CURL *curl; rhughes@241: struct stat buf; rhughes@241: char error[256]; rhughes@241: FILE *fp; rhughes@241: CURLcode res; rhughes@241: long response; rhughes@241: rhughes@241: curl = curl_easy_init(); rhughes@241: if (curl == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error); rhughes@241: curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); rhughes@241: curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, show_progress); rhughes@241: curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, file); rhughes@241: rhughes@241: if (stat(file, &buf) < 0) { rhughes@241: fp = fopen(file, "w"); rhughes@241: if (fp == NULL) { rhughes@241: fprintf(stderr, rhughes@241: "failed to open %s for writing\n", file); rhughes@241: return -1; rhughes@241: } rhughes@241: curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); rhughes@241: curl_easy_setopt(curl, CURLOPT_URL, url); rhughes@241: res = curl_easy_perform(curl); rhughes@241: fclose(fp); rhughes@241: if (res != CURLE_OK) { rhughes@241: fprintf(stderr, "curl error: %s\n", error); rhughes@241: unlink(file); rhughes@241: return -1; rhughes@241: } rhughes@241: res = curl_easy_getinfo(curl, rhughes@241: CURLINFO_RESPONSE_CODE, &response); rhughes@241: if (res != CURLE_OK) { rhughes@241: fprintf(stderr, "curl error: %s\n", error); rhughes@241: unlink(file); rhughes@241: return -1; rhughes@241: } rhughes@241: if (response != 200) { rhughes@241: fprintf(stderr, " - failed %ld\n", response); rhughes@241: unlink(file); rhughes@241: return -1; rhughes@241: } rhughes@241: fprintf(stderr, "\n"); rhughes@241: } rhughes@241: rhughes@241: curl_easy_cleanup(curl); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: #define YUM_URL "http://download.fedora.redhat.com" \ rhughes@241: "/pub/fedora/linux/development/i386/os" rhughes@241: rhughes@241: static int rhughes@241: command_import_yum(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: char buffer[512]; rhughes@241: rhughes@241: printf("downloading from %s.\n", yum_url); rhughes@241: snprintf(buffer, sizeof buffer, rhughes@241: "%s/repodata/primary.xml.gz", yum_url); rhughes@241: if (download_if_missing(buffer, "primary.xml.gz") < 0) rhughes@241: return -1; rhughes@241: snprintf(buffer, sizeof buffer, rhughes@241: "%s/repodata/filelists.xml.gz", yum_url); rhughes@241: if (download_if_missing(buffer, "filelists.xml.gz") < 0) rhughes@241: return -1; rhughes@241: rhughes@241: set = razor_set_create_from_yum(); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: razor_set_write(set, rawhide_repo_filename); rhughes@241: razor_set_destroy(set); rhughes@241: printf("wrote %s\n", rawhide_repo_filename); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_import_rpmdb(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: rhughes@241: set = razor_set_create_from_rpmdb(); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: razor_set_write(set, repo_filename); rhughes@241: razor_set_destroy(set); rhughes@241: printf("wrote %s\n", repo_filename); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: mark_packages_for_update(struct razor_transaction *trans, rhughes@241: struct razor_set *set, const char *pattern) rhughes@241: { rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *name, *version, *arch; rhughes@241: int matches = 0; rhughes@241: rhughes@241: pi = razor_package_iterator_create(set); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) { rhughes@241: if (pattern && fnmatch(pattern, name, 0) == 0) { rhughes@241: razor_transaction_update_package(trans, package); rhughes@241: matches++; rhughes@241: } rhughes@241: } rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: rhughes@241: return matches; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: mark_packages_for_removal(struct razor_transaction *trans, rhughes@241: struct razor_set *set, const char *pattern) rhughes@241: { rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *name, *version, *arch; rhughes@241: int matches = 0; rhughes@241: rhughes@241: pi = razor_package_iterator_create(set); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) { rhughes@241: if (pattern && fnmatch(pattern, name, 0) == 0) { rhughes@241: razor_transaction_remove_package(trans, package); rhughes@241: matches++; rhughes@241: } rhughes@241: } rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: rhughes@241: return matches; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_update(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set, *upstream; rhughes@241: struct razor_transaction *trans; rhughes@241: int i, errors; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: upstream = razor_set_open(rawhide_repo_filename); rhughes@241: if (set == NULL || upstream == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: trans = razor_transaction_create(set, upstream); rhughes@241: if (argc == 0) rhughes@241: razor_transaction_update_all(trans); rhughes@241: for (i = 0; i < argc; i++) { rhughes@241: if (mark_packages_for_update(trans, set, argv[i]) == 0) { rhughes@241: fprintf(stderr, "no match for %s\n", argv[i]); rhughes@241: return 1; rhughes@241: } rhughes@241: } rhughes@241: rhughes@241: errors = razor_transaction_resolve(trans); rhughes@241: if (errors) rhughes@241: return 1; rhughes@241: rhughes@241: set = razor_transaction_finish(trans); rhughes@241: razor_set_write(set, updated_repo_filename); rhughes@241: razor_set_destroy(set); rhughes@241: razor_set_destroy(upstream); rhughes@241: printf("wrote system-updated.repo\n"); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_remove(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set, *upstream; rhughes@241: struct razor_transaction *trans; rhughes@241: int i, errors; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: if (set == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: upstream = razor_set_create(); rhughes@241: trans = razor_transaction_create(set, upstream); rhughes@241: for (i = 0; i < argc; i++) { rhughes@241: if (mark_packages_for_removal(trans, set, argv[i]) == 0) { rhughes@241: fprintf(stderr, "no match for %s\n", argv[i]); rhughes@241: return 1; rhughes@241: } rhughes@241: } rhughes@241: rhughes@241: errors = razor_transaction_resolve(trans); rhughes@241: if (errors) rhughes@241: return 1; rhughes@241: rhughes@241: set = razor_transaction_finish(trans); rhughes@241: razor_set_write(set, updated_repo_filename); rhughes@241: razor_set_destroy(set); rhughes@241: razor_set_destroy(upstream); rhughes@241: printf("wrote system-updated.repo\n"); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static void rhughes@241: print_diff(const char *name, rhughes@241: const char *old_version, const char *new_version, const char *arch, rhughes@241: void *data) rhughes@241: { rhughes@241: if (old_version) rhughes@241: printf("removing %s %s\n", name, old_version); rhughes@241: else rhughes@241: printf("install %s %s\n", name, new_version); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_diff(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set, *updated; rhughes@241: rhughes@241: set = razor_set_open(repo_filename); rhughes@241: updated = razor_set_open(updated_repo_filename); rhughes@241: if (set == NULL || updated == NULL) rhughes@241: return 1; rhughes@241: rhughes@241: razor_set_diff(set, updated, print_diff, NULL); rhughes@241: rhughes@241: razor_set_destroy(set); rhughes@241: razor_set_destroy(updated); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_import_rpms(int argc, const char *argv[]) rhughes@241: { rhughes@241: DIR *dir; rhughes@241: struct dirent *de; rhughes@241: struct razor_importer *importer; rhughes@241: struct razor_set *set; rhughes@241: struct razor_rpm *rpm; rhughes@241: int len; rhughes@241: char filename[256]; rhughes@241: const char *dirname = argv[0]; rhughes@241: rhughes@241: if (dirname == NULL) { rhughes@241: fprintf(stderr, "usage: razor import-rpms DIR\n"); rhughes@241: return -1; rhughes@241: } rhughes@241: rhughes@241: dir = opendir(dirname); rhughes@241: if (dir == NULL) { rhughes@241: fprintf(stderr, "couldn't read dir %s\n", dirname); rhughes@241: return -1; rhughes@241: } rhughes@241: krh@249: importer = razor_importer_create(); rhughes@241: rhughes@241: while (de = readdir(dir), de != NULL) { rhughes@241: len = strlen(de->d_name); rhughes@241: if (len < 5 || strcmp(de->d_name + len - 4, ".rpm") != 0) rhughes@241: continue; rhughes@241: snprintf(filename, sizeof filename, rhughes@241: "%s/%s", dirname, de->d_name); rhughes@241: rpm = razor_rpm_open(filename); rhughes@241: if (rpm == NULL) { rhughes@241: fprintf(stderr, rhughes@241: "failed to open rpm \"%s\"\n", filename); rhughes@241: continue; rhughes@241: } rhughes@241: if (razor_importer_add_rpm(importer, rpm)) { rhughes@241: fprintf(stderr, "couldn't import %s\n", filename); rhughes@241: break; rhughes@241: } rhughes@241: razor_rpm_close(rpm); rhughes@241: } rhughes@241: rhughes@241: if (de != NULL) { rhughes@241: razor_importer_destroy(importer); rhughes@241: return -1; rhughes@241: } rhughes@241: rhughes@241: set = razor_importer_finish(importer); rhughes@241: rhughes@241: razor_set_write(set, repo_filename); rhughes@241: razor_set_destroy(set); rhughes@241: printf("wrote %s\n", repo_filename); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static void rhughes@241: download_package(const char *name, rhughes@241: const char *old_version, rhughes@241: const char *new_version, rhughes@241: const char *arch, rhughes@241: void *data) rhughes@241: { rhughes@241: char file[PATH_MAX], url[256]; rhughes@241: const char *v; rhughes@241: int *errors = data; rhughes@241: rhughes@241: if (old_version) rhughes@241: return; rhughes@241: rhughes@241: /* Skip epoch */ rhughes@241: v = strchr(new_version, ':'); rhughes@241: if (v != NULL) rhughes@241: v = v + 1; rhughes@241: else rhughes@241: v = new_version; rhughes@241: rhughes@241: snprintf(url, sizeof url, rhughes@241: "%s/Packages/%s-%s.%s.rpm", yum_url, name, v, arch); rhughes@241: snprintf(file, sizeof file, rhughes@241: "rpms/%s-%s.%s.rpm", name, v, arch); rhughes@241: if (download_if_missing(url, file) < 0) rhughes@241: (*errors)++; rhughes@241: } rhughes@241: rhughes@241: static void rhughes@241: install_package(const char *name, rhughes@241: const char *old_version, rhughes@241: const char *new_version, rhughes@241: const char *arch, rhughes@241: void *data) rhughes@241: { rhughes@241: const char *v, *root = data; rhughes@241: char file[PATH_MAX]; rhughes@241: struct razor_rpm *rpm; rhughes@241: rhughes@241: if (old_version) { rhughes@241: printf("removing %s %s not handled\n", name, old_version); rhughes@241: return; rhughes@241: } rhughes@241: rhughes@241: /* Skip epoch */ rhughes@241: v = strchr(new_version, ':'); rhughes@241: if (v != NULL) rhughes@241: v = v + 1; rhughes@241: else rhughes@241: v = new_version; rhughes@241: rhughes@241: printf("install %s %s\n", name, v); rhughes@241: snprintf(file, sizeof file, "rpms/%s-%s.%s.rpm", name, v, arch); rhughes@241: rhughes@241: rpm = razor_rpm_open(file); rhughes@241: if (rpm == NULL) { rhughes@241: fprintf(stderr, "failed to open rpm %s\n", file); rhughes@241: return; rhughes@241: } rhughes@241: if (razor_rpm_install(rpm, root) < 0) { rhughes@241: fprintf(stderr, rhughes@241: "failed to install rpm %s\n", file); rhughes@241: return; rhughes@241: } rhughes@241: razor_rpm_close(rpm); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_install(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_root *root; rhughes@241: struct razor_set *upstream, *next; rhughes@241: struct razor_transaction *trans; rhughes@241: int i = 0, errors, dependencies = 1; rhughes@241: rhughes@241: if (i < argc && strcmp(argv[i], "--no-dependencies") == 0) { rhughes@241: dependencies = 0; rhughes@241: i++; rhughes@241: } rhughes@241: rhughes@241: root = razor_root_open(install_root, RAZOR_ROOT_OPEN_WRITE); rhughes@241: upstream = razor_set_open(rawhide_repo_filename); rhughes@241: trans = razor_root_create_transaction(root, upstream); rhughes@241: rhughes@241: for (; i < argc; i++) { rhughes@241: if (mark_packages_for_update(trans, upstream, argv[i]) == 0) { rhughes@241: fprintf(stderr, "no package matched %s\n", argv[i]); rhughes@241: razor_root_close(root); rhughes@241: return 1; rhughes@241: } rhughes@241: } rhughes@241: rhughes@241: if (dependencies) { krh@245: razor_transaction_resolve(trans); krh@245: if (razor_transaction_describe(trans) > 0) { rhughes@241: razor_root_close(root); rhughes@241: return 1; rhughes@241: } rhughes@241: } rhughes@241: rhughes@241: next = razor_transaction_finish(trans); rhughes@241: rhughes@241: razor_root_update(root, next); rhughes@241: rhughes@241: if (mkdir("rpms", 0777) && errno != EEXIST) { rhughes@241: fprintf(stderr, "failed to create rpms directory.\n"); rhughes@241: razor_root_close(root); rhughes@241: return 1; rhughes@241: } rhughes@241: krh@245: errors = 0; rhughes@241: razor_root_diff(root, download_package, &errors); rhughes@241: if (errors > 0) { rhughes@241: fprintf(stderr, "failed to download %d packages\n", errors); rhughes@241: razor_root_close(root); rhughes@241: return 1; rhughes@241: } rhughes@241: rhughes@241: /* FIXME: We need to figure out the right install order here, rhughes@241: * so the post and pre scripts can run. */ krh@245: razor_root_diff(root, install_package, (void *) install_root); rhughes@241: rhughes@241: razor_set_destroy(next); rhughes@241: razor_set_destroy(upstream); rhughes@241: rhughes@241: return razor_root_commit(root); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_init(int argc, const char *argv[]) rhughes@241: { rhughes@241: return razor_root_create(install_root); rhughes@241: } rhughes@241: rhughes@241: static int rhughes@241: command_download(int argc, const char *argv[]) rhughes@241: { rhughes@241: struct razor_set *set; rhughes@241: struct razor_package_iterator *pi; rhughes@241: struct razor_package *package; rhughes@241: const char *pattern = argv[0], *name, *version, *arch; rhughes@241: char url[256], file[256]; rhughes@241: int matches = 0; rhughes@241: rhughes@241: if (mkdir("rpms", 0777) && errno != EEXIST) { rhughes@241: fprintf(stderr, "failed to create rpms directory.\n"); rhughes@241: return 1; rhughes@241: } rhughes@241: rhughes@241: set = razor_set_open(rawhide_repo_filename); rhughes@241: pi = razor_package_iterator_create(set); rhughes@241: while (razor_package_iterator_next(pi, &package, rhughes@241: &name, &version, &arch)) { rhughes@241: if (pattern && fnmatch(pattern, name, 0) != 0) rhughes@241: continue; rhughes@241: rhughes@241: matches++; rhughes@241: snprintf(url, sizeof url, rhughes@241: "%s/Packages/%s-%s.%s.rpm", rhughes@241: yum_url, name, version, arch); rhughes@241: snprintf(file, sizeof file, rhughes@241: "rpms/%s-%s.%s.rpm", name, version, arch); rhughes@241: download_if_missing(url, file); rhughes@241: } rhughes@241: razor_package_iterator_destroy(pi); rhughes@241: razor_set_destroy(set); rhughes@241: rhughes@241: if (matches == 0) rhughes@241: fprintf(stderr, "no packages matched \"%s\"\n", pattern); rhughes@241: else if (matches == 1) rhughes@241: fprintf(stderr, "downloaded 1 package\n"); rhughes@241: else rhughes@241: fprintf(stderr, "downloaded %d packages\n", matches); rhughes@241: rhughes@241: return 0; rhughes@241: } rhughes@241: rhughes@241: static struct { rhughes@241: const char *name; rhughes@241: const char *description; rhughes@241: int (*func)(int argc, const char *argv[]); rhughes@241: } razor_commands[] = { rhughes@241: { "list", "list all packages", command_list }, rhughes@241: { "list-requires", "list all requires for the given package", command_list_requires }, rhughes@241: { "list-provides", "list all provides for the given package", command_list_provides }, rhughes@241: { "list-obsoletes", "list all obsoletes for the given package", command_list_obsoletes }, rhughes@241: { "list-conflicts", "list all conflicts for the given package", command_list_conflicts }, rhughes@241: { "list-files", "list files for package set", command_list_files }, rhughes@241: { "list-file-packages", "list packages owning file", command_list_file_packages }, rhughes@241: { "list-package-files", "list files in package", command_list_package_files }, rhughes@241: { "what-requires", "list the packages that have the given requires", command_what_requires }, rhughes@241: { "what-provides", "list the packages that have the given provides", command_what_provides }, rhughes@241: { "import-yum", "import yum metadata files", command_import_yum }, rhughes@241: { "import-rpmdb", "import the system rpm database", command_import_rpmdb }, rhughes@241: { "import-rpms", "import rpms from the given directory", command_import_rpms }, rhughes@241: { "update", "update all or specified packages", command_update }, rhughes@241: { "remove", "remove specified packages", command_remove }, rhughes@241: { "diff", "show diff between two package sets", command_diff }, rhughes@241: { "install", "install rpm", command_install }, rhughes@241: { "init", "init razor root", command_init }, rhughes@241: { "download", "download packages", command_download } rhughes@241: }; rhughes@241: rhughes@241: static int rhughes@241: usage(void) rhughes@241: { rhughes@241: int i; rhughes@241: rhughes@241: printf("usage:\n"); rhughes@241: for (i = 0; i < ARRAY_SIZE(razor_commands); i++) rhughes@241: printf(" %-20s%s\n", rhughes@241: razor_commands[i].name, razor_commands[i].description); rhughes@241: rhughes@241: return 1; rhughes@241: } rhughes@241: rhughes@241: int rhughes@241: main(int argc, const char *argv[]) rhughes@241: { rhughes@241: char *repo; rhughes@241: int i; rhughes@241: rhughes@241: repo = getenv("RAZOR_REPO"); rhughes@241: if (repo != NULL) rhughes@241: repo_filename = repo; rhughes@241: rhughes@241: yum_url = getenv("YUM_URL"); rhughes@241: if (yum_url == NULL) rhughes@241: yum_url = YUM_URL; rhughes@241: rhughes@241: if (argc < 2) rhughes@241: return usage(); rhughes@241: rhughes@241: for (i = 0; i < ARRAY_SIZE(razor_commands); i++) rhughes@241: if (strcmp(razor_commands[i].name, argv[1]) == 0) rhughes@241: return razor_commands[i].func(argc - 2, argv + 2); rhughes@241: rhughes@241: return usage(); rhughes@241: }