sysroot: Add ostree_sysroot_write_deployments_with_options()

More sophisticated users of libostree like rpm-ostree need control over things
like the system repository. Previously we introduced a "no cleanup" flag to
`ostree_sysroot_simple_write_deployment()`, but that's a high level API that
does filtering on its own.

Since rpm-ostree needs more control, let's expose the bare essentials of the
"sysroot commit" operation with an extensible options structure, where one of
the options is whether or not to do post-transaction repository operations.

Closes: #745
Approved by: jlebon
This commit is contained in:
Colin Walters 2017-03-20 10:19:04 -04:00 committed by Atomic Bot
parent ed60a854e4
commit a5d5333c83
6 changed files with 45 additions and 18 deletions

View File

@ -473,6 +473,7 @@ ostree_sysroot_deployment_set_kargs
ostree_sysroot_deployment_set_mutable
ostree_sysroot_deployment_unlock
ostree_sysroot_write_deployments
ostree_sysroot_write_deployments_with_options
ostree_sysroot_write_origin_file
ostree_sysroot_deploy_tree
ostree_sysroot_get_merge_deployment

View File

@ -391,6 +391,7 @@ global:
ostree_check_version;
ostree_diff_dirs_with_options;
ostree_sepolicy_new_at;
ostree_sysroot_write_deployments_with_options;
} LIBOSTREE_2017.3;
/* Stub section for the stable release *after* this development one; don't

View File

@ -1686,8 +1686,8 @@ is_ro_mount (const char *path)
* @cancellable: Cancellable
* @error: Error
*
* Assuming @new_deployments have already been deployed in place on
* disk, atomically update bootloader configuration.
* Older version of ostree_sysroot_write_deployments_with_options(). This
* version will perform post-deployment cleanup by default.
*/
gboolean
ostree_sysroot_write_deployments (OstreeSysroot *self,
@ -1695,16 +1695,32 @@ ostree_sysroot_write_deployments (OstreeSysroot *self,
GCancellable *cancellable,
GError **error)
{
return _ostree_sysroot_write_deployments_internal (self, new_deployments,
TRUE, cancellable, error);
OstreeSysrootWriteDeploymentsOpts opts = { .do_postclean = TRUE };
return ostree_sysroot_write_deployments_with_options (self, new_deployments, &opts,
cancellable, error);
}
/**
* ostree_sysroot_write_deployments_with_options:
* @self: Sysroot
* @new_deployments: (element-type OstreeDeployment): List of new deployments
* @opts: Options
* @cancellable: Cancellable
* @error: Error
*
* Assuming @new_deployments have already been deployed in place on disk via
* ostree_sysroot_deploy_tree(), atomically update bootloader configuration. By
* default, no post-transaction cleanup will be performed. You should invoke
* ostree_sysroot_cleanup() at some point after the transaction, or specify
* `do_postclean` in @opts. Skipping the post-transaction cleanup is useful
* if for example you want to control pruning of the repository.
*/
gboolean
_ostree_sysroot_write_deployments_internal (OstreeSysroot *self,
GPtrArray *new_deployments,
gboolean do_clean,
GCancellable *cancellable,
GError **error)
ostree_sysroot_write_deployments_with_options (OstreeSysroot *self,
GPtrArray *new_deployments,
OstreeSysrootWriteDeploymentsOpts *opts,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
guint i;
@ -1930,7 +1946,7 @@ _ostree_sysroot_write_deployments_internal (OstreeSysroot *self,
/* And finally, cleanup of any leftover data.
*/
if (do_clean)
if (opts->do_postclean)
{
if (!ostree_sysroot_cleanup (self, cancellable, error))
{

View File

@ -114,10 +114,4 @@ gboolean _ostree_sysroot_cleanup_internal (OstreeSysroot *sysroot,
GCancellable *cancellable,
GError **error);
gboolean _ostree_sysroot_write_deployments_internal (OstreeSysroot *self,
GPtrArray *new_deployments,
gboolean do_clean,
GCancellable *cancellable,
GError **error);
G_END_DECLS

View File

@ -1553,6 +1553,7 @@ ostree_sysroot_simple_write_deployment (OstreeSysroot *sysroot,
g_autoptr(GPtrArray) deployments = NULL;
g_autoptr(GPtrArray) new_deployments = g_ptr_array_new_with_free_func (g_object_unref);
const gboolean postclean = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NO_CLEAN) == 0;
OstreeSysrootWriteDeploymentsOpts write_opts = { .do_postclean = postclean };
gboolean retain = (flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_RETAIN) > 0;
const gboolean make_default = !((flags & OSTREE_SYSROOT_SIMPLE_WRITE_DEPLOYMENT_FLAGS_NOT_DEFAULT) > 0);
gboolean added_new = FALSE;
@ -1603,8 +1604,8 @@ ostree_sysroot_simple_write_deployment (OstreeSysroot *sysroot,
added_new = TRUE;
}
if (!_ostree_sysroot_write_deployments_internal (sysroot, new_deployments,
postclean, cancellable, error))
if (!ostree_sysroot_write_deployments_with_options (sysroot, new_deployments, &write_opts,
cancellable, error))
goto out;
ret = TRUE;

View File

@ -145,6 +145,20 @@ gboolean ostree_sysroot_write_deployments (OstreeSysroot *self,
GCancellable *cancellable,
GError **error);
typedef struct {
gboolean do_postclean;
gboolean unused_bools[7];
int unused_ints[7];
gpointer unused_ptrs[7];
} OstreeSysrootWriteDeploymentsOpts;
_OSTREE_PUBLIC
gboolean ostree_sysroot_write_deployments_with_options (OstreeSysroot *self,
GPtrArray *new_deployments,
OstreeSysrootWriteDeploymentsOpts *opts,
GCancellable *cancellable,
GError **error);
_OSTREE_PUBLIC
gboolean ostree_sysroot_deploy_tree (OstreeSysroot *self,
const char *osname,