diff options
| author | Carlos Martín Nieto <cmn@dwim.me> | 2015-11-04 10:30:48 -0800 |
|---|---|---|
| committer | Carlos Martín Nieto <cmn@dwim.me> | 2016-03-22 19:34:08 +0100 |
| commit | 0a5c6028898e637544962c2c6b1ef8eeeb9c1d38 (patch) | |
| tree | e4c57cace7cb954ff337a1b67a44efba3b891c26 /include/git2 | |
| parent | 3fa764edd2a11691876153fef6523375b6e4553d (diff) | |
| download | libgit2-0a5c6028898e637544962c2c6b1ef8eeeb9c1d38.tar.gz | |
blob: introduce creating a blob by writing into a stream
The pair of `git_blob_create_frombuffer()` and
`git_blob_create_frombuffer_commit()` is meant to replace
`git_blob_create_fromchunks()` by providing a way for a user to write a
new blob when they want filtering or they do not know the size.
This approach allows the caller to retain control over when to add data
to this buffer and a more natural fit into higher-level language's own
stream abstractions instead of having to handle IO wait in the callback.
The in-memory buffer size of 2MB is chosen somewhat arbitrarily to be a
round multiple of usual page sizes and a value where most blobs seem
likely to be either going to be way below or way over that size. It's
also a round number of pages.
This implementation re-uses the helper we have from `_fromchunks()` so
we end up writing everything to disk, but hopefully more efficiently
than with a default filebuf. A later optimisation can be to avoid
writing the in-memory contents to disk, with some extra complexity.
Diffstat (limited to 'include/git2')
| -rw-r--r-- | include/git2/blob.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/git2/blob.h b/include/git2/blob.h index 9a57c37f5..f451593cd 100644 --- a/include/git2/blob.h +++ b/include/git2/blob.h @@ -192,6 +192,49 @@ GIT_EXTERN(int) git_blob_create_fromchunks( void *payload); /** + * Create a stream to write a new blob into the object db + * + * This function may need to buffer the data on disk and will in + * general not be the right choice if you know the size of the data + * to write. If you have data in memory, use + * `git_blob_create_frombuffer()`. If you do not, but know the size of + * the contents (and don't want/need to perform filtering), use + * `git_odb_open_wstream()`. + * + * Don't close this stream yourself but pass it to + * `git_blob_create_fromstream_commit()` to commit the write to the + * object db and get the object id. + * + * If the `hintpath` parameter is filled, it will be used to determine + * what git filters should be applied to the object before it is written + * to the object database. + * + * @param out the stream into which to write + * @param repo Repository where the blob will be written. + * This repository can be bare or not. + * @param hintpath If not NULL, will be used to select data filters + * to apply onto the content of the blob to be created. + * @return 0 or error code + */ +GIT_EXTERN(int) git_blob_create_fromstream( + git_writestream **out, + git_repository *repo, + const char *hintpath); + +/** + * Close the stream and write the blob to the object db + * + * The stream will be closed and freed. + * + * @param out the id of the new blob + * @param stream the stream to close + * @return 0 or an error code + */ +GIT_EXTERN(int) git_blob_create_fromstream_commit( + git_oid *out, + git_writestream *stream); + +/** * Write an in-memory buffer to the ODB as a blob * * @param id return the id of the written blob |
