blob: remove _fromchunks() The callback mechanism makes it awkward to write data from an IO source; move to `_fromstream()` which lets the caller remain in control, in the same vein as we prefer iterators over foreach callbacks.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 35e9264..924cfa1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,10 @@ v0.24 + 1
### API removals
+* `git_blob_create_fromchunks()` has been removed in favour of
+ `git_blob_create_fromstream()`.
+
+
### Breaking API changes
v0.24
diff --git a/src/blob.c b/src/blob.c
index a1ef247..1926c9e 100644
--- a/src/blob.c
+++ b/src/blob.c
@@ -274,66 +274,6 @@ int git_blob_create_fromdisk(
return error;
}
-#define BUFFER_SIZE 4096
-
-int git_blob_create_fromchunks(
- git_oid *id,
- git_repository *repo,
- const char *hintpath,
- int (*source_cb)(char *content, size_t max_length, void *payload),
- void *payload)
-{
- int error;
- char *content = NULL;
- git_filebuf file = GIT_FILEBUF_INIT;
- git_buf path = GIT_BUF_INIT;
-
- assert(id && repo && source_cb);
-
- if ((error = git_buf_joinpath(
- &path, git_repository_path(repo), GIT_OBJECTS_DIR "streamed")) < 0)
- goto cleanup;
-
- content = git__malloc(BUFFER_SIZE);
- GITERR_CHECK_ALLOC(content);
-
- if ((error = git_filebuf_open(
- &file, git_buf_cstr(&path), GIT_FILEBUF_TEMPORARY, 0666)) < 0)
- goto cleanup;
-
- while (1) {
- int read_bytes = source_cb(content, BUFFER_SIZE, payload);
-
- if (!read_bytes)
- break;
-
- if (read_bytes > BUFFER_SIZE) {
- giterr_set(GITERR_OBJECT, "Invalid chunk size while creating blob");
- error = GIT_EBUFS;
- } else if (read_bytes < 0) {
- error = giterr_set_after_callback(read_bytes);
- } else {
- error = git_filebuf_write(&file, content, read_bytes);
- }
-
- if (error < 0)
- goto cleanup;
- }
-
- if ((error = git_filebuf_flush(&file)) < 0)
- goto cleanup;
-
- error = git_blob__create_from_paths(
- id, NULL, repo, file.path_lock, hintpath, 0, hintpath != NULL);
-
-cleanup:
- git_buf_free(&path);
- git_filebuf_cleanup(&file);
- git__free(content);
-
- return error;
-}
-
typedef struct {
git_writestream parent;
git_filebuf fbuf;
diff --git a/tests/object/blob/fromchunks.c b/tests/object/blob/fromchunks.c
deleted file mode 100644
index 5a7d8f7..0000000
--- a/tests/object/blob/fromchunks.c
+++ /dev/null
@@ -1,156 +0,0 @@
-#include "clar_libgit2.h"
-#include "buffer.h"
-#include "posix.h"
-#include "path.h"
-#include "fileops.h"
-
-static git_repository *repo;
-static char textual_content[] = "libgit2\n\r\n\0";
-
-void test_object_blob_fromchunks__initialize(void)
-{
- repo = cl_git_sandbox_init("testrepo.git");
-}
-
-void test_object_blob_fromchunks__cleanup(void)
-{
- cl_git_sandbox_cleanup();
-}
-
-static int text_chunked_source_cb(char *content, size_t max_length, void *payload)
-{
- int *count;
-
- GIT_UNUSED(max_length);
-
- count = (int *)payload;
- (*count)--;
-
- if (*count < 0)
- return 0;
-
- strcpy(content, textual_content);
- return (int)strlen(textual_content);
-}
-
-void test_object_blob_fromchunks__can_create_a_blob_from_a_in_memory_chunk_provider(void)
-{
- git_oid expected_oid, oid;
- git_object *blob;
- int howmany = 6;
-
- cl_git_pass(git_oid_fromstr(&expected_oid, "321cbdf08803c744082332332838df6bd160f8f9"));
-
- cl_git_fail_with(
- git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY),
- GIT_ENOTFOUND);
-
- cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany));
-
- cl_git_pass(git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY));
- cl_assert(git_oid_cmp(&expected_oid, git_object_id(blob)) == 0);
-
- git_object_free(blob);
-}
-
-void test_object_blob_fromchunks__doesnot_overwrite_an_already_existing_object(void)
-{
- git_buf path = GIT_BUF_INIT;
- git_buf content = GIT_BUF_INIT;
- git_oid expected_oid, oid;
- int howmany = 6;
-
- cl_git_pass(git_oid_fromstr(&expected_oid, "321cbdf08803c744082332332838df6bd160f8f9"));
-
- cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany));
-
- /* Let's replace the content of the blob file storage with something else... */
- cl_git_pass(git_buf_joinpath(&path, git_repository_path(repo), "objects/32/1cbdf08803c744082332332838df6bd160f8f9"));
- cl_git_pass(p_unlink(git_buf_cstr(&path)));
- cl_git_mkfile(git_buf_cstr(&path), "boom");
-
- /* ...request a creation of the same blob... */
- howmany = 7;
- cl_git_pass(git_blob_create_fromchunks(&oid, repo, NULL, text_chunked_source_cb, &howmany));
-
- /* ...and ensure the content of the faked blob file hasn't been altered */
- cl_git_pass(git_futils_readbuffer(&content, git_buf_cstr(&path)));
- cl_assert(!git__strcmp("boom", git_buf_cstr(&content)));
-
- git_buf_free(&path);
- git_buf_free(&content);
-}
-
-#define GITATTR "* text=auto\n" \
- "*.txt text\n" \
- "*.data binary\n"
-
-static void write_attributes(git_repository *repo)
-{
- git_buf buf = GIT_BUF_INIT;
-
- cl_git_pass(git_buf_joinpath(&buf, git_repository_path(repo), "info"));
- cl_git_pass(git_buf_joinpath(&buf, git_buf_cstr(&buf), "attributes"));
-
- cl_git_pass(git_futils_mkpath2file(git_buf_cstr(&buf), 0777));
- cl_git_rewritefile(git_buf_cstr(&buf), GITATTR);
-
- git_buf_free(&buf);
-}
-
-static void assert_named_chunked_blob(const char *expected_sha, const char *fake_name)
-{
- git_oid expected_oid, oid;
- int howmany = 6;
-
- cl_git_pass(git_oid_fromstr(&expected_oid, expected_sha));
-
- cl_git_pass(git_blob_create_fromchunks(&oid, repo, fake_name, text_chunked_source_cb, &howmany));
- cl_assert(git_oid_cmp(&expected_oid, &oid) == 0);
-}
-
-void test_object_blob_fromchunks__creating_a_blob_from_chunks_honors_the_attributes_directives(void)
-{
- write_attributes(repo);
-
- assert_named_chunked_blob("321cbdf08803c744082332332838df6bd160f8f9", "dummy.data");
- assert_named_chunked_blob("e9671e138a780833cb689753570fd10a55be84fb", "dummy.txt");
- assert_named_chunked_blob("e9671e138a780833cb689753570fd10a55be84fb", "dummy.dunno");
-}
-
-static int failing_chunked_source_cb(
- char *content, size_t max_length, void *payload)
-{
- int *count = (int *)payload;
-
- GIT_UNUSED(max_length);
-
- (*count)--;
- if (*count == 0)
- return -1234;
-
- strcpy(content, textual_content);
- return (int)strlen(textual_content);
-}
-
-void test_object_blob_fromchunks__can_stop_with_error(void)
-{
- git_oid expected_oid, oid;
- git_object *blob;
- int howmany = 7;
-
- cl_git_pass(git_oid_fromstr(
- &expected_oid, "321cbdf08803c744082332332838df6bd160f8f9"));
-
- cl_git_fail_with(
- git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY),
- GIT_ENOTFOUND);
-
- cl_git_fail_with(git_blob_create_fromchunks(
- &oid, repo, NULL, failing_chunked_source_cb, &howmany), -1234);
-
- cl_git_fail_with(
- git_object_lookup(&blob, repo, &expected_oid, GIT_OBJ_ANY),
- GIT_ENOTFOUND);
-}
-