rugged 1.3.2 → 1.6.2

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 (547) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -2
  3. data/ext/rugged/extconf.rb +7 -4
  4. data/ext/rugged/rugged.c +16 -0
  5. data/ext/rugged/rugged.h +4 -0
  6. data/ext/rugged/rugged_blame.c +2 -0
  7. data/ext/rugged/rugged_blob.c +3 -0
  8. data/ext/rugged/rugged_commit.c +1 -0
  9. data/ext/rugged/rugged_config.c +9 -2
  10. data/ext/rugged/rugged_diff.c +1 -0
  11. data/ext/rugged/rugged_index.c +2 -0
  12. data/ext/rugged/rugged_patch.c +1 -0
  13. data/ext/rugged/rugged_rebase.c +1 -0
  14. data/ext/rugged/rugged_reference.c +1 -0
  15. data/ext/rugged/rugged_remote.c +28 -10
  16. data/ext/rugged/rugged_repo.c +7 -9
  17. data/ext/rugged/rugged_revwalk.c +5 -1
  18. data/ext/rugged/rugged_settings.c +5 -0
  19. data/ext/rugged/rugged_submodule.c +1 -0
  20. data/ext/rugged/rugged_tag.c +1 -0
  21. data/ext/rugged/rugged_tree.c +4 -0
  22. data/lib/rugged/index.rb +1 -1
  23. data/lib/rugged/tree.rb +5 -1
  24. data/lib/rugged/version.rb +1 -1
  25. data/vendor/libgit2/CMakeLists.txt +132 -288
  26. data/vendor/libgit2/COPYING +106 -19
  27. data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
  28. data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
  29. data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
  30. data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
  31. data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
  32. data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
  33. data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
  34. data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
  35. data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
  36. data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
  37. data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
  38. data/vendor/libgit2/cmake/FindPCRE.cmake +12 -13
  39. data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
  40. data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
  41. data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
  42. data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
  43. data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
  44. data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
  45. data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
  46. data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
  47. data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
  48. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
  49. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
  50. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
  51. data/vendor/libgit2/cmake/SelectHashes.cmake +91 -53
  52. data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
  53. data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
  54. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
  55. data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
  56. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
  57. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +33 -31
  58. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
  59. data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
  60. data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
  61. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
  62. data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
  63. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
  64. data/vendor/libgit2/deps/zlib/adler32.c +7 -0
  65. data/vendor/libgit2/deps/zlib/crc32.c +975 -288
  66. data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
  67. data/vendor/libgit2/deps/zlib/deflate.c +83 -31
  68. data/vendor/libgit2/deps/zlib/deflate.h +12 -15
  69. data/vendor/libgit2/deps/zlib/gzguts.h +3 -2
  70. data/vendor/libgit2/deps/zlib/infback.c +2 -1
  71. data/vendor/libgit2/deps/zlib/inffast.c +14 -14
  72. data/vendor/libgit2/deps/zlib/inflate.c +39 -8
  73. data/vendor/libgit2/deps/zlib/inflate.h +3 -2
  74. data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
  75. data/vendor/libgit2/deps/zlib/trees.c +27 -48
  76. data/vendor/libgit2/deps/zlib/zlib.h +126 -100
  77. data/vendor/libgit2/deps/zlib/zutil.c +2 -2
  78. data/vendor/libgit2/deps/zlib/zutil.h +12 -9
  79. data/vendor/libgit2/include/git2/apply.h +16 -2
  80. data/vendor/libgit2/include/git2/attr.h +11 -2
  81. data/vendor/libgit2/include/git2/blame.h +4 -1
  82. data/vendor/libgit2/include/git2/blob.h +14 -1
  83. data/vendor/libgit2/include/git2/branch.h +4 -2
  84. data/vendor/libgit2/include/git2/buffer.h +18 -78
  85. data/vendor/libgit2/include/git2/cert.h +2 -2
  86. data/vendor/libgit2/include/git2/checkout.h +5 -2
  87. data/vendor/libgit2/include/git2/clone.h +3 -3
  88. data/vendor/libgit2/include/git2/commit.h +2 -0
  89. data/vendor/libgit2/include/git2/common.h +28 -7
  90. data/vendor/libgit2/include/git2/config.h +25 -9
  91. data/vendor/libgit2/include/git2/credential.h +2 -1
  92. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  93. data/vendor/libgit2/include/git2/deprecated.h +9 -1
  94. data/vendor/libgit2/include/git2/describe.h +7 -2
  95. data/vendor/libgit2/include/git2/diff.h +18 -10
  96. data/vendor/libgit2/include/git2/email.h +1 -1
  97. data/vendor/libgit2/include/git2/errors.h +17 -3
  98. data/vendor/libgit2/include/git2/experimental.h +20 -0
  99. data/vendor/libgit2/include/git2/filter.h +7 -2
  100. data/vendor/libgit2/include/git2/graph.h +1 -0
  101. data/vendor/libgit2/include/git2/ignore.h +1 -1
  102. data/vendor/libgit2/include/git2/index.h +11 -5
  103. data/vendor/libgit2/include/git2/indexer.h +48 -0
  104. data/vendor/libgit2/include/git2/merge.h +24 -4
  105. data/vendor/libgit2/include/git2/message.h +2 -0
  106. data/vendor/libgit2/include/git2/object.h +49 -0
  107. data/vendor/libgit2/include/git2/odb.h +94 -13
  108. data/vendor/libgit2/include/git2/odb_backend.h +107 -19
  109. data/vendor/libgit2/include/git2/oid.h +115 -15
  110. data/vendor/libgit2/include/git2/pack.h +24 -8
  111. data/vendor/libgit2/include/git2/patch.h +8 -0
  112. data/vendor/libgit2/include/git2/pathspec.h +1 -1
  113. data/vendor/libgit2/include/git2/proxy.h +1 -1
  114. data/vendor/libgit2/include/git2/rebase.h +9 -1
  115. data/vendor/libgit2/include/git2/refdb.h +3 -0
  116. data/vendor/libgit2/include/git2/reflog.h +1 -1
  117. data/vendor/libgit2/include/git2/refs.h +2 -2
  118. data/vendor/libgit2/include/git2/remote.h +184 -37
  119. data/vendor/libgit2/include/git2/repository.h +34 -10
  120. data/vendor/libgit2/include/git2/reset.h +2 -2
  121. data/vendor/libgit2/include/git2/revparse.h +1 -1
  122. data/vendor/libgit2/include/git2/revwalk.h +4 -1
  123. data/vendor/libgit2/include/git2/signature.h +1 -1
  124. data/vendor/libgit2/include/git2/stash.h +61 -7
  125. data/vendor/libgit2/include/git2/status.h +14 -5
  126. data/vendor/libgit2/include/git2/strarray.h +0 -13
  127. data/vendor/libgit2/include/git2/submodule.h +7 -2
  128. data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
  129. data/vendor/libgit2/include/git2/sys/odb_backend.h +3 -6
  130. data/vendor/libgit2/include/git2/sys/remote.h +46 -0
  131. data/vendor/libgit2/include/git2/sys/stream.h +1 -1
  132. data/vendor/libgit2/include/git2/sys/transport.h +46 -39
  133. data/vendor/libgit2/include/git2/tag.h +1 -0
  134. data/vendor/libgit2/include/git2/tree.h +4 -3
  135. data/vendor/libgit2/include/git2/types.h +7 -7
  136. data/vendor/libgit2/include/git2/version.h +27 -6
  137. data/vendor/libgit2/include/git2/worktree.h +12 -2
  138. data/vendor/libgit2/include/git2.h +1 -0
  139. data/vendor/libgit2/src/CMakeLists.txt +177 -419
  140. data/vendor/libgit2/src/README.md +12 -0
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +57 -0
  142. data/vendor/libgit2/src/cli/README.md +26 -0
  143. data/vendor/libgit2/src/cli/cli.h +20 -0
  144. data/vendor/libgit2/src/cli/cmd.c +21 -0
  145. data/vendor/libgit2/src/cli/cmd.h +33 -0
  146. data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
  147. data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +154 -0
  149. data/vendor/libgit2/src/cli/cmd_help.c +86 -0
  150. data/vendor/libgit2/src/cli/error.h +51 -0
  151. data/vendor/libgit2/src/cli/main.c +106 -0
  152. data/vendor/libgit2/src/cli/opt.c +669 -0
  153. data/vendor/libgit2/src/cli/opt.h +349 -0
  154. data/vendor/libgit2/src/cli/opt_usage.c +194 -0
  155. data/vendor/libgit2/src/cli/opt_usage.h +35 -0
  156. data/vendor/libgit2/src/cli/progress.c +345 -0
  157. data/vendor/libgit2/src/cli/progress.h +117 -0
  158. data/vendor/libgit2/src/cli/sighandler.h +20 -0
  159. data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
  160. data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
  161. data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
  162. data/vendor/libgit2/src/libgit2/CMakeLists.txt +141 -0
  163. data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +1 -1
  164. data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +2 -2
  165. data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +18 -18
  166. data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +2 -2
  167. data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +18 -18
  168. data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +18 -18
  169. data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +4 -4
  170. data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +18 -13
  171. data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +2 -0
  172. data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +1 -1
  173. data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +38 -29
  174. data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +3 -3
  175. data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +164 -118
  176. data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +15 -3
  177. data/vendor/libgit2/src/libgit2/buf.c +126 -0
  178. data/vendor/libgit2/src/libgit2/buf.h +50 -0
  179. data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +74 -68
  180. data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +13 -13
  181. data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +96 -67
  182. data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +178 -73
  183. data/vendor/libgit2/src/libgit2/commit.h +87 -0
  184. data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +122 -89
  185. data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +14 -4
  186. data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +7 -4
  187. data/vendor/libgit2/src/libgit2/common.h +55 -0
  188. data/vendor/libgit2/src/{config.c → libgit2/config.c} +101 -69
  189. data/vendor/libgit2/src/{config.h → libgit2/config.h} +15 -2
  190. data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +105 -93
  191. data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +9 -9
  192. data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +27 -23
  193. data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +24 -21
  194. data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +35 -27
  195. data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +30 -9
  196. data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +2 -4
  197. data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +34 -36
  198. data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +3 -3
  199. data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +44 -26
  200. data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +47 -18
  201. data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +5 -3
  202. data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +112 -100
  203. data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +40 -29
  204. data/vendor/libgit2/src/libgit2/diff_stats.h +18 -0
  205. data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +13 -8
  206. data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +4 -8
  207. data/vendor/libgit2/src/{email.c → libgit2/email.c} +55 -39
  208. data/vendor/libgit2/src/{email.h → libgit2/email.h} +1 -1
  209. data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +18 -18
  210. data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
  211. data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
  212. data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +72 -27
  213. data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +1 -1
  214. data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +23 -23
  215. data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +127 -53
  216. data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +26 -5
  217. data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +20 -20
  218. data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +35 -34
  219. data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +2 -2
  220. data/vendor/libgit2/src/{index.c → libgit2/index.c} +91 -90
  221. data/vendor/libgit2/src/{index.h → libgit2/index.h} +6 -3
  222. data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +173 -92
  223. data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +71 -61
  224. data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +5 -5
  225. data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +46 -11
  226. data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +38 -36
  227. data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +30 -30
  228. data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +1 -14
  229. data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +2 -2
  230. data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +13 -3
  231. data/vendor/libgit2/src/{message.c → libgit2/message.c} +21 -10
  232. data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +112 -92
  233. data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +5 -4
  234. data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +15 -12
  235. data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +5 -2
  236. data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +1 -2
  237. data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +1 -1
  238. data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +25 -34
  239. data/vendor/libgit2/src/{object.c → libgit2/object.c} +135 -30
  240. data/vendor/libgit2/src/{object.h → libgit2/object.h} +12 -3
  241. data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +228 -81
  242. data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +44 -5
  243. data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +192 -134
  244. data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +18 -5
  245. data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +137 -85
  246. data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +136 -90
  247. data/vendor/libgit2/src/libgit2/oid.h +273 -0
  248. data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
  249. data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +56 -30
  250. data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +11 -6
  251. data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +114 -84
  252. data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +31 -16
  253. data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +4 -3
  254. data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +3 -3
  255. data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +1 -0
  256. data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +27 -11
  257. data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +5 -5
  258. data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +29 -29
  259. data/vendor/libgit2/src/libgit2/path.c +375 -0
  260. data/vendor/libgit2/src/libgit2/path.h +68 -0
  261. data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +6 -6
  262. data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +2 -2
  263. data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +4 -1
  264. data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +1 -1
  265. data/vendor/libgit2/src/{push.c → libgit2/push.c} +43 -38
  266. data/vendor/libgit2/src/{push.h → libgit2/push.h} +4 -16
  267. data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +9 -9
  268. data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +2 -2
  269. data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +119 -107
  270. data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +506 -197
  271. data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +7 -5
  272. data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +1 -2
  273. data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +34 -32
  274. data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +2 -2
  275. data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +32 -37
  276. data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +5 -2
  277. data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +718 -420
  278. data/vendor/libgit2/src/libgit2/remote.h +100 -0
  279. data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +629 -386
  280. data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +20 -9
  281. data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +8 -5
  282. data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +14 -14
  283. data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +71 -42
  284. data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +12 -8
  285. data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +12 -6
  286. data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +1 -1
  287. data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +235 -61
  288. data/vendor/libgit2/src/{status.c → libgit2/status.c} +4 -1
  289. data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +1 -0
  290. data/vendor/libgit2/src/libgit2/strarray.h +25 -0
  291. data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +8 -6
  292. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +1 -1
  293. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +7 -3
  294. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +3 -3
  295. data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +4 -1
  296. data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +177 -161
  297. data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +1 -1
  298. data/vendor/libgit2/src/libgit2/sysdir.c +650 -0
  299. data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +53 -18
  300. data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +73 -42
  301. data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +2 -2
  302. data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +3 -3
  303. data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +2 -2
  304. data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +1 -14
  305. data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +5 -22
  306. data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +1 -1
  307. data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +1 -1
  308. data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +10 -10
  309. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +7 -9
  310. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +2 -3
  311. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +12 -13
  312. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +10 -10
  313. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -1
  314. data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +9 -11
  315. data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +41 -20
  316. data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +2 -3
  317. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +75 -66
  318. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +10 -0
  319. data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +138 -116
  320. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +92 -133
  321. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +35 -32
  322. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +177 -65
  323. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +97 -49
  324. data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +365 -198
  325. data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +58 -59
  326. data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +8 -8
  327. data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +2 -2
  328. data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +93 -83
  329. data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +4 -4
  330. data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +121 -94
  331. data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +1 -1
  332. data/vendor/libgit2/src/libgit2/xdiff/git-xdiff.h +53 -0
  333. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +15 -15
  334. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +134 -108
  335. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +23 -7
  336. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +87 -78
  337. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +1 -12
  338. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +104 -117
  339. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +6 -17
  340. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +15 -20
  341. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +18 -7
  342. data/vendor/libgit2/src/util/CMakeLists.txt +80 -0
  343. data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
  344. data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
  345. data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
  346. data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
  347. data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
  348. data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +1 -1
  349. data/vendor/libgit2/src/{date.c → util/date.c} +14 -20
  350. data/vendor/libgit2/src/util/date.h +33 -0
  351. data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +29 -29
  352. data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +2 -2
  353. data/vendor/libgit2/src/{path.c → util/fs_path.c} +453 -647
  354. data/vendor/libgit2/src/{path.h → util/fs_path.h} +221 -188
  355. data/vendor/libgit2/src/{futils.c → util/futils.c} +135 -90
  356. data/vendor/libgit2/src/{futils.h → util/futils.h} +28 -15
  357. data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +15 -1
  358. data/vendor/libgit2/src/{common.h → util/git2_util.h} +20 -59
  359. data/vendor/libgit2/src/util/hash/builtin.c +53 -0
  360. data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
  361. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +3 -3
  362. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
  363. data/vendor/libgit2/src/util/hash/common_crypto.c +112 -0
  364. data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
  365. data/vendor/libgit2/src/util/hash/mbedtls.c +92 -0
  366. data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
  367. data/vendor/libgit2/src/util/hash/openssl.c +195 -0
  368. data/vendor/libgit2/src/util/hash/openssl.h +45 -0
  369. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +243 -0
  370. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
  371. data/vendor/libgit2/src/util/hash/sha.h +70 -0
  372. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +1 -1
  373. data/vendor/libgit2/src/util/hash/win32.c +549 -0
  374. data/vendor/libgit2/src/util/hash/win32.h +60 -0
  375. data/vendor/libgit2/src/util/hash.c +158 -0
  376. data/vendor/libgit2/src/util/hash.h +61 -0
  377. data/vendor/libgit2/src/{khash.h → util/khash.h} +1 -1
  378. data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
  379. data/vendor/libgit2/src/util/net.c +1003 -0
  380. data/vendor/libgit2/src/{net.h → util/net.h} +18 -4
  381. data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
  382. data/vendor/libgit2/src/{posix.c → util/posix.c} +3 -3
  383. data/vendor/libgit2/src/{posix.h → util/posix.h} +4 -1
  384. data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +2 -2
  385. data/vendor/libgit2/src/util/rand.c +234 -0
  386. data/vendor/libgit2/src/util/rand.h +37 -0
  387. data/vendor/libgit2/src/{regexp.c → util/regexp.c} +4 -4
  388. data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
  389. data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
  390. data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
  391. data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +1 -1
  392. data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +2 -2
  393. data/vendor/libgit2/src/{buffer.c → util/str.c} +157 -151
  394. data/vendor/libgit2/src/util/str.h +357 -0
  395. data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
  396. data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
  397. data/vendor/libgit2/src/{thread.h → util/thread.h} +23 -22
  398. data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
  399. data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -3
  400. data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -4
  401. data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -3
  402. data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
  403. data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
  404. data/vendor/libgit2/src/{util.c → util/util.c} +15 -15
  405. data/vendor/libgit2/src/{util.h → util/util.h} +4 -29
  406. data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
  407. data/vendor/libgit2/src/{vector.h → util/vector.h} +2 -2
  408. data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
  409. data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
  410. data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
  411. data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
  412. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +140 -9
  413. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +3 -1
  414. data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -2
  415. data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +12 -28
  416. data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
  417. data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
  418. data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
  419. data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
  420. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +2 -3
  421. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +3 -4
  422. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +1 -1
  423. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
  424. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
  425. data/vendor/libgit2/src/{zstream.c → util/zstream.c} +5 -5
  426. data/vendor/libgit2/src/{zstream.h → util/zstream.h} +5 -5
  427. metadata +402 -356
  428. data/vendor/libgit2/src/buffer.h +0 -374
  429. data/vendor/libgit2/src/commit.h +0 -46
  430. data/vendor/libgit2/src/hash/sha1/common_crypto.c +0 -57
  431. data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
  432. data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
  433. data/vendor/libgit2/src/hash/sha1/mbedtls.c +0 -46
  434. data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
  435. data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
  436. data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
  437. data/vendor/libgit2/src/hash/sha1.h +0 -38
  438. data/vendor/libgit2/src/hash.c +0 -110
  439. data/vendor/libgit2/src/hash.h +0 -46
  440. data/vendor/libgit2/src/message.h +0 -17
  441. data/vendor/libgit2/src/net.c +0 -540
  442. data/vendor/libgit2/src/oid.h +0 -51
  443. data/vendor/libgit2/src/remote.h +0 -55
  444. data/vendor/libgit2/src/sysdir.c +0 -347
  445. data/vendor/libgit2/src/win32/findfile.c +0 -230
  446. data/vendor/libgit2/src/win32/findfile.h +0 -19
  447. /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
  448. /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
  449. /data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
  450. /data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
  451. /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
  452. /data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
  453. /data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
  454. /data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
  455. /data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
  456. /data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
  457. /data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
  458. /data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
  459. /data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
  460. /data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
  461. /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
  462. /data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
  463. /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
  464. /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
  465. /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
  466. /data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
  467. /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
  468. /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
  469. /data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
  470. /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
  471. /data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
  472. /data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
  473. /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
  474. /data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
  475. /data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
  476. /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
  477. /data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
  478. /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
  479. /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
  480. /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
  481. /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
  482. /data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
  483. /data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
  484. /data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
  485. /data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
  486. /data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
  487. /data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
  488. /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
  489. /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
  490. /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
  491. /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
  492. /data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
  493. /data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
  494. /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
  495. /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
  496. /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
  497. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
  498. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
  499. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
  500. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
  501. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
  502. /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
  503. /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
  504. /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
  505. /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
  506. /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
  507. /data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
  508. /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
  509. /data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
  510. /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
  511. /data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
  512. /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
  513. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
  514. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
  515. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
  516. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
  517. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
  518. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
  519. /data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
  520. /data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
  521. /data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
  522. /data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
  523. /data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
  524. /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
  525. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
  526. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
  527. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
  528. /data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
  529. /data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
  530. /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
  531. /data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
  532. /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
  533. /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
  534. /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
  535. /data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
  536. /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
  537. /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
  538. /data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
  539. /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
  540. /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
  541. /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
  542. /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
  543. /data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
  544. /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
  545. /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
  546. /data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
  547. /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
@@ -12,12 +12,11 @@
12
12
  #endif
13
13
 
14
14
  #include "runtime.h"
15
- #include "git2.h"
16
- #include "buffer.h"
17
15
  #include "net.h"
18
16
  #include "netops.h"
19
17
  #include "smart.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"
@@ -26,8 +25,6 @@
26
25
 
27
26
  #define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport)
28
27
 
29
- static const char *ssh_prefixes[] = { "ssh://", "ssh+git://", "git+ssh://" };
30
-
31
28
  static const char cmd_uploadpack[] = "git-upload-pack";
32
29
  static const char cmd_receivepack[] = "git-receive-pack";
33
30
 
@@ -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
 
@@ -226,13 +207,12 @@ static void ssh_stream_free(git_smart_subtransport_stream *stream)
226
207
  s->io = NULL;
227
208
  }
228
209
 
229
- git__free(s->url);
210
+ git_net_url_dispose(&s->url);
230
211
  git__free(s);
231
212
  }
232
213
 
233
214
  static int ssh_stream_alloc(
234
215
  ssh_subtransport *t,
235
- const char *url,
236
216
  const char *cmd,
237
217
  git_smart_subtransport_stream **stream)
238
218
  {
@@ -250,47 +230,10 @@ static int ssh_stream_alloc(
250
230
 
251
231
  s->cmd = cmd;
252
232
 
253
- s->url = git__strdup(url);
254
- if (!s->url) {
255
- git__free(s);
256
- return -1;
257
- }
258
-
259
233
  *stream = &s->parent;
260
234
  return 0;
261
235
  }
262
236
 
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
237
  static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
295
238
  int rc = LIBSSH2_ERROR_NONE;
296
239
 
@@ -303,8 +246,10 @@ static int ssh_agent_auth(LIBSSH2_SESSION *session, git_credential_ssh_key *c) {
303
246
 
304
247
  rc = libssh2_agent_connect(agent);
305
248
 
306
- if (rc != LIBSSH2_ERROR_NONE)
249
+ if (rc != LIBSSH2_ERROR_NONE) {
250
+ rc = LIBSSH2_ERROR_AUTHENTICATION_FAILED;
307
251
  goto shutdown;
252
+ }
308
253
 
309
254
  rc = libssh2_agent_list_identities(agent);
310
255
 
@@ -443,11 +388,15 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
443
388
  int error, no_callback = 0;
444
389
  git_credential *cred = NULL;
445
390
 
446
- if (!t->owner->cred_acquire_cb) {
391
+ if (!t->owner->connect_opts.callbacks.credentials) {
447
392
  no_callback = 1;
448
393
  } else {
449
- error = t->owner->cred_acquire_cb(&cred, t->owner->url, user, auth_methods,
450
- t->owner->cred_acquire_payload);
394
+ error = t->owner->connect_opts.callbacks.credentials(
395
+ &cred,
396
+ t->owner->url,
397
+ user,
398
+ auth_methods,
399
+ t->owner->connect_opts.callbacks.payload);
451
400
 
452
401
  if (error == GIT_PASSTHROUGH) {
453
402
  no_callback = 1;
@@ -475,15 +424,116 @@ static int request_creds(git_credential **out, ssh_subtransport *t, const char *
475
424
  return 0;
476
425
  }
477
426
 
427
+ #define SSH_DIR ".ssh"
428
+ #define KNOWN_HOSTS_FILE "known_hosts"
429
+
430
+ /*
431
+ * Load the known_hosts file.
432
+ *
433
+ * Returns success but leaves the output NULL if we couldn't find the file.
434
+ */
435
+ static int load_known_hosts(LIBSSH2_KNOWNHOSTS **hosts, LIBSSH2_SESSION *session)
436
+ {
437
+ git_str path = GIT_STR_INIT, sshdir = GIT_STR_INIT;
438
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
439
+ int error;
440
+
441
+ GIT_ASSERT_ARG(hosts);
442
+
443
+ if ((error = git_sysdir_expand_homedir_file(&sshdir, SSH_DIR)) < 0 ||
444
+ (error = git_str_joinpath(&path, git_str_cstr(&sshdir), KNOWN_HOSTS_FILE)) < 0)
445
+ goto out;
446
+
447
+ if ((known_hosts = libssh2_knownhost_init(session)) == NULL) {
448
+ ssh_error(session, "error initializing known hosts");
449
+ error = -1;
450
+ goto out;
451
+ }
452
+
453
+ /*
454
+ * Try to read the file and consider not finding it as not trusting the
455
+ * host rather than an error.
456
+ */
457
+ error = libssh2_knownhost_readfile(known_hosts, git_str_cstr(&path), LIBSSH2_KNOWNHOST_FILE_OPENSSH);
458
+ if (error == LIBSSH2_ERROR_FILE)
459
+ error = 0;
460
+ if (error < 0)
461
+ ssh_error(session, "error reading known_hosts");
462
+
463
+ out:
464
+ *hosts = known_hosts;
465
+
466
+ git_str_dispose(&sshdir);
467
+ git_str_dispose(&path);
468
+
469
+ return error;
470
+ }
471
+
472
+ static void add_hostkey_pref_if_avail(
473
+ LIBSSH2_KNOWNHOSTS *known_hosts,
474
+ const char *hostname,
475
+ int port,
476
+ git_str *prefs,
477
+ int type,
478
+ const char *type_name)
479
+ {
480
+ struct libssh2_knownhost *host = NULL;
481
+ const char key = '\0';
482
+ int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW | type;
483
+ int error;
484
+
485
+ error = libssh2_knownhost_checkp(known_hosts, hostname, port, &key, 1, mask, &host);
486
+ if (error == LIBSSH2_KNOWNHOST_CHECK_MISMATCH) {
487
+ if (git_str_len(prefs) > 0) {
488
+ git_str_putc(prefs, ',');
489
+ }
490
+ git_str_puts(prefs, type_name);
491
+ }
492
+ }
493
+
494
+ /*
495
+ * We figure out what kind of key we want to ask the remote for by trying to
496
+ * look it up with a nonsense key and using that mismatch to figure out what key
497
+ * we do have stored for the host.
498
+ *
499
+ * Populates prefs with the string to pass to libssh2_session_method_pref.
500
+ */
501
+ static void find_hostkey_preference(
502
+ LIBSSH2_KNOWNHOSTS *known_hosts,
503
+ const char *hostname,
504
+ int port,
505
+ git_str *prefs)
506
+ {
507
+ /*
508
+ * The order here is important as it indicates the priority of what will
509
+ * be preferred.
510
+ */
511
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ED25519
512
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ED25519, "ssh-ed25519");
513
+ #endif
514
+ #ifdef LIBSSH2_KNOWNHOST_KEY_ECDSA_256
515
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_256, "ecdsa-sha2-nistp256");
516
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_384, "ecdsa-sha2-nistp384");
517
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_ECDSA_521, "ecdsa-sha2-nistp521");
518
+ #endif
519
+ add_hostkey_pref_if_avail(known_hosts, hostname, port, prefs, LIBSSH2_KNOWNHOST_KEY_SSHRSA, "ssh-rsa");
520
+ }
521
+
478
522
  static int _git_ssh_session_create(
479
523
  LIBSSH2_SESSION **session,
524
+ LIBSSH2_KNOWNHOSTS **hosts,
525
+ const char *hostname,
526
+ int port,
480
527
  git_stream *io)
481
528
  {
482
- int rc = 0;
483
- LIBSSH2_SESSION *s;
484
529
  git_socket_stream *socket = GIT_CONTAINER_OF(io, git_socket_stream, parent);
530
+ LIBSSH2_SESSION *s;
531
+ LIBSSH2_KNOWNHOSTS *known_hosts;
532
+ git_str prefs = GIT_STR_INIT;
533
+ int rc = 0;
485
534
 
486
535
  GIT_ASSERT_ARG(session);
536
+ GIT_ASSERT_ARG(hosts);
487
537
 
488
538
  s = libssh2_session_init();
489
539
  if (!s) {
@@ -491,175 +541,292 @@ static int _git_ssh_session_create(
491
541
  return -1;
492
542
  }
493
543
 
544
+ if ((rc = load_known_hosts(&known_hosts, s)) < 0) {
545
+ ssh_error(s, "error loading known_hosts");
546
+ libssh2_session_free(s);
547
+ return -1;
548
+ }
549
+
550
+ find_hostkey_preference(known_hosts, hostname, port, &prefs);
551
+ if (git_str_len(&prefs) > 0) {
552
+ do {
553
+ rc = libssh2_session_method_pref(s, LIBSSH2_METHOD_HOSTKEY, git_str_cstr(&prefs));
554
+ } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
555
+ if (rc != LIBSSH2_ERROR_NONE) {
556
+ ssh_error(s, "failed to set hostkey preference");
557
+ goto on_error;
558
+ }
559
+ }
560
+ git_str_dispose(&prefs);
561
+
494
562
  do {
495
563
  rc = libssh2_session_handshake(s, socket->s);
496
564
  } while (LIBSSH2_ERROR_EAGAIN == rc || LIBSSH2_ERROR_TIMEOUT == rc);
497
565
 
498
566
  if (rc != LIBSSH2_ERROR_NONE) {
499
567
  ssh_error(s, "failed to start SSH session");
500
- libssh2_session_free(s);
501
- return -1;
568
+ goto on_error;
502
569
  }
503
570
 
504
571
  libssh2_session_set_blocking(s, 1);
505
572
 
506
573
  *session = s;
574
+ *hosts = known_hosts;
507
575
 
508
576
  return 0;
577
+
578
+ on_error:
579
+ libssh2_knownhost_free(known_hosts);
580
+ libssh2_session_free(s);
581
+ return -1;
509
582
  }
510
583
 
511
- #define SSH_DEFAULT_PORT "22"
512
584
 
513
- static int _git_ssh_setup_conn(
514
- ssh_subtransport *t,
515
- const char *url,
516
- const char *cmd,
517
- git_smart_subtransport_stream **stream)
585
+ /*
586
+ * Returns the typemask argument to pass to libssh2_knownhost_check{,p} based on
587
+ * the type of key that libssh2_session_hostkey returns.
588
+ */
589
+ static int fingerprint_type_mask(int keytype)
518
590
  {
519
- git_net_url urldata = GIT_NET_URL_INIT;
520
- int auth_methods, error = 0;
521
- size_t i;
522
- ssh_stream *s;
523
- git_credential *cred = NULL;
524
- LIBSSH2_SESSION *session=NULL;
525
- LIBSSH2_CHANNEL *channel=NULL;
591
+ int mask = LIBSSH2_KNOWNHOST_TYPE_PLAIN | LIBSSH2_KNOWNHOST_KEYENC_RAW;
592
+ return mask;
593
+
594
+ switch (keytype) {
595
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
596
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHRSA;
597
+ break;
598
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
599
+ mask |= LIBSSH2_KNOWNHOST_KEY_SSHDSS;
600
+ break;
601
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ECDSA_256
602
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
603
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_256;
604
+ break;
605
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
606
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_384;
607
+ break;
608
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_521:
609
+ mask |= LIBSSH2_KNOWNHOST_KEY_ECDSA_521;
610
+ break;
611
+ #endif
612
+ #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
613
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
614
+ mask |= LIBSSH2_KNOWNHOST_KEY_ED25519;
615
+ break;
616
+ #endif
617
+ }
526
618
 
527
- t->current_stream = NULL;
619
+ return mask;
620
+ }
528
621
 
529
- *stream = NULL;
530
- if (ssh_stream_alloc(t, url, cmd, stream) < 0)
531
- return -1;
622
+ /*
623
+ * Check the host against the user's known_hosts file.
624
+ *
625
+ * Returns 1/0 for valid/''not-valid or <0 for an error
626
+ */
627
+ static int check_against_known_hosts(
628
+ LIBSSH2_SESSION *session,
629
+ LIBSSH2_KNOWNHOSTS *known_hosts,
630
+ const char *hostname,
631
+ int port,
632
+ const char *key,
633
+ size_t key_len,
634
+ int key_type)
635
+ {
636
+ int check, typemask, ret = 0;
637
+ struct libssh2_knownhost *host = NULL;
532
638
 
533
- s = (ssh_stream *)*stream;
534
- s->session = NULL;
535
- s->channel = NULL;
639
+ if (known_hosts == NULL)
640
+ return 0;
536
641
 
537
- for (i = 0; i < ARRAY_SIZE(ssh_prefixes); ++i) {
538
- const char *p = ssh_prefixes[i];
642
+ typemask = fingerprint_type_mask(key_type);
643
+ check = libssh2_knownhost_checkp(known_hosts, hostname, port, key, key_len, typemask, &host);
644
+ if (check == LIBSSH2_KNOWNHOST_CHECK_FAILURE) {
645
+ ssh_error(session, "error checking for known host");
646
+ return -1;
647
+ }
539
648
 
540
- if (!git__prefixcmp(url, p)) {
541
- if ((error = git_net_url_parse(&urldata, url)) < 0)
542
- goto done;
649
+ ret = check == LIBSSH2_KNOWNHOST_CHECK_MATCH ? 1 : 0;
543
650
 
544
- goto post_extract;
545
- }
546
- }
547
- if ((error = git_ssh_extract_url_parts(&urldata, url)) < 0)
548
- goto done;
651
+ return ret;
652
+ }
549
653
 
550
- if (urldata.port == NULL)
551
- urldata.port = git__strdup(SSH_DEFAULT_PORT);
654
+ /*
655
+ * Perform the check for the session's certificate against known hosts if
656
+ * possible and then ask the user if they have a callback.
657
+ *
658
+ * Returns 1/0 for valid/not-valid or <0 for an error
659
+ */
660
+ static int check_certificate(
661
+ LIBSSH2_SESSION *session,
662
+ LIBSSH2_KNOWNHOSTS *known_hosts,
663
+ git_transport_certificate_check_cb check_cb,
664
+ void *check_cb_payload,
665
+ const char *host,
666
+ int port)
667
+ {
668
+ git_cert_hostkey cert = {{ 0 }};
669
+ const char *key;
670
+ size_t cert_len;
671
+ int cert_type, cert_valid = 0, error = 0;
552
672
 
553
- GIT_ERROR_CHECK_ALLOC(urldata.port);
673
+ if ((key = libssh2_session_hostkey(session, &cert_len, &cert_type)) == NULL) {
674
+ ssh_error(session, "failed to retrieve hostkey");
675
+ return -1;
676
+ }
554
677
 
555
- post_extract:
556
- if ((error = git_socket_stream_new(&s->io, urldata.host, urldata.port)) < 0 ||
557
- (error = git_stream_connect(s->io)) < 0)
558
- goto done;
678
+ if ((cert_valid = check_against_known_hosts(session, known_hosts, host, port, key, cert_len, cert_type)) < 0)
679
+ return -1;
559
680
 
560
- if ((error = _git_ssh_session_create(&session, s->io)) < 0)
561
- goto done;
681
+ cert.parent.cert_type = GIT_CERT_HOSTKEY_LIBSSH2;
682
+ if (key != NULL) {
683
+ cert.type |= GIT_CERT_SSH_RAW;
684
+ cert.hostkey = key;
685
+ cert.hostkey_len = cert_len;
686
+ switch (cert_type) {
687
+ case LIBSSH2_HOSTKEY_TYPE_RSA:
688
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_RSA;
689
+ break;
690
+ case LIBSSH2_HOSTKEY_TYPE_DSS:
691
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_DSS;
692
+ break;
562
693
 
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
694
  #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;
695
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_256:
696
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_256;
697
+ break;
698
+ case LIBSSH2_HOSTKEY_TYPE_ECDSA_384:
699
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_384;
700
+ break;
701
+ case LIBSSH2_KNOWNHOST_KEY_ECDSA_521:
702
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ECDSA_521;
703
+ break;
594
704
  #endif
595
-
705
+
596
706
  #ifdef LIBSSH2_HOSTKEY_TYPE_ED25519
597
- case LIBSSH2_HOSTKEY_TYPE_ED25519:
598
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
599
- break;
707
+ case LIBSSH2_HOSTKEY_TYPE_ED25519:
708
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_KEY_ED25519;
709
+ break;
600
710
  #endif
601
- default:
602
- cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
603
- }
711
+ default:
712
+ cert.raw_type = GIT_CERT_SSH_RAW_TYPE_UNKNOWN;
604
713
  }
714
+ }
605
715
 
606
716
  #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
- }
717
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA256);
718
+ if (key != NULL) {
719
+ cert.type |= GIT_CERT_SSH_SHA256;
720
+ memcpy(&cert.hash_sha256, key, 32);
721
+ }
612
722
  #endif
613
723
 
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
- }
724
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_SHA1);
725
+ if (key != NULL) {
726
+ cert.type |= GIT_CERT_SSH_SHA1;
727
+ memcpy(&cert.hash_sha1, key, 20);
728
+ }
619
729
 
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
- }
730
+ key = libssh2_hostkey_hash(session, LIBSSH2_HOSTKEY_HASH_MD5);
731
+ if (key != NULL) {
732
+ cert.type |= GIT_CERT_SSH_MD5;
733
+ memcpy(&cert.hash_md5, key, 16);
734
+ }
625
735
 
626
- if (cert.type == 0) {
627
- git_error_set(GIT_ERROR_SSH, "unable to get the host key");
628
- error = -1;
629
- goto done;
736
+ if (cert.type == 0) {
737
+ git_error_set(GIT_ERROR_SSH, "unable to get the host key");
738
+ return -1;
739
+ }
740
+
741
+ git_error_clear();
742
+ error = 0;
743
+ if (!cert_valid) {
744
+ git_error_set(GIT_ERROR_SSH, "invalid or unknown remote ssh hostkey");
745
+ error = GIT_ECERTIFICATE;
746
+ }
747
+
748
+ if (check_cb != NULL) {
749
+ git_cert_hostkey *cert_ptr = &cert;
750
+ git_error_state previous_error = {0};
751
+
752
+ git_error_state_capture(&previous_error, error);
753
+ error = check_cb((git_cert *) cert_ptr, cert_valid, host, check_cb_payload);
754
+ if (error == GIT_PASSTHROUGH) {
755
+ error = git_error_state_restore(&previous_error);
756
+ } else if (error < 0 && !git_error_last()) {
757
+ git_error_set(GIT_ERROR_NET, "unknown remote host key");
630
758
  }
631
759
 
632
- /* We don't currently trust any hostkeys */
633
- git_error_clear();
760
+ git_error_state_free(&previous_error);
761
+ }
634
762
 
635
- cert_ptr = &cert;
763
+ return error;
764
+ }
636
765
 
637
- error = t->owner->certificate_check_cb((git_cert *) cert_ptr, 0, urldata.host, t->owner->message_cb_payload);
766
+ #define SSH_DEFAULT_PORT "22"
638
767
 
639
- if (error < 0 && error != GIT_PASSTHROUGH) {
640
- if (!git_error_last())
641
- git_error_set(GIT_ERROR_NET, "user cancelled hostkey check");
768
+ static int _git_ssh_setup_conn(
769
+ ssh_subtransport *t,
770
+ const char *url,
771
+ const char *cmd,
772
+ git_smart_subtransport_stream **stream)
773
+ {
774
+ int auth_methods, error = 0, port;
775
+ ssh_stream *s;
776
+ git_credential *cred = NULL;
777
+ LIBSSH2_SESSION *session=NULL;
778
+ LIBSSH2_CHANNEL *channel=NULL;
779
+ LIBSSH2_KNOWNHOSTS *known_hosts = NULL;
642
780
 
643
- goto done;
644
- }
781
+ t->current_stream = NULL;
782
+
783
+ *stream = NULL;
784
+ if (ssh_stream_alloc(t, cmd, stream) < 0)
785
+ return -1;
786
+
787
+ s = (ssh_stream *)*stream;
788
+ s->session = NULL;
789
+ s->channel = NULL;
790
+
791
+ if ((error = git_net_url_parse_standard_or_scp(&s->url, url)) < 0 ||
792
+ (error = git_socket_stream_new(&s->io, s->url.host, s->url.port)) < 0 ||
793
+ (error = git_stream_connect(s->io)) < 0)
794
+ goto done;
795
+
796
+ /*
797
+ * Try to parse the port as a number, if we can't then fall back to
798
+ * default. It would be nice if we could get the port that was resolved
799
+ * as part of the stream connection, but that's not something that's
800
+ * exposed.
801
+ */
802
+ if (git__strntol32(&port, s->url.port, strlen(s->url.port), NULL, 10) < 0) {
803
+ git_error_set(GIT_ERROR_NET, "invalid port to ssh: %s", s->url.port);
804
+ error = -1;
805
+ goto done;
645
806
  }
646
807
 
808
+ if ((error = _git_ssh_session_create(&session, &known_hosts, s->url.host, port, s->io)) < 0)
809
+ goto done;
810
+
811
+ 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)
812
+ goto done;
813
+
647
814
  /* we need the username to ask for auth methods */
648
- if (!urldata.username) {
815
+ if (!s->url.username) {
649
816
  if ((error = request_creds(&cred, t, NULL, GIT_CREDENTIAL_USERNAME)) < 0)
650
817
  goto done;
651
818
 
652
- urldata.username = git__strdup(((git_credential_username *) cred)->username);
819
+ s->url.username = git__strdup(((git_credential_username *) cred)->username);
653
820
  cred->free(cred);
654
821
  cred = NULL;
655
- if (!urldata.username)
822
+ if (!s->url.username)
656
823
  goto done;
657
- } else if (urldata.username && urldata.password) {
658
- if ((error = git_credential_userpass_plaintext_new(&cred, urldata.username, urldata.password)) < 0)
824
+ } else if (s->url.username && s->url.password) {
825
+ if ((error = git_credential_userpass_plaintext_new(&cred, s->url.username, s->url.password)) < 0)
659
826
  goto done;
660
827
  }
661
828
 
662
- if ((error = list_auth_methods(&auth_methods, session, urldata.username)) < 0)
829
+ if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
663
830
  goto done;
664
831
 
665
832
  error = GIT_EAUTH;
@@ -673,10 +840,10 @@ post_extract:
673
840
  cred = NULL;
674
841
  }
675
842
 
676
- if ((error = request_creds(&cred, t, urldata.username, auth_methods)) < 0)
843
+ if ((error = request_creds(&cred, t, s->url.username, auth_methods)) < 0)
677
844
  goto done;
678
845
 
679
- if (strcmp(urldata.username, git_credential_get_username(cred))) {
846
+ if (strcmp(s->url.username, git_credential_get_username(cred))) {
680
847
  git_error_set(GIT_ERROR_SSH, "username does not match previous request");
681
848
  error = -1;
682
849
  goto done;
@@ -686,7 +853,7 @@ post_extract:
686
853
 
687
854
  if (error == GIT_EAUTH) {
688
855
  /* refresh auth methods */
689
- if ((error = list_auth_methods(&auth_methods, session, urldata.username)) < 0)
856
+ if ((error = list_auth_methods(&auth_methods, session, s->url.username)) < 0)
690
857
  goto done;
691
858
  else
692
859
  error = GIT_EAUTH;
@@ -714,6 +881,8 @@ done:
714
881
  if (error < 0) {
715
882
  ssh_stream_free(*stream);
716
883
 
884
+ if (known_hosts)
885
+ libssh2_knownhost_free(known_hosts);
717
886
  if (session)
718
887
  libssh2_session_free(session);
719
888
  }
@@ -721,8 +890,6 @@ done:
721
890
  if (cred)
722
891
  cred->free(cred);
723
892
 
724
- git_net_url_dispose(&urldata);
725
-
726
893
  return error;
727
894
  }
728
895
 
@@ -839,7 +1006,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
839
1006
 
840
1007
  /* either error, or the remote accepts NONE auth, which is bizarre, let's punt */
841
1008
  if (list == NULL && !libssh2_userauth_authenticated(session)) {
842
- ssh_error(session, "Failed to retrieve list of SSH authentication methods");
1009
+ ssh_error(session, "remote rejected authentication");
843
1010
  return GIT_EAUTH;
844
1011
  }
845
1012
 
@@ -870,7 +1037,7 @@ static int list_auth_methods(int *out, LIBSSH2_SESSION *session, const char *use
870
1037
  continue;
871
1038
  }
872
1039
 
873
- /* Skipt it if we don't know it */
1040
+ /* Skip it if we don't know it */
874
1041
  ptr = strchr(ptr, ',');
875
1042
  }
876
1043