rugged 1.6.3 → 1.9.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 (443) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/AUTHORS +1 -0
  5. data/vendor/libgit2/CMakeLists.txt +25 -17
  6. data/vendor/libgit2/COPYING +195 -1
  7. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  8. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  9. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  10. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
  11. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
  14. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  15. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  16. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  17. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  18. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  19. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  20. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  21. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  22. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  23. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  25. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  27. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  28. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  29. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  30. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  31. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  32. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  33. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  34. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  35. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  36. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  37. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  38. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  39. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  40. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  41. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  42. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  43. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  44. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  45. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  46. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
  47. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  48. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  49. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  50. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  51. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  52. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  53. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  54. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  55. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  56. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  57. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  58. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  59. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  60. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  61. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  62. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  63. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  64. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  65. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  66. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  67. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  68. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  69. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  70. data/vendor/libgit2/include/git2/apply.h +27 -6
  71. data/vendor/libgit2/include/git2/attr.h +17 -4
  72. data/vendor/libgit2/include/git2/blame.h +133 -28
  73. data/vendor/libgit2/include/git2/blob.h +71 -28
  74. data/vendor/libgit2/include/git2/branch.h +22 -15
  75. data/vendor/libgit2/include/git2/buffer.h +6 -4
  76. data/vendor/libgit2/include/git2/cert.h +2 -1
  77. data/vendor/libgit2/include/git2/checkout.h +83 -32
  78. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  79. data/vendor/libgit2/include/git2/clone.h +25 -9
  80. data/vendor/libgit2/include/git2/commit.h +132 -3
  81. data/vendor/libgit2/include/git2/common.h +138 -56
  82. data/vendor/libgit2/include/git2/config.h +93 -23
  83. data/vendor/libgit2/include/git2/credential.h +30 -2
  84. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  85. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  86. data/vendor/libgit2/include/git2/describe.h +13 -1
  87. data/vendor/libgit2/include/git2/diff.h +77 -9
  88. data/vendor/libgit2/include/git2/email.h +9 -29
  89. data/vendor/libgit2/include/git2/errors.h +49 -74
  90. data/vendor/libgit2/include/git2/filter.h +14 -7
  91. data/vendor/libgit2/include/git2/global.h +8 -1
  92. data/vendor/libgit2/include/git2/graph.h +3 -2
  93. data/vendor/libgit2/include/git2/ignore.h +10 -0
  94. data/vendor/libgit2/include/git2/index.h +100 -6
  95. data/vendor/libgit2/include/git2/indexer.h +21 -4
  96. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  97. data/vendor/libgit2/include/git2/merge.h +46 -1
  98. data/vendor/libgit2/include/git2/message.h +2 -2
  99. data/vendor/libgit2/include/git2/net.h +3 -1
  100. data/vendor/libgit2/include/git2/notes.h +9 -6
  101. data/vendor/libgit2/include/git2/object.h +9 -8
  102. data/vendor/libgit2/include/git2/odb.h +91 -49
  103. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  104. data/vendor/libgit2/include/git2/oid.h +24 -25
  105. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  106. data/vendor/libgit2/include/git2/pack.h +13 -1
  107. data/vendor/libgit2/include/git2/patch.h +2 -3
  108. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  109. data/vendor/libgit2/include/git2/proxy.h +10 -0
  110. data/vendor/libgit2/include/git2/rebase.h +9 -6
  111. data/vendor/libgit2/include/git2/refdb.h +2 -2
  112. data/vendor/libgit2/include/git2/reflog.h +3 -2
  113. data/vendor/libgit2/include/git2/refs.h +9 -6
  114. data/vendor/libgit2/include/git2/refspec.h +14 -4
  115. data/vendor/libgit2/include/git2/remote.h +112 -18
  116. data/vendor/libgit2/include/git2/repository.h +61 -15
  117. data/vendor/libgit2/include/git2/reset.h +16 -3
  118. data/vendor/libgit2/include/git2/revert.h +9 -4
  119. data/vendor/libgit2/include/git2/revparse.h +3 -3
  120. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  121. data/vendor/libgit2/include/git2/signature.h +46 -1
  122. data/vendor/libgit2/include/git2/stash.h +17 -3
  123. data/vendor/libgit2/include/git2/status.h +10 -6
  124. data/vendor/libgit2/include/git2/stdint.h +87 -85
  125. data/vendor/libgit2/include/git2/strarray.h +2 -3
  126. data/vendor/libgit2/include/git2/submodule.h +20 -9
  127. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  128. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  129. data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
  130. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  131. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  132. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  133. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  134. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  135. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  136. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  137. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  138. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  139. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  140. data/vendor/libgit2/include/git2/sys/midx.h +47 -4
  141. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  142. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  143. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  144. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  145. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  146. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  147. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  148. data/vendor/libgit2/include/git2/sys/stream.h +25 -2
  149. data/vendor/libgit2/include/git2/sys/transport.h +44 -5
  150. data/vendor/libgit2/include/git2/tag.h +3 -1
  151. data/vendor/libgit2/include/git2/trace.h +9 -3
  152. data/vendor/libgit2/include/git2/transaction.h +3 -2
  153. data/vendor/libgit2/include/git2/transport.h +11 -3
  154. data/vendor/libgit2/include/git2/tree.h +16 -5
  155. data/vendor/libgit2/include/git2/types.h +19 -3
  156. data/vendor/libgit2/include/git2/version.h +44 -8
  157. data/vendor/libgit2/include/git2/worktree.h +19 -7
  158. data/vendor/libgit2/src/CMakeLists.txt +40 -15
  159. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  160. data/vendor/libgit2/src/cli/cmd.c +1 -1
  161. data/vendor/libgit2/src/cli/cmd.h +4 -0
  162. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  163. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  164. data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
  165. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  166. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  167. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  168. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  169. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  170. data/vendor/libgit2/src/cli/common.c +168 -0
  171. data/vendor/libgit2/src/cli/common.h +63 -0
  172. data/vendor/libgit2/src/cli/error.h +1 -1
  173. data/vendor/libgit2/src/cli/main.c +52 -24
  174. data/vendor/libgit2/src/cli/opt.c +29 -3
  175. data/vendor/libgit2/src/cli/opt.h +21 -3
  176. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  177. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  178. data/vendor/libgit2/src/cli/progress.c +60 -10
  179. data/vendor/libgit2/src/cli/progress.h +16 -4
  180. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  181. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  182. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  183. data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
  184. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  185. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  186. data/vendor/libgit2/src/libgit2/apply.c +14 -16
  187. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  188. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  189. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  190. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  191. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  192. data/vendor/libgit2/src/libgit2/blame.c +152 -59
  193. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  194. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  195. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  196. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  197. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  198. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  199. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  200. data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
  201. data/vendor/libgit2/src/libgit2/clone.c +186 -164
  202. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  203. data/vendor/libgit2/src/libgit2/commit.c +123 -9
  204. data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
  205. data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
  206. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  207. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  208. data/vendor/libgit2/src/libgit2/config.c +394 -300
  209. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  210. data/vendor/libgit2/src/libgit2/config.h +9 -4
  211. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  212. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  213. data/vendor/libgit2/src/libgit2/config_file.c +113 -96
  214. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  215. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  216. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  217. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  218. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  219. data/vendor/libgit2/src/libgit2/describe.c +34 -31
  220. data/vendor/libgit2/src/libgit2/diff.c +17 -8
  221. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  222. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  223. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  224. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  225. data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
  226. data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
  227. data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
  228. data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
  229. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  230. data/vendor/libgit2/src/libgit2/email.c +5 -3
  231. data/vendor/libgit2/src/libgit2/fetch.c +39 -9
  232. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  233. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  234. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  235. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  236. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  237. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  238. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  239. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  240. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  241. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  242. data/vendor/libgit2/src/libgit2/index.c +392 -208
  243. data/vendor/libgit2/src/libgit2/index.h +16 -3
  244. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  245. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  246. data/vendor/libgit2/src/libgit2/indexer.c +44 -41
  247. data/vendor/libgit2/src/libgit2/iterator.c +34 -13
  248. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  249. data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +56 -46
  252. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  253. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  254. data/vendor/libgit2/src/libgit2/midx.c +86 -44
  255. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  256. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  257. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  258. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  259. data/vendor/libgit2/src/libgit2/object.c +42 -16
  260. data/vendor/libgit2/src/libgit2/object.h +6 -0
  261. data/vendor/libgit2/src/libgit2/odb.c +16 -9
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
  264. data/vendor/libgit2/src/libgit2/oid.c +35 -2
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  267. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  268. data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
  269. data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
  270. data/vendor/libgit2/src/libgit2/pack.c +33 -27
  271. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  272. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  273. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  274. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  275. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  276. data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
  277. data/vendor/libgit2/src/libgit2/path.c +1 -1
  278. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  279. data/vendor/libgit2/src/libgit2/push.c +81 -30
  280. data/vendor/libgit2/src/libgit2/push.h +1 -0
  281. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  282. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  283. data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
  284. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  285. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  286. data/vendor/libgit2/src/libgit2/refs.c +34 -8
  287. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  288. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  289. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  290. data/vendor/libgit2/src/libgit2/remote.c +136 -67
  291. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  292. data/vendor/libgit2/src/libgit2/repository.c +789 -330
  293. data/vendor/libgit2/src/libgit2/repository.h +22 -3
  294. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  295. data/vendor/libgit2/src/libgit2/revert.c +9 -13
  296. data/vendor/libgit2/src/libgit2/revparse.c +6 -3
  297. data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
  298. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  299. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  300. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  301. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  302. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  303. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  304. data/vendor/libgit2/src/libgit2/status.c +1 -1
  305. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
  306. data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
  307. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  308. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  309. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  310. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  311. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  312. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  313. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  314. data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
  315. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  316. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  317. data/vendor/libgit2/src/libgit2/submodule.h +9 -10
  318. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  319. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  320. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  321. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  322. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  323. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  324. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  325. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  326. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  327. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  328. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  329. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  330. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  331. data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
  332. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  333. data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
  334. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  335. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  336. data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
  337. data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
  338. data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
  339. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
  340. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
  341. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  342. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  343. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  344. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  345. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  346. data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
  347. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  348. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  349. data/vendor/libgit2/src/libgit2/tree.c +35 -27
  350. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  351. data/vendor/libgit2/src/libgit2/worktree.c +39 -27
  352. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  353. data/vendor/libgit2/src/util/alloc.c +69 -7
  354. data/vendor/libgit2/src/util/alloc.h +34 -9
  355. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  356. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  357. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  358. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  359. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
  360. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  361. data/vendor/libgit2/src/util/array.h +24 -18
  362. data/vendor/libgit2/src/util/cc-compat.h +4 -0
  363. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  364. data/vendor/libgit2/src/util/date.c +22 -14
  365. data/vendor/libgit2/src/util/date.h +12 -0
  366. data/vendor/libgit2/src/util/errors.c +401 -0
  367. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  368. data/vendor/libgit2/src/util/filebuf.c +6 -1
  369. data/vendor/libgit2/src/util/filebuf.h +19 -6
  370. data/vendor/libgit2/src/util/fs_path.c +16 -5
  371. data/vendor/libgit2/src/util/fs_path.h +23 -0
  372. data/vendor/libgit2/src/util/futils.c +14 -10
  373. data/vendor/libgit2/src/util/futils.h +13 -4
  374. data/vendor/libgit2/src/util/git2_features.h.in +21 -4
  375. data/vendor/libgit2/src/util/git2_util.h +6 -0
  376. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  377. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  378. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  379. data/vendor/libgit2/src/util/hashmap.h +424 -0
  380. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  381. data/vendor/libgit2/src/util/integer.h +3 -1
  382. data/vendor/libgit2/src/util/net.c +318 -161
  383. data/vendor/libgit2/src/util/net.h +27 -0
  384. data/vendor/libgit2/src/util/pool.c +1 -1
  385. data/vendor/libgit2/src/util/pool.h +5 -0
  386. data/vendor/libgit2/src/util/posix.c +54 -0
  387. data/vendor/libgit2/src/util/posix.h +22 -0
  388. data/vendor/libgit2/src/util/pqueue.h +1 -1
  389. data/vendor/libgit2/src/util/process.h +222 -0
  390. data/vendor/libgit2/src/util/rand.c +6 -10
  391. data/vendor/libgit2/src/util/regexp.c +1 -1
  392. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  393. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  394. data/vendor/libgit2/src/util/staticstr.h +66 -0
  395. data/vendor/libgit2/src/util/str.c +2 -2
  396. data/vendor/libgit2/src/util/strlist.c +108 -0
  397. data/vendor/libgit2/src/util/strlist.h +36 -0
  398. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  399. data/vendor/libgit2/src/util/unix/process.c +629 -0
  400. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  401. data/vendor/libgit2/src/util/util.c +17 -12
  402. data/vendor/libgit2/src/util/util.h +28 -54
  403. data/vendor/libgit2/src/util/vector.c +3 -3
  404. data/vendor/libgit2/src/util/vector.h +2 -2
  405. data/vendor/libgit2/src/util/win32/error.c +1 -1
  406. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  407. data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
  408. data/vendor/libgit2/src/util/win32/process.c +506 -0
  409. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  410. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  411. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  412. metadata +72 -49
  413. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  414. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  415. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  416. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  417. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  418. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  419. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  420. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  421. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  422. data/vendor/libgit2/src/libgit2/errors.c +0 -238
  423. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  424. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  425. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  426. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  427. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  428. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  429. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  430. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  431. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  432. data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
  433. data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
  434. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  435. data/vendor/libgit2/src/util/khash.h +0 -615
  436. data/vendor/libgit2/src/util/strmap.c +0 -100
  437. data/vendor/libgit2/src/util/strmap.h +0 -131
  438. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
  439. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  440. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  441. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  442. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  443. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+ #ifndef INCLUDE_steams_schannel_h__
8
+ #define INCLUDE_steams_schannel_h__
9
+
10
+ #include "common.h"
11
+
12
+ #include "git2/sys/stream.h"
13
+
14
+ #ifdef GIT_SCHANNEL
15
+
16
+ extern int git_schannel_stream_new(
17
+ git_stream **out,
18
+ const char *host,
19
+ const char *port);
20
+
21
+ extern int git_schannel_stream_wrap(
22
+ git_stream **out,
23
+ git_stream *in,
24
+ const char *host);
25
+
26
+ #endif
27
+
28
+ #endif
@@ -8,26 +8,29 @@
8
8
  #include "streams/socket.h"
9
9
 
10
10
  #include "posix.h"
11
- #include "netops.h"
12
11
  #include "registry.h"
12
+ #include "runtime.h"
13
13
  #include "stream.h"
14
14
 
15
15
  #ifndef _WIN32
16
- # include <sys/types.h>
17
- # include <sys/socket.h>
18
- # include <sys/select.h>
19
- # include <sys/time.h>
20
- # include <netdb.h>
21
- # include <netinet/in.h>
22
- # include <arpa/inet.h>
16
+ # include <sys/types.h>
17
+ # include <sys/socket.h>
18
+ # include <sys/select.h>
19
+ # include <sys/time.h>
20
+ # include <netdb.h>
21
+ # include <netinet/in.h>
22
+ # include <arpa/inet.h>
23
23
  #else
24
- # include <winsock2.h>
25
- # include <ws2tcpip.h>
26
- # ifdef _MSC_VER
27
- # pragma comment(lib, "ws2_32")
28
- # endif
24
+ # include <winsock2.h>
25
+ # include <ws2tcpip.h>
26
+ # ifdef _MSC_VER
27
+ # pragma comment(lib, "ws2_32")
28
+ # endif
29
29
  #endif
30
30
 
31
+ int git_socket_stream__connect_timeout = 0;
32
+ int git_socket_stream__timeout = 0;
33
+
31
34
  #ifdef GIT_WIN32
32
35
  static void net_set_error(const char *str)
33
36
  {
@@ -54,11 +57,8 @@ static int close_socket(GIT_SOCKET s)
54
57
  return 0;
55
58
 
56
59
  #ifdef GIT_WIN32
57
- if (SOCKET_ERROR == closesocket(s))
58
- return -1;
59
-
60
- if (0 != WSACleanup()) {
61
- git_error_set(GIT_ERROR_OS, "winsock cleanup failed");
60
+ if (closesocket(s) != 0) {
61
+ net_set_error("could not close socket");
62
62
  return -1;
63
63
  }
64
64
 
@@ -69,38 +69,119 @@ static int close_socket(GIT_SOCKET s)
69
69
 
70
70
  }
71
71
 
72
- static int socket_connect(git_stream *stream)
72
+ static int set_nonblocking(GIT_SOCKET s)
73
73
  {
74
- struct addrinfo *info = NULL, *p;
75
- struct addrinfo hints;
76
- git_socket_stream *st = (git_socket_stream *) stream;
77
- GIT_SOCKET s = INVALID_SOCKET;
78
- int ret;
79
-
80
74
  #ifdef GIT_WIN32
81
- /* on win32, the WSA context needs to be initialized
82
- * before any socket calls can be performed */
83
- WSADATA wsd;
75
+ unsigned long nonblocking = 1;
84
76
 
85
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) {
86
- git_error_set(GIT_ERROR_OS, "winsock init failed");
77
+ if (ioctlsocket(s, FIONBIO, &nonblocking) != 0) {
78
+ net_set_error("could not set socket non-blocking");
87
79
  return -1;
88
80
  }
81
+ #else
82
+ int flags;
83
+
84
+ if ((flags = fcntl(s, F_GETFL, 0)) == -1) {
85
+ net_set_error("could not query socket flags");
86
+ return -1;
87
+ }
88
+
89
+ flags |= O_NONBLOCK;
89
90
 
90
- if (LOBYTE(wsd.wVersion) != 2 || HIBYTE(wsd.wVersion) != 2) {
91
- WSACleanup();
92
- git_error_set(GIT_ERROR_OS, "winsock init failed");
91
+ if (fcntl(s, F_SETFL, flags) != 0) {
92
+ net_set_error("could not set socket non-blocking");
93
93
  return -1;
94
94
  }
95
95
  #endif
96
96
 
97
+ return 0;
98
+ }
99
+
100
+ /* Promote a sockerr to an errno for our error handling routines */
101
+ static int handle_sockerr(GIT_SOCKET socket)
102
+ {
103
+ int sockerr;
104
+ socklen_t errlen = sizeof(sockerr);
105
+
106
+ if (getsockopt(socket, SOL_SOCKET, SO_ERROR,
107
+ (void *)&sockerr, &errlen) < 0)
108
+ return -1;
109
+
110
+ if (sockerr == ETIMEDOUT)
111
+ return GIT_TIMEOUT;
112
+
113
+ errno = sockerr;
114
+ return -1;
115
+ }
116
+
117
+ GIT_INLINE(bool) connect_would_block(int error)
118
+ {
119
+ #ifdef GIT_WIN32
120
+ if (error == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK)
121
+ return true;
122
+ #endif
123
+
124
+ if (error == -1 && errno == EINPROGRESS)
125
+ return true;
126
+
127
+ return false;
128
+ }
129
+
130
+ static int connect_with_timeout(
131
+ GIT_SOCKET socket,
132
+ const struct sockaddr *address,
133
+ socklen_t address_len,
134
+ int timeout)
135
+ {
136
+ struct pollfd fd;
137
+ int error;
138
+
139
+ if (timeout && (error = set_nonblocking(socket)) < 0)
140
+ return error;
141
+
142
+ error = connect(socket, address, address_len);
143
+
144
+ if (error == 0 || !connect_would_block(error))
145
+ return error;
146
+
147
+ fd.fd = socket;
148
+ fd.events = POLLOUT;
149
+ fd.revents = 0;
150
+
151
+ error = p_poll(&fd, 1, timeout);
152
+
153
+ if (error == 0) {
154
+ return GIT_TIMEOUT;
155
+ } else if (error != 1) {
156
+ return -1;
157
+ } else if ((fd.revents & (POLLPRI | POLLHUP | POLLERR))) {
158
+ return handle_sockerr(socket);
159
+ } else if ((fd.revents & POLLOUT) != POLLOUT) {
160
+ git_error_set(GIT_ERROR_NET,
161
+ "unknown error while polling for connect: %d",
162
+ fd.revents);
163
+ return -1;
164
+ }
165
+
166
+ return 0;
167
+ }
168
+
169
+ static int socket_connect(git_stream *stream)
170
+ {
171
+ git_socket_stream *st = (git_socket_stream *) stream;
172
+ GIT_SOCKET s = INVALID_SOCKET;
173
+ struct addrinfo *info = NULL, *p;
174
+ struct addrinfo hints;
175
+ int error;
176
+
97
177
  memset(&hints, 0x0, sizeof(struct addrinfo));
98
178
  hints.ai_socktype = SOCK_STREAM;
99
179
  hints.ai_family = AF_UNSPEC;
100
180
 
101
- if ((ret = p_getaddrinfo(st->host, st->port, &hints, &info)) != 0) {
181
+ if ((error = p_getaddrinfo(st->host, st->port, &hints, &info)) != 0) {
102
182
  git_error_set(GIT_ERROR_NET,
103
- "failed to resolve address for %s: %s", st->host, p_gai_strerror(ret));
183
+ "failed to resolve address for %s: %s",
184
+ st->host, p_gai_strerror(error));
104
185
  return -1;
105
186
  }
106
187
 
@@ -110,51 +191,115 @@ static int socket_connect(git_stream *stream)
110
191
  if (s == INVALID_SOCKET)
111
192
  continue;
112
193
 
113
- if (connect(s, p->ai_addr, (socklen_t)p->ai_addrlen) == 0)
194
+ error = connect_with_timeout(s, p->ai_addr,
195
+ (socklen_t)p->ai_addrlen,
196
+ st->parent.connect_timeout);
197
+
198
+ if (error == 0)
114
199
  break;
115
200
 
116
201
  /* If we can't connect, try the next one */
117
202
  close_socket(s);
118
203
  s = INVALID_SOCKET;
204
+
205
+ if (error == GIT_TIMEOUT)
206
+ break;
119
207
  }
120
208
 
121
209
  /* Oops, we couldn't connect to any address */
122
- if (s == INVALID_SOCKET && p == NULL) {
123
- git_error_set(GIT_ERROR_OS, "failed to connect to %s", st->host);
124
- p_freeaddrinfo(info);
125
- return -1;
210
+ if (s == INVALID_SOCKET) {
211
+ if (error == GIT_TIMEOUT)
212
+ git_error_set(GIT_ERROR_NET, "failed to connect to %s: Operation timed out", st->host);
213
+ else
214
+ git_error_set(GIT_ERROR_OS, "failed to connect to %s", st->host);
215
+ error = -1;
216
+ goto done;
126
217
  }
127
218
 
219
+ if (st->parent.timeout && !st->parent.connect_timeout &&
220
+ (error = set_nonblocking(s)) < 0)
221
+ return error;
222
+
128
223
  st->s = s;
224
+ error = 0;
225
+
226
+ done:
129
227
  p_freeaddrinfo(info);
130
- return 0;
228
+ return error;
131
229
  }
132
230
 
133
- static ssize_t socket_write(git_stream *stream, const char *data, size_t len, int flags)
231
+ static ssize_t socket_write(
232
+ git_stream *stream,
233
+ const char *data,
234
+ size_t len,
235
+ int flags)
134
236
  {
135
237
  git_socket_stream *st = (git_socket_stream *) stream;
136
- ssize_t written;
238
+ struct pollfd fd;
239
+ ssize_t ret;
137
240
 
138
241
  GIT_ASSERT(flags == 0);
139
242
  GIT_UNUSED(flags);
140
243
 
141
- errno = 0;
244
+ ret = p_send(st->s, data, len, 0);
142
245
 
143
- if ((written = p_send(st->s, data, len, 0)) < 0) {
144
- net_set_error("error sending data");
246
+ if (st->parent.timeout && ret < 0 &&
247
+ (errno == EAGAIN || errno != EWOULDBLOCK)) {
248
+ fd.fd = st->s;
249
+ fd.events = POLLOUT;
250
+ fd.revents = 0;
251
+
252
+ ret = p_poll(&fd, 1, st->parent.timeout);
253
+
254
+ if (ret == 1) {
255
+ ret = p_send(st->s, data, len, 0);
256
+ } else if (ret == 0) {
257
+ git_error_set(GIT_ERROR_NET,
258
+ "could not write to socket: timed out");
259
+ return GIT_TIMEOUT;
260
+ }
261
+ }
262
+
263
+ if (ret < 0) {
264
+ net_set_error("error receiving data from socket");
145
265
  return -1;
146
266
  }
147
267
 
148
- return written;
268
+ return ret;
149
269
  }
150
270
 
151
- static ssize_t socket_read(git_stream *stream, void *data, size_t len)
271
+ static ssize_t socket_read(
272
+ git_stream *stream,
273
+ void *data,
274
+ size_t len)
152
275
  {
153
- ssize_t ret;
154
276
  git_socket_stream *st = (git_socket_stream *) stream;
277
+ struct pollfd fd;
278
+ ssize_t ret;
155
279
 
156
- if ((ret = p_recv(st->s, data, len, 0)) < 0)
157
- net_set_error("error receiving socket data");
280
+ ret = p_recv(st->s, data, len, 0);
281
+
282
+ if (st->parent.timeout && ret < 0 &&
283
+ (errno == EAGAIN || errno != EWOULDBLOCK)) {
284
+ fd.fd = st->s;
285
+ fd.events = POLLIN;
286
+ fd.revents = 0;
287
+
288
+ ret = p_poll(&fd, 1, st->parent.timeout);
289
+
290
+ if (ret == 1) {
291
+ ret = p_recv(st->s, data, len, 0);
292
+ } else if (ret == 0) {
293
+ git_error_set(GIT_ERROR_NET,
294
+ "could not read from socket: timed out");
295
+ return GIT_TIMEOUT;
296
+ }
297
+ }
298
+
299
+ if (ret < 0) {
300
+ net_set_error("error receiving data from socket");
301
+ return -1;
302
+ }
158
303
 
159
304
  return ret;
160
305
  }
@@ -202,6 +347,8 @@ static int default_socket_stream_new(
202
347
  }
203
348
 
204
349
  st->parent.version = GIT_STREAM_VERSION;
350
+ st->parent.timeout = git_socket_stream__timeout;
351
+ st->parent.connect_timeout = git_socket_stream__connect_timeout;
205
352
  st->parent.connect = socket_connect;
206
353
  st->parent.write = socket_write;
207
354
  st->parent.read = socket_read;
@@ -240,3 +387,42 @@ int git_socket_stream_new(
240
387
 
241
388
  return init(out, host, port);
242
389
  }
390
+
391
+ #ifdef GIT_WIN32
392
+
393
+ static void socket_stream_global_shutdown(void)
394
+ {
395
+ WSACleanup();
396
+ }
397
+
398
+ int git_socket_stream_global_init(void)
399
+ {
400
+ WORD winsock_version;
401
+ WSADATA wsa_data;
402
+
403
+ winsock_version = MAKEWORD(2, 2);
404
+
405
+ if (WSAStartup(winsock_version, &wsa_data) != 0) {
406
+ git_error_set(GIT_ERROR_OS, "could not initialize Windows Socket Library");
407
+ return -1;
408
+ }
409
+
410
+ if (LOBYTE(wsa_data.wVersion) != 2 ||
411
+ HIBYTE(wsa_data.wVersion) != 2) {
412
+ git_error_set(GIT_ERROR_SSL, "Windows Socket Library does not support Winsock 2.2");
413
+ return -1;
414
+ }
415
+
416
+ return git_runtime_shutdown_register(socket_stream_global_shutdown);
417
+ }
418
+
419
+ #else
420
+
421
+ #include "stream.h"
422
+
423
+ int git_socket_stream_global_init(void)
424
+ {
425
+ return 0;
426
+ }
427
+
428
+ #endif
@@ -9,7 +9,7 @@
9
9
 
10
10
  #include "common.h"
11
11
 
12
- #include "netops.h"
12
+ #include "stream.h"
13
13
 
14
14
  typedef struct {
15
15
  git_stream parent;
@@ -20,4 +20,6 @@ typedef struct {
20
20
 
21
21
  extern int git_socket_stream_new(git_stream **out, const char *host, const char *port);
22
22
 
23
+ extern int git_socket_stream_global_init(void);
24
+
23
25
  #endif
@@ -13,13 +13,16 @@
13
13
  #include <Security/SecureTransport.h>
14
14
  #include <Security/SecCertificate.h>
15
15
 
16
+ #include "common.h"
17
+ #include "trace.h"
16
18
  #include "git2/transport.h"
17
-
18
19
  #include "streams/socket.h"
19
20
 
20
21
  static int stransport_error(OSStatus ret)
21
22
  {
22
- CFStringRef message;
23
+ CFStringRef message_ref = NULL;
24
+ const char *message_cstr = NULL;
25
+ char *message_ptr = NULL;
23
26
 
24
27
  if (ret == noErr || ret == errSSLClosedGraceful) {
25
28
  git_error_clear();
@@ -27,14 +30,39 @@ static int stransport_error(OSStatus ret)
27
30
  }
28
31
 
29
32
  #if !TARGET_OS_IPHONE
30
- message = SecCopyErrorMessageString(ret, NULL);
31
- GIT_ERROR_CHECK_ALLOC(message);
33
+ message_ref = SecCopyErrorMessageString(ret, NULL);
34
+ GIT_ERROR_CHECK_ALLOC(message_ref);
35
+
36
+ /*
37
+ * Attempt the cheap CFString conversion; this can return NULL
38
+ * when that would be expensive. In that case, call the more
39
+ * expensive function.
40
+ */
41
+ message_cstr = CFStringGetCStringPtr(message_ref, kCFStringEncodingUTF8);
42
+
43
+ if (!message_cstr) {
44
+ /* Provide buffer to convert from UTF16 to UTF8 */
45
+ size_t message_size = CFStringGetLength(message_ref) * 2 + 1;
46
+
47
+ message_cstr = message_ptr = git__malloc(message_size);
48
+ GIT_ERROR_CHECK_ALLOC(message_ptr);
49
+
50
+ if (!CFStringGetCString(message_ref, message_ptr, message_size, kCFStringEncodingUTF8)) {
51
+ git_error_set(GIT_ERROR_NET, "SecureTransport error: %d", (unsigned int)ret);
52
+ goto done;
53
+ }
54
+ }
32
55
 
33
- git_error_set(GIT_ERROR_NET, "SecureTransport error: %s", CFStringGetCStringPtr(message, kCFStringEncodingUTF8));
34
- CFRelease(message);
56
+ git_error_set(GIT_ERROR_NET, "SecureTransport error: %s", message_cstr);
57
+
58
+ done:
59
+ git__free(message_ptr);
60
+ CFRelease(message_ref);
35
61
  #else
36
62
  git_error_set(GIT_ERROR_NET, "SecureTransport error: OSStatus %d", (unsigned int)ret);
37
- GIT_UNUSED(message);
63
+ GIT_UNUSED(message_ref);
64
+ GIT_UNUSED(message_cstr);
65
+ GIT_UNUSED(message_ptr);
38
66
  #endif
39
67
 
40
68
  return -1;
@@ -44,6 +72,7 @@ typedef struct {
44
72
  git_stream parent;
45
73
  git_stream *io;
46
74
  int owned;
75
+ int error;
47
76
  SSLContextRef ctx;
48
77
  CFDataRef der_data;
49
78
  git_cert_x509 cert_info;
@@ -61,7 +90,10 @@ static int stransport_connect(git_stream *stream)
61
90
  return error;
62
91
 
63
92
  ret = SSLHandshake(st->ctx);
64
- if (ret != errSSLServerAuthCompleted) {
93
+
94
+ if (ret != errSSLServerAuthCompleted && st->error != 0)
95
+ return -1;
96
+ else if (ret != errSSLServerAuthCompleted) {
65
97
  git_error_set(GIT_ERROR_SSL, "unexpected return value from ssl handshake %d", (int)ret);
66
98
  return -1;
67
99
  }
@@ -147,10 +179,20 @@ static int stransport_set_proxy(
147
179
  */
148
180
  static OSStatus write_cb(SSLConnectionRef conn, const void *data, size_t *len)
149
181
  {
150
- git_stream *io = (git_stream *) conn;
182
+ stransport_stream *st = (stransport_stream *)conn;
183
+ git_stream *io = st->io;
184
+ OSStatus ret;
185
+
186
+ st->error = 0;
187
+
188
+ ret = git_stream__write_full(io, data, *len, 0);
151
189
 
152
- if (git_stream__write_full(io, data, *len, 0) < 0)
153
- return -36; /* "ioErr" from MacErrors.h which is not available on iOS */
190
+ if (ret < 0) {
191
+ st->error = ret;
192
+ return (ret == GIT_TIMEOUT) ?
193
+ -9853 /* errSSLNetworkTimeout */:
194
+ -36 /* ioErr */;
195
+ }
154
196
 
155
197
  return noErr;
156
198
  }
@@ -164,8 +206,12 @@ static ssize_t stransport_write(git_stream *stream, const char *data, size_t len
164
206
  GIT_UNUSED(flags);
165
207
 
166
208
  data_len = min(len, SSIZE_MAX);
167
- if ((ret = SSLWrite(st->ctx, data, data_len, &processed)) != noErr)
209
+ if ((ret = SSLWrite(st->ctx, data, data_len, &processed)) != noErr) {
210
+ if (st->error == GIT_TIMEOUT)
211
+ return GIT_TIMEOUT;
212
+
168
213
  return stransport_error(ret);
214
+ }
169
215
 
170
216
  GIT_ASSERT(processed < SSIZE_MAX);
171
217
  return (ssize_t)processed;
@@ -182,18 +228,24 @@ static ssize_t stransport_write(git_stream *stream, const char *data, size_t len
182
228
  */
183
229
  static OSStatus read_cb(SSLConnectionRef conn, void *data, size_t *len)
184
230
  {
185
- git_stream *io = (git_stream *) conn;
231
+ stransport_stream *st = (stransport_stream *)conn;
232
+ git_stream *io = st->io;
186
233
  OSStatus error = noErr;
187
234
  size_t off = 0;
188
235
  ssize_t ret;
189
236
 
237
+ st->error = 0;
238
+
190
239
  do {
191
240
  ret = git_stream_read(io, data + off, *len - off);
241
+
192
242
  if (ret < 0) {
193
- error = -36; /* "ioErr" from MacErrors.h which is not available on iOS */
243
+ st->error = ret;
244
+ error = (ret == GIT_TIMEOUT) ?
245
+ -9853 /* errSSLNetworkTimeout */:
246
+ -36 /* ioErr */;
194
247
  break;
195
- }
196
- if (ret == 0) {
248
+ } else if (ret == 0) {
197
249
  error = errSSLClosedGraceful;
198
250
  break;
199
251
  }
@@ -207,12 +259,20 @@ static OSStatus read_cb(SSLConnectionRef conn, void *data, size_t *len)
207
259
 
208
260
  static ssize_t stransport_read(git_stream *stream, void *data, size_t len)
209
261
  {
210
- stransport_stream *st = (stransport_stream *) stream;
262
+ stransport_stream *st = (stransport_stream *)stream;
211
263
  size_t processed;
212
264
  OSStatus ret;
213
265
 
214
- if ((ret = SSLRead(st->ctx, data, len, &processed)) != noErr)
266
+ if ((ret = SSLRead(st->ctx, data, len, &processed)) != noErr) {
267
+ /* This specific SecureTransport error is not well described */
268
+ if (ret == -9806)
269
+ git_trace(GIT_TRACE_INFO, "SecureTraceport error during SSLRead: returned -9806 (connection closed via error)");
270
+
271
+ if (st->error == GIT_TIMEOUT)
272
+ return GIT_TIMEOUT;
273
+
215
274
  return stransport_error(ret);
275
+ }
216
276
 
217
277
  return processed;
218
278
  }
@@ -269,7 +329,7 @@ static int stransport_wrap(
269
329
  }
270
330
 
271
331
  if ((ret = SSLSetIOFuncs(st->ctx, read_cb, write_cb)) != noErr ||
272
- (ret = SSLSetConnection(st->ctx, st->io)) != noErr ||
332
+ (ret = SSLSetConnection(st->ctx, st)) != noErr ||
273
333
  (ret = SSLSetSessionOption(st->ctx, kSSLSessionOptionBreakOnServerAuth, true)) != noErr ||
274
334
  (ret = SSLSetProtocolVersionMin(st->ctx, kTLSProtocol1)) != noErr ||
275
335
  (ret = SSLSetProtocolVersionMax(st->ctx, kTLSProtocol12)) != noErr ||
@@ -13,6 +13,7 @@
13
13
  #include "streams/mbedtls.h"
14
14
  #include "streams/openssl.h"
15
15
  #include "streams/stransport.h"
16
+ #include "streams/schannel.h"
16
17
 
17
18
  int git_tls_stream_new(git_stream **out, const char *host, const char *port)
18
19
  {
@@ -33,6 +34,8 @@ int git_tls_stream_new(git_stream **out, const char *host, const char *port)
33
34
  init = git_openssl_stream_new;
34
35
  #elif defined(GIT_MBEDTLS)
35
36
  init = git_mbedtls_stream_new;
37
+ #elif defined(GIT_SCHANNEL)
38
+ init = git_schannel_stream_new;
36
39
  #endif
37
40
  } else {
38
41
  return error;
@@ -63,6 +66,8 @@ int git_tls_stream_wrap(git_stream **out, git_stream *in, const char *host)
63
66
  wrap = git_openssl_stream_wrap;
64
67
  #elif defined(GIT_MBEDTLS)
65
68
  wrap = git_mbedtls_stream_wrap;
69
+ #elif defined(GIT_SCHANNEL)
70
+ wrap = git_schannel_stream_wrap;
66
71
  #endif
67
72
  }
68
73