rugged 1.6.3 → 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 (443) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/AUTHORS +1 -0
  5. data/vendor/libgit2/CMakeLists.txt +25 -17
  6. data/vendor/libgit2/COPYING +195 -1
  7. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  8. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  9. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  10. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
  11. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
  14. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  15. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  16. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  17. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  18. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  19. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  20. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  21. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  22. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  23. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  25. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  27. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  28. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  29. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  30. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  31. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  32. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  33. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  34. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  35. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  36. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  37. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  38. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  39. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  40. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  41. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  42. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  43. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  44. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  45. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  46. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
  47. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  48. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  49. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  50. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  51. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  52. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  53. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  54. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  55. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  56. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  57. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  58. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  59. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  60. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  61. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  62. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  63. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  64. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  65. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  66. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  67. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  68. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  69. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  70. data/vendor/libgit2/include/git2/apply.h +27 -6
  71. data/vendor/libgit2/include/git2/attr.h +17 -4
  72. data/vendor/libgit2/include/git2/blame.h +133 -28
  73. data/vendor/libgit2/include/git2/blob.h +71 -28
  74. data/vendor/libgit2/include/git2/branch.h +22 -15
  75. data/vendor/libgit2/include/git2/buffer.h +6 -4
  76. data/vendor/libgit2/include/git2/cert.h +2 -1
  77. data/vendor/libgit2/include/git2/checkout.h +83 -32
  78. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  79. data/vendor/libgit2/include/git2/clone.h +25 -9
  80. data/vendor/libgit2/include/git2/commit.h +132 -3
  81. data/vendor/libgit2/include/git2/common.h +138 -56
  82. data/vendor/libgit2/include/git2/config.h +93 -23
  83. data/vendor/libgit2/include/git2/credential.h +30 -2
  84. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  85. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  86. data/vendor/libgit2/include/git2/describe.h +13 -1
  87. data/vendor/libgit2/include/git2/diff.h +77 -9
  88. data/vendor/libgit2/include/git2/email.h +9 -29
  89. data/vendor/libgit2/include/git2/errors.h +49 -74
  90. data/vendor/libgit2/include/git2/filter.h +14 -7
  91. data/vendor/libgit2/include/git2/global.h +8 -1
  92. data/vendor/libgit2/include/git2/graph.h +3 -2
  93. data/vendor/libgit2/include/git2/ignore.h +10 -0
  94. data/vendor/libgit2/include/git2/index.h +100 -6
  95. data/vendor/libgit2/include/git2/indexer.h +21 -4
  96. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  97. data/vendor/libgit2/include/git2/merge.h +46 -1
  98. data/vendor/libgit2/include/git2/message.h +2 -2
  99. data/vendor/libgit2/include/git2/net.h +3 -1
  100. data/vendor/libgit2/include/git2/notes.h +9 -6
  101. data/vendor/libgit2/include/git2/object.h +9 -8
  102. data/vendor/libgit2/include/git2/odb.h +91 -49
  103. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  104. data/vendor/libgit2/include/git2/oid.h +24 -25
  105. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  106. data/vendor/libgit2/include/git2/pack.h +13 -1
  107. data/vendor/libgit2/include/git2/patch.h +2 -3
  108. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  109. data/vendor/libgit2/include/git2/proxy.h +10 -0
  110. data/vendor/libgit2/include/git2/rebase.h +9 -6
  111. data/vendor/libgit2/include/git2/refdb.h +2 -2
  112. data/vendor/libgit2/include/git2/reflog.h +3 -2
  113. data/vendor/libgit2/include/git2/refs.h +9 -6
  114. data/vendor/libgit2/include/git2/refspec.h +14 -4
  115. data/vendor/libgit2/include/git2/remote.h +112 -18
  116. data/vendor/libgit2/include/git2/repository.h +61 -15
  117. data/vendor/libgit2/include/git2/reset.h +16 -3
  118. data/vendor/libgit2/include/git2/revert.h +9 -4
  119. data/vendor/libgit2/include/git2/revparse.h +3 -3
  120. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  121. data/vendor/libgit2/include/git2/signature.h +46 -1
  122. data/vendor/libgit2/include/git2/stash.h +17 -3
  123. data/vendor/libgit2/include/git2/status.h +10 -6
  124. data/vendor/libgit2/include/git2/stdint.h +87 -85
  125. data/vendor/libgit2/include/git2/strarray.h +2 -3
  126. data/vendor/libgit2/include/git2/submodule.h +20 -9
  127. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  128. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  129. data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
  130. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  131. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  132. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  133. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  134. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  135. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  136. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  137. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  138. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  139. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  140. data/vendor/libgit2/include/git2/sys/midx.h +47 -4
  141. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  142. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  143. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  144. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  145. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  146. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  147. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  148. data/vendor/libgit2/include/git2/sys/stream.h +25 -2
  149. data/vendor/libgit2/include/git2/sys/transport.h +44 -5
  150. data/vendor/libgit2/include/git2/tag.h +3 -1
  151. data/vendor/libgit2/include/git2/trace.h +9 -3
  152. data/vendor/libgit2/include/git2/transaction.h +3 -2
  153. data/vendor/libgit2/include/git2/transport.h +11 -3
  154. data/vendor/libgit2/include/git2/tree.h +16 -5
  155. data/vendor/libgit2/include/git2/types.h +19 -3
  156. data/vendor/libgit2/include/git2/version.h +44 -8
  157. data/vendor/libgit2/include/git2/worktree.h +19 -7
  158. data/vendor/libgit2/src/CMakeLists.txt +40 -15
  159. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  160. data/vendor/libgit2/src/cli/cmd.c +1 -1
  161. data/vendor/libgit2/src/cli/cmd.h +4 -0
  162. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  163. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  164. data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
  165. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  166. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  167. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  168. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  169. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  170. data/vendor/libgit2/src/cli/common.c +168 -0
  171. data/vendor/libgit2/src/cli/common.h +63 -0
  172. data/vendor/libgit2/src/cli/error.h +1 -1
  173. data/vendor/libgit2/src/cli/main.c +52 -24
  174. data/vendor/libgit2/src/cli/opt.c +29 -3
  175. data/vendor/libgit2/src/cli/opt.h +21 -3
  176. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  177. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  178. data/vendor/libgit2/src/cli/progress.c +60 -10
  179. data/vendor/libgit2/src/cli/progress.h +16 -4
  180. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  181. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  182. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  183. data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
  184. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  185. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  186. data/vendor/libgit2/src/libgit2/apply.c +14 -16
  187. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  188. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  189. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  190. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  191. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  192. data/vendor/libgit2/src/libgit2/blame.c +152 -59
  193. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  194. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  195. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  196. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  197. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  198. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  199. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  200. data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
  201. data/vendor/libgit2/src/libgit2/clone.c +186 -164
  202. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  203. data/vendor/libgit2/src/libgit2/commit.c +123 -9
  204. data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
  205. data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
  206. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  207. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  208. data/vendor/libgit2/src/libgit2/config.c +394 -300
  209. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  210. data/vendor/libgit2/src/libgit2/config.h +9 -4
  211. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  212. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  213. data/vendor/libgit2/src/libgit2/config_file.c +113 -96
  214. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  215. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  216. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  217. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  218. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  219. data/vendor/libgit2/src/libgit2/describe.c +34 -31
  220. data/vendor/libgit2/src/libgit2/diff.c +17 -8
  221. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  222. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  223. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  224. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  225. data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
  226. data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
  227. data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
  228. data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
  229. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  230. data/vendor/libgit2/src/libgit2/email.c +5 -3
  231. data/vendor/libgit2/src/libgit2/fetch.c +39 -9
  232. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  233. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  234. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  235. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  236. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  237. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  238. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  239. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  240. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  241. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  242. data/vendor/libgit2/src/libgit2/index.c +392 -208
  243. data/vendor/libgit2/src/libgit2/index.h +16 -3
  244. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  245. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  246. data/vendor/libgit2/src/libgit2/indexer.c +44 -41
  247. data/vendor/libgit2/src/libgit2/iterator.c +34 -13
  248. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  249. data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +56 -46
  252. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  253. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  254. data/vendor/libgit2/src/libgit2/midx.c +86 -44
  255. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  256. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  257. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  258. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  259. data/vendor/libgit2/src/libgit2/object.c +42 -16
  260. data/vendor/libgit2/src/libgit2/object.h +6 -0
  261. data/vendor/libgit2/src/libgit2/odb.c +16 -9
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
  264. data/vendor/libgit2/src/libgit2/oid.c +35 -2
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  267. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  268. data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
  269. data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
  270. data/vendor/libgit2/src/libgit2/pack.c +33 -27
  271. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  272. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  273. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  274. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  275. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  276. data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
  277. data/vendor/libgit2/src/libgit2/path.c +1 -1
  278. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  279. data/vendor/libgit2/src/libgit2/push.c +81 -30
  280. data/vendor/libgit2/src/libgit2/push.h +1 -0
  281. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  282. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  283. data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
  284. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  285. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  286. data/vendor/libgit2/src/libgit2/refs.c +34 -8
  287. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  288. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  289. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  290. data/vendor/libgit2/src/libgit2/remote.c +136 -67
  291. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  292. data/vendor/libgit2/src/libgit2/repository.c +789 -330
  293. data/vendor/libgit2/src/libgit2/repository.h +22 -3
  294. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  295. data/vendor/libgit2/src/libgit2/revert.c +9 -13
  296. data/vendor/libgit2/src/libgit2/revparse.c +6 -3
  297. data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
  298. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  299. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  300. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  301. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  302. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  303. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  304. data/vendor/libgit2/src/libgit2/status.c +1 -1
  305. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
  306. data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
  307. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  308. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  309. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  310. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  311. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  312. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  313. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  314. data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
  315. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  316. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  317. data/vendor/libgit2/src/libgit2/submodule.h +9 -10
  318. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  319. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  320. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  321. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  322. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  323. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  324. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  325. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  326. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  327. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  328. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  329. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  330. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  331. data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
  332. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  333. data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
  334. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  335. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  336. data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
  337. data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
  338. data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
  339. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
  340. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
  341. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  342. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  343. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  344. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  345. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  346. data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
  347. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  348. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  349. data/vendor/libgit2/src/libgit2/tree.c +35 -27
  350. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  351. data/vendor/libgit2/src/libgit2/worktree.c +39 -27
  352. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  353. data/vendor/libgit2/src/util/alloc.c +69 -7
  354. data/vendor/libgit2/src/util/alloc.h +34 -9
  355. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  356. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  357. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  358. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  359. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
  360. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  361. data/vendor/libgit2/src/util/array.h +24 -18
  362. data/vendor/libgit2/src/util/cc-compat.h +4 -0
  363. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  364. data/vendor/libgit2/src/util/date.c +22 -14
  365. data/vendor/libgit2/src/util/date.h +12 -0
  366. data/vendor/libgit2/src/util/errors.c +401 -0
  367. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  368. data/vendor/libgit2/src/util/filebuf.c +6 -1
  369. data/vendor/libgit2/src/util/filebuf.h +19 -6
  370. data/vendor/libgit2/src/util/fs_path.c +16 -5
  371. data/vendor/libgit2/src/util/fs_path.h +23 -0
  372. data/vendor/libgit2/src/util/futils.c +14 -10
  373. data/vendor/libgit2/src/util/futils.h +13 -4
  374. data/vendor/libgit2/src/util/git2_features.h.in +21 -4
  375. data/vendor/libgit2/src/util/git2_util.h +6 -0
  376. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  377. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  378. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  379. data/vendor/libgit2/src/util/hashmap.h +424 -0
  380. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  381. data/vendor/libgit2/src/util/integer.h +3 -1
  382. data/vendor/libgit2/src/util/net.c +318 -161
  383. data/vendor/libgit2/src/util/net.h +27 -0
  384. data/vendor/libgit2/src/util/pool.c +1 -1
  385. data/vendor/libgit2/src/util/pool.h +5 -0
  386. data/vendor/libgit2/src/util/posix.c +54 -0
  387. data/vendor/libgit2/src/util/posix.h +22 -0
  388. data/vendor/libgit2/src/util/pqueue.h +1 -1
  389. data/vendor/libgit2/src/util/process.h +222 -0
  390. data/vendor/libgit2/src/util/rand.c +6 -10
  391. data/vendor/libgit2/src/util/regexp.c +1 -1
  392. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  393. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  394. data/vendor/libgit2/src/util/staticstr.h +66 -0
  395. data/vendor/libgit2/src/util/str.c +2 -2
  396. data/vendor/libgit2/src/util/strlist.c +108 -0
  397. data/vendor/libgit2/src/util/strlist.h +36 -0
  398. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  399. data/vendor/libgit2/src/util/unix/process.c +629 -0
  400. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  401. data/vendor/libgit2/src/util/util.c +17 -12
  402. data/vendor/libgit2/src/util/util.h +28 -54
  403. data/vendor/libgit2/src/util/vector.c +3 -3
  404. data/vendor/libgit2/src/util/vector.h +2 -2
  405. data/vendor/libgit2/src/util/win32/error.c +1 -1
  406. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  407. data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
  408. data/vendor/libgit2/src/util/win32/process.c +506 -0
  409. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  410. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  411. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  412. metadata +72 -49
  413. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  414. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  415. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  416. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  417. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  418. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  419. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  420. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  421. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  422. data/vendor/libgit2/src/libgit2/errors.c +0 -238
  423. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  424. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  425. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  426. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  427. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  428. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  429. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  430. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  431. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  432. data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
  433. data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
  434. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  435. data/vendor/libgit2/src/util/khash.h +0 -615
  436. data/vendor/libgit2/src/util/strmap.c +0 -100
  437. data/vendor/libgit2/src/util/strmap.h +0 -131
  438. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
  439. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  440. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  441. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  442. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  443. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -16,14 +16,14 @@
16
16
  #include "git2/commit.h"
17
17
  #include "git2/tree.h"
18
18
 
19
+ #include "checkout.h"
19
20
  #include "remote.h"
20
21
  #include "futils.h"
21
22
  #include "refs.h"
22
23
  #include "fs_path.h"
23
24
  #include "repository.h"
24
25
  #include "odb.h"
25
-
26
- static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link);
26
+ #include "net.h"
27
27
 
28
28
  static int create_branch(
29
29
  git_reference **branch,
@@ -336,8 +336,9 @@ static int create_and_configure_origin(
336
336
  git_remote_create_cb remote_create = options->remote_cb;
337
337
  void *payload = options->remote_cb_payload;
338
338
 
339
- /* If the path exists and is a dir, the url should be the absolute path */
340
- if (git_fs_path_root(url) < 0 && git_fs_path_exists(url) && git_fs_path_isdir(url)) {
339
+ /* If the path is local and exists it should be the absolute path. */
340
+ if (!git_net_str_is_url(url) && git_fs_path_root(url) < 0 &&
341
+ git_fs_path_exists(url)) {
341
342
  if (p_realpath(url, buf) == NULL)
342
343
  return -1;
343
344
 
@@ -360,35 +361,50 @@ on_error:
360
361
  return error;
361
362
  }
362
363
 
363
- static bool should_checkout(
364
+ static int should_checkout(
365
+ bool *out,
364
366
  git_repository *repo,
365
367
  bool is_bare,
366
- const git_checkout_options *opts)
368
+ const git_clone_options *opts)
367
369
  {
368
- if (is_bare)
369
- return false;
370
+ int error;
370
371
 
371
- if (!opts)
372
- return false;
372
+ if (!opts || is_bare ||
373
+ opts->checkout_opts.checkout_strategy == GIT_CHECKOUT_NONE) {
374
+ *out = false;
375
+ return 0;
376
+ }
373
377
 
374
- if (opts->checkout_strategy == GIT_CHECKOUT_NONE)
375
- return false;
378
+ if ((error = git_repository_head_unborn(repo)) < 0)
379
+ return error;
376
380
 
377
- return !git_repository_head_unborn(repo);
381
+ *out = !error;
382
+ return 0;
378
383
  }
379
384
 
380
- static int checkout_branch(git_repository *repo, git_remote *remote, const git_checkout_options *co_opts, const char *branch, const char *reflog_message)
385
+ static int checkout_branch(
386
+ git_repository *repo,
387
+ git_remote *remote,
388
+ const git_clone_options *opts,
389
+ const char *reflog_message)
381
390
  {
391
+ bool checkout;
382
392
  int error;
383
393
 
384
- if (branch)
385
- error = update_head_to_branch(repo, remote, branch, reflog_message);
394
+ if (opts->checkout_branch)
395
+ error = update_head_to_branch(repo, remote, opts->checkout_branch, reflog_message);
386
396
  /* Point HEAD to the same ref as the remote's head */
387
397
  else
388
398
  error = update_head_to_remote(repo, remote, reflog_message);
389
399
 
390
- if (!error && should_checkout(repo, git_repository_is_bare(repo), co_opts))
391
- error = git_checkout_head(repo, co_opts);
400
+ if (error < 0)
401
+ return error;
402
+
403
+ if ((error = should_checkout(&checkout, repo, git_repository_is_bare(repo), opts)) < 0)
404
+ return error;
405
+
406
+ if (checkout)
407
+ error = git_checkout_head(repo, &opts->checkout_opts);
392
408
 
393
409
  return error;
394
410
  }
@@ -396,16 +412,13 @@ static int checkout_branch(git_repository *repo, git_remote *remote, const git_c
396
412
  static int clone_into(
397
413
  git_repository *repo,
398
414
  git_remote *_remote,
399
- const git_fetch_options *opts,
400
- const git_checkout_options *co_opts,
401
- const char *branch)
415
+ const git_clone_options *opts)
402
416
  {
403
- int error;
404
417
  git_str reflog_message = GIT_STR_INIT;
405
418
  git_remote_connect_options connect_opts = GIT_REMOTE_CONNECT_OPTIONS_INIT;
406
- git_fetch_options fetch_opts;
407
419
  git_remote *remote;
408
420
  git_oid_t oid_type;
421
+ int error;
409
422
 
410
423
  GIT_ASSERT_ARG(repo);
411
424
  GIT_ASSERT_ARG(_remote);
@@ -418,11 +431,7 @@ static int clone_into(
418
431
  if ((error = git_remote_dup(&remote, _remote)) < 0)
419
432
  return error;
420
433
 
421
- memcpy(&fetch_opts, opts, sizeof(git_fetch_options));
422
- fetch_opts.update_fetchhead = 0;
423
- fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
424
-
425
- if ((error = git_remote_connect_options__from_fetch_opts(&connect_opts, remote, &fetch_opts)) < 0)
434
+ if ((error = git_remote_connect_options__from_fetch_opts(&connect_opts, remote, &opts->fetch_opts)) < 0)
426
435
  goto cleanup;
427
436
 
428
437
  git_str_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
@@ -440,10 +449,10 @@ static int clone_into(
440
449
  (error = git_repository__set_objectformat(repo, oid_type)) < 0)
441
450
  goto cleanup;
442
451
 
443
- if ((error = git_remote_fetch(remote, NULL, &fetch_opts, git_str_cstr(&reflog_message))) != 0)
452
+ if ((error = git_remote_fetch(remote, NULL, &opts->fetch_opts, git_str_cstr(&reflog_message))) != 0)
444
453
  goto cleanup;
445
454
 
446
- error = checkout_branch(repo, remote, co_opts, branch, git_str_cstr(&reflog_message));
455
+ error = checkout_branch(repo, remote, opts, git_str_cstr(&reflog_message));
447
456
 
448
457
  cleanup:
449
458
  git_remote_free(remote);
@@ -453,37 +462,142 @@ cleanup:
453
462
  return error;
454
463
  }
455
464
 
456
- int git_clone__should_clone_local(const char *url_or_path, git_clone_local_t local)
465
+ static bool can_link(const char *src, const char *dst, int link)
466
+ {
467
+ #ifdef GIT_WIN32
468
+ GIT_UNUSED(src);
469
+ GIT_UNUSED(dst);
470
+ GIT_UNUSED(link);
471
+ return false;
472
+ #else
473
+
474
+ struct stat st_src, st_dst;
475
+
476
+ if (!link)
477
+ return false;
478
+
479
+ if (p_stat(src, &st_src) < 0)
480
+ return false;
481
+
482
+ if (p_stat(dst, &st_dst) < 0)
483
+ return false;
484
+
485
+ return st_src.st_dev == st_dst.st_dev;
486
+ #endif
487
+ }
488
+
489
+ static int clone_local_into(
490
+ git_repository *repo,
491
+ git_remote *remote,
492
+ const git_clone_options *opts)
493
+ {
494
+ int error, flags;
495
+ git_repository *src;
496
+ git_str src_odb = GIT_STR_INIT, dst_odb = GIT_STR_INIT, src_path = GIT_STR_INIT;
497
+ git_str reflog_message = GIT_STR_INIT;
498
+ bool link = (opts && opts->local != GIT_CLONE_LOCAL_NO_LINKS);
499
+
500
+ GIT_ASSERT_ARG(repo);
501
+ GIT_ASSERT_ARG(remote);
502
+
503
+ if (!git_repository_is_empty(repo)) {
504
+ git_error_set(GIT_ERROR_INVALID, "the repository is not empty");
505
+ return -1;
506
+ }
507
+
508
+ /*
509
+ * Let's figure out what path we should use for the source
510
+ * repo, if it's not rooted, the path should be relative to
511
+ * the repository's worktree/gitdir.
512
+ */
513
+ if ((error = git_fs_path_from_url_or_path(&src_path, git_remote_url(remote))) < 0)
514
+ return error;
515
+
516
+ /* Copy .git/objects/ from the source to the target */
517
+ if ((error = git_repository_open(&src, git_str_cstr(&src_path))) < 0) {
518
+ git_str_dispose(&src_path);
519
+ return error;
520
+ }
521
+
522
+ if (git_repository__item_path(&src_odb, src, GIT_REPOSITORY_ITEM_OBJECTS) < 0 ||
523
+ git_repository__item_path(&dst_odb, repo, GIT_REPOSITORY_ITEM_OBJECTS) < 0) {
524
+ error = -1;
525
+ goto cleanup;
526
+ }
527
+
528
+ flags = 0;
529
+ if (can_link(git_repository_path(src), git_repository_path(repo), link))
530
+ flags |= GIT_CPDIR_LINK_FILES;
531
+
532
+ error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
533
+ flags, GIT_OBJECT_DIR_MODE);
534
+
535
+ /*
536
+ * can_link() doesn't catch all variations, so if we hit an
537
+ * error and did want to link, let's try again without trying
538
+ * to link.
539
+ */
540
+ if (error < 0 && link) {
541
+ flags &= ~GIT_CPDIR_LINK_FILES;
542
+ error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
543
+ flags, GIT_OBJECT_DIR_MODE);
544
+ }
545
+
546
+ if (error < 0)
547
+ goto cleanup;
548
+
549
+ git_str_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
550
+
551
+ if ((error = git_remote_fetch(remote, NULL, &opts->fetch_opts, git_str_cstr(&reflog_message))) != 0)
552
+ goto cleanup;
553
+
554
+ error = checkout_branch(repo, remote, opts, git_str_cstr(&reflog_message));
555
+
556
+ cleanup:
557
+ git_str_dispose(&reflog_message);
558
+ git_str_dispose(&src_path);
559
+ git_str_dispose(&src_odb);
560
+ git_str_dispose(&dst_odb);
561
+ git_repository_free(src);
562
+ return error;
563
+ }
564
+
565
+ int git_clone__should_clone_local(
566
+ bool *out,
567
+ const char *url_or_path,
568
+ git_clone_local_t local)
457
569
  {
458
570
  git_str fromurl = GIT_STR_INIT;
459
- const char *path = url_or_path;
460
- bool is_url, is_local;
571
+
572
+ *out = false;
461
573
 
462
574
  if (local == GIT_CLONE_NO_LOCAL)
463
575
  return 0;
464
576
 
465
- if ((is_url = git_fs_path_is_local_file_url(url_or_path)) != 0) {
466
- if (git_fs_path_fromurl(&fromurl, url_or_path) < 0) {
467
- is_local = -1;
468
- goto done;
469
- }
577
+ if (git_net_str_is_url(url_or_path)) {
578
+ /* If GIT_CLONE_LOCAL_AUTO is specified, any url should
579
+ * be treated as remote */
580
+ if (local == GIT_CLONE_LOCAL_AUTO ||
581
+ !git_fs_path_is_local_file_url(url_or_path))
582
+ return 0;
470
583
 
471
- path = fromurl.ptr;
472
- }
584
+ if (git_fs_path_fromurl(&fromurl, url_or_path) < 0)
585
+ return -1;
473
586
 
474
- is_local = (!is_url || local != GIT_CLONE_LOCAL_AUTO) &&
475
- git_fs_path_isdir(path);
587
+ *out = git_fs_path_isdir(git_str_cstr(&fromurl));
588
+ git_str_dispose(&fromurl);
589
+ } else {
590
+ *out = git_fs_path_isdir(url_or_path);
591
+ }
476
592
 
477
- done:
478
- git_str_dispose(&fromurl);
479
- return is_local;
593
+ return 0;
480
594
  }
481
595
 
482
- static int git__clone(
596
+ static int clone_repo(
483
597
  git_repository **out,
484
598
  const char *url,
485
599
  const char *local_path,
486
- const git_clone_options *_options,
600
+ const git_clone_options *given_opts,
487
601
  int use_existing)
488
602
  {
489
603
  int error = 0;
@@ -497,11 +611,17 @@ static int git__clone(
497
611
  GIT_ASSERT_ARG(url);
498
612
  GIT_ASSERT_ARG(local_path);
499
613
 
500
- if (_options)
501
- memcpy(&options, _options, sizeof(git_clone_options));
614
+ if (given_opts)
615
+ memcpy(&options, given_opts, sizeof(git_clone_options));
502
616
 
503
617
  GIT_ERROR_CHECK_VERSION(&options, GIT_CLONE_OPTIONS_VERSION, "git_clone_options");
504
618
 
619
+ /* enforce some behavior on fetch */
620
+ options.fetch_opts.update_fetchhead = 0;
621
+
622
+ if (!options.fetch_opts.depth)
623
+ options.fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
624
+
505
625
  /* Only clone to a new directory or an empty directory */
506
626
  if (git_fs_path_exists(local_path) && !use_existing && !git_fs_path_is_empty_dir(local_path)) {
507
627
  git_error_set(GIT_ERROR_INVALID,
@@ -522,33 +642,31 @@ static int git__clone(
522
642
  return error;
523
643
 
524
644
  if (!(error = create_and_configure_origin(&origin, repo, url, &options))) {
525
- int clone_local = git_clone__should_clone_local(url, options.local);
526
- int link = options.local != GIT_CLONE_LOCAL_NO_LINKS;
527
-
528
- if (clone_local == 1)
529
- error = clone_local_into(
530
- repo, origin, &options.fetch_opts, &options.checkout_opts,
531
- options.checkout_branch, link);
532
- else if (clone_local == 0)
533
- error = clone_into(
534
- repo, origin, &options.fetch_opts, &options.checkout_opts,
535
- options.checkout_branch);
645
+ bool clone_local;
646
+
647
+ if ((error = git_clone__should_clone_local(&clone_local, url, options.local)) < 0) {
648
+ git_remote_free(origin);
649
+ return error;
650
+ }
651
+
652
+ if (clone_local)
653
+ error = clone_local_into(repo, origin, &options);
536
654
  else
537
- error = -1;
655
+ error = clone_into(repo, origin, &options);
538
656
 
539
657
  git_remote_free(origin);
540
658
  }
541
659
 
542
660
  if (error != 0) {
543
- git_error_state last_error = {0};
544
- git_error_state_capture(&last_error, error);
661
+ git_error *last_error;
662
+ git_error_save(&last_error);
545
663
 
546
664
  git_repository_free(repo);
547
665
  repo = NULL;
548
666
 
549
667
  (void)git_futils_rmdir_r(local_path, NULL, rmdir_flags);
550
668
 
551
- git_error_state_restore(&last_error);
669
+ git_error_restore(last_error);
552
670
  }
553
671
 
554
672
  *out = repo;
@@ -559,18 +677,18 @@ int git_clone(
559
677
  git_repository **out,
560
678
  const char *url,
561
679
  const char *local_path,
562
- const git_clone_options *_options)
680
+ const git_clone_options *options)
563
681
  {
564
- return git__clone(out, url, local_path, _options, 0);
682
+ return clone_repo(out, url, local_path, options, 0);
565
683
  }
566
684
 
567
685
  int git_clone__submodule(
568
686
  git_repository **out,
569
687
  const char *url,
570
688
  const char *local_path,
571
- const git_clone_options *_options)
689
+ const git_clone_options *options)
572
690
  {
573
- return git__clone(out, url, local_path, _options, 1);
691
+ return clone_repo(out, url, local_path, options, 1);
574
692
  }
575
693
 
576
694
  int git_clone_options_init(git_clone_options *opts, unsigned int version)
@@ -586,99 +704,3 @@ int git_clone_init_options(git_clone_options *opts, unsigned int version)
586
704
  return git_clone_options_init(opts, version);
587
705
  }
588
706
  #endif
589
-
590
- static bool can_link(const char *src, const char *dst, int link)
591
- {
592
- #ifdef GIT_WIN32
593
- GIT_UNUSED(src);
594
- GIT_UNUSED(dst);
595
- GIT_UNUSED(link);
596
- return false;
597
- #else
598
-
599
- struct stat st_src, st_dst;
600
-
601
- if (!link)
602
- return false;
603
-
604
- if (p_stat(src, &st_src) < 0)
605
- return false;
606
-
607
- if (p_stat(dst, &st_dst) < 0)
608
- return false;
609
-
610
- return st_src.st_dev == st_dst.st_dev;
611
- #endif
612
- }
613
-
614
- static int clone_local_into(git_repository *repo, git_remote *remote, const git_fetch_options *fetch_opts, const git_checkout_options *co_opts, const char *branch, int link)
615
- {
616
- int error, flags;
617
- git_repository *src;
618
- git_str src_odb = GIT_STR_INIT, dst_odb = GIT_STR_INIT, src_path = GIT_STR_INIT;
619
- git_str reflog_message = GIT_STR_INIT;
620
-
621
- GIT_ASSERT_ARG(repo);
622
- GIT_ASSERT_ARG(remote);
623
-
624
- if (!git_repository_is_empty(repo)) {
625
- git_error_set(GIT_ERROR_INVALID, "the repository is not empty");
626
- return -1;
627
- }
628
-
629
- /*
630
- * Let's figure out what path we should use for the source
631
- * repo, if it's not rooted, the path should be relative to
632
- * the repository's worktree/gitdir.
633
- */
634
- if ((error = git_fs_path_from_url_or_path(&src_path, git_remote_url(remote))) < 0)
635
- return error;
636
-
637
- /* Copy .git/objects/ from the source to the target */
638
- if ((error = git_repository_open(&src, git_str_cstr(&src_path))) < 0) {
639
- git_str_dispose(&src_path);
640
- return error;
641
- }
642
-
643
- if (git_repository__item_path(&src_odb, src, GIT_REPOSITORY_ITEM_OBJECTS) < 0 ||
644
- git_repository__item_path(&dst_odb, repo, GIT_REPOSITORY_ITEM_OBJECTS) < 0) {
645
- error = -1;
646
- goto cleanup;
647
- }
648
-
649
- flags = 0;
650
- if (can_link(git_repository_path(src), git_repository_path(repo), link))
651
- flags |= GIT_CPDIR_LINK_FILES;
652
-
653
- error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
654
- flags, GIT_OBJECT_DIR_MODE);
655
-
656
- /*
657
- * can_link() doesn't catch all variations, so if we hit an
658
- * error and did want to link, let's try again without trying
659
- * to link.
660
- */
661
- if (error < 0 && link) {
662
- flags &= ~GIT_CPDIR_LINK_FILES;
663
- error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
664
- flags, GIT_OBJECT_DIR_MODE);
665
- }
666
-
667
- if (error < 0)
668
- goto cleanup;
669
-
670
- git_str_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
671
-
672
- if ((error = git_remote_fetch(remote, NULL, fetch_opts, git_str_cstr(&reflog_message))) != 0)
673
- goto cleanup;
674
-
675
- error = checkout_branch(repo, remote, co_opts, branch, git_str_cstr(&reflog_message));
676
-
677
- cleanup:
678
- git_str_dispose(&reflog_message);
679
- git_str_dispose(&src_path);
680
- git_str_dispose(&src_odb);
681
- git_str_dispose(&dst_odb);
682
- git_repository_free(src);
683
- return error;
684
- }
@@ -15,6 +15,9 @@ extern int git_clone__submodule(git_repository **out,
15
15
  const char *url, const char *local_path,
16
16
  const git_clone_options *_options);
17
17
 
18
- extern int git_clone__should_clone_local(const char *url, git_clone_local_t local);
18
+ extern int git_clone__should_clone_local(
19
+ bool *out,
20
+ const char *url,
21
+ git_clone_local_t local);
19
22
 
20
23
  #endif
@@ -22,6 +22,7 @@
22
22
  #include "object.h"
23
23
  #include "array.h"
24
24
  #include "oidarray.h"
25
+ #include "grafts.h"
25
26
 
26
27
  void git_commit__free(void *_commit)
27
28
  {
@@ -427,10 +428,6 @@ static int commit_parse(
427
428
  buffer += tree_len;
428
429
  }
429
430
 
430
- /*
431
- * TODO: commit grafts!
432
- */
433
-
434
431
  while (git_object__parse_oid_header(&parent_id,
435
432
  &buffer, buffer_end, "parent ",
436
433
  opts->oid_type) == 0) {
@@ -532,16 +529,41 @@ int git_commit__parse_raw(
532
529
  return commit_parse(commit, data, size, &parse_options);
533
530
  }
534
531
 
532
+ static int assign_commit_parents_from_graft(git_commit *commit, git_commit_graft *graft) {
533
+ size_t idx;
534
+ git_oid *oid;
535
+
536
+ git_array_clear(commit->parent_ids);
537
+ git_array_init_to_size(commit->parent_ids, git_array_size(graft->parents));
538
+ git_array_foreach(graft->parents, idx, oid) {
539
+ git_oid *id = git_array_alloc(commit->parent_ids);
540
+ GIT_ERROR_CHECK_ALLOC(id);
541
+
542
+ git_oid_cpy(id, oid);
543
+ }
544
+
545
+ return 0;
546
+ }
547
+
535
548
  int git_commit__parse_ext(
536
549
  git_commit *commit,
537
550
  git_odb_object *odb_obj,
538
551
  git_commit__parse_options *parse_opts)
539
552
  {
540
- return commit_parse(
541
- commit,
542
- git_odb_object_data(odb_obj),
543
- git_odb_object_size(odb_obj),
544
- parse_opts);
553
+ git_repository *repo = git_object_owner((git_object *)commit);
554
+ git_commit_graft *graft;
555
+ int error;
556
+
557
+ if ((error = commit_parse(commit, git_odb_object_data(odb_obj),
558
+ git_odb_object_size(odb_obj), parse_opts)) < 0)
559
+ return error;
560
+
561
+ /* Perform necessary grafts */
562
+ if (git_grafts_get(&graft, repo->grafts, git_odb_object_id(odb_obj)) != 0 &&
563
+ git_grafts_get(&graft, repo->shallow_grafts, git_odb_object_id(odb_obj)) != 0)
564
+ return 0;
565
+
566
+ return assign_commit_parents_from_graft(commit, graft);
545
567
  }
546
568
 
547
569
  #define GIT_COMMIT_GETTER(_rvalue, _name, _return, _invalid) \
@@ -1064,6 +1086,83 @@ cleanup:
1064
1086
  return error;
1065
1087
  }
1066
1088
 
1089
+ int git_commit_create_from_stage(
1090
+ git_oid *out,
1091
+ git_repository *repo,
1092
+ const char *message,
1093
+ const git_commit_create_options *given_opts)
1094
+ {
1095
+ git_commit_create_options opts = GIT_COMMIT_CREATE_OPTIONS_INIT;
1096
+ git_signature *default_signature = NULL;
1097
+ const git_signature *author, *committer;
1098
+ git_index *index = NULL;
1099
+ git_diff *diff = NULL;
1100
+ git_oid tree_id;
1101
+ git_tree *head_tree = NULL, *tree = NULL;
1102
+ git_commitarray parents = { 0 };
1103
+ int error = -1;
1104
+
1105
+ GIT_ASSERT_ARG(out && repo);
1106
+
1107
+ if (given_opts)
1108
+ memcpy(&opts, given_opts, sizeof(git_commit_create_options));
1109
+
1110
+ author = opts.author;
1111
+ committer = opts.committer;
1112
+
1113
+ if (!author || !committer) {
1114
+ if (git_signature_default(&default_signature, repo) < 0)
1115
+ goto done;
1116
+
1117
+ if (!author)
1118
+ author = default_signature;
1119
+
1120
+ if (!committer)
1121
+ committer = default_signature;
1122
+ }
1123
+
1124
+ if (git_repository_index(&index, repo) < 0)
1125
+ goto done;
1126
+
1127
+ if (!opts.allow_empty_commit) {
1128
+ error = git_repository_head_tree(&head_tree, repo);
1129
+
1130
+ if (error && error != GIT_EUNBORNBRANCH)
1131
+ goto done;
1132
+
1133
+ error = -1;
1134
+
1135
+ if (git_diff_tree_to_index(&diff, repo, head_tree, index, NULL) < 0)
1136
+ goto done;
1137
+
1138
+ if (git_diff_num_deltas(diff) == 0) {
1139
+ git_error_set(GIT_ERROR_REPOSITORY,
1140
+ "no changes are staged for commit");
1141
+ error = GIT_EUNCHANGED;
1142
+ goto done;
1143
+ }
1144
+ }
1145
+
1146
+ if (git_index_write_tree(&tree_id, index) < 0 ||
1147
+ git_tree_lookup(&tree, repo, &tree_id) < 0 ||
1148
+ git_repository_commit_parents(&parents, repo) < 0)
1149
+ goto done;
1150
+
1151
+ error = git_commit_create(out, repo, "HEAD", author, committer,
1152
+ opts.message_encoding, message,
1153
+ tree, parents.count,
1154
+ (const git_commit **)parents.commits);
1155
+
1156
+ done:
1157
+ git_commitarray_dispose(&parents);
1158
+ git_signature_free(default_signature);
1159
+ git_tree_free(tree);
1160
+ git_tree_free(head_tree);
1161
+ git_diff_free(diff);
1162
+ git_index_free(index);
1163
+ return error;
1164
+ }
1165
+
1067
1166
  int git_commit_committer_with_mailmap(
1068
1167
  git_signature **out, const git_commit *commit, const git_mailmap *mailmap)
1069
1168
  {
@@ -1075,3 +1174,18 @@ int git_commit_author_with_mailmap(
1075
1174
  {
1076
1175
  return git_mailmap_resolve_signature(out, mailmap, commit->author);
1077
1176
  }
1177
+
1178
+ void git_commitarray_dispose(git_commitarray *array)
1179
+ {
1180
+ size_t i;
1181
+
1182
+ if (array == NULL)
1183
+ return;
1184
+
1185
+ for (i = 0; i < array->count; i++)
1186
+ git_commit_free(array->commits[i]);
1187
+
1188
+ git__free((git_commit **)array->commits);
1189
+
1190
+ memset(array, 0, sizeof(*array));
1191
+ }