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
@@ -26,7 +26,6 @@
26
26
  #include <git2/branch.h>
27
27
  #include <git2/sys/refdb_backend.h>
28
28
  #include <git2/sys/refs.h>
29
- #include <git2/sys/reflog.h>
30
29
 
31
30
  #define DEFAULT_NESTING_LEVEL 5
32
31
  #define MAX_NESTING_LEVEL 10
@@ -62,8 +61,8 @@ typedef struct refdb_fs_backend {
62
61
 
63
62
  git_oid_t oid_type;
64
63
 
65
- int fsync : 1,
66
- sorted : 1;
64
+ unsigned int fsync : 1,
65
+ sorted : 1;
67
66
  int peeling_mode;
68
67
  git_iterator_flag_t iterator_flags;
69
68
  uint32_t direach_flags;
@@ -410,7 +409,9 @@ static const char *loose_parse_symbolic(git_str *file_content)
410
409
  static bool is_per_worktree_ref(const char *ref_name)
411
410
  {
412
411
  return git__prefixcmp(ref_name, "refs/") != 0 ||
413
- git__prefixcmp(ref_name, "refs/bisect/") == 0;
412
+ git__prefixcmp(ref_name, "refs/bisect/") == 0 ||
413
+ git__prefixcmp(ref_name, "refs/worktree/") == 0 ||
414
+ git__prefixcmp(ref_name, "refs/rewritten/") == 0;
414
415
  }
415
416
 
416
417
  static int loose_lookup(
@@ -799,86 +800,155 @@ static void refdb_fs_backend__iterator_free(git_reference_iterator *_iter)
799
800
  {
800
801
  refdb_fs_iter *iter = GIT_CONTAINER_OF(_iter, refdb_fs_iter, parent);
801
802
 
802
- git_vector_free(&iter->loose);
803
+ git_vector_dispose(&iter->loose);
803
804
  git_pool_clear(&iter->pool);
804
805
  git_sortedcache_free(iter->cache);
805
806
  git__free(iter);
806
807
  }
807
808
 
808
- static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
809
+ struct iter_load_context {
810
+ refdb_fs_backend *backend;
811
+ refdb_fs_iter *iter;
812
+
813
+ /*
814
+ * If we have a glob with a prefix (eg `refs/heads/ *`) then we can
815
+ * optimize our prefix to avoid walking refs that we know won't
816
+ * match. This is that prefix.
817
+ */
818
+ const char *ref_prefix;
819
+ size_t ref_prefix_len;
820
+
821
+ /* Temporary variables to avoid unnecessary allocations */
822
+ git_str ref_name;
823
+ git_str path;
824
+ };
825
+
826
+ static void iter_load_optimize_prefix(struct iter_load_context *ctx)
809
827
  {
810
- int error = 0;
811
- git_str path = GIT_STR_INIT;
812
- git_iterator *fsit = NULL;
813
- git_iterator_options fsit_opts = GIT_ITERATOR_OPTIONS_INIT;
814
- const git_index_entry *entry = NULL;
815
- const char *ref_prefix = GIT_REFS_DIR;
816
- size_t ref_prefix_len = strlen(ref_prefix);
828
+ const char *pos, *last_sep = NULL;
817
829
 
818
- if (!backend->commonpath) /* do nothing if no commonpath for loose refs */
819
- return 0;
830
+ if (!ctx->iter->glob)
831
+ return;
820
832
 
821
- fsit_opts.flags = backend->iterator_flags;
822
-
823
- if (iter->glob) {
824
- const char *last_sep = NULL;
825
- const char *pos;
826
- for (pos = iter->glob; *pos; ++pos) {
827
- switch (*pos) {
828
- case '?':
829
- case '*':
830
- case '[':
831
- case '\\':
832
- break;
833
- case '/':
834
- last_sep = pos;
835
- /* FALLTHROUGH */
836
- default:
837
- continue;
838
- }
833
+ for (pos = ctx->iter->glob; *pos; pos++) {
834
+ switch (*pos) {
835
+ case '?':
836
+ case '*':
837
+ case '[':
838
+ case '\\':
839
839
  break;
840
+ case '/':
841
+ last_sep = pos;
842
+ /* FALLTHROUGH */
843
+ default:
844
+ continue;
840
845
  }
841
- if (last_sep) {
842
- ref_prefix = iter->glob;
843
- ref_prefix_len = (last_sep - ref_prefix) + 1;
844
- }
846
+ break;
845
847
  }
846
848
 
847
- if ((error = git_str_puts(&path, backend->commonpath)) < 0 ||
848
- (error = git_str_put(&path, ref_prefix, ref_prefix_len)) < 0) {
849
- git_str_dispose(&path);
850
- return error;
849
+ if (last_sep) {
850
+ ctx->ref_prefix = ctx->iter->glob;
851
+ ctx->ref_prefix_len = (last_sep - ctx->ref_prefix) + 1;
851
852
  }
853
+ }
854
+
855
+ static int iter_load_paths(
856
+ struct iter_load_context *ctx,
857
+ const char *root_path,
858
+ bool worktree)
859
+ {
860
+ git_iterator *fsit = NULL;
861
+ git_iterator_options fsit_opts = GIT_ITERATOR_OPTIONS_INIT;
862
+ const git_index_entry *entry;
863
+ int error = 0;
864
+
865
+ fsit_opts.flags = ctx->backend->iterator_flags;
866
+
867
+ git_str_clear(&ctx->path);
868
+ git_str_puts(&ctx->path, root_path);
869
+ git_str_put(&ctx->path, ctx->ref_prefix, ctx->ref_prefix_len);
852
870
 
853
- if ((error = git_iterator_for_filesystem(&fsit, path.ptr, &fsit_opts)) < 0) {
854
- git_str_dispose(&path);
855
- return (iter->glob && error == GIT_ENOTFOUND)? 0 : error;
871
+ fsit_opts.flags = ctx->backend->iterator_flags;
872
+ fsit_opts.oid_type = ctx->backend->oid_type;
873
+
874
+ if ((error = git_iterator_for_filesystem(&fsit, ctx->path.ptr, &fsit_opts)) < 0) {
875
+ /*
876
+ * Subdirectories - either glob provided or per-worktree refs - need
877
+ * not exist.
878
+ */
879
+ if ((worktree || ctx->iter->glob) && error == GIT_ENOTFOUND)
880
+ error = 0;
881
+
882
+ goto done;
856
883
  }
857
884
 
858
- error = git_str_sets(&path, ref_prefix);
885
+ git_str_clear(&ctx->ref_name);
886
+ git_str_put(&ctx->ref_name, ctx->ref_prefix, ctx->ref_prefix_len);
859
887
 
860
- while (!error && !git_iterator_advance(&entry, fsit)) {
861
- const char *ref_name;
888
+ while (git_iterator_advance(&entry, fsit) == 0) {
862
889
  char *ref_dup;
863
890
 
864
- git_str_truncate(&path, ref_prefix_len);
865
- git_str_puts(&path, entry->path);
866
- ref_name = git_str_cstr(&path);
891
+ git_str_truncate(&ctx->ref_name, ctx->ref_prefix_len);
892
+ git_str_puts(&ctx->ref_name, entry->path);
893
+
894
+ if (worktree) {
895
+ if (!is_per_worktree_ref(ctx->ref_name.ptr))
896
+ continue;
897
+ } else {
898
+ if (git_repository_is_worktree(ctx->backend->repo) &&
899
+ is_per_worktree_ref(ctx->ref_name.ptr))
900
+ continue;
901
+ }
867
902
 
868
- if (git__suffixcmp(ref_name, ".lock") == 0 ||
869
- (iter->glob && wildmatch(iter->glob, ref_name, 0) != 0))
903
+ if (git__suffixcmp(ctx->ref_name.ptr, ".lock") == 0)
870
904
  continue;
871
905
 
872
- ref_dup = git_pool_strdup(&iter->pool, ref_name);
873
- if (!ref_dup)
874
- error = -1;
875
- else
876
- error = git_vector_insert(&iter->loose, ref_dup);
906
+ if (ctx->iter->glob && wildmatch(ctx->iter->glob, ctx->ref_name.ptr, 0))
907
+ continue;
908
+
909
+ ref_dup = git_pool_strdup(&ctx->iter->pool, ctx->ref_name.ptr);
910
+ GIT_ERROR_CHECK_ALLOC(ref_dup);
911
+
912
+ if ((error = git_vector_insert(&ctx->iter->loose, ref_dup)) < 0)
913
+ goto done;
877
914
  }
878
915
 
916
+ done:
879
917
  git_iterator_free(fsit);
880
- git_str_dispose(&path);
918
+ return error;
919
+ }
920
+
921
+ #define iter_load_context_init(b, i) { b, i, GIT_REFS_DIR, CONST_STRLEN(GIT_REFS_DIR) }
922
+ #define iter_load_context_dispose(ctx) do { \
923
+ git_str_dispose(&((ctx)->path)); \
924
+ git_str_dispose(&((ctx)->ref_name)); \
925
+ } while(0)
881
926
 
927
+ static int iter_load_loose_paths(
928
+ refdb_fs_backend *backend,
929
+ refdb_fs_iter *iter)
930
+ {
931
+ struct iter_load_context ctx = iter_load_context_init(backend, iter);
932
+
933
+ int error = 0;
934
+
935
+ if (!backend->commonpath)
936
+ return 0;
937
+
938
+ iter_load_optimize_prefix(&ctx);
939
+
940
+ if ((error = iter_load_paths(&ctx,
941
+ backend->commonpath, false)) < 0)
942
+ goto done;
943
+
944
+ if (git_repository_is_worktree(backend->repo)) {
945
+ if ((error = iter_load_paths(&ctx,
946
+ backend->gitpath, true)) < 0)
947
+ goto done;
948
+ }
949
+
950
+ done:
951
+ iter_load_context_dispose(&ctx);
882
952
  return error;
883
953
  }
884
954
 
@@ -1782,7 +1852,7 @@ static int refdb_fs_backend__rename(
1782
1852
  (error = refdb_fs_backend__lookup(&old, _backend, old_name)) < 0)
1783
1853
  return error;
1784
1854
 
1785
- if ((error = refdb_fs_backend__delete(_backend, old_name, NULL, NULL)) < 0) {
1855
+ if ((error = loose_lock(&file, backend, old->name)) < 0) {
1786
1856
  git_reference_free(old);
1787
1857
  return error;
1788
1858
  }
@@ -1790,32 +1860,33 @@ static int refdb_fs_backend__rename(
1790
1860
  new = git_reference__realloc(&old, new_name);
1791
1861
  if (!new) {
1792
1862
  git_reference_free(old);
1863
+ git_filebuf_cleanup(&file);
1793
1864
  return -1;
1794
1865
  }
1795
1866
 
1796
- if ((error = loose_lock(&file, backend, new->name)) < 0) {
1867
+ if ((error = refdb_fs_backend__delete_tail(_backend, &file, old_name, NULL, NULL)) < 0) {
1797
1868
  git_reference_free(new);
1869
+ git_filebuf_cleanup(&file);
1798
1870
  return error;
1799
1871
  }
1800
1872
 
1801
- /* Try to rename the refog; it's ok if the old doesn't exist */
1802
- error = refdb_reflog_fs__rename(_backend, old_name, new_name);
1803
- if (((error == 0) || (error == GIT_ENOTFOUND)) &&
1804
- ((error = reflog_append(backend, new, git_reference_target(new), NULL, who, message)) < 0)) {
1873
+ if ((error = loose_lock(&file, backend, new_name)) < 0) {
1805
1874
  git_reference_free(new);
1806
- git_filebuf_cleanup(&file);
1807
1875
  return error;
1808
1876
  }
1809
1877
 
1810
- if (error < 0) {
1878
+ /* Try to rename the refog; it's ok if the old doesn't exist */
1879
+ error = refdb_reflog_fs__rename(_backend, old_name, new_name);
1880
+ if (((error == 0) || (error == GIT_ENOTFOUND)) &&
1881
+ ((error = reflog_append(backend, new, git_reference_target(new), NULL, who, message)) < 0)) {
1811
1882
  git_reference_free(new);
1812
1883
  git_filebuf_cleanup(&file);
1813
1884
  return error;
1814
1885
  }
1815
1886
 
1816
-
1817
1887
  if ((error = loose_commit(&file, new)) < 0 || out == NULL) {
1818
1888
  git_reference_free(new);
1889
+ git_filebuf_cleanup(&file);
1819
1890
  return error;
1820
1891
  }
1821
1892
 
@@ -1949,9 +2020,9 @@ static int reflog_parse(git_reflog *log, const char *buf, size_t buf_size)
1949
2020
  entry->committer = git__calloc(1, sizeof(*entry->committer));
1950
2021
  GIT_ERROR_CHECK_ALLOC(entry->committer);
1951
2022
 
1952
- if (git_parse_advance_oid(&entry->oid_old, &parser) < 0 ||
2023
+ if (git_parse_advance_oid(&entry->oid_old, &parser, log->oid_type) < 0 ||
1953
2024
  git_parse_advance_expected(&parser, " ", 1) < 0 ||
1954
- git_parse_advance_oid(&entry->oid_cur, &parser) < 0)
2025
+ git_parse_advance_oid(&entry->oid_cur, &parser, log->oid_type) < 0)
1955
2026
  goto next;
1956
2027
 
1957
2028
  sig = parser.line;
@@ -2398,7 +2469,12 @@ static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name
2398
2469
  if ((error = reflog_path(&path, backend->repo, name)) < 0)
2399
2470
  goto out;
2400
2471
 
2401
- if (!git_fs_path_exists(path.ptr))
2472
+ /*
2473
+ * If a reference was moved downwards, eg refs/heads/br2 -> refs/heads/br2/new-name,
2474
+ * refs/heads/br2 does exist but it's a directory. That's a valid situation.
2475
+ * Proceed only if it's a file.
2476
+ */
2477
+ if (!git_fs_path_isfile(path.ptr))
2402
2478
  goto out;
2403
2479
 
2404
2480
  if ((error = p_unlink(path.ptr)) < 0)
@@ -13,7 +13,6 @@
13
13
  #include "refdb.h"
14
14
 
15
15
  #include "git2/sys/refdb_backend.h"
16
- #include "git2/sys/reflog.h"
17
16
 
18
17
  void git_reflog_entry__free(git_reflog_entry *entry)
19
18
  {
@@ -40,7 +39,7 @@ void git_reflog_free(git_reflog *reflog)
40
39
  git_reflog_entry__free(entry);
41
40
  }
42
41
 
43
- git_vector_free(&reflog->entries);
42
+ git_vector_dispose(&reflog->entries);
44
43
  git__free(reflog->ref_name);
45
44
  git__free(reflog);
46
45
  }
@@ -37,4 +37,6 @@ GIT_INLINE(size_t) reflog_inverse_index(size_t idx, size_t total)
37
37
  return (total - 1) - idx;
38
38
  }
39
39
 
40
+ void git_reflog_entry__free(git_reflog_entry *entry);
41
+
40
42
  #endif
@@ -72,6 +72,7 @@ git_reference *git_reference__alloc(
72
72
  const git_oid *oid,
73
73
  const git_oid *peel)
74
74
  {
75
+ git_oid_t oid_type;
75
76
  git_reference *ref;
76
77
 
77
78
  GIT_ASSERT_ARG_WITH_RETVAL(name, NULL);
@@ -84,10 +85,16 @@ git_reference *git_reference__alloc(
84
85
  ref->type = GIT_REFERENCE_DIRECT;
85
86
  git_oid_cpy(&ref->target.oid, oid);
86
87
 
88
+ #ifdef GIT_EXPERIMENTAL_SHA256
89
+ oid_type = oid->type;
90
+ #else
91
+ oid_type = GIT_OID_SHA1;
92
+ #endif
93
+
87
94
  if (peel != NULL)
88
95
  git_oid_cpy(&ref->peel, peel);
89
96
  else
90
- git_oid_clear(&ref->peel, GIT_OID_SHA1);
97
+ git_oid_clear(&ref->peel, oid_type);
91
98
 
92
99
  return ref;
93
100
  }
@@ -801,7 +808,7 @@ int git_reference_list(
801
808
 
802
809
  if (git_reference_foreach_name(
803
810
  repo, &cb__reflist_add, (void *)&ref_list) < 0) {
804
- git_vector_free(&ref_list);
811
+ git_vector_dispose(&ref_list);
805
812
  return -1;
806
813
  }
807
814
 
@@ -828,17 +835,20 @@ static int is_valid_ref_char(char ch)
828
835
  }
829
836
  }
830
837
 
831
- static int ensure_segment_validity(const char *name, char may_contain_glob)
838
+ static int ensure_segment_validity(const char *name, char may_contain_glob, bool allow_caret_prefix)
832
839
  {
833
840
  const char *current = name;
841
+ const char *start = current;
834
842
  char prev = '\0';
835
843
  const int lock_len = (int)strlen(GIT_FILELOCK_EXTENSION);
836
844
  int segment_len;
837
845
 
838
846
  if (*current == '.')
839
847
  return -1; /* Refname starts with "." */
848
+ if (allow_caret_prefix && *current == '^')
849
+ start++;
840
850
 
841
- for (current = name; ; current++) {
851
+ for (current = start; ; current++) {
842
852
  if (*current == '\0' || *current == '/')
843
853
  break;
844
854
 
@@ -870,7 +880,7 @@ static int ensure_segment_validity(const char *name, char may_contain_glob)
870
880
  return segment_len;
871
881
  }
872
882
 
873
- static bool is_all_caps_and_underscore(const char *name, size_t len)
883
+ static bool is_valid_normalized_name(const char *name, size_t len)
874
884
  {
875
885
  size_t i;
876
886
  char c;
@@ -881,6 +891,9 @@ static bool is_all_caps_and_underscore(const char *name, size_t len)
881
891
  for (i = 0; i < len; i++)
882
892
  {
883
893
  c = name[i];
894
+ if (i == 0 && c == '^')
895
+ continue; /* The first character is allowed to be "^" for negative refspecs */
896
+
884
897
  if ((c < 'A' || c > 'Z') && c != '_')
885
898
  return false;
886
899
  }
@@ -901,6 +914,7 @@ int git_reference__normalize_name(
901
914
  int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC;
902
915
  unsigned int process_flags;
903
916
  bool normalize = (buf != NULL);
917
+ bool allow_caret_prefix = true;
904
918
  bool validate = (flags & GIT_REFERENCE_FORMAT__VALIDATION_DISABLE) == 0;
905
919
 
906
920
  #ifdef GIT_USE_ICONV
@@ -938,7 +952,7 @@ int git_reference__normalize_name(
938
952
  while (true) {
939
953
  char may_contain_glob = process_flags & GIT_REFERENCE_FORMAT_REFSPEC_PATTERN;
940
954
 
941
- segment_len = ensure_segment_validity(current, may_contain_glob);
955
+ segment_len = ensure_segment_validity(current, may_contain_glob, allow_caret_prefix);
942
956
  if (segment_len < 0)
943
957
  goto cleanup;
944
958
 
@@ -974,6 +988,12 @@ int git_reference__normalize_name(
974
988
  break;
975
989
 
976
990
  current += segment_len + 1;
991
+
992
+ /*
993
+ * A caret prefix is only allowed in the first segment to signify a
994
+ * negative refspec.
995
+ */
996
+ allow_caret_prefix = false;
977
997
  }
978
998
 
979
999
  /* A refname can not be empty */
@@ -993,12 +1013,12 @@ int git_reference__normalize_name(
993
1013
 
994
1014
  if ((segments_count == 1 ) &&
995
1015
  !(flags & GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND) &&
996
- !(is_all_caps_and_underscore(name, (size_t)segment_len) ||
1016
+ !(is_valid_normalized_name(name, (size_t)segment_len) ||
997
1017
  ((flags & GIT_REFERENCE_FORMAT_REFSPEC_PATTERN) && !strcmp("*", name))))
998
1018
  goto cleanup;
999
1019
 
1000
1020
  if ((segments_count > 1)
1001
- && (is_all_caps_and_underscore(name, strchr(name, '/') - name)))
1021
+ && (is_valid_normalized_name(name, strchr(name, '/') - name)))
1002
1022
  goto cleanup;
1003
1023
 
1004
1024
  error = 0;
@@ -1073,6 +1093,12 @@ int git_reference_cmp(
1073
1093
  return git_oid__cmp(&ref1->target.oid, &ref2->target.oid);
1074
1094
  }
1075
1095
 
1096
+ int git_reference__cmp_cb(const void *a, const void *b)
1097
+ {
1098
+ return git_reference_cmp(
1099
+ (const git_reference *)a, (const git_reference *)b);
1100
+ }
1101
+
1076
1102
  /*
1077
1103
  * Starting with the reference given by `ref_name`, follows symbolic
1078
1104
  * references until a direct reference is found and updated the OID
@@ -12,7 +12,6 @@
12
12
  #include "git2/oid.h"
13
13
  #include "git2/refs.h"
14
14
  #include "git2/refdb.h"
15
- #include "strmap.h"
16
15
  #include "str.h"
17
16
  #include "oid.h"
18
17
 
@@ -92,6 +91,12 @@ int git_reference__is_tag(const char *ref_name);
92
91
  int git_reference__is_note(const char *ref_name);
93
92
  const char *git_reference__shorthand(const char *name);
94
93
 
94
+ /*
95
+ * A `git_reference_cmp` wrapper suitable for passing to generic
96
+ * comparators, like `vector_cmp` / `tsort` / etc.
97
+ */
98
+ int git_reference__cmp_cb(const void *a, const void *b);
99
+
95
100
  /**
96
101
  * Lookup a reference by name and try to resolve to an OID.
97
102
  *
@@ -22,6 +22,7 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
22
22
  const char *lhs, *rhs;
23
23
  int valid = 0;
24
24
  unsigned int flags;
25
+ bool is_neg_refspec = false;
25
26
 
26
27
  GIT_ASSERT_ARG(refspec);
27
28
  GIT_ASSERT_ARG(input);
@@ -34,6 +35,9 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
34
35
  refspec->force = 1;
35
36
  lhs++;
36
37
  }
38
+ if (*lhs == '^') {
39
+ is_neg_refspec = true;
40
+ }
37
41
 
38
42
  rhs = strrchr(lhs, ':');
39
43
 
@@ -62,7 +66,14 @@ int git_refspec__parse(git_refspec *refspec, const char *input, bool is_fetch)
62
66
 
63
67
  llen = (rhs ? (size_t)(rhs - lhs - 1) : strlen(lhs));
64
68
  if (1 <= llen && memchr(lhs, '*', llen)) {
65
- if ((rhs && !is_glob) || (!rhs && is_fetch))
69
+ /*
70
+ * If the lefthand side contains a glob, then one of the following must be
71
+ * true, otherwise the spec is invalid
72
+ * 1) the rhs exists and also contains a glob
73
+ * 2) it is a negative refspec (i.e. no rhs)
74
+ * 3) the rhs doesn't exist and we're fetching
75
+ */
76
+ if ((rhs && !is_glob) || (rhs && is_neg_refspec) || (!rhs && is_fetch && !is_neg_refspec))
66
77
  goto invalid;
67
78
  is_glob = 1;
68
79
  } else if (rhs && is_glob)
@@ -225,6 +236,14 @@ int git_refspec_force(const git_refspec *refspec)
225
236
  return refspec->force;
226
237
  }
227
238
 
239
+ int git_refspec_src_matches_negative(const git_refspec *refspec, const char *refname)
240
+ {
241
+ if (refspec == NULL || refspec->src == NULL || !git_refspec_is_negative(refspec))
242
+ return false;
243
+
244
+ return (wildmatch(refspec->src + 1, refname, 0) == 0);
245
+ }
246
+
228
247
  int git_refspec_src_matches(const git_refspec *refspec, const char *refname)
229
248
  {
230
249
  if (refspec == NULL || refspec->src == NULL)
@@ -340,6 +359,14 @@ int git_refspec_is_wildcard(const git_refspec *spec)
340
359
  return (spec->src[strlen(spec->src) - 1] == '*');
341
360
  }
342
361
 
362
+ int git_refspec_is_negative(const git_refspec *spec)
363
+ {
364
+ GIT_ASSERT_ARG(spec);
365
+ GIT_ASSERT_ARG(spec->src);
366
+
367
+ return (spec->src[0] == '^' && spec->dst == NULL);
368
+ }
369
+
343
370
  git_direction git_refspec_direction(const git_refspec *spec)
344
371
  {
345
372
  GIT_ASSERT_ARG(spec);
@@ -45,6 +45,14 @@ int git_refspec__serialize(git_str *out, const git_refspec *refspec);
45
45
  */
46
46
  int git_refspec_is_wildcard(const git_refspec *spec);
47
47
 
48
+ /**
49
+ * Determines if a refspec is a negative refspec.
50
+ *
51
+ * @param spec the refspec
52
+ * @return 1 if the refspec is a negative, 0 otherwise
53
+ */
54
+ int git_refspec_is_negative(const git_refspec *spec);
55
+
48
56
  /**
49
57
  * DWIM `spec` with `refs` existing on the remote, append the dwim'ed
50
58
  * result in `out`.