diff --git a/src/libostree/ostree-sysroot-upgrader.c b/src/libostree/ostree-sysroot-upgrader.c index daf2445c11..5ac981f628 100644 --- a/src/libostree/ostree-sysroot-upgrader.c +++ b/src/libostree/ostree-sysroot-upgrader.c @@ -552,7 +552,8 @@ ostree_sysroot_upgrader_pull_one_dir (OstreeSysrootUpgrader *self, g_assert (self->merge_deployment); from_revision = ostree_deployment_get_csum (self->merge_deployment); - if (self->origin_remote) + if (self->origin_remote && + (upgrader_flags & OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC) == 0)) { if (!ostree_repo_pull_one_dir (repo, self->origin_remote, dir_to_pull, refs_to_fetch, flags, progress, diff --git a/src/libostree/ostree-sysroot-upgrader.h b/src/libostree/ostree-sysroot-upgrader.h index 77bc8a1d20..83c4ad3259 100644 --- a/src/libostree/ostree-sysroot-upgrader.h +++ b/src/libostree/ostree-sysroot-upgrader.h @@ -85,7 +85,8 @@ gboolean ostree_sysroot_upgrader_check_timestamps (OstreeRepo *repo, typedef enum { OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_NONE = 0, - OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER = (1 << 0) + OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER = (1 << 0), + OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC = (1 << 1) /* Don't actually do a pull, just check timestamps/changed */ } OstreeSysrootUpgraderPullFlags; _OSTREE_PUBLIC diff --git a/src/ostree/ot-admin-builtin-upgrade.c b/src/ostree/ot-admin-builtin-upgrade.c index 394b339a9b..0186333bc7 100644 --- a/src/ostree/ot-admin-builtin-upgrade.c +++ b/src/ostree/ot-admin-builtin-upgrade.c @@ -34,6 +34,8 @@ static gboolean opt_reboot; static gboolean opt_allow_downgrade; +static gboolean opt_pull_only; +static gboolean opt_deploy_only; static char *opt_osname; static char *opt_override_commit; @@ -42,6 +44,8 @@ static GOptionEntry options[] = { { "reboot", 'r', 0, G_OPTION_ARG_NONE, &opt_reboot, "Reboot after a successful upgrade", NULL }, { "allow-downgrade", 0, 0, G_OPTION_ARG_NONE, &opt_allow_downgrade, "Permit deployment of chronologically older trees", NULL }, { "override-commit", 0, 0, G_OPTION_ARG_STRING, &opt_override_commit, "Deploy CHECKSUM instead of the latest tree", "CHECKSUM" }, + { "pull-only", 0, 0, G_OPTION_ARG_NONE, &opt_pull_only, "Do not create a deployment, just download", NULL }, + { "deploy-only", 0, 0, G_OPTION_ARG_NONE, &opt_deploy_only, "Do not pull, only deploy", NULL }, { NULL } }; @@ -64,6 +68,19 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr &sysroot, cancellable, error)) goto out; + if (opt_pull_only && opt_deploy_only) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Cannot simultaneously specify --pull-only and --deploy-only"); + goto out; + } + else if (opt_pull_only && opt_reboot) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Cannot simultaneously specify --pull-only and --reboot"); + goto out; + } + if (!ostree_sysroot_load (sysroot, cancellable, error)) goto out; @@ -104,6 +121,21 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr } } + /* In the pull-only case, we do a cleanup here to ensure that if multiple + * commits were pulled, we garbage collect any intermediate data before + * pulling more. This is really a best practice in general, but for maximum + * compatiblity, we only do cleanup if a user specifies the new --pull-only + * option. Otherwise, we would break the case of trying to deploy a commit + * that isn't directly referenced. + */ + if (opt_pull_only) + { + if (!ostree_sysroot_cleanup (sysroot, cancellable, error)) + goto out; + } + else if (opt_deploy_only) + upgraderpullflags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_SYNTHETIC; + { g_auto(GLnxConsoleRef) console = { 0, }; glnx_console_lock (&console); @@ -112,7 +144,7 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr if (opt_allow_downgrade) upgraderpullflags |= OSTREE_SYSROOT_UPGRADER_PULL_FLAGS_ALLOW_OLDER; - + if (!ostree_sysroot_upgrader_pull (upgrader, 0, upgraderpullflags, progress, &changed, cancellable, error)) @@ -128,8 +160,11 @@ ot_admin_builtin_upgrade (int argc, char **argv, GCancellable *cancellable, GErr } else { - if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error)) - goto out; + if (!opt_pull_only) + { + if (!ostree_sysroot_upgrader_deploy (upgrader, cancellable, error)) + goto out; + } if (opt_reboot) {