Skip to content

Commit

Permalink
selector: prefer obsoletes (Related:RhBug:1096506)
Browse files Browse the repository at this point in the history
when searching by provides the packages that contain the same name as provide or contain obsoletes with the same name as their provide will be picked first

Closes: #189
Approved by: j-mracek
  • Loading branch information
Jan Silhan authored and rh-atomic-bot committed Oct 4, 2016
1 parent cf34550 commit 94ac2e5
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 2 deletions.
2 changes: 2 additions & 0 deletions data/tests/hawkey/greedy.repo
Expand Up @@ -5,5 +5,7 @@
=Pkg: B 1 0 noarch
=Rec: C
=Prv: somereq
=Obs: somereq
=Pkg: C 1 0 noarch
=Prv: somereq
=Pkg: somereq 1 0 noarch
34 changes: 32 additions & 2 deletions libdnf/hy-goal.c
Expand Up @@ -523,6 +523,36 @@ filter_name2job(DnfSack *sack, const struct _Filter *f, Queue *job)
return 0;
}

/**
* add_preferred_provide:
* when searching by provides the packages that contain the same
* name as provide or contain obsoletes with the same name as their
* provide will be picked first
*/
static void
add_preferred_provide(DnfSack *sack, Queue *job, Id id)
{
g_autoptr(GPtrArray) plist = g_ptr_array_new_with_free_func(
(GDestroyNotify) g_object_unref);
Pool *pool = dnf_sack_get_pool(sack);
const char *name = pool_dep2str(pool, id);
HyQuery q = hy_query_create(sack);
hy_query_filter(q, HY_PKG_NAME, HY_NEQ, name);
DnfPackageSet *pset = hy_query_run_set(q);
hy_query_filter(q, HY_PKG_PROVIDES, HY_EQ, name);
hy_query_filter_package_in(q, HY_PKG_OBSOLETES, HY_NEQ, pset);
DnfPackage *pkg;
plist = hy_query_run(q);
for (guint i = 0; i < plist->len; i++) {
pkg = g_ptr_array_index(plist, i);
queue_push2(job, SOLVER_DISFAVOR|SOLVER_SOLVABLE,
dnf_package_get_id(pkg));
}
queue_push2(job, SOLVER_SOLVABLE_PROVIDES, id);
hy_query_free(q);
g_object_unref(pset);
}

static int
filter_provides2job(DnfSack *sack, const struct _Filter *f, Queue *job)
{
Expand All @@ -538,7 +568,7 @@ filter_provides2job(DnfSack *sack, const struct _Filter *f, Queue *job)
switch (f->cmp_type) {
case HY_EQ:
id = dnf_reldep_get_id (f->matches[0].reldep);
queue_push2(job, SOLVER_SOLVABLE_PROVIDES, id);
add_preferred_provide(sack, job, id);
break;
case HY_GLOB:
dataiterator_init(&di, pool, 0, 0, SOLVABLE_PROVIDES, name, SEARCH_GLOB);
Expand All @@ -549,7 +579,7 @@ filter_provides2job(DnfSack *sack, const struct _Filter *f, Queue *job)
assert(di.idp);
id = *di.idp;
if (!job_has(job, SOLVABLE_PROVIDES, id))
queue_push2(job, SOLVER_SOLVABLE_PROVIDES, id);
add_preferred_provide(sack, job, id);
dataiterator_free(&di);
break;
default:
Expand Down
23 changes: 23 additions & 0 deletions tests/hawkey/test_goal.c
Expand Up @@ -230,6 +230,28 @@ START_TEST(test_goal_install_selector)
}
END_TEST

START_TEST(test_goal_install_selector_obsoletes_first)
{
HySelector sltr;
HyGoal goal = hy_goal_create(test_globals.sack);

sltr = hy_selector_create(test_globals.sack);
hy_selector_set(sltr, HY_PKG_PROVIDES, HY_EQ, "somereq");
fail_if(!hy_goal_install_selector(goal, sltr, NULL));
hy_selector_free(sltr);

fail_if(hy_goal_run(goal));
assert_iueo(goal, 1, 0, 0, 0);

GPtrArray *plist = hy_goal_list_installs(goal, NULL);
char *nvra = dnf_package_get_nevra(g_ptr_array_index(plist, 0));
ck_assert_str_eq(nvra, "B-1-0.noarch");
g_free(nvra);
g_ptr_array_unref(plist);
hy_goal_free(goal);
}
END_TEST

START_TEST(test_goal_install_selector_err)
{
int rc;
Expand Down Expand Up @@ -1437,6 +1459,7 @@ goal_suite(void)
tc = tcase_create("Greedy");
tcase_add_unchecked_fixture(tc, fixture_greedy_only, teardown);
tcase_add_test(tc, test_goal_run_all);
tcase_add_test(tc, test_goal_install_selector_obsoletes_first);
tcase_add_test(tc, test_goal_install_weak_deps);
suite_add_tcase(s, tc);

Expand Down

0 comments on commit 94ac2e5

Please sign in to comment.