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.
Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +1 -1
  4. data/ext/rugged/rugged.c +7 -4
  5. data/ext/rugged/rugged_object.c +1 -1
  6. data/ext/rugged/rugged_repo.c +3 -3
  7. data/lib/rugged/repository.rb +2 -2
  8. data/lib/rugged/version.rb +1 -1
  9. data/vendor/libgit2/CMakeLists.txt +11 -6
  10. data/vendor/libgit2/COPYING +109 -1
  11. data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +4 -0
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +1 -0
  14. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
  15. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +17 -5
  16. data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
  17. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
  18. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
  19. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
  20. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
  21. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
  22. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
  23. data/vendor/libgit2/deps/ntlmclient/ntlm.c +150 -118
  24. data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
  25. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
  26. data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
  28. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
  29. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
  30. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
  31. data/vendor/libgit2/include/git2/attr.h +89 -0
  32. data/vendor/libgit2/include/git2/blame.h +93 -42
  33. data/vendor/libgit2/include/git2/blob.h +14 -2
  34. data/vendor/libgit2/include/git2/branch.h +25 -0
  35. data/vendor/libgit2/include/git2/cert.h +42 -5
  36. data/vendor/libgit2/include/git2/checkout.h +28 -12
  37. data/vendor/libgit2/include/git2/commit.h +35 -19
  38. data/vendor/libgit2/include/git2/common.h +14 -4
  39. data/vendor/libgit2/include/git2/deprecated.h +206 -6
  40. data/vendor/libgit2/include/git2/diff.h +34 -19
  41. data/vendor/libgit2/include/git2/errors.h +6 -6
  42. data/vendor/libgit2/include/git2/filter.h +57 -17
  43. data/vendor/libgit2/include/git2/graph.h +20 -2
  44. data/vendor/libgit2/include/git2/index.h +2 -2
  45. data/vendor/libgit2/include/git2/odb.h +29 -0
  46. data/vendor/libgit2/include/git2/patch.h +8 -0
  47. data/vendor/libgit2/include/git2/rebase.h +25 -1
  48. data/vendor/libgit2/include/git2/refs.h +6 -2
  49. data/vendor/libgit2/include/git2/remote.h +59 -6
  50. data/vendor/libgit2/include/git2/revparse.h +5 -5
  51. data/vendor/libgit2/include/git2/status.h +115 -59
  52. data/vendor/libgit2/include/git2/submodule.h +9 -0
  53. data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
  54. data/vendor/libgit2/include/git2/sys/filter.h +49 -28
  55. data/vendor/libgit2/include/git2/sys/midx.h +74 -0
  56. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
  57. data/vendor/libgit2/include/git2/sys/transport.h +1 -0
  58. data/vendor/libgit2/include/git2/tag.h +12 -0
  59. data/vendor/libgit2/include/git2/tree.h +0 -14
  60. data/vendor/libgit2/include/git2/types.h +9 -0
  61. data/vendor/libgit2/include/git2/version.h +4 -4
  62. data/vendor/libgit2/include/git2/worktree.h +1 -0
  63. data/vendor/libgit2/src/CMakeLists.txt +25 -4
  64. data/vendor/libgit2/src/alloc.c +21 -8
  65. data/vendor/libgit2/src/allocators/failalloc.c +92 -0
  66. data/vendor/libgit2/src/allocators/failalloc.h +23 -0
  67. data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
  68. data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
  69. data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
  70. data/vendor/libgit2/src/annotated_commit.c +21 -9
  71. data/vendor/libgit2/src/apply.c +16 -7
  72. data/vendor/libgit2/src/array.h +11 -11
  73. data/vendor/libgit2/src/attr.c +181 -74
  74. data/vendor/libgit2/src/attr_file.c +84 -39
  75. data/vendor/libgit2/src/attr_file.h +32 -11
  76. data/vendor/libgit2/src/attrcache.c +42 -37
  77. data/vendor/libgit2/src/attrcache.h +4 -5
  78. data/vendor/libgit2/src/blame.c +11 -5
  79. data/vendor/libgit2/src/blob.c +35 -24
  80. data/vendor/libgit2/src/branch.c +69 -17
  81. data/vendor/libgit2/src/buffer.c +334 -25
  82. data/vendor/libgit2/src/buffer.h +153 -2
  83. data/vendor/libgit2/src/cache.c +2 -2
  84. data/vendor/libgit2/src/cache.h +7 -7
  85. data/vendor/libgit2/src/cc-compat.h +10 -2
  86. data/vendor/libgit2/src/checkout.c +48 -26
  87. data/vendor/libgit2/src/cherrypick.c +6 -2
  88. data/vendor/libgit2/src/clone.c +41 -47
  89. data/vendor/libgit2/src/commit.c +41 -28
  90. data/vendor/libgit2/src/commit_graph.c +1209 -0
  91. data/vendor/libgit2/src/commit_graph.h +162 -0
  92. data/vendor/libgit2/src/commit_list.c +46 -0
  93. data/vendor/libgit2/src/commit_list.h +2 -0
  94. data/vendor/libgit2/src/common.h +25 -2
  95. data/vendor/libgit2/src/config.c +37 -15
  96. data/vendor/libgit2/src/config_cache.c +5 -3
  97. data/vendor/libgit2/src/config_file.c +16 -8
  98. data/vendor/libgit2/src/config_parse.c +4 -6
  99. data/vendor/libgit2/src/crlf.c +16 -6
  100. data/vendor/libgit2/src/date.c +4 -3
  101. data/vendor/libgit2/src/delta.c +1 -1
  102. data/vendor/libgit2/src/describe.c +6 -3
  103. data/vendor/libgit2/src/diff.c +11 -8
  104. data/vendor/libgit2/src/diff_driver.c +21 -17
  105. data/vendor/libgit2/src/diff_file.c +2 -6
  106. data/vendor/libgit2/src/diff_generate.c +46 -17
  107. data/vendor/libgit2/src/diff_print.c +19 -6
  108. data/vendor/libgit2/src/diff_stats.c +7 -5
  109. data/vendor/libgit2/src/diff_tform.c +9 -8
  110. data/vendor/libgit2/src/diff_xdiff.c +4 -2
  111. data/vendor/libgit2/src/diff_xdiff.h +1 -1
  112. data/vendor/libgit2/src/errors.c +24 -19
  113. data/vendor/libgit2/src/features.h.in +5 -1
  114. data/vendor/libgit2/src/fetch.c +5 -2
  115. data/vendor/libgit2/src/fetchhead.c +8 -4
  116. data/vendor/libgit2/src/filebuf.c +9 -7
  117. data/vendor/libgit2/src/filter.c +206 -110
  118. data/vendor/libgit2/src/filter.h +24 -5
  119. data/vendor/libgit2/src/futils.c +5 -5
  120. data/vendor/libgit2/src/futils.h +1 -1
  121. data/vendor/libgit2/src/graph.c +64 -9
  122. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
  123. data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
  124. data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
  125. data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
  126. data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
  127. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
  128. data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
  129. data/vendor/libgit2/src/hash.c +16 -13
  130. data/vendor/libgit2/src/hash.h +1 -1
  131. data/vendor/libgit2/src/hashsig.c +23 -10
  132. data/vendor/libgit2/src/ident.c +13 -3
  133. data/vendor/libgit2/src/ignore.c +35 -19
  134. data/vendor/libgit2/src/index.c +106 -70
  135. data/vendor/libgit2/src/index.h +1 -1
  136. data/vendor/libgit2/src/indexer.c +31 -29
  137. data/vendor/libgit2/src/integer.h +64 -2
  138. data/vendor/libgit2/src/iterator.c +36 -24
  139. data/vendor/libgit2/src/iterator.h +1 -1
  140. data/vendor/libgit2/src/khash.h +2 -11
  141. data/vendor/libgit2/src/{settings.c → libgit2.c} +117 -50
  142. data/vendor/libgit2/src/libgit2.h +15 -0
  143. data/vendor/libgit2/src/mailmap.c +23 -10
  144. data/vendor/libgit2/src/map.h +3 -3
  145. data/vendor/libgit2/src/merge.c +70 -30
  146. data/vendor/libgit2/src/merge.h +2 -1
  147. data/vendor/libgit2/src/merge_driver.c +19 -13
  148. data/vendor/libgit2/src/merge_file.c +11 -3
  149. data/vendor/libgit2/src/message.c +3 -1
  150. data/vendor/libgit2/src/midx.c +471 -10
  151. data/vendor/libgit2/src/midx.h +28 -1
  152. data/vendor/libgit2/src/mwindow.c +103 -59
  153. data/vendor/libgit2/src/mwindow.h +3 -3
  154. data/vendor/libgit2/src/net.c +127 -3
  155. data/vendor/libgit2/src/net.h +16 -2
  156. data/vendor/libgit2/src/netops.c +6 -4
  157. data/vendor/libgit2/src/netops.h +2 -2
  158. data/vendor/libgit2/src/notes.c +10 -10
  159. data/vendor/libgit2/src/object.c +22 -14
  160. data/vendor/libgit2/src/odb.c +285 -48
  161. data/vendor/libgit2/src/odb.h +16 -2
  162. data/vendor/libgit2/src/odb_loose.c +28 -18
  163. data/vendor/libgit2/src/odb_mempack.c +1 -1
  164. data/vendor/libgit2/src/odb_pack.c +391 -114
  165. data/vendor/libgit2/src/oid.c +5 -4
  166. data/vendor/libgit2/src/pack-objects.c +54 -48
  167. data/vendor/libgit2/src/pack.c +329 -119
  168. data/vendor/libgit2/src/pack.h +25 -7
  169. data/vendor/libgit2/src/patch.c +14 -7
  170. data/vendor/libgit2/src/patch_generate.c +2 -2
  171. data/vendor/libgit2/src/patch_parse.c +2 -1
  172. data/vendor/libgit2/src/path.c +98 -53
  173. data/vendor/libgit2/src/path.h +79 -6
  174. data/vendor/libgit2/src/pathspec.c +8 -8
  175. data/vendor/libgit2/src/pool.c +13 -7
  176. data/vendor/libgit2/src/posix.c +11 -3
  177. data/vendor/libgit2/src/reader.c +10 -6
  178. data/vendor/libgit2/src/rebase.c +93 -49
  179. data/vendor/libgit2/src/refdb.c +30 -13
  180. data/vendor/libgit2/src/refdb_fs.c +121 -69
  181. data/vendor/libgit2/src/reflog.c +19 -14
  182. data/vendor/libgit2/src/refs.c +76 -41
  183. data/vendor/libgit2/src/refspec.c +32 -12
  184. data/vendor/libgit2/src/remote.c +272 -102
  185. data/vendor/libgit2/src/remote.h +2 -1
  186. data/vendor/libgit2/src/repository.c +176 -103
  187. data/vendor/libgit2/src/repository.h +12 -1
  188. data/vendor/libgit2/src/reset.c +7 -6
  189. data/vendor/libgit2/src/revert.c +6 -2
  190. data/vendor/libgit2/src/revparse.c +14 -9
  191. data/vendor/libgit2/src/revwalk.c +32 -15
  192. data/vendor/libgit2/src/runtime.c +162 -0
  193. data/vendor/libgit2/src/runtime.h +62 -0
  194. data/vendor/libgit2/src/settings.h +11 -0
  195. data/vendor/libgit2/src/signature.c +6 -5
  196. data/vendor/libgit2/src/sortedcache.h +10 -8
  197. data/vendor/libgit2/src/stash.c +3 -1
  198. data/vendor/libgit2/src/status.c +7 -4
  199. data/vendor/libgit2/src/strarray.c +2 -1
  200. data/vendor/libgit2/src/streams/mbedtls.c +14 -17
  201. data/vendor/libgit2/src/streams/mbedtls.h +1 -1
  202. data/vendor/libgit2/src/streams/openssl.c +101 -201
  203. data/vendor/libgit2/src/streams/openssl.h +9 -1
  204. data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
  205. data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
  206. data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
  207. data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
  208. data/vendor/libgit2/src/streams/registry.c +5 -6
  209. data/vendor/libgit2/src/streams/socket.c +6 -2
  210. data/vendor/libgit2/src/streams/stransport.c +6 -3
  211. data/vendor/libgit2/src/streams/tls.c +5 -3
  212. data/vendor/libgit2/src/submodule.c +128 -62
  213. data/vendor/libgit2/src/submodule.h +9 -9
  214. data/vendor/libgit2/src/sysdir.c +4 -6
  215. data/vendor/libgit2/src/tag.c +47 -11
  216. data/vendor/libgit2/src/thread.c +140 -0
  217. data/vendor/libgit2/src/thread.h +479 -0
  218. data/vendor/libgit2/src/threadstate.c +83 -0
  219. data/vendor/libgit2/src/threadstate.h +24 -0
  220. data/vendor/libgit2/src/trace.c +2 -2
  221. data/vendor/libgit2/src/trace.h +17 -13
  222. data/vendor/libgit2/src/transaction.c +19 -8
  223. data/vendor/libgit2/src/transport.c +3 -3
  224. data/vendor/libgit2/src/transports/auth.c +1 -1
  225. data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
  226. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
  227. data/vendor/libgit2/src/transports/credential.c +15 -7
  228. data/vendor/libgit2/src/transports/git.c +1 -3
  229. data/vendor/libgit2/src/transports/http.c +19 -17
  230. data/vendor/libgit2/src/transports/http.h +1 -0
  231. data/vendor/libgit2/src/transports/httpclient.c +53 -26
  232. data/vendor/libgit2/src/transports/httpclient.h +1 -1
  233. data/vendor/libgit2/src/transports/local.c +3 -3
  234. data/vendor/libgit2/src/transports/smart.c +12 -7
  235. data/vendor/libgit2/src/transports/smart.h +1 -1
  236. data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
  237. data/vendor/libgit2/src/transports/ssh.c +51 -17
  238. data/vendor/libgit2/src/transports/winhttp.c +41 -31
  239. data/vendor/libgit2/src/tree.c +100 -77
  240. data/vendor/libgit2/src/tree.h +1 -0
  241. data/vendor/libgit2/src/tsort.c +0 -2
  242. data/vendor/libgit2/src/unix/map.c +3 -1
  243. data/vendor/libgit2/src/unix/pthread.h +2 -1
  244. data/vendor/libgit2/src/utf8.c +150 -0
  245. data/vendor/libgit2/src/utf8.h +52 -0
  246. data/vendor/libgit2/src/util.c +53 -129
  247. data/vendor/libgit2/src/util.h +33 -39
  248. data/vendor/libgit2/src/vector.c +23 -19
  249. data/vendor/libgit2/src/vector.h +4 -2
  250. data/vendor/libgit2/src/win32/findfile.c +4 -2
  251. data/vendor/libgit2/src/win32/map.c +1 -1
  252. data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
  253. data/vendor/libgit2/src/win32/path_w32.c +22 -24
  254. data/vendor/libgit2/src/win32/path_w32.h +0 -1
  255. data/vendor/libgit2/src/win32/posix_w32.c +7 -1
  256. data/vendor/libgit2/src/win32/precompiled.h +0 -1
  257. data/vendor/libgit2/src/win32/reparse.h +4 -4
  258. data/vendor/libgit2/src/win32/thread.c +24 -15
  259. data/vendor/libgit2/src/win32/thread.h +1 -1
  260. data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
  261. data/vendor/libgit2/src/win32/w32_common.h +18 -9
  262. data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
  263. data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
  264. data/vendor/libgit2/src/win32/w32_util.h +6 -6
  265. data/vendor/libgit2/src/worktree.c +27 -16
  266. data/vendor/libgit2/src/zstream.c +1 -1
  267. metadata +32 -16
  268. data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
  269. data/vendor/libgit2/src/buf_text.c +0 -316
  270. data/vendor/libgit2/src/buf_text.h +0 -122
  271. data/vendor/libgit2/src/global.c +0 -363
  272. data/vendor/libgit2/src/global.h +0 -41
  273. data/vendor/libgit2/src/thread-utils.c +0 -58
  274. data/vendor/libgit2/src/thread-utils.h +0 -369
  275. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
  276. data/vendor/libgit2/src/win32/w32_stack.c +0 -188
  277. data/vendor/libgit2/src/win32/w32_stack.h +0 -140
@@ -153,7 +153,7 @@ typedef struct {
153
153
  git_vector refs;
154
154
  git_vector heads;
155
155
  git_vector common;
156
- git_atomic cancelled;
156
+ git_atomic32 cancelled;
157
157
  packetsize_cb packetsize_cb;
158
158
  void *packetsize_payload;
159
159
  unsigned rpc : 1,
@@ -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
- git_atomic_set(&t->cancelled, 1);
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 ((current_time - payload->last_progress_report_time) >= MIN_PROGRESS_UPDATE_INTERVAL) {
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 "global.h"
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
- assert(stream);
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
- assert(c->username);
408
- assert(c->privatekey);
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 -1;
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 -1;
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
- assert(session);
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
- assert(!t->current_stream);
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 -1;
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
- assert(out);
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
- assert(out);
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
- assert(out);
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
- git__on_shutdown(shutdown_ssh);
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 = -1;
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 -1;
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 unitialize if the call to CoInitializeEx was successful. */
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 (git_remote__get_http_proxy(t->owner->owner, (strcmp(t->server.url.scheme, "https") == 0), &proxy_url) < 0)
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 -1;
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
- return -1;
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, t->server.url.host) < 0) {
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
- return -1;
791
+ goto on_error;
776
792
  }
777
793
 
778
794
 
779
- if ((error = git_http__user_agent(&ua)) < 0) {
780
- git__free(wide_host);
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
- git__free(wide_host);
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 -1;
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
- assert(s->verb == post_verb);
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
- assert(bytes_read == bytes_written);
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
- assert(t->server.cred);
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
- assert(t->proxy.cred);
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
- assert((DWORD)len == bytes_written);
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
- assert((DWORD)len == bytes_written);
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
- assert(0);
1633
+ GIT_ASSERT(0);
1624
1634
  }
1625
1635
 
1626
1636
  if (!ret)
@@ -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
- git_path_isvalid(repo, filename, 0,
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
- assert(source);
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
- assert(entry);
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
- assert(entry);
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
- assert(entry);
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
- assert(entry && object_out);
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
- assert(tree && filename);
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
- assert(tree);
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
- assert(tree);
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
- assert(tree);
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
- assert(bld);
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 (git_treebuilder_write_with_buffer(oid, bld, shared_buf) < 0)
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
- assert(oid && index && repo);
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
- assert(builder_p && repo);
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
- assert(bld && id && filename);
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
- assert(bld && filename);
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
- int error;
779
- git_buf buffer = GIT_BUF_INIT;
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
- for (i = 0; i < entries.length && !error; ++i) {
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
- assert(bld && filter);
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
- assert(bld);
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
- assert(popped);
1186
+ GIT_ASSERT(popped);
1178
1187
 
1179
1188
  current = git_array_last(stack);
1180
- assert(current);
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(git_array_last(stack)->bld, basename);
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