summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Lebon <jonathan@jlebon.com>2021-10-05 11:56:02 -0400
committerGitHub <noreply@github.com>2021-10-05 11:56:02 -0400
commit8cb5d920c4b89d17c196f30f2c59fcbd4c762a17 (patch)
tree781ec494f6bb2033600d2cdf654f1361d0cb5b8c
parentcf2eef8486f1d1d4f47ef6519c2a288716591360 (diff)
parent868776a2961069b3502a24d36cd6e38e058a22ee (diff)
downloadostree-8cb5d920c4b89d17c196f30f2c59fcbd4c762a17.tar.gz
Merge pull request #2449 from cgwalters/mtree-from-commit
-rw-r--r--apidoc/ostree-sections.txt1
-rw-r--r--src/libostree/libostree-devel.sym1
-rw-r--r--src/libostree/ostree-mutable-tree.c36
-rw-r--r--src/libostree/ostree-mutable-tree.h6
-rw-r--r--src/ostree/ot-builtin-commit.c12
5 files changed, 47 insertions, 9 deletions
diff --git a/apidoc/ostree-sections.txt b/apidoc/ostree-sections.txt
index ae8abe81..aa74c839 100644
--- a/apidoc/ostree-sections.txt
+++ b/apidoc/ostree-sections.txt
@@ -268,6 +268,7 @@ OstreeLzmaDecompressorClass
<FILE>ostree-mutable-tree</FILE>
OstreeMutableTree
ostree_mutable_tree_new
+ostree_mutable_tree_new_from_commit
ostree_mutable_tree_new_from_checksum
ostree_mutable_tree_check_error
ostree_mutable_tree_set_metadata_checksum
diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym
index 35d53956..6b6b5c6c 100644
--- a/src/libostree/libostree-devel.sym
+++ b/src/libostree/libostree-devel.sym
@@ -25,6 +25,7 @@
LIBOSTREE_2021.5 {
global:
ostree_sepolicy_new_from_commit;
+ ostree_mutable_tree_new_from_commit;
} LIBOSTREE_2021.4;
/* Stub section for the stable release *after* this development one; don't
diff --git a/src/libostree/ostree-mutable-tree.c b/src/libostree/ostree-mutable-tree.c
index 8509d156..bba3cf91 100644
--- a/src/libostree/ostree-mutable-tree.c
+++ b/src/libostree/ostree-mutable-tree.c
@@ -681,3 +681,39 @@ ostree_mutable_tree_new_from_checksum (OstreeRepo *repo,
out->metadata_checksum = g_strdup (metadata_checksum);
return out;
}
+
+/**
+ * ostree_mutable_tree_new_from_commit:
+ * @repo: The repo which contains the objects refered by the checksums.
+ * @rev: ref or SHA-256 checksum
+ *
+ * Creates a new OstreeMutableTree with the contents taken from the given commit.
+ * The data will be loaded from the repo lazily as needed.
+ *
+ * Returns: (transfer full): A new tree
+ * Since: 2021.5
+ */
+OstreeMutableTree *
+ostree_mutable_tree_new_from_commit (OstreeRepo *repo,
+ const char *rev,
+ GError **error)
+{
+ g_autofree char *commit = NULL;
+ if (!ostree_repo_resolve_rev (repo, rev, FALSE, &commit, error))
+ return NULL;
+ g_autoptr(GVariant) commit_v = NULL;
+ if (!ostree_repo_load_commit (repo, commit, &commit_v, NULL, error))
+ return NULL;
+
+ g_autoptr(GVariant) contents_checksum_v = NULL;
+ g_autoptr(GVariant) metadata_checksum_v = NULL;
+ char contents_checksum[OSTREE_SHA256_STRING_LEN + 1];
+ char metadata_checksum[OSTREE_SHA256_STRING_LEN + 1];
+ g_variant_get_child (commit_v, 6, "@ay", &contents_checksum_v);
+ ostree_checksum_inplace_from_bytes (g_variant_get_data (contents_checksum_v),
+ contents_checksum);
+ g_variant_get_child (commit_v, 7, "@ay", &metadata_checksum_v);
+ ostree_checksum_inplace_from_bytes (g_variant_get_data (metadata_checksum_v),
+ metadata_checksum);
+ return ostree_mutable_tree_new_from_checksum (repo, contents_checksum, metadata_checksum);
+}
diff --git a/src/libostree/ostree-mutable-tree.h b/src/libostree/ostree-mutable-tree.h
index 753f96e7..9bf36802 100644
--- a/src/libostree/ostree-mutable-tree.h
+++ b/src/libostree/ostree-mutable-tree.h
@@ -53,6 +53,12 @@ _OSTREE_PUBLIC
OstreeMutableTree *ostree_mutable_tree_new (void);
_OSTREE_PUBLIC
+OstreeMutableTree *
+ostree_mutable_tree_new_from_commit (OstreeRepo *repo,
+ const char *rev,
+ GError **error);
+
+_OSTREE_PUBLIC
OstreeMutableTree * ostree_mutable_tree_new_from_checksum (OstreeRepo *repo,
const char *contents_checksum,
const char *metadata_checksum);
diff --git a/src/ostree/ot-builtin-commit.c b/src/ostree/ot-builtin-commit.c
index b993678e..a306c114 100644
--- a/src/ostree/ot-builtin-commit.c
+++ b/src/ostree/ot-builtin-commit.c
@@ -638,20 +638,14 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio
if (opt_base)
{
- g_autofree char *base_commit = NULL;
- g_autoptr(GFile) base_root = NULL;
- if (!ostree_repo_read_commit (repo, opt_base, &base_root, &base_commit, cancellable, error))
+ mtree = ostree_mutable_tree_new_from_commit (repo, opt_base, error);
+ if (!mtree)
goto out;
- OstreeRepoFile *rootf = (OstreeRepoFile*) base_root;
-
- mtree = ostree_mutable_tree_new_from_checksum (repo,
- ostree_repo_file_tree_get_contents_checksum (rootf),
- ostree_repo_file_tree_get_metadata_checksum (rootf));
if (opt_selinux_policy_from_base)
{
g_assert (modifier);
- if (!ostree_repo_commit_modifier_set_sepolicy_from_commit (modifier, repo, base_commit, cancellable, error))
+ if (!ostree_repo_commit_modifier_set_sepolicy_from_commit (modifier, repo, opt_base, cancellable, error))
goto out;
/* Don't try to handle it twice */
opt_selinux_policy_from_base = FALSE;