repo: Add ostree_repo_write_regfile_inline

When working on ostree-ext and importing from tar, it's
quite inefficient and awkward for small files to end up creating
a whole `GInputStream` and `GFileInfo` and etc. for small files.

Plus the gtk-rs binding API to map from `impl Read` to Gio
https://docs.rs/gio/0.9.1/gio/struct.ReadInputStream.html
requires that the input stream is `Send` but the Rust `tar` API
isn't.

This is only 1/3 of the problem; we also need similar APIs
to directly create a symlink, and to stream large objects via
a push-based API.
This commit is contained in:
Colin Walters committed 2021-04-08 14:57:33 +00:00
1 parent b5c21defe9
commit 4e2a14eb0c
7 files changed
+125 -6

No files matched your search

+45
View File
@@ -2769,6 +2769,51 @@ ostree_repo_write_content (OstreeRepo *self,
cancellable, error);
}
/**
* ostree_repo_write_regfile_inline:
* @self: repo
* @expected_checksum: (allow-none): The expected checksum
* @uid: User id
* @gid: Group id
* @mode: File mode
* @xattrs: (allow-none): Extended attributes, GVariant of type (ayay)
* @buf: (array length=len) (element-type guint8): File contents
* @cancellable: Cancellable
* @error: Error
*
* Synchronously create a file object from the provided content. This API
* is intended for small files where it is reasonable to buffer the entire
* content in memory.
*
* Unlike `ostree_repo_write_content()`, if @expected_checksum is provided,
* this function will not check for the presence of the object beforehand.
*
* Returns: (transfer full): Checksum (as a hex string) of the committed file
* Since: 2021.2
*/
_OSTREE_PUBLIC
char *
ostree_repo_write_regfile_inline (OstreeRepo *self,
const char *expected_checksum,
guint32 uid,
guint32 gid,
guint32 mode,
GVariant *xattrs,
const guint8* buf,
gsize len,
GCancellable *cancellable,
GError **error)
{
g_autoptr(GInputStream) memin = g_memory_input_stream_new_from_data (buf, len, NULL);
g_autoptr(GFileInfo) finfo = _ostree_mode_uidgid_to_gfileinfo (mode, uid, gid);
g_autofree guint8* csum = NULL;
if (!write_content_object (self, expected_checksum,
memin, finfo, xattrs, &csum,
cancellable, error))
return NULL;
return ostree_checksum_from_bytes (csum);
}
typedef struct {
OstreeRepo *repo;
char *expected_checksum;