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
@@ -0,0 +1,1160 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "net.h"
9
+
10
+ #include <ctype.h>
11
+
12
+ #include "posix.h"
13
+ #include "str.h"
14
+ #include "runtime.h"
15
+
16
+ #define DEFAULT_PORT_HTTP "80"
17
+ #define DEFAULT_PORT_HTTPS "443"
18
+ #define DEFAULT_PORT_GIT "9418"
19
+ #define DEFAULT_PORT_SSH "22"
20
+
21
+ #define GIT_NET_URL_PARSER_INIT { 0 }
22
+
23
+ typedef struct {
24
+ unsigned int hierarchical : 1;
25
+
26
+ const char *scheme;
27
+ const char *user;
28
+ const char *password;
29
+ const char *host;
30
+ const char *port;
31
+ const char *path;
32
+ const char *query;
33
+ const char *fragment;
34
+
35
+ size_t scheme_len;
36
+ size_t user_len;
37
+ size_t password_len;
38
+ size_t host_len;
39
+ size_t port_len;
40
+ size_t path_len;
41
+ size_t query_len;
42
+ size_t fragment_len;
43
+ } git_net_url_parser;
44
+
45
+ bool git_net_hostname_matches_cert(
46
+ const char *hostname,
47
+ const char *pattern)
48
+ {
49
+ for (;;) {
50
+ char c = git__tolower(*pattern++);
51
+
52
+ if (c == '\0')
53
+ return *hostname ? false : true;
54
+
55
+ if (c == '*') {
56
+ c = *pattern;
57
+
58
+ /* '*' at the end matches everything left */
59
+ if (c == '\0')
60
+ return true;
61
+
62
+ /*
63
+ * We've found a pattern, so move towards the
64
+ * next matching char. The '.' is handled
65
+ * specially because wildcards aren't allowed
66
+ * to cross subdomains.
67
+ */
68
+ while(*hostname) {
69
+ char h = git__tolower(*hostname);
70
+
71
+ if (h == c)
72
+ return git_net_hostname_matches_cert(hostname++, pattern);
73
+ else if (h == '.')
74
+ return git_net_hostname_matches_cert(hostname, pattern);
75
+
76
+ hostname++;
77
+ }
78
+
79
+ return false;
80
+ }
81
+
82
+ if (c != git__tolower(*hostname++))
83
+ return false;
84
+ }
85
+
86
+ return false;
87
+ }
88
+
89
+ #define is_valid_scheme_char(c) \
90
+ (((c) >= 'a' && (c) <= 'z') || \
91
+ ((c) >= 'A' && (c) <= 'Z') || \
92
+ ((c) >= '0' && (c) <= '9') || \
93
+ (c) == '+' || (c) == '-' || (c) == '.')
94
+
95
+ bool git_net_str_is_url(const char *str)
96
+ {
97
+ const char *c;
98
+
99
+ for (c = str; *c; c++) {
100
+ if (*c == ':' && *(c+1) == '/' && *(c+2) == '/')
101
+ return true;
102
+
103
+ if (!is_valid_scheme_char(*c))
104
+ break;
105
+ }
106
+
107
+ return false;
108
+ }
109
+
110
+ static const char *default_port_for_scheme(const char *scheme)
111
+ {
112
+ if (strcmp(scheme, "http") == 0)
113
+ return DEFAULT_PORT_HTTP;
114
+ else if (strcmp(scheme, "https") == 0)
115
+ return DEFAULT_PORT_HTTPS;
116
+ else if (strcmp(scheme, "git") == 0)
117
+ return DEFAULT_PORT_GIT;
118
+ else if (strcmp(scheme, "ssh") == 0 ||
119
+ strcmp(scheme, "ssh+git") == 0 ||
120
+ strcmp(scheme, "git+ssh") == 0)
121
+ return DEFAULT_PORT_SSH;
122
+
123
+ return NULL;
124
+ }
125
+
126
+ static bool is_ssh_scheme(const char *scheme, size_t scheme_len)
127
+ {
128
+ if (!scheme_len)
129
+ return false;
130
+
131
+ return strncasecmp(scheme, "ssh", scheme_len) == 0 ||
132
+ strncasecmp(scheme, "ssh+git", scheme_len) == 0 ||
133
+ strncasecmp(scheme, "git+ssh", scheme_len) == 0;
134
+ }
135
+
136
+ int git_net_url_dup(git_net_url *out, git_net_url *in)
137
+ {
138
+ if (in->scheme) {
139
+ out->scheme = git__strdup(in->scheme);
140
+ GIT_ERROR_CHECK_ALLOC(out->scheme);
141
+ }
142
+
143
+ if (in->host) {
144
+ out->host = git__strdup(in->host);
145
+ GIT_ERROR_CHECK_ALLOC(out->host);
146
+ }
147
+
148
+ if (in->port) {
149
+ out->port = git__strdup(in->port);
150
+ GIT_ERROR_CHECK_ALLOC(out->port);
151
+ }
152
+
153
+ if (in->path) {
154
+ out->path = git__strdup(in->path);
155
+ GIT_ERROR_CHECK_ALLOC(out->path);
156
+ }
157
+
158
+ if (in->query) {
159
+ out->query = git__strdup(in->query);
160
+ GIT_ERROR_CHECK_ALLOC(out->query);
161
+ }
162
+
163
+ if (in->username) {
164
+ out->username = git__strdup(in->username);
165
+ GIT_ERROR_CHECK_ALLOC(out->username);
166
+ }
167
+
168
+ if (in->password) {
169
+ out->password = git__strdup(in->password);
170
+ GIT_ERROR_CHECK_ALLOC(out->password);
171
+ }
172
+
173
+ return 0;
174
+ }
175
+
176
+ static int url_invalid(const char *message)
177
+ {
178
+ git_error_set(GIT_ERROR_NET, "invalid url: %s", message);
179
+ return GIT_EINVALIDSPEC;
180
+ }
181
+
182
+ static int url_parse_authority(
183
+ git_net_url_parser *parser,
184
+ const char *authority,
185
+ size_t len)
186
+ {
187
+ const char *c, *hostport_end, *host_end = NULL,
188
+ *userpass_end, *user_end = NULL;
189
+
190
+ enum {
191
+ HOSTPORT, HOST, IPV6, HOST_END, USERPASS, USER
192
+ } state = HOSTPORT;
193
+
194
+ if (len == 0)
195
+ return 0;
196
+
197
+ /*
198
+ * walk the authority backwards so that we can parse google code's
199
+ * ssh urls that are not rfc compliant and allow @ in the username
200
+ */
201
+ for (hostport_end = authority + len, c = hostport_end - 1;
202
+ c >= authority && !user_end;
203
+ c--) {
204
+ switch (state) {
205
+ case HOSTPORT:
206
+ if (*c == ':') {
207
+ parser->port = c + 1;
208
+ parser->port_len = hostport_end - parser->port;
209
+ host_end = c;
210
+ state = HOST;
211
+ break;
212
+ }
213
+
214
+ /*
215
+ * if we've only seen digits then we don't know
216
+ * if we're parsing just a host or a host and port.
217
+ * if we see a non-digit, then we're in a host,
218
+ * otherwise, fall through to possibly match the
219
+ * "@" (user/host separator).
220
+ */
221
+
222
+ if (*c < '0' || *c > '9') {
223
+ host_end = hostport_end;
224
+ state = HOST;
225
+ }
226
+
227
+ /* fall through */
228
+
229
+ case HOST:
230
+ if (*c == ']' && host_end == c + 1) {
231
+ host_end = c;
232
+ state = IPV6;
233
+ }
234
+
235
+ else if (*c == '@') {
236
+ parser->host = c + 1;
237
+ parser->host_len = host_end ?
238
+ host_end - parser->host :
239
+ hostport_end - parser->host;
240
+ userpass_end = c;
241
+ state = USERPASS;
242
+ }
243
+
244
+ else if (*c == '[' || *c == ']' || *c == ':') {
245
+ return url_invalid("malformed hostname");
246
+ }
247
+
248
+ break;
249
+
250
+ case IPV6:
251
+ if (*c == '[') {
252
+ parser->host = c + 1;
253
+ parser->host_len = host_end - parser->host;
254
+ state = HOST_END;
255
+ }
256
+
257
+ else if ((*c < '0' || *c > '9') &&
258
+ (*c < 'a' || *c > 'f') &&
259
+ (*c < 'A' || *c > 'F') &&
260
+ (*c != ':')) {
261
+ return url_invalid("malformed hostname");
262
+ }
263
+
264
+ break;
265
+
266
+ case HOST_END:
267
+ if (*c == '@') {
268
+ userpass_end = c;
269
+ state = USERPASS;
270
+ break;
271
+ }
272
+
273
+ return url_invalid("malformed hostname");
274
+
275
+ case USERPASS:
276
+ if (*c == '@' &&
277
+ !is_ssh_scheme(parser->scheme, parser->scheme_len))
278
+ return url_invalid("malformed hostname");
279
+
280
+ if (*c == ':') {
281
+ parser->password = c + 1;
282
+ parser->password_len = userpass_end - parser->password;
283
+ user_end = c;
284
+ state = USER;
285
+ break;
286
+ }
287
+
288
+ break;
289
+
290
+ default:
291
+ GIT_ASSERT(!"unhandled state");
292
+ }
293
+ }
294
+
295
+ switch (state) {
296
+ case HOSTPORT:
297
+ parser->host = authority;
298
+ parser->host_len = (hostport_end - parser->host);
299
+ break;
300
+ case HOST:
301
+ parser->host = authority;
302
+ parser->host_len = (host_end - parser->host);
303
+ break;
304
+ case IPV6:
305
+ return url_invalid("malformed hostname");
306
+ case HOST_END:
307
+ break;
308
+ case USERPASS:
309
+ parser->user = authority;
310
+ parser->user_len = (userpass_end - parser->user);
311
+ break;
312
+ case USER:
313
+ parser->user = authority;
314
+ parser->user_len = (user_end - parser->user);
315
+ break;
316
+ default:
317
+ GIT_ASSERT(!"unhandled state");
318
+ }
319
+
320
+ return 0;
321
+ }
322
+
323
+ static int url_parse_path(
324
+ git_net_url_parser *parser,
325
+ const char *path,
326
+ size_t len)
327
+ {
328
+ const char *c, *end;
329
+
330
+ enum { PATH, QUERY, FRAGMENT } state = PATH;
331
+
332
+ parser->path = path;
333
+ end = path + len;
334
+
335
+ for (c = path; c < end; c++) {
336
+ switch (state) {
337
+ case PATH:
338
+ switch (*c) {
339
+ case '?':
340
+ parser->path_len = (c - parser->path);
341
+ parser->query = c + 1;
342
+ state = QUERY;
343
+ break;
344
+ case '#':
345
+ parser->path_len = (c - parser->path);
346
+ parser->fragment = c + 1;
347
+ state = FRAGMENT;
348
+ break;
349
+ }
350
+ break;
351
+
352
+ case QUERY:
353
+ if (*c == '#') {
354
+ parser->query_len = (c - parser->query);
355
+ parser->fragment = c + 1;
356
+ state = FRAGMENT;
357
+ }
358
+ break;
359
+
360
+ case FRAGMENT:
361
+ break;
362
+
363
+ default:
364
+ GIT_ASSERT(!"unhandled state");
365
+ }
366
+ }
367
+
368
+ switch (state) {
369
+ case PATH:
370
+ parser->path_len = (c - parser->path);
371
+ break;
372
+ case QUERY:
373
+ parser->query_len = (c - parser->query);
374
+ break;
375
+ case FRAGMENT:
376
+ parser->fragment_len = (c - parser->fragment);
377
+ break;
378
+ }
379
+
380
+ return 0;
381
+ }
382
+
383
+ static int url_parse_finalize(git_net_url *url, git_net_url_parser *parser)
384
+ {
385
+ git_str scheme = GIT_STR_INIT, user = GIT_STR_INIT,
386
+ password = GIT_STR_INIT, host = GIT_STR_INIT,
387
+ port = GIT_STR_INIT, path = GIT_STR_INIT,
388
+ query = GIT_STR_INIT, fragment = GIT_STR_INIT;
389
+ const char *default_port;
390
+ int port_specified = 0;
391
+ int error = 0;
392
+
393
+ if (parser->scheme_len) {
394
+ if ((error = git_str_put(&scheme, parser->scheme, parser->scheme_len)) < 0)
395
+ goto done;
396
+
397
+ git__strntolower(scheme.ptr, scheme.size);
398
+ }
399
+
400
+ if (parser->user_len &&
401
+ (error = git_str_decode_percent(&user, parser->user, parser->user_len)) < 0)
402
+ goto done;
403
+
404
+ if (parser->password_len &&
405
+ (error = git_str_decode_percent(&password, parser->password, parser->password_len)) < 0)
406
+ goto done;
407
+
408
+ if (parser->host_len &&
409
+ (error = git_str_decode_percent(&host, parser->host, parser->host_len)) < 0)
410
+ goto done;
411
+
412
+ if (parser->port_len) {
413
+ port_specified = 1;
414
+ error = git_str_put(&port, parser->port, parser->port_len);
415
+ } else if (parser->scheme_len &&
416
+ (default_port = default_port_for_scheme(scheme.ptr)) != NULL) {
417
+ error = git_str_puts(&port, default_port);
418
+ }
419
+
420
+ if (error < 0)
421
+ goto done;
422
+
423
+ if (parser->path_len)
424
+ error = git_str_put(&path, parser->path, parser->path_len);
425
+ else if (parser->hierarchical)
426
+ error = git_str_puts(&path, "/");
427
+
428
+ if (error < 0)
429
+ goto done;
430
+
431
+ if (parser->query_len &&
432
+ (error = git_str_decode_percent(&query, parser->query, parser->query_len)) < 0)
433
+ goto done;
434
+
435
+ if (parser->fragment_len &&
436
+ (error = git_str_decode_percent(&fragment, parser->fragment, parser->fragment_len)) < 0)
437
+ goto done;
438
+
439
+ url->scheme = git_str_detach(&scheme);
440
+ url->host = git_str_detach(&host);
441
+ url->port = git_str_detach(&port);
442
+ url->path = git_str_detach(&path);
443
+ url->query = git_str_detach(&query);
444
+ url->fragment = git_str_detach(&fragment);
445
+ url->username = git_str_detach(&user);
446
+ url->password = git_str_detach(&password);
447
+ url->port_specified = port_specified;
448
+
449
+ error = 0;
450
+
451
+ done:
452
+ git_str_dispose(&scheme);
453
+ git_str_dispose(&user);
454
+ git_str_dispose(&password);
455
+ git_str_dispose(&host);
456
+ git_str_dispose(&port);
457
+ git_str_dispose(&path);
458
+ git_str_dispose(&query);
459
+ git_str_dispose(&fragment);
460
+
461
+ return error;
462
+ }
463
+
464
+ int git_net_url_parse(git_net_url *url, const char *given)
465
+ {
466
+ git_net_url_parser parser = GIT_NET_URL_PARSER_INIT;
467
+ const char *c, *authority, *path;
468
+ size_t authority_len = 0, path_len = 0;
469
+ int error = 0;
470
+
471
+ enum {
472
+ SCHEME_START, SCHEME,
473
+ AUTHORITY_START, AUTHORITY,
474
+ PATH_START, PATH
475
+ } state = SCHEME_START;
476
+
477
+ memset(url, 0, sizeof(git_net_url));
478
+
479
+ for (c = given; *c; c++) {
480
+ switch (state) {
481
+ case SCHEME_START:
482
+ parser.scheme = c;
483
+ state = SCHEME;
484
+
485
+ /* fall through */
486
+
487
+ case SCHEME:
488
+ if (*c == ':') {
489
+ parser.scheme_len = (c - parser.scheme);
490
+
491
+ if (parser.scheme_len &&
492
+ *(c+1) == '/' && *(c+2) == '/') {
493
+ c += 2;
494
+ parser.hierarchical = 1;
495
+ state = AUTHORITY_START;
496
+ } else {
497
+ state = PATH_START;
498
+ }
499
+ } else if (!is_valid_scheme_char(*c)) {
500
+ /*
501
+ * an illegal scheme character means that we
502
+ * were just given a relative path
503
+ */
504
+ path = given;
505
+ state = PATH;
506
+ break;
507
+ }
508
+ break;
509
+
510
+ case AUTHORITY_START:
511
+ authority = c;
512
+ state = AUTHORITY;
513
+
514
+ /* fall through */
515
+ case AUTHORITY:
516
+ if (*c != '/')
517
+ break;
518
+
519
+ authority_len = (c - authority);
520
+
521
+ /* fall through */
522
+ case PATH_START:
523
+ path = c;
524
+ state = PATH;
525
+ break;
526
+
527
+ case PATH:
528
+ break;
529
+
530
+ default:
531
+ GIT_ASSERT(!"unhandled state");
532
+ }
533
+ }
534
+
535
+ switch (state) {
536
+ case SCHEME:
537
+ /*
538
+ * if we never saw a ':' then we were given a relative
539
+ * path, not a bare scheme
540
+ */
541
+ path = given;
542
+ path_len = (c - path);
543
+ break;
544
+ case AUTHORITY_START:
545
+ break;
546
+ case AUTHORITY:
547
+ authority_len = (c - authority);
548
+ break;
549
+ case PATH_START:
550
+ break;
551
+ case PATH:
552
+ path_len = (c - path);
553
+ break;
554
+ default:
555
+ GIT_ASSERT(!"unhandled state");
556
+ }
557
+
558
+ if (authority_len &&
559
+ (error = url_parse_authority(&parser, authority, authority_len)) < 0)
560
+ goto done;
561
+
562
+ if (path_len &&
563
+ (error = url_parse_path(&parser, path, path_len)) < 0)
564
+ goto done;
565
+
566
+ error = url_parse_finalize(url, &parser);
567
+
568
+ done:
569
+ return error;
570
+ }
571
+
572
+ int git_net_url_parse_http(
573
+ git_net_url *url,
574
+ const char *given)
575
+ {
576
+ git_net_url_parser parser = GIT_NET_URL_PARSER_INIT;
577
+ const char *c, *authority, *path = NULL;
578
+ size_t authority_len = 0, path_len = 0;
579
+ int error;
580
+
581
+ /* Hopefully this is a proper URL with a scheme. */
582
+ if (git_net_str_is_url(given))
583
+ return git_net_url_parse(url, given);
584
+
585
+ memset(url, 0, sizeof(git_net_url));
586
+
587
+ /* Without a scheme, we are in the host (authority) section. */
588
+ for (c = authority = given; *c; c++) {
589
+ if (!path && *c == '/') {
590
+ authority_len = (c - authority);
591
+ path = c;
592
+ }
593
+ }
594
+
595
+ if (path)
596
+ path_len = (c - path);
597
+ else
598
+ authority_len = (c - authority);
599
+
600
+ parser.scheme = "http";
601
+ parser.scheme_len = 4;
602
+ parser.hierarchical = 1;
603
+
604
+ if (authority_len &&
605
+ (error = url_parse_authority(&parser, authority, authority_len)) < 0)
606
+ return error;
607
+
608
+ if (path_len &&
609
+ (error = url_parse_path(&parser, path, path_len)) < 0)
610
+ return error;
611
+
612
+ return url_parse_finalize(url, &parser);
613
+ }
614
+
615
+ static int scp_invalid(const char *message)
616
+ {
617
+ git_error_set(GIT_ERROR_NET, "invalid scp-style path: %s", message);
618
+ return GIT_EINVALIDSPEC;
619
+ }
620
+
621
+ static bool is_ipv6(const char *str)
622
+ {
623
+ const char *c;
624
+ size_t colons = 0;
625
+
626
+ if (*str++ != '[')
627
+ return false;
628
+
629
+ for (c = str; *c; c++) {
630
+ if (*c == ':')
631
+ colons++;
632
+
633
+ if (*c == ']')
634
+ return (colons > 1);
635
+
636
+ if (*c != ':' &&
637
+ (*c < '0' || *c > '9') &&
638
+ (*c < 'a' || *c > 'f') &&
639
+ (*c < 'A' || *c > 'F'))
640
+ return false;
641
+ }
642
+
643
+ return false;
644
+ }
645
+
646
+ static bool has_at(const char *str)
647
+ {
648
+ const char *c;
649
+
650
+ for (c = str; *c; c++) {
651
+ if (*c == '@')
652
+ return true;
653
+
654
+ if (*c == ':')
655
+ break;
656
+ }
657
+
658
+ return false;
659
+ }
660
+
661
+ int git_net_url_parse_scp(git_net_url *url, const char *given)
662
+ {
663
+ const char *default_port = default_port_for_scheme("ssh");
664
+ const char *c, *user, *host, *port = NULL, *path = NULL;
665
+ size_t user_len = 0, host_len = 0, port_len = 0;
666
+ unsigned short bracket = 0;
667
+
668
+ enum {
669
+ NONE,
670
+ USER,
671
+ HOST_START, HOST, HOST_END,
672
+ IPV6, IPV6_END,
673
+ PORT_START, PORT, PORT_END,
674
+ PATH_START
675
+ } state = NONE;
676
+
677
+ memset(url, 0, sizeof(git_net_url));
678
+
679
+ for (c = given; *c && !path; c++) {
680
+ switch (state) {
681
+ case NONE:
682
+ switch (*c) {
683
+ case '@':
684
+ return scp_invalid("unexpected '@'");
685
+ case ':':
686
+ return scp_invalid("unexpected ':'");
687
+ case '[':
688
+ if (is_ipv6(c)) {
689
+ state = IPV6;
690
+ host = c;
691
+ } else if (bracket++ > 1) {
692
+ return scp_invalid("unexpected '['");
693
+ }
694
+ break;
695
+ default:
696
+ if (has_at(c)) {
697
+ state = USER;
698
+ user = c;
699
+ } else {
700
+ state = HOST;
701
+ host = c;
702
+ }
703
+ break;
704
+ }
705
+ break;
706
+
707
+ case USER:
708
+ if (*c == '@') {
709
+ user_len = (c - user);
710
+ state = HOST_START;
711
+ }
712
+ break;
713
+
714
+ case HOST_START:
715
+ state = (*c == '[') ? IPV6 : HOST;
716
+ host = c;
717
+ break;
718
+
719
+ case HOST:
720
+ if (*c == ':') {
721
+ host_len = (c - host);
722
+ state = bracket ? PORT_START : PATH_START;
723
+ } else if (*c == ']') {
724
+ if (bracket-- == 0)
725
+ return scp_invalid("unexpected ']'");
726
+
727
+ host_len = (c - host);
728
+ state = HOST_END;
729
+ }
730
+ break;
731
+
732
+ case HOST_END:
733
+ if (*c != ':')
734
+ return scp_invalid("unexpected character after hostname");
735
+ state = PATH_START;
736
+ break;
737
+
738
+ case IPV6:
739
+ if (*c == ']')
740
+ state = IPV6_END;
741
+ break;
742
+
743
+ case IPV6_END:
744
+ if (*c != ':')
745
+ return scp_invalid("unexpected character after ipv6 address");
746
+
747
+ host_len = (c - host);
748
+ state = bracket ? PORT_START : PATH_START;
749
+ break;
750
+
751
+ case PORT_START:
752
+ port = c;
753
+ state = PORT;
754
+ break;
755
+
756
+ case PORT:
757
+ if (*c == ']') {
758
+ if (bracket-- == 0)
759
+ return scp_invalid("unexpected ']'");
760
+
761
+ port_len = c - port;
762
+ state = PORT_END;
763
+ }
764
+ break;
765
+
766
+ case PORT_END:
767
+ if (*c != ':')
768
+ return scp_invalid("unexpected character after ipv6 address");
769
+
770
+ state = PATH_START;
771
+ break;
772
+
773
+ case PATH_START:
774
+ path = c;
775
+ break;
776
+
777
+ default:
778
+ GIT_ASSERT(!"unhandled state");
779
+ }
780
+ }
781
+
782
+ if (!path)
783
+ return scp_invalid("path is required");
784
+
785
+ GIT_ERROR_CHECK_ALLOC(url->scheme = git__strdup("ssh"));
786
+
787
+ if (user_len)
788
+ GIT_ERROR_CHECK_ALLOC(url->username = git__strndup(user, user_len));
789
+
790
+ GIT_ASSERT(host_len);
791
+ GIT_ERROR_CHECK_ALLOC(url->host = git__strndup(host, host_len));
792
+
793
+ if (port_len) {
794
+ url->port_specified = 1;
795
+ GIT_ERROR_CHECK_ALLOC(url->port = git__strndup(port, port_len));
796
+ } else {
797
+ GIT_ERROR_CHECK_ALLOC(url->port = git__strdup(default_port));
798
+ }
799
+
800
+ GIT_ASSERT(path);
801
+ GIT_ERROR_CHECK_ALLOC(url->path = git__strdup(path));
802
+
803
+ return 0;
804
+ }
805
+
806
+ int git_net_url_parse_standard_or_scp(git_net_url *url, const char *given)
807
+ {
808
+ return git_net_str_is_url(given) ?
809
+ git_net_url_parse(url, given) :
810
+ git_net_url_parse_scp(url, given);
811
+ }
812
+
813
+ int git_net_url_joinpath(
814
+ git_net_url *out,
815
+ git_net_url *one,
816
+ const char *two)
817
+ {
818
+ git_str path = GIT_STR_INIT;
819
+ const char *query;
820
+ size_t one_len, two_len;
821
+
822
+ git_net_url_dispose(out);
823
+
824
+ if ((query = strchr(two, '?')) != NULL) {
825
+ two_len = query - two;
826
+
827
+ if (*(++query) != '\0') {
828
+ out->query = git__strdup(query);
829
+ GIT_ERROR_CHECK_ALLOC(out->query);
830
+ }
831
+ } else {
832
+ two_len = strlen(two);
833
+ }
834
+
835
+ /* Strip all trailing `/`s from the first path */
836
+ one_len = one->path ? strlen(one->path) : 0;
837
+ while (one_len && one->path[one_len - 1] == '/')
838
+ one_len--;
839
+
840
+ /* Strip all leading `/`s from the second path */
841
+ while (*two == '/') {
842
+ two++;
843
+ two_len--;
844
+ }
845
+
846
+ git_str_put(&path, one->path, one_len);
847
+ git_str_putc(&path, '/');
848
+ git_str_put(&path, two, two_len);
849
+
850
+ if (git_str_oom(&path))
851
+ return -1;
852
+
853
+ out->path = git_str_detach(&path);
854
+
855
+ if (one->scheme) {
856
+ out->scheme = git__strdup(one->scheme);
857
+ GIT_ERROR_CHECK_ALLOC(out->scheme);
858
+ }
859
+
860
+ if (one->host) {
861
+ out->host = git__strdup(one->host);
862
+ GIT_ERROR_CHECK_ALLOC(out->host);
863
+ }
864
+
865
+ if (one->port) {
866
+ out->port = git__strdup(one->port);
867
+ GIT_ERROR_CHECK_ALLOC(out->port);
868
+ }
869
+
870
+ if (one->username) {
871
+ out->username = git__strdup(one->username);
872
+ GIT_ERROR_CHECK_ALLOC(out->username);
873
+ }
874
+
875
+ if (one->password) {
876
+ out->password = git__strdup(one->password);
877
+ GIT_ERROR_CHECK_ALLOC(out->password);
878
+ }
879
+
880
+ return 0;
881
+ }
882
+
883
+ /*
884
+ * Some servers strip the query parameters from the Location header
885
+ * when sending a redirect. Others leave it in place.
886
+ * Check for both, starting with the stripped case first,
887
+ * since it appears to be more common.
888
+ */
889
+ static void remove_service_suffix(
890
+ git_net_url *url,
891
+ const char *service_suffix)
892
+ {
893
+ const char *service_query = strchr(service_suffix, '?');
894
+ size_t full_suffix_len = strlen(service_suffix);
895
+ size_t suffix_len = service_query ?
896
+ (size_t)(service_query - service_suffix) : full_suffix_len;
897
+ size_t path_len = strlen(url->path);
898
+ ssize_t truncate = -1;
899
+
900
+ /*
901
+ * Check for a redirect without query parameters,
902
+ * like "/newloc/info/refs"'
903
+ */
904
+ if (suffix_len && path_len >= suffix_len) {
905
+ size_t suffix_offset = path_len - suffix_len;
906
+
907
+ if (git__strncmp(url->path + suffix_offset, service_suffix, suffix_len) == 0 &&
908
+ (!service_query || git__strcmp(url->query, service_query + 1) == 0)) {
909
+ truncate = suffix_offset;
910
+ }
911
+ }
912
+
913
+ /*
914
+ * If we haven't already found where to truncate to remove the
915
+ * suffix, check for a redirect with query parameters, like
916
+ * "/newloc/info/refs?service=git-upload-pack"
917
+ */
918
+ if (truncate < 0 && git__suffixcmp(url->path, service_suffix) == 0)
919
+ truncate = path_len - full_suffix_len;
920
+
921
+ /* Ensure we leave a minimum of '/' as the path */
922
+ if (truncate == 0)
923
+ truncate++;
924
+
925
+ if (truncate > 0) {
926
+ url->path[truncate] = '\0';
927
+
928
+ git__free(url->query);
929
+ url->query = NULL;
930
+ }
931
+ }
932
+
933
+ int git_net_url_apply_redirect(
934
+ git_net_url *url,
935
+ const char *redirect_location,
936
+ bool allow_offsite,
937
+ const char *service_suffix)
938
+ {
939
+ git_net_url tmp = GIT_NET_URL_INIT;
940
+ int error = 0;
941
+
942
+ GIT_ASSERT(url);
943
+ GIT_ASSERT(redirect_location);
944
+
945
+ if (redirect_location[0] == '/') {
946
+ git__free(url->path);
947
+
948
+ if ((url->path = git__strdup(redirect_location)) == NULL) {
949
+ error = -1;
950
+ goto done;
951
+ }
952
+ } else {
953
+ git_net_url *original = url;
954
+
955
+ if ((error = git_net_url_parse(&tmp, redirect_location)) < 0)
956
+ goto done;
957
+
958
+ /* Validate that this is a legal redirection */
959
+
960
+ if (original->scheme &&
961
+ strcmp(original->scheme, tmp.scheme) != 0 &&
962
+ strcmp(tmp.scheme, "https") != 0) {
963
+ git_error_set(GIT_ERROR_NET, "cannot redirect from '%s' to '%s'",
964
+ original->scheme, tmp.scheme);
965
+
966
+ error = -1;
967
+ goto done;
968
+ }
969
+
970
+ if (original->host &&
971
+ !allow_offsite &&
972
+ git__strcasecmp(original->host, tmp.host) != 0) {
973
+ git_error_set(GIT_ERROR_NET, "cannot redirect from '%s' to '%s'",
974
+ original->host, tmp.host);
975
+
976
+ error = -1;
977
+ goto done;
978
+ }
979
+
980
+ git_net_url_swap(url, &tmp);
981
+ }
982
+
983
+ /* Remove the service suffix if it was given to us */
984
+ if (service_suffix)
985
+ remove_service_suffix(url, service_suffix);
986
+
987
+ done:
988
+ git_net_url_dispose(&tmp);
989
+ return error;
990
+ }
991
+
992
+ bool git_net_url_valid(git_net_url *url)
993
+ {
994
+ return (url->host && url->port && url->path);
995
+ }
996
+
997
+ bool git_net_url_is_default_port(git_net_url *url)
998
+ {
999
+ const char *default_port;
1000
+
1001
+ if (url->scheme && (default_port = default_port_for_scheme(url->scheme)) != NULL)
1002
+ return (strcmp(url->port, default_port) == 0);
1003
+ else
1004
+ return false;
1005
+ }
1006
+
1007
+ bool git_net_url_is_ipv6(git_net_url *url)
1008
+ {
1009
+ return (strchr(url->host, ':') != NULL);
1010
+ }
1011
+
1012
+ void git_net_url_swap(git_net_url *a, git_net_url *b)
1013
+ {
1014
+ git_net_url tmp = GIT_NET_URL_INIT;
1015
+
1016
+ memcpy(&tmp, a, sizeof(git_net_url));
1017
+ memcpy(a, b, sizeof(git_net_url));
1018
+ memcpy(b, &tmp, sizeof(git_net_url));
1019
+ }
1020
+
1021
+ int git_net_url_fmt(git_str *buf, git_net_url *url)
1022
+ {
1023
+ GIT_ASSERT_ARG(url);
1024
+ GIT_ASSERT_ARG(url->scheme);
1025
+ GIT_ASSERT_ARG(url->host);
1026
+
1027
+ git_str_puts(buf, url->scheme);
1028
+ git_str_puts(buf, "://");
1029
+
1030
+ if (url->username) {
1031
+ git_str_puts(buf, url->username);
1032
+
1033
+ if (url->password) {
1034
+ git_str_puts(buf, ":");
1035
+ git_str_puts(buf, url->password);
1036
+ }
1037
+
1038
+ git_str_putc(buf, '@');
1039
+ }
1040
+
1041
+ git_str_puts(buf, url->host);
1042
+
1043
+ if (url->port && !git_net_url_is_default_port(url)) {
1044
+ git_str_putc(buf, ':');
1045
+ git_str_puts(buf, url->port);
1046
+ }
1047
+
1048
+ git_str_puts(buf, url->path ? url->path : "/");
1049
+
1050
+ if (url->query) {
1051
+ git_str_putc(buf, '?');
1052
+ git_str_puts(buf, url->query);
1053
+ }
1054
+
1055
+ return git_str_oom(buf) ? -1 : 0;
1056
+ }
1057
+
1058
+ int git_net_url_fmt_path(git_str *buf, git_net_url *url)
1059
+ {
1060
+ git_str_puts(buf, url->path ? url->path : "/");
1061
+
1062
+ if (url->query) {
1063
+ git_str_putc(buf, '?');
1064
+ git_str_puts(buf, url->query);
1065
+ }
1066
+
1067
+ return git_str_oom(buf) ? -1 : 0;
1068
+ }
1069
+
1070
+ static bool matches_pattern(
1071
+ git_net_url *url,
1072
+ const char *pattern,
1073
+ size_t pattern_len)
1074
+ {
1075
+ const char *domain, *port = NULL, *colon;
1076
+ size_t host_len, domain_len, port_len = 0, wildcard = 0;
1077
+
1078
+ GIT_UNUSED(url);
1079
+ GIT_UNUSED(pattern);
1080
+
1081
+ if (!pattern_len)
1082
+ return false;
1083
+ else if (pattern_len == 1 && pattern[0] == '*')
1084
+ return true;
1085
+ else if (pattern_len > 1 && pattern[0] == '*' && pattern[1] == '.')
1086
+ wildcard = 2;
1087
+ else if (pattern[0] == '.')
1088
+ wildcard = 1;
1089
+
1090
+ domain = pattern + wildcard;
1091
+ domain_len = pattern_len - wildcard;
1092
+
1093
+ if ((colon = memchr(domain, ':', domain_len)) != NULL) {
1094
+ domain_len = colon - domain;
1095
+ port = colon + 1;
1096
+ port_len = pattern_len - wildcard - domain_len - 1;
1097
+ }
1098
+
1099
+ /* A pattern's port *must* match if it's specified */
1100
+ if (port_len && git__strlcmp(url->port, port, port_len) != 0)
1101
+ return false;
1102
+
1103
+ /* No wildcard? Host must match exactly. */
1104
+ if (!wildcard)
1105
+ return !git__strlcmp(url->host, domain, domain_len);
1106
+
1107
+ /* Wildcard: ensure there's (at least) a suffix match */
1108
+ if ((host_len = strlen(url->host)) < domain_len ||
1109
+ memcmp(url->host + (host_len - domain_len), domain, domain_len))
1110
+ return false;
1111
+
1112
+ /* The pattern is *.domain and the host is simply domain */
1113
+ if (host_len == domain_len)
1114
+ return true;
1115
+
1116
+ /* The pattern is *.domain and the host is foo.domain */
1117
+ return (url->host[host_len - domain_len - 1] == '.');
1118
+ }
1119
+
1120
+ bool git_net_url_matches_pattern(git_net_url *url, const char *pattern)
1121
+ {
1122
+ return matches_pattern(url, pattern, strlen(pattern));
1123
+ }
1124
+
1125
+ bool git_net_url_matches_pattern_list(
1126
+ git_net_url *url,
1127
+ const char *pattern_list)
1128
+ {
1129
+ const char *pattern, *pattern_end, *sep;
1130
+
1131
+ for (pattern = pattern_list;
1132
+ pattern && *pattern;
1133
+ pattern = sep ? sep + 1 : NULL) {
1134
+ sep = strchr(pattern, ',');
1135
+ pattern_end = sep ? sep : strchr(pattern, '\0');
1136
+
1137
+ if (matches_pattern(url, pattern, (pattern_end - pattern)))
1138
+ return true;
1139
+ }
1140
+
1141
+ return false;
1142
+ }
1143
+
1144
+ void git_net_url_dispose(git_net_url *url)
1145
+ {
1146
+ if (url->username)
1147
+ git__memzero(url->username, strlen(url->username));
1148
+
1149
+ if (url->password)
1150
+ git__memzero(url->password, strlen(url->password));
1151
+
1152
+ git__free(url->scheme); url->scheme = NULL;
1153
+ git__free(url->host); url->host = NULL;
1154
+ git__free(url->port); url->port = NULL;
1155
+ git__free(url->path); url->path = NULL;
1156
+ git__free(url->query); url->query = NULL;
1157
+ git__free(url->fragment); url->fragment = NULL;
1158
+ git__free(url->username); url->username = NULL;
1159
+ git__free(url->password); url->password = NULL;
1160
+ }