rugged 1.7.2 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/AUTHORS +1 -0
  4. data/vendor/libgit2/CMakeLists.txt +23 -10
  5. data/vendor/libgit2/COPYING +195 -1
  6. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  7. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  8. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  9. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  10. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  11. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  12. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  13. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  14. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  15. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  16. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  17. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  18. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  19. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  20. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  21. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  22. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  23. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  24. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  25. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  26. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  28. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  29. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  30. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  31. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  32. data/vendor/libgit2/deps/xdiff/xmerge.c +2 -2
  33. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  34. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  35. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  36. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  37. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  38. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  39. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  40. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  41. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  42. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  43. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  44. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  45. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  46. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  47. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  48. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  49. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  50. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  51. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  52. data/vendor/libgit2/include/git2/apply.h +27 -6
  53. data/vendor/libgit2/include/git2/attr.h +17 -4
  54. data/vendor/libgit2/include/git2/blame.h +133 -28
  55. data/vendor/libgit2/include/git2/blob.h +71 -28
  56. data/vendor/libgit2/include/git2/branch.h +22 -15
  57. data/vendor/libgit2/include/git2/buffer.h +6 -4
  58. data/vendor/libgit2/include/git2/cert.h +2 -1
  59. data/vendor/libgit2/include/git2/checkout.h +83 -32
  60. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  61. data/vendor/libgit2/include/git2/clone.h +25 -9
  62. data/vendor/libgit2/include/git2/commit.h +132 -3
  63. data/vendor/libgit2/include/git2/common.h +120 -63
  64. data/vendor/libgit2/include/git2/config.h +93 -23
  65. data/vendor/libgit2/include/git2/credential.h +30 -2
  66. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  67. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  68. data/vendor/libgit2/include/git2/describe.h +13 -1
  69. data/vendor/libgit2/include/git2/diff.h +38 -8
  70. data/vendor/libgit2/include/git2/email.h +9 -29
  71. data/vendor/libgit2/include/git2/errors.h +46 -73
  72. data/vendor/libgit2/include/git2/filter.h +14 -7
  73. data/vendor/libgit2/include/git2/global.h +8 -1
  74. data/vendor/libgit2/include/git2/graph.h +3 -2
  75. data/vendor/libgit2/include/git2/ignore.h +10 -0
  76. data/vendor/libgit2/include/git2/index.h +99 -14
  77. data/vendor/libgit2/include/git2/indexer.h +21 -4
  78. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  79. data/vendor/libgit2/include/git2/merge.h +46 -1
  80. data/vendor/libgit2/include/git2/message.h +2 -2
  81. data/vendor/libgit2/include/git2/net.h +3 -1
  82. data/vendor/libgit2/include/git2/notes.h +9 -6
  83. data/vendor/libgit2/include/git2/object.h +9 -8
  84. data/vendor/libgit2/include/git2/odb.h +91 -49
  85. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  86. data/vendor/libgit2/include/git2/oid.h +23 -24
  87. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  88. data/vendor/libgit2/include/git2/pack.h +13 -1
  89. data/vendor/libgit2/include/git2/patch.h +2 -3
  90. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  91. data/vendor/libgit2/include/git2/proxy.h +10 -0
  92. data/vendor/libgit2/include/git2/rebase.h +9 -6
  93. data/vendor/libgit2/include/git2/refdb.h +2 -2
  94. data/vendor/libgit2/include/git2/reflog.h +3 -2
  95. data/vendor/libgit2/include/git2/refs.h +9 -6
  96. data/vendor/libgit2/include/git2/refspec.h +14 -4
  97. data/vendor/libgit2/include/git2/remote.h +94 -18
  98. data/vendor/libgit2/include/git2/repository.h +57 -21
  99. data/vendor/libgit2/include/git2/reset.h +16 -3
  100. data/vendor/libgit2/include/git2/revert.h +9 -4
  101. data/vendor/libgit2/include/git2/revparse.h +3 -3
  102. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  103. data/vendor/libgit2/include/git2/signature.h +46 -1
  104. data/vendor/libgit2/include/git2/stash.h +17 -3
  105. data/vendor/libgit2/include/git2/status.h +10 -6
  106. data/vendor/libgit2/include/git2/stdint.h +87 -85
  107. data/vendor/libgit2/include/git2/strarray.h +2 -3
  108. data/vendor/libgit2/include/git2/submodule.h +20 -9
  109. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  110. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  111. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  112. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  113. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  114. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  115. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  116. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  117. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  118. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  119. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  120. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  121. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  122. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  123. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  124. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  125. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  126. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  127. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  128. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  129. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  130. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  131. data/vendor/libgit2/include/git2/sys/transport.h +24 -3
  132. data/vendor/libgit2/include/git2/tag.h +3 -1
  133. data/vendor/libgit2/include/git2/trace.h +9 -3
  134. data/vendor/libgit2/include/git2/transaction.h +3 -2
  135. data/vendor/libgit2/include/git2/transport.h +11 -3
  136. data/vendor/libgit2/include/git2/tree.h +16 -5
  137. data/vendor/libgit2/include/git2/types.h +19 -3
  138. data/vendor/libgit2/include/git2/version.h +44 -8
  139. data/vendor/libgit2/include/git2/worktree.h +16 -6
  140. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  142. data/vendor/libgit2/src/cli/cmd.c +1 -1
  143. data/vendor/libgit2/src/cli/cmd.h +4 -0
  144. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  145. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  146. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  147. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  149. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  150. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  151. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  152. data/vendor/libgit2/src/cli/common.c +168 -0
  153. data/vendor/libgit2/src/cli/common.h +63 -0
  154. data/vendor/libgit2/src/cli/error.h +1 -1
  155. data/vendor/libgit2/src/cli/main.c +52 -24
  156. data/vendor/libgit2/src/cli/opt.c +29 -3
  157. data/vendor/libgit2/src/cli/opt.h +21 -3
  158. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  159. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  160. data/vendor/libgit2/src/cli/progress.c +51 -2
  161. data/vendor/libgit2/src/cli/progress.h +12 -0
  162. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  163. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  164. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  165. data/vendor/libgit2/src/libgit2/CMakeLists.txt +26 -8
  166. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  167. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  168. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  169. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  170. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  171. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  172. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  173. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  174. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  175. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  176. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  177. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  178. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  179. data/vendor/libgit2/src/libgit2/clone.c +186 -166
  180. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  181. data/vendor/libgit2/src/libgit2/commit.c +92 -0
  182. data/vendor/libgit2/src/libgit2/commit_graph.c +67 -56
  183. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  184. data/vendor/libgit2/src/libgit2/config.c +389 -298
  185. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  186. data/vendor/libgit2/src/libgit2/config.h +9 -4
  187. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  188. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  189. data/vendor/libgit2/src/libgit2/config_file.c +99 -88
  190. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  191. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  192. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  193. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  194. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  195. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  196. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  197. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  198. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  199. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  200. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  201. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  202. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  203. data/vendor/libgit2/src/libgit2/email.c +1 -0
  204. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  205. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  206. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  207. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  208. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  209. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  210. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  211. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  212. data/vendor/libgit2/src/libgit2/index.c +68 -90
  213. data/vendor/libgit2/src/libgit2/index.h +2 -2
  214. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  215. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  216. data/vendor/libgit2/src/libgit2/indexer.c +34 -38
  217. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  218. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  219. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  220. data/vendor/libgit2/src/libgit2/merge.c +42 -37
  221. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  222. data/vendor/libgit2/src/libgit2/midx.c +28 -15
  223. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  224. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  225. data/vendor/libgit2/src/libgit2/object.c +6 -5
  226. data/vendor/libgit2/src/libgit2/odb.c +5 -4
  227. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  228. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  229. data/vendor/libgit2/src/libgit2/oid.c +32 -5
  230. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  231. data/vendor/libgit2/src/libgit2/pack-objects.c +58 -31
  232. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  233. data/vendor/libgit2/src/libgit2/pack.c +30 -24
  234. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  235. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  236. data/vendor/libgit2/src/libgit2/path.c +1 -1
  237. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  238. data/vendor/libgit2/src/libgit2/push.c +79 -28
  239. data/vendor/libgit2/src/libgit2/push.h +1 -0
  240. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  241. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  242. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  243. data/vendor/libgit2/src/libgit2/refs.c +26 -7
  244. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  245. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  246. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  247. data/vendor/libgit2/src/libgit2/remote.c +121 -61
  248. data/vendor/libgit2/src/libgit2/repository.c +231 -51
  249. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  250. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  251. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  252. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  253. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  254. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  255. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  256. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  257. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  258. data/vendor/libgit2/src/libgit2/status.c +1 -1
  259. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  260. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  261. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  262. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  263. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  264. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  265. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  266. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  267. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  268. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  269. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  270. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  271. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  272. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  273. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  274. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  275. data/vendor/libgit2/src/libgit2/transports/httpclient.c +112 -72
  276. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  277. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  278. data/vendor/libgit2/src/libgit2/transports/local.c +8 -7
  279. data/vendor/libgit2/src/libgit2/transports/smart.c +20 -8
  280. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  281. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +2 -2
  282. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  283. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  284. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  285. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  286. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  287. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  288. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  289. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  290. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  291. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  292. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  293. data/vendor/libgit2/src/util/alloc.c +4 -1
  294. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  295. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  296. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  297. data/vendor/libgit2/src/util/array.h +18 -17
  298. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  299. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  300. data/vendor/libgit2/src/util/date.c +22 -14
  301. data/vendor/libgit2/src/util/date.h +12 -0
  302. data/vendor/libgit2/src/util/errors.c +401 -0
  303. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  304. data/vendor/libgit2/src/util/fs_path.c +15 -4
  305. data/vendor/libgit2/src/util/fs_path.h +23 -0
  306. data/vendor/libgit2/src/util/futils.c +6 -5
  307. data/vendor/libgit2/src/util/futils.h +13 -4
  308. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  309. data/vendor/libgit2/src/util/git2_util.h +6 -0
  310. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  311. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  312. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  313. data/vendor/libgit2/src/util/hashmap.h +424 -0
  314. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  315. data/vendor/libgit2/src/util/integer.h +3 -1
  316. data/vendor/libgit2/src/util/net.c +13 -7
  317. data/vendor/libgit2/src/util/net.h +2 -0
  318. data/vendor/libgit2/src/util/pool.c +1 -1
  319. data/vendor/libgit2/src/util/pool.h +5 -0
  320. data/vendor/libgit2/src/util/pqueue.h +1 -1
  321. data/vendor/libgit2/src/util/process.h +222 -0
  322. data/vendor/libgit2/src/util/rand.c +1 -7
  323. data/vendor/libgit2/src/util/regexp.c +1 -1
  324. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  325. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  326. data/vendor/libgit2/src/util/str.c +2 -2
  327. data/vendor/libgit2/src/util/strlist.c +108 -0
  328. data/vendor/libgit2/src/util/strlist.h +36 -0
  329. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  330. data/vendor/libgit2/src/util/unix/process.c +629 -0
  331. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  332. data/vendor/libgit2/src/util/util.c +2 -2
  333. data/vendor/libgit2/src/util/util.h +4 -38
  334. data/vendor/libgit2/src/util/vector.c +3 -3
  335. data/vendor/libgit2/src/util/vector.h +2 -2
  336. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  337. data/vendor/libgit2/src/util/win32/process.c +506 -0
  338. metadata +45 -28
  339. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  340. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  341. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  342. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  343. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  344. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  345. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  346. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  347. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  348. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  349. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  350. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  351. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  352. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  353. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  354. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  355. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  356. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  357. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  358. data/vendor/libgit2/src/util/khash.h +0 -615
  359. data/vendor/libgit2/src/util/strmap.c +0 -100
  360. data/vendor/libgit2/src/util/strmap.h +0 -131
  361. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -30,8 +30,8 @@
30
30
  #include "fs_path.h"
31
31
  #include "attr.h"
32
32
  #include "pool.h"
33
- #include "strmap.h"
34
33
  #include "path.h"
34
+ #include "hashmap_str.h"
35
35
 
36
36
  /* See docs/checkout-internals.md for more information */
37
37
 
@@ -72,7 +72,7 @@ typedef struct {
72
72
  size_t total_steps;
73
73
  size_t completed_steps;
74
74
  git_checkout_perfdata perfdata;
75
- git_strmap *mkdir_map;
75
+ git_hashset_str mkdir_pathcache;
76
76
  git_attr_session attr_session;
77
77
  } checkout_data;
78
78
 
@@ -294,6 +294,9 @@ static int checkout_action_no_wd(
294
294
 
295
295
  *action = CHECKOUT_ACTION__NONE;
296
296
 
297
+ if ((data->strategy & GIT_CHECKOUT_NONE))
298
+ return 0;
299
+
297
300
  switch (delta->status) {
298
301
  case GIT_DELTA_UNMODIFIED: /* case 12 */
299
302
  error = checkout_notify(data, GIT_CHECKOUT_NOTIFY_DIRTY, delta, NULL);
@@ -302,17 +305,17 @@ static int checkout_action_no_wd(
302
305
  *action = CHECKOUT_ACTION_IF(RECREATE_MISSING, UPDATE_BLOB, NONE);
303
306
  break;
304
307
  case GIT_DELTA_ADDED: /* case 2 or 28 (and 5 but not really) */
305
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
308
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
306
309
  break;
307
310
  case GIT_DELTA_MODIFIED: /* case 13 (and 35 but not really) */
308
311
  *action = CHECKOUT_ACTION_IF(RECREATE_MISSING, UPDATE_BLOB, CONFLICT);
309
312
  break;
310
313
  case GIT_DELTA_TYPECHANGE: /* case 21 (B->T) and 28 (T->B)*/
311
314
  if (delta->new_file.mode == GIT_FILEMODE_TREE)
312
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
315
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
313
316
  break;
314
317
  case GIT_DELTA_DELETED: /* case 8 or 25 */
315
- *action = CHECKOUT_ACTION_IF(SAFE, REMOVE, NONE);
318
+ *action = CHECKOUT_ACTION__REMOVE;
316
319
  break;
317
320
  default: /* impossible */
318
321
  break;
@@ -494,6 +497,9 @@ static int checkout_action_with_wd(
494
497
  {
495
498
  *action = CHECKOUT_ACTION__NONE;
496
499
 
500
+ if ((data->strategy & GIT_CHECKOUT_NONE))
501
+ return 0;
502
+
497
503
  switch (delta->status) {
498
504
  case GIT_DELTA_UNMODIFIED: /* case 14/15 or 33 */
499
505
  if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd)) {
@@ -512,14 +518,14 @@ static int checkout_action_with_wd(
512
518
  if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd))
513
519
  *action = CHECKOUT_ACTION_IF(FORCE, REMOVE, CONFLICT);
514
520
  else
515
- *action = CHECKOUT_ACTION_IF(SAFE, REMOVE, NONE);
521
+ *action = CHECKOUT_ACTION__REMOVE;
516
522
  break;
517
523
  case GIT_DELTA_MODIFIED: /* case 16, 17, 18 (or 36 but not really) */
518
524
  if (wd->mode != GIT_FILEMODE_COMMIT &&
519
525
  checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd))
520
526
  *action = CHECKOUT_ACTION_IF(FORCE, UPDATE_BLOB, CONFLICT);
521
527
  else
522
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
528
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
523
529
  break;
524
530
  case GIT_DELTA_TYPECHANGE: /* case 22, 23, 29, 30 */
525
531
  if (delta->old_file.mode == GIT_FILEMODE_TREE) {
@@ -527,13 +533,13 @@ static int checkout_action_with_wd(
527
533
  /* either deleting items in old tree will delete the wd dir,
528
534
  * or we'll get a conflict when we attempt blob update...
529
535
  */
530
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
536
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
531
537
  else if (wd->mode == GIT_FILEMODE_COMMIT) {
532
538
  /* workdir is possibly a "phantom" submodule - treat as a
533
539
  * tree if the only submodule info came from the config
534
540
  */
535
541
  if (submodule_is_config_only(data, wd->path))
536
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
542
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
537
543
  else
538
544
  *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT);
539
545
  } else
@@ -542,7 +548,7 @@ static int checkout_action_with_wd(
542
548
  else if (checkout_is_workdir_modified(data, &delta->old_file, &delta->new_file, wd))
543
549
  *action = CHECKOUT_ACTION_IF(FORCE, REMOVE_AND_UPDATE, CONFLICT);
544
550
  else
545
- *action = CHECKOUT_ACTION_IF(SAFE, REMOVE_AND_UPDATE, NONE);
551
+ *action = CHECKOUT_ACTION__REMOVE_AND_UPDATE;
546
552
 
547
553
  /* don't update if the typechange is to a tree */
548
554
  if (delta->new_file.mode == GIT_FILEMODE_TREE)
@@ -563,6 +569,9 @@ static int checkout_action_with_wd_blocker(
563
569
  {
564
570
  *action = CHECKOUT_ACTION__NONE;
565
571
 
572
+ if ((data->strategy & GIT_CHECKOUT_NONE))
573
+ return 0;
574
+
566
575
  switch (delta->status) {
567
576
  case GIT_DELTA_UNMODIFIED:
568
577
  /* should show delta as dirty / deleted */
@@ -597,6 +606,9 @@ static int checkout_action_with_wd_dir(
597
606
  {
598
607
  *action = CHECKOUT_ACTION__NONE;
599
608
 
609
+ if ((data->strategy & GIT_CHECKOUT_NONE))
610
+ return 0;
611
+
600
612
  switch (delta->status) {
601
613
  case GIT_DELTA_UNMODIFIED: /* case 19 or 24 (or 34 but not really) */
602
614
  GIT_ERROR_CHECK_ERROR(
@@ -627,7 +639,7 @@ static int checkout_action_with_wd_dir(
627
639
  * directory if is it left empty, so we can defer removing the
628
640
  * dir and it will succeed if no children are left.
629
641
  */
630
- *action = CHECKOUT_ACTION_IF(SAFE, UPDATE_BLOB, NONE);
642
+ *action = CHECKOUT_ACTION__UPDATE_BLOB;
631
643
  }
632
644
  else if (delta->new_file.mode != GIT_FILEMODE_TREE)
633
645
  /* For typechange to dir, dir is already created so no action */
@@ -1419,8 +1431,10 @@ static int checkout_mkdir(
1419
1431
  struct git_futils_mkdir_options mkdir_opts = {0};
1420
1432
  int error;
1421
1433
 
1422
- mkdir_opts.dir_map = data->mkdir_map;
1423
- mkdir_opts.pool = &data->pool;
1434
+ if (git_pool_is_initialized(&data->pool)) {
1435
+ mkdir_opts.cache_pool = &data->pool;
1436
+ mkdir_opts.cache_pathset = &data->mkdir_pathcache;
1437
+ }
1424
1438
 
1425
1439
  error = git_futils_mkdir_relative(
1426
1440
  path, base, mode, flags, &mkdir_opts);
@@ -2316,11 +2330,11 @@ static void checkout_data_clear(checkout_data *data)
2316
2330
  data->opts.baseline = NULL;
2317
2331
  }
2318
2332
 
2319
- git_vector_free(&data->removes);
2333
+ git_vector_dispose(&data->removes);
2320
2334
  git_pool_clear(&data->pool);
2321
2335
 
2322
- git_vector_free_deep(&data->remove_conflicts);
2323
- git_vector_free_deep(&data->update_conflicts);
2336
+ git_vector_dispose_deep(&data->remove_conflicts);
2337
+ git_vector_dispose_deep(&data->update_conflicts);
2324
2338
 
2325
2339
  git__free(data->pfx);
2326
2340
  data->pfx = NULL;
@@ -2331,8 +2345,7 @@ static void checkout_data_clear(checkout_data *data)
2331
2345
  git_index_free(data->index);
2332
2346
  data->index = NULL;
2333
2347
 
2334
- git_strmap_free(data->mkdir_map);
2335
- data->mkdir_map = NULL;
2348
+ git_hashset_str_dispose(&data->mkdir_pathcache);
2336
2349
 
2337
2350
  git_attr_session__free(&data->attr_session);
2338
2351
  }
@@ -2432,14 +2445,12 @@ static int checkout_data_init(
2432
2445
 
2433
2446
  /* if you are forcing, allow all safe updates, plus recreate missing */
2434
2447
  if ((data->opts.checkout_strategy & GIT_CHECKOUT_FORCE) != 0)
2435
- data->opts.checkout_strategy |= GIT_CHECKOUT_SAFE |
2436
- GIT_CHECKOUT_RECREATE_MISSING;
2448
+ data->opts.checkout_strategy |= GIT_CHECKOUT_RECREATE_MISSING;
2437
2449
 
2438
2450
  /* if the repository does not actually have an index file, then this
2439
2451
  * is an initial checkout (perhaps from clone), so we allow safe updates
2440
2452
  */
2441
- if (!data->index->on_disk &&
2442
- (data->opts.checkout_strategy & GIT_CHECKOUT_SAFE) != 0)
2453
+ if (!data->index->on_disk)
2443
2454
  data->opts.checkout_strategy |= GIT_CHECKOUT_RECREATE_MISSING;
2444
2455
 
2445
2456
  data->strategy = data->opts.checkout_strategy;
@@ -2513,8 +2524,7 @@ static int checkout_data_init(
2513
2524
  (error = git_vector_init(&data->remove_conflicts, 0, NULL)) < 0 ||
2514
2525
  (error = git_vector_init(&data->update_conflicts, 0, NULL)) < 0 ||
2515
2526
  (error = git_str_puts(&data->target_path, data->opts.target_directory)) < 0 ||
2516
- (error = git_fs_path_to_dir(&data->target_path)) < 0 ||
2517
- (error = git_strmap_new(&data->mkdir_map)) < 0)
2527
+ (error = git_fs_path_to_dir(&data->target_path)) < 0)
2518
2528
  goto cleanup;
2519
2529
 
2520
2530
  data->target_len = git_str_len(&data->target_path);
@@ -12,8 +12,6 @@
12
12
  #include "git2/checkout.h"
13
13
  #include "iterator.h"
14
14
 
15
- #define GIT_CHECKOUT__NOTIFY_CONFLICT_TREE (1u << 12)
16
-
17
15
  /**
18
16
  * Update the working directory to match the target iterator. The
19
17
  * expected baseline value can be passed in via the checkout options
@@ -73,8 +73,7 @@ static int cherrypick_normalize_opts(
73
73
  const char *their_label)
74
74
  {
75
75
  int error = 0;
76
- unsigned int default_checkout_strategy = GIT_CHECKOUT_SAFE |
77
- GIT_CHECKOUT_ALLOW_CONFLICTS;
76
+ unsigned int default_checkout_strategy = GIT_CHECKOUT_ALLOW_CONFLICTS;
78
77
 
79
78
  GIT_UNUSED(repo);
80
79
 
@@ -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,13 +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
-
424
- if (!opts->depth)
425
- fetch_opts.download_tags = GIT_REMOTE_DOWNLOAD_TAGS_ALL;
426
-
427
- 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)
428
435
  goto cleanup;
429
436
 
430
437
  git_str_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
@@ -442,10 +449,10 @@ static int clone_into(
442
449
  (error = git_repository__set_objectformat(repo, oid_type)) < 0)
443
450
  goto cleanup;
444
451
 
445
- 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)
446
453
  goto cleanup;
447
454
 
448
- 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));
449
456
 
450
457
  cleanup:
451
458
  git_remote_free(remote);
@@ -455,37 +462,142 @@ cleanup:
455
462
  return error;
456
463
  }
457
464
 
458
- 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)
459
569
  {
460
570
  git_str fromurl = GIT_STR_INIT;
461
- const char *path = url_or_path;
462
- bool is_url, is_local;
571
+
572
+ *out = false;
463
573
 
464
574
  if (local == GIT_CLONE_NO_LOCAL)
465
575
  return 0;
466
576
 
467
- if ((is_url = git_fs_path_is_local_file_url(url_or_path)) != 0) {
468
- if (git_fs_path_fromurl(&fromurl, url_or_path) < 0) {
469
- is_local = -1;
470
- goto done;
471
- }
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;
472
583
 
473
- path = fromurl.ptr;
474
- }
584
+ if (git_fs_path_fromurl(&fromurl, url_or_path) < 0)
585
+ return -1;
475
586
 
476
- is_local = (!is_url || local != GIT_CLONE_LOCAL_AUTO) &&
477
- 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
+ }
478
592
 
479
- done:
480
- git_str_dispose(&fromurl);
481
- return is_local;
593
+ return 0;
482
594
  }
483
595
 
484
- static int git__clone(
596
+ static int clone_repo(
485
597
  git_repository **out,
486
598
  const char *url,
487
599
  const char *local_path,
488
- const git_clone_options *_options,
600
+ const git_clone_options *given_opts,
489
601
  int use_existing)
490
602
  {
491
603
  int error = 0;
@@ -499,11 +611,17 @@ static int git__clone(
499
611
  GIT_ASSERT_ARG(url);
500
612
  GIT_ASSERT_ARG(local_path);
501
613
 
502
- if (_options)
503
- memcpy(&options, _options, sizeof(git_clone_options));
614
+ if (given_opts)
615
+ memcpy(&options, given_opts, sizeof(git_clone_options));
504
616
 
505
617
  GIT_ERROR_CHECK_VERSION(&options, GIT_CLONE_OPTIONS_VERSION, "git_clone_options");
506
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
+
507
625
  /* Only clone to a new directory or an empty directory */
508
626
  if (git_fs_path_exists(local_path) && !use_existing && !git_fs_path_is_empty_dir(local_path)) {
509
627
  git_error_set(GIT_ERROR_INVALID,
@@ -524,33 +642,31 @@ static int git__clone(
524
642
  return error;
525
643
 
526
644
  if (!(error = create_and_configure_origin(&origin, repo, url, &options))) {
527
- int clone_local = git_clone__should_clone_local(url, options.local);
528
- int link = options.local != GIT_CLONE_LOCAL_NO_LINKS;
529
-
530
- if (clone_local == 1)
531
- error = clone_local_into(
532
- repo, origin, &options.fetch_opts, &options.checkout_opts,
533
- options.checkout_branch, link);
534
- else if (clone_local == 0)
535
- error = clone_into(
536
- repo, origin, &options.fetch_opts, &options.checkout_opts,
537
- 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);
538
654
  else
539
- error = -1;
655
+ error = clone_into(repo, origin, &options);
540
656
 
541
657
  git_remote_free(origin);
542
658
  }
543
659
 
544
660
  if (error != 0) {
545
- git_error_state last_error = {0};
546
- git_error_state_capture(&last_error, error);
661
+ git_error *last_error;
662
+ git_error_save(&last_error);
547
663
 
548
664
  git_repository_free(repo);
549
665
  repo = NULL;
550
666
 
551
667
  (void)git_futils_rmdir_r(local_path, NULL, rmdir_flags);
552
668
 
553
- git_error_state_restore(&last_error);
669
+ git_error_restore(last_error);
554
670
  }
555
671
 
556
672
  *out = repo;
@@ -561,18 +677,18 @@ int git_clone(
561
677
  git_repository **out,
562
678
  const char *url,
563
679
  const char *local_path,
564
- const git_clone_options *_options)
680
+ const git_clone_options *options)
565
681
  {
566
- return git__clone(out, url, local_path, _options, 0);
682
+ return clone_repo(out, url, local_path, options, 0);
567
683
  }
568
684
 
569
685
  int git_clone__submodule(
570
686
  git_repository **out,
571
687
  const char *url,
572
688
  const char *local_path,
573
- const git_clone_options *_options)
689
+ const git_clone_options *options)
574
690
  {
575
- return git__clone(out, url, local_path, _options, 1);
691
+ return clone_repo(out, url, local_path, options, 1);
576
692
  }
577
693
 
578
694
  int git_clone_options_init(git_clone_options *opts, unsigned int version)
@@ -588,99 +704,3 @@ int git_clone_init_options(git_clone_options *opts, unsigned int version)
588
704
  return git_clone_options_init(opts, version);
589
705
  }
590
706
  #endif
591
-
592
- static bool can_link(const char *src, const char *dst, int link)
593
- {
594
- #ifdef GIT_WIN32
595
- GIT_UNUSED(src);
596
- GIT_UNUSED(dst);
597
- GIT_UNUSED(link);
598
- return false;
599
- #else
600
-
601
- struct stat st_src, st_dst;
602
-
603
- if (!link)
604
- return false;
605
-
606
- if (p_stat(src, &st_src) < 0)
607
- return false;
608
-
609
- if (p_stat(dst, &st_dst) < 0)
610
- return false;
611
-
612
- return st_src.st_dev == st_dst.st_dev;
613
- #endif
614
- }
615
-
616
- 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)
617
- {
618
- int error, flags;
619
- git_repository *src;
620
- git_str src_odb = GIT_STR_INIT, dst_odb = GIT_STR_INIT, src_path = GIT_STR_INIT;
621
- git_str reflog_message = GIT_STR_INIT;
622
-
623
- GIT_ASSERT_ARG(repo);
624
- GIT_ASSERT_ARG(remote);
625
-
626
- if (!git_repository_is_empty(repo)) {
627
- git_error_set(GIT_ERROR_INVALID, "the repository is not empty");
628
- return -1;
629
- }
630
-
631
- /*
632
- * Let's figure out what path we should use for the source
633
- * repo, if it's not rooted, the path should be relative to
634
- * the repository's worktree/gitdir.
635
- */
636
- if ((error = git_fs_path_from_url_or_path(&src_path, git_remote_url(remote))) < 0)
637
- return error;
638
-
639
- /* Copy .git/objects/ from the source to the target */
640
- if ((error = git_repository_open(&src, git_str_cstr(&src_path))) < 0) {
641
- git_str_dispose(&src_path);
642
- return error;
643
- }
644
-
645
- if (git_repository__item_path(&src_odb, src, GIT_REPOSITORY_ITEM_OBJECTS) < 0 ||
646
- git_repository__item_path(&dst_odb, repo, GIT_REPOSITORY_ITEM_OBJECTS) < 0) {
647
- error = -1;
648
- goto cleanup;
649
- }
650
-
651
- flags = 0;
652
- if (can_link(git_repository_path(src), git_repository_path(repo), link))
653
- flags |= GIT_CPDIR_LINK_FILES;
654
-
655
- error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
656
- flags, GIT_OBJECT_DIR_MODE);
657
-
658
- /*
659
- * can_link() doesn't catch all variations, so if we hit an
660
- * error and did want to link, let's try again without trying
661
- * to link.
662
- */
663
- if (error < 0 && link) {
664
- flags &= ~GIT_CPDIR_LINK_FILES;
665
- error = git_futils_cp_r(git_str_cstr(&src_odb), git_str_cstr(&dst_odb),
666
- flags, GIT_OBJECT_DIR_MODE);
667
- }
668
-
669
- if (error < 0)
670
- goto cleanup;
671
-
672
- git_str_printf(&reflog_message, "clone: from %s", git_remote_url(remote));
673
-
674
- if ((error = git_remote_fetch(remote, NULL, fetch_opts, git_str_cstr(&reflog_message))) != 0)
675
- goto cleanup;
676
-
677
- error = checkout_branch(repo, remote, co_opts, branch, git_str_cstr(&reflog_message));
678
-
679
- cleanup:
680
- git_str_dispose(&reflog_message);
681
- git_str_dispose(&src_path);
682
- git_str_dispose(&src_odb);
683
- git_str_dispose(&dst_odb);
684
- git_repository_free(src);
685
- return error;
686
- }