END_TEST START_TEST(test_goal_erase_clean_deps) { DnfSack *sack = test_globals.sack; DnfPackage *pkg = by_name_repo(sack, "flying", HY_SYSTEM_REPO_NAME); // by default, leave dependencies alone: HyGoal goal = hy_goal_create(sack); hy_goal_erase(goal, pkg); hy_goal_run(goal); assert_iueo(goal, 0, 0, 1, 0); hy_goal_free(goal); // allow deleting dependencies: goal = hy_goal_create(sack); hy_goal_erase_flags(goal, pkg, HY_CLEAN_DEPS); fail_unless(hy_goal_run(goal) == 0); assert_iueo(goal, 0, 0, 2, 0); hy_goal_free(goal); // test userinstalled specification: DnfPackage *penny_pkg = by_name_repo(sack, "penny-lib", HY_SYSTEM_REPO_NAME); goal = hy_goal_create(sack); hy_goal_erase_flags(goal, pkg, HY_CLEAN_DEPS); hy_goal_userinstalled(goal, penny_pkg); // having the same solvable twice in a goal shouldn't break anything: hy_goal_userinstalled(goal, pkg); fail_unless(hy_goal_run(goal) == 0); assert_iueo(goal, 0, 0, 1, 0); hy_goal_free(goal); g_object_unref(penny_pkg); g_object_unref(pkg); }
END_TEST START_TEST(test_goal_protected) { DnfSack *sack = test_globals.sack; DnfPackageSet *protected = dnf_packageset_new(sack); DnfPackage *pkg = by_name_repo(sack, "penny-lib", HY_SYSTEM_REPO_NAME); DnfPackage *pp = by_name_repo(sack, "flying", HY_SYSTEM_REPO_NAME); const char *expected; g_autofree gchar *problem; // when protected_packages set is empty it should remove both packages HyGoal goal = hy_goal_create(sack); DnfPackageSet *empty = dnf_packageset_new(sack); dnf_goal_set_protected(goal, empty); g_object_unref(empty); hy_goal_erase(goal, pkg); fail_if(hy_goal_run_flags(goal, DNF_ALLOW_UNINSTALL)); assert_iueo(goal, 0, 0, 2, 0); hy_goal_free(goal); // fails to uninstall penny-lib because flying is protected goal = hy_goal_create(sack); dnf_packageset_add(protected, pp); dnf_goal_set_protected(goal, protected); hy_goal_erase(goal, pkg); fail_unless(hy_goal_run_flags(goal, DNF_ALLOW_UNINSTALL)); hy_goal_free(goal); // removal of protected package explicitly should trigger error goal = hy_goal_create(sack); dnf_goal_set_protected(goal, protected); hy_goal_erase(goal, pp); fail_unless(hy_goal_run(goal)); fail_unless(hy_goal_count_problems(goal) == 1); problem = hy_goal_describe_problem(goal, 0); expected = "The operation would result in removing " "the following protected packages: flying"; fail_if(g_strcmp0(problem, expected)); hy_goal_free(goal); g_object_unref(protected); g_object_unref(pkg); g_object_unref(pp); }
END_TEST START_TEST(test_goal_erase_with_deps) { DnfSack *sack = test_globals.sack; DnfPackage *pkg = by_name_repo(sack, "penny-lib", HY_SYSTEM_REPO_NAME); // by default can not remove penny-lib, flying depends on it: HyGoal goal = hy_goal_create(sack); hy_goal_erase(goal, pkg); fail_unless(hy_goal_run(goal)); hy_goal_free(goal); goal = hy_goal_create(sack); hy_goal_erase(goal, pkg); fail_if(hy_goal_run_flags(goal, DNF_ALLOW_UNINSTALL)); assert_iueo(goal, 0, 0, 2, 0); hy_goal_free(goal); g_object_unref(pkg); }
END_TEST START_TEST(test_goal_erase_simple) { DnfSack *sack = test_globals.sack; DnfPackage *pkg = by_name_repo(sack, "penny", HY_SYSTEM_REPO_NAME); HyGoal goal = hy_goal_create(sack); fail_if(hy_goal_erase(goal, pkg)); g_object_unref(pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 0, 0, 1, 0); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_erase_simple) { HySack sack = test_globals.sack; HyPackage pkg = by_name_repo(sack, "penny", HY_SYSTEM_REPO_NAME); HyGoal goal = hy_goal_create(sack); fail_if(hy_goal_erase(goal, pkg)); hy_package_free(pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 0, 0, 1, 0); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_kernel_protected) { DnfSack *sack = test_globals.sack; dnf_sack_set_running_kernel_fn(sack, mock_running_kernel); Id kernel_id = mock_running_kernel(sack); DnfPackage *kernel = dnf_package_new(sack, kernel_id); HyGoal goal = hy_goal_create(sack); hy_goal_erase(goal, kernel); fail_unless(hy_goal_run_flags(goal, 0)); g_object_unref(kernel); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_rerun) { DnfSack *sack = test_globals.sack; HyGoal goal = hy_goal_create(sack); DnfPackage *pkg = get_latest_pkg(sack, "walrus"); hy_goal_install(goal, pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 2, 0, 0, 0); g_object_unref(pkg); // add an erase: pkg = by_name_repo(sack, "dog", HY_SYSTEM_REPO_NAME); hy_goal_erase(goal, pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 2, 0, 1, 0); g_object_unref(pkg); hy_goal_free(goal); }
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); }
static void erase(HifSack *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); GPtrArray *plist = hy_query_run(q); if (plist->len < 1) { printf("No installed package to erase found.\n"); goto finish; } if (plist->len > 1) printf("(more than one updatables found, selecting the first one)\n"); HyGoal goal = hy_goal_create(sack); hy_goal_erase(goal, g_ptr_array_index(plist, 0)); if (hy_goal_run(goal)) { dump_goal_errors(goal); hy_goal_free(goal); goto finish; } g_ptr_array_unref(plist); plist = hy_goal_list_erasures(goal, NULL); printf("erasure count: %d\n", plist->len); for (unsigned int i = 0; i < plist->len; ++i) { HifPackage *pkg = g_ptr_array_index(plist, i); const char *nvra = hif_package_get_nevra(pkg); printf("erasing %s\n", nvra); } hy_goal_free(goal); finish: g_ptr_array_unref(plist); hy_query_free(q); }
uint32_t TDNFGoal( PTDNF pTdnf, HyPackageList hPkgList, HySelector hSelector, TDNF_ALTERTYPE nResolveFor, PTDNF_SOLVED_PKG_INFO pInfo ) { uint32_t dwError = 0; HyGoal hGoal = NULL; HyPackage hPkg = NULL; PTDNF_PKG_INFO pPkgsToInstall = NULL; PTDNF_PKG_INFO pPkgsToUpgrade = NULL; PTDNF_PKG_INFO pPkgsToDowngrade = NULL; PTDNF_PKG_INFO pPkgsToRemove = NULL; PTDNF_PKG_INFO pPkgsUnNeeded = NULL; PTDNF_PKG_INFO pPkgsToReinstall = NULL; int nFlags = 0; int nRequirePkgList = (nResolveFor != ALTER_UPGRADEALL && nResolveFor != ALTER_DISTRO_SYNC); if(!pTdnf || !pInfo ) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } if(nResolveFor == ALTER_UPGRADE && !hSelector) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } if(nRequirePkgList) { if(!hPkgList) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } hPkg = hy_packagelist_get(hPkgList, 0); if(!hPkg) { dwError = ERROR_TDNF_PACKAGELIST_EMPTY; BAIL_ON_TDNF_ERROR(dwError); } } hGoal = hy_goal_create(pTdnf->hSack); if(!hGoal) { dwError = ERROR_TDNF_GOAL_CREATE; BAIL_ON_TDNF_ERROR(dwError); } switch(nResolveFor) { case ALTER_DOWNGRADE: dwError = hy_goal_downgrade_to(hGoal, hPkg); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_ERASE: dwError = hy_goal_erase(hGoal, hPkg); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_REINSTALL: dwError = hy_goal_install(hGoal, hPkg); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_INSTALL: dwError = TDNFPackageGetLatest(hPkgList, &hPkg); BAIL_ON_TDNF_ERROR(dwError); dwError = hy_goal_install(hGoal, hPkg); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_UPGRADE: dwError = hy_goal_upgrade_to_selector(hGoal, hSelector); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_UPGRADEALL: dwError = hy_goal_upgrade_all(hGoal); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_DISTRO_SYNC: dwError = hy_goal_distupgrade_all(hGoal); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; case ALTER_AUTOERASE: dwError = TDNFGoalSetUserInstalled(hGoal, hPkgList); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); break; default: dwError = ERROR_TDNF_INVALID_RESOLVE_ARG; BAIL_ON_TDNF_ERROR(dwError); } if(pTdnf->pArgs->nBest) { nFlags = nFlags | HY_FORCE_BEST; } if(pTdnf->pArgs->nAllowErasing || nResolveFor == ALTER_ERASE || nResolveFor == ALTER_AUTOERASE) { nFlags = nFlags | HY_ALLOW_UNINSTALL; } dwError = hy_goal_run_flags(hGoal, nFlags); if(pTdnf->pArgs->nDebugSolver) { hy_goal_write_debugdata(hGoal, "debugdata"); } BAIL_ON_TDNF_HAWKEY_ERROR(dwError); dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_installs(hGoal), &pPkgsToInstall); BAIL_ON_TDNF_ERROR(dwError); dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_upgrades(hGoal), &pPkgsToUpgrade); BAIL_ON_TDNF_ERROR(dwError); dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_downgrades(hGoal), &pPkgsToDowngrade); BAIL_ON_TDNF_ERROR(dwError); dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_erasures(hGoal), &pPkgsToRemove); BAIL_ON_TDNF_ERROR(dwError); if(nResolveFor == ALTER_AUTOERASE) { dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_unneeded(hGoal), &pPkgsUnNeeded); BAIL_ON_TDNF_ERROR(dwError); } dwError = TDNFGoalGetResultsIgnoreNoData( hy_goal_list_reinstalls(hGoal), &pPkgsToReinstall); BAIL_ON_TDNF_ERROR(dwError); pInfo->pPkgsToInstall = pPkgsToInstall; pInfo->pPkgsToUpgrade = pPkgsToUpgrade; pInfo->pPkgsToDowngrade = pPkgsToDowngrade; pInfo->pPkgsToRemove = pPkgsToRemove; pInfo->pPkgsUnNeeded = pPkgsUnNeeded; pInfo->pPkgsToReinstall = pPkgsToReinstall; pTdnf->hGoal = hGoal; cleanup: return dwError; error: if(hGoal) { TDNFGoalReportProblems(hGoal); hy_goal_free(hGoal); } if(pPkgsToInstall) { TDNFFreePackageInfo(pPkgsToInstall); } if(pPkgsToUpgrade) { TDNFFreePackageInfo(pPkgsToUpgrade); } if(pPkgsToDowngrade) { TDNFFreePackageInfo(pPkgsToDowngrade); } if(pPkgsToRemove) { TDNFFreePackageInfo(pPkgsToRemove); } if(pPkgsUnNeeded) { TDNFFreePackageInfo(pPkgsUnNeeded); } if(pPkgsToReinstall) { TDNFFreePackageInfo(pPkgsToReinstall); } goto cleanup; }