summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2020-09-01 12:03:40 +0200
committerAlexander Larsson <alexl@redhat.com>2020-10-23 12:30:08 +0200
commit8e1f199dd4d035b5ff501aa37c6f1229ac3c0e61 (patch)
treedfec1fd551684d26cba49d2866d7d7a8e1065899
parent87e564eeaa569adde786c4c39a2626ca3d687436 (diff)
downloadostree-8e1f199dd4d035b5ff501aa37c6f1229ac3c0e61.tar.gz
deltas: Add ostree_repo_list_static_delta_indexes() function
This lists all the available delta indexes.
-rw-r--r--Makefile-libostree.am6
-rw-r--r--apidoc/ostree-sections.txt1
-rw-r--r--src/libostree/libostree-devel.sym7
-rw-r--r--src/libostree/ostree-repo-static-delta-core.c87
-rw-r--r--src/libostree/ostree-repo.h6
5 files changed, 101 insertions, 6 deletions
diff --git a/Makefile-libostree.am b/Makefile-libostree.am
index bdc47122..eeb0b6c6 100644
--- a/Makefile-libostree.am
+++ b/Makefile-libostree.am
@@ -184,9 +184,9 @@ libostree_1_la_SOURCES += \
endif # USE_GPGME
symbol_files = $(top_srcdir)/src/libostree/libostree-released.sym
-#if BUILDOPT_IS_DEVEL_BUILD
-#symbol_files += $(top_srcdir)/src/libostree/libostree-devel.sym
-#endif
+if BUILDOPT_IS_DEVEL_BUILD
+symbol_files += $(top_srcdir)/src/libostree/libostree-devel.sym
+endif
# http://blog.jgc.org/2007/06/escaping-comma-and-space-in-gnu-make.html
wl_versionscript_arg = -Wl,--version-script=
EXTRA_DIST += \
diff --git a/apidoc/ostree-sections.txt b/apidoc/ostree-sections.txt
index c1d6b35e..ea37823b 100644
--- a/apidoc/ostree-sections.txt
+++ b/apidoc/ostree-sections.txt
@@ -412,6 +412,7 @@ OSTREE_REPO_LIST_OBJECTS_VARIANT_TYPE
ostree_repo_list_objects
ostree_repo_list_commit_objects_starting_with
ostree_repo_list_static_delta_names
+ostree_repo_list_static_delta_indexes
OstreeStaticDeltaGenerateOpt
ostree_repo_static_delta_generate
ostree_repo_static_delta_execute_offline_with_signature
diff --git a/src/libostree/libostree-devel.sym b/src/libostree/libostree-devel.sym
index 8e8d9c81..1350341c 100644
--- a/src/libostree/libostree-devel.sym
+++ b/src/libostree/libostree-devel.sym
@@ -17,9 +17,10 @@
Boston, MA 02111-1307, USA.
***/
-/* Copy the bits below and uncomment the include in Makefile-libostree.am
- when adding a symbol.
-*/
+LIBOSTREE_2020.8 {
+global:
+ ostree_repo_list_static_delta_indexes;
+} LIBOSTREE_2020.7;
/* Stub section for the stable release *after* this development one; don't
* edit this other than to update the year. This is just a copy/paste
diff --git a/src/libostree/ostree-repo-static-delta-core.c b/src/libostree/ostree-repo-static-delta-core.c
index e263e928..e3432aa5 100644
--- a/src/libostree/ostree-repo-static-delta-core.c
+++ b/src/libostree/ostree-repo-static-delta-core.c
@@ -168,6 +168,93 @@ ostree_repo_list_static_delta_names (OstreeRepo *self,
return TRUE;
}
+/**
+ * ostree_repo_list_static_delta_indexes:
+ * @self: Repo
+ * @out_indexes: (out) (element-type utf8) (transfer container): String name of delta indexes (checksum)
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * This function synchronously enumerates all static delta indexes in the
+ * repository, returning its result in @out_indexes.
+ *
+ * Since: 2020.7
+ */
+gboolean
+ostree_repo_list_static_delta_indexes (OstreeRepo *self,
+ GPtrArray **out_indexes,
+ GCancellable *cancellable,
+ GError **error)
+{
+ g_autoptr(GPtrArray) ret_indexes = g_ptr_array_new_with_free_func (g_free);
+
+ g_auto(GLnxDirFdIterator) dfd_iter = { 0, };
+ gboolean exists;
+ if (!ot_dfd_iter_init_allow_noent (self->repo_dir_fd, "delta-indexes", &dfd_iter,
+ &exists, error))
+ return FALSE;
+ if (!exists)
+ {
+ /* Note early return */
+ ot_transfer_out_value (out_indexes, &ret_indexes);
+ return TRUE;
+ }
+
+ while (TRUE)
+ {
+ g_auto(GLnxDirFdIterator) sub_dfd_iter = { 0, };
+ struct dirent *dent;
+
+ if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&dfd_iter, &dent, cancellable, error))
+ return FALSE;
+ if (dent == NULL)
+ break;
+ if (dent->d_type != DT_DIR)
+ continue;
+ if (strlen (dent->d_name) != 2)
+ continue;
+
+ if (!glnx_dirfd_iterator_init_at (dfd_iter.fd, dent->d_name, FALSE,
+ &sub_dfd_iter, error))
+ return FALSE;
+
+ while (TRUE)
+ {
+ struct dirent *sub_dent;
+
+ if (!glnx_dirfd_iterator_next_dent_ensure_dtype (&sub_dfd_iter, &sub_dent,
+ cancellable, error))
+ return FALSE;
+ if (sub_dent == NULL)
+ break;
+ if (sub_dent->d_type != DT_REG)
+ continue;
+
+ const char *name1 = dent->d_name;
+ const char *name2 = sub_dent->d_name;
+
+ /* base64 len is 43, but 2 chars are in the parent dir name */
+ if (strlen (name2) != 41 + strlen(".index") ||
+ !g_str_has_suffix (name2, ".index"))
+ continue;
+
+ g_autoptr(GString) out = g_string_new (name1);
+ g_string_append_len (out, name2, 41);
+
+ char checksum[OSTREE_SHA256_STRING_LEN+1];
+ guchar csum[OSTREE_SHA256_DIGEST_LEN];
+
+ ostree_checksum_b64_inplace_to_bytes (out->str, csum);
+ ostree_checksum_inplace_from_bytes (csum, checksum);
+
+ g_ptr_array_add (ret_indexes, g_strdup (checksum));
+ }
+ }
+
+ ot_transfer_out_value (out_indexes, &ret_indexes);
+ return TRUE;
+}
+
gboolean
_ostree_repo_static_delta_part_have_all_objects (OstreeRepo *repo,
GVariant *checksum_array,
diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h
index d52fc9c3..a3c5dc77 100644
--- a/src/libostree/ostree-repo.h
+++ b/src/libostree/ostree-repo.h
@@ -1046,6 +1046,12 @@ gboolean ostree_repo_list_static_delta_names (OstreeRepo *self,
GCancellable *cancellable,
GError **error);
+_OSTREE_PUBLIC
+gboolean ostree_repo_list_static_delta_indexes (OstreeRepo *self,
+ GPtrArray **out_indexes,
+ GCancellable *cancellable,
+ GError **error);
+
/**
* OstreeStaticDeltaGenerateOpt:
* @OSTREE_STATIC_DELTA_GENERATE_OPT_LOWLATENCY: Optimize for speed of delta creation over space