END_TEST START_TEST(test_goal_verify) { HySack sack = test_globals.sack; HyGoal goal = hy_goal_create(sack); fail_unless(hy_goal_run_flags(goal, HY_VERIFY)); fail_unless(hy_goal_list_installs(goal) == NULL); fail_unless(hy_get_errno() == HY_E_NO_SOLUTION); fail_unless(hy_goal_count_problems(goal) == 2); char *expected; char *problem; problem = hy_goal_describe_problem(goal, 0); expected = "nothing provides missing-dep needed by missing-1-0.x86_64"; fail_if(strncmp(problem, expected, strlen(expected))); hy_free(problem); problem = hy_goal_describe_problem(goal, 1); expected = "package conflict-1-0.x86_64 conflicts with ok provided by ok-1-0.x86_64"; fail_if(strncmp(problem, expected, strlen(expected))); hy_free(problem); hy_goal_free(goal); }
END_TEST START_TEST(test_versions) { HySack sack = test_globals.sack; unsigned epoch; char *version, *release; HyPackage pkg; pkg = by_name(sack, "baby"); ck_assert_str_eq(hy_package_get_evr(pkg), "6:5.0-11"); epoch = hy_package_get_epoch(pkg); fail_unless(epoch == 6); version = hy_package_get_version(pkg); ck_assert_str_eq(version, "5.0"); hy_free(version); release = hy_package_get_release(pkg); ck_assert_str_eq(release, "11"); hy_free(release); hy_package_free(pkg); pkg = by_name(sack, "jay"); // epoch missing if it's 0: ck_assert_str_eq(hy_package_get_evr(pkg), "5.0-0"); epoch = hy_package_get_epoch(pkg); fail_unless(epoch == 0); version = hy_package_get_version(pkg); ck_assert_str_eq(version, "5.0"); hy_free(version); release = hy_package_get_release(pkg); ck_assert_str_eq(release, "0"); hy_free(release); hy_package_free(pkg); }
static void update(HySack sack, HyPackage pkg) { HyGoal goal = hy_goal_create(sack); if (hy_goal_upgrade_to_flags(goal, pkg, HY_CHECK_INSTALLED)) { printf("no package of that name installed, trying install\n"); hy_goal_install(goal, pkg); } if (hy_goal_run(goal)) { dump_goal_errors(goal); // handle errors goto finish; } // handle upgrades HyPackageList plist = hy_goal_list_upgrades(goal); printf("upgrade count: %d\n", hy_packagelist_count(plist)); for (int i = 0; i < hy_packagelist_count(plist); ++i) { HyPackage pkg = hy_packagelist_get(plist, i); char *nvra = hy_package_get_nevra(pkg); char *location = hy_package_get_location(pkg); HyPackageList obsoleted = hy_goal_list_obsoleted_by_package(goal, pkg); HyPackage installed = hy_packagelist_get(obsoleted, 0); char *nvra_installed = hy_package_get_nevra(installed); printf("upgrading: %s using %s\n", nvra, location); printf("\tfrom: %s\n", nvra_installed); printf("\tsize: %lld kB\n", hy_package_get_size(pkg) / 1024); hy_free(nvra_installed); hy_packagelist_free(obsoleted); hy_free(location); hy_free(nvra); } hy_packagelist_free(plist); // handle installs plist = hy_goal_list_installs(goal); printf("install count: %d\n", hy_packagelist_count(plist)); for (int i = 0; i < hy_packagelist_count(plist); ++i) { HyPackage pkg = hy_packagelist_get(plist, i); char *nvra = hy_package_get_nevra(pkg); char *location = hy_package_get_location(pkg); printf("installing: %s using %s\n", nvra, location); printf("\tsize: %lld kB\n", hy_package_get_size(pkg) / 1024); hy_free(location); hy_free(nvra); } hy_packagelist_free(plist); finish: hy_goal_free(goal); }
END_TEST START_TEST(test_give_cache_fn) { HySack sack = hy_sack_create(test_globals.tmpdir, NULL, NULL, NULL, HY_MAKE_CACHE_DIR); char *path = hy_sack_give_cache_fn(sack, "rain", NULL); fail_if(strstr(path, "rain.solv") == NULL); hy_free(path); path = hy_sack_give_cache_fn(sack, "rain", HY_EXT_FILENAMES); fail_if(strstr(path, "rain-filenames.solvx") == NULL); hy_free(path); hy_sack_free(sack); }
END_TEST START_TEST(test_goal_describe_problem_excludes) { HySack sack = test_globals.sack; HyQuery q = hy_query_create_flags(sack, HY_IGNORE_EXCLUDES); hy_query_filter(q, HY_PKG_NAME, HY_EQ, "semolina"); HyPackageSet pset = hy_query_run_set(q); hy_sack_add_excludes(sack, pset); hy_packageset_free(pset); hy_query_free(q); HyGoal goal = hy_goal_create(sack); HySelector sltr = hy_selector_create(sack); hy_selector_set(sltr, HY_PKG_NAME, HY_EQ, "semolina"); hy_goal_install_selector(goal, sltr); hy_selector_free(sltr); fail_unless(hy_goal_run(goal)); fail_unless(hy_goal_count_problems(goal) > 0); char *problem = hy_goal_describe_problem(goal, 0); ck_assert_str_eq(problem, "package semolina does not exist"); hy_free(problem); hy_goal_free(goal); }
END_TEST START_TEST(test_sourcerpm) { HyPackage pkg = by_name(test_globals.sack, "tour"); char *sourcerpm = hy_package_get_sourcerpm(pkg); ck_assert_str_eq(sourcerpm, "tour-4-6.src.rpm"); hy_free(sourcerpm); hy_package_free(pkg); pkg = by_name(test_globals.sack, "mystery-devel"); sourcerpm = hy_package_get_sourcerpm(pkg); ck_assert_str_eq(sourcerpm, "mystery-19.67-1.src.rpm"); hy_free(sourcerpm); hy_package_free(pkg); }
static void dump_goal_errors(HyGoal goal) { for (int i = 0; i < hy_goal_count_problems(goal); ++i) { char *problem = hy_goal_describe_problem(goal, i); printf("%s\n", problem); hy_free(problem); } }
static void execute_print(HySack sack, HyQuery q, int show_obsoletes) { HyPackageList plist; plist = hy_query_run(q); const int count = hy_packagelist_count(plist); for (int i = 0; i < count; ++i) { HyPackage pkg = hy_packagelist_get(plist, i); char *nvra = hy_package_get_nevra(pkg); const char *reponame = hy_package_get_reponame(pkg); printf("found package: %s [%s]\n", nvra, reponame); if (strcmp(reponame, HY_SYSTEM_REPO_NAME) == 0) { int type; const unsigned char * hdrid = hy_package_get_hdr_chksum(pkg, &type); char *str = hy_chksum_str(hdrid, type); printf("\tsha1 header id: %s\n", str); hy_free(str); } if (show_obsoletes) { HyReldepList obsoletes = hy_package_get_obsoletes(pkg); HyQuery qobs = hy_query_create(sack); hy_query_filter(qobs, HY_PKG_REPONAME, HY_NEQ, HY_SYSTEM_REPO_NAME); hy_query_filter_reldep_in(qobs, HY_PKG_PROVIDES, obsoletes); HyPackageList olist = hy_query_run(qobs); const int ocount = hy_packagelist_count(olist); for (int j = 0; j < ocount; ++j) { HyPackage opkg = hy_packagelist_get(olist, j); char *onvra = hy_package_get_nevra(opkg); printf("obsoleting: %s\n", onvra); hy_free(onvra); } hy_packagelist_free(olist); hy_query_free(qobs); hy_reldeplist_free(obsoletes); } hy_free(nvra); } hy_packagelist_free(plist); }
uint32_t TDNFGoalReportProblems( HyGoal hGoal ) { uint32_t dwError = 0; int i = 0; int nCount = 0; char* pszProblem = NULL; if(!hGoal) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } nCount = hy_goal_count_problems(hGoal); if(nCount > 0) { fprintf(stdout, "Found %d problem(s) while resolving\n", nCount); for(; i < nCount; ++i) { pszProblem = hy_goal_describe_problem(hGoal, i); fprintf(stdout, "%d. %s\n", i+1, pszProblem); hy_free(pszProblem); pszProblem = NULL; } } cleanup: if(pszProblem) { hy_free(pszProblem); } return dwError; error: goto cleanup; }
END_TEST START_TEST(test_list_arches) { HySack sack = hy_sack_create(test_globals.tmpdir, TEST_FIXED_ARCH, NULL, NULL, HY_MAKE_CACHE_DIR); const char ** arches = hy_sack_list_arches(sack); /* noarch, x86_64, athlon, i686, i586, i486, i386 */ fail_unless(count_nullt_array(arches), 7); ck_assert_str_eq(arches[3], "i686"); hy_free(arches); hy_sack_free(sack); }
END_TEST START_TEST(test_get_requires) { HySack sack = test_globals.sack; HyPackage pkg = by_name(sack, "flying"); HyReldepList reldeplist = hy_package_get_requires(pkg); fail_unless(hy_reldeplist_count(reldeplist) == 1); HyReldep reldep = hy_reldeplist_get_clone(reldeplist, 0); char *depstr = hy_reldep_str(reldep); ck_assert_str_eq(depstr, "P-lib >= 3"); hy_free(depstr); hy_reldep_free(reldep); hy_reldeplist_free(reldeplist); hy_package_free(pkg); }
END_TEST START_TEST(test_repo_written) { HySack sack = hy_sack_create(test_globals.tmpdir, NULL, NULL, NULL, HY_MAKE_CACHE_DIR); char *filename = hy_sack_give_cache_fn(sack, "test_sack_written", NULL); fail_unless(access(filename, R_OK|W_OK)); setup_yum_sack(sack, "test_sack_written"); HyRepo repo = hrepo_by_name(sack, "test_sack_written"); fail_if(repo == NULL); fail_unless(repo->state_main == _HY_WRITTEN); fail_unless(repo->state_filelists == _HY_WRITTEN); fail_unless(repo->state_presto == _HY_WRITTEN); fail_if(access(filename, R_OK|W_OK)); hy_free(filename); hy_sack_free(sack); }
/** * hif_goal_depsolve: */ gboolean hif_goal_depsolve (HyGoal goal, GError **error) { gchar *tmp; gint cnt; gint j; gint rc; _cleanup_string_free_ GString *string = NULL; rc = hy_goal_run_flags (goal, HY_ALLOW_UNINSTALL); if (rc) { string = g_string_new ("Could not depsolve transaction; "); cnt = hy_goal_count_problems (goal); if (cnt == 1) g_string_append_printf (string, "%i problem detected:\n", cnt); else g_string_append_printf (string, "%i problems detected:\n", cnt); for (j = 0; j < cnt; j++) { tmp = hy_goal_describe_problem (goal, j); g_string_append_printf (string, "%i. %s\n", j, tmp); hy_free (tmp); } g_string_truncate (string, string->len - 1); g_set_error_literal (error, HIF_ERROR, HIF_ERROR_PACKAGE_CONFLICTS, string->str); return FALSE; } /* anything to do? */ if (hy_goal_req_length (goal) == 0) { g_set_error_literal (error, HIF_ERROR, HIF_ERROR_NO_PACKAGES_TO_UPDATE, "The transaction was empty"); return FALSE; } return TRUE; }
static void erase(HySack sack, const char *name) { HyQuery q = hy_query_create(sack); hy_query_filter(q, HY_PKG_NAME, HY_EQ, name); hy_query_filter(q, HY_PKG_REPONAME, HY_EQ, HY_SYSTEM_REPO_NAME); HyPackageList plist = hy_query_run(q); if (hy_packagelist_count(plist) < 1) { printf("No installed package to erase found.\n"); goto finish; } if (hy_packagelist_count(plist) > 1) printf("(more than one updatables found, selecting the first one)\n"); HyGoal goal = hy_goal_create(sack); hy_goal_erase(goal, hy_packagelist_get(plist, 0)); if (hy_goal_run(goal)) { dump_goal_errors(goal); hy_goal_free(goal); goto finish; } hy_packagelist_free(plist); plist = hy_goal_list_erasures(goal); printf("erasure count: %d\n", hy_packagelist_count(plist)); for (int i = 0; i < hy_packagelist_count(plist); ++i) { HyPackage pkg = hy_packagelist_get(plist, i); char *nvra = hy_package_get_nevra(pkg); printf("erasing %s\n", nvra); hy_free(nvra); } hy_goal_free(goal); finish: hy_packagelist_free(plist); hy_query_free(q); }
END_TEST START_TEST(test_goal_describe_problem) { HySack sack = test_globals.sack; HyPackage pkg = get_latest_pkg(sack, "hello"); HyGoal goal = hy_goal_create(sack); hy_goal_install(goal, pkg); fail_unless(hy_goal_run(goal)); fail_unless(hy_goal_list_installs(goal) == NULL); fail_unless(hy_get_errno() == HY_E_NO_SOLUTION); fail_unless(hy_goal_count_problems(goal) > 0); char *problem = hy_goal_describe_problem(goal, 0); const char *expected = "nothing provides goodbye"; fail_if(strncmp(problem, expected, strlen(expected))); hy_free(problem); hy_package_free(pkg); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_install_selector) { HySelector sltr; HyGoal goal = hy_goal_create(test_globals.sack); // test arch forcing sltr = hy_selector_create(test_globals.sack); hy_selector_set(sltr, HY_PKG_NAME, HY_EQ, "semolina"); hy_selector_set(sltr, HY_PKG_ARCH, HY_EQ, "i686"); fail_if(hy_goal_install_selector(goal, sltr)); hy_selector_free(sltr); fail_if(hy_goal_run(goal)); assert_iueo(goal, 1, 0, 0, 0); HyPackageList plist = hy_goal_list_installs(goal); char *nvra = hy_package_get_nevra(hy_packagelist_get(plist, 0)); ck_assert_str_eq(nvra, "semolina-2-0.i686"); hy_free(nvra); hy_packagelist_free(plist); hy_goal_free(goal); }
uint32_t TDNFTransAddInstallPkg( PTDNFRPMTS pTS, PTDNF pTdnf, HyPackage hPkg, int nUpgrade ) { uint32_t dwError = 0; int nGPGCheck = 0; char* pszRpmCacheDir = NULL; char* pszFilePath = NULL; const char* pszRepoName = NULL; char* pszHyName = NULL; Header rpmHeader = NULL; FD_t fp = NULL; char* pszDownloadCacheDir = NULL; char* pszUrlGPGKey = NULL; pszRepoName = hy_package_get_reponame(hPkg); pszHyName = hy_package_get_location(hPkg); pszRpmCacheDir = g_build_filename( G_DIR_SEPARATOR_S, pTdnf->pConf->pszCacheDir, pszRepoName, "rpms", G_DIR_SEPARATOR_S, NULL); pszFilePath = g_build_filename(pszRpmCacheDir, pszHyName, NULL); if(pTS->pCachedRpmsArray) { if(!g_array_append_val(pTS->pCachedRpmsArray, pszFilePath)) { dwError = ERROR_TDNF_OUT_OF_MEMORY; BAIL_ON_TDNF_ERROR(dwError); } } pszDownloadCacheDir = g_path_get_dirname(pszFilePath); if(!pszDownloadCacheDir) { dwError = ENOENT; BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } if(access(pszDownloadCacheDir, F_OK)) { if(errno != ENOENT) { dwError = errno; } BAIL_ON_TDNF_SYSTEM_ERROR(dwError); dwError = TDNFUtilsMakeDirs(pszDownloadCacheDir); BAIL_ON_TDNF_ERROR(dwError); } if(access(pszFilePath, F_OK)) { if(errno != ENOENT) { dwError = errno; BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } dwError = TDNFDownloadPackage(pTdnf, hPkg, pszDownloadCacheDir); BAIL_ON_TDNF_ERROR(dwError); } //A download could have been triggered. //So check access and bail if not available if(access(pszFilePath, F_OK)) { dwError = errno; BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } //Check override, then repo config and launch //gpg check if needed dwError = TDNFGetGPGCheck(pTdnf, pszRepoName, &nGPGCheck, &pszUrlGPGKey); BAIL_ON_TDNF_ERROR(dwError); if(nGPGCheck) { dwError = TDNFGPGCheck(pTS->pKeyring, pszUrlGPGKey, pszFilePath); BAIL_ON_TDNF_ERROR(dwError); } fp = Fopen (pszFilePath, "r.ufdio"); if(!fp) { dwError = errno; BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } dwError = rpmReadPackageFile( pTS->pTS, fp, pszFilePath, &rpmHeader); //If not checking gpg sigs, ignore signature errors if(!nGPGCheck && (dwError == RPMRC_NOTTRUSTED || dwError == RPMRC_NOKEY)) { dwError = 0; } BAIL_ON_TDNF_RPM_ERROR(dwError); dwError = rpmtsAddInstallElement( pTS->pTS, rpmHeader, (fnpyKey)pszFilePath, nUpgrade, NULL); BAIL_ON_TDNF_RPM_ERROR(dwError); cleanup: TDNF_SAFE_FREE_MEMORY(pszUrlGPGKey); if(pszHyName) { hy_free(pszHyName); } if(pszDownloadCacheDir) { g_free(pszDownloadCacheDir); } if(pszRpmCacheDir) { g_free(pszRpmCacheDir); } if(fp) { Fclose(fp); } if(rpmHeader) { headerFree(rpmHeader); } return dwError; error: goto cleanup; }