rugged 1.7.2 → 1.9.4

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 (405) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +4 -4
  3. data/ext/rugged/rugged.c +12 -1
  4. data/ext/rugged/rugged_blame.c +22 -6
  5. data/ext/rugged/rugged_blob.c +24 -9
  6. data/ext/rugged/rugged_branch.c +10 -7
  7. data/ext/rugged/rugged_branch_collection.c +8 -6
  8. data/ext/rugged/rugged_commit.c +7 -6
  9. data/ext/rugged/rugged_config.c +20 -11
  10. data/ext/rugged/rugged_diff.c +26 -12
  11. data/ext/rugged/rugged_diff_hunk.c +2 -1
  12. data/ext/rugged/rugged_index.c +39 -29
  13. data/ext/rugged/rugged_note.c +7 -6
  14. data/ext/rugged/rugged_object.c +3 -2
  15. data/ext/rugged/rugged_patch.c +23 -9
  16. data/ext/rugged/rugged_rebase.c +22 -10
  17. data/ext/rugged/rugged_reference.c +22 -13
  18. data/ext/rugged/rugged_reference_collection.c +9 -7
  19. data/ext/rugged/rugged_remote.c +23 -12
  20. data/ext/rugged/rugged_remote_collection.c +11 -9
  21. data/ext/rugged/rugged_repo.c +60 -45
  22. data/ext/rugged/rugged_revwalk.c +22 -12
  23. data/ext/rugged/rugged_submodule.c +23 -20
  24. data/ext/rugged/rugged_submodule_collection.c +20 -9
  25. data/ext/rugged/rugged_tag.c +6 -4
  26. data/ext/rugged/rugged_tag_collection.c +7 -5
  27. data/ext/rugged/rugged_tree.c +27 -15
  28. data/lib/rugged/version.rb +1 -1
  29. data/vendor/libgit2/AUTHORS +3 -0
  30. data/vendor/libgit2/CMakeLists.txt +23 -10
  31. data/vendor/libgit2/COPYING +195 -1
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +4 -1
  33. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  34. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  35. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  36. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  37. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  38. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  39. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  40. data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
  41. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  42. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  43. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  44. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  45. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  46. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  47. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  48. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  49. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  50. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  51. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  52. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  53. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  54. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  55. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  56. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  57. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  58. data/vendor/libgit2/deps/pcre/CMakeLists.txt +3 -3
  59. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  60. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  61. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  62. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  63. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  64. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  65. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  66. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  67. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  68. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  69. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  70. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  71. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  72. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  73. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  74. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  75. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  76. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  77. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  78. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  79. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  80. data/vendor/libgit2/include/git2/apply.h +27 -6
  81. data/vendor/libgit2/include/git2/attr.h +17 -4
  82. data/vendor/libgit2/include/git2/blame.h +133 -28
  83. data/vendor/libgit2/include/git2/blob.h +71 -28
  84. data/vendor/libgit2/include/git2/branch.h +22 -15
  85. data/vendor/libgit2/include/git2/buffer.h +6 -4
  86. data/vendor/libgit2/include/git2/cert.h +2 -1
  87. data/vendor/libgit2/include/git2/checkout.h +83 -32
  88. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  89. data/vendor/libgit2/include/git2/clone.h +25 -9
  90. data/vendor/libgit2/include/git2/commit.h +132 -3
  91. data/vendor/libgit2/include/git2/common.h +120 -63
  92. data/vendor/libgit2/include/git2/config.h +93 -23
  93. data/vendor/libgit2/include/git2/credential.h +30 -2
  94. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  95. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  96. data/vendor/libgit2/include/git2/describe.h +13 -1
  97. data/vendor/libgit2/include/git2/diff.h +38 -8
  98. data/vendor/libgit2/include/git2/email.h +9 -29
  99. data/vendor/libgit2/include/git2/errors.h +46 -73
  100. data/vendor/libgit2/include/git2/filter.h +14 -7
  101. data/vendor/libgit2/include/git2/global.h +8 -1
  102. data/vendor/libgit2/include/git2/graph.h +3 -2
  103. data/vendor/libgit2/include/git2/ignore.h +10 -0
  104. data/vendor/libgit2/include/git2/index.h +100 -15
  105. data/vendor/libgit2/include/git2/indexer.h +21 -4
  106. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  107. data/vendor/libgit2/include/git2/merge.h +50 -3
  108. data/vendor/libgit2/include/git2/message.h +2 -2
  109. data/vendor/libgit2/include/git2/net.h +3 -1
  110. data/vendor/libgit2/include/git2/notes.h +9 -6
  111. data/vendor/libgit2/include/git2/object.h +9 -8
  112. data/vendor/libgit2/include/git2/odb.h +91 -49
  113. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  114. data/vendor/libgit2/include/git2/oid.h +23 -25
  115. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  116. data/vendor/libgit2/include/git2/pack.h +13 -1
  117. data/vendor/libgit2/include/git2/patch.h +2 -3
  118. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  119. data/vendor/libgit2/include/git2/proxy.h +12 -3
  120. data/vendor/libgit2/include/git2/rebase.h +9 -6
  121. data/vendor/libgit2/include/git2/refdb.h +2 -2
  122. data/vendor/libgit2/include/git2/reflog.h +3 -2
  123. data/vendor/libgit2/include/git2/refs.h +9 -6
  124. data/vendor/libgit2/include/git2/refspec.h +14 -4
  125. data/vendor/libgit2/include/git2/remote.h +113 -25
  126. data/vendor/libgit2/include/git2/repository.h +57 -21
  127. data/vendor/libgit2/include/git2/reset.h +16 -3
  128. data/vendor/libgit2/include/git2/revert.h +9 -4
  129. data/vendor/libgit2/include/git2/revparse.h +3 -3
  130. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  131. data/vendor/libgit2/include/git2/signature.h +46 -1
  132. data/vendor/libgit2/include/git2/stash.h +17 -3
  133. data/vendor/libgit2/include/git2/status.h +10 -6
  134. data/vendor/libgit2/include/git2/stdint.h +87 -85
  135. data/vendor/libgit2/include/git2/strarray.h +2 -3
  136. data/vendor/libgit2/include/git2/submodule.h +20 -9
  137. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  138. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  139. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  140. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  141. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  142. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  143. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  144. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  145. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  146. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  147. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  148. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  149. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  150. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  151. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  152. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  153. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  154. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  155. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  156. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  157. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  158. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  159. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  160. data/vendor/libgit2/include/git2/tag.h +3 -1
  161. data/vendor/libgit2/include/git2/trace.h +9 -3
  162. data/vendor/libgit2/include/git2/transaction.h +3 -2
  163. data/vendor/libgit2/include/git2/transport.h +11 -3
  164. data/vendor/libgit2/include/git2/tree.h +16 -5
  165. data/vendor/libgit2/include/git2/types.h +19 -3
  166. data/vendor/libgit2/include/git2/version.h +46 -8
  167. data/vendor/libgit2/include/git2/worktree.h +16 -6
  168. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  169. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  170. data/vendor/libgit2/src/cli/cmd.c +1 -1
  171. data/vendor/libgit2/src/cli/cmd.h +4 -0
  172. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  173. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  174. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  175. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  176. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  177. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  178. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  179. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  180. data/vendor/libgit2/src/cli/common.c +168 -0
  181. data/vendor/libgit2/src/cli/common.h +63 -0
  182. data/vendor/libgit2/src/cli/error.h +1 -1
  183. data/vendor/libgit2/src/cli/main.c +52 -24
  184. data/vendor/libgit2/src/cli/opt.c +31 -5
  185. data/vendor/libgit2/src/cli/opt.h +21 -3
  186. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  187. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  188. data/vendor/libgit2/src/cli/progress.c +51 -2
  189. data/vendor/libgit2/src/cli/progress.h +12 -0
  190. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  191. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  192. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  193. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  194. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  195. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  196. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  197. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  198. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  199. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  200. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  201. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  202. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  203. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  204. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  205. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  206. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  207. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  208. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  209. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  210. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  211. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  212. data/vendor/libgit2/src/libgit2/config.c +390 -299
  213. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  214. data/vendor/libgit2/src/libgit2/config.h +9 -4
  215. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  216. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  217. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  218. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  219. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  220. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  221. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  222. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  223. data/vendor/libgit2/src/libgit2/delta.c +5 -1
  224. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  225. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  226. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  227. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  228. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  229. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  230. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  231. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  232. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  233. data/vendor/libgit2/src/libgit2/email.c +1 -0
  234. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  235. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  236. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  237. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  238. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  239. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  240. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  241. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  242. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  243. data/vendor/libgit2/src/libgit2/index.c +76 -98
  244. data/vendor/libgit2/src/libgit2/index.h +5 -2
  245. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  246. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  247. data/vendor/libgit2/src/libgit2/indexer.c +36 -40
  248. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  249. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  252. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  253. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  254. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  255. data/vendor/libgit2/src/libgit2/message.c +1 -1
  256. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  257. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  258. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  259. data/vendor/libgit2/src/libgit2/object.c +6 -5
  260. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  261. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  264. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  267. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  268. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  269. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  270. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/path.c +1 -1
  272. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  273. data/vendor/libgit2/src/libgit2/push.c +79 -28
  274. data/vendor/libgit2/src/libgit2/push.h +1 -0
  275. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  276. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  277. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  278. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  279. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  280. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  281. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  282. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  283. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  284. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  285. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  286. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  287. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  288. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  289. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  290. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  291. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  292. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  293. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  294. data/vendor/libgit2/src/libgit2/status.c +1 -1
  295. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  296. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  297. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  298. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  299. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  300. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  301. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  302. data/vendor/libgit2/src/libgit2/submodule.c +118 -68
  303. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  304. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  305. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  306. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  307. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  308. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  309. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  310. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  311. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  312. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  313. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  314. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  315. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  316. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  317. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  318. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  319. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  320. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +5 -5
  321. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  322. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  323. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  324. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  325. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  326. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  327. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  328. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  329. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  330. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  331. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  332. data/vendor/libgit2/src/util/alloc.c +4 -1
  333. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  334. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  335. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  336. data/vendor/libgit2/src/util/array.h +18 -17
  337. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  338. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  339. data/vendor/libgit2/src/util/date.c +22 -14
  340. data/vendor/libgit2/src/util/date.h +12 -0
  341. data/vendor/libgit2/src/util/errors.c +401 -0
  342. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  343. data/vendor/libgit2/src/util/fs_path.c +81 -10
  344. data/vendor/libgit2/src/util/fs_path.h +29 -0
  345. data/vendor/libgit2/src/util/futils.c +6 -5
  346. data/vendor/libgit2/src/util/futils.h +24 -7
  347. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  348. data/vendor/libgit2/src/util/git2_util.h +6 -0
  349. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  350. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  351. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  352. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  353. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  354. data/vendor/libgit2/src/util/hashmap.h +425 -0
  355. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  356. data/vendor/libgit2/src/util/integer.h +3 -1
  357. data/vendor/libgit2/src/util/net.c +17 -11
  358. data/vendor/libgit2/src/util/net.h +2 -0
  359. data/vendor/libgit2/src/util/pool.c +1 -1
  360. data/vendor/libgit2/src/util/pool.h +5 -0
  361. data/vendor/libgit2/src/util/pqueue.h +1 -1
  362. data/vendor/libgit2/src/util/process.h +223 -0
  363. data/vendor/libgit2/src/util/rand.c +1 -7
  364. data/vendor/libgit2/src/util/regexp.c +1 -1
  365. data/vendor/libgit2/src/util/runtime.c +2 -2
  366. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  367. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  368. data/vendor/libgit2/src/util/str.c +20 -8
  369. data/vendor/libgit2/src/util/str.h +5 -3
  370. data/vendor/libgit2/src/util/strlist.c +108 -0
  371. data/vendor/libgit2/src/util/strlist.h +36 -0
  372. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  373. data/vendor/libgit2/src/util/unix/process.c +706 -0
  374. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  375. data/vendor/libgit2/src/util/util.c +18 -5
  376. data/vendor/libgit2/src/util/util.h +5 -38
  377. data/vendor/libgit2/src/util/vector.c +3 -3
  378. data/vendor/libgit2/src/util/vector.h +2 -2
  379. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  380. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  381. data/vendor/libgit2/src/util/win32/process.c +522 -0
  382. metadata +60 -32
  383. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  384. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  385. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  386. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  387. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  388. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  389. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  390. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  391. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  392. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  393. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  394. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  395. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  396. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  397. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  398. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  399. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  400. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  401. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  402. data/vendor/libgit2/src/util/khash.h +0 -615
  403. data/vendor/libgit2/src/util/strmap.c +0 -100
  404. data/vendor/libgit2/src/util/strmap.h +0 -131
  405. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -8,7 +8,6 @@
8
8
  #include "transaction.h"
9
9
 
10
10
  #include "repository.h"
11
- #include "strmap.h"
12
11
  #include "refdb.h"
13
12
  #include "pool.h"
14
13
  #include "reflog.h"
@@ -44,17 +43,23 @@ typedef struct {
44
43
  remove :1;
45
44
  } transaction_node;
46
45
 
46
+ GIT_HASHMAP_STR_SETUP(git_transaction_nodemap, transaction_node *);
47
+
47
48
  struct git_transaction {
48
49
  transaction_t type;
49
50
  git_repository *repo;
50
51
  git_refdb *db;
51
52
  git_config *cfg;
53
+ void *cfg_data;
52
54
 
53
- git_strmap *locks;
55
+ git_transaction_nodemap locks;
54
56
  git_pool pool;
55
57
  };
56
58
 
57
- int git_transaction_config_new(git_transaction **out, git_config *cfg)
59
+ int git_transaction_config_new(
60
+ git_transaction **out,
61
+ git_config *cfg,
62
+ void *data)
58
63
  {
59
64
  git_transaction *tx;
60
65
 
@@ -66,6 +71,8 @@ int git_transaction_config_new(git_transaction **out, git_config *cfg)
66
71
 
67
72
  tx->type = TRANSACTION_CONFIG;
68
73
  tx->cfg = cfg;
74
+ tx->cfg_data = data;
75
+
69
76
  *out = tx;
70
77
  return 0;
71
78
  }
@@ -88,11 +95,6 @@ int git_transaction_new(git_transaction **out, git_repository *repo)
88
95
  goto on_error;
89
96
  }
90
97
 
91
- if ((error = git_strmap_new(&tx->locks)) < 0) {
92
- error = -1;
93
- goto on_error;
94
- }
95
-
96
98
  if ((error = git_repository_refdb(&tx->db, repo)) < 0)
97
99
  goto on_error;
98
100
 
@@ -124,7 +126,7 @@ int git_transaction_lock_ref(git_transaction *tx, const char *refname)
124
126
  if ((error = git_refdb_lock(&node->payload, tx->db, refname)) < 0)
125
127
  return error;
126
128
 
127
- if ((error = git_strmap_set(tx->locks, node->name, node)) < 0)
129
+ if ((error = git_transaction_nodemap_put(&tx->locks, node->name, node)) < 0)
128
130
  goto cleanup;
129
131
 
130
132
  return 0;
@@ -138,8 +140,11 @@ cleanup:
138
140
  static int find_locked(transaction_node **out, git_transaction *tx, const char *refname)
139
141
  {
140
142
  transaction_node *node;
143
+ int error;
144
+
145
+ error = git_transaction_nodemap_get(&node, &tx->locks, refname);
141
146
 
142
- if ((node = git_strmap_get(tx->locks, refname)) == NULL) {
147
+ if (error != 0) {
143
148
  git_error_set(GIT_ERROR_REFERENCE, "the specified reference is not locked");
144
149
  return GIT_ENOTFOUND;
145
150
  }
@@ -328,18 +333,20 @@ static int update_target(git_refdb *db, transaction_node *node)
328
333
  int git_transaction_commit(git_transaction *tx)
329
334
  {
330
335
  transaction_node *node;
336
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
331
337
  int error = 0;
332
338
 
333
339
  GIT_ASSERT_ARG(tx);
334
340
 
335
341
  if (tx->type == TRANSACTION_CONFIG) {
336
- error = git_config_unlock(tx->cfg, true);
342
+ error = git_config_unlock(tx->cfg, tx->cfg_data, true);
337
343
  tx->cfg = NULL;
344
+ tx->cfg_data = NULL;
338
345
 
339
346
  return error;
340
347
  }
341
348
 
342
- git_strmap_foreach_value(tx->locks, node, {
349
+ while (git_transaction_nodemap_iterate(&iter, NULL, &node, &tx->locks) == 0) {
343
350
  if (node->reflog) {
344
351
  if ((error = tx->db->backend->reflog_write(tx->db->backend, node->reflog)) < 0)
345
352
  return error;
@@ -355,7 +362,7 @@ int git_transaction_commit(git_transaction *tx)
355
362
  if ((error = update_target(tx->db, node)) < 0)
356
363
  return error;
357
364
  }
358
- });
365
+ }
359
366
 
360
367
  return 0;
361
368
  }
@@ -364,30 +371,29 @@ void git_transaction_free(git_transaction *tx)
364
371
  {
365
372
  transaction_node *node;
366
373
  git_pool pool;
374
+ git_hashmap_iter_t iter = GIT_HASHMAP_ITER_INIT;
367
375
 
368
376
  if (!tx)
369
377
  return;
370
378
 
371
379
  if (tx->type == TRANSACTION_CONFIG) {
372
- if (tx->cfg) {
373
- git_config_unlock(tx->cfg, false);
374
- git_config_free(tx->cfg);
375
- }
380
+ if (tx->cfg)
381
+ git_config_unlock(tx->cfg, tx->cfg_data, false);
376
382
 
377
383
  git__free(tx);
378
384
  return;
379
385
  }
380
386
 
381
387
  /* start by unlocking the ones we've left hanging, if any */
382
- git_strmap_foreach_value(tx->locks, node, {
388
+ while (git_transaction_nodemap_iterate(&iter, NULL, &node, &tx->locks) == 0) {
383
389
  if (node->committed)
384
390
  continue;
385
391
 
386
392
  git_refdb_unlock(tx->db, node->payload, false, false, NULL, NULL, NULL);
387
- });
393
+ }
388
394
 
389
395
  git_refdb_free(tx->db);
390
- git_strmap_free(tx->locks);
396
+ git_transaction_nodemap_dispose(&tx->locks);
391
397
 
392
398
  /* tx is inside the pool, so we need to extract the data */
393
399
  memcpy(&pool, &tx->pool, sizeof(git_pool));
@@ -9,6 +9,9 @@
9
9
 
10
10
  #include "common.h"
11
11
 
12
- int git_transaction_config_new(git_transaction **out, git_config *cfg);
12
+ int git_transaction_config_new(
13
+ git_transaction **out,
14
+ git_config *cfg,
15
+ void *data);
13
16
 
14
17
  #endif
@@ -22,6 +22,7 @@ typedef struct transport_definition {
22
22
 
23
23
  static git_smart_subtransport_definition http_subtransport_definition = { git_smart_subtransport_http, 1, NULL };
24
24
  static git_smart_subtransport_definition git_subtransport_definition = { git_smart_subtransport_git, 0, NULL };
25
+
25
26
  #ifdef GIT_SSH
26
27
  static git_smart_subtransport_definition ssh_subtransport_definition = { git_smart_subtransport_ssh, 0, NULL };
27
28
  #endif
@@ -33,11 +34,13 @@ static transport_definition transports[] = {
33
34
  { "http://", git_transport_smart, &http_subtransport_definition },
34
35
  { "https://", git_transport_smart, &http_subtransport_definition },
35
36
  { "file://", git_transport_local, NULL },
37
+
36
38
  #ifdef GIT_SSH
37
39
  { "ssh://", git_transport_smart, &ssh_subtransport_definition },
38
40
  { "ssh+git://", git_transport_smart, &ssh_subtransport_definition },
39
41
  { "git+ssh://", git_transport_smart, &ssh_subtransport_definition },
40
42
  #endif
43
+
41
44
  { NULL, 0, 0 }
42
45
  };
43
46
 
@@ -200,7 +203,7 @@ int git_transport_unregister(const char *scheme)
200
203
  git__free(d);
201
204
 
202
205
  if (!custom_transports.length)
203
- git_vector_free(&custom_transports);
206
+ git_vector_dispose(&custom_transports);
204
207
 
205
208
  error = 0;
206
209
  goto done;
@@ -324,12 +324,14 @@ static int sspi_init_context(
324
324
  return 0;
325
325
  }
326
326
 
327
+ #if defined(GIT_GSSAPI) || defined(GIT_GSSFRAMEWORK) || defined(GIT_WIN32)
327
328
  int git_http_auth_negotiate(
328
329
  git_http_auth_context **out,
329
330
  const git_net_url *url)
330
331
  {
331
332
  return sspi_init_context(out, GIT_HTTP_AUTH_NEGOTIATE, url);
332
333
  }
334
+ #endif
333
335
 
334
336
  int git_http_auth_ntlm(
335
337
  git_http_auth_context **out,
@@ -161,7 +161,7 @@ static void ssh_custom_free(struct git_credential *cred)
161
161
 
162
162
  if (c->publickey) {
163
163
  /* Zero the memory which previously held the publickey */
164
- size_t key_len = strlen(c->publickey);
164
+ size_t key_len = c->publickey_len;
165
165
  git__memzero(c->publickey, key_len);
166
166
  git__free(c->publickey);
167
167
  }
@@ -204,7 +204,7 @@ int git_credential_ssh_key_memory_new(
204
204
  const char *privatekey,
205
205
  const char *passphrase)
206
206
  {
207
- #ifdef GIT_SSH_MEMORY_CREDENTIALS
207
+ #ifdef GIT_SSH_LIBSSH2_MEMORY_CREDENTIALS
208
208
  return git_credential_ssh_key_type_new(
209
209
  cred,
210
210
  username,
@@ -39,7 +39,7 @@ typedef struct {
39
39
  */
40
40
  static int gen_proto(git_str *request, const char *cmd, const char *url)
41
41
  {
42
- char *delim, *repo;
42
+ const char *delim, *repo;
43
43
  char host[] = "host=";
44
44
  size_t len;
45
45
 
@@ -9,7 +9,6 @@
9
9
 
10
10
  #ifndef GIT_WINHTTP
11
11
 
12
- #include "http_parser.h"
13
12
  #include "net.h"
14
13
  #include "remote.h"
15
14
  #include "smart.h"
@@ -334,7 +333,7 @@ static int lookup_proxy(
334
333
  return 0;
335
334
  }
336
335
 
337
- if (!proxy ||
336
+ if (!proxy || !*proxy ||
338
337
  (error = git_net_url_parse_http(&transport->proxy.url, proxy)) < 0)
339
338
  goto done;
340
339
 
@@ -15,14 +15,4 @@
15
15
 
16
16
  extern bool git_http__expect_continue;
17
17
 
18
- GIT_INLINE(int) git_http__user_agent(git_str *buf)
19
- {
20
- const char *ua = git_libgit2__user_agent();
21
-
22
- if (!ua)
23
- ua = "libgit2 " LIBGIT2_VERSION;
24
-
25
- return git_str_printf(buf, "git/2.0 (%s)", ua);
26
- }
27
-
28
18
  #endif
@@ -7,7 +7,7 @@
7
7
 
8
8
  #include "common.h"
9
9
  #include "git2.h"
10
- #include "http_parser.h"
10
+
11
11
  #include "vector.h"
12
12
  #include "trace.h"
13
13
  #include "httpclient.h"
@@ -21,6 +21,7 @@
21
21
  #include "streams/socket.h"
22
22
  #include "streams/tls.h"
23
23
  #include "auth.h"
24
+ #include "httpparser.h"
24
25
 
25
26
  static git_http_auth_scheme auth_schemes[] = {
26
27
  { GIT_HTTP_AUTH_NEGOTIATE, "Negotiate", GIT_CREDENTIAL_DEFAULT, git_http_auth_negotiate },
@@ -108,7 +109,7 @@ struct git_http_client {
108
109
  git_http_server_t current_server;
109
110
  http_client_state state;
110
111
 
111
- http_parser parser;
112
+ git_http_parser parser;
112
113
 
113
114
  git_http_server server;
114
115
  git_http_server proxy;
@@ -154,7 +155,7 @@ void git_http_response_dispose(git_http_response *response)
154
155
  memset(response, 0, sizeof(git_http_response));
155
156
  }
156
157
 
157
- static int on_header_complete(http_parser *parser)
158
+ static int on_header_complete(git_http_parser *parser)
158
159
  {
159
160
  http_parser_context *ctx = (http_parser_context *) parser->data;
160
161
  git_http_client *client = ctx->client;
@@ -219,7 +220,7 @@ static int on_header_complete(http_parser *parser)
219
220
  return 0;
220
221
  }
221
222
 
222
- static int on_header_field(http_parser *parser, const char *str, size_t len)
223
+ static int on_header_field(git_http_parser *parser, const char *str, size_t len)
223
224
  {
224
225
  http_parser_context *ctx = (http_parser_context *) parser->data;
225
226
 
@@ -254,7 +255,7 @@ static int on_header_field(http_parser *parser, const char *str, size_t len)
254
255
  return 0;
255
256
  }
256
257
 
257
- static int on_header_value(http_parser *parser, const char *str, size_t len)
258
+ static int on_header_value(git_http_parser *parser, const char *str, size_t len)
258
259
  {
259
260
  http_parser_context *ctx = (http_parser_context *) parser->data;
260
261
 
@@ -342,7 +343,7 @@ static int resend_needed(git_http_client *client, git_http_response *response)
342
343
  return 0;
343
344
  }
344
345
 
345
- static int on_headers_complete(http_parser *parser)
346
+ static int on_headers_complete(git_http_parser *parser)
346
347
  {
347
348
  http_parser_context *ctx = (http_parser_context *) parser->data;
348
349
 
@@ -364,8 +365,8 @@ static int on_headers_complete(http_parser *parser)
364
365
  return ctx->parse_status = PARSE_STATUS_ERROR;
365
366
  }
366
367
 
367
- ctx->response->status = parser->status_code;
368
- ctx->client->keepalive = http_should_keep_alive(parser);
368
+ ctx->response->status = git_http_parser_status_code(parser);
369
+ ctx->client->keepalive = git_http_parser_keep_alive(parser);
369
370
 
370
371
  /* Prepare for authentication */
371
372
  collect_authinfo(&ctx->response->server_auth_schemetypes,
@@ -378,18 +379,15 @@ static int on_headers_complete(http_parser *parser)
378
379
  ctx->response->resend_credentials = resend_needed(ctx->client,
379
380
  ctx->response);
380
381
 
381
- /* Stop parsing. */
382
- http_parser_pause(parser, 1);
383
-
384
- if (ctx->response->content_type || ctx->response->chunked)
382
+ if (ctx->response->content_length || ctx->response->chunked)
385
383
  ctx->client->state = READING_BODY;
386
384
  else
387
385
  ctx->client->state = DONE;
388
386
 
389
- return 0;
387
+ return git_http_parser_pause(parser);
390
388
  }
391
389
 
392
- static int on_body(http_parser *parser, const char *buf, size_t len)
390
+ static int on_body(git_http_parser *parser, const char *buf, size_t len)
393
391
  {
394
392
  http_parser_context *ctx = (http_parser_context *) parser->data;
395
393
  size_t max_len;
@@ -411,7 +409,7 @@ static int on_body(http_parser *parser, const char *buf, size_t len)
411
409
  return 0;
412
410
  }
413
411
 
414
- static int on_message_complete(http_parser *parser)
412
+ static int on_message_complete(git_http_parser *parser)
415
413
  {
416
414
  http_parser_context *ctx = (http_parser_context *) parser->data;
417
415
 
@@ -555,7 +553,7 @@ static int apply_credentials(
555
553
  {
556
554
  git_http_auth_context *auth = server->auth_context;
557
555
  git_vector *challenges = &server->auth_challenges;
558
- const char *challenge;
556
+ const char *challenge = NULL;
559
557
  git_str token = GIT_STR_INIT;
560
558
  int error = 0;
561
559
 
@@ -651,6 +649,30 @@ static int puts_host_and_port(git_str *buf, git_net_url *url, bool force_port)
651
649
  return git_str_oom(buf) ? -1 : 0;
652
650
  }
653
651
 
652
+ static int append_user_agent(git_str *buf)
653
+ {
654
+ const char *product = git_settings__user_agent_product();
655
+ const char *comment = git_settings__user_agent();
656
+
657
+ GIT_ASSERT(product && comment);
658
+
659
+ if (!*product)
660
+ return 0;
661
+
662
+ git_str_puts(buf, "User-Agent: ");
663
+ git_str_puts(buf, product);
664
+
665
+ if (*comment) {
666
+ git_str_puts(buf, " (");
667
+ git_str_puts(buf, comment);
668
+ git_str_puts(buf, ")");
669
+ }
670
+
671
+ git_str_puts(buf, "\r\n");
672
+
673
+ return git_str_oom(buf) ? -1 : 0;
674
+ }
675
+
654
676
  static int generate_connect_request(
655
677
  git_http_client *client,
656
678
  git_http_request *request)
@@ -665,9 +687,7 @@ static int generate_connect_request(
665
687
  puts_host_and_port(buf, &client->server.url, true);
666
688
  git_str_puts(buf, " HTTP/1.1\r\n");
667
689
 
668
- git_str_puts(buf, "User-Agent: ");
669
- git_http__user_agent(buf);
670
- git_str_puts(buf, "\r\n");
690
+ append_user_agent(buf);
671
691
 
672
692
  git_str_puts(buf, "Host: ");
673
693
  puts_host_and_port(buf, &client->server.url, true);
@@ -711,9 +731,7 @@ static int generate_request(
711
731
 
712
732
  git_str_puts(buf, " HTTP/1.1\r\n");
713
733
 
714
- git_str_puts(buf, "User-Agent: ");
715
- git_http__user_agent(buf);
716
- git_str_puts(buf, "\r\n");
734
+ append_user_agent(buf);
717
735
 
718
736
  git_str_puts(buf, "Host: ");
719
737
  puts_host_and_port(buf, request->url, false);
@@ -768,25 +786,37 @@ static int check_certificate(
768
786
  void *cert_cb_payload)
769
787
  {
770
788
  git_cert *cert;
771
- git_error_state last_error = {0};
789
+ git_error *last_error;
772
790
  int error;
773
791
 
774
792
  if ((error = git_stream_certificate(&cert, stream)) < 0)
775
793
  return error;
776
794
 
777
- git_error_state_capture(&last_error, GIT_ECERTIFICATE);
795
+ /*
796
+ * Allow callers to set an error - but save ours and clear
797
+ * it, so that we can detect if they set one and restore it
798
+ * if we need to.
799
+ */
800
+ git_error_save(&last_error);
801
+ git_error_clear();
778
802
 
779
803
  error = cert_cb(cert, is_valid, url->host, cert_cb_payload);
780
804
 
781
- if (error == GIT_PASSTHROUGH && !is_valid)
782
- return git_error_state_restore(&last_error);
783
- else if (error == GIT_PASSTHROUGH)
784
- error = 0;
785
- else if (error && !git_error_last())
786
- git_error_set(GIT_ERROR_HTTP,
787
- "user rejected certificate for %s", url->host);
805
+ if (error == GIT_PASSTHROUGH) {
806
+ error = is_valid ? 0 : -1;
788
807
 
789
- git_error_state_free(&last_error);
808
+ if (error) {
809
+ git_error_restore(last_error);
810
+ last_error = NULL;
811
+ }
812
+ } else if (error) {
813
+ if (!git_error_exists())
814
+ git_error_set(GIT_ERROR_HTTP,
815
+ "user rejected certificate for %s",
816
+ url->host);
817
+ }
818
+
819
+ git_error_free(last_error);
790
820
  return error;
791
821
  }
792
822
 
@@ -864,9 +894,29 @@ GIT_INLINE(int) server_setup_from_url(
864
894
  return 0;
865
895
  }
866
896
 
897
+ static bool parser_settings_initialized;
898
+ static git_http_parser_settings parser_settings;
899
+
900
+ GIT_INLINE(git_http_parser_settings *) http_client_parser_settings(void)
901
+ {
902
+ if (!parser_settings_initialized) {
903
+ parser_settings.on_header_field = on_header_field;
904
+ parser_settings.on_header_value = on_header_value;
905
+ parser_settings.on_headers_complete = on_headers_complete;
906
+ parser_settings.on_body = on_body;
907
+ parser_settings.on_message_complete = on_message_complete;
908
+
909
+ parser_settings_initialized = true;
910
+ }
911
+
912
+ return &parser_settings;
913
+ }
914
+
867
915
  static void reset_parser(git_http_client *client)
868
916
  {
869
- http_parser_init(&client->parser, HTTP_RESPONSE);
917
+ git_http_parser_init(&client->parser,
918
+ GIT_HTTP_PARSER_RESPONSE,
919
+ http_client_parser_settings());
870
920
  }
871
921
 
872
922
  static int setup_hosts(
@@ -1109,27 +1159,9 @@ GIT_INLINE(int) client_read(git_http_client *client)
1109
1159
  return (int)read_len;
1110
1160
  }
1111
1161
 
1112
- static bool parser_settings_initialized;
1113
- static http_parser_settings parser_settings;
1114
-
1115
- GIT_INLINE(http_parser_settings *) http_client_parser_settings(void)
1116
- {
1117
- if (!parser_settings_initialized) {
1118
- parser_settings.on_header_field = on_header_field;
1119
- parser_settings.on_header_value = on_header_value;
1120
- parser_settings.on_headers_complete = on_headers_complete;
1121
- parser_settings.on_body = on_body;
1122
- parser_settings.on_message_complete = on_message_complete;
1123
-
1124
- parser_settings_initialized = true;
1125
- }
1126
-
1127
- return &parser_settings;
1128
- }
1129
-
1130
1162
  GIT_INLINE(int) client_read_and_parse(git_http_client *client)
1131
1163
  {
1132
- http_parser *parser = &client->parser;
1164
+ git_http_parser *parser = &client->parser;
1133
1165
  http_parser_context *ctx = (http_parser_context *) parser->data;
1134
1166
  unsigned char http_errno;
1135
1167
  int read_len;
@@ -1143,11 +1175,10 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
1143
1175
  if (!client->read_buf.size && (read_len = client_read(client)) < 0)
1144
1176
  return read_len;
1145
1177
 
1146
- parsed_len = http_parser_execute(parser,
1147
- http_client_parser_settings(),
1178
+ parsed_len = git_http_parser_execute(parser,
1148
1179
  client->read_buf.ptr,
1149
1180
  client->read_buf.size);
1150
- http_errno = client->parser.http_errno;
1181
+ http_errno = git_http_parser_errno(parser);
1151
1182
 
1152
1183
  if (parsed_len > INT_MAX) {
1153
1184
  git_error_set(GIT_ERROR_HTTP, "unexpectedly large parse");
@@ -1166,26 +1197,29 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
1166
1197
  * (This can happen in response to an expect/continue request,
1167
1198
  * where the server gives you a 100 and 200 simultaneously.)
1168
1199
  */
1169
- if (http_errno == HPE_PAUSED) {
1200
+ if (http_errno == GIT_HTTP_PARSER_PAUSED) {
1201
+ size_t additional_size;
1202
+
1203
+ git_http_parser_resume(parser);
1204
+
1170
1205
  /*
1171
- * http-parser has a "feature" where it will not deliver the
1172
- * final byte when paused in a callback. Consume that byte.
1173
- * https://github.com/nodejs/http-parser/issues/97
1206
+ * http-parser has a "feature" where it will not deliver
1207
+ * the final byte when paused in a callback. Consume
1208
+ * that byte.
1174
1209
  */
1175
- GIT_ASSERT(client->read_buf.size > parsed_len);
1210
+ if ((additional_size = git_http_parser_remain_after_pause(parser)) > 0) {
1211
+ GIT_ASSERT((client->read_buf.size - parsed_len) >= additional_size);
1176
1212
 
1177
- http_parser_pause(parser, 0);
1178
-
1179
- parsed_len += http_parser_execute(parser,
1180
- http_client_parser_settings(),
1181
- client->read_buf.ptr + parsed_len,
1182
- 1);
1213
+ parsed_len += git_http_parser_execute(parser,
1214
+ client->read_buf.ptr + parsed_len,
1215
+ additional_size);
1216
+ }
1183
1217
  }
1184
1218
 
1185
1219
  /* Most failures will be reported in http_errno */
1186
- else if (parser->http_errno != HPE_OK) {
1220
+ else if (git_http_parser_errno(parser) != GIT_HTTP_PARSER_OK) {
1187
1221
  git_error_set(GIT_ERROR_HTTP, "http parser error: %s",
1188
- http_errno_description(http_errno));
1222
+ git_http_parser_errmsg(parser, http_errno));
1189
1223
  return -1;
1190
1224
  }
1191
1225
 
@@ -1193,7 +1227,7 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
1193
1227
  else if (parsed_len != client->read_buf.size) {
1194
1228
  git_error_set(GIT_ERROR_HTTP,
1195
1229
  "http parser did not consume entire buffer: %s",
1196
- http_errno_description(http_errno));
1230
+ git_http_parser_errmsg(parser, http_errno));
1197
1231
  return -1;
1198
1232
  }
1199
1233
 
@@ -1209,13 +1243,16 @@ GIT_INLINE(int) client_read_and_parse(git_http_client *client)
1209
1243
  }
1210
1244
 
1211
1245
  /*
1212
- * See if we've consumed the entire response body. If the client was
1213
- * reading the body but did not consume it entirely, it's possible that
1214
- * they knew that the stream had finished (in a git response, seeing a
1215
- * final flush) and stopped reading. But if the response was chunked,
1216
- * we may have not consumed the final chunk marker. Consume it to
1217
- * ensure that we don't have it waiting in our socket. If there's
1218
- * more than just a chunk marker, close the connection.
1246
+ * Try to consume any remaining response body. The client may have
1247
+ * decided that it did not need to consume the entire response body.
1248
+ * For example, the client saw a redirect in the header and ignored
1249
+ * the body. Or the client saw a particular sequence (like a final
1250
+ * flush in a git response) and stopped reading (but there were
1251
+ * additional response bytes, perhaps because the response was chunked).
1252
+ * Do one more read to try to clear this out; this takes care of small
1253
+ * remainders, like a chunk response or a small redirect message. If
1254
+ * there is too much data, we'll just leave it and close the
1255
+ * connection.
1219
1256
  */
1220
1257
  static void complete_response_body(git_http_client *client)
1221
1258
  {
@@ -1232,7 +1269,7 @@ static void complete_response_body(git_http_client *client)
1232
1269
 
1233
1270
  /* If there was an error, just close the connection. */
1234
1271
  if (client_read_and_parse(client) < 0 ||
1235
- parser_context.error != HPE_OK ||
1272
+ parser_context.error != GIT_HTTP_PARSER_OK ||
1236
1273
  (parser_context.parse_status != PARSE_STATUS_OK &&
1237
1274
  parser_context.parse_status != PARSE_STATUS_NO_OUTPUT)) {
1238
1275
  git_error_clear();
@@ -1240,6 +1277,7 @@ static void complete_response_body(git_http_client *client)
1240
1277
  }
1241
1278
 
1242
1279
  done:
1280
+ client->parser.data = NULL;
1243
1281
  git_str_clear(&client->read_buf);
1244
1282
  }
1245
1283
 
@@ -1407,9 +1445,9 @@ int git_http_client_read_response(
1407
1445
  git_http_response_dispose(response);
1408
1446
 
1409
1447
  if (client->current_server == PROXY) {
1410
- git_vector_free_deep(&client->proxy.auth_challenges);
1448
+ git_vector_dispose_deep(&client->proxy.auth_challenges);
1411
1449
  } else if(client->current_server == SERVER) {
1412
- git_vector_free_deep(&client->server.auth_challenges);
1450
+ git_vector_dispose_deep(&client->server.auth_challenges);
1413
1451
  }
1414
1452
 
1415
1453
  client->state = READING_RESPONSE;
@@ -1429,6 +1467,7 @@ int git_http_client_read_response(
1429
1467
  done:
1430
1468
  git_str_dispose(&parser_context.parse_header_name);
1431
1469
  git_str_dispose(&parser_context.parse_header_value);
1470
+ client->parser.data = NULL;
1432
1471
 
1433
1472
  return error;
1434
1473
  }
@@ -1484,6 +1523,8 @@ done:
1484
1523
  if (error < 0)
1485
1524
  client->connected = 0;
1486
1525
 
1526
+ client->parser.data = NULL;
1527
+
1487
1528
  return error;
1488
1529
  }
1489
1530
 
@@ -1506,7 +1547,7 @@ int git_http_client_skip_body(git_http_client *client)
1506
1547
  do {
1507
1548
  error = client_read_and_parse(client);
1508
1549
 
1509
- if (parser_context.error != HPE_OK ||
1550
+ if (parser_context.error != GIT_HTTP_PARSER_OK ||
1510
1551
  (parser_context.parse_status != PARSE_STATUS_OK &&
1511
1552
  parser_context.parse_status != PARSE_STATUS_NO_OUTPUT)) {
1512
1553
  git_error_set(GIT_ERROR_HTTP,
@@ -1518,6 +1559,8 @@ int git_http_client_skip_body(git_http_client *client)
1518
1559
  if (error < 0)
1519
1560
  client->connected = 0;
1520
1561
 
1562
+ client->parser.data = NULL;
1563
+
1521
1564
  return error;
1522
1565
  }
1523
1566
 
@@ -1565,7 +1608,7 @@ GIT_INLINE(void) http_server_close(git_http_server *server)
1565
1608
 
1566
1609
  git_net_url_dispose(&server->url);
1567
1610
 
1568
- git_vector_free_deep(&server->auth_challenges);
1611
+ git_vector_dispose_deep(&server->auth_challenges);
1569
1612
  free_auth_context(server);
1570
1613
  }
1571
1614