lib/sysroot: Add non-failable ostree_sysroot_repo()

Having a failable accessor is annoying, since it's really common
to reference both.  Instead, open the repo once when we load
the sysroot, and provide a non-failable accessor.

This is also prep for `ostree_repo_open_at()`, which collapses the separation
between `ostree_repo_new()` and `ostree_repo_open()`.

Closes: #886
Approved by: jlebon
This commit is contained in:
Colin Walters 2017-05-25 19:38:52 -04:00 committed by Atomic Bot
parent ed430b45de
commit 9bf8a8503a
7 changed files with 47 additions and 15 deletions

View File

@ -486,6 +486,7 @@ ostree_sysroot_get_deployment_dirpath
ostree_sysroot_get_deployment_origin_path ostree_sysroot_get_deployment_origin_path
ostree_sysroot_cleanup ostree_sysroot_cleanup
ostree_sysroot_prepare_cleanup ostree_sysroot_prepare_cleanup
ostree_sysroot_repo
ostree_sysroot_get_repo ostree_sysroot_get_repo
ostree_sysroot_init_osname ostree_sysroot_init_osname
ostree_sysroot_deployment_set_kargs ostree_sysroot_deployment_set_kargs

View File

@ -402,12 +402,10 @@ global:
* NOTE NOTE NOTE * NOTE NOTE NOTE
*/ */
/* LIBOSTREE_2017.7 {
LIBOSTREE_2017.$NEWVERSION {
global: global:
someostree_symbol_deleteme; ostree_sysroot_repo;
} LIBOSTREE_2017.6; } LIBOSTREE_2017.6;
*/
/* Stub section for the stable release *after* this development one; don't /* Stub section for the stable release *after* this development one; don't
* edit this other than to update the last number. This is just a copy/paste * edit this other than to update the last number. This is just a copy/paste

View File

@ -501,8 +501,6 @@ _ostree_sysroot_cleanup_internal (OstreeSysroot *self,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
glnx_unref_object OstreeRepo *repo = NULL;
g_return_val_if_fail (OSTREE_IS_SYSROOT (self), FALSE); g_return_val_if_fail (OSTREE_IS_SYSROOT (self), FALSE);
g_return_val_if_fail (self->loaded, FALSE); g_return_val_if_fail (self->loaded, FALSE);
@ -512,9 +510,7 @@ _ostree_sysroot_cleanup_internal (OstreeSysroot *self,
if (!cleanup_old_deployments (self, cancellable, error)) if (!cleanup_old_deployments (self, cancellable, error))
return FALSE; return FALSE;
if (!ostree_sysroot_get_repo (self, &repo, cancellable, error)) OstreeRepo *repo = ostree_sysroot_repo (self);
return FALSE;
if (!generate_deployment_refs (self, repo, if (!generate_deployment_refs (self, repo,
self->bootversion, self->bootversion,
self->subbootversion, self->subbootversion,

View File

@ -1956,10 +1956,7 @@ ostree_sysroot_deploy_tree (OstreeSysroot *self,
if (!glnx_opendirat (self->sysroot_fd, osdeploypath, TRUE, &os_deploy_dfd, error)) if (!glnx_opendirat (self->sysroot_fd, osdeploypath, TRUE, &os_deploy_dfd, error))
return FALSE; return FALSE;
glnx_unref_object OstreeRepo *repo = NULL; OstreeRepo *repo = ostree_sysroot_repo (self);
if (!ostree_sysroot_get_repo (self, &repo, cancellable, error))
return FALSE;
glnx_unref_object OstreeDeployment *merge_deployment = NULL; glnx_unref_object OstreeDeployment *merge_deployment = NULL;
if (provided_merge_deployment != NULL) if (provided_merge_deployment != NULL)
merge_deployment = g_object_ref (provided_merge_deployment); merge_deployment = g_object_ref (provided_merge_deployment);

View File

@ -57,6 +57,7 @@ struct OstreeSysroot {
/* Only access through ostree_sysroot_get_repo() */ /* Only access through ostree_sysroot_get_repo() */
OstreeRepo *repo; OstreeRepo *repo;
gboolean repo_opened;
OstreeSysrootDebugFlags debug_flags; OstreeSysrootDebugFlags debug_flags;
}; };

View File

@ -729,6 +729,18 @@ ostree_sysroot_load (OstreeSysroot *self,
return ostree_sysroot_load_if_changed (self, NULL, cancellable, error); return ostree_sysroot_load_if_changed (self, NULL, cancellable, error);
} }
static gboolean
ensure_repo_opened (OstreeSysroot *self,
GError **error)
{
if (self->repo_opened)
return TRUE;
if (!ostree_repo_open (self->repo, NULL, error))
return FALSE;
self->repo_opened = TRUE;
return TRUE;
}
gboolean gboolean
ostree_sysroot_load_if_changed (OstreeSysroot *self, ostree_sysroot_load_if_changed (OstreeSysroot *self,
gboolean *out_changed, gboolean *out_changed,
@ -738,6 +750,13 @@ ostree_sysroot_load_if_changed (OstreeSysroot *self,
if (!ensure_sysroot_fd (self, error)) if (!ensure_sysroot_fd (self, error))
return FALSE; return FALSE;
/* Here we also lazily initialize the repository. We didn't do this
* previous to v2017.6, but we do now to support the error-free
* ostree_sysroot_repo() API.
*/
if (!ensure_repo_opened (self, error))
return FALSE;
int bootversion = 0; int bootversion = 0;
if (!read_current_bootversion (self, &bootversion, cancellable, error)) if (!read_current_bootversion (self, &bootversion, cancellable, error))
return FALSE; return FALSE;
@ -918,8 +937,7 @@ ostree_sysroot_get_repo (OstreeSysroot *self,
GCancellable *cancellable, GCancellable *cancellable,
GError **error) GError **error)
{ {
/* ostree_repo_open() is idempotent. */ if (!ensure_repo_opened (self, error))
if (!ostree_repo_open (self->repo, cancellable, error))
return FALSE; return FALSE;
if (out_repo != NULL) if (out_repo != NULL)
@ -927,6 +945,24 @@ ostree_sysroot_get_repo (OstreeSysroot *self,
return TRUE; return TRUE;
} }
/**
* ostree_sysroot_repo:
* @self: Sysroot
*
* This function is a variant of ostree_sysroot_get_repo() that cannot fail, and
* returns a cached repository. Can only be called after ostree_sysroot_load()
* has been invoked successfully.
*
* Returns: (transfer none): The OSTree repository in sysroot @self.
*/
OstreeRepo *
ostree_sysroot_repo (OstreeSysroot *self)
{
g_return_val_if_fail (self->loaded, NULL);
g_assert (self->repo);
return self->repo;
}
/** /**
* ostree_sysroot_query_bootloader: * ostree_sysroot_query_bootloader:
* @sysroot: Sysroot * @sysroot: Sysroot

View File

@ -126,6 +126,9 @@ gboolean ostree_sysroot_write_origin_file (OstreeSysroot *sysroot,
GCancellable *cancellable, GCancellable *cancellable,
GError **error); GError **error);
_OSTREE_PUBLIC
OstreeRepo * ostree_sysroot_repo (OstreeSysroot *self);
_OSTREE_PUBLIC _OSTREE_PUBLIC
gboolean ostree_sysroot_get_repo (OstreeSysroot *self, gboolean ostree_sysroot_get_repo (OstreeSysroot *self,
OstreeRepo **out_repo, OstreeRepo **out_repo,