rugged 1.7.2 → 1.9.6

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 (477) 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 +278 -12
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +8 -3
  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 +14 -4
  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/pcre2/CMakeLists.txt +110 -0
  59. data/vendor/libgit2/deps/pcre2/LICENCE.md +104 -0
  60. data/vendor/libgit2/deps/pcre2/config.h.in +54 -0
  61. data/vendor/libgit2/deps/pcre2/pcre2.h +1079 -0
  62. data/vendor/libgit2/deps/pcre2/pcre2_auto_possess.c +1416 -0
  63. data/vendor/libgit2/deps/{pcre/pcre_chartables.c → pcre2/pcre2_chartables.c} +41 -47
  64. data/vendor/libgit2/deps/{pcre/pcre_ord2utf8.c → pcre2/pcre2_chkdint.c} +36 -36
  65. data/vendor/libgit2/deps/pcre2/pcre2_compile.c +11345 -0
  66. data/vendor/libgit2/deps/pcre2/pcre2_compile.h +356 -0
  67. data/vendor/libgit2/deps/pcre2/pcre2_compile_cgroup.c +632 -0
  68. data/vendor/libgit2/deps/pcre2/pcre2_compile_class.c +2777 -0
  69. data/vendor/libgit2/deps/pcre2/pcre2_config.c +250 -0
  70. data/vendor/libgit2/deps/pcre2/pcre2_context.c +557 -0
  71. data/vendor/libgit2/deps/pcre2/pcre2_convert.c +1263 -0
  72. data/vendor/libgit2/deps/{pcre/pcre_dfa_exec.c → pcre2/pcre2_dfa_match.c} +1402 -943
  73. data/vendor/libgit2/deps/pcre2/pcre2_error.c +384 -0
  74. data/vendor/libgit2/deps/pcre2/pcre2_extuni.c +159 -0
  75. data/vendor/libgit2/deps/pcre2/pcre2_find_bracket.c +217 -0
  76. data/vendor/libgit2/deps/pcre2/pcre2_fuzzsupport.c +844 -0
  77. data/vendor/libgit2/deps/pcre2/pcre2_internal.h +2353 -0
  78. data/vendor/libgit2/deps/pcre2/pcre2_intmodedep.h +1044 -0
  79. data/vendor/libgit2/deps/pcre2/pcre2_maketables.c +177 -0
  80. data/vendor/libgit2/deps/pcre2/pcre2_match.c +8244 -0
  81. data/vendor/libgit2/deps/pcre2/pcre2_match_data.c +184 -0
  82. data/vendor/libgit2/deps/pcre2/pcre2_match_next.c +171 -0
  83. data/vendor/libgit2/deps/{pcre/pcre_newline.c → pcre2/pcre2_newline.c} +92 -63
  84. data/vendor/libgit2/deps/{pcre/pcre_refcount.c → pcre2/pcre2_ord2utf.c} +64 -38
  85. data/vendor/libgit2/deps/pcre2/pcre2_pattern_info.c +430 -0
  86. data/vendor/libgit2/deps/pcre2/pcre2_printint_inc.h +1098 -0
  87. data/vendor/libgit2/deps/pcre2/pcre2_script_run.c +344 -0
  88. data/vendor/libgit2/deps/pcre2/pcre2_serialize.c +284 -0
  89. data/vendor/libgit2/deps/pcre2/pcre2_string_utils.c +199 -0
  90. data/vendor/libgit2/deps/pcre2/pcre2_study.c +2087 -0
  91. data/vendor/libgit2/deps/pcre2/pcre2_substitute.c +1761 -0
  92. data/vendor/libgit2/deps/pcre2/pcre2_substring.c +553 -0
  93. data/vendor/libgit2/deps/pcre2/pcre2_tables.c +310 -0
  94. data/vendor/libgit2/deps/pcre2/pcre2_ucd.c +5805 -0
  95. data/vendor/libgit2/deps/pcre2/pcre2_ucp.h +408 -0
  96. data/vendor/libgit2/deps/pcre2/pcre2_ucptables_inc.h +1596 -0
  97. data/vendor/libgit2/deps/pcre2/pcre2_util.h +179 -0
  98. data/vendor/libgit2/deps/pcre2/pcre2_valid_utf.c +397 -0
  99. data/vendor/libgit2/deps/pcre2/pcre2_xclass.c +547 -0
  100. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  101. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  102. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  103. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  104. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  105. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  106. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  107. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  108. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  109. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  110. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  111. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  112. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  113. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  114. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  115. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  116. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  117. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  118. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  119. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  120. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  121. data/vendor/libgit2/include/git2/apply.h +27 -6
  122. data/vendor/libgit2/include/git2/attr.h +17 -4
  123. data/vendor/libgit2/include/git2/blame.h +133 -28
  124. data/vendor/libgit2/include/git2/blob.h +71 -28
  125. data/vendor/libgit2/include/git2/branch.h +22 -15
  126. data/vendor/libgit2/include/git2/buffer.h +6 -4
  127. data/vendor/libgit2/include/git2/cert.h +2 -1
  128. data/vendor/libgit2/include/git2/checkout.h +83 -32
  129. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  130. data/vendor/libgit2/include/git2/clone.h +25 -9
  131. data/vendor/libgit2/include/git2/commit.h +132 -3
  132. data/vendor/libgit2/include/git2/common.h +132 -63
  133. data/vendor/libgit2/include/git2/config.h +93 -23
  134. data/vendor/libgit2/include/git2/credential.h +30 -2
  135. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  136. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  137. data/vendor/libgit2/include/git2/describe.h +13 -1
  138. data/vendor/libgit2/include/git2/diff.h +38 -8
  139. data/vendor/libgit2/include/git2/email.h +9 -29
  140. data/vendor/libgit2/include/git2/errors.h +46 -73
  141. data/vendor/libgit2/include/git2/filter.h +14 -7
  142. data/vendor/libgit2/include/git2/global.h +8 -1
  143. data/vendor/libgit2/include/git2/graph.h +3 -2
  144. data/vendor/libgit2/include/git2/ignore.h +10 -0
  145. data/vendor/libgit2/include/git2/index.h +100 -15
  146. data/vendor/libgit2/include/git2/indexer.h +21 -4
  147. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  148. data/vendor/libgit2/include/git2/merge.h +50 -3
  149. data/vendor/libgit2/include/git2/message.h +2 -2
  150. data/vendor/libgit2/include/git2/net.h +3 -1
  151. data/vendor/libgit2/include/git2/notes.h +9 -6
  152. data/vendor/libgit2/include/git2/object.h +9 -8
  153. data/vendor/libgit2/include/git2/odb.h +91 -49
  154. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  155. data/vendor/libgit2/include/git2/oid.h +23 -25
  156. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  157. data/vendor/libgit2/include/git2/pack.h +13 -1
  158. data/vendor/libgit2/include/git2/patch.h +2 -3
  159. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  160. data/vendor/libgit2/include/git2/proxy.h +12 -3
  161. data/vendor/libgit2/include/git2/rebase.h +9 -6
  162. data/vendor/libgit2/include/git2/refdb.h +2 -2
  163. data/vendor/libgit2/include/git2/reflog.h +3 -2
  164. data/vendor/libgit2/include/git2/refs.h +9 -6
  165. data/vendor/libgit2/include/git2/refspec.h +14 -4
  166. data/vendor/libgit2/include/git2/remote.h +113 -25
  167. data/vendor/libgit2/include/git2/repository.h +57 -21
  168. data/vendor/libgit2/include/git2/reset.h +16 -3
  169. data/vendor/libgit2/include/git2/revert.h +9 -4
  170. data/vendor/libgit2/include/git2/revparse.h +3 -3
  171. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  172. data/vendor/libgit2/include/git2/signature.h +46 -1
  173. data/vendor/libgit2/include/git2/stash.h +17 -3
  174. data/vendor/libgit2/include/git2/status.h +10 -6
  175. data/vendor/libgit2/include/git2/stdint.h +87 -85
  176. data/vendor/libgit2/include/git2/strarray.h +2 -3
  177. data/vendor/libgit2/include/git2/submodule.h +20 -9
  178. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  179. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  180. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  181. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  182. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  183. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  184. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  185. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  186. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  187. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  188. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  189. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  190. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  191. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  192. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  193. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  194. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  195. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  196. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  197. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  198. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  199. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  200. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  201. data/vendor/libgit2/include/git2/tag.h +3 -1
  202. data/vendor/libgit2/include/git2/trace.h +9 -3
  203. data/vendor/libgit2/include/git2/transaction.h +3 -2
  204. data/vendor/libgit2/include/git2/transport.h +11 -3
  205. data/vendor/libgit2/include/git2/tree.h +16 -5
  206. data/vendor/libgit2/include/git2/types.h +19 -3
  207. data/vendor/libgit2/include/git2/version.h +46 -8
  208. data/vendor/libgit2/include/git2/worktree.h +16 -6
  209. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  210. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  211. data/vendor/libgit2/src/cli/cmd.c +1 -1
  212. data/vendor/libgit2/src/cli/cmd.h +4 -0
  213. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  214. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  215. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  216. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  217. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  218. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  219. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  220. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  221. data/vendor/libgit2/src/cli/common.c +168 -0
  222. data/vendor/libgit2/src/cli/common.h +63 -0
  223. data/vendor/libgit2/src/cli/error.h +1 -1
  224. data/vendor/libgit2/src/cli/main.c +52 -24
  225. data/vendor/libgit2/src/cli/opt.c +31 -5
  226. data/vendor/libgit2/src/cli/opt.h +21 -3
  227. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  228. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  229. data/vendor/libgit2/src/cli/progress.c +51 -2
  230. data/vendor/libgit2/src/cli/progress.h +12 -0
  231. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  232. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  233. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  234. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  235. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  236. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  237. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  238. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  239. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  240. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  241. data/vendor/libgit2/src/libgit2/blame.c +135 -43
  242. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  243. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  244. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  245. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  246. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  247. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  248. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  249. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  250. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  251. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  252. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  253. data/vendor/libgit2/src/libgit2/config.c +390 -299
  254. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  255. data/vendor/libgit2/src/libgit2/config.h +9 -4
  256. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  257. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  258. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  259. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  260. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  261. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  262. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  263. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  264. data/vendor/libgit2/src/libgit2/delta.c +13 -1
  265. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  266. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  267. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  268. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  269. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  270. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  272. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  273. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  274. data/vendor/libgit2/src/libgit2/email.c +1 -0
  275. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  276. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  277. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  278. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  279. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  280. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  281. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  282. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  283. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  284. data/vendor/libgit2/src/libgit2/index.c +76 -98
  285. data/vendor/libgit2/src/libgit2/index.h +5 -2
  286. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  287. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  288. data/vendor/libgit2/src/libgit2/indexer.c +38 -41
  289. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  290. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  291. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  292. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  293. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  294. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  295. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  296. data/vendor/libgit2/src/libgit2/message.c +1 -1
  297. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  298. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  299. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  300. data/vendor/libgit2/src/libgit2/object.c +6 -5
  301. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  302. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  303. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  304. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  305. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  306. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  307. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  308. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  309. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  310. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  311. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  312. data/vendor/libgit2/src/libgit2/path.c +1 -1
  313. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  314. data/vendor/libgit2/src/libgit2/push.c +79 -28
  315. data/vendor/libgit2/src/libgit2/push.h +1 -0
  316. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  317. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  318. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  319. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  320. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  321. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  322. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  323. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  324. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  325. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  326. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  327. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  328. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  329. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  330. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  331. data/vendor/libgit2/src/libgit2/settings.c +477 -0
  332. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  333. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  334. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  335. data/vendor/libgit2/src/libgit2/status.c +1 -1
  336. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  337. data/vendor/libgit2/src/libgit2/streams/openssl.c +36 -8
  338. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  339. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  340. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  341. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  342. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  343. data/vendor/libgit2/src/libgit2/submodule.c +195 -80
  344. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  345. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  346. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  347. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  348. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  349. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  350. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  351. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  352. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  353. data/vendor/libgit2/src/libgit2/transports/http.c +5 -6
  354. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  355. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  356. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  357. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  358. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  359. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  360. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  361. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +7 -6
  362. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  363. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  364. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  365. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  366. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1132 -0
  367. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  368. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  369. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  370. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  371. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  372. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  373. data/vendor/libgit2/src/util/alloc.c +4 -1
  374. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  375. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  376. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  377. data/vendor/libgit2/src/util/array.h +18 -17
  378. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  379. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  380. data/vendor/libgit2/src/util/date.c +22 -14
  381. data/vendor/libgit2/src/util/date.h +12 -0
  382. data/vendor/libgit2/src/util/errors.c +401 -0
  383. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  384. data/vendor/libgit2/src/util/fs_path.c +81 -10
  385. data/vendor/libgit2/src/util/fs_path.h +39 -10
  386. data/vendor/libgit2/src/util/futils.c +6 -5
  387. data/vendor/libgit2/src/util/futils.h +24 -7
  388. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  389. data/vendor/libgit2/src/util/git2_util.h +6 -0
  390. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  391. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  392. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  393. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  394. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  395. data/vendor/libgit2/src/util/hashmap.h +425 -0
  396. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  397. data/vendor/libgit2/src/util/integer.h +3 -1
  398. data/vendor/libgit2/src/util/net.c +17 -11
  399. data/vendor/libgit2/src/util/net.h +2 -0
  400. data/vendor/libgit2/src/util/pool.c +1 -1
  401. data/vendor/libgit2/src/util/pool.h +5 -0
  402. data/vendor/libgit2/src/util/pqueue.h +1 -1
  403. data/vendor/libgit2/src/util/process.h +223 -0
  404. data/vendor/libgit2/src/util/rand.c +1 -7
  405. data/vendor/libgit2/src/util/regexp.c +28 -13
  406. data/vendor/libgit2/src/util/regexp.h +7 -2
  407. data/vendor/libgit2/src/util/runtime.c +2 -2
  408. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  409. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  410. data/vendor/libgit2/src/util/str.c +20 -8
  411. data/vendor/libgit2/src/util/str.h +5 -3
  412. data/vendor/libgit2/src/util/strlist.c +108 -0
  413. data/vendor/libgit2/src/util/strlist.h +36 -0
  414. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  415. data/vendor/libgit2/src/util/unix/process.c +706 -0
  416. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  417. data/vendor/libgit2/src/util/util.c +18 -5
  418. data/vendor/libgit2/src/util/util.h +5 -38
  419. data/vendor/libgit2/src/util/vector.c +3 -3
  420. data/vendor/libgit2/src/util/vector.h +2 -2
  421. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  422. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  423. data/vendor/libgit2/src/util/win32/process.c +522 -0
  424. metadata +102 -67
  425. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  426. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  427. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  428. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  429. data/vendor/libgit2/deps/pcre/CMakeLists.txt +0 -140
  430. data/vendor/libgit2/deps/pcre/COPYING +0 -5
  431. data/vendor/libgit2/deps/pcre/LICENCE +0 -93
  432. data/vendor/libgit2/deps/pcre/cmake/COPYING-CMAKE-SCRIPTS +0 -22
  433. data/vendor/libgit2/deps/pcre/cmake/FindEditline.cmake +0 -17
  434. data/vendor/libgit2/deps/pcre/cmake/FindPackageHandleStandardArgs.cmake +0 -58
  435. data/vendor/libgit2/deps/pcre/cmake/FindReadline.cmake +0 -29
  436. data/vendor/libgit2/deps/pcre/config.h.in +0 -57
  437. data/vendor/libgit2/deps/pcre/pcre.h +0 -641
  438. data/vendor/libgit2/deps/pcre/pcre_byte_order.c +0 -319
  439. data/vendor/libgit2/deps/pcre/pcre_compile.c +0 -9815
  440. data/vendor/libgit2/deps/pcre/pcre_config.c +0 -190
  441. data/vendor/libgit2/deps/pcre/pcre_exec.c +0 -7173
  442. data/vendor/libgit2/deps/pcre/pcre_fullinfo.c +0 -245
  443. data/vendor/libgit2/deps/pcre/pcre_get.c +0 -669
  444. data/vendor/libgit2/deps/pcre/pcre_globals.c +0 -86
  445. data/vendor/libgit2/deps/pcre/pcre_internal.h +0 -2787
  446. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +0 -11913
  447. data/vendor/libgit2/deps/pcre/pcre_maketables.c +0 -156
  448. data/vendor/libgit2/deps/pcre/pcre_printint.c +0 -834
  449. data/vendor/libgit2/deps/pcre/pcre_string_utils.c +0 -211
  450. data/vendor/libgit2/deps/pcre/pcre_study.c +0 -1686
  451. data/vendor/libgit2/deps/pcre/pcre_tables.c +0 -727
  452. data/vendor/libgit2/deps/pcre/pcre_ucd.c +0 -3644
  453. data/vendor/libgit2/deps/pcre/pcre_valid_utf8.c +0 -301
  454. data/vendor/libgit2/deps/pcre/pcre_version.c +0 -98
  455. data/vendor/libgit2/deps/pcre/pcre_xclass.c +0 -268
  456. data/vendor/libgit2/deps/pcre/pcreposix.c +0 -420
  457. data/vendor/libgit2/deps/pcre/pcreposix.h +0 -117
  458. data/vendor/libgit2/deps/pcre/ucp.h +0 -224
  459. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  460. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  461. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  462. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  463. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  464. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  465. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  466. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  467. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  468. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  469. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  470. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  471. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  472. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  473. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  474. data/vendor/libgit2/src/util/khash.h +0 -615
  475. data/vendor/libgit2/src/util/strmap.c +0 -100
  476. data/vendor/libgit2/src/util/strmap.h +0 -131
  477. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -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
 
@@ -0,0 +1,128 @@
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
+
8
+ #include "httpparser.h"
9
+
10
+ #include <string.h>
11
+
12
+ #if defined(GIT_HTTPPARSER_HTTPPARSER)
13
+
14
+ #include "http_parser.h"
15
+
16
+ static int on_message_begin(http_parser *p)
17
+ {
18
+ git_http_parser *parser = (git_http_parser *)p;
19
+ return parser->settings.on_message_begin(parser);
20
+ }
21
+
22
+ static int on_url(http_parser *p, const char *str, size_t len)
23
+ {
24
+ git_http_parser *parser = (git_http_parser *)p;
25
+ return parser->settings.on_url(parser, str, len);
26
+ }
27
+
28
+ static int on_header_field(http_parser *p, const char *str, size_t len)
29
+ {
30
+ git_http_parser *parser = (git_http_parser *)p;
31
+ return parser->settings.on_header_field(parser, str, len);
32
+ }
33
+
34
+ static int on_header_value(http_parser *p, const char *str, size_t len)
35
+ {
36
+ git_http_parser *parser = (git_http_parser *)p;
37
+ return parser->settings.on_header_value(parser, str, len);
38
+ }
39
+
40
+ static int on_headers_complete(http_parser *p)
41
+ {
42
+ git_http_parser *parser = (git_http_parser *)p;
43
+ return parser->settings.on_headers_complete(parser);
44
+ }
45
+
46
+ static int on_body(http_parser *p, const char *buf, size_t len)
47
+ {
48
+ git_http_parser *parser = (git_http_parser *)p;
49
+ return parser->settings.on_body(parser, buf, len);
50
+ }
51
+
52
+ static int on_message_complete(http_parser *p)
53
+ {
54
+ git_http_parser *parser = (git_http_parser *)p;
55
+ return parser->settings.on_message_complete(parser);
56
+ }
57
+
58
+ void git_http_parser_init(
59
+ git_http_parser *parser,
60
+ git_http_parser_t type,
61
+ git_http_parser_settings *settings)
62
+ {
63
+ http_parser_init(&parser->parser, (enum http_parser_type)type);
64
+ memcpy(&parser->settings, settings, sizeof(git_http_parser_settings));
65
+ }
66
+
67
+ size_t git_http_parser_execute(
68
+ git_http_parser *parser,
69
+ const char *data,
70
+ size_t len)
71
+ {
72
+ struct http_parser_settings settings_proxy;
73
+
74
+ memset(&settings_proxy, 0, sizeof(struct http_parser_settings));
75
+
76
+ settings_proxy.on_message_begin = parser->settings.on_message_begin ? on_message_begin : NULL;
77
+ settings_proxy.on_url = parser->settings.on_url ? on_url : NULL;
78
+ settings_proxy.on_header_field = parser->settings.on_header_field ? on_header_field : NULL;
79
+ settings_proxy.on_header_value = parser->settings.on_header_value ? on_header_value : NULL;
80
+ settings_proxy.on_headers_complete = parser->settings.on_headers_complete ? on_headers_complete : NULL;
81
+ settings_proxy.on_body = parser->settings.on_body ? on_body : NULL;
82
+ settings_proxy.on_message_complete = parser->settings.on_message_complete ? on_message_complete : NULL;
83
+
84
+ return http_parser_execute(&parser->parser, &settings_proxy, data, len);
85
+ }
86
+
87
+ #elif defined(GIT_HTTPPARSER_LLHTTP) || defined(GIT_HTTPPARSER_BUILTIN)
88
+
89
+ # include <llhttp.h>
90
+
91
+ size_t git_http_parser_execute(
92
+ git_http_parser *parser,
93
+ const char* data,
94
+ size_t len)
95
+ {
96
+ llhttp_errno_t error;
97
+ size_t parsed_len;
98
+
99
+ /*
100
+ * Unlike http_parser, which returns the number of parsed
101
+ * bytes in the _execute() call, llhttp returns an error
102
+ * code.
103
+ */
104
+
105
+ if (data == NULL || len == 0)
106
+ error = llhttp_finish(parser);
107
+ else
108
+ error = llhttp_execute(parser, data, len);
109
+
110
+ parsed_len = len;
111
+
112
+ /*
113
+ * Adjust number of parsed bytes in case of error.
114
+ */
115
+ if (error != HPE_OK) {
116
+ parsed_len = llhttp_get_error_pos(parser) - data;
117
+
118
+ /* This isn't a real pause, just a way to stop parsing early. */
119
+ if (error == HPE_PAUSED_UPGRADE)
120
+ llhttp_resume_after_upgrade(parser);
121
+ }
122
+
123
+ return parsed_len;
124
+ }
125
+
126
+ #else
127
+ # error unknown http-parser
128
+ #endif
@@ -0,0 +1,99 @@
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
+
8
+ #ifndef INCLUDE_transports_httpparser_h__
9
+ #define INCLUDE_transports_httpparser_h__
10
+
11
+ #include "git2_util.h"
12
+
13
+ #if defined(GIT_HTTPPARSER_HTTPPARSER)
14
+
15
+ # include <http_parser.h>
16
+
17
+ typedef enum {
18
+ GIT_HTTP_PARSER_OK = HPE_OK,
19
+ GIT_HTTP_PARSER_PAUSED = HPE_PAUSED,
20
+ } git_http_parser_error_t;
21
+
22
+ typedef enum {
23
+ GIT_HTTP_PARSER_REQUEST = HTTP_REQUEST,
24
+ GIT_HTTP_PARSER_RESPONSE = HTTP_RESPONSE,
25
+ } git_http_parser_t;
26
+
27
+ typedef struct git_http_parser git_http_parser;
28
+
29
+ typedef struct {
30
+ int (*on_message_begin)(git_http_parser *);
31
+ int (*on_url)(git_http_parser *, const char *, size_t);
32
+ int (*on_header_field)(git_http_parser *, const char *, size_t);
33
+ int (*on_header_value)(git_http_parser *, const char *, size_t);
34
+ int (*on_headers_complete)(git_http_parser *);
35
+ int (*on_body)(git_http_parser *, const char *, size_t);
36
+ int (*on_message_complete)(git_http_parser *);
37
+ } git_http_parser_settings;
38
+
39
+ struct git_http_parser {
40
+ http_parser parser;
41
+ git_http_parser_settings settings;
42
+ void *data;
43
+ };
44
+
45
+ void git_http_parser_init(
46
+ git_http_parser *parser,
47
+ git_http_parser_t type,
48
+ git_http_parser_settings *settings);
49
+
50
+ size_t git_http_parser_execute(
51
+ git_http_parser *parser,
52
+ const char *data,
53
+ size_t len);
54
+
55
+ # define git_http_parser_status_code(parser) parser->parser.status_code
56
+ # define git_http_parser_keep_alive(parser) http_should_keep_alive(&parser->parser)
57
+ # define git_http_parser_pause(parser) (http_parser_pause(&parser->parser, 1), 0)
58
+ # define git_http_parser_resume(parser) http_parser_pause(&parser->parser, 0)
59
+ # define git_http_parser_remain_after_pause(parser) 1
60
+ # define git_http_parser_errno(parser) parser->parser.http_errno
61
+ # define git_http_parser_errmsg(parser, errno) http_errno_description(errno)
62
+
63
+ #elif defined(GIT_HTTPPARSER_LLHTTP) || defined(GIT_HTTPPARSER_BUILTIN)
64
+
65
+ # include <llhttp.h>
66
+
67
+ typedef enum {
68
+ GIT_HTTP_PARSER_OK = HPE_OK,
69
+ GIT_HTTP_PARSER_PAUSED = HPE_PAUSED,
70
+ } git_http_parser_error_t;
71
+
72
+ typedef enum {
73
+ GIT_HTTP_PARSER_REQUEST = HTTP_REQUEST,
74
+ GIT_HTTP_PARSER_RESPONSE = HTTP_RESPONSE,
75
+ } git_http_parser_t;
76
+
77
+ typedef llhttp_t git_http_parser;
78
+ typedef llhttp_settings_t git_http_parser_settings;
79
+
80
+ # define git_http_parser_init(parser, direction, settings) llhttp_init(parser, (llhttp_type_t)direction, settings)
81
+
82
+ size_t git_http_parser_execute(
83
+ git_http_parser *parser,
84
+ const char *data,
85
+ size_t len);
86
+
87
+ # define git_http_parser_status_code(parser) parser->status_code
88
+ # define git_http_parser_keep_alive(parser) llhttp_should_keep_alive(parser)
89
+ # define git_http_parser_pause(parser) (llhttp_pause(parser), GIT_HTTP_PARSER_PAUSED)
90
+ # define git_http_parser_resume(parser) llhttp_resume(parser)
91
+ # define git_http_parser_remain_after_pause(parser) 0
92
+ # define git_http_parser_errno(parser) parser->error
93
+ # define git_http_parser_errmsg(parser, errno) llhttp_get_error_reason(parser)
94
+
95
+ #else
96
+ # error unknown http-parser
97
+ #endif
98
+
99
+ #endif