Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion client/api.c
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ TDNFCheckLocalPackages(
dwError = TDNFGetSkipProblemOption(pTdnf, &dwSkipProblem);
BAIL_ON_TDNF_ERROR(dwError);

dwError = SolvReportProblems(pTdnf->pSack, pSolv, dwSkipProblem);
dwError = SolvReportProblems(pTdnf->pSack, pSolv, dwSkipProblem, pTdnf->pArgs->nVerbose);
BAIL_ON_TDNF_ERROR(dwError);
}

Expand Down
2 changes: 1 addition & 1 deletion client/goal.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ TDNFSolv(
{
dwError = TDNFGetSkipProblemOption(pTdnf, &dwSkipProblem);
BAIL_ON_TDNF_ERROR(dwError);
dwError = SolvReportProblems(pTdnf->pSack, pSolv, dwSkipProblem);
dwError = SolvReportProblems(pTdnf->pSack, pSolv, dwSkipProblem, pTdnf->pArgs->nVerbose);
BAIL_ON_TDNF_ERROR(dwError);
}

Expand Down
29 changes: 29 additions & 0 deletions pytests/tests/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,3 +172,32 @@ def xxx_test_install_memcheck(utils):

utils.run_memcheck(['tdnf', 'install', '-y', '--nogpgcheck', pkgname])
assert utils.check_package(pkgname)


# install a package with non-existing requirement, expect brief output without verbose
def test_install_no_providers_non_verbose(utils):
pkgname = utils.config['dummy_requires_pkgname']
ret = utils.run(['tdnf', 'install', '-y', '--nogpgcheck', pkgname])
# ERROR_TDNF_SOLV_FAILED - "Solv general runtime error"
assert ret['retval'] == 1301
stderr = '\n'.join(ret['stderr'])
assert "nothing provides" in stderr
# Should recommend the verbose flag
assert "Please retry with --verbose to see detailed solver rules" in stderr
# Should NOT contain the detailed block format
assert "Problem 1:" not in stderr


# install a package with non-existing requirement, expect detailed output with verbose
def test_install_no_providers_verbose(utils):
pkgname = utils.config['dummy_requires_pkgname']
ret = utils.run(['tdnf', 'install', '-y', '--nogpgcheck', '--verbose', pkgname])
# ERROR_TDNF_SOLV_FAILED - "Solv general runtime error"
assert ret['retval'] == 1301
stderr = '\n'.join(ret['stderr'])
# Should contain the detailed block format
assert "Problem 1:" in stderr
assert " - " in stderr
assert "nothing provides" in stderr
# Should NOT recommend the verbose flag
assert "Please retry with --verbose to see detailed solver rules" not in stderr
3 changes: 2 additions & 1 deletion solv/prototypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,8 @@ uint32_t
SolvReportProblems(
PSolvSack pSack,
Solver* pSolv,
TDNF_SKIPPROBLEM_TYPE dwSkipProblem
TDNF_SKIPPROBLEM_TYPE dwSkipProblem,
int nVerbose
);

uint32_t
Expand Down
69 changes: 57 additions & 12 deletions solv/tdnfpackage.c
Original file line number Diff line number Diff line change
Expand Up @@ -1912,7 +1912,8 @@ uint32_t
SolvReportProblems(
PSolvSack pSack,
Solver* pSolv,
TDNF_SKIPPROBLEM_TYPE dwSkipProblem
TDNF_SKIPPROBLEM_TYPE dwSkipProblem,
int nVerbose
)
{
int nCount = 0;
Expand All @@ -1932,20 +1933,17 @@ SolvReportProblems(
nCount = solver_problem_count(pSolv);
for ( ; nCount > 0; nCount--)
{
const char *pszProblem = NULL;

Id dwProblemId = solver_findproblemrule(pSolv, nCount);
const char *pszProblem = NULL;

type = solver_ruleinfo(pSolv, dwProblemId,
&dwSource, &dwTarget, &dwDep);
type = solver_ruleinfo(pSolv, dwProblemId, &dwSource, &dwTarget, &dwDep);

if (SkipBasedOnType(pSolv, type, dwSource, dwSkipProblem))
{
continue;
}
if (SkipBasedOnType(pSolv, type, dwSource, dwSkipProblem))
{
continue;
}

pszProblem = solver_problemruleinfo2str(pSolv, type, dwSource,
dwTarget, dwDep);
pszProblem = solver_problemruleinfo2str(pSolv, type, dwSource, dwTarget, dwDep);

if (dwSkipProblem != SKIPPROBLEM_NONE &&
type == SOLVER_RULE_PKG_REQUIRES)
Expand All @@ -1956,13 +1954,60 @@ SolvReportProblems(
}
}

total_prblms++;
dwError = ERROR_TDNF_SOLV_FAILED;
pr_err("%u. %s\n", ++total_prblms, pszProblem);

if (nVerbose)
{
Queue rids;
queue_init(&rids);

solver_findallproblemrules(pSolv, nCount, &rids);

pr_err("Problem %u:\n", total_prblms);

for (int j = 0; j < rids.count; j++)
{
const char *pszSubProblem = NULL;
Id probr = rids.elements[j];
type = solver_ruleinfo(pSolv, probr, &dwSource, &dwTarget, &dwDep);

if (type == SOLVER_RULE_JOB)
{
pszSubProblem = pool_tmpjoin(pSolv->pool, "job ", pool_job2str(pSolv->pool, dwTarget, dwDep, 0), " conflicts with other jobs");
}
else
{
pszSubProblem = solver_problemruleinfo2str(pSolv, type, dwSource, dwTarget, dwDep);
}

if (dwSkipProblem != SKIPPROBLEM_NONE &&
type == SOLVER_RULE_PKG_REQUIRES)
{
if (!check_for_providers(pSack, type, pszSubProblem, prv_pkgname))
{
continue;
}
}

pr_err(" - %s\n", pszSubProblem);
}

queue_free(&rids);
}
else
{
pr_err("%u. %s\n", total_prblms, pszProblem);
}
}

if (dwError)
{
pr_err("Found %u problem(s) while resolving\n", total_prblms);
if (!nVerbose)
{
pr_err("Please retry with --verbose to see detailed solver rules\n");
}
}

return dwError;
Expand Down
Loading