rugged 1.7.2 → 1.9.4

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 (405) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +4 -4
  3. data/ext/rugged/rugged.c +12 -1
  4. data/ext/rugged/rugged_blame.c +22 -6
  5. data/ext/rugged/rugged_blob.c +24 -9
  6. data/ext/rugged/rugged_branch.c +10 -7
  7. data/ext/rugged/rugged_branch_collection.c +8 -6
  8. data/ext/rugged/rugged_commit.c +7 -6
  9. data/ext/rugged/rugged_config.c +20 -11
  10. data/ext/rugged/rugged_diff.c +26 -12
  11. data/ext/rugged/rugged_diff_hunk.c +2 -1
  12. data/ext/rugged/rugged_index.c +39 -29
  13. data/ext/rugged/rugged_note.c +7 -6
  14. data/ext/rugged/rugged_object.c +3 -2
  15. data/ext/rugged/rugged_patch.c +23 -9
  16. data/ext/rugged/rugged_rebase.c +22 -10
  17. data/ext/rugged/rugged_reference.c +22 -13
  18. data/ext/rugged/rugged_reference_collection.c +9 -7
  19. data/ext/rugged/rugged_remote.c +23 -12
  20. data/ext/rugged/rugged_remote_collection.c +11 -9
  21. data/ext/rugged/rugged_repo.c +60 -45
  22. data/ext/rugged/rugged_revwalk.c +22 -12
  23. data/ext/rugged/rugged_submodule.c +23 -20
  24. data/ext/rugged/rugged_submodule_collection.c +20 -9
  25. data/ext/rugged/rugged_tag.c +6 -4
  26. data/ext/rugged/rugged_tag_collection.c +7 -5
  27. data/ext/rugged/rugged_tree.c +27 -15
  28. data/lib/rugged/version.rb +1 -1
  29. data/vendor/libgit2/AUTHORS +3 -0
  30. data/vendor/libgit2/CMakeLists.txt +23 -10
  31. data/vendor/libgit2/COPYING +195 -1
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +4 -1
  33. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  34. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  35. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  36. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  37. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  38. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  39. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  40. data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
  41. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  42. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  43. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  44. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  45. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  46. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  47. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  48. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  49. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  50. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  51. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  52. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  53. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  54. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  55. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  56. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  57. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  58. data/vendor/libgit2/deps/pcre/CMakeLists.txt +3 -3
  59. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  60. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  61. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  62. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  63. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  64. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  65. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  66. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  67. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  68. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  69. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  70. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  71. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  72. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  73. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  74. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  75. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  76. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  77. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  78. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  79. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  80. data/vendor/libgit2/include/git2/apply.h +27 -6
  81. data/vendor/libgit2/include/git2/attr.h +17 -4
  82. data/vendor/libgit2/include/git2/blame.h +133 -28
  83. data/vendor/libgit2/include/git2/blob.h +71 -28
  84. data/vendor/libgit2/include/git2/branch.h +22 -15
  85. data/vendor/libgit2/include/git2/buffer.h +6 -4
  86. data/vendor/libgit2/include/git2/cert.h +2 -1
  87. data/vendor/libgit2/include/git2/checkout.h +83 -32
  88. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  89. data/vendor/libgit2/include/git2/clone.h +25 -9
  90. data/vendor/libgit2/include/git2/commit.h +132 -3
  91. data/vendor/libgit2/include/git2/common.h +120 -63
  92. data/vendor/libgit2/include/git2/config.h +93 -23
  93. data/vendor/libgit2/include/git2/credential.h +30 -2
  94. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  95. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  96. data/vendor/libgit2/include/git2/describe.h +13 -1
  97. data/vendor/libgit2/include/git2/diff.h +38 -8
  98. data/vendor/libgit2/include/git2/email.h +9 -29
  99. data/vendor/libgit2/include/git2/errors.h +46 -73
  100. data/vendor/libgit2/include/git2/filter.h +14 -7
  101. data/vendor/libgit2/include/git2/global.h +8 -1
  102. data/vendor/libgit2/include/git2/graph.h +3 -2
  103. data/vendor/libgit2/include/git2/ignore.h +10 -0
  104. data/vendor/libgit2/include/git2/index.h +100 -15
  105. data/vendor/libgit2/include/git2/indexer.h +21 -4
  106. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  107. data/vendor/libgit2/include/git2/merge.h +50 -3
  108. data/vendor/libgit2/include/git2/message.h +2 -2
  109. data/vendor/libgit2/include/git2/net.h +3 -1
  110. data/vendor/libgit2/include/git2/notes.h +9 -6
  111. data/vendor/libgit2/include/git2/object.h +9 -8
  112. data/vendor/libgit2/include/git2/odb.h +91 -49
  113. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  114. data/vendor/libgit2/include/git2/oid.h +23 -25
  115. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  116. data/vendor/libgit2/include/git2/pack.h +13 -1
  117. data/vendor/libgit2/include/git2/patch.h +2 -3
  118. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  119. data/vendor/libgit2/include/git2/proxy.h +12 -3
  120. data/vendor/libgit2/include/git2/rebase.h +9 -6
  121. data/vendor/libgit2/include/git2/refdb.h +2 -2
  122. data/vendor/libgit2/include/git2/reflog.h +3 -2
  123. data/vendor/libgit2/include/git2/refs.h +9 -6
  124. data/vendor/libgit2/include/git2/refspec.h +14 -4
  125. data/vendor/libgit2/include/git2/remote.h +113 -25
  126. data/vendor/libgit2/include/git2/repository.h +57 -21
  127. data/vendor/libgit2/include/git2/reset.h +16 -3
  128. data/vendor/libgit2/include/git2/revert.h +9 -4
  129. data/vendor/libgit2/include/git2/revparse.h +3 -3
  130. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  131. data/vendor/libgit2/include/git2/signature.h +46 -1
  132. data/vendor/libgit2/include/git2/stash.h +17 -3
  133. data/vendor/libgit2/include/git2/status.h +10 -6
  134. data/vendor/libgit2/include/git2/stdint.h +87 -85
  135. data/vendor/libgit2/include/git2/strarray.h +2 -3
  136. data/vendor/libgit2/include/git2/submodule.h +20 -9
  137. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  138. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  139. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  140. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  141. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  142. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  143. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  144. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  145. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  146. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  147. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  148. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  149. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  150. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  151. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  152. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  153. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  154. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  155. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  156. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  157. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  158. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  159. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  160. data/vendor/libgit2/include/git2/tag.h +3 -1
  161. data/vendor/libgit2/include/git2/trace.h +9 -3
  162. data/vendor/libgit2/include/git2/transaction.h +3 -2
  163. data/vendor/libgit2/include/git2/transport.h +11 -3
  164. data/vendor/libgit2/include/git2/tree.h +16 -5
  165. data/vendor/libgit2/include/git2/types.h +19 -3
  166. data/vendor/libgit2/include/git2/version.h +46 -8
  167. data/vendor/libgit2/include/git2/worktree.h +16 -6
  168. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  169. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  170. data/vendor/libgit2/src/cli/cmd.c +1 -1
  171. data/vendor/libgit2/src/cli/cmd.h +4 -0
  172. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  173. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  174. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  175. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  176. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  177. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  178. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  179. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  180. data/vendor/libgit2/src/cli/common.c +168 -0
  181. data/vendor/libgit2/src/cli/common.h +63 -0
  182. data/vendor/libgit2/src/cli/error.h +1 -1
  183. data/vendor/libgit2/src/cli/main.c +52 -24
  184. data/vendor/libgit2/src/cli/opt.c +31 -5
  185. data/vendor/libgit2/src/cli/opt.h +21 -3
  186. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  187. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  188. data/vendor/libgit2/src/cli/progress.c +51 -2
  189. data/vendor/libgit2/src/cli/progress.h +12 -0
  190. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  191. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  192. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  193. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  194. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  195. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  196. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  197. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  198. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  199. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  200. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  201. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  202. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  203. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  204. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  205. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  206. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  207. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  208. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  209. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  210. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  211. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  212. data/vendor/libgit2/src/libgit2/config.c +390 -299
  213. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  214. data/vendor/libgit2/src/libgit2/config.h +9 -4
  215. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  216. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  217. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  218. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  219. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  220. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  221. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  222. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  223. data/vendor/libgit2/src/libgit2/delta.c +5 -1
  224. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  225. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  226. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  227. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  228. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  229. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  230. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  231. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  232. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  233. data/vendor/libgit2/src/libgit2/email.c +1 -0
  234. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  235. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  236. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  237. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  238. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  239. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  240. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  241. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  242. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  243. data/vendor/libgit2/src/libgit2/index.c +76 -98
  244. data/vendor/libgit2/src/libgit2/index.h +5 -2
  245. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  246. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  247. data/vendor/libgit2/src/libgit2/indexer.c +36 -40
  248. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  249. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  252. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  253. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  254. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  255. data/vendor/libgit2/src/libgit2/message.c +1 -1
  256. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  257. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  258. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  259. data/vendor/libgit2/src/libgit2/object.c +6 -5
  260. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  261. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  264. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  267. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  268. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  269. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  270. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/path.c +1 -1
  272. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  273. data/vendor/libgit2/src/libgit2/push.c +79 -28
  274. data/vendor/libgit2/src/libgit2/push.h +1 -0
  275. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  276. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  277. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  278. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  279. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  280. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  281. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  282. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  283. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  284. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  285. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  286. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  287. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  288. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  289. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  290. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  291. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  292. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  293. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  294. data/vendor/libgit2/src/libgit2/status.c +1 -1
  295. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  296. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  297. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  298. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  299. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  300. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  301. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  302. data/vendor/libgit2/src/libgit2/submodule.c +118 -68
  303. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  304. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  305. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  306. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  307. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  308. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  309. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  310. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  311. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  312. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  313. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  314. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  315. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  316. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  317. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  318. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  319. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  320. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +5 -5
  321. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  322. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  323. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  324. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  325. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  326. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  327. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  328. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  329. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  330. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  331. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  332. data/vendor/libgit2/src/util/alloc.c +4 -1
  333. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  334. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  335. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  336. data/vendor/libgit2/src/util/array.h +18 -17
  337. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  338. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  339. data/vendor/libgit2/src/util/date.c +22 -14
  340. data/vendor/libgit2/src/util/date.h +12 -0
  341. data/vendor/libgit2/src/util/errors.c +401 -0
  342. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  343. data/vendor/libgit2/src/util/fs_path.c +81 -10
  344. data/vendor/libgit2/src/util/fs_path.h +29 -0
  345. data/vendor/libgit2/src/util/futils.c +6 -5
  346. data/vendor/libgit2/src/util/futils.h +24 -7
  347. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  348. data/vendor/libgit2/src/util/git2_util.h +6 -0
  349. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  350. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  351. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  352. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  353. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  354. data/vendor/libgit2/src/util/hashmap.h +425 -0
  355. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  356. data/vendor/libgit2/src/util/integer.h +3 -1
  357. data/vendor/libgit2/src/util/net.c +17 -11
  358. data/vendor/libgit2/src/util/net.h +2 -0
  359. data/vendor/libgit2/src/util/pool.c +1 -1
  360. data/vendor/libgit2/src/util/pool.h +5 -0
  361. data/vendor/libgit2/src/util/pqueue.h +1 -1
  362. data/vendor/libgit2/src/util/process.h +223 -0
  363. data/vendor/libgit2/src/util/rand.c +1 -7
  364. data/vendor/libgit2/src/util/regexp.c +1 -1
  365. data/vendor/libgit2/src/util/runtime.c +2 -2
  366. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  367. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  368. data/vendor/libgit2/src/util/str.c +20 -8
  369. data/vendor/libgit2/src/util/str.h +5 -3
  370. data/vendor/libgit2/src/util/strlist.c +108 -0
  371. data/vendor/libgit2/src/util/strlist.h +36 -0
  372. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  373. data/vendor/libgit2/src/util/unix/process.c +706 -0
  374. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  375. data/vendor/libgit2/src/util/util.c +18 -5
  376. data/vendor/libgit2/src/util/util.h +5 -38
  377. data/vendor/libgit2/src/util/vector.c +3 -3
  378. data/vendor/libgit2/src/util/vector.h +2 -2
  379. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  380. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  381. data/vendor/libgit2/src/util/win32/process.c +522 -0
  382. metadata +60 -32
  383. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  384. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  385. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  386. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  387. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  388. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  389. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  390. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  391. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  392. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  393. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  394. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  395. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  396. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  397. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  398. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  399. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  400. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  401. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  402. data/vendor/libgit2/src/util/khash.h +0 -615
  403. data/vendor/libgit2/src/util/strmap.c +0 -100
  404. data/vendor/libgit2/src/util/strmap.h +0 -131
  405. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -56,14 +56,22 @@ int git_push_new(git_push **out, git_remote *remote, const git_push_options *opt
56
56
  }
57
57
 
58
58
  if (git_vector_init(&p->status, 0, push_status_ref_cmp) < 0) {
59
- git_vector_free(&p->specs);
59
+ git_vector_dispose(&p->specs);
60
60
  git__free(p);
61
61
  return -1;
62
62
  }
63
63
 
64
64
  if (git_vector_init(&p->updates, 0, NULL) < 0) {
65
- git_vector_free(&p->status);
66
- git_vector_free(&p->specs);
65
+ git_vector_dispose(&p->status);
66
+ git_vector_dispose(&p->specs);
67
+ git__free(p);
68
+ return -1;
69
+ }
70
+
71
+ if (git_vector_init(&p->remote_push_options, 0, git__strcmp_cb) < 0) {
72
+ git_vector_dispose(&p->status);
73
+ git_vector_dispose(&p->specs);
74
+ git_vector_dispose(&p->updates);
67
75
  git__free(p);
68
76
  return -1;
69
77
  }
@@ -213,12 +221,25 @@ int git_push_update_tips(git_push *push, const git_remote_callbacks *callbacks)
213
221
  fire_callback = 0;
214
222
  }
215
223
 
216
- if (fire_callback && callbacks && callbacks->update_tips) {
217
- error = callbacks->update_tips(git_str_cstr(&remote_ref_name),
218
- &push_spec->roid, &push_spec->loid, callbacks->payload);
224
+ if (!fire_callback || !callbacks)
225
+ continue;
219
226
 
220
- if (error < 0)
221
- goto on_error;
227
+ if (callbacks->update_refs)
228
+ error = callbacks->update_refs(
229
+ git_str_cstr(&remote_ref_name),
230
+ &push_spec->roid, &push_spec->loid,
231
+ &push_spec->refspec, callbacks->payload);
232
+ #ifndef GIT_DEPRECATE_HARD
233
+ else if (callbacks->update_tips)
234
+ error = callbacks->update_tips(
235
+ git_str_cstr(&remote_ref_name),
236
+ &push_spec->roid, &push_spec->loid,
237
+ callbacks->payload);
238
+ #endif
239
+
240
+ if (error < 0) {
241
+ git_error_set_after_callback_function(error, "git_remote_push");
242
+ goto on_error;
222
243
  }
223
244
  }
224
245
 
@@ -275,6 +296,7 @@ static int queue_objects(git_push *push)
275
296
 
276
297
  git_vector_foreach(&push->specs, i, spec) {
277
298
  git_object_t type;
299
+ git_oid id;
278
300
  size_t size;
279
301
 
280
302
  if (git_oid_is_zero(&spec->loid))
@@ -296,20 +318,20 @@ static int queue_objects(git_push *push)
296
318
  if ((error = enqueue_tag(&target, push, &spec->loid)) < 0)
297
319
  goto on_error;
298
320
 
299
- if (git_object_type(target) == GIT_OBJECT_COMMIT) {
300
- if ((error = git_revwalk_push(rw, git_object_id(target))) < 0) {
301
- git_object_free(target);
302
- goto on_error;
303
- }
304
- } else {
305
- if ((error = git_packbuilder_insert(
306
- push->pb, git_object_id(target), NULL)) < 0) {
307
- git_object_free(target);
308
- goto on_error;
309
- }
310
- }
321
+ type = git_object_type(target);
322
+ git_oid_cpy(&id, git_object_id(target));
323
+
311
324
  git_object_free(target);
312
- } else if ((error = git_revwalk_push(rw, &spec->loid)) < 0)
325
+ } else {
326
+ git_oid_cpy(&id, &spec->loid);
327
+ }
328
+
329
+ if (type == GIT_OBJECT_COMMIT)
330
+ error = git_revwalk_push(rw, &id);
331
+ else
332
+ error = git_packbuilder_insert(push->pb, &id, NULL);
333
+
334
+ if (error < 0)
313
335
  goto on_error;
314
336
 
315
337
  if (!spec->refspec.force) {
@@ -444,10 +466,21 @@ static int do_push(git_push *push)
444
466
  if ((error = calculate_work(push)) < 0)
445
467
  goto on_error;
446
468
 
447
- if (callbacks && callbacks->push_negotiation &&
448
- (error = callbacks->push_negotiation((const git_push_update **) push->updates.contents,
449
- push->updates.length, callbacks->payload)) < 0)
450
- goto on_error;
469
+ if (callbacks && callbacks->push_negotiation) {
470
+ git_error_clear();
471
+
472
+ error = callbacks->push_negotiation(
473
+ (const git_push_update **) push->updates.contents,
474
+ push->updates.length, callbacks->payload);
475
+
476
+ if (error < 0) {
477
+ git_error_set_after_callback_function(error,
478
+ "push_negotiation");
479
+ goto on_error;
480
+ }
481
+
482
+ error = 0;
483
+ }
451
484
 
452
485
  if ((error = queue_objects(push)) < 0 ||
453
486
  (error = transport->push(transport, push)) < 0)
@@ -479,12 +512,24 @@ static int filter_refs(git_remote *remote)
479
512
  int git_push_finish(git_push *push)
480
513
  {
481
514
  int error;
515
+ unsigned int remote_caps;
482
516
 
483
517
  if (!git_remote_connected(push->remote)) {
484
518
  git_error_set(GIT_ERROR_NET, "remote is disconnected");
485
519
  return -1;
486
520
  }
487
521
 
522
+ if ((error = git_remote_capabilities(&remote_caps, push->remote)) < 0) {
523
+ git_error_set(GIT_ERROR_INVALID, "remote capabilities not available");
524
+ return -1;
525
+ }
526
+
527
+ if (git_vector_length(&push->remote_push_options) > 0 &&
528
+ !(remote_caps & GIT_REMOTE_CAPABILITY_PUSH_OPTIONS)) {
529
+ git_error_set(GIT_ERROR_INVALID, "push-options not supported by remote");
530
+ return -1;
531
+ }
532
+
488
533
  if ((error = filter_refs(push->remote)) < 0 ||
489
534
  (error = do_push(push)) < 0)
490
535
  return error;
@@ -528,6 +573,7 @@ void git_push_free(git_push *push)
528
573
  push_spec *spec;
529
574
  push_status *status;
530
575
  git_push_update *update;
576
+ char *option;
531
577
  unsigned int i;
532
578
 
533
579
  if (push == NULL)
@@ -536,19 +582,24 @@ void git_push_free(git_push *push)
536
582
  git_vector_foreach(&push->specs, i, spec) {
537
583
  free_refspec(spec);
538
584
  }
539
- git_vector_free(&push->specs);
585
+ git_vector_dispose(&push->specs);
540
586
 
541
587
  git_vector_foreach(&push->status, i, status) {
542
588
  git_push_status_free(status);
543
589
  }
544
- git_vector_free(&push->status);
590
+ git_vector_dispose(&push->status);
545
591
 
546
592
  git_vector_foreach(&push->updates, i, update) {
547
593
  git__free(update->src_refname);
548
594
  git__free(update->dst_refname);
549
595
  git__free(update);
550
596
  }
551
- git_vector_free(&push->updates);
597
+ git_vector_dispose(&push->updates);
598
+
599
+ git_vector_foreach(&push->remote_push_options, i, option) {
600
+ git__free(option);
601
+ }
602
+ git_vector_dispose(&push->remote_push_options);
552
603
 
553
604
  git__free(push);
554
605
  }
@@ -34,6 +34,7 @@ struct git_push {
34
34
  git_vector specs;
35
35
  git_vector updates;
36
36
  bool report_status;
37
+ git_vector remote_push_options;
37
38
 
38
39
  /* report-status */
39
40
  bool unpack_ok;
@@ -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,89 +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(
809
- refdb_fs_backend *backend,
810
- 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)
811
827
  {
812
- int error = 0;
813
- git_str path = GIT_STR_INIT;
814
- git_iterator *fsit = NULL;
815
- git_iterator_options fsit_opts = GIT_ITERATOR_OPTIONS_INIT;
816
- const git_index_entry *entry = NULL;
817
- const char *ref_prefix = GIT_REFS_DIR;
818
- size_t ref_prefix_len = strlen(ref_prefix);
828
+ const char *pos, *last_sep = NULL;
819
829
 
820
- if (!backend->commonpath) /* do nothing if no commonpath for loose refs */
821
- return 0;
830
+ if (!ctx->iter->glob)
831
+ return;
822
832
 
823
- fsit_opts.flags = backend->iterator_flags;
824
- fsit_opts.oid_type = backend->oid_type;
825
-
826
- if (iter->glob) {
827
- const char *last_sep = NULL;
828
- const char *pos;
829
- for (pos = iter->glob; *pos; ++pos) {
830
- switch (*pos) {
831
- case '?':
832
- case '*':
833
- case '[':
834
- case '\\':
835
- break;
836
- case '/':
837
- last_sep = pos;
838
- /* FALLTHROUGH */
839
- default:
840
- continue;
841
- }
833
+ for (pos = ctx->iter->glob; *pos; pos++) {
834
+ switch (*pos) {
835
+ case '?':
836
+ case '*':
837
+ case '[':
838
+ case '\\':
842
839
  break;
840
+ case '/':
841
+ last_sep = pos;
842
+ /* FALLTHROUGH */
843
+ default:
844
+ continue;
843
845
  }
844
- if (last_sep) {
845
- ref_prefix = iter->glob;
846
- ref_prefix_len = (last_sep - ref_prefix) + 1;
847
- }
846
+ break;
848
847
  }
849
848
 
850
- if ((error = git_str_puts(&path, backend->commonpath)) < 0 ||
851
- (error = git_str_put(&path, ref_prefix, ref_prefix_len)) < 0) {
852
- git_str_dispose(&path);
853
- return error;
849
+ if (last_sep) {
850
+ ctx->ref_prefix = ctx->iter->glob;
851
+ ctx->ref_prefix_len = (last_sep - ctx->ref_prefix) + 1;
854
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);
870
+
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;
855
881
 
856
- if ((error = git_iterator_for_filesystem(&fsit, path.ptr, &fsit_opts)) < 0) {
857
- git_str_dispose(&path);
858
- return (iter->glob && error == GIT_ENOTFOUND)? 0 : error;
882
+ goto done;
859
883
  }
860
884
 
861
- 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);
862
887
 
863
- while (!error && !git_iterator_advance(&entry, fsit)) {
864
- const char *ref_name;
888
+ while (git_iterator_advance(&entry, fsit) == 0) {
865
889
  char *ref_dup;
866
890
 
867
- git_str_truncate(&path, ref_prefix_len);
868
- git_str_puts(&path, entry->path);
869
- 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);
870
893
 
871
- if (git__suffixcmp(ref_name, ".lock") == 0 ||
872
- (iter->glob && wildmatch(iter->glob, ref_name, 0) != 0))
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
+ }
902
+
903
+ if (git__suffixcmp(ctx->ref_name.ptr, ".lock") == 0)
873
904
  continue;
874
905
 
875
- ref_dup = git_pool_strdup(&iter->pool, ref_name);
876
- if (!ref_dup)
877
- error = -1;
878
- else
879
- 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;
880
914
  }
881
915
 
916
+ done:
882
917
  git_iterator_free(fsit);
883
- git_str_dispose(&path);
918
+ return error;
919
+ }
884
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)
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);
885
952
  return error;
886
953
  }
887
954
 
@@ -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
@@ -808,7 +808,7 @@ int git_reference_list(
808
808
 
809
809
  if (git_reference_foreach_name(
810
810
  repo, &cb__reflist_add, (void *)&ref_list) < 0) {
811
- git_vector_free(&ref_list);
811
+ git_vector_dispose(&ref_list);
812
812
  return -1;
813
813
  }
814
814
 
@@ -819,7 +819,7 @@ int git_reference_list(
819
819
 
820
820
  static int is_valid_ref_char(char ch)
821
821
  {
822
- if ((unsigned) ch <= ' ')
822
+ if ((unsigned) ch <= ' ' || ch == '\177') /* ASCII control characters */
823
823
  return 0;
824
824
 
825
825
  switch (ch) {
@@ -835,17 +835,20 @@ static int is_valid_ref_char(char ch)
835
835
  }
836
836
  }
837
837
 
838
- 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)
839
839
  {
840
840
  const char *current = name;
841
+ const char *start = current;
841
842
  char prev = '\0';
842
843
  const int lock_len = (int)strlen(GIT_FILELOCK_EXTENSION);
843
844
  int segment_len;
844
845
 
845
846
  if (*current == '.')
846
847
  return -1; /* Refname starts with "." */
848
+ if (allow_caret_prefix && *current == '^')
849
+ start++;
847
850
 
848
- for (current = name; ; current++) {
851
+ for (current = start; ; current++) {
849
852
  if (*current == '\0' || *current == '/')
850
853
  break;
851
854
 
@@ -877,7 +880,7 @@ static int ensure_segment_validity(const char *name, char may_contain_glob)
877
880
  return segment_len;
878
881
  }
879
882
 
880
- 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)
881
884
  {
882
885
  size_t i;
883
886
  char c;
@@ -888,6 +891,12 @@ static bool is_all_caps_and_underscore(const char *name, size_t len)
888
891
  for (i = 0; i < len; i++)
889
892
  {
890
893
  c = name[i];
894
+ if (i == 0 && c == '^')
895
+ continue; /* The first character is allowed to be "^" for negative refspecs */
896
+
897
+ if (len == 1 && c == '@')
898
+ return true; /* Abbreviation for HEAD */
899
+
891
900
  if ((c < 'A' || c > 'Z') && c != '_')
892
901
  return false;
893
902
  }
@@ -908,6 +917,7 @@ int git_reference__normalize_name(
908
917
  int segment_len, segments_count = 0, error = GIT_EINVALIDSPEC;
909
918
  unsigned int process_flags;
910
919
  bool normalize = (buf != NULL);
920
+ bool allow_caret_prefix = true;
911
921
  bool validate = (flags & GIT_REFERENCE_FORMAT__VALIDATION_DISABLE) == 0;
912
922
 
913
923
  #ifdef GIT_USE_ICONV
@@ -945,7 +955,7 @@ int git_reference__normalize_name(
945
955
  while (true) {
946
956
  char may_contain_glob = process_flags & GIT_REFERENCE_FORMAT_REFSPEC_PATTERN;
947
957
 
948
- segment_len = ensure_segment_validity(current, may_contain_glob);
958
+ segment_len = ensure_segment_validity(current, may_contain_glob, allow_caret_prefix);
949
959
  if (segment_len < 0)
950
960
  goto cleanup;
951
961
 
@@ -958,11 +968,16 @@ int git_reference__normalize_name(
958
968
  process_flags &= ~GIT_REFERENCE_FORMAT_REFSPEC_PATTERN;
959
969
 
960
970
  if (normalize) {
961
- size_t cur_len = git_str_len(buf);
962
-
963
- git_str_joinpath(buf, git_str_cstr(buf), current);
964
- git_str_truncate(buf,
965
- cur_len + segment_len + (segments_count ? 1 : 0));
971
+ /* `<empty>@` (i.e. just `@`) is an alias for `HEAD` */
972
+ if (segments_count == 0 && segment_len == 1 && current[0] == '@') {
973
+ git_str_sets(buf, GIT_HEAD_FILE);
974
+ } else {
975
+ size_t cur_len = git_str_len(buf);
976
+
977
+ git_str_joinpath(buf, git_str_cstr(buf), current);
978
+ git_str_truncate(buf,
979
+ cur_len + segment_len + (segments_count ? 1 : 0));
980
+ }
966
981
 
967
982
  if (git_str_oom(buf)) {
968
983
  error = -1;
@@ -981,6 +996,12 @@ int git_reference__normalize_name(
981
996
  break;
982
997
 
983
998
  current += segment_len + 1;
999
+
1000
+ /*
1001
+ * A caret prefix is only allowed in the first segment to signify a
1002
+ * negative refspec.
1003
+ */
1004
+ allow_caret_prefix = false;
984
1005
  }
985
1006
 
986
1007
  /* A refname can not be empty */
@@ -1000,12 +1021,13 @@ int git_reference__normalize_name(
1000
1021
 
1001
1022
  if ((segments_count == 1 ) &&
1002
1023
  !(flags & GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND) &&
1003
- !(is_all_caps_and_underscore(name, (size_t)segment_len) ||
1024
+ !(is_valid_normalized_name(name, (size_t)segment_len) ||
1004
1025
  ((flags & GIT_REFERENCE_FORMAT_REFSPEC_PATTERN) && !strcmp("*", name))))
1005
1026
  goto cleanup;
1006
1027
 
1007
1028
  if ((segments_count > 1)
1008
- && (is_all_caps_and_underscore(name, strchr(name, '/') - name)))
1029
+ && !(flags & GIT_REFERENCE_FORMAT_REFSPEC_SHORTHAND)
1030
+ && (is_valid_normalized_name(name, strchr(name, '/') - name)))
1009
1031
  goto cleanup;
1010
1032
 
1011
1033
  error = 0;
@@ -1080,6 +1102,12 @@ int git_reference_cmp(
1080
1102
  return git_oid__cmp(&ref1->target.oid, &ref2->target.oid);
1081
1103
  }
1082
1104
 
1105
+ int git_reference__cmp_cb(const void *a, const void *b)
1106
+ {
1107
+ return git_reference_cmp(
1108
+ (const git_reference *)a, (const git_reference *)b);
1109
+ }
1110
+
1083
1111
  /*
1084
1112
  * Starting with the reference given by `ref_name`, follows symbolic
1085
1113
  * 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);