rugged 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +1 -1
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_repo.c +3 -3
- data/lib/rugged/repository.rb +2 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +11 -6
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +4 -0
- data/vendor/libgit2/cmake/SelectHashes.cmake +1 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +17 -5
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +150 -118
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +93 -42
- data/vendor/libgit2/include/git2/blob.h +14 -2
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +14 -4
- data/vendor/libgit2/include/git2/deprecated.h +206 -6
- data/vendor/libgit2/include/git2/diff.h +34 -19
- data/vendor/libgit2/include/git2/errors.h +6 -6
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +2 -2
- data/vendor/libgit2/include/git2/odb.h +29 -0
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +6 -2
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/tree.h +0 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +25 -4
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +16 -7
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +84 -39
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +42 -37
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +11 -5
- data/vendor/libgit2/src/blob.c +35 -24
- data/vendor/libgit2/src/branch.c +69 -17
- data/vendor/libgit2/src/buffer.c +334 -25
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +2 -2
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +48 -26
- data/vendor/libgit2/src/cherrypick.c +6 -2
- data/vendor/libgit2/src/clone.c +41 -47
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +25 -2
- data/vendor/libgit2/src/config.c +37 -15
- data/vendor/libgit2/src/config_cache.c +5 -3
- data/vendor/libgit2/src/config_file.c +16 -8
- data/vendor/libgit2/src/config_parse.c +4 -6
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +6 -3
- data/vendor/libgit2/src/diff.c +11 -8
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +2 -6
- data/vendor/libgit2/src/diff_generate.c +46 -17
- data/vendor/libgit2/src/diff_print.c +19 -6
- data/vendor/libgit2/src/diff_stats.c +7 -5
- data/vendor/libgit2/src/diff_tform.c +9 -8
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +24 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +5 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +206 -110
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +5 -5
- data/vendor/libgit2/src/futils.h +1 -1
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +106 -70
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +31 -29
- data/vendor/libgit2/src/integer.h +64 -2
- data/vendor/libgit2/src/iterator.c +36 -24
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +117 -50
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +70 -30
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +11 -3
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +471 -10
- data/vendor/libgit2/src/midx.h +28 -1
- data/vendor/libgit2/src/mwindow.c +103 -59
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +127 -3
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +22 -14
- data/vendor/libgit2/src/odb.c +285 -48
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +28 -18
- data/vendor/libgit2/src/odb_mempack.c +1 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +5 -4
- data/vendor/libgit2/src/pack-objects.c +54 -48
- data/vendor/libgit2/src/pack.c +329 -119
- data/vendor/libgit2/src/pack.h +25 -7
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +2 -2
- data/vendor/libgit2/src/patch_parse.c +2 -1
- data/vendor/libgit2/src/path.c +98 -53
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +8 -8
- data/vendor/libgit2/src/pool.c +13 -7
- data/vendor/libgit2/src/posix.c +11 -3
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +93 -49
- data/vendor/libgit2/src/refdb.c +30 -13
- data/vendor/libgit2/src/refdb_fs.c +121 -69
- data/vendor/libgit2/src/reflog.c +19 -14
- data/vendor/libgit2/src/refs.c +76 -41
- data/vendor/libgit2/src/refspec.c +32 -12
- data/vendor/libgit2/src/remote.c +272 -102
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +176 -103
- data/vendor/libgit2/src/repository.h +12 -1
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +6 -2
- data/vendor/libgit2/src/revparse.c +14 -9
- data/vendor/libgit2/src/revwalk.c +32 -15
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/settings.h +11 -0
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +3 -1
- data/vendor/libgit2/src/status.c +7 -4
- data/vendor/libgit2/src/strarray.c +2 -1
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +101 -201
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +5 -6
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +128 -62
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +4 -6
- data/vendor/libgit2/src/tag.c +47 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +19 -8
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +15 -7
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +53 -26
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +3 -3
- data/vendor/libgit2/src/transports/smart.c +12 -7
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +41 -31
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +53 -129
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +22 -24
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +7 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +27 -16
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +32 -16
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -363
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -369
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -64,7 +64,9 @@ int git_smart__store_refs(transport_smart *t, int flushes)
|
|
|
64
64
|
continue;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
gitno_consume(buf, line_end)
|
|
67
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
68
|
+
return -1;
|
|
69
|
+
|
|
68
70
|
if (pkt->type == GIT_PKT_ERR) {
|
|
69
71
|
git_error_set(GIT_ERROR_NET, "remote error: %s", ((git_pkt_err *)pkt)->error);
|
|
70
72
|
git__free(pkt);
|
|
@@ -236,7 +238,9 @@ static int recv_pkt(git_pkt **out_pkt, git_pkt_type *out_type, gitno_buffer *buf
|
|
|
236
238
|
}
|
|
237
239
|
} while (error);
|
|
238
240
|
|
|
239
|
-
gitno_consume(buf, line_end)
|
|
241
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
242
|
+
return -1;
|
|
243
|
+
|
|
240
244
|
if (out_type != NULL)
|
|
241
245
|
*out_type = pkt->type;
|
|
242
246
|
if (out_pkt != NULL)
|
|
@@ -531,7 +535,7 @@ int git_smart__download_pack(
|
|
|
531
535
|
/* We might have something in the buffer already from negotiate_fetch */
|
|
532
536
|
if (t->buffer.offset > 0 && !t->cancelled.val)
|
|
533
537
|
if (t->packetsize_cb(t->buffer.offset, t->packetsize_payload))
|
|
534
|
-
|
|
538
|
+
git_atomic32_set(&t->cancelled, 1);
|
|
535
539
|
}
|
|
536
540
|
|
|
537
541
|
if ((error = git_repository_odb__weakptr(&odb, repo)) < 0 ||
|
|
@@ -791,7 +795,8 @@ static int parse_report(transport_smart *transport, git_push *push)
|
|
|
791
795
|
continue;
|
|
792
796
|
}
|
|
793
797
|
|
|
794
|
-
gitno_consume(buf, line_end)
|
|
798
|
+
if (gitno_consume(buf, line_end) < 0)
|
|
799
|
+
return -1;
|
|
795
800
|
|
|
796
801
|
error = 0;
|
|
797
802
|
|
|
@@ -970,9 +975,10 @@ static int stream_thunk(void *buf, size_t size, void *data)
|
|
|
970
975
|
|
|
971
976
|
if (payload->cb) {
|
|
972
977
|
double current_time = git__timer();
|
|
978
|
+
double elapsed = current_time - payload->last_progress_report_time;
|
|
973
979
|
payload->last_bytes += size;
|
|
974
980
|
|
|
975
|
-
if (
|
|
981
|
+
if (elapsed < 0 || elapsed >= MIN_PROGRESS_UPDATE_INTERVAL) {
|
|
976
982
|
payload->last_progress_report_time = current_time;
|
|
977
983
|
error = payload->cb(payload->pb->nr_written, payload->pb->nr_objects, payload->last_bytes, payload->cb_payload);
|
|
978
984
|
}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
#include <libssh2.h>
|
|
12
12
|
#endif
|
|
13
13
|
|
|
14
|
-
#include "
|
|
14
|
+
#include "runtime.h"
|
|
15
15
|
#include "git2.h"
|
|
16
16
|
#include "buffer.h"
|
|
17
17
|
#include "net.h"
|
|
@@ -238,7 +238,7 @@ static int ssh_stream_alloc(
|
|
|
238
238
|
{
|
|
239
239
|
ssh_stream *s;
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
GIT_ASSERT_ARG(stream);
|
|
242
242
|
|
|
243
243
|
s = git__calloc(sizeof(ssh_stream), 1);
|
|
244
244
|
GIT_ERROR_CHECK_ALLOC(s);
|
|
@@ -404,8 +404,8 @@ static int _git_ssh_authenticate_session(
|
|
|
404
404
|
case GIT_CREDENTIAL_SSH_MEMORY: {
|
|
405
405
|
git_credential_ssh_key *c = (git_credential_ssh_key *)cred;
|
|
406
406
|
|
|
407
|
-
|
|
408
|
-
|
|
407
|
+
GIT_ASSERT(c->username);
|
|
408
|
+
GIT_ASSERT(c->privatekey);
|
|
409
409
|
|
|
410
410
|
rc = libssh2_userauth_publickey_frommemory(
|
|
411
411
|
session,
|
|
@@ -461,13 +461,13 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
|
|
|
461
461
|
|
|
462
462
|
if (no_callback) {
|
|
463
463
|
git_error_set(GIT_ERROR_SSH, "authentication required but no callback set");
|
|
464
|
-
return
|
|
464
|
+
return GIT_EAUTH;
|
|
465
465
|
}
|
|
466
466
|
|
|
467
467
|
if (!(cred->credtype & auth_methods)) {
|
|
468
468
|
cred->free(cred);
|
|
469
|
-
git_error_set(GIT_ERROR_SSH, "callback returned unsupported credentials type");
|
|
470
|
-
return
|
|
469
|
+
git_error_set(GIT_ERROR_SSH, "authentication callback returned unsupported credentials type");
|
|
470
|
+
return GIT_EAUTH;
|
|
471
471
|
}
|
|
472
472
|
|
|
473
473
|
*out = cred;
|
|
@@ -483,7 +483,7 @@ static int _git_ssh_session_create(
|
|
|
483
483
|
LIBSSH2_SESSION* s;
|
|
484
484
|
git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
|
|
485
485
|
|
|
486
|
-
|
|
486
|
+
GIT_ASSERT_ARG(session);
|
|
487
487
|
|
|
488
488
|
s = libssh2_session_init();
|
|
489
489
|
if (!s) {
|
|
@@ -563,9 +563,46 @@ post_extract:
|
|
|
563
563
|
if (t->owner->certificate_check_cb != NULL) {
|
|
564
564
|
git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
|
|
565
565
|
const char *key;
|
|
566
|
+
size_t cert_len;
|
|
567
|
+
int cert_type;
|
|
566
568
|
|
|
567
569
|
cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
|
|
568
570
|
|
|
571
|
+
key = libssh2_session_hostkey(session, &cert_len, &cert_type);
|
|
572
|
+
if (key != NULL) {
|
|
573
|
+
cert.type |= GIT_CERT_SSH_RAW;
|
|
574
|
+
cert.hostkey = key;
|
|
575
|
+
cert.hostkey_len = cert_len;
|
|
576
|
+
switch (cert_type) {
|
|
577
|
+
case LIBSSH2_HOSTKEY_TYPE_RSA:
|
|
578
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
|
|
579
|
+
break;
|
|
580
|
+
case LIBSSH2_HOSTKEY_TYPE_DSS:
|
|
581
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
|
|
582
|
+
break;
|
|
583
|
+
|
|
584
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
|
|
585
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
|
|
586
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
|
|
587
|
+
break;
|
|
588
|
+
case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
|
|
589
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
|
|
590
|
+
break;
|
|
591
|
+
case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
|
|
592
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
|
|
593
|
+
break;
|
|
594
|
+
#endif
|
|
595
|
+
|
|
596
|
+
#ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
|
|
597
|
+
case LIBSSH2_HOSTKEY_TYPE_ED25519:
|
|
598
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
|
|
599
|
+
break;
|
|
600
|
+
#endif
|
|
601
|
+
default:
|
|
602
|
+
cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
569
606
|
#ifdef LIBSSH2_HOSTKEY_HASH_SHA256
|
|
570
607
|
key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
|
|
571
608
|
if (key != NULL) {
|
|
@@ -772,7 +809,7 @@ static int _ssh_close(git_smart_subtransport *subtransport)
|
|
|
772
809
|
{
|
|
773
810
|
ssh_subtransport *t = GIT_CONTAINER_OF(subtransport, ssh_subtransport, parent);
|
|
774
811
|
|
|
775
|
-
|
|
812
|
+
GIT_ASSERT(!t->current_stream);
|
|
776
813
|
|
|
777
814
|
GIT_UNUSED(t);
|
|
778
815
|
|
|
@@ -783,8 +820,6 @@ static void _ssh_free(git_smart_subtransport *subtransport)
|
|
|
783
820
|
{
|
|
784
821
|
ssh_subtransport *t = GIT_CONTAINER_OF(subtransport, ssh_subtransport, parent);
|
|
785
822
|
|
|
786
|
-
assert(!t->current_stream);
|
|
787
|
-
|
|
788
823
|
git__free(t->cmd_uploadpack);
|
|
789
824
|
git__free(t->cmd_receivepack);
|
|
790
825
|
git__free(t);
|
|
@@ -805,7 +840,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
|
|
|
805
840
|
/* either error, or the remote accepts NONE auth, which is bizarre, let's punt */
|
|
806
841
|
if (list == NULL && !libssh2_userauth_authenticated(session)) {
|
|
807
842
|
ssh_error(session, "Failed to retrieve list of SSH authentication methods");
|
|
808
|
-
return
|
|
843
|
+
return GIT_EAUTH;
|
|
809
844
|
}
|
|
810
845
|
|
|
811
846
|
ptr = list;
|
|
@@ -849,7 +884,7 @@ int git_smart_subtransport_ssh(
|
|
|
849
884
|
#ifdef GIT_SSH
|
|
850
885
|
ssh_subtransport *t;
|
|
851
886
|
|
|
852
|
-
|
|
887
|
+
GIT_ASSERT_ARG(out);
|
|
853
888
|
|
|
854
889
|
GIT_UNUSED(param);
|
|
855
890
|
|
|
@@ -867,7 +902,7 @@ int git_smart_subtransport_ssh(
|
|
|
867
902
|
GIT_UNUSED(owner);
|
|
868
903
|
GIT_UNUSED(param);
|
|
869
904
|
|
|
870
|
-
|
|
905
|
+
GIT_ASSERT_ARG(out);
|
|
871
906
|
*out = NULL;
|
|
872
907
|
|
|
873
908
|
git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
|
|
@@ -911,7 +946,7 @@ int git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *p
|
|
|
911
946
|
GIT_UNUSED(owner);
|
|
912
947
|
GIT_UNUSED(payload);
|
|
913
948
|
|
|
914
|
-
|
|
949
|
+
GIT_ASSERT_ARG(out);
|
|
915
950
|
*out = NULL;
|
|
916
951
|
|
|
917
952
|
git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
|
|
@@ -934,8 +969,7 @@ int git_transport_ssh_global_init(void)
|
|
|
934
969
|
return -1;
|
|
935
970
|
}
|
|
936
971
|
|
|
937
|
-
|
|
938
|
-
return 0;
|
|
972
|
+
return git_runtime_shutdown_register(shutdown_ssh);
|
|
939
973
|
|
|
940
974
|
#else
|
|
941
975
|
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
#include "smart.h"
|
|
18
18
|
#include "remote.h"
|
|
19
19
|
#include "repository.h"
|
|
20
|
-
#include "global.h"
|
|
21
20
|
#include "http.h"
|
|
22
21
|
#include "git2/sys/credential.h"
|
|
23
22
|
|
|
@@ -155,7 +154,7 @@ static int apply_userpass_credentials(HINTERNET request, DWORD target, int mecha
|
|
|
155
154
|
native_scheme = WINHTTP_AUTH_SCHEME_BASIC;
|
|
156
155
|
} else {
|
|
157
156
|
git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
|
|
158
|
-
error =
|
|
157
|
+
error = GIT_EAUTH;
|
|
159
158
|
goto done;
|
|
160
159
|
}
|
|
161
160
|
|
|
@@ -194,7 +193,7 @@ static int apply_default_credentials(HINTERNET request, DWORD target, int mechan
|
|
|
194
193
|
native_scheme = WINHTTP_AUTH_SCHEME_NTLM;
|
|
195
194
|
} else {
|
|
196
195
|
git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
|
|
197
|
-
return
|
|
196
|
+
return GIT_EAUTH;
|
|
198
197
|
}
|
|
199
198
|
|
|
200
199
|
/*
|
|
@@ -274,7 +273,7 @@ static int acquire_fallback_cred(
|
|
|
274
273
|
pISM->lpVtbl->Release(pISM);
|
|
275
274
|
}
|
|
276
275
|
|
|
277
|
-
/* Only
|
|
276
|
+
/* Only uninitialize if the call to CoInitializeEx was successful. */
|
|
278
277
|
if (SUCCEEDED(hCoInitResult))
|
|
279
278
|
CoUninitialize();
|
|
280
279
|
}
|
|
@@ -430,7 +429,7 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|
|
430
429
|
proxy_opts = &t->owner->proxy;
|
|
431
430
|
if (proxy_opts->type == GIT_PROXY_AUTO) {
|
|
432
431
|
/* Set proxy if necessary */
|
|
433
|
-
if (
|
|
432
|
+
if (git_remote__http_proxy(&proxy_url, t->owner->owner, &t->server.url) < 0)
|
|
434
433
|
goto on_error;
|
|
435
434
|
}
|
|
436
435
|
else if (proxy_opts->type == GIT_PROXY_SPECIFIED) {
|
|
@@ -457,8 +456,14 @@ static int winhttp_stream_connect(winhttp_stream *s)
|
|
|
457
456
|
git_buf_puts(&processed_url, t->proxy.url.scheme);
|
|
458
457
|
git_buf_PUTS(&processed_url, "://");
|
|
459
458
|
|
|
459
|
+
if (git_net_url_is_ipv6(&t->proxy.url))
|
|
460
|
+
git_buf_putc(&processed_url, '[');
|
|
461
|
+
|
|
460
462
|
git_buf_puts(&processed_url, t->proxy.url.host);
|
|
461
463
|
|
|
464
|
+
if (git_net_url_is_ipv6(&t->proxy.url))
|
|
465
|
+
git_buf_putc(&processed_url, ']');
|
|
466
|
+
|
|
462
467
|
if (!git_net_url_is_default_port(&t->proxy.url))
|
|
463
468
|
git_buf_printf(&processed_url, ":%s", t->proxy.url.port);
|
|
464
469
|
|
|
@@ -611,7 +616,7 @@ static int parse_unauthorized_response(
|
|
|
611
616
|
*/
|
|
612
617
|
if (!WinHttpQueryAuthSchemes(request, &supported, &first, &target)) {
|
|
613
618
|
git_error_set(GIT_ERROR_OS, "failed to parse supported auth schemes");
|
|
614
|
-
return
|
|
619
|
+
return GIT_EAUTH;
|
|
615
620
|
}
|
|
616
621
|
|
|
617
622
|
if (WINHTTP_AUTH_SCHEME_NTLM & supported) {
|
|
@@ -748,10 +753,11 @@ static void CALLBACK winhttp_status(
|
|
|
748
753
|
static int winhttp_connect(
|
|
749
754
|
winhttp_subtransport *t)
|
|
750
755
|
{
|
|
751
|
-
wchar_t *wide_host;
|
|
756
|
+
wchar_t *wide_host = NULL;
|
|
752
757
|
int32_t port;
|
|
753
|
-
wchar_t *wide_ua;
|
|
754
|
-
git_buf ua = GIT_BUF_INIT;
|
|
758
|
+
wchar_t *wide_ua = NULL;
|
|
759
|
+
git_buf ipv6 = GIT_BUF_INIT, ua = GIT_BUF_INIT;
|
|
760
|
+
const char *host;
|
|
755
761
|
int error = -1;
|
|
756
762
|
int default_timeout = TIMEOUT_INFINITE;
|
|
757
763
|
int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
|
|
@@ -767,29 +773,33 @@ static int winhttp_connect(
|
|
|
767
773
|
/* Prepare port */
|
|
768
774
|
if (git__strntol32(&port, t->server.url.port,
|
|
769
775
|
strlen(t->server.url.port), NULL, 10) < 0)
|
|
770
|
-
|
|
776
|
+
goto on_error;
|
|
777
|
+
|
|
778
|
+
/* IPv6? Add braces around the host. */
|
|
779
|
+
if (git_net_url_is_ipv6(&t->server.url)) {
|
|
780
|
+
if (git_buf_printf(&ipv6, "[%s]", t->server.url.host) < 0)
|
|
781
|
+
goto on_error;
|
|
782
|
+
|
|
783
|
+
host = ipv6.ptr;
|
|
784
|
+
} else {
|
|
785
|
+
host = t->server.url.host;
|
|
786
|
+
}
|
|
771
787
|
|
|
772
788
|
/* Prepare host */
|
|
773
|
-
if (git__utf8_to_16_alloc(&wide_host,
|
|
789
|
+
if (git__utf8_to_16_alloc(&wide_host, host) < 0) {
|
|
774
790
|
git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
|
|
775
|
-
|
|
791
|
+
goto on_error;
|
|
776
792
|
}
|
|
777
793
|
|
|
778
794
|
|
|
779
|
-
if (
|
|
780
|
-
|
|
781
|
-
return error;
|
|
782
|
-
}
|
|
795
|
+
if (git_http__user_agent(&ua) < 0)
|
|
796
|
+
goto on_error;
|
|
783
797
|
|
|
784
798
|
if (git__utf8_to_16_alloc(&wide_ua, git_buf_cstr(&ua)) < 0) {
|
|
785
799
|
git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
|
|
786
|
-
|
|
787
|
-
git_buf_dispose(&ua);
|
|
788
|
-
return -1;
|
|
800
|
+
goto on_error;
|
|
789
801
|
}
|
|
790
802
|
|
|
791
|
-
git_buf_dispose(&ua);
|
|
792
|
-
|
|
793
803
|
/* Establish session */
|
|
794
804
|
t->session = WinHttpOpen(
|
|
795
805
|
wide_ua,
|
|
@@ -853,6 +863,8 @@ on_error:
|
|
|
853
863
|
if (error < 0)
|
|
854
864
|
winhttp_close_connection(t);
|
|
855
865
|
|
|
866
|
+
git_buf_dispose(&ua);
|
|
867
|
+
git_buf_dispose(&ipv6);
|
|
856
868
|
git__free(wide_host);
|
|
857
869
|
git__free(wide_ua);
|
|
858
870
|
|
|
@@ -900,11 +912,9 @@ static int send_request(winhttp_stream *s, size_t len, bool chunked)
|
|
|
900
912
|
int cert_valid = 1;
|
|
901
913
|
int client_cert_requested = 0;
|
|
902
914
|
request_failed = 0;
|
|
903
|
-
|
|
904
915
|
if ((error = do_send_request(s, len, chunked)) < 0) {
|
|
905
916
|
send_request_error = GetLastError();
|
|
906
917
|
request_failed = 1;
|
|
907
|
-
|
|
908
918
|
switch (send_request_error) {
|
|
909
919
|
case ERROR_WINHTTP_SECURE_FAILURE:
|
|
910
920
|
cert_valid = 0;
|
|
@@ -1030,7 +1040,7 @@ replay:
|
|
|
1030
1040
|
/* Enforce a reasonable cap on the number of replays */
|
|
1031
1041
|
if (replay_count++ >= GIT_HTTP_REPLAY_MAX) {
|
|
1032
1042
|
git_error_set(GIT_ERROR_HTTP, "too many redirects or authentication replays");
|
|
1033
|
-
return
|
|
1043
|
+
return GIT_ERROR; /* not GIT_EAUTH because the exact cause is not clear */
|
|
1034
1044
|
}
|
|
1035
1045
|
|
|
1036
1046
|
/* Connect if necessary */
|
|
@@ -1051,7 +1061,7 @@ replay:
|
|
|
1051
1061
|
}
|
|
1052
1062
|
|
|
1053
1063
|
if (s->chunked) {
|
|
1054
|
-
|
|
1064
|
+
GIT_ASSERT(s->verb == post_verb);
|
|
1055
1065
|
|
|
1056
1066
|
/* Flush, if necessary */
|
|
1057
1067
|
if (s->chunk_buffer_len > 0 &&
|
|
@@ -1102,7 +1112,7 @@ replay:
|
|
|
1102
1112
|
}
|
|
1103
1113
|
|
|
1104
1114
|
len -= bytes_read;
|
|
1105
|
-
|
|
1115
|
+
GIT_ASSERT(bytes_read == bytes_written);
|
|
1106
1116
|
}
|
|
1107
1117
|
|
|
1108
1118
|
git__free(buffer);
|
|
@@ -1214,7 +1224,7 @@ replay:
|
|
|
1214
1224
|
if (error < 0) {
|
|
1215
1225
|
return error;
|
|
1216
1226
|
} else if (!error) {
|
|
1217
|
-
|
|
1227
|
+
GIT_ASSERT(t->server.cred);
|
|
1218
1228
|
winhttp_stream_close(s);
|
|
1219
1229
|
goto replay;
|
|
1220
1230
|
}
|
|
@@ -1228,7 +1238,7 @@ replay:
|
|
|
1228
1238
|
if (error < 0) {
|
|
1229
1239
|
return error;
|
|
1230
1240
|
} else if (!error) {
|
|
1231
|
-
|
|
1241
|
+
GIT_ASSERT(t->proxy.cred);
|
|
1232
1242
|
winhttp_stream_close(s);
|
|
1233
1243
|
goto replay;
|
|
1234
1244
|
}
|
|
@@ -1314,7 +1324,7 @@ static int winhttp_stream_write_single(
|
|
|
1314
1324
|
return -1;
|
|
1315
1325
|
}
|
|
1316
1326
|
|
|
1317
|
-
|
|
1327
|
+
GIT_ASSERT((DWORD)len == bytes_written);
|
|
1318
1328
|
|
|
1319
1329
|
return 0;
|
|
1320
1330
|
}
|
|
@@ -1413,7 +1423,7 @@ static int winhttp_stream_write_buffered(
|
|
|
1413
1423
|
return -1;
|
|
1414
1424
|
}
|
|
1415
1425
|
|
|
1416
|
-
|
|
1426
|
+
GIT_ASSERT((DWORD)len == bytes_written);
|
|
1417
1427
|
|
|
1418
1428
|
s->post_body_len += bytes_written;
|
|
1419
1429
|
|
|
@@ -1620,7 +1630,7 @@ static int winhttp_action(
|
|
|
1620
1630
|
break;
|
|
1621
1631
|
|
|
1622
1632
|
default:
|
|
1623
|
-
|
|
1633
|
+
GIT_ASSERT(0);
|
|
1624
1634
|
}
|
|
1625
1635
|
|
|
1626
1636
|
if (!ret)
|
data/vendor/libgit2/src/tree.c
CHANGED
|
@@ -54,7 +54,7 @@ GIT_INLINE(git_filemode_t) normalize_filemode(git_filemode_t filemode)
|
|
|
54
54
|
static int valid_entry_name(git_repository *repo, const char *filename)
|
|
55
55
|
{
|
|
56
56
|
return *filename != '\0' &&
|
|
57
|
-
|
|
57
|
+
git_path_validate(repo, filename, 0,
|
|
58
58
|
GIT_PATH_REJECT_TRAVERSAL | GIT_PATH_REJECT_DOT_GIT | GIT_PATH_REJECT_SLASH);
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -228,7 +228,7 @@ int git_tree_entry_dup(git_tree_entry **dest, const git_tree_entry *source)
|
|
|
228
228
|
{
|
|
229
229
|
git_tree_entry *cpy;
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
GIT_ASSERT_ARG(source);
|
|
232
232
|
|
|
233
233
|
cpy = alloc_entry(source->filename, source->filename_len, source->oid);
|
|
234
234
|
if (cpy == NULL)
|
|
@@ -261,19 +261,19 @@ git_filemode_t git_tree_entry_filemode_raw(const git_tree_entry *entry)
|
|
|
261
261
|
|
|
262
262
|
const char *git_tree_entry_name(const git_tree_entry *entry)
|
|
263
263
|
{
|
|
264
|
-
|
|
264
|
+
GIT_ASSERT_ARG_WITH_RETVAL(entry, NULL);
|
|
265
265
|
return entry->filename;
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
const git_oid *git_tree_entry_id(const git_tree_entry *entry)
|
|
269
269
|
{
|
|
270
|
-
|
|
270
|
+
GIT_ASSERT_ARG_WITH_RETVAL(entry, NULL);
|
|
271
271
|
return entry->oid;
|
|
272
272
|
}
|
|
273
273
|
|
|
274
274
|
git_object_t git_tree_entry_type(const git_tree_entry *entry)
|
|
275
275
|
{
|
|
276
|
-
|
|
276
|
+
GIT_ASSERT_ARG_WITH_RETVAL(entry, GIT_OBJECT_INVALID);
|
|
277
277
|
|
|
278
278
|
if (S_ISGITLINK(entry->attr))
|
|
279
279
|
return GIT_OBJECT_COMMIT;
|
|
@@ -288,7 +288,9 @@ int git_tree_entry_to_object(
|
|
|
288
288
|
git_repository *repo,
|
|
289
289
|
const git_tree_entry *entry)
|
|
290
290
|
{
|
|
291
|
-
|
|
291
|
+
GIT_ASSERT_ARG(entry);
|
|
292
|
+
GIT_ASSERT_ARG(object_out);
|
|
293
|
+
|
|
292
294
|
return git_object_lookup(object_out, repo, entry->oid, GIT_OBJECT_ANY);
|
|
293
295
|
}
|
|
294
296
|
|
|
@@ -306,7 +308,8 @@ static const git_tree_entry *entry_fromname(
|
|
|
306
308
|
const git_tree_entry *git_tree_entry_byname(
|
|
307
309
|
const git_tree *tree, const char *filename)
|
|
308
310
|
{
|
|
309
|
-
|
|
311
|
+
GIT_ASSERT_ARG_WITH_RETVAL(tree, NULL);
|
|
312
|
+
GIT_ASSERT_ARG_WITH_RETVAL(filename, NULL);
|
|
310
313
|
|
|
311
314
|
return entry_fromname(tree, filename, strlen(filename));
|
|
312
315
|
}
|
|
@@ -314,7 +317,7 @@ const git_tree_entry *git_tree_entry_byname(
|
|
|
314
317
|
const git_tree_entry *git_tree_entry_byindex(
|
|
315
318
|
const git_tree *tree, size_t idx)
|
|
316
319
|
{
|
|
317
|
-
|
|
320
|
+
GIT_ASSERT_ARG_WITH_RETVAL(tree, NULL);
|
|
318
321
|
return git_array_get(tree->entries, idx);
|
|
319
322
|
}
|
|
320
323
|
|
|
@@ -324,7 +327,7 @@ const git_tree_entry *git_tree_entry_byid(
|
|
|
324
327
|
size_t i;
|
|
325
328
|
const git_tree_entry *e;
|
|
326
329
|
|
|
327
|
-
|
|
330
|
+
GIT_ASSERT_ARG_WITH_RETVAL(tree, NULL);
|
|
328
331
|
|
|
329
332
|
git_array_foreach(tree->entries, i, e) {
|
|
330
333
|
if (memcmp(&e->oid->id, &id->id, sizeof(id->id)) == 0)
|
|
@@ -336,13 +339,13 @@ const git_tree_entry *git_tree_entry_byid(
|
|
|
336
339
|
|
|
337
340
|
size_t git_tree_entrycount(const git_tree *tree)
|
|
338
341
|
{
|
|
339
|
-
|
|
342
|
+
GIT_ASSERT_ARG_WITH_RETVAL(tree, 0);
|
|
340
343
|
return tree->entries.size;
|
|
341
344
|
}
|
|
342
345
|
|
|
343
346
|
size_t git_treebuilder_entrycount(git_treebuilder *bld)
|
|
344
347
|
{
|
|
345
|
-
|
|
348
|
+
GIT_ASSERT_ARG_WITH_RETVAL(bld, 0);
|
|
346
349
|
|
|
347
350
|
return git_strmap_size(bld->map);
|
|
348
351
|
}
|
|
@@ -489,6 +492,56 @@ static int check_entry(git_repository *repo, const char *filename, const git_oid
|
|
|
489
492
|
return 0;
|
|
490
493
|
}
|
|
491
494
|
|
|
495
|
+
static int git_treebuilder__write_with_buffer(
|
|
496
|
+
git_oid *oid,
|
|
497
|
+
git_treebuilder *bld,
|
|
498
|
+
git_buf *buf)
|
|
499
|
+
{
|
|
500
|
+
int error = 0;
|
|
501
|
+
size_t i, entrycount;
|
|
502
|
+
git_odb *odb;
|
|
503
|
+
git_tree_entry *entry;
|
|
504
|
+
git_vector entries = GIT_VECTOR_INIT;
|
|
505
|
+
|
|
506
|
+
git_buf_clear(buf);
|
|
507
|
+
|
|
508
|
+
entrycount = git_strmap_size(bld->map);
|
|
509
|
+
if ((error = git_vector_init(&entries, entrycount, entry_sort_cmp)) < 0)
|
|
510
|
+
goto out;
|
|
511
|
+
|
|
512
|
+
if (buf->asize == 0 &&
|
|
513
|
+
(error = git_buf_grow(buf, entrycount * 72)) < 0)
|
|
514
|
+
goto out;
|
|
515
|
+
|
|
516
|
+
git_strmap_foreach_value(bld->map, entry, {
|
|
517
|
+
if ((error = git_vector_insert(&entries, entry)) < 0)
|
|
518
|
+
goto out;
|
|
519
|
+
});
|
|
520
|
+
|
|
521
|
+
git_vector_sort(&entries);
|
|
522
|
+
|
|
523
|
+
for (i = 0; i < entries.length && !error; ++i) {
|
|
524
|
+
entry = git_vector_get(&entries, i);
|
|
525
|
+
|
|
526
|
+
git_buf_printf(buf, "%o ", entry->attr);
|
|
527
|
+
git_buf_put(buf, entry->filename, entry->filename_len + 1);
|
|
528
|
+
git_buf_put(buf, (char *)entry->oid->id, GIT_OID_RAWSZ);
|
|
529
|
+
|
|
530
|
+
if (git_buf_oom(buf)) {
|
|
531
|
+
error = -1;
|
|
532
|
+
goto out;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if ((error = git_repository_odb__weakptr(&odb, bld->repo)) == 0)
|
|
537
|
+
error = git_odb_write(oid, odb, buf->ptr, buf->size, GIT_OBJECT_TREE);
|
|
538
|
+
|
|
539
|
+
out:
|
|
540
|
+
git_vector_free(&entries);
|
|
541
|
+
|
|
542
|
+
return error;
|
|
543
|
+
}
|
|
544
|
+
|
|
492
545
|
static int append_entry(
|
|
493
546
|
git_treebuilder *bld,
|
|
494
547
|
const char *filename,
|
|
@@ -607,7 +660,7 @@ static int write_tree(
|
|
|
607
660
|
}
|
|
608
661
|
}
|
|
609
662
|
|
|
610
|
-
if (
|
|
663
|
+
if (git_treebuilder__write_with_buffer(oid, bld, shared_buf) < 0)
|
|
611
664
|
goto on_error;
|
|
612
665
|
|
|
613
666
|
git_treebuilder_free(bld);
|
|
@@ -626,7 +679,9 @@ int git_tree__write_index(
|
|
|
626
679
|
git_buf shared_buf = GIT_BUF_INIT;
|
|
627
680
|
bool old_ignore_case = false;
|
|
628
681
|
|
|
629
|
-
|
|
682
|
+
GIT_ASSERT_ARG(oid);
|
|
683
|
+
GIT_ASSERT_ARG(index);
|
|
684
|
+
GIT_ASSERT_ARG(repo);
|
|
630
685
|
|
|
631
686
|
if (git_index_has_conflicts(index)) {
|
|
632
687
|
git_error_set(GIT_ERROR_INDEX,
|
|
@@ -680,7 +735,8 @@ int git_treebuilder_new(
|
|
|
680
735
|
git_treebuilder *bld;
|
|
681
736
|
size_t i;
|
|
682
737
|
|
|
683
|
-
|
|
738
|
+
GIT_ASSERT_ARG(builder_p);
|
|
739
|
+
GIT_ASSERT_ARG(repo);
|
|
684
740
|
|
|
685
741
|
bld = git__calloc(1, sizeof(git_treebuilder));
|
|
686
742
|
GIT_ERROR_CHECK_ALLOC(bld);
|
|
@@ -723,7 +779,9 @@ int git_treebuilder_insert(
|
|
|
723
779
|
git_tree_entry *entry;
|
|
724
780
|
int error;
|
|
725
781
|
|
|
726
|
-
|
|
782
|
+
GIT_ASSERT_ARG(bld);
|
|
783
|
+
GIT_ASSERT_ARG(id);
|
|
784
|
+
GIT_ASSERT_ARG(filename);
|
|
727
785
|
|
|
728
786
|
if ((error = check_entry(bld->repo, filename, id, filemode)) < 0)
|
|
729
787
|
return error;
|
|
@@ -751,7 +809,9 @@ int git_treebuilder_insert(
|
|
|
751
809
|
|
|
752
810
|
static git_tree_entry *treebuilder_get(git_treebuilder *bld, const char *filename)
|
|
753
811
|
{
|
|
754
|
-
|
|
812
|
+
GIT_ASSERT_ARG_WITH_RETVAL(bld, NULL);
|
|
813
|
+
GIT_ASSERT_ARG_WITH_RETVAL(filename, NULL);
|
|
814
|
+
|
|
755
815
|
return git_strmap_get(bld->map, filename);
|
|
756
816
|
}
|
|
757
817
|
|
|
@@ -775,63 +835,10 @@ int git_treebuilder_remove(git_treebuilder *bld, const char *filename)
|
|
|
775
835
|
|
|
776
836
|
int git_treebuilder_write(git_oid *oid, git_treebuilder *bld)
|
|
777
837
|
{
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
error = git_treebuilder_write_with_buffer(oid, bld, &buffer);
|
|
782
|
-
|
|
783
|
-
git_buf_dispose(&buffer);
|
|
784
|
-
return error;
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
int git_treebuilder_write_with_buffer(git_oid *oid, git_treebuilder *bld, git_buf *tree)
|
|
788
|
-
{
|
|
789
|
-
int error = 0;
|
|
790
|
-
size_t i, entrycount;
|
|
791
|
-
git_odb *odb;
|
|
792
|
-
git_tree_entry *entry;
|
|
793
|
-
git_vector entries = GIT_VECTOR_INIT;
|
|
794
|
-
|
|
795
|
-
assert(bld);
|
|
796
|
-
assert(tree);
|
|
797
|
-
|
|
798
|
-
git_buf_clear(tree);
|
|
799
|
-
|
|
800
|
-
entrycount = git_strmap_size(bld->map);
|
|
801
|
-
if ((error = git_vector_init(&entries, entrycount, entry_sort_cmp)) < 0)
|
|
802
|
-
goto out;
|
|
803
|
-
|
|
804
|
-
if (tree->asize == 0 &&
|
|
805
|
-
(error = git_buf_grow(tree, entrycount * 72)) < 0)
|
|
806
|
-
goto out;
|
|
807
|
-
|
|
808
|
-
git_strmap_foreach_value(bld->map, entry, {
|
|
809
|
-
if ((error = git_vector_insert(&entries, entry)) < 0)
|
|
810
|
-
goto out;
|
|
811
|
-
});
|
|
812
|
-
|
|
813
|
-
git_vector_sort(&entries);
|
|
838
|
+
GIT_ASSERT_ARG(oid);
|
|
839
|
+
GIT_ASSERT_ARG(bld);
|
|
814
840
|
|
|
815
|
-
|
|
816
|
-
entry = git_vector_get(&entries, i);
|
|
817
|
-
|
|
818
|
-
git_buf_printf(tree, "%o ", entry->attr);
|
|
819
|
-
git_buf_put(tree, entry->filename, entry->filename_len + 1);
|
|
820
|
-
git_buf_put(tree, (char *)entry->oid->id, GIT_OID_RAWSZ);
|
|
821
|
-
|
|
822
|
-
if (git_buf_oom(tree)) {
|
|
823
|
-
error = -1;
|
|
824
|
-
goto out;
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
if ((error = git_repository_odb__weakptr(&odb, bld->repo)) == 0)
|
|
829
|
-
error = git_odb_write(oid, odb, tree->ptr, tree->size, GIT_OBJECT_TREE);
|
|
830
|
-
|
|
831
|
-
out:
|
|
832
|
-
git_vector_free(&entries);
|
|
833
|
-
|
|
834
|
-
return error;
|
|
841
|
+
return git_treebuilder__write_with_buffer(oid, bld, &bld->write_cache);
|
|
835
842
|
}
|
|
836
843
|
|
|
837
844
|
int git_treebuilder_filter(
|
|
@@ -842,7 +849,8 @@ int git_treebuilder_filter(
|
|
|
842
849
|
const char *filename;
|
|
843
850
|
git_tree_entry *entry;
|
|
844
851
|
|
|
845
|
-
|
|
852
|
+
GIT_ASSERT_ARG(bld);
|
|
853
|
+
GIT_ASSERT_ARG(filter);
|
|
846
854
|
|
|
847
855
|
git_strmap_foreach(bld->map, filename, entry, {
|
|
848
856
|
if (filter(entry, payload)) {
|
|
@@ -858,7 +866,7 @@ int git_treebuilder_clear(git_treebuilder *bld)
|
|
|
858
866
|
{
|
|
859
867
|
git_tree_entry *e;
|
|
860
868
|
|
|
861
|
-
|
|
869
|
+
GIT_ASSERT_ARG(bld);
|
|
862
870
|
|
|
863
871
|
git_strmap_foreach_value(bld->map, e, git_tree_entry_free(e));
|
|
864
872
|
git_strmap_clear(bld->map);
|
|
@@ -871,6 +879,7 @@ void git_treebuilder_free(git_treebuilder *bld)
|
|
|
871
879
|
if (bld == NULL)
|
|
872
880
|
return;
|
|
873
881
|
|
|
882
|
+
git_buf_dispose(&bld->write_cache);
|
|
874
883
|
git_treebuilder_clear(bld);
|
|
875
884
|
git_strmap_free(bld->map);
|
|
876
885
|
git__free(bld);
|
|
@@ -1174,10 +1183,10 @@ int git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseli
|
|
|
1174
1183
|
|
|
1175
1184
|
for (j = 0; j < steps_up; j++) {
|
|
1176
1185
|
tree_stack_entry *current, *popped = git_array_pop(stack);
|
|
1177
|
-
|
|
1186
|
+
GIT_ASSERT(popped);
|
|
1178
1187
|
|
|
1179
1188
|
current = git_array_last(stack);
|
|
1180
|
-
|
|
1189
|
+
GIT_ASSERT(current);
|
|
1181
1190
|
|
|
1182
1191
|
if ((error = create_popped_tree(current, popped, &component)) < 0)
|
|
1183
1192
|
goto cleanup;
|
|
@@ -1242,8 +1251,9 @@ int git_tree_create_updated(git_oid *out, git_repository *repo, git_tree *baseli
|
|
|
1242
1251
|
}
|
|
1243
1252
|
case GIT_TREE_UPDATE_REMOVE:
|
|
1244
1253
|
{
|
|
1254
|
+
tree_stack_entry *last = git_array_last(stack);
|
|
1245
1255
|
char *basename = git_path_basename(update->path);
|
|
1246
|
-
error = git_treebuilder_remove(
|
|
1256
|
+
error = git_treebuilder_remove(last->bld, basename);
|
|
1247
1257
|
git__free(basename);
|
|
1248
1258
|
break;
|
|
1249
1259
|
}
|
|
@@ -1295,3 +1305,16 @@ cleanup:
|
|
|
1295
1305
|
git_vector_free(&entries);
|
|
1296
1306
|
return error;
|
|
1297
1307
|
}
|
|
1308
|
+
|
|
1309
|
+
/* Deprecated Functions */
|
|
1310
|
+
|
|
1311
|
+
#ifndef GIT_DEPRECATE_HARD
|
|
1312
|
+
|
|
1313
|
+
int git_treebuilder_write_with_buffer(git_oid *oid, git_treebuilder *bld, git_buf *buf)
|
|
1314
|
+
{
|
|
1315
|
+
GIT_UNUSED(buf);
|
|
1316
|
+
|
|
1317
|
+
return git_treebuilder_write(oid, bld);
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
#endif
|