rugged 1.0.0 → 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 (338) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +3 -3
  4. data/ext/rugged/rugged.c +7 -4
  5. data/ext/rugged/rugged_commit.c +1 -1
  6. data/ext/rugged/rugged_config.c +1 -1
  7. data/ext/rugged/rugged_object.c +1 -1
  8. data/ext/rugged/rugged_remote.c +32 -2
  9. data/ext/rugged/rugged_repo.c +13 -3
  10. data/lib/rugged/commit.rb +17 -4
  11. data/lib/rugged/repository.rb +7 -8
  12. data/lib/rugged/submodule_collection.rb +4 -4
  13. data/lib/rugged/version.rb +1 -1
  14. data/vendor/libgit2/CMakeLists.txt +41 -74
  15. data/vendor/libgit2/COPYING +109 -1
  16. data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
  17. data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
  18. data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
  19. data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
  20. data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
  21. data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
  22. data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
  23. data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
  24. data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
  25. data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
  26. data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
  27. data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
  28. data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
  29. data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
  30. data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
  31. data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
  32. data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
  33. data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
  34. data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
  35. data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
  36. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
  37. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
  38. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
  39. data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
  40. data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
  41. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
  42. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
  43. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
  44. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
  45. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
  46. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
  47. data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
  48. data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
  49. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
  50. data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
  51. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
  52. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
  53. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
  54. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
  55. data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
  56. data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
  57. data/vendor/libgit2/deps/pcre/LICENCE +93 -0
  58. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  59. data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
  60. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
  61. data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
  62. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
  63. data/vendor/libgit2/deps/zlib/deflate.c +1 -0
  64. data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
  65. data/vendor/libgit2/include/git2/apply.h +2 -0
  66. data/vendor/libgit2/include/git2/attr.h +89 -0
  67. data/vendor/libgit2/include/git2/blame.h +95 -42
  68. data/vendor/libgit2/include/git2/blob.h +31 -3
  69. data/vendor/libgit2/include/git2/branch.h +25 -0
  70. data/vendor/libgit2/include/git2/cert.h +42 -5
  71. data/vendor/libgit2/include/git2/checkout.h +28 -12
  72. data/vendor/libgit2/include/git2/commit.h +35 -19
  73. data/vendor/libgit2/include/git2/common.h +33 -6
  74. data/vendor/libgit2/include/git2/config.h +1 -1
  75. data/vendor/libgit2/include/git2/deprecated.h +248 -8
  76. data/vendor/libgit2/include/git2/diff.h +35 -20
  77. data/vendor/libgit2/include/git2/errors.h +8 -7
  78. data/vendor/libgit2/include/git2/filter.h +57 -17
  79. data/vendor/libgit2/include/git2/graph.h +20 -2
  80. data/vendor/libgit2/include/git2/index.h +4 -5
  81. data/vendor/libgit2/include/git2/indexer.h +2 -1
  82. data/vendor/libgit2/include/git2/odb.h +44 -20
  83. data/vendor/libgit2/include/git2/pack.h +1 -1
  84. data/vendor/libgit2/include/git2/patch.h +8 -0
  85. data/vendor/libgit2/include/git2/rebase.h +25 -1
  86. data/vendor/libgit2/include/git2/refs.h +9 -5
  87. data/vendor/libgit2/include/git2/remote.h +59 -6
  88. data/vendor/libgit2/include/git2/repository.h +95 -52
  89. data/vendor/libgit2/include/git2/revparse.h +5 -5
  90. data/vendor/libgit2/include/git2/status.h +115 -59
  91. data/vendor/libgit2/include/git2/strarray.h +6 -10
  92. data/vendor/libgit2/include/git2/submodule.h +9 -0
  93. data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
  94. data/vendor/libgit2/include/git2/sys/filter.h +49 -28
  95. data/vendor/libgit2/include/git2/sys/midx.h +74 -0
  96. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
  97. data/vendor/libgit2/include/git2/sys/transport.h +1 -0
  98. data/vendor/libgit2/include/git2/tag.h +12 -0
  99. data/vendor/libgit2/include/git2/transport.h +1 -1
  100. data/vendor/libgit2/include/git2/tree.h +2 -14
  101. data/vendor/libgit2/include/git2/types.h +9 -0
  102. data/vendor/libgit2/include/git2/version.h +3 -3
  103. data/vendor/libgit2/include/git2/worktree.h +1 -0
  104. data/vendor/libgit2/src/CMakeLists.txt +77 -44
  105. data/vendor/libgit2/src/alloc.c +21 -8
  106. data/vendor/libgit2/src/allocators/failalloc.c +92 -0
  107. data/vendor/libgit2/src/allocators/failalloc.h +23 -0
  108. data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
  109. data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
  110. data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
  111. data/vendor/libgit2/src/annotated_commit.c +21 -9
  112. data/vendor/libgit2/src/apply.c +21 -8
  113. data/vendor/libgit2/src/array.h +11 -11
  114. data/vendor/libgit2/src/assert_safe.h +58 -0
  115. data/vendor/libgit2/src/attr.c +181 -74
  116. data/vendor/libgit2/src/attr_file.c +92 -42
  117. data/vendor/libgit2/src/attr_file.h +32 -11
  118. data/vendor/libgit2/src/attrcache.c +44 -40
  119. data/vendor/libgit2/src/attrcache.h +4 -5
  120. data/vendor/libgit2/src/blame.c +28 -15
  121. data/vendor/libgit2/src/blame_git.c +6 -3
  122. data/vendor/libgit2/src/blob.c +46 -24
  123. data/vendor/libgit2/src/branch.c +87 -37
  124. data/vendor/libgit2/src/buffer.c +339 -27
  125. data/vendor/libgit2/src/buffer.h +153 -2
  126. data/vendor/libgit2/src/cache.c +3 -24
  127. data/vendor/libgit2/src/cache.h +7 -7
  128. data/vendor/libgit2/src/cc-compat.h +10 -2
  129. data/vendor/libgit2/src/checkout.c +97 -98
  130. data/vendor/libgit2/src/cherrypick.c +8 -2
  131. data/vendor/libgit2/src/clone.c +104 -29
  132. data/vendor/libgit2/src/commit.c +41 -28
  133. data/vendor/libgit2/src/commit_graph.c +1209 -0
  134. data/vendor/libgit2/src/commit_graph.h +162 -0
  135. data/vendor/libgit2/src/commit_list.c +46 -0
  136. data/vendor/libgit2/src/commit_list.h +2 -0
  137. data/vendor/libgit2/src/common.h +26 -2
  138. data/vendor/libgit2/src/config.c +40 -22
  139. data/vendor/libgit2/src/config_cache.c +9 -4
  140. data/vendor/libgit2/src/config_entries.c +35 -27
  141. data/vendor/libgit2/src/config_file.c +25 -8
  142. data/vendor/libgit2/src/config_parse.c +5 -7
  143. data/vendor/libgit2/src/config_snapshot.c +2 -1
  144. data/vendor/libgit2/src/crlf.c +16 -6
  145. data/vendor/libgit2/src/date.c +4 -3
  146. data/vendor/libgit2/src/delta.c +1 -1
  147. data/vendor/libgit2/src/describe.c +11 -4
  148. data/vendor/libgit2/src/diff.c +23 -19
  149. data/vendor/libgit2/src/diff_driver.c +21 -17
  150. data/vendor/libgit2/src/diff_file.c +5 -7
  151. data/vendor/libgit2/src/diff_generate.c +56 -28
  152. data/vendor/libgit2/src/diff_parse.c +2 -3
  153. data/vendor/libgit2/src/diff_print.c +81 -65
  154. data/vendor/libgit2/src/diff_stats.c +19 -16
  155. data/vendor/libgit2/src/diff_tform.c +13 -13
  156. data/vendor/libgit2/src/diff_xdiff.c +4 -2
  157. data/vendor/libgit2/src/diff_xdiff.h +1 -1
  158. data/vendor/libgit2/src/errors.c +26 -19
  159. data/vendor/libgit2/src/features.h.in +5 -1
  160. data/vendor/libgit2/src/fetch.c +7 -2
  161. data/vendor/libgit2/src/fetchhead.c +8 -4
  162. data/vendor/libgit2/src/filebuf.c +9 -7
  163. data/vendor/libgit2/src/filter.c +209 -113
  164. data/vendor/libgit2/src/filter.h +24 -5
  165. data/vendor/libgit2/src/futils.c +8 -8
  166. data/vendor/libgit2/src/futils.h +4 -4
  167. data/vendor/libgit2/src/graph.c +64 -9
  168. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
  169. data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
  170. data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
  171. data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
  172. data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
  173. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
  174. data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
  175. data/vendor/libgit2/src/hash.c +16 -13
  176. data/vendor/libgit2/src/hash.h +1 -1
  177. data/vendor/libgit2/src/hashsig.c +23 -10
  178. data/vendor/libgit2/src/ident.c +13 -3
  179. data/vendor/libgit2/src/idxmap.c +0 -22
  180. data/vendor/libgit2/src/ignore.c +35 -19
  181. data/vendor/libgit2/src/index.c +126 -84
  182. data/vendor/libgit2/src/index.h +1 -1
  183. data/vendor/libgit2/src/indexer.c +60 -36
  184. data/vendor/libgit2/src/integer.h +79 -2
  185. data/vendor/libgit2/src/iterator.c +40 -28
  186. data/vendor/libgit2/src/iterator.h +1 -1
  187. data/vendor/libgit2/src/khash.h +2 -11
  188. data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
  189. data/vendor/libgit2/src/libgit2.h +15 -0
  190. data/vendor/libgit2/src/mailmap.c +23 -10
  191. data/vendor/libgit2/src/map.h +3 -3
  192. data/vendor/libgit2/src/merge.c +108 -46
  193. data/vendor/libgit2/src/merge.h +2 -1
  194. data/vendor/libgit2/src/merge_driver.c +19 -13
  195. data/vendor/libgit2/src/merge_file.c +15 -9
  196. data/vendor/libgit2/src/message.c +3 -1
  197. data/vendor/libgit2/src/midx.c +879 -0
  198. data/vendor/libgit2/src/midx.h +110 -0
  199. data/vendor/libgit2/src/mwindow.c +214 -95
  200. data/vendor/libgit2/src/mwindow.h +3 -3
  201. data/vendor/libgit2/src/net.c +133 -4
  202. data/vendor/libgit2/src/net.h +16 -2
  203. data/vendor/libgit2/src/netops.c +6 -4
  204. data/vendor/libgit2/src/netops.h +2 -2
  205. data/vendor/libgit2/src/notes.c +10 -10
  206. data/vendor/libgit2/src/object.c +24 -15
  207. data/vendor/libgit2/src/odb.c +298 -57
  208. data/vendor/libgit2/src/odb.h +16 -2
  209. data/vendor/libgit2/src/odb_loose.c +31 -21
  210. data/vendor/libgit2/src/odb_mempack.c +3 -1
  211. data/vendor/libgit2/src/odb_pack.c +391 -114
  212. data/vendor/libgit2/src/oid.c +7 -4
  213. data/vendor/libgit2/src/pack-objects.c +83 -69
  214. data/vendor/libgit2/src/pack.c +383 -150
  215. data/vendor/libgit2/src/pack.h +44 -9
  216. data/vendor/libgit2/src/patch.c +14 -7
  217. data/vendor/libgit2/src/patch_generate.c +3 -5
  218. data/vendor/libgit2/src/patch_parse.c +6 -3
  219. data/vendor/libgit2/src/path.c +102 -57
  220. data/vendor/libgit2/src/path.h +79 -6
  221. data/vendor/libgit2/src/pathspec.c +12 -11
  222. data/vendor/libgit2/src/pool.c +34 -22
  223. data/vendor/libgit2/src/pool.h +9 -1
  224. data/vendor/libgit2/src/posix.c +43 -12
  225. data/vendor/libgit2/src/posix.h +9 -0
  226. data/vendor/libgit2/src/proxy.c +2 -0
  227. data/vendor/libgit2/src/push.c +2 -0
  228. data/vendor/libgit2/src/reader.c +10 -6
  229. data/vendor/libgit2/src/rebase.c +95 -49
  230. data/vendor/libgit2/src/refdb.c +165 -13
  231. data/vendor/libgit2/src/refdb.h +69 -0
  232. data/vendor/libgit2/src/refdb_fs.c +144 -152
  233. data/vendor/libgit2/src/reflog.c +21 -20
  234. data/vendor/libgit2/src/refs.c +151 -231
  235. data/vendor/libgit2/src/refs.h +2 -20
  236. data/vendor/libgit2/src/refspec.c +80 -44
  237. data/vendor/libgit2/src/regexp.c +2 -2
  238. data/vendor/libgit2/src/remote.c +312 -121
  239. data/vendor/libgit2/src/remote.h +2 -1
  240. data/vendor/libgit2/src/repository.c +351 -189
  241. data/vendor/libgit2/src/repository.h +23 -29
  242. data/vendor/libgit2/src/reset.c +7 -6
  243. data/vendor/libgit2/src/revert.c +8 -2
  244. data/vendor/libgit2/src/revparse.c +19 -13
  245. data/vendor/libgit2/src/revwalk.c +35 -20
  246. data/vendor/libgit2/src/runtime.c +162 -0
  247. data/vendor/libgit2/src/runtime.h +62 -0
  248. data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
  249. data/vendor/libgit2/src/signature.c +6 -5
  250. data/vendor/libgit2/src/sortedcache.c +2 -3
  251. data/vendor/libgit2/src/sortedcache.h +10 -8
  252. data/vendor/libgit2/src/stash.c +7 -3
  253. data/vendor/libgit2/src/status.c +9 -4
  254. data/vendor/libgit2/src/strarray.c +64 -0
  255. data/vendor/libgit2/src/streams/mbedtls.c +14 -17
  256. data/vendor/libgit2/src/streams/mbedtls.h +1 -1
  257. data/vendor/libgit2/src/streams/openssl.c +113 -207
  258. data/vendor/libgit2/src/streams/openssl.h +9 -1
  259. data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
  260. data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
  261. data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
  262. data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
  263. data/vendor/libgit2/src/streams/registry.c +10 -9
  264. data/vendor/libgit2/src/streams/socket.c +6 -2
  265. data/vendor/libgit2/src/streams/stransport.c +6 -3
  266. data/vendor/libgit2/src/streams/tls.c +5 -3
  267. data/vendor/libgit2/src/submodule.c +134 -66
  268. data/vendor/libgit2/src/submodule.h +9 -9
  269. data/vendor/libgit2/src/sysdir.c +8 -26
  270. data/vendor/libgit2/src/sysdir.h +0 -11
  271. data/vendor/libgit2/src/tag.c +49 -11
  272. data/vendor/libgit2/src/thread.c +140 -0
  273. data/vendor/libgit2/src/thread.h +479 -0
  274. data/vendor/libgit2/src/threadstate.c +83 -0
  275. data/vendor/libgit2/src/threadstate.h +24 -0
  276. data/vendor/libgit2/src/trace.c +2 -2
  277. data/vendor/libgit2/src/trace.h +17 -13
  278. data/vendor/libgit2/src/transaction.c +21 -9
  279. data/vendor/libgit2/src/transport.c +3 -3
  280. data/vendor/libgit2/src/transports/auth.c +1 -1
  281. data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
  282. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
  283. data/vendor/libgit2/src/transports/credential.c +17 -7
  284. data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
  285. data/vendor/libgit2/src/transports/git.c +1 -3
  286. data/vendor/libgit2/src/transports/http.c +19 -17
  287. data/vendor/libgit2/src/transports/http.h +1 -0
  288. data/vendor/libgit2/src/transports/httpclient.c +84 -42
  289. data/vendor/libgit2/src/transports/httpclient.h +1 -1
  290. data/vendor/libgit2/src/transports/local.c +5 -5
  291. data/vendor/libgit2/src/transports/smart.c +14 -9
  292. data/vendor/libgit2/src/transports/smart.h +1 -1
  293. data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
  294. data/vendor/libgit2/src/transports/ssh.c +51 -17
  295. data/vendor/libgit2/src/transports/winhttp.c +156 -88
  296. data/vendor/libgit2/src/tree.c +100 -77
  297. data/vendor/libgit2/src/tree.h +1 -0
  298. data/vendor/libgit2/src/tsort.c +0 -2
  299. data/vendor/libgit2/src/unix/map.c +3 -1
  300. data/vendor/libgit2/src/unix/posix.h +16 -1
  301. data/vendor/libgit2/src/unix/pthread.h +2 -1
  302. data/vendor/libgit2/src/utf8.c +150 -0
  303. data/vendor/libgit2/src/utf8.h +52 -0
  304. data/vendor/libgit2/src/util.c +74 -183
  305. data/vendor/libgit2/src/util.h +33 -39
  306. data/vendor/libgit2/src/vector.c +23 -19
  307. data/vendor/libgit2/src/vector.h +4 -2
  308. data/vendor/libgit2/src/win32/findfile.c +4 -2
  309. data/vendor/libgit2/src/win32/git2.rc +18 -3
  310. data/vendor/libgit2/src/win32/map.c +1 -1
  311. data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
  312. data/vendor/libgit2/src/win32/path_w32.c +23 -25
  313. data/vendor/libgit2/src/win32/path_w32.h +0 -1
  314. data/vendor/libgit2/src/win32/posix_w32.c +77 -1
  315. data/vendor/libgit2/src/win32/precompiled.h +0 -1
  316. data/vendor/libgit2/src/win32/reparse.h +4 -4
  317. data/vendor/libgit2/src/win32/thread.c +24 -15
  318. data/vendor/libgit2/src/win32/thread.h +1 -1
  319. data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
  320. data/vendor/libgit2/src/win32/w32_common.h +18 -9
  321. data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
  322. data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
  323. data/vendor/libgit2/src/win32/w32_util.h +6 -6
  324. data/vendor/libgit2/src/worktree.c +37 -15
  325. data/vendor/libgit2/src/zstream.c +1 -1
  326. metadata +56 -38
  327. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
  328. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
  329. data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
  330. data/vendor/libgit2/src/buf_text.c +0 -316
  331. data/vendor/libgit2/src/buf_text.h +0 -122
  332. data/vendor/libgit2/src/global.c +0 -361
  333. data/vendor/libgit2/src/global.h +0 -41
  334. data/vendor/libgit2/src/thread-utils.c +0 -58
  335. data/vendor/libgit2/src/thread-utils.h +0 -246
  336. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
  337. data/vendor/libgit2/src/win32/w32_stack.c +0 -188
  338. data/vendor/libgit2/src/win32/w32_stack.h +0 -140
@@ -90,7 +90,7 @@ extern int git_http_client_new(
90
90
 
91
91
  /*
92
92
  * Sends a request to the host specified by the request URL. If the
93
- * method is POST, either the the content_length or the chunked flag must
93
+ * method is POST, either the content_length or the chunked flag must
94
94
  * be specified. The body should be provided in subsequent calls to
95
95
  * git_http_client_send_body.
96
96
  *
@@ -36,7 +36,7 @@ typedef struct {
36
36
  char *url;
37
37
  int direction;
38
38
  int flags;
39
- git_atomic cancelled;
39
+ git_atomic32 cancelled;
40
40
  git_repository *repo;
41
41
  git_transport_message_cb progress_cb;
42
42
  git_transport_message_cb error_cb;
@@ -158,7 +158,7 @@ static int store_refs(transport_local *t)
158
158
  git_remote_head *head;
159
159
  git_strarray ref_names = {0};
160
160
 
161
- assert(t);
161
+ GIT_ASSERT_ARG(t);
162
162
 
163
163
  if (git_reference_list(&ref_names, t->repo) < 0)
164
164
  goto on_error;
@@ -185,12 +185,12 @@ static int store_refs(transport_local *t)
185
185
  }
186
186
 
187
187
  t->have_refs = 1;
188
- git_strarray_free(&ref_names);
188
+ git_strarray_dispose(&ref_names);
189
189
  return 0;
190
190
 
191
191
  on_error:
192
192
  git_vector_free(&t->refs);
193
- git_strarray_free(&ref_names);
193
+ git_strarray_dispose(&ref_names);
194
194
  return -1;
195
195
  }
196
196
 
@@ -671,7 +671,7 @@ static void local_cancel(git_transport *transport)
671
671
  {
672
672
  transport_local *t = (transport_local *)transport;
673
673
 
674
- git_atomic_set(&t->cancelled, 1);
674
+ git_atomic32_set(&t->cancelled, 1);
675
675
  }
676
676
 
677
677
  static int local_close(git_transport *transport)
@@ -18,7 +18,7 @@ static int git_smart__recv_cb(gitno_buffer *buf)
18
18
  size_t old_len, bytes_read;
19
19
  int error;
20
20
 
21
- assert(t->current_stream);
21
+ GIT_ASSERT(t->current_stream);
22
22
 
23
23
  old_len = buf->offset;
24
24
 
@@ -30,7 +30,7 @@ static int git_smart__recv_cb(gitno_buffer *buf)
30
30
  if (t->packetsize_cb && !t->cancelled.val) {
31
31
  error = t->packetsize_cb(bytes_read, t->packetsize_payload);
32
32
  if (error) {
33
- git_atomic_set(&t->cancelled, 1);
33
+ git_atomic32_set(&t->cancelled, 1);
34
34
  return GIT_EUSER;
35
35
  }
36
36
  }
@@ -132,7 +132,7 @@ static int git_smart__set_custom_headers(
132
132
  size_t i;
133
133
 
134
134
  if (t->custom_headers.count)
135
- git_strarray_free(&t->custom_headers);
135
+ git_strarray_dispose(&t->custom_headers);
136
136
 
137
137
  if (!custom_headers)
138
138
  return 0;
@@ -226,6 +226,8 @@ static int git_smart__connect(
226
226
  t->url = git__strdup(url);
227
227
  GIT_ERROR_CHECK_ALLOC(t->url);
228
228
 
229
+ git_proxy_options_clear(&t->proxy);
230
+
229
231
  if (git_proxy_options_dup(&t->proxy, proxy) < 0)
230
232
  return -1;
231
233
 
@@ -346,7 +348,7 @@ int git_smart__negotiation_step(git_transport *transport, void *data, size_t len
346
348
  return error;
347
349
 
348
350
  /* If this is a stateful implementation, the stream we get back should be the same */
349
- assert(t->rpc || t->current_stream == stream);
351
+ GIT_ASSERT(t->rpc || t->current_stream == stream);
350
352
 
351
353
  /* Save off the current stream (i.e. socket) that we are working with */
352
354
  t->current_stream = stream;
@@ -375,7 +377,7 @@ int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream
375
377
  return error;
376
378
 
377
379
  /* If this is a stateful implementation, the stream we get back should be the same */
378
- assert(t->rpc || t->current_stream == *stream);
380
+ GIT_ASSERT(t->rpc || t->current_stream == *stream);
379
381
 
380
382
  /* Save off the current stream (i.e. socket) that we are working with */
381
383
  t->current_stream = *stream;
@@ -389,7 +391,7 @@ static void git_smart__cancel(git_transport *transport)
389
391
  {
390
392
  transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
391
393
 
392
- git_atomic_set(&t->cancelled, 1);
394
+ git_atomic32_set(&t->cancelled, 1);
393
395
  }
394
396
 
395
397
  static int git_smart__is_connected(git_transport *transport)
@@ -465,7 +467,7 @@ static void git_smart__free(git_transport *transport)
465
467
  git_vector_free(refs);
466
468
  git__free((char *)t->proxy.url);
467
469
 
468
- git_strarray_free(&t->custom_headers);
470
+ git_strarray_dispose(&t->custom_headers);
469
471
 
470
472
  git__free(t);
471
473
  }
@@ -481,7 +483,9 @@ int git_transport_smart_certificate_check(git_transport *transport, git_cert *ce
481
483
  {
482
484
  transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
483
485
 
484
- assert(transport && cert && hostname);
486
+ GIT_ASSERT_ARG(transport);
487
+ GIT_ASSERT_ARG(cert);
488
+ GIT_ASSERT_ARG(hostname);
485
489
 
486
490
  if (!t->certificate_check_cb)
487
491
  return GIT_PASSTHROUGH;
@@ -493,7 +497,8 @@ int git_transport_smart_credentials(git_credential **out, git_transport *transpo
493
497
  {
494
498
  transport_smart *t = GIT_CONTAINER_OF(transport, transport_smart, parent);
495
499
 
496
- assert(out && transport);
500
+ GIT_ASSERT_ARG(out);
501
+ GIT_ASSERT_ARG(transport);
497
502
 
498
503
  if (!t->cred_acquire_cb)
499
504
  return GIT_PASSTHROUGH;
@@ -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
 
@@ -41,14 +40,22 @@
41
40
  #define WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH 0
42
41
  #endif
43
42
 
44
- #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS_1_1
43
+ #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1
45
44
  # define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 0x00000200
46
45
  #endif
47
46
 
48
- #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS_1_2
47
+ #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2
49
48
  # define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 0x00000800
50
49
  #endif
51
50
 
51
+ #ifndef WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3
52
+ # define WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3 0x00002000
53
+ #endif
54
+
55
+ #ifndef WINHTTP_NO_CLIENT_CERT_CONTEXT
56
+ # define WINHTTP_NO_CLIENT_CERT_CONTEXT NULL
57
+ #endif
58
+
52
59
  #ifndef HTTP_STATUS_PERMANENT_REDIRECT
53
60
  # define HTTP_STATUS_PERMANENT_REDIRECT 308
54
61
  #endif
@@ -108,7 +115,8 @@ typedef struct {
108
115
  DWORD post_body_len;
109
116
  unsigned sent_request : 1,
110
117
  received_response : 1,
111
- chunked : 1;
118
+ chunked : 1,
119
+ status_sending_request_reached: 1;
112
120
  } winhttp_stream;
113
121
 
114
122
  typedef struct {
@@ -146,7 +154,7 @@ static int apply_userpass_credentials(HINTERNET request, DWORD target, int mecha
146
154
  native_scheme = WINHTTP_AUTH_SCHEME_BASIC;
147
155
  } else {
148
156
  git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
149
- error = -1;
157
+ error = GIT_EAUTH;
150
158
  goto done;
151
159
  }
152
160
 
@@ -185,7 +193,7 @@ static int apply_default_credentials(HINTERNET request, DWORD target, int mechan
185
193
  native_scheme = WINHTTP_AUTH_SCHEME_NTLM;
186
194
  } else {
187
195
  git_error_set(GIT_ERROR_HTTP, "invalid authentication scheme");
188
- return -1;
196
+ return GIT_EAUTH;
189
197
  }
190
198
 
191
199
  /*
@@ -265,7 +273,7 @@ static int acquire_fallback_cred(
265
273
  pISM->lpVtbl->Release(pISM);
266
274
  }
267
275
 
268
- /* Only unitialize if the call to CoInitializeEx was successful. */
276
+ /* Only uninitialize if the call to CoInitializeEx was successful. */
269
277
  if (SUCCEEDED(hCoInitResult))
270
278
  CoUninitialize();
271
279
  }
@@ -421,7 +429,7 @@ static int winhttp_stream_connect(winhttp_stream *s)
421
429
  proxy_opts = &t->owner->proxy;
422
430
  if (proxy_opts->type == GIT_PROXY_AUTO) {
423
431
  /* Set proxy if necessary */
424
- 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)
425
433
  goto on_error;
426
434
  }
427
435
  else if (proxy_opts->type == GIT_PROXY_SPECIFIED) {
@@ -448,8 +456,14 @@ static int winhttp_stream_connect(winhttp_stream *s)
448
456
  git_buf_puts(&processed_url, t->proxy.url.scheme);
449
457
  git_buf_PUTS(&processed_url, "://");
450
458
 
459
+ if (git_net_url_is_ipv6(&t->proxy.url))
460
+ git_buf_putc(&processed_url, '[');
461
+
451
462
  git_buf_puts(&processed_url, t->proxy.url.host);
452
463
 
464
+ if (git_net_url_is_ipv6(&t->proxy.url))
465
+ git_buf_putc(&processed_url, ']');
466
+
453
467
  if (!git_net_url_is_default_port(&t->proxy.url))
454
468
  git_buf_printf(&processed_url, ":%s", t->proxy.url.port);
455
469
 
@@ -602,7 +616,7 @@ static int parse_unauthorized_response(
602
616
  */
603
617
  if (!WinHttpQueryAuthSchemes(request, &supported, &first, &target)) {
604
618
  git_error_set(GIT_ERROR_OS, "failed to parse supported auth schemes");
605
- return -1;
619
+ return GIT_EAUTH;
606
620
  }
607
621
 
608
622
  if (WINHTTP_AUTH_SCHEME_NTLM & supported) {
@@ -704,46 +718,54 @@ static void CALLBACK winhttp_status(
704
718
  DWORD status;
705
719
 
706
720
  GIT_UNUSED(connection);
707
- GIT_UNUSED(ctx);
708
721
  GIT_UNUSED(info_len);
709
722
 
710
- if (code != WINHTTP_CALLBACK_STATUS_SECURE_FAILURE)
711
- return;
712
-
713
- status = *((DWORD *)info);
714
-
715
- if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID))
716
- git_error_set(GIT_ERROR_HTTP, "SSL certificate issued for different common name");
717
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID))
718
- git_error_set(GIT_ERROR_HTTP, "SSL certificate has expired");
719
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA))
720
- git_error_set(GIT_ERROR_HTTP, "SSL certificate signed by unknown CA");
721
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT))
722
- git_error_set(GIT_ERROR_HTTP, "SSL certificate is invalid");
723
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED))
724
- git_error_set(GIT_ERROR_HTTP, "certificate revocation check failed");
725
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED))
726
- git_error_set(GIT_ERROR_HTTP, "SSL certificate was revoked");
727
- else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR))
728
- git_error_set(GIT_ERROR_HTTP, "security libraries could not be loaded");
729
- else
730
- git_error_set(GIT_ERROR_HTTP, "unknown security error %lu", status);
723
+ switch (code) {
724
+ case WINHTTP_CALLBACK_STATUS_SECURE_FAILURE:
725
+ status = *((DWORD *)info);
726
+
727
+ if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID))
728
+ git_error_set(GIT_ERROR_HTTP, "SSL certificate issued for different common name");
729
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_DATE_INVALID))
730
+ git_error_set(GIT_ERROR_HTTP, "SSL certificate has expired");
731
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA))
732
+ git_error_set(GIT_ERROR_HTTP, "SSL certificate signed by unknown CA");
733
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CERT))
734
+ git_error_set(GIT_ERROR_HTTP, "SSL certificate is invalid");
735
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REV_FAILED))
736
+ git_error_set(GIT_ERROR_HTTP, "certificate revocation check failed");
737
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_CERT_REVOKED))
738
+ git_error_set(GIT_ERROR_HTTP, "SSL certificate was revoked");
739
+ else if ((status & WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR))
740
+ git_error_set(GIT_ERROR_HTTP, "security libraries could not be loaded");
741
+ else
742
+ git_error_set(GIT_ERROR_HTTP, "unknown security error %lu", status);
743
+
744
+ break;
745
+
746
+ case WINHTTP_CALLBACK_STATUS_SENDING_REQUEST:
747
+ ((winhttp_stream *) ctx)->status_sending_request_reached = 1;
748
+
749
+ break;
750
+ }
731
751
  }
732
752
 
733
753
  static int winhttp_connect(
734
754
  winhttp_subtransport *t)
735
755
  {
736
- wchar_t *wide_host;
756
+ wchar_t *wide_host = NULL;
737
757
  int32_t port;
738
- wchar_t *wide_ua;
739
- 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;
740
761
  int error = -1;
741
762
  int default_timeout = TIMEOUT_INFINITE;
742
763
  int default_connect_timeout = DEFAULT_CONNECT_TIMEOUT;
743
764
  DWORD protocols =
744
765
  WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 |
745
766
  WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 |
746
- WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
767
+ WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 |
768
+ WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
747
769
 
748
770
  t->session = NULL;
749
771
  t->connection = NULL;
@@ -751,29 +773,33 @@ static int winhttp_connect(
751
773
  /* Prepare port */
752
774
  if (git__strntol32(&port, t->server.url.port,
753
775
  strlen(t->server.url.port), NULL, 10) < 0)
754
- 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
+ }
755
787
 
756
788
  /* Prepare host */
757
- if (git__utf8_to_16_alloc(&wide_host, t->server.url.host) < 0) {
789
+ if (git__utf8_to_16_alloc(&wide_host, host) < 0) {
758
790
  git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
759
- return -1;
791
+ goto on_error;
760
792
  }
761
793
 
762
794
 
763
- if ((error = git_http__user_agent(&ua)) < 0) {
764
- git__free(wide_host);
765
- return error;
766
- }
795
+ if (git_http__user_agent(&ua) < 0)
796
+ goto on_error;
767
797
 
768
798
  if (git__utf8_to_16_alloc(&wide_ua, git_buf_cstr(&ua)) < 0) {
769
799
  git_error_set(GIT_ERROR_OS, "unable to convert host to wide characters");
770
- git__free(wide_host);
771
- git_buf_dispose(&ua);
772
- return -1;
800
+ goto on_error;
773
801
  }
774
802
 
775
- git_buf_dispose(&ua);
776
-
777
803
  /* Establish session */
778
804
  t->session = WinHttpOpen(
779
805
  wide_ua,
@@ -788,14 +814,20 @@ static int winhttp_connect(
788
814
  }
789
815
 
790
816
  /*
791
- * Do a best-effort attempt to enable TLS 1.2 but allow this to
792
- * fail; if TLS 1.2 support is not available for some reason,
817
+ * Do a best-effort attempt to enable TLS 1.3 and 1.2 but allow this to
818
+ * fail; if TLS 1.2 or 1.3 support is not available for some reason,
793
819
  * ignore the failure (it will keep the default protocols).
794
820
  */
795
- WinHttpSetOption(t->session,
821
+ if (WinHttpSetOption(t->session,
796
822
  WINHTTP_OPTION_SECURE_PROTOCOLS,
797
823
  &protocols,
798
- sizeof(protocols));
824
+ sizeof(protocols)) == FALSE) {
825
+ protocols &= ~WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_3;
826
+ WinHttpSetOption(t->session,
827
+ WINHTTP_OPTION_SECURE_PROTOCOLS,
828
+ &protocols,
829
+ sizeof(protocols));
830
+ }
799
831
 
800
832
  if (!WinHttpSetTimeouts(t->session, default_timeout, default_connect_timeout, default_timeout, default_timeout)) {
801
833
  git_error_set(GIT_ERROR_OS, "failed to set timeouts for WinHTTP");
@@ -815,7 +847,12 @@ static int winhttp_connect(
815
847
  goto on_error;
816
848
  }
817
849
 
818
- if (WinHttpSetStatusCallback(t->connection, winhttp_status, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, 0) == WINHTTP_INVALID_STATUS_CALLBACK) {
850
+ if (WinHttpSetStatusCallback(
851
+ t->connection,
852
+ winhttp_status,
853
+ WINHTTP_CALLBACK_FLAG_SECURE_FAILURE | WINHTTP_CALLBACK_FLAG_SEND_REQUEST,
854
+ 0
855
+ ) == WINHTTP_INVALID_STATUS_CALLBACK) {
819
856
  git_error_set(GIT_ERROR_OS, "failed to set status callback");
820
857
  goto on_error;
821
858
  }
@@ -826,6 +863,8 @@ on_error:
826
863
  if (error < 0)
827
864
  winhttp_close_connection(t);
828
865
 
866
+ git_buf_dispose(&ua);
867
+ git_buf_dispose(&ipv6);
829
868
  git__free(wide_host);
830
869
  git__free(wide_ua);
831
870
 
@@ -847,12 +886,12 @@ static int do_send_request(winhttp_stream *s, size_t len, bool chunked)
847
886
  success = WinHttpSendRequest(s->request,
848
887
  WINHTTP_NO_ADDITIONAL_HEADERS, 0,
849
888
  WINHTTP_NO_REQUEST_DATA, 0,
850
- WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, 0);
889
+ WINHTTP_IGNORE_REQUEST_TOTAL_LENGTH, (DWORD_PTR)s);
851
890
  } else {
852
891
  success = WinHttpSendRequest(s->request,
853
892
  WINHTTP_NO_ADDITIONAL_HEADERS, 0,
854
893
  WINHTTP_NO_REQUEST_DATA, 0,
855
- (DWORD)len, 0);
894
+ (DWORD)len, (DWORD_PTR)s);
856
895
  }
857
896
 
858
897
  if (success || GetLastError() != (DWORD)SEC_E_BUFFER_TOO_SMALL)
@@ -864,42 +903,71 @@ static int do_send_request(winhttp_stream *s, size_t len, bool chunked)
864
903
 
865
904
  static int send_request(winhttp_stream *s, size_t len, bool chunked)
866
905
  {
867
- int request_failed = 0, cert_valid = 1, error = 0;
868
- DWORD ignore_flags;
906
+ int request_failed = 1, error, attempts = 0;
907
+ DWORD ignore_flags, send_request_error;
869
908
 
870
909
  git_error_clear();
871
- if ((error = do_send_request(s, len, chunked)) < 0) {
872
- if (GetLastError() != ERROR_WINHTTP_SECURE_FAILURE) {
873
- git_error_set(GIT_ERROR_OS, "failed to send request");
874
- return -1;
875
- }
876
910
 
877
- request_failed = 1;
878
- cert_valid = 0;
879
- }
911
+ while (request_failed && attempts++ < 3) {
912
+ int cert_valid = 1;
913
+ int client_cert_requested = 0;
914
+ request_failed = 0;
915
+ if ((error = do_send_request(s, len, chunked)) < 0) {
916
+ send_request_error = GetLastError();
917
+ request_failed = 1;
918
+ switch (send_request_error) {
919
+ case ERROR_WINHTTP_SECURE_FAILURE:
920
+ cert_valid = 0;
921
+ break;
922
+ case ERROR_WINHTTP_CLIENT_AUTH_CERT_NEEDED:
923
+ client_cert_requested = 1;
924
+ break;
925
+ default:
926
+ git_error_set(GIT_ERROR_OS, "failed to send request");
927
+ return -1;
928
+ }
929
+ }
880
930
 
881
- git_error_clear();
882
- if ((error = certificate_check(s, cert_valid)) < 0) {
883
- if (!git_error_last())
884
- git_error_set(GIT_ERROR_OS, "user cancelled certificate check");
931
+ /*
932
+ * Only check the certificate if we were able to reach the sending request phase, or
933
+ * received a secure failure error. Otherwise, the server certificate won't be available
934
+ * since the request wasn't able to complete (e.g. proxy auth required)
935
+ */
936
+ if (!cert_valid ||
937
+ (!request_failed && s->status_sending_request_reached)) {
938
+ git_error_clear();
939
+ if ((error = certificate_check(s, cert_valid)) < 0) {
940
+ if (!git_error_last())
941
+ git_error_set(GIT_ERROR_OS, "user cancelled certificate check");
885
942
 
886
- return error;
887
- }
943
+ return error;
944
+ }
945
+ }
888
946
 
889
- /* if neither the request nor the certificate check returned errors, we're done */
890
- if (!request_failed)
891
- return 0;
947
+ /* if neither the request nor the certificate check returned errors, we're done */
948
+ if (!request_failed)
949
+ return 0;
892
950
 
893
- ignore_flags = no_check_cert_flags;
951
+ if (!cert_valid) {
952
+ ignore_flags = no_check_cert_flags;
953
+ if (!WinHttpSetOption(s->request, WINHTTP_OPTION_SECURITY_FLAGS, &ignore_flags, sizeof(ignore_flags))) {
954
+ git_error_set(GIT_ERROR_OS, "failed to set security options");
955
+ return -1;
956
+ }
957
+ }
894
958
 
895
- if (!WinHttpSetOption(s->request, WINHTTP_OPTION_SECURITY_FLAGS, &ignore_flags, sizeof(ignore_flags))) {
896
- git_error_set(GIT_ERROR_OS, "failed to set security options");
897
- return -1;
959
+ if (client_cert_requested) {
960
+ /*
961
+ * Client certificates are not supported, explicitly tell the server that
962
+ * (it's possible a client certificate was requested but is not required)
963
+ */
964
+ if (!WinHttpSetOption(s->request, WINHTTP_OPTION_CLIENT_CERT_CONTEXT, WINHTTP_NO_CLIENT_CERT_CONTEXT, 0)) {
965
+ git_error_set(GIT_ERROR_OS, "failed to set client cert context");
966
+ return -1;
967
+ }
968
+ }
898
969
  }
899
970
 
900
- if ((error = do_send_request(s, len, chunked)) < 0)
901
- git_error_set(GIT_ERROR_OS, "failed to send request with unchecked certificate");
902
-
903
971
  return error;
904
972
  }
905
973
 
@@ -972,7 +1040,7 @@ replay:
972
1040
  /* Enforce a reasonable cap on the number of replays */
973
1041
  if (replay_count++ >= GIT_HTTP_REPLAY_MAX) {
974
1042
  git_error_set(GIT_ERROR_HTTP, "too many redirects or authentication replays");
975
- return -1;
1043
+ return GIT_ERROR; /* not GIT_EAUTH because the exact cause is not clear */
976
1044
  }
977
1045
 
978
1046
  /* Connect if necessary */
@@ -993,7 +1061,7 @@ replay:
993
1061
  }
994
1062
 
995
1063
  if (s->chunked) {
996
- assert(s->verb == post_verb);
1064
+ GIT_ASSERT(s->verb == post_verb);
997
1065
 
998
1066
  /* Flush, if necessary */
999
1067
  if (s->chunk_buffer_len > 0 &&
@@ -1044,7 +1112,7 @@ replay:
1044
1112
  }
1045
1113
 
1046
1114
  len -= bytes_read;
1047
- assert(bytes_read == bytes_written);
1115
+ GIT_ASSERT(bytes_read == bytes_written);
1048
1116
  }
1049
1117
 
1050
1118
  git__free(buffer);
@@ -1156,7 +1224,7 @@ replay:
1156
1224
  if (error < 0) {
1157
1225
  return error;
1158
1226
  } else if (!error) {
1159
- assert(t->server.cred);
1227
+ GIT_ASSERT(t->server.cred);
1160
1228
  winhttp_stream_close(s);
1161
1229
  goto replay;
1162
1230
  }
@@ -1170,7 +1238,7 @@ replay:
1170
1238
  if (error < 0) {
1171
1239
  return error;
1172
1240
  } else if (!error) {
1173
- assert(t->proxy.cred);
1241
+ GIT_ASSERT(t->proxy.cred);
1174
1242
  winhttp_stream_close(s);
1175
1243
  goto replay;
1176
1244
  }
@@ -1256,7 +1324,7 @@ static int winhttp_stream_write_single(
1256
1324
  return -1;
1257
1325
  }
1258
1326
 
1259
- assert((DWORD)len == bytes_written);
1327
+ GIT_ASSERT((DWORD)len == bytes_written);
1260
1328
 
1261
1329
  return 0;
1262
1330
  }
@@ -1355,7 +1423,7 @@ static int winhttp_stream_write_buffered(
1355
1423
  return -1;
1356
1424
  }
1357
1425
 
1358
- assert((DWORD)len == bytes_written);
1426
+ GIT_ASSERT((DWORD)len == bytes_written);
1359
1427
 
1360
1428
  s->post_body_len += bytes_written;
1361
1429
 
@@ -1562,7 +1630,7 @@ static int winhttp_action(
1562
1630
  break;
1563
1631
 
1564
1632
  default:
1565
- assert(0);
1633
+ GIT_ASSERT(0);
1566
1634
  }
1567
1635
 
1568
1636
  if (!ret)