rugged 1.3.1 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (656) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -2
  3. data/ext/rugged/extconf.rb +6 -3
  4. data/ext/rugged/rugged.c +16 -0
  5. data/ext/rugged/rugged.h +4 -0
  6. data/ext/rugged/rugged_allocator.c +0 -54
  7. data/ext/rugged/rugged_blame.c +2 -0
  8. data/ext/rugged/rugged_blob.c +3 -0
  9. data/ext/rugged/rugged_commit.c +1 -0
  10. data/ext/rugged/rugged_config.c +9 -2
  11. data/ext/rugged/rugged_diff.c +1 -0
  12. data/ext/rugged/rugged_index.c +2 -0
  13. data/ext/rugged/rugged_patch.c +1 -0
  14. data/ext/rugged/rugged_rebase.c +1 -0
  15. data/ext/rugged/rugged_reference.c +1 -0
  16. data/ext/rugged/rugged_remote.c +28 -10
  17. data/ext/rugged/rugged_repo.c +7 -9
  18. data/ext/rugged/rugged_revwalk.c +5 -1
  19. data/ext/rugged/rugged_settings.c +5 -0
  20. data/ext/rugged/rugged_submodule.c +1 -0
  21. data/ext/rugged/rugged_tag.c +1 -0
  22. data/ext/rugged/rugged_tree.c +4 -0
  23. data/lib/rugged/index.rb +1 -1
  24. data/lib/rugged/tree.rb +5 -1
  25. data/lib/rugged/version.rb +1 -1
  26. data/vendor/libgit2/AUTHORS +1 -0
  27. data/vendor/libgit2/CMakeLists.txt +141 -289
  28. data/vendor/libgit2/COPYING +301 -20
  29. data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
  30. data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
  31. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
  33. data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
  34. data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
  35. data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
  36. data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
  37. data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
  38. data/vendor/libgit2/cmake/FindHTTP_Parser.cmake +17 -17
  39. data/vendor/libgit2/cmake/FindIntlIconv.cmake +51 -0
  40. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  41. data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
  42. data/vendor/libgit2/cmake/FindPCRE.cmake +12 -13
  43. data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
  44. data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
  45. data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
  46. data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
  47. data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
  48. data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
  49. data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
  50. data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
  51. data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
  52. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
  53. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +34 -0
  54. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +129 -101
  55. data/vendor/libgit2/cmake/SelectHashes.cmake +113 -54
  56. data/vendor/libgit2/cmake/SelectRegex.cmake +56 -0
  57. data/vendor/libgit2/cmake/SelectSSH.cmake +46 -0
  58. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  59. data/vendor/libgit2/cmake/SelectZlib.cmake +38 -0
  60. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
  61. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  62. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  63. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  64. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  65. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  66. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  67. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +33 -31
  68. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  69. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  70. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  71. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +7 -5
  72. data/vendor/libgit2/deps/ntlmclient/ntlm.c +25 -25
  73. data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
  74. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
  75. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  76. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  77. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  78. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  79. data/vendor/libgit2/deps/pcre/CMakeLists.txt +89 -88
  80. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  81. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  82. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  83. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  84. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
  85. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  86. data/vendor/libgit2/deps/xdiff/git-xdiff.h +56 -0
  87. data/vendor/libgit2/{src → deps}/xdiff/xdiff.h +15 -15
  88. data/vendor/libgit2/{src → deps}/xdiff/xdiffi.c +152 -125
  89. data/vendor/libgit2/{src → deps}/xdiff/xdiffi.h +2 -4
  90. data/vendor/libgit2/{src → deps}/xdiff/xemit.c +26 -10
  91. data/vendor/libgit2/{src → deps}/xdiff/xhistogram.c +92 -94
  92. data/vendor/libgit2/{src → deps}/xdiff/xinclude.h +1 -12
  93. data/vendor/libgit2/{src → deps}/xdiff/xmacros.h +18 -1
  94. data/vendor/libgit2/{src → deps}/xdiff/xmerge.c +126 -137
  95. data/vendor/libgit2/{src → deps}/xdiff/xpatience.c +26 -46
  96. data/vendor/libgit2/{src → deps}/xdiff/xprepare.c +24 -46
  97. data/vendor/libgit2/{src → deps}/xdiff/xutils.c +36 -8
  98. data/vendor/libgit2/{src → deps}/xdiff/xutils.h +2 -1
  99. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  100. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  101. data/vendor/libgit2/deps/zlib/adler32.c +7 -22
  102. data/vendor/libgit2/deps/zlib/crc32.c +931 -317
  103. data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
  104. data/vendor/libgit2/deps/zlib/deflate.c +428 -453
  105. data/vendor/libgit2/deps/zlib/deflate.h +51 -23
  106. data/vendor/libgit2/deps/zlib/gzguts.h +15 -19
  107. data/vendor/libgit2/deps/zlib/infback.c +19 -31
  108. data/vendor/libgit2/deps/zlib/inffast.c +15 -18
  109. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  110. data/vendor/libgit2/deps/zlib/inflate.c +75 -110
  111. data/vendor/libgit2/deps/zlib/inflate.h +3 -2
  112. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  113. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  114. data/vendor/libgit2/deps/zlib/trees.c +294 -380
  115. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  116. data/vendor/libgit2/deps/zlib/zlib.h +310 -284
  117. data/vendor/libgit2/deps/zlib/zutil.c +20 -46
  118. data/vendor/libgit2/deps/zlib/zutil.h +24 -41
  119. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  120. data/vendor/libgit2/include/git2/apply.h +43 -8
  121. data/vendor/libgit2/include/git2/attr.h +28 -6
  122. data/vendor/libgit2/include/git2/blame.h +137 -29
  123. data/vendor/libgit2/include/git2/blob.h +85 -29
  124. data/vendor/libgit2/include/git2/branch.h +25 -16
  125. data/vendor/libgit2/include/git2/buffer.h +24 -82
  126. data/vendor/libgit2/include/git2/cert.h +4 -3
  127. data/vendor/libgit2/include/git2/checkout.h +88 -34
  128. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  129. data/vendor/libgit2/include/git2/clone.h +28 -12
  130. data/vendor/libgit2/include/git2/commit.h +134 -3
  131. data/vendor/libgit2/include/git2/common.h +172 -59
  132. data/vendor/libgit2/include/git2/config.h +118 -32
  133. data/vendor/libgit2/include/git2/credential.h +32 -3
  134. data/vendor/libgit2/include/git2/credential_helpers.h +2 -0
  135. data/vendor/libgit2/include/git2/deprecated.h +141 -3
  136. data/vendor/libgit2/include/git2/describe.h +20 -3
  137. data/vendor/libgit2/include/git2/diff.h +95 -19
  138. data/vendor/libgit2/include/git2/email.h +10 -30
  139. data/vendor/libgit2/include/git2/errors.h +51 -61
  140. data/vendor/libgit2/include/git2/experimental.h +20 -0
  141. data/vendor/libgit2/include/git2/filter.h +21 -9
  142. data/vendor/libgit2/include/git2/global.h +8 -1
  143. data/vendor/libgit2/include/git2/graph.h +4 -2
  144. data/vendor/libgit2/include/git2/ignore.h +11 -1
  145. data/vendor/libgit2/include/git2/index.h +111 -11
  146. data/vendor/libgit2/include/git2/indexer.h +67 -2
  147. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  148. data/vendor/libgit2/include/git2/merge.h +70 -5
  149. data/vendor/libgit2/include/git2/message.h +4 -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 +57 -7
  153. data/vendor/libgit2/include/git2/odb.h +156 -33
  154. data/vendor/libgit2/include/git2/odb_backend.h +132 -16
  155. data/vendor/libgit2/include/git2/oid.h +116 -17
  156. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  157. data/vendor/libgit2/include/git2/pack.h +37 -9
  158. data/vendor/libgit2/include/git2/patch.h +10 -3
  159. data/vendor/libgit2/include/git2/pathspec.h +10 -1
  160. data/vendor/libgit2/include/git2/proxy.h +11 -1
  161. data/vendor/libgit2/include/git2/rebase.h +18 -7
  162. data/vendor/libgit2/include/git2/refdb.h +5 -2
  163. data/vendor/libgit2/include/git2/reflog.h +4 -3
  164. data/vendor/libgit2/include/git2/refs.h +11 -8
  165. data/vendor/libgit2/include/git2/refspec.h +14 -4
  166. data/vendor/libgit2/include/git2/remote.h +295 -54
  167. data/vendor/libgit2/include/git2/repository.h +95 -25
  168. data/vendor/libgit2/include/git2/reset.h +18 -5
  169. data/vendor/libgit2/include/git2/revert.h +9 -4
  170. data/vendor/libgit2/include/git2/revparse.h +4 -4
  171. data/vendor/libgit2/include/git2/revwalk.h +7 -3
  172. data/vendor/libgit2/include/git2/signature.h +47 -2
  173. data/vendor/libgit2/include/git2/stash.h +78 -10
  174. data/vendor/libgit2/include/git2/status.h +24 -11
  175. data/vendor/libgit2/include/git2/stdint.h +87 -85
  176. data/vendor/libgit2/include/git2/strarray.h +2 -16
  177. data/vendor/libgit2/include/git2/submodule.h +27 -11
  178. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  179. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  180. data/vendor/libgit2/include/git2/sys/commit_graph.h +110 -59
  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 +47 -4
  192. data/vendor/libgit2/include/git2/sys/odb_backend.h +10 -9
  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 +53 -0
  198. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  199. data/vendor/libgit2/include/git2/sys/stream.h +26 -3
  200. data/vendor/libgit2/include/git2/sys/transport.h +87 -41
  201. data/vendor/libgit2/include/git2/tag.h +4 -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 +20 -8
  206. data/vendor/libgit2/include/git2/types.h +26 -10
  207. data/vendor/libgit2/include/git2/version.h +63 -6
  208. data/vendor/libgit2/include/git2/worktree.h +30 -8
  209. data/vendor/libgit2/include/git2.h +1 -0
  210. data/vendor/libgit2/src/CMakeLists.txt +203 -420
  211. data/vendor/libgit2/src/README.md +12 -0
  212. data/vendor/libgit2/src/cli/CMakeLists.txt +56 -0
  213. data/vendor/libgit2/src/cli/README.md +26 -0
  214. data/vendor/libgit2/src/{branch.h → cli/cmd.c} +10 -8
  215. data/vendor/libgit2/src/cli/cmd.h +37 -0
  216. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  217. data/vendor/libgit2/src/cli/cmd_cat_file.c +202 -0
  218. data/vendor/libgit2/src/cli/cmd_clone.c +190 -0
  219. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  220. data/vendor/libgit2/src/cli/cmd_hash_object.c +152 -0
  221. data/vendor/libgit2/src/cli/cmd_help.c +85 -0
  222. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  223. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  224. data/vendor/libgit2/src/cli/common.c +168 -0
  225. data/vendor/libgit2/src/cli/common.h +63 -0
  226. data/vendor/libgit2/src/cli/error.h +51 -0
  227. data/vendor/libgit2/src/cli/main.c +134 -0
  228. data/vendor/libgit2/src/cli/opt.c +695 -0
  229. data/vendor/libgit2/src/cli/opt.h +367 -0
  230. data/vendor/libgit2/src/cli/opt_usage.c +263 -0
  231. data/vendor/libgit2/src/cli/opt_usage.h +40 -0
  232. data/vendor/libgit2/src/cli/progress.c +395 -0
  233. data/vendor/libgit2/src/cli/progress.h +129 -0
  234. data/vendor/libgit2/src/cli/sighandler.h +20 -0
  235. data/vendor/libgit2/src/cli/unix/sighandler.c +37 -0
  236. data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
  237. data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
  238. data/vendor/libgit2/src/libgit2/CMakeLists.txt +140 -0
  239. data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +2 -2
  240. data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +2 -2
  241. data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +32 -34
  242. data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +2 -2
  243. data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +48 -31
  244. data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +25 -20
  245. data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +6 -4
  246. data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +87 -46
  247. data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +5 -9
  248. data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +152 -57
  249. data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +1 -0
  250. data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +1 -2
  251. data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +38 -29
  252. data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +3 -3
  253. data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +164 -118
  254. data/vendor/libgit2/src/libgit2/branch.h +31 -0
  255. data/vendor/libgit2/src/libgit2/buf.c +126 -0
  256. data/vendor/libgit2/src/libgit2/buf.h +50 -0
  257. data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +22 -17
  258. data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +7 -9
  259. data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +107 -91
  260. data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -2
  261. data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +14 -15
  262. data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +254 -203
  263. data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +4 -1
  264. data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +296 -77
  265. data/vendor/libgit2/src/libgit2/commit.h +87 -0
  266. data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +246 -135
  267. data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +33 -8
  268. data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +17 -7
  269. data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +1 -0
  270. data/vendor/libgit2/src/libgit2/common.h +55 -0
  271. data/vendor/libgit2/src/{config.c → libgit2/config.c} +490 -360
  272. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  273. data/vendor/libgit2/src/{config.h → libgit2/config.h} +24 -6
  274. data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +8 -10
  275. data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +4 -5
  276. data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +212 -183
  277. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  278. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  279. data/vendor/libgit2/src/libgit2/config_mem.c +374 -0
  280. data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +37 -32
  281. data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +24 -31
  282. data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +24 -21
  283. data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +62 -51
  284. data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +44 -14
  285. data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +8 -10
  286. data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +46 -55
  287. data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +5 -5
  288. data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +45 -27
  289. data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +70 -20
  290. data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +5 -3
  291. data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +22 -6
  292. data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +192 -105
  293. data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +40 -29
  294. data/vendor/libgit2/src/libgit2/diff_stats.h +18 -0
  295. data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +49 -16
  296. data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +4 -8
  297. data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +1 -1
  298. data/vendor/libgit2/src/{email.c → libgit2/email.c} +58 -40
  299. data/vendor/libgit2/src/{email.h → libgit2/email.h} +1 -1
  300. data/vendor/libgit2/src/{transports/ssh.h → libgit2/experimental.h.in} +3 -4
  301. data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +105 -30
  302. data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +1 -3
  303. data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +30 -28
  304. data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +132 -58
  305. data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +26 -5
  306. data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +3 -3
  307. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  308. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  309. data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +1 -1
  310. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  311. data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +20 -20
  312. data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +44 -39
  313. data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +2 -2
  314. data/vendor/libgit2/src/{index.c → libgit2/index.c} +460 -276
  315. data/vendor/libgit2/src/{index.h → libgit2/index.h} +21 -5
  316. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  317. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  318. data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +208 -124
  319. data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +102 -71
  320. data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +8 -5
  321. data/vendor/libgit2/src/libgit2/libgit2.c +268 -0
  322. data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +39 -37
  323. data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +83 -73
  324. data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +1 -14
  325. data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +4 -4
  326. data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +13 -5
  327. data/vendor/libgit2/src/{message.c → libgit2/message.c} +21 -10
  328. data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +174 -112
  329. data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +17 -6
  330. data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +53 -57
  331. data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +9 -2
  332. data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +29 -37
  333. data/vendor/libgit2/src/{object.c → libgit2/object.c} +166 -35
  334. data/vendor/libgit2/src/{object.h → libgit2/object.h} +17 -2
  335. data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +261 -88
  336. data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +44 -5
  337. data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +192 -134
  338. data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +67 -22
  339. data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +162 -89
  340. data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +171 -92
  341. data/vendor/libgit2/src/libgit2/oid.h +284 -0
  342. data/vendor/libgit2/src/libgit2/oidarray.c +89 -0
  343. data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +5 -1
  344. data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +126 -66
  345. data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +28 -12
  346. data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +146 -111
  347. data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +45 -25
  348. data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +8 -4
  349. data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +1 -1
  350. data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +3 -3
  351. data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +8 -1
  352. data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +51 -16
  353. data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +5 -5
  354. data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +42 -34
  355. data/vendor/libgit2/src/libgit2/path.c +375 -0
  356. data/vendor/libgit2/src/libgit2/path.h +68 -0
  357. data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +7 -7
  358. data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +2 -2
  359. data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +4 -1
  360. data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +1 -1
  361. data/vendor/libgit2/src/{push.c → libgit2/push.c} +116 -60
  362. data/vendor/libgit2/src/{push.h → libgit2/push.h} +5 -16
  363. data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +9 -9
  364. data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +2 -2
  365. data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +147 -147
  366. data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +639 -254
  367. data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +8 -7
  368. data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +3 -2
  369. data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +67 -39
  370. data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +8 -3
  371. data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +60 -38
  372. data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +13 -2
  373. data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +821 -454
  374. data/vendor/libgit2/src/libgit2/remote.h +101 -0
  375. data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +1377 -594
  376. data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +43 -12
  377. data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +8 -5
  378. data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +18 -22
  379. data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +76 -44
  380. data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +48 -19
  381. data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +3 -3
  382. data/vendor/libgit2/src/{libgit2.c → libgit2/settings.c} +162 -95
  383. data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +6 -2
  384. data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +144 -21
  385. data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +1 -2
  386. data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +243 -68
  387. data/vendor/libgit2/src/{status.c → libgit2/status.c} +5 -2
  388. data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +1 -0
  389. data/vendor/libgit2/src/libgit2/strarray.h +25 -0
  390. data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +62 -67
  391. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +41 -24
  392. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +2 -0
  393. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +11 -3
  394. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +6 -3
  395. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  396. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  397. data/vendor/libgit2/src/libgit2/streams/socket.c +428 -0
  398. data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +3 -1
  399. data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +79 -19
  400. data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +5 -0
  401. data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +279 -220
  402. data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +10 -11
  403. data/vendor/libgit2/src/libgit2/sysdir.c +650 -0
  404. data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +55 -18
  405. data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +74 -43
  406. data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +2 -2
  407. data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +1 -14
  408. data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +5 -22
  409. data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +7 -7
  410. data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +27 -21
  411. data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +4 -1
  412. data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +14 -11
  413. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +7 -9
  414. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +3 -5
  415. data/vendor/libgit2/src/{transports/auth_negotiate.c → libgit2/transports/auth_gssapi.c} +44 -45
  416. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +1 -1
  417. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +1 -2
  418. data/vendor/libgit2/src/{transports/auth_ntlm.c → libgit2/transports/auth_ntlmclient.c} +22 -22
  419. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  420. data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +1 -1
  421. data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +16 -19
  422. data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +49 -24
  423. data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +0 -11
  424. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +188 -134
  425. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +10 -0
  426. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  427. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  428. data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +159 -127
  429. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +142 -165
  430. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +56 -36
  431. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +307 -74
  432. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +297 -97
  433. data/vendor/libgit2/src/libgit2/transports/ssh.c +85 -0
  434. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  435. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  436. data/vendor/libgit2/src/{transports/ssh.c → libgit2/transports/ssh_libssh2.c} +414 -268
  437. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  438. data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +101 -75
  439. data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +30 -20
  440. data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +7 -5
  441. data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +128 -110
  442. data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +7 -6
  443. data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +160 -121
  444. data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +1 -1
  445. data/vendor/libgit2/src/util/CMakeLists.txt +77 -0
  446. data/vendor/libgit2/src/{alloc.c → util/alloc.c} +69 -7
  447. data/vendor/libgit2/src/util/alloc.h +65 -0
  448. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  449. data/vendor/libgit2/src/util/allocators/debugalloc.h +17 -0
  450. data/vendor/libgit2/src/util/allocators/failalloc.c +32 -0
  451. data/vendor/libgit2/src/util/allocators/failalloc.h +17 -0
  452. data/vendor/libgit2/src/util/allocators/stdalloc.c +37 -0
  453. data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
  454. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +50 -0
  455. data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
  456. data/vendor/libgit2/src/{array.h → util/array.h} +25 -19
  457. data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
  458. data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +5 -1
  459. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  460. data/vendor/libgit2/src/{date.c → util/date.c} +35 -33
  461. data/vendor/libgit2/src/util/date.h +45 -0
  462. data/vendor/libgit2/src/util/errors.c +401 -0
  463. data/vendor/libgit2/src/{errors.h → util/errors.h} +22 -19
  464. data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +35 -30
  465. data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +21 -8
  466. data/vendor/libgit2/src/{path.c → util/fs_path.c} +591 -615
  467. data/vendor/libgit2/src/{path.h → util/fs_path.h} +257 -181
  468. data/vendor/libgit2/src/{futils.c → util/futils.c} +144 -95
  469. data/vendor/libgit2/src/{futils.h → util/futils.h} +40 -18
  470. data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +33 -2
  471. data/vendor/libgit2/src/{common.h → util/git2_util.h} +26 -59
  472. data/vendor/libgit2/src/util/hash/builtin.c +53 -0
  473. data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
  474. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +3 -3
  475. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
  476. data/vendor/libgit2/src/util/hash/common_crypto.c +112 -0
  477. data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
  478. data/vendor/libgit2/src/util/hash/mbedtls.c +92 -0
  479. data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
  480. data/vendor/libgit2/src/util/hash/openssl.c +347 -0
  481. data/vendor/libgit2/src/util/hash/openssl.h +61 -0
  482. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +243 -0
  483. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
  484. data/vendor/libgit2/src/util/hash/sha.h +73 -0
  485. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +1 -1
  486. data/vendor/libgit2/src/util/hash/win32.c +549 -0
  487. data/vendor/libgit2/src/util/hash/win32.h +60 -0
  488. data/vendor/libgit2/src/util/hash.c +158 -0
  489. data/vendor/libgit2/src/util/hash.h +61 -0
  490. data/vendor/libgit2/src/util/hashmap.h +424 -0
  491. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  492. data/vendor/libgit2/src/{integer.h → util/integer.h} +3 -1
  493. data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
  494. data/vendor/libgit2/src/util/net.c +1160 -0
  495. data/vendor/libgit2/src/{net.h → util/net.h} +45 -4
  496. data/vendor/libgit2/src/{pool.c → util/pool.c} +1 -1
  497. data/vendor/libgit2/src/{pool.h → util/pool.h} +6 -1
  498. data/vendor/libgit2/src/{posix.c → util/posix.c} +57 -3
  499. data/vendor/libgit2/src/{posix.h → util/posix.h} +26 -1
  500. data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +3 -3
  501. data/vendor/libgit2/src/util/process.h +222 -0
  502. data/vendor/libgit2/src/util/rand.c +230 -0
  503. data/vendor/libgit2/src/util/rand.h +37 -0
  504. data/vendor/libgit2/src/{regexp.c → util/regexp.c} +5 -5
  505. data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
  506. data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
  507. data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
  508. data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +15 -14
  509. data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +5 -5
  510. data/vendor/libgit2/src/util/staticstr.h +66 -0
  511. data/vendor/libgit2/src/{buffer.c → util/str.c} +159 -153
  512. data/vendor/libgit2/src/util/str.h +357 -0
  513. data/vendor/libgit2/src/util/strlist.c +108 -0
  514. data/vendor/libgit2/src/util/strlist.h +36 -0
  515. data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
  516. data/vendor/libgit2/src/{thread.h → util/thread.h} +23 -22
  517. data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
  518. data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -3
  519. data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -6
  520. data/vendor/libgit2/src/util/unix/process.c +629 -0
  521. data/vendor/libgit2/src/{unix → util/unix}/realpath.c +24 -8
  522. data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
  523. data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
  524. data/vendor/libgit2/src/{util.c → util/util.c} +24 -19
  525. data/vendor/libgit2/src/{util.h → util/util.h} +30 -81
  526. data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
  527. data/vendor/libgit2/src/{vector.c → util/vector.c} +3 -3
  528. data/vendor/libgit2/src/{vector.h → util/vector.h} +4 -4
  529. data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
  530. data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
  531. data/vendor/libgit2/src/{win32 → util/win32}/error.c +1 -1
  532. data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
  533. data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
  534. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +148 -17
  535. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +3 -1
  536. data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -2
  537. data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +42 -35
  538. data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
  539. data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
  540. data/vendor/libgit2/src/util/win32/process.c +506 -0
  541. data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
  542. data/vendor/libgit2/src/util/win32/utf-conv.c +144 -0
  543. data/vendor/libgit2/src/util/win32/utf-conv.h +127 -0
  544. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +2 -3
  545. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +3 -4
  546. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +1 -1
  547. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
  548. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +1 -1
  549. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
  550. data/vendor/libgit2/src/{zstream.c → util/zstream.c} +5 -5
  551. data/vendor/libgit2/src/{zstream.h → util/zstream.h} +5 -5
  552. metadata +431 -362
  553. data/vendor/libgit2/cmake/FindIconv.cmake +0 -45
  554. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  555. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  556. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  557. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  558. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  559. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  560. data/vendor/libgit2/src/alloc.h +0 -40
  561. data/vendor/libgit2/src/allocators/failalloc.c +0 -92
  562. data/vendor/libgit2/src/allocators/failalloc.h +0 -23
  563. data/vendor/libgit2/src/allocators/stdalloc.c +0 -150
  564. data/vendor/libgit2/src/allocators/win32_leakcheck.c +0 -118
  565. data/vendor/libgit2/src/buffer.h +0 -374
  566. data/vendor/libgit2/src/commit.h +0 -46
  567. data/vendor/libgit2/src/config_entries.c +0 -237
  568. data/vendor/libgit2/src/config_entries.h +0 -24
  569. data/vendor/libgit2/src/config_mem.c +0 -220
  570. data/vendor/libgit2/src/errors.c +0 -238
  571. data/vendor/libgit2/src/hash/sha1/common_crypto.c +0 -57
  572. data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
  573. data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
  574. data/vendor/libgit2/src/hash/sha1/mbedtls.c +0 -46
  575. data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
  576. data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
  577. data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
  578. data/vendor/libgit2/src/hash/sha1.h +0 -38
  579. data/vendor/libgit2/src/hash.c +0 -110
  580. data/vendor/libgit2/src/hash.h +0 -46
  581. data/vendor/libgit2/src/idxmap.c +0 -157
  582. data/vendor/libgit2/src/idxmap.h +0 -177
  583. data/vendor/libgit2/src/khash.h +0 -615
  584. data/vendor/libgit2/src/libgit2.h +0 -15
  585. data/vendor/libgit2/src/message.h +0 -17
  586. data/vendor/libgit2/src/net.c +0 -540
  587. data/vendor/libgit2/src/netops.c +0 -125
  588. data/vendor/libgit2/src/netops.h +0 -68
  589. data/vendor/libgit2/src/offmap.c +0 -101
  590. data/vendor/libgit2/src/offmap.h +0 -133
  591. data/vendor/libgit2/src/oid.h +0 -51
  592. data/vendor/libgit2/src/oidarray.c +0 -43
  593. data/vendor/libgit2/src/oidmap.c +0 -107
  594. data/vendor/libgit2/src/oidmap.h +0 -128
  595. data/vendor/libgit2/src/remote.h +0 -55
  596. data/vendor/libgit2/src/streams/socket.c +0 -239
  597. data/vendor/libgit2/src/strmap.c +0 -100
  598. data/vendor/libgit2/src/strmap.h +0 -131
  599. data/vendor/libgit2/src/sysdir.c +0 -347
  600. data/vendor/libgit2/src/threadstate.c +0 -84
  601. data/vendor/libgit2/src/threadstate.h +0 -24
  602. data/vendor/libgit2/src/win32/findfile.c +0 -230
  603. data/vendor/libgit2/src/win32/findfile.h +0 -19
  604. data/vendor/libgit2/src/win32/utf-conv.c +0 -146
  605. data/vendor/libgit2/src/win32/utf-conv.h +0 -60
  606. /data/vendor/libgit2/{src → deps}/xdiff/xemit.h +0 -0
  607. /data/vendor/libgit2/{src → deps}/xdiff/xprepare.h +0 -0
  608. /data/vendor/libgit2/{src → deps}/xdiff/xtypes.h +0 -0
  609. /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
  610. /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
  611. /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
  612. /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
  613. /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
  614. /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
  615. /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
  616. /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
  617. /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
  618. /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
  619. /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
  620. /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
  621. /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
  622. /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
  623. /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
  624. /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
  625. /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
  626. /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
  627. /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
  628. /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
  629. /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
  630. /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
  631. /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
  632. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
  633. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
  634. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
  635. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
  636. /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
  637. /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
  638. /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
  639. /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
  640. /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
  641. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
  642. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
  643. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
  644. /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
  645. /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
  646. /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
  647. /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
  648. /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
  649. /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
  650. /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
  651. /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
  652. /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
  653. /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
  654. /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
  655. /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
  656. /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
@@ -5,28 +5,25 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
- #include "ssh.h"
8
+ #include "ssh_libssh2.h"
9
+
10
+ #ifdef GIT_SSH_LIBSSH2
9
11
 
10
- #ifdef GIT_SSH
11
12
  #include <libssh2.h>
12
- #endif
13
13
 
14
14
  #include "runtime.h"
15
- #include "git2.h"
16
- #include "buffer.h"
17
15
  #include "net.h"
18
- #include "netops.h"
19
16
  #include "smart.h"
17
+ #include "process.h"
20
18
  #include "streams/socket.h"
19
+ #include "sysdir.h"
21
20
 
22
21
  #include "git2/credential.h"
23
22
  #include "git2/sys/credential.h"
24
23
 
25
- #ifdef GIT_SSH
26
-
27
24
  #define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
28
25
 
29
- static const char *ssh_prefixes[] = { "ssh://", "ssh+git://", "git+ssh://" };
26
+ extern int git_socket_stream__timeout;
30
27
 
31
28
  static const char cmd_uploadpack[] = "git-upload-pack";
32
29
  static const char cmd_receivepack[] = "git-receive-pack";
@@ -37,7 +34,7 @@ typedef struct {
37
34
  LIBSSH2_SESSION *session;
38
35
  LIBSSH2_CHANNEL *channel;
39
36
  const char *cmd;
40
- char *url;
37
+ git_net_url url;
41
38
  unsigned sent_command : 1;
42
39
  } ssh_stream;
43
40
 
@@ -65,42 +62,26 @@ static void ssh_error(LIBSSH2_SESSION *session, const char *errmsg)
65
62
  *
66
63
  * For example: git-upload-pack '/libgit2/libgit2'
67
64
  */
68
- static int gen_proto(git_buf *request, const char *cmd, const char *url)
65
+ static int gen_proto(git_str *request, const char *cmd, git_net_url *url)
69
66
  {
70
67
  const char *repo;
71
- int len;
72
- size_t i;
73
-
74
- for (i = 0; i < ARRAY_SIZE(ssh_prefixes); ++i) {
75
- const char *p = ssh_prefixes[i];
76
68
 
77
- if (!git__prefixcmp(url, p)) {
78
- url = url + strlen(p);
79
- repo = strchr(url, '/');
80
- if (repo && repo[1] == '~')
81
- ++repo;
69
+ repo = url->path;
82
70
 
83
- goto done;
84
- }
85
- }
86
- repo = strchr(url, ':');
87
- if (repo) repo++;
71
+ if (repo && repo[0] == '/' && repo[1] == '~')
72
+ repo++;
88
73
 
89
- done:
90
- if (!repo) {
74
+ if (!repo || !repo[0]) {
91
75
  git_error_set(GIT_ERROR_NET, "malformed git protocol URL");
92
76
  return -1;
93
77
  }
94
78
 
95
- len = strlen(cmd) + 1 /* Space */ + 1 /* Quote */ + strlen(repo) + 1 /* Quote */ + 1;
79
+ git_str_puts(request, cmd);
80
+ git_str_puts(request, " '");
81
+ git_str_puts(request, repo);
82
+ git_str_puts(request, "'");
96
83
 
97
- git_buf_grow(request, len);
98
- git_buf_puts(request, cmd);
99
- git_buf_puts(request, " '");
100
- git_buf_decode_percent(request, repo, strlen(repo));
101
- git_buf_puts(request, "'");
102
-
103
- if (git_buf_oom(request))
84
+ if (git_str_oom(request))
104
85
  return -1;
105
86
 
106
87
  return 0;
@@ -109,9 +90,9 @@ done:
109
90
  static int send_command(ssh_stream *s)
110
91
  {
111
92
  int error;
112
- git_buf request = GIT_BUF_INIT;
93
+ git_str request = GIT_STR_INIT;
113
94
 
114
- error = gen_proto(&request, s->cmd, s->url);
95
+ error = gen_proto(&request, s->cmd, &s->url);
115
96
  if (error < 0)
116
97
  goto cleanup;
117
98
 
@@ -124,7 +105,7 @@ static int send_command(ssh_stream *s)
124
105
  s->sent_command = 1;
125
106
 
126
107
  cleanup:
127
- git_buf_dispose(&request);
108
+ git_str_dispose(&request);
128
109
  return error;
129
110
  }
130
111
 
@@ -134,8 +115,8 @@ static int ssh_stream_read(
134
115
  size_t buf_size,
135
116
  size_t *bytes_read)
136
117
  {
137
- int rc;
138
118
  ssh_stream *s = GIT_CONTAINER_OF(stream, ssh_stream, parent);
119
+ ssize_t rc;
139
120
 
140
121
  *bytes_read = 0;
141
122
 
@@ -154,7 +135,7 @@ static int ssh_stream_read(
154
135
  */
155
136
  if (rc == 0) {
156
137
  if ((rc = libssh2_channel_read_stderr(s->channel, buffer, buf_size)) > 0) {
157
- git_error_set(GIT_ERROR_SSH, "%*s", rc, buffer);
138
+ git_error_set(GIT_ERROR_SSH, "%*s", (int)rc, buffer);
158
139
  return GIT_EEOF;
159
140
  } else if (rc < LIBSSH2_ERROR_NONE) {
160
141
  ssh_error(s->session, "SSH could not read stderr");
@@ -162,7 +143,6 @@ static int ssh_stream_read(
162
143
  }
163
144
  }
164
145
 
165
-
166
146
  *bytes_read = rc;
167
147
 
168
148
  return 0;
@@ -226,13 +206,12 @@ static void ssh_stream_free(git_smart_subtransport_stream *stream)
226
206
  s->io = NULL;
227
207
  }
228
208
 
229
- git__free(s->url);
209
+ git_net_url_dispose(&s->url);
230
210
  git__free(s);
231
211
  }
232
212
 
233
213
  static int ssh_stream_alloc(
234
214
  ssh_subtransport *t,
235
- const char *url,
236
215
  const char *cmd,
237
216
  git_smart_subtransport_stream **stream)
238
217
  {
@@ -250,47 +229,10 @@ static int ssh_stream_alloc(
250
229
 
251
230
  s->cmd = cmd;
252
231
 
253
- s->url = git__strdup(url);
254
- if (!s->url) {
255
- git__free(s);
256
- return -1;
257
- }
258
-
259
232
  *stream = &s->parent;
260
233
  return 0;
261
234
  }
262
235
 
263
- static int git_ssh_extract_url_parts(
264
- git_net_url *urldata,
265
- const char *url)
266
- {
267
- char *colon, *at;
268
- const char *start;
269
-
270
- colon = strchr(url, ':');
271
-
272
-
273
- at = strchr(url, '@');
274
- if (at) {
275
- start = at + 1;
276
- urldata->username = git__substrdup(url, at - url);
277
- GIT_ERROR_CHECK_ALLOC(urldata->username);
278
- } else {
279
- start = url;
280
- urldata->username = NULL;
281
- }
282
-
283
- if (colon == NULL || (colon < start)) {
284
- git_error_set(GIT_ERROR_NET, "malformed URL");
285
- return -1;
286
- }
287
-
288
- urldata->host = git__substrdup(start, colon - start);
289
- GIT_ERROR_CHECK_ALLOC(urldata->host);
290
-
291
- return 0;
292
- }
293
-
294
236
  static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
295
237
  int rc = LIBSSH2_ERROR_NONE;
296
238
 
@@ -303,8 +245,10 @@ static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
303
245
 
304
246
  rc = libssh2_agent_connect(agent);
305
247
 
306
- if (rc != LIBSSH2_ERROR_NONE)
248
+ if (rc != LIBSSH2_ERROR_NONE) {
249
+ rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED;
307
250
  goto shutdown;
251
+ }
308
252
 
309
253
  rc = libssh2_agent_list_identities(agent);
310
254
 
@@ -400,7 +344,7 @@ static int _git_ssh_authenticate_session(
400
344
  session, c->username, c->prompt_callback);
401
345
  break;
402
346
  }
403
- #ifdef GIT_SSH_MEMORY_CREDENTIALS
347
+ #ifdef GIT_SSH_LIBSSH2_MEMORY_CREDENTIALS
404
348
  case GIT_CREDENTIAL_SSH_MEMORY: {
405
349
  git_credential_ssh_key *c = (git_credential_ssh_key *)cred;
406
350
 
@@ -430,8 +374,8 @@ static int _git_ssh_authenticate_session(
430
374
  return GIT_EAUTH;
431
375
 
432
376
  if (rc != LIBSSH2_ERROR_NONE) {
433
- if (!git_error_last())
434
- ssh_error(session, "Failed to authenticate SSH session");
377
+ if (git_error_last()->klass == GIT_ERROR_NONE)
378
+ ssh_error(session, "failed to authenticate SSH session");
435
379
  return -1;
436
380
  }
437
381
 
@@ -443,11 +387,15 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
443
387
  int error, no_callback = 0;
444
388
  git_credential *cred = NULL;
445
389
 
446
- if (!t->owner->cred_acquire_cb) {
390
+ if (!t->owner->connect_opts.callbacks.credentials) {
447
391
  no_callback = 1;
448
392
  } else {
449
- error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods,
450
- t->owner->cred_acquire_payload);
393
+ error = t->owner->connect_opts.callbacks.credentials(
394
+ &cred,
395
+ t->owner->url,
396
+ user,
397
+ auth_methods,
398
+ t->owner->connect_opts.callbacks.payload);
451
399
 
452
400
  if (error == GIT_PASSTHROUGH) {
453
401
  no_callback = 1;
@@ -475,15 +423,118 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
475
423
  return 0;
476
424
  }
477
425
 
426
+ #define SSH_DIR ".ssh"
427
+ #define KNOWN_HOSTS_FILE "known_hosts"
428
+
429
+ /*
430
+ * Load the known_hosts file.
431
+ *
432
+ * Returns success but leaves the output NULL if we couldn't find the file.
433
+ */
434
+ static int load_known_hosts(LIBSSH2_KNOWNHOSTS **hosts, LIBSSH2_SESSION *session)
435
+ {
436
+ git_str path = GIT_STR_INIT, sshdir = GIT_STR_INIT;
437
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
438
+ int error;
439
+
440
+ GIT_ASSERT_ARG(hosts);
441
+
442
+ if ((error = git_sysdir_expand_homedir_file(&sshdir, SSH_DIR)) < 0 ||
443
+ (error = git_str_joinpath(&path, git_str_cstr(&sshdir), KNOWN_HOSTS_FILE)) < 0)
444
+ goto out;
445
+
446
+ if ((known_hosts = libssh2_knownhost_init(session)) == NULL) {
447
+ ssh_error(session, "error initializing known hosts");
448
+ error = -1;
449
+ goto out;
450
+ }
451
+
452
+ /*
453
+ * Try to read the file and consider not finding it as not trusting the
454
+ * host rather than an error.
455
+ */
456
+ error = libssh2_knownhost_readfile(known_hosts, git_str_cstr(&path), LIBSSH2_KNOWNHOST_FILE_OPENSSH);
457
+ if (error == LIBSSH2_ERROR_FILE)
458
+ error = 0;
459
+ if (error < 0)
460
+ ssh_error(session, "error reading known_hosts");
461
+
462
+ out:
463
+ *hosts = known_hosts;
464
+
465
+ git_str_dispose(&sshdir);
466
+ git_str_dispose(&path);
467
+
468
+ return error;
469
+ }
470
+
471
+ static void add_hostkey_pref_if_avail(
472
+ LIBSSH2_KNOWNHOSTS *known_hosts,
473
+ const char *hostname,
474
+ int port,
475
+ git_str *prefs,
476
+ int type,
477
+ const char *type_name)
478
+ {
479
+ struct libssh2_knownhost *host = NULL;
480
+ const char key = '\0';
481
+ int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW | type;
482
+ int error;
483
+
484
+ error = libssh2_knownhost_checkp(known_hosts, hostname, port, &key, 1, mask, &host);
485
+ if (error == LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
486
+ if (git_str_len(prefs) > 0) {
487
+ git_str_putc(prefs, ',');
488
+ }
489
+ git_str_puts(prefs, type_name);
490
+ }
491
+ }
492
+
493
+ /*
494
+ * We figure out what kind of key we want to ask the remote for by trying to
495
+ * look it up with a nonsense key and using that mismatch to figure out what key
496
+ * we do have stored for the host.
497
+ *
498
+ * Populates prefs with the string to pass to libssh2_session_method_pref.
499
+ */
500
+ static void find_hostkey_preference(
501
+ LIBSSH2_KNOWNHOSTS *known_hosts,
502
+ const char *hostname,
503
+ int port,
504
+ git_str *prefs)
505
+ {
506
+ /*
507
+ * The order here is important as it indicates the priority of what will
508
+ * be preferred.
509
+ */
510
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
511
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ED25519, "ssh-ed25519");
512
+ #endif
513
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
514
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_256, "ecdsa-sha2-nistp256");
515
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_384, "ecdsa-sha2-nistp384");
516
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_521, "ecdsa-sha2-nistp521");
517
+ #endif
518
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_SSHRSA, "rsa-sha2-512");
519
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_SSHRSA, "rsa-sha2-256");
520
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_SSHRSA, "ssh-rsa");
521
+ }
522
+
478
523
  static int _git_ssh_session_create(
479
524
  LIBSSH2_SESSION **session,
525
+ LIBSSH2_KNOWNHOSTS **hosts,
526
+ const char *hostname,
527
+ int port,
480
528
  git_stream *io)
481
529
  {
482
- int rc = 0;
483
- LIBSSH2_SESSION *s;
484
530
  git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
531
+ LIBSSH2_SESSION *s;
532
+ LIBSSH2_KNOWNHOSTS *known_hosts;
533
+ git_str prefs = GIT_STR_INIT;
534
+ int rc = 0;
485
535
 
486
536
  GIT_ASSERT_ARG(session);
537
+ GIT_ASSERT_ARG(hosts);
487
538
 
488
539
  s = libssh2_session_init();
489
540
  if (!s) {
@@ -491,19 +542,223 @@ static int _git_ssh_session_create(
491
542
  return -1;
492
543
  }
493
544
 
545
+ if (git_socket_stream__timeout > 0) {
546
+ libssh2_session_set_timeout(s, git_socket_stream__timeout);
547
+ }
548
+
549
+ if ((rc = load_known_hosts(&known_hosts, s)) < 0) {
550
+ ssh_error(s, "error loading known_hosts");
551
+ libssh2_session_free(s);
552
+ return -1;
553
+ }
554
+
555
+ find_hostkey_preference(known_hosts, hostname, port, &prefs);
556
+ if (git_str_len(&prefs) > 0) {
557
+ do {
558
+ rc = libssh2_session_method_pref(s, LIBSSH2_METHOD_HOSTKEY, git_str_cstr(&prefs));
559
+ } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
560
+ if (rc != LIBSSH2_ERROR_NONE) {
561
+ ssh_error(s, "failed to set hostkey preference");
562
+ goto on_error;
563
+ }
564
+ }
565
+ git_str_dispose(&prefs);
566
+
494
567
  do {
495
568
  rc = libssh2_session_handshake(s, socket->s);
496
569
  } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
497
570
 
498
571
  if (rc != LIBSSH2_ERROR_NONE) {
499
572
  ssh_error(s, "failed to start SSH session");
500
- libssh2_session_free(s);
501
- return -1;
573
+ goto on_error;
502
574
  }
503
575
 
504
576
  libssh2_session_set_blocking(s, 1);
505
577
 
506
578
  *session = s;
579
+ *hosts = known_hosts;
580
+
581
+ return 0;
582
+
583
+ on_error:
584
+ libssh2_knownhost_free(known_hosts);
585
+ libssh2_session_free(s);
586
+ return -1;
587
+ }
588
+
589
+
590
+ /*
591
+ * Returns the typemask argument to pass to libssh2_knownhost_check{,p} based on
592
+ * the type of key that libssh2_session_hostkey returns.
593
+ */
594
+ static int fingerprint_type_mask(int keytype)
595
+ {
596
+ int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW;
597
+ return mask;
598
+
599
+ switch (keytype) {
600
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
601
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHRSA;
602
+ break;
603
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
604
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHDSS;
605
+ break;
606
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
607
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
608
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
609
+ break;
610
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
611
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
612
+ break;
613
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
614
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
615
+ break;
616
+ #endif
617
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
618
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
619
+ mask |= LIBSSH2_KNOWNHOST_KEY_ED25519;
620
+ break;
621
+ #endif
622
+ }
623
+
624
+ return mask;
625
+ }
626
+
627
+ /*
628
+ * Check the host against the user's known_hosts file.
629
+ *
630
+ * Returns 1/0 for valid/''not-valid or <0 for an error
631
+ */
632
+ static int check_against_known_hosts(
633
+ LIBSSH2_SESSION *session,
634
+ LIBSSH2_KNOWNHOSTS *known_hosts,
635
+ const char *hostname,
636
+ int port,
637
+ const char *key,
638
+ size_t key_len,
639
+ int key_type)
640
+ {
641
+ int check, typemask, ret = 0;
642
+ struct libssh2_knownhost *host = NULL;
643
+
644
+ if (known_hosts == NULL)
645
+ return 0;
646
+
647
+ typemask = fingerprint_type_mask(key_type);
648
+ check = libssh2_knownhost_checkp(known_hosts, hostname, port, key, key_len, typemask, &host);
649
+ if (check == LIBSSH2_KNOWNHOST_CHECK_FAILURE) {
650
+ ssh_error(session, "error checking for known host");
651
+ return -1;
652
+ }
653
+
654
+ ret = check == LIBSSH2_KNOWNHOST_CHECK_MATCH ? 1 : 0;
655
+
656
+ return ret;
657
+ }
658
+
659
+ /*
660
+ * Perform the check for the session's certificate against known hosts if
661
+ * possible and then ask the user if they have a callback.
662
+ *
663
+ * Returns 1/0 for valid/not-valid or <0 for an error
664
+ */
665
+ static int check_certificate(
666
+ LIBSSH2_SESSION *session,
667
+ LIBSSH2_KNOWNHOSTS *known_hosts,
668
+ git_transport_certificate_check_cb check_cb,
669
+ void *check_cb_payload,
670
+ const char *host,
671
+ int port)
672
+ {
673
+ git_cert_hostkey cert = {{ 0 }};
674
+ const char *key;
675
+ size_t cert_len;
676
+ int cert_type, cert_valid = 0, error = GIT_ECERTIFICATE;
677
+
678
+ if ((key = libssh2_session_hostkey(session, &cert_len, &cert_type)) == NULL) {
679
+ ssh_error(session, "failed to retrieve hostkey");
680
+ return -1;
681
+ }
682
+
683
+ if ((cert_valid = check_against_known_hosts(session, known_hosts, host, port, key, cert_len, cert_type)) < 0)
684
+ return -1;
685
+
686
+ cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
687
+ if (key != NULL) {
688
+ cert.type |= GIT_CERT_SSH_RAW;
689
+ cert.hostkey = key;
690
+ cert.hostkey_len = cert_len;
691
+ switch (cert_type) {
692
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
693
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
694
+ break;
695
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
696
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
697
+ break;
698
+
699
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
700
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
701
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
702
+ break;
703
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
704
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
705
+ break;
706
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
707
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
708
+ break;
709
+ #endif
710
+
711
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
712
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
713
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
714
+ break;
715
+ #endif
716
+ default:
717
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
718
+ }
719
+ }
720
+
721
+ #ifdef LIBSSH2_HOSTKEY_HASH_SHA256
722
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
723
+ if (key != NULL) {
724
+ cert.type |= GIT_CERT_SSH_SHA256;
725
+ memcpy(&cert.hash_sha256, key, 32);
726
+ }
727
+ #endif
728
+
729
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
730
+ if (key != NULL) {
731
+ cert.type |= GIT_CERT_SSH_SHA1;
732
+ memcpy(&cert.hash_sha1, key, 20);
733
+ }
734
+
735
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
736
+ if (key != NULL) {
737
+ cert.type |= GIT_CERT_SSH_MD5;
738
+ memcpy(&cert.hash_md5, key, 16);
739
+ }
740
+
741
+ if (cert.type == 0) {
742
+ git_error_set(GIT_ERROR_SSH, "unable to get the host key");
743
+ return -1;
744
+ }
745
+
746
+ if (check_cb != NULL) {
747
+ git_cert_hostkey *cert_ptr = &cert;
748
+
749
+ error = check_cb((git_cert *)cert_ptr, cert_valid, host,
750
+ check_cb_payload);
751
+
752
+ if (error == 0)
753
+ cert_valid = 1;
754
+ else if (error != GIT_PASSTHROUGH)
755
+ cert_valid = 0;
756
+ }
757
+
758
+ if (!cert_valid) {
759
+ git_error_set(GIT_ERROR_SSH, "invalid or unknown remote ssh hostkey");
760
+ return (error == GIT_PASSTHROUGH) ? GIT_ECERTIFICATE : error;
761
+ }
507
762
 
508
763
  return 0;
509
764
  }
@@ -516,150 +771,75 @@ static int _git_ssh_setup_conn(
516
771
  const char *cmd,
517
772
  git_smart_subtransport_stream **stream)
518
773
  {
519
- git_net_url urldata = GIT_NET_URL_INIT;
520
- int auth_methods, error = 0;
521
- size_t i;
774
+ int auth_methods, error = 0, port;
522
775
  ssh_stream *s;
523
776
  git_credential *cred = NULL;
524
777
  LIBSSH2_SESSION *session=NULL;
525
778
  LIBSSH2_CHANNEL *channel=NULL;
779
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
526
780
 
527
781
  t->current_stream = NULL;
528
782
 
529
783
  *stream = NULL;
530
- if (ssh_stream_alloc(t, url, cmd, stream) < 0)
784
+ if (ssh_stream_alloc(t, cmd, stream) < 0)
531
785
  return -1;
532
786
 
533
787
  s = (ssh_stream *)*stream;
534
788
  s->session = NULL;
535
789
  s->channel = NULL;
536
790
 
537
- for (i = 0; i < ARRAY_SIZE(ssh_prefixes); ++i) {
538
- const char *p = ssh_prefixes[i];
791
+ if (git_net_str_is_url(url))
792
+ error = git_net_url_parse(&s->url, url);
793
+ else
794
+ error = git_net_url_parse_scp(&s->url, url);
539
795
 
540
- if (!git__prefixcmp(url, p)) {
541
- if ((error = git_net_url_parse(&urldata, url)) < 0)
542
- goto done;
543
-
544
- goto post_extract;
545
- }
546
- }
547
- if ((error = git_ssh_extract_url_parts(&urldata, url)) < 0)
796
+ if (error < 0)
548
797
  goto done;
549
798
 
550
- if (urldata.port == NULL)
551
- urldata.port = git__strdup(SSH_DEFAULT_PORT);
799
+ /* Safety check: like git, we forbid paths that look like an option as
800
+ * that could lead to injection on the remote side */
801
+ if (git_process__is_cmdline_option(s->url.path)) {
802
+ git_error_set(GIT_ERROR_NET, "cannot ssh: path '%s' is ambiguous with command-line option", s->url.path);
803
+ error = -1;
804
+ goto done;
805
+ }
552
806
 
553
- GIT_ERROR_CHECK_ALLOC(urldata.port);
554
807
 
555
- post_extract:
556
- if ((error = git_socket_stream_new(&s->io, urldata.host, urldata.port)) < 0 ||
808
+ if ((error = git_socket_stream_new(&s->io, s->url.host, s->url.port)) < 0 ||
557
809
  (error = git_stream_connect(s->io)) < 0)
558
810
  goto done;
559
811
 
560
- if ((error = _git_ssh_session_create(&session, s->io)) < 0)
561
- goto done;
562
-
563
- if (t->owner->certificate_check_cb != NULL) {
564
- git_cert_hostkey cert = {{ 0 }}, *cert_ptr;
565
- const char *key;
566
- size_t cert_len;
567
- int cert_type;
568
-
569
- cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
570
-
571
- key = libssh2_session_hostkey(session, &cert_len, &cert_type);
572
- if (key != NULL) {
573
- cert.type |= GIT_CERT_SSH_RAW;
574
- cert.hostkey = key;
575
- cert.hostkey_len = cert_len;
576
- switch (cert_type) {
577
- case LIBSSH2_HOSTKEY_TYPE_RSA:
578
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
579
- break;
580
- case LIBSSH2_HOSTKEY_TYPE_DSS:
581
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
582
- break;
583
-
584
- #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
585
- case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
586
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
587
- break;
588
- case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
589
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
590
- break;
591
- case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
592
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
593
- break;
594
- #endif
595
-
596
- #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
597
- case LIBSSH2_HOSTKEY_TYPE_ED25519:
598
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
599
- break;
600
- #endif
601
- default:
602
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
603
- }
604
- }
605
-
606
- #ifdef LIBSSH2_HOSTKEY_HASH_SHA256
607
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
608
- if (key != NULL) {
609
- cert.type |= GIT_CERT_SSH_SHA256;
610
- memcpy(&cert.hash_sha256, key, 32);
611
- }
612
- #endif
613
-
614
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
615
- if (key != NULL) {
616
- cert.type |= GIT_CERT_SSH_SHA1;
617
- memcpy(&cert.hash_sha1, key, 20);
618
- }
619
-
620
- key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
621
- if (key != NULL) {
622
- cert.type |= GIT_CERT_SSH_MD5;
623
- memcpy(&cert.hash_md5, key, 16);
624
- }
625
-
626
- if (cert.type == 0) {
627
- git_error_set(GIT_ERROR_SSH, "unable to get the host key");
628
- error = -1;
629
- goto done;
630
- }
631
-
632
- /* We don't currently trust any hostkeys */
633
- git_error_clear();
634
-
635
- cert_ptr = &cert;
636
-
637
- error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, urldata.host, t->owner->message_cb_payload);
812
+ /*
813
+ * Try to parse the port as a number, if we can't then fall back to
814
+ * default. It would be nice if we could get the port that was resolved
815
+ * as part of the stream connection, but that's not something that's
816
+ * exposed.
817
+ */
818
+ if (git__strntol32(&port, s->url.port, strlen(s->url.port), NULL, 10) < 0)
819
+ port = -1;
638
820
 
639
- if (error < 0 && error != GIT_PASSTHROUGH) {
640
- if (!git_error_last())
641
- git_error_set(GIT_ERROR_NET, "user cancelled hostkey check");
821
+ if ((error = _git_ssh_session_create(&session, &known_hosts, s->url.host, port, s->io)) < 0)
822
+ goto done;
642
823
 
643
- goto done;
644
- }
645
- }
824
+ if ((error = check_certificate(session, known_hosts, t->owner->connect_opts.callbacks.certificate_check, t->owner->connect_opts.callbacks.payload, s->url.host, port)) < 0)
825
+ goto done;
646
826
 
647
827
  /* we need the username to ask for auth methods */
648
- if (!urldata.username) {
828
+ if (!s->url.username) {
649
829
  if ((error = request_creds(&cred, t, NULL, GIT_CREDENTIAL_USERNAME)) < 0)
650
830
  goto done;
651
831
 
652
- urldata.username = git__strdup(((git_credential_username *) cred)->username);
832
+ s->url.username = git__strdup(((git_credential_username *) cred)->username);
653
833
  cred->free(cred);
654
834
  cred = NULL;
655
- if (!urldata.username)
835
+ if (!s->url.username)
656
836
  goto done;
657
- } else if (urldata.username && urldata.password) {
658
- if ((error = git_credential_userpass_plaintext_new(&cred, urldata.username, urldata.password)) < 0)
837
+ } else if (s->url.username && s->url.password) {
838
+ if ((error = git_credential_userpass_plaintext_new(&cred, s->url.username, s->url.password)) < 0)
659
839
  goto done;
660
840
  }
661
841
 
662
- if ((error = list_auth_methods(&auth_methods, session, urldata.username)) < 0)
842
+ if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
663
843
  goto done;
664
844
 
665
845
  error = GIT_EAUTH;
@@ -673,10 +853,10 @@ post_extract:
673
853
  cred = NULL;
674
854
  }
675
855
 
676
- if ((error = request_creds(&cred, t, urldata.username, auth_methods)) < 0)
856
+ if ((error = request_creds(&cred, t, s->url.username, auth_methods)) < 0)
677
857
  goto done;
678
858
 
679
- if (strcmp(urldata.username, git_credential_get_username(cred))) {
859
+ if (strcmp(s->url.username, git_credential_get_username(cred))) {
680
860
  git_error_set(GIT_ERROR_SSH, "username does not match previous request");
681
861
  error = -1;
682
862
  goto done;
@@ -686,7 +866,7 @@ post_extract:
686
866
 
687
867
  if (error == GIT_EAUTH) {
688
868
  /* refresh auth methods */
689
- if ((error = list_auth_methods(&auth_methods, session, urldata.username)) < 0)
869
+ if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
690
870
  goto done;
691
871
  else
692
872
  error = GIT_EAUTH;
@@ -711,6 +891,9 @@ post_extract:
711
891
  t->current_stream = s;
712
892
 
713
893
  done:
894
+ if (known_hosts)
895
+ libssh2_knownhost_free(known_hosts);
896
+
714
897
  if (error < 0) {
715
898
  ssh_stream_free(*stream);
716
899
 
@@ -721,8 +904,6 @@ done:
721
904
  if (cred)
722
905
  cred->free(cred);
723
906
 
724
- git_net_url_dispose(&urldata);
725
-
726
907
  return error;
727
908
  }
728
909
 
@@ -835,11 +1016,12 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
835
1016
 
836
1017
  *out = 0;
837
1018
 
838
- list = libssh2_userauth_list(session, username, strlen(username));
1019
+ list = libssh2_userauth_list(session, username,
1020
+ (unsigned int)strlen(username));
839
1021
 
840
1022
  /* either error, or the remote accepts NONE auth, which is bizarre, let's punt */
841
1023
  if (list == NULL && !libssh2_userauth_authenticated(session)) {
842
- ssh_error(session, "Failed to retrieve list of SSH authentication methods");
1024
+ ssh_error(session, "remote rejected authentication");
843
1025
  return GIT_EAUTH;
844
1026
  }
845
1027
 
@@ -851,7 +1033,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
851
1033
  if (!git__prefixcmp(ptr, SSH_AUTH_PUBLICKEY)) {
852
1034
  *out |= GIT_CREDENTIAL_SSH_KEY;
853
1035
  *out |= GIT_CREDENTIAL_SSH_CUSTOM;
854
- #ifdef GIT_SSH_MEMORY_CREDENTIALS
1036
+ #ifdef GIT_SSH_LIBSSH2_MEMORY_CREDENTIALS
855
1037
  *out |= GIT_CREDENTIAL_SSH_MEMORY;
856
1038
  #endif
857
1039
  ptr += strlen(SSH_AUTH_PUBLICKEY);
@@ -870,18 +1052,18 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
870
1052
  continue;
871
1053
  }
872
1054
 
873
- /* Skipt it if we don't know it */
1055
+ /* Skip it if we don't know it */
874
1056
  ptr = strchr(ptr, ',');
875
1057
  }
876
1058
 
877
1059
  return 0;
878
1060
  }
879
- #endif
880
1061
 
881
- int git_smart_subtransport_ssh(
882
- git_smart_subtransport **out, git_transport *owner, void *param)
1062
+ int git_smart_subtransport_ssh_libssh2(
1063
+ git_smart_subtransport **out,
1064
+ git_transport *owner,
1065
+ void *param)
883
1066
  {
884
- #ifdef GIT_SSH
885
1067
  ssh_subtransport *t;
886
1068
 
887
1069
  GIT_ASSERT_ARG(out);
@@ -898,83 +1080,47 @@ int git_smart_subtransport_ssh(
898
1080
 
899
1081
  *out = (git_smart_subtransport *) t;
900
1082
  return 0;
901
- #else
902
- GIT_UNUSED(owner);
903
- GIT_UNUSED(param);
904
-
905
- GIT_ASSERT_ARG(out);
906
- *out = NULL;
907
-
908
- git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
909
- return -1;
910
- #endif
911
1083
  }
912
1084
 
913
- int git_transport_ssh_with_paths(git_transport **out, git_remote *owner, void *payload)
1085
+ int git_smart_subtransport_ssh_libssh2_set_paths(
1086
+ git_smart_subtransport *subtransport,
1087
+ const char *cmd_uploadpack,
1088
+ const char *cmd_receivepack)
914
1089
  {
915
- #ifdef GIT_SSH
916
- git_strarray *paths = (git_strarray *) payload;
917
- git_transport *transport;
918
- transport_smart *smart;
919
- ssh_subtransport *t;
920
- int error;
921
- git_smart_subtransport_definition ssh_definition = {
922
- git_smart_subtransport_ssh,
923
- 0, /* no RPC */
924
- NULL,
925
- };
926
-
927
- if (paths->count != 2) {
928
- git_error_set(GIT_ERROR_SSH, "invalid ssh paths, must be two strings");
929
- return GIT_EINVALIDSPEC;
930
- }
1090
+ ssh_subtransport *t = (ssh_subtransport *)subtransport;
931
1091
 
932
- if ((error = git_transport_smart(&transport, owner, &ssh_definition)) < 0)
933
- return error;
934
-
935
- smart = (transport_smart *) transport;
936
- t = (ssh_subtransport *) smart->wrapped;
1092
+ git__free(t->cmd_uploadpack);
1093
+ git__free(t->cmd_receivepack);
937
1094
 
938
- t->cmd_uploadpack = git__strdup(paths->strings[0]);
1095
+ t->cmd_uploadpack = git__strdup(cmd_uploadpack);
939
1096
  GIT_ERROR_CHECK_ALLOC(t->cmd_uploadpack);
940
- t->cmd_receivepack = git__strdup(paths->strings[1]);
1097
+
1098
+ t->cmd_receivepack = git__strdup(cmd_receivepack);
941
1099
  GIT_ERROR_CHECK_ALLOC(t->cmd_receivepack);
942
1100
 
943
- *out = transport;
944
1101
  return 0;
945
- #else
946
- GIT_UNUSED(owner);
947
- GIT_UNUSED(payload);
948
-
949
- GIT_ASSERT_ARG(out);
950
- *out = NULL;
951
-
952
- git_error_set(GIT_ERROR_INVALID, "cannot create SSH transport. Library was built without SSH support");
953
- return -1;
954
- #endif
955
1102
  }
956
1103
 
957
- #ifdef GIT_SSH
958
- static void shutdown_ssh(void)
1104
+ static void shutdown_libssh2(void)
959
1105
  {
960
1106
  libssh2_exit();
961
1107
  }
962
- #endif
963
1108
 
964
- int git_transport_ssh_global_init(void)
1109
+ int git_transport_ssh_libssh2_global_init(void)
965
1110
  {
966
- #ifdef GIT_SSH
967
1111
  if (libssh2_init(0) < 0) {
968
1112
  git_error_set(GIT_ERROR_SSH, "unable to initialize libssh2");
969
1113
  return -1;
970
1114
  }
971
1115
 
972
- return git_runtime_shutdown_register(shutdown_ssh);
1116
+ return git_runtime_shutdown_register(shutdown_libssh2);
1117
+ }
973
1118
 
974
- #else
1119
+ #else /* GIT_SSH */
975
1120
 
976
- /* Nothing to initialize */
1121
+ int git_transport_ssh_libssh2_global_init(void)
1122
+ {
977
1123
  return 0;
1124
+ }
978
1125
 
979
1126
  #endif
980
- }