#include #include #include #include "pool.h" #include "repo.h" #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) #include "repo_rpmdb.h" #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) #include "repo_deb.h" #endif #ifdef SUSE #include "repo_autopattern.h" #endif #include "repoinfo.h" #include "repoinfo_cache.h" #if defined(SUSE) || defined(FEDORA) || defined(MAGEIA) #include "repoinfo_config_yum.h" #endif #if defined(DEBIAN) #include "repoinfo_config_debian.h" #endif #if defined(MANDRIVA) #include "repoinfo_config_urpmi.h" #endif #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) #include "repoinfo_system_rpm.h" #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) #include "repoinfo_system_debian.h" #endif #ifdef ENABLE_RPMMD #include "repoinfo_type_rpmmd.h" #endif #ifdef ENABLE_SUSEREPO #include "repoinfo_type_susetags.h" #endif #ifdef ENABLE_DEBIAN #include "repoinfo_type_debian.h" #endif #ifdef ENABLE_MDKREPO #include "repoinfo_type_mdk.h" #endif static int repoinfos_sort_cmp(const void *ap, const void *bp) { const struct repoinfo *a = ap; const struct repoinfo *b = bp; return strcmp(a->alias, b->alias); } void sort_repoinfos(struct repoinfo *repoinfos, int nrepoinfos) { qsort(repoinfos, nrepoinfos, sizeof(*repoinfos), repoinfos_sort_cmp); } void free_repoinfos(struct repoinfo *repoinfos, int nrepoinfos) { int i, j; for (i = 0; i < nrepoinfos; i++) { struct repoinfo *cinfo = repoinfos + i; solv_free(cinfo->name); solv_free(cinfo->alias); solv_free(cinfo->path); solv_free(cinfo->metalink); solv_free(cinfo->mirrorlist); solv_free(cinfo->baseurl); for (j = 0; j < cinfo->ncomponents; j++) solv_free(cinfo->components[j]); solv_free(cinfo->components); } solv_free(repoinfos); #if defined(SUSE) || defined(FEDORA) || defined(MAGEIA) yum_substitute((Pool *)0, 0); /* free data */ #endif } struct repoinfo * read_repoinfos(Pool *pool, int *nrepoinfosp) { struct repoinfo *repoinfos = 0; #if defined(SUSE) || defined(FEDORA) || defined(MAGEIA) repoinfos = read_repoinfos_yum(pool, nrepoinfosp); #endif #if defined(MANDRIVA) repoinfos = read_repoinfos_urpmi(pool, nrepoinfosp); #endif #if defined(DEBIAN) repoinfos = read_repoinfos_debian(pool, nrepoinfosp); #endif return repoinfos; } int read_installed_repo(struct repoinfo *cinfo, Pool *pool) { int r = 1; cinfo->type = TYPE_INSTALLED; cinfo->repo = repo_create(pool, "@System"); cinfo->repo->appdata = cinfo; #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) r = read_installed_rpm(cinfo); #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) r = read_installed_debian(cinfo); #endif #ifdef SUSE repo_add_autopattern(cinfo->repo, 0); #endif pool_set_installed(pool, cinfo->repo); return r; } int is_cmdline_package(const char *filename) { int l = strlen(filename); #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) if (l > 4 && !strcmp(filename + l - 4, ".rpm")) return 1; #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) if (l > 4 && !strcmp(filename + l - 4, ".deb")) return 1; #endif return 0; } Id add_cmdline_package(Repo *repo, const char *filename) { #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) return repo_add_rpm(repo, filename, REPO_REUSE_REPODATA|REPO_NO_INTERNALIZE); #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) return repo_add_deb(repo, filename, REPO_REUSE_REPODATA|REPO_NO_INTERNALIZE); #endif return 0; } void commit_transactionelement(Pool *pool, Id type, Id p, FILE *fp) { #if defined(ENABLE_RPMDB) && (defined(SUSE) || defined(FEDORA) || defined(MANDRIVA) || defined(MAGEIA)) commit_transactionelement_rpm(pool, type, p, fp); #endif #if defined(ENABLE_DEBIAN) && defined(DEBIAN) commit_transactionelement_debian(pool, type, p, fp); #endif } void add_ext_keys(Repodata *data, Id handle, const char *ext) { static Id langtags[] = { SOLVABLE_SUMMARY, REPOKEY_TYPE_STR, SOLVABLE_DESCRIPTION, REPOKEY_TYPE_STR, SOLVABLE_EULA, REPOKEY_TYPE_STR, SOLVABLE_MESSAGEINS, REPOKEY_TYPE_STR, SOLVABLE_MESSAGEDEL, REPOKEY_TYPE_STR, SOLVABLE_CATEGORY, REPOKEY_TYPE_ID, 0, 0 }; if (!strcmp(ext, "DL")) { repodata_add_idarray(data, handle, REPOSITORY_KEYS, REPOSITORY_DELTAINFO); repodata_add_idarray(data, handle, REPOSITORY_KEYS, REPOKEY_TYPE_FLEXARRAY); } else if (!strcmp(ext, "FL")) { repodata_add_idarray(data, handle, REPOSITORY_KEYS, SOLVABLE_FILELIST); repodata_add_idarray(data, handle, REPOSITORY_KEYS, REPOKEY_TYPE_DIRSTRARRAY); } else if (!strcmp(ext, "DU")) { repodata_add_idarray(data, handle, REPOSITORY_KEYS, SOLVABLE_DISKUSAGE); repodata_add_idarray(data, handle, REPOSITORY_KEYS, REPOKEY_TYPE_DIRNUMNUMARRAY); } else { Pool *pool = data->repo->pool; int i; for (i = 0; langtags[i]; i += 2) { repodata_add_idarray(data, handle, REPOSITORY_KEYS, pool_id2langid(pool, langtags[i], ext, 1)); repodata_add_idarray(data, handle, REPOSITORY_KEYS, langtags[i + 1]); } } } int load_stub(Pool *pool, Repodata *data, void *dp) { struct repoinfo *cinfo = data->repo->appdata; switch (cinfo->type) { #ifdef ENABLE_SUSEREPO case TYPE_SUSETAGS: return susetags_load_ext(data->repo, data); #endif #ifdef ENABLE_RPMMD case TYPE_RPMMD: return repomd_load_ext(data->repo, data); #endif #ifdef ENABLE_MDKREPO case TYPE_MDK: return mdk_load_ext(data->repo, data); #endif default: /* debian does not have any ext data yet */ return 0; } } void read_repos(Pool *pool, struct repoinfo *repoinfos, int nrepoinfos) { Repo *repo; int i; Pool *sigpool = 0; for (i = 0; i < nrepoinfos; i++) { struct repoinfo *cinfo = repoinfos + i; if (!cinfo->enabled) continue; repo = repo_create(pool, cinfo->alias); cinfo->repo = repo; repo->appdata = cinfo; repo->priority = 99 - cinfo->priority; if ((!cinfo->autorefresh || cinfo->metadata_expire) && usecachedrepo(cinfo, 0, 0)) { #ifdef SUSE repo_add_autopattern(cinfo->repo, 0); #endif printf("repo '%s':", cinfo->alias); printf(" cached\n"); continue; } switch (cinfo->type) { #ifdef ENABLE_RPMMD case TYPE_RPMMD: repomd_load(cinfo, &sigpool); break; #endif #ifdef ENABLE_SUSEREPO case TYPE_SUSETAGS: susetags_load(cinfo, &sigpool); break; #endif #ifdef ENABLE_DEBIAN case TYPE_DEBIAN: debian_load(cinfo, &sigpool); break; #endif #ifdef ENABLE_MDKREPO case TYPE_MDK: mdk_load(cinfo, &sigpool); break; #endif default: printf("unsupported repo '%s': skipped\n", cinfo->alias); repo_free(repo, 1); cinfo->repo = 0; break; } #ifdef SUSE if (cinfo->repo) repo_add_autopattern(cinfo->repo, 0); #endif } if (sigpool) pool_free(sigpool); }