Skip to content
Closed
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
24 changes: 11 additions & 13 deletions src/libpriv/rpmostree-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2059,7 +2059,7 @@ rpmostree_context_prepare (RpmOstreeContext *self,
return FALSE;

/* build a packageset from it */
DnfPackageSet *locked_pset = dnf_packageset_new (sack);
g_autoptr(DnfPackageSet) locked_pset = dnf_packageset_new (sack);
for (guint i = 0; i < locked_pkgs->len; i++)
dnf_packageset_add (locked_pset, locked_pkgs->pdata[i]);

Expand All @@ -2069,12 +2069,11 @@ rpmostree_context_prepare (RpmOstreeContext *self,
* exclude everything else. Note we still don't directly do `hy_goal_install`
* here; we want the treefile to still be canonical, but we just make sure that
* the end result matches what we expect. */
DnfPackageSet *pset = dnf_packageset_new (sack);
g_autoptr(DnfPackageSet) pset = dnf_packageset_new (sack);
Map *map = dnf_packageset_get_map (pset);
map_setall (map);
map_subtract (map, dnf_packageset_get_map (locked_pset));
dnf_sack_add_excludes (sack, pset);
dnf_packageset_free (pset);
}
else
{
Expand All @@ -2086,11 +2085,10 @@ rpmostree_context_prepare (RpmOstreeContext *self,
const char *repo = *it;
hy_autoquery HyQuery query = hy_query_create (sack);
hy_query_filter (query, HY_PKG_REPONAME, HY_EQ, repo);
DnfPackageSet *pset = hy_query_run_set (query);
g_autoptr(DnfPackageSet) pset = hy_query_run_set (query);
Map *map = dnf_packageset_get_map (pset);
map_subtract (map, dnf_packageset_get_map (locked_pset));
dnf_sack_add_excludes (sack, pset);
dnf_packageset_free (pset);
}

/* In relaxed mode, we allow packages to be added or removed without having to
Expand All @@ -2099,7 +2097,7 @@ rpmostree_context_prepare (RpmOstreeContext *self,
* filter out from the sack all pkgs which don't match. */

/* map of all packages with names found in the lockfile */
DnfPackageSet *named_pkgs = dnf_packageset_new (sack);
g_autoptr(DnfPackageSet) named_pkgs = dnf_packageset_new (sack);
Map *named_pkgs_map = dnf_packageset_get_map (named_pkgs);
GLNX_HASH_TABLE_FOREACH (self->vlockmap, const char*, nevra)
{
Expand All @@ -2108,18 +2106,19 @@ rpmostree_context_prepare (RpmOstreeContext *self,
return FALSE;
hy_autoquery HyQuery query = hy_query_create (sack);
hy_query_filter (query, HY_PKG_NAME, HY_EQ, name);
DnfPackageSet *pset = hy_query_run_set (query);
g_autoptr(DnfPackageSet) pset = hy_query_run_set (query);
map_or (named_pkgs_map, dnf_packageset_get_map (pset));
dnf_packageset_free (pset);
}

/* remove our locked packages from the exclusion set */
map_subtract (named_pkgs_map, dnf_packageset_get_map (locked_pset));
dnf_sack_add_excludes (sack, named_pkgs);
dnf_packageset_free (named_pkgs);
}

dnf_packageset_free (locked_pset);
/* Additionally, we want libsolv to favor locked packages when choosing between
* alternatives. */
for (guint i = 0; i < locked_pkgs->len; i++)
hy_goal_favor (goal, locked_pkgs->pdata[i]);
}
}

/* Process excludes */
Expand All @@ -2128,9 +2127,8 @@ rpmostree_context_prepare (RpmOstreeContext *self,
const char *pkgname = *iter;
hy_autoquery HyQuery query = hy_query_create (sack);
hy_query_filter (query, HY_PKG_NAME, HY_EQ, pkgname);
DnfPackageSet *pset = hy_query_run_set (query);
g_autoptr(DnfPackageSet) pset = hy_query_run_set (query);
dnf_sack_add_excludes (sack, pset);
dnf_packageset_free (pset);
}

/* First, handle packages to remove */
Expand Down
24 changes: 24 additions & 0 deletions tests/compose/test-lockfile.sh
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,30 @@ assert_file_has_content out.txt 'test-pkg-common-1.0-1.x86_64'
assert_not_file_has_content out.txt 'another-test-pkg'
echo "ok relaxed mode can remove pkg"

# check that we prefer locked packages over unlocked ones to minimize the diff
build_rpm dodo requires dodo-dep
build_rpm dodo-dep-a provides dodo-dep
build_rpm dodo-dep-b provides dodo-dep
cat > override.lock <<EOF
{
"packages": {
"dodo-dep-b": {
"evra": "1.0-1.x86_64"
}
}
}
EOF
treefile_append "packages" '["dodo"]'
runcompose \
--ex-lockfile="$PWD/versions.lock" \
--ex-lockfile="$PWD/override.lock" \
--dry-run "${treefile}" |& tee out.txt
assert_file_has_content out.txt 'dodo-1.0-1.x86_64'
assert_file_has_content out.txt 'dodo-dep-b-1.0-1.x86_64'
assert_not_file_has_content out.txt 'dodo-dep-a-1.0-1.x86_64'
echo "ok relaxed mode prefer locked pkg"
treefile_remove "packages" '"dodo"'

# test strict mode

# sanity-check that refeeding the output lockfile as input satisfies strict mode
Expand Down