app/override: allow removing and replacing atomically

This is an essential functionality rather than a nicety. Some
replacements can *only* be done without conflicts if we can remove
packages at the same time.

I do like that this has to be done explicitly, though OTOH, I can
definitely see folks wanting an `--allow-removals` type of switch in the
future.

Closes: #1255

Closes: #1257
Approved by: cgwalters
This commit is contained in:
Jonathan Lebon 2018-02-16 17:50:26 +00:00 committed by Atomic Bot
parent 5879b96a64
commit ff9c19acd3
2 changed files with 27 additions and 6 deletions

View File

@ -29,6 +29,8 @@ static char *opt_osname;
static gboolean opt_reboot;
static gboolean opt_dry_run;
static gboolean opt_reset_all;
static const char *const *opt_remove_pkgs;
static const char *const *opt_replace_pkgs;
static const char *const *install_pkgs;
static const char *const *uninstall_pkgs;
@ -44,6 +46,16 @@ static GOptionEntry reset_option_entries[] = {
{ NULL }
};
static GOptionEntry replace_option_entries[] = {
{ "remove", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_remove_pkgs, "Remove a package", "PKG" },
{ NULL }
};
static GOptionEntry remove_option_entries[] = {
{ "replace", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_replace_pkgs, "Replace a package", "RPM" },
{ NULL }
};
static gboolean
handle_override (RPMOSTreeSysroot *sysroot_proxy,
const char *const *override_remove,
@ -124,6 +136,8 @@ rpmostree_override_builtin_replace (int argc, char **argv,
context = g_option_context_new ("PACKAGE [PACKAGE...]");
g_option_context_add_main_entries (context, replace_option_entries, NULL);
if (!rpmostree_option_context_parse (context,
option_entries,
&argc, &argv,
@ -149,7 +163,7 @@ rpmostree_override_builtin_replace (int argc, char **argv,
argv[argc] = NULL;
return handle_override (sysroot_proxy,
NULL, (const char *const*)argv, NULL,
opt_remove_pkgs, (const char *const*)argv, NULL,
cancellable, error);
}
@ -165,6 +179,8 @@ rpmostree_override_builtin_remove (int argc, char **argv,
context = g_option_context_new ("PACKAGE [PACKAGE...]");
g_option_context_add_main_entries (context, remove_option_entries, NULL);
if (!rpmostree_option_context_parse (context,
option_entries,
&argc, &argv,
@ -190,7 +206,7 @@ rpmostree_override_builtin_remove (int argc, char **argv,
argv[argc] = NULL;
return handle_override (sysroot_proxy,
(const char *const*)argv, NULL, NULL,
(const char *const*)argv, opt_replace_pkgs, NULL,
cancellable, error);
}

View File

@ -164,17 +164,22 @@ echo "ok active -> inactive -> active override replace"
vm_rpmostree cleanup -p
# try both local package layering and local replacements to
# make sure fd sending doesn't get mixed up
# try both local package layering and local replacements to make sure fd sending
# doesn't get mixed up; and also remove a package at the same time
vm_build_rpm baz
vm_cmd ostree commit -b vmcheck --tree=ref=vmcheck_tmp/with_foo_and_bar
vm_rpmostree upgrade
vm_rpmostree override replace $YUMREPO/bar-0.9-1.x86_64.rpm \
--install $YUMREPO/baz-1.0-1.x86_64.rpm
--install $YUMREPO/baz-1.0-1.x86_64.rpm \
--remove foo --remove fooext
vm_assert_status_jq \
'.deployments[0]["base-local-replacements"]|length == 1' \
'.deployments[0]["requested-base-local-replacements"]|length == 1' \
'.deployments[0]["requested-local-packages"]|length == 1' \
'.deployments[0]["requested-local-packages"]|index("baz-1.0-1.x86_64") >= 0'
'.deployments[0]["requested-local-packages"]|index("baz-1.0-1.x86_64") >= 0' \
'.deployments[0]["base-removals"]|length == 2' \
'[.deployments[0]["base-removals"][][.0]]|index("foo-1.0-1.x86_64") >= 0' \
'.deployments[0]["requested-base-removals"]|length == 2' \
'.deployments[0]["requested-base-removals"]|index("foo") >= 0'
assert_replaced_local_pkg bar-1.0-1.x86_64 bar-0.9-1.x86_64
echo "ok local replace and local layering"