static PyObject * install(_GoalObject *self, PyObject *args, PyObject *kwds) { DnfPackage *pkg = NULL; HySelector sltr = NULL; int flags = 0; g_autoptr(GError) error = NULL; if (!args_pkg_sltr_parse(args, kwds, &pkg, &sltr, &flags, HY_WEAK_SOLV)) return NULL; if (flags & HY_WEAK_SOLV) { if (pkg) { hy_goal_install_optional(self->goal, pkg); } else { hy_goal_install_selector_optional(self->goal, sltr, &error); } } else { if (pkg) { hy_goal_install(self->goal, pkg); } else { hy_goal_install_selector(self->goal, sltr, &error); } } return op_error2exc(error); }
END_TEST START_TEST(test_goal_get_reason) { HyPackage pkg = get_latest_pkg(test_globals.sack, "walrus"); HyGoal goal = hy_goal_create(test_globals.sack); hy_goal_install(goal, pkg); hy_package_free(pkg); hy_goal_run(goal); HyPackageList plist = hy_goal_list_installs(goal); int i; int set = 0; FOR_PACKAGELIST(pkg, plist, i) { if (!strcmp(hy_package_get_name(pkg), "walrus")) { set |= 1 << 0; fail_unless(hy_goal_get_reason(goal, pkg) == HY_REASON_USER); } if (!strcmp(hy_package_get_name(pkg), "semolina")) { set |= 1 << 1; fail_unless(hy_goal_get_reason(goal, pkg) == HY_REASON_DEP); } } fail_unless(set == 3); hy_packagelist_free(plist); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_describe_problem_rules) { g_autoptr(GError) error = NULL; DnfSack *sack = test_globals.sack; DnfPackage *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, &error) == NULL); fail_unless(error->code == DNF_ERROR_NO_SOLUTION); fail_unless(hy_goal_count_problems(goal) > 0); g_auto(GStrv) problems = hy_goal_describe_problem_rules(goal, 0); const char *expected[] = { "conflicting requests", "nothing provides goodbye needed by hello-1-1.noarch" }; for (gint p = 0; p < hy_goal_count_problems(goal); ++p) { fail_if(strncmp(problems[p], expected[p], strlen(expected[p]))); } g_object_unref(pkg); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_get_reason) { DnfPackage *pkg = get_latest_pkg(test_globals.sack, "walrus"); HyGoal goal = hy_goal_create(test_globals.sack); hy_goal_install(goal, pkg); g_object_unref(pkg); hy_goal_run(goal); GPtrArray *plist = hy_goal_list_installs(goal, NULL); guint i; int set = 0; for(i = 0; i < plist->len; i++) { pkg = g_ptr_array_index (plist, i); if (!strcmp(dnf_package_get_name(pkg), "walrus")) { set |= 1 << 0; fail_unless(hy_goal_get_reason(goal, pkg) == HY_REASON_USER); } if (!strcmp(dnf_package_get_name(pkg), "semolina")) { set |= 1 << 1; fail_unless(hy_goal_get_reason(goal, pkg) == HY_REASON_DEP); } } fail_unless(set == 3); g_ptr_array_unref(plist); hy_goal_free(goal); }
static PyObject * install(_GoalObject *self, PyObject *args, PyObject *kwds) { HyPackage pkg = NULL; HySelector sltr = NULL; if (!args_pkg_sltr_parse(args, kwds, &pkg, &sltr, NULL, 0)) return NULL; int ret = pkg ? hy_goal_install(self->goal, pkg) : hy_goal_install_selector(self->goal, sltr); return op_ret2exc(ret); }
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_goal_install) { DnfPackage *pkg = get_latest_pkg(test_globals.sack, "walrus"); HyGoal goal = hy_goal_create(test_globals.sack); fail_if(hy_goal_install(goal, pkg)); g_object_unref(pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 2, 0, 0, 0); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_actions) { HyPackage pkg = get_latest_pkg(test_globals.sack, "walrus"); HyGoal goal = hy_goal_create(test_globals.sack); fail_if(hy_goal_has_actions(goal, HY_INSTALL)); fail_if(hy_goal_install(goal, pkg)); fail_unless(hy_goal_has_actions(goal, HY_INSTALL)); hy_package_free(pkg); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_actions) { DnfPackage *pkg = get_latest_pkg(test_globals.sack, "walrus"); HyGoal goal = hy_goal_create(test_globals.sack); fail_if(hy_goal_has_actions(goal, DNF_INSTALL)); fail_if(hy_goal_install(goal, pkg)); fail_unless(hy_goal_has_actions(goal, DNF_INSTALL)); g_object_unref(pkg); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_no_reinstall) { DnfSack *sack = test_globals.sack; DnfPackage *pkg = get_latest_pkg(sack, "penny"); HyGoal goal = hy_goal_create(sack); fail_if(hy_goal_install(goal, pkg)); g_object_unref(pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 0, 0, 0, 0); hy_goal_free(goal); }
END_TEST START_TEST(test_goal_no_reinstall) { HySack sack = test_globals.sack; HyPackage pkg = get_latest_pkg(sack, "penny"); HyGoal goal = hy_goal_create(sack); fail_if(hy_goal_install(goal, pkg)); hy_package_free(pkg); fail_if(hy_goal_run(goal)); assert_iueo(goal, 0, 0, 0, 0); hy_goal_free(goal); }
static void update(HifSack *sack, HifPackage *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 GPtrArray *plist = hy_goal_list_upgrades(goal, NULL); printf("upgrade count: %d\n", plist->len); for (unsigned int i = 0; i < plist->len; ++i) { HifPackage *upkg = g_ptr_array_index(plist, i); const char *nvra = hif_package_get_nevra(upkg); char *location = hif_package_get_location(upkg); GPtrArray *obsoleted = hy_goal_list_obsoleted_by_package(goal, upkg); HifPackage *installed = g_ptr_array_index(obsoleted, 0); const char *nvra_installed = hif_package_get_nevra(installed); printf("upgrading: %s using %s\n", nvra, location); printf("\tfrom: %s\n", nvra_installed); printf("\tsize: %lu kB\n", hif_package_get_size(upkg) / 1024); g_ptr_array_unref(obsoleted); g_free(location); } g_ptr_array_unref(plist); // handle installs plist = hy_goal_list_installs(goal, NULL); printf("install count: %d\n", plist->len); for (unsigned int i = 0; i < plist->len; ++i) { HifPackage *ipkg = g_ptr_array_index(plist, i); const char *nvra = hif_package_get_nevra(ipkg); char *location = hif_package_get_location(ipkg); printf("installing: %s using %s\n", nvra, location); printf("\tsize: %lu kB\n", hif_package_get_size(ipkg) / 1024); g_free(location); } g_ptr_array_unref(plist); finish: hy_goal_free(goal); }
END_TEST START_TEST(test_goal_log_decisions) { HySack sack = test_globals.sack; HyPackage pkg = get_latest_pkg(sack, "hello"); HyGoal goal = hy_goal_create(sack); hy_goal_install(goal, pkg); HY_LOG_INFO("--- decisions below --->"); const int origsize = logfile_size(sack); hy_goal_run(goal); hy_goal_log_decisions(goal); const int newsize = logfile_size(sack); // check something substantial was added to the logfile: fail_unless(newsize - origsize > 3000); hy_package_free(pkg); 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); }
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_describe_problem) { g_autoptr(GError) error = NULL; DnfSack *sack = test_globals.sack; DnfPackage *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, &error) == NULL); fail_unless(error->code == DNF_ERROR_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))); g_free(problem); g_object_unref(pkg); hy_goal_free(goal); }
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; }
//check a local rpm folder for dependency issues. uint32_t TDNFCheckLocalPackages( PTDNF pTdnf, const char* pszLocalPath ) { uint32_t dwError = 0; int i = 0; char* pszRPMPath = NULL; const char* pszFile = NULL; GDir* pDir = NULL; HySack hSack = NULL; HyPackage hPkg = NULL; HyGoal hGoal = NULL; HyPackageList hPkgList = NULL; if(!pTdnf || !pszLocalPath) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } pDir = g_dir_open(pszLocalPath, 0, NULL); if(!pDir) { dwError = errno; BAIL_ON_TDNF_SYSTEM_ERROR(dwError); } fprintf(stdout, "Checking all packages from: %s\n", pszLocalPath); hSack = hy_sack_create(NULL, NULL, NULL, 0); if(!hSack) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } hy_sack_create_cmdline_repo(hSack); hPkgList = hy_packagelist_create(); if(!hPkgList) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } while ((pszFile = g_dir_read_name (pDir)) != NULL) { if (!g_str_has_suffix (pszFile, TDNF_RPM_EXT)) { continue; } pszRPMPath = g_build_filename(pszLocalPath, pszFile, NULL); hPkg = hy_sack_add_cmdline_package(hSack, pszRPMPath); g_free(pszRPMPath); pszRPMPath = NULL; if(!hPkg) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } hy_packagelist_push(hPkgList, hPkg); hPkg = NULL; } fprintf(stdout, "Found %d packages\n", hy_packagelist_count(hPkgList)); hGoal = hy_goal_create(hSack); if(!hGoal) { dwError = ERROR_TDNF_INVALID_PARAMETER; BAIL_ON_TDNF_ERROR(dwError); } FOR_PACKAGELIST(hPkg, hPkgList, i) { dwError = hy_goal_install(hGoal, hPkg); BAIL_ON_TDNF_HAWKEY_ERROR(dwError); }