diff options
| author | Edward Thomson <ethomson@edwardthomson.com> | 2021-03-10 11:21:39 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-10 11:21:39 +0000 |
| commit | 4f4b1139d23a7b38cceb9d83acbfaf73151f522f (patch) | |
| tree | 99127ebfc5d7dc8a1af9d41d342770409584c410 /src | |
| parent | a0fca809aca16f080b2e7446b2bcba37c52fe27e (diff) | |
| parent | 85af7f21692d92d7bdf18522ad19e2d411d11c5c (diff) | |
| download | libgit2-4f4b1139d23a7b38cceb9d83acbfaf73151f522f.tar.gz | |
Merge pull request #5815 from libgit2/ethomson/treebuilder_write
tree: deprecate `git_treebuilder_write_with_buffer`
Diffstat (limited to 'src')
| -rw-r--r-- | src/tree.c | 123 | ||||
| -rw-r--r-- | src/tree.h | 1 |
2 files changed, 68 insertions, 56 deletions
diff --git a/src/tree.c b/src/tree.c index ba6383ef8..5abcc9d3b 100644 --- a/src/tree.c +++ b/src/tree.c @@ -492,6 +492,56 @@ static int check_entry(git_repository *repo, const char *filename, const git_oid return 0; } +static int git_treebuilder__write_with_buffer( + git_oid *oid, + git_treebuilder *bld, + git_buf *buf) +{ + int error = 0; + size_t i, entrycount; + git_odb *odb; + git_tree_entry *entry; + git_vector entries = GIT_VECTOR_INIT; + + git_buf_clear(buf); + + entrycount = git_strmap_size(bld->map); + if ((error = git_vector_init(&entries, entrycount, entry_sort_cmp)) < 0) + goto out; + + if (buf->asize == 0 && + (error = git_buf_grow(buf, entrycount * 72)) < 0) + goto out; + + git_strmap_foreach_value(bld->map, entry, { + if ((error = git_vector_insert(&entries, entry)) < 0) + goto out; + }); + + git_vector_sort(&entries); + + for (i = 0; i < entries.length && !error; ++i) { + entry = git_vector_get(&entries, i); + + git_buf_printf(buf, "%o ", entry->attr); + git_buf_put(buf, entry->filename, entry->filename_len + 1); + git_buf_put(buf, (char *)entry->oid->id, GIT_OID_RAWSZ); + + if (git_buf_oom(buf)) { + error = -1; + goto out; + } + } + + if ((error = git_repository_odb__weakptr(&odb, bld->repo)) == 0) + error = git_odb_write(oid, odb, buf->ptr, buf->size, GIT_OBJECT_TREE); + +out: + git_vector_free(&entries); + + return error; +} + static int append_entry( git_treebuilder *bld, const char *filename, @@ -610,7 +660,7 @@ static int write_tree( } } - if (git_treebuilder_write_with_buffer(oid, bld, shared_buf) < 0) + if (git_treebuilder__write_with_buffer(oid, bld, shared_buf) < 0) goto on_error; git_treebuilder_free(bld); @@ -785,63 +835,10 @@ int git_treebuilder_remove(git_treebuilder *bld, const char *filename) int git_treebuilder_write(git_oid *oid, git_treebuilder *bld) { - int error; - git_buf buffer = GIT_BUF_INIT; - - error = git_treebuilder_write_with_buffer(oid, bld, &buffer); - - git_buf_dispose(&buffer); - return error; -} - -int git_treebuilder_write_with_buffer(git_oid *oid, git_treebuilder *bld, git_buf *tree) -{ - int error = 0; - size_t i, entrycount; - git_odb *odb; - git_tree_entry *entry; - git_vector entries = GIT_VECTOR_INIT; - + GIT_ASSERT_ARG(oid); GIT_ASSERT_ARG(bld); - GIT_ASSERT_ARG(tree); - - git_buf_clear(tree); - - entrycount = git_strmap_size(bld->map); - if ((error = git_vector_init(&entries, entrycount, entry_sort_cmp)) < 0) - goto out; - - if (tree->asize == 0 && - (error = git_buf_grow(tree, entrycount * 72)) < 0) - goto out; - - git_strmap_foreach_value(bld->map, entry, { - if ((error = git_vector_insert(&entries, entry)) < 0) - goto out; - }); - - git_vector_sort(&entries); - for (i = 0; i < entries.length && !error; ++i) { - entry = git_vector_get(&entries, i); - - git_buf_printf(tree, "%o ", entry->attr); - git_buf_put(tree, entry->filename, entry->filename_len + 1); - git_buf_put(tree, (char *)entry->oid->id, GIT_OID_RAWSZ); - - if (git_buf_oom(tree)) { - error = -1; - goto out; - } - } - - if ((error = git_repository_odb__weakptr(&odb, bld->repo)) == 0) - error = git_odb_write(oid, odb, tree->ptr, tree->size, GIT_OBJECT_TREE); - -out: - git_vector_free(&entries); - - return error; + return git_treebuilder__write_with_buffer(oid, bld, &bld->write_cache); } int git_treebuilder_filter( @@ -882,6 +879,7 @@ void git_treebuilder_free(git_treebuilder *bld) if (bld == NULL) return; + git_buf_dispose(&bld->write_cache); git_treebuilder_clear(bld); git_strmap_free(bld->map); git__free(bld); @@ -1306,3 +1304,16 @@ cleanup: git_vector_free(&entries); return error; } + +/* Deprecated Functions */ + +#ifndef GIT_DEPRECATE_HARD + +int git_treebuilder_write_with_buffer(git_oid *oid, git_treebuilder *bld, git_buf *buf) +{ + GIT_UNUSED(buf); + + return git_treebuilder_write(oid, bld); +} + +#endif diff --git a/src/tree.h b/src/tree.h index 973ba15d0..2f3027b5a 100644 --- a/src/tree.h +++ b/src/tree.h @@ -32,6 +32,7 @@ struct git_tree { struct git_treebuilder { git_repository *repo; git_strmap *map; + git_buf write_cache; }; GIT_INLINE(bool) git_tree_entry__is_tree(const struct git_tree_entry *e) |
