rugged 0.17.0.b7 → 0.18.0.b1

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 (310) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +88 -32
  3. data/ext/rugged/extconf.rb +4 -2
  4. data/ext/rugged/rugged.c +72 -10
  5. data/ext/rugged/rugged.h +14 -10
  6. data/ext/rugged/rugged_blob.c +8 -10
  7. data/ext/rugged/rugged_branch.c +11 -14
  8. data/ext/rugged/rugged_commit.c +31 -24
  9. data/ext/rugged/rugged_config.c +2 -2
  10. data/ext/rugged/rugged_index.c +133 -198
  11. data/ext/rugged/rugged_note.c +372 -0
  12. data/ext/rugged/rugged_object.c +50 -22
  13. data/ext/rugged/rugged_reference.c +122 -130
  14. data/ext/rugged/rugged_remote.c +72 -29
  15. data/ext/rugged/rugged_repo.c +402 -20
  16. data/ext/rugged/rugged_revwalk.c +7 -3
  17. data/ext/rugged/rugged_settings.c +110 -0
  18. data/ext/rugged/rugged_signature.c +23 -7
  19. data/ext/rugged/rugged_tag.c +32 -16
  20. data/ext/rugged/rugged_tree.c +44 -15
  21. data/lib/rugged.rb +1 -0
  22. data/lib/rugged/index.rb +8 -0
  23. data/lib/rugged/remote.rb +13 -0
  24. data/lib/rugged/repository.rb +3 -3
  25. data/lib/rugged/version.rb +1 -1
  26. data/test/blob_test.rb +13 -15
  27. data/test/branch_test.rb +32 -67
  28. data/test/commit_test.rb +50 -12
  29. data/test/config_test.rb +12 -11
  30. data/test/coverage/HEAD.json +1 -1
  31. data/test/coverage/cover.rb +40 -21
  32. data/test/errors_test.rb +34 -0
  33. data/test/fixtures/alternate/objects/14/6ae76773c91e3b1d00cf7a338ec55ae58297e2 +0 -0
  34. data/test/fixtures/alternate/objects/14/9c32d47e99d0a3572ff1e70a2e0051bbf347a9 +0 -0
  35. data/test/fixtures/alternate/objects/14/fb3108588f9421bf764041e5e3ac305eb6277f +0 -0
  36. data/test/fixtures/testrepo.git/logs/refs/notes/commits +1 -0
  37. data/test/fixtures/testrepo.git/objects/44/1034f860c1d5d90e4188d11ae0d325176869a8 +1 -0
  38. data/test/fixtures/testrepo.git/objects/60/d415052a33de2150bf68757f6461df4f563ae4 +0 -0
  39. data/test/fixtures/testrepo.git/objects/68/8a8f4ef7496901d15322972f96e212a9e466cc +1 -0
  40. data/test/fixtures/testrepo.git/objects/94/eca2de348d5f672faf56b0decafa5937e3235e +0 -0
  41. data/test/fixtures/testrepo.git/objects/9b/7384fe1676186192842f5d3e129457b62db9e3 +0 -0
  42. data/test/fixtures/testrepo.git/objects/b7/4713326bc972cc15751ed504dca6f6f3b91f7a +3 -0
  43. data/test/fixtures/testrepo.git/refs/notes/commits +1 -0
  44. data/test/index_test.rb +65 -69
  45. data/test/lib_test.rb +76 -11
  46. data/test/note_test.rb +158 -0
  47. data/test/object_test.rb +8 -11
  48. data/test/reference_test.rb +77 -85
  49. data/test/remote_test.rb +86 -8
  50. data/test/repo_pack_test.rb +9 -7
  51. data/test/repo_reset_test.rb +80 -0
  52. data/test/repo_test.rb +176 -53
  53. data/test/tag_test.rb +44 -7
  54. data/test/test_helper.rb +63 -35
  55. data/test/tree_test.rb +34 -13
  56. data/test/walker_test.rb +14 -14
  57. data/vendor/libgit2/Makefile.embed +1 -1
  58. data/vendor/libgit2/deps/http-parser/http_parser.c +974 -578
  59. data/vendor/libgit2/deps/http-parser/http_parser.h +106 -70
  60. data/vendor/libgit2/deps/regex/regcomp.c +7 -6
  61. data/vendor/libgit2/deps/regex/regex_internal.c +1 -1
  62. data/vendor/libgit2/deps/regex/regex_internal.h +12 -3
  63. data/vendor/libgit2/deps/regex/regexec.c +5 -5
  64. data/vendor/libgit2/include/git2.h +5 -1
  65. data/vendor/libgit2/include/git2/attr.h +4 -2
  66. data/vendor/libgit2/include/git2/blob.h +39 -12
  67. data/vendor/libgit2/include/git2/branch.h +123 -35
  68. data/vendor/libgit2/include/git2/checkout.h +206 -48
  69. data/vendor/libgit2/include/git2/clone.h +72 -27
  70. data/vendor/libgit2/include/git2/commit.h +20 -17
  71. data/vendor/libgit2/include/git2/common.h +67 -1
  72. data/vendor/libgit2/include/git2/config.h +81 -60
  73. data/vendor/libgit2/include/git2/cred_helpers.h +53 -0
  74. data/vendor/libgit2/include/git2/diff.h +459 -150
  75. data/vendor/libgit2/include/git2/errors.h +9 -1
  76. data/vendor/libgit2/include/git2/graph.h +41 -0
  77. data/vendor/libgit2/include/git2/ignore.h +7 -6
  78. data/vendor/libgit2/include/git2/index.h +323 -97
  79. data/vendor/libgit2/include/git2/indexer.h +27 -59
  80. data/vendor/libgit2/include/git2/inttypes.h +4 -0
  81. data/vendor/libgit2/include/git2/merge.h +13 -3
  82. data/vendor/libgit2/include/git2/message.h +14 -8
  83. data/vendor/libgit2/include/git2/net.h +9 -7
  84. data/vendor/libgit2/include/git2/notes.h +88 -29
  85. data/vendor/libgit2/include/git2/object.h +16 -6
  86. data/vendor/libgit2/include/git2/odb.h +80 -17
  87. data/vendor/libgit2/include/git2/odb_backend.h +47 -11
  88. data/vendor/libgit2/include/git2/oid.h +26 -17
  89. data/vendor/libgit2/include/git2/pack.h +62 -8
  90. data/vendor/libgit2/include/git2/push.h +131 -0
  91. data/vendor/libgit2/include/git2/refdb.h +103 -0
  92. data/vendor/libgit2/include/git2/refdb_backend.h +109 -0
  93. data/vendor/libgit2/include/git2/reflog.h +30 -21
  94. data/vendor/libgit2/include/git2/refs.h +215 -193
  95. data/vendor/libgit2/include/git2/refspec.h +22 -2
  96. data/vendor/libgit2/include/git2/remote.h +158 -37
  97. data/vendor/libgit2/include/git2/repository.h +150 -31
  98. data/vendor/libgit2/include/git2/reset.h +43 -9
  99. data/vendor/libgit2/include/git2/revparse.h +48 -4
  100. data/vendor/libgit2/include/git2/revwalk.h +25 -10
  101. data/vendor/libgit2/include/git2/signature.h +20 -12
  102. data/vendor/libgit2/include/git2/stash.h +121 -0
  103. data/vendor/libgit2/include/git2/status.h +122 -53
  104. data/vendor/libgit2/include/git2/strarray.h +17 -11
  105. data/vendor/libgit2/include/git2/submodule.h +42 -7
  106. data/vendor/libgit2/include/git2/tag.h +72 -59
  107. data/vendor/libgit2/include/git2/threads.h +4 -2
  108. data/vendor/libgit2/include/git2/trace.h +68 -0
  109. data/vendor/libgit2/include/git2/transport.h +328 -0
  110. data/vendor/libgit2/include/git2/tree.h +149 -120
  111. data/vendor/libgit2/include/git2/types.h +13 -12
  112. data/vendor/libgit2/include/git2/version.h +3 -3
  113. data/vendor/libgit2/src/amiga/map.c +2 -2
  114. data/vendor/libgit2/src/attr.c +58 -48
  115. data/vendor/libgit2/src/attr.h +4 -18
  116. data/vendor/libgit2/src/attr_file.c +30 -6
  117. data/vendor/libgit2/src/attr_file.h +6 -8
  118. data/vendor/libgit2/src/attrcache.h +24 -0
  119. data/vendor/libgit2/src/blob.c +30 -7
  120. data/vendor/libgit2/src/blob.h +1 -1
  121. data/vendor/libgit2/src/branch.c +361 -68
  122. data/vendor/libgit2/src/branch.h +17 -0
  123. data/vendor/libgit2/src/bswap.h +1 -1
  124. data/vendor/libgit2/src/buf_text.c +291 -0
  125. data/vendor/libgit2/src/buf_text.h +122 -0
  126. data/vendor/libgit2/src/buffer.c +27 -101
  127. data/vendor/libgit2/src/buffer.h +54 -39
  128. data/vendor/libgit2/src/cache.c +15 -6
  129. data/vendor/libgit2/src/cache.h +1 -1
  130. data/vendor/libgit2/src/cc-compat.h +3 -1
  131. data/vendor/libgit2/src/checkout.c +1165 -222
  132. data/vendor/libgit2/src/checkout.h +24 -0
  133. data/vendor/libgit2/src/clone.c +171 -86
  134. data/vendor/libgit2/src/commit.c +44 -45
  135. data/vendor/libgit2/src/commit.h +3 -3
  136. data/vendor/libgit2/src/commit_list.c +194 -0
  137. data/vendor/libgit2/src/commit_list.h +49 -0
  138. data/vendor/libgit2/src/common.h +44 -10
  139. data/vendor/libgit2/src/compress.c +1 -1
  140. data/vendor/libgit2/src/compress.h +1 -1
  141. data/vendor/libgit2/src/config.c +211 -124
  142. data/vendor/libgit2/src/config.h +23 -4
  143. data/vendor/libgit2/src/config_cache.c +2 -2
  144. data/vendor/libgit2/src/config_file.c +129 -53
  145. data/vendor/libgit2/src/config_file.h +10 -8
  146. data/vendor/libgit2/src/crlf.c +66 -67
  147. data/vendor/libgit2/src/date.c +12 -12
  148. data/vendor/libgit2/src/delta-apply.c +14 -1
  149. data/vendor/libgit2/src/delta-apply.h +18 -1
  150. data/vendor/libgit2/src/delta.c +40 -107
  151. data/vendor/libgit2/src/delta.h +19 -17
  152. data/vendor/libgit2/src/diff.c +347 -496
  153. data/vendor/libgit2/src/diff.h +27 -1
  154. data/vendor/libgit2/src/diff_output.c +564 -249
  155. data/vendor/libgit2/src/diff_output.h +15 -8
  156. data/vendor/libgit2/src/diff_tform.c +687 -0
  157. data/vendor/libgit2/src/errors.c +27 -36
  158. data/vendor/libgit2/src/fetch.c +13 -351
  159. data/vendor/libgit2/src/fetch.h +13 -3
  160. data/vendor/libgit2/src/fetchhead.c +295 -0
  161. data/vendor/libgit2/src/fetchhead.h +34 -0
  162. data/vendor/libgit2/src/filebuf.c +42 -15
  163. data/vendor/libgit2/src/filebuf.h +4 -2
  164. data/vendor/libgit2/src/fileops.c +466 -113
  165. data/vendor/libgit2/src/fileops.h +154 -28
  166. data/vendor/libgit2/src/filter.c +3 -75
  167. data/vendor/libgit2/src/filter.h +1 -29
  168. data/vendor/libgit2/src/fnmatch.c +1 -1
  169. data/vendor/libgit2/src/fnmatch.h +1 -1
  170. data/vendor/libgit2/src/global.c +54 -10
  171. data/vendor/libgit2/src/global.h +10 -1
  172. data/vendor/libgit2/src/graph.c +178 -0
  173. data/vendor/libgit2/src/hash.c +25 -52
  174. data/vendor/libgit2/src/hash.h +21 -9
  175. data/vendor/libgit2/src/{sha1/sha1.c → hash/hash_generic.c} +20 -12
  176. data/vendor/libgit2/src/hash/hash_generic.h +24 -0
  177. data/vendor/libgit2/src/hash/hash_openssl.h +45 -0
  178. data/vendor/libgit2/src/hash/hash_win32.c +291 -0
  179. data/vendor/libgit2/src/hash/hash_win32.h +140 -0
  180. data/vendor/libgit2/src/hashsig.c +368 -0
  181. data/vendor/libgit2/src/hashsig.h +72 -0
  182. data/vendor/libgit2/src/ignore.c +22 -15
  183. data/vendor/libgit2/src/ignore.h +6 -1
  184. data/vendor/libgit2/src/index.c +770 -171
  185. data/vendor/libgit2/src/index.h +13 -5
  186. data/vendor/libgit2/src/indexer.c +286 -431
  187. data/vendor/libgit2/src/iterator.c +854 -466
  188. data/vendor/libgit2/src/iterator.h +134 -109
  189. data/vendor/libgit2/src/map.h +1 -1
  190. data/vendor/libgit2/src/merge.c +296 -0
  191. data/vendor/libgit2/src/merge.h +22 -0
  192. data/vendor/libgit2/src/message.c +1 -1
  193. data/vendor/libgit2/src/message.h +1 -1
  194. data/vendor/libgit2/src/mwindow.c +35 -30
  195. data/vendor/libgit2/src/mwindow.h +2 -2
  196. data/vendor/libgit2/src/netops.c +162 -98
  197. data/vendor/libgit2/src/netops.h +50 -15
  198. data/vendor/libgit2/src/notes.c +109 -58
  199. data/vendor/libgit2/src/notes.h +2 -1
  200. data/vendor/libgit2/src/object.c +46 -57
  201. data/vendor/libgit2/src/object.h +1 -8
  202. data/vendor/libgit2/src/odb.c +151 -40
  203. data/vendor/libgit2/src/odb.h +5 -1
  204. data/vendor/libgit2/src/odb_loose.c +4 -5
  205. data/vendor/libgit2/src/odb_pack.c +122 -80
  206. data/vendor/libgit2/src/offmap.h +65 -0
  207. data/vendor/libgit2/src/oid.c +12 -4
  208. data/vendor/libgit2/src/oidmap.h +1 -1
  209. data/vendor/libgit2/src/pack-objects.c +88 -61
  210. data/vendor/libgit2/src/pack-objects.h +8 -8
  211. data/vendor/libgit2/src/pack.c +293 -28
  212. data/vendor/libgit2/src/pack.h +49 -4
  213. data/vendor/libgit2/src/path.c +103 -14
  214. data/vendor/libgit2/src/path.h +23 -7
  215. data/vendor/libgit2/src/pathspec.c +168 -0
  216. data/vendor/libgit2/src/pathspec.h +40 -0
  217. data/vendor/libgit2/src/pool.c +29 -4
  218. data/vendor/libgit2/src/pool.h +8 -1
  219. data/vendor/libgit2/src/posix.c +26 -27
  220. data/vendor/libgit2/src/posix.h +2 -3
  221. data/vendor/libgit2/src/pqueue.c +23 -1
  222. data/vendor/libgit2/src/pqueue.h +23 -1
  223. data/vendor/libgit2/src/push.c +653 -0
  224. data/vendor/libgit2/src/push.h +51 -0
  225. data/vendor/libgit2/src/refdb.c +185 -0
  226. data/vendor/libgit2/src/refdb.h +46 -0
  227. data/vendor/libgit2/src/refdb_fs.c +1024 -0
  228. data/vendor/libgit2/src/refdb_fs.h +15 -0
  229. data/vendor/libgit2/src/reflog.c +77 -45
  230. data/vendor/libgit2/src/reflog.h +1 -3
  231. data/vendor/libgit2/src/refs.c +366 -1326
  232. data/vendor/libgit2/src/refs.h +22 -13
  233. data/vendor/libgit2/src/refspec.c +46 -7
  234. data/vendor/libgit2/src/refspec.h +11 -1
  235. data/vendor/libgit2/src/remote.c +758 -120
  236. data/vendor/libgit2/src/remote.h +10 -5
  237. data/vendor/libgit2/src/repo_template.h +6 -6
  238. data/vendor/libgit2/src/repository.c +315 -96
  239. data/vendor/libgit2/src/repository.h +5 -3
  240. data/vendor/libgit2/src/reset.c +99 -81
  241. data/vendor/libgit2/src/revparse.c +157 -84
  242. data/vendor/libgit2/src/revwalk.c +68 -470
  243. data/vendor/libgit2/src/revwalk.h +44 -0
  244. data/vendor/libgit2/src/sha1_lookup.c +1 -1
  245. data/vendor/libgit2/src/sha1_lookup.h +1 -1
  246. data/vendor/libgit2/src/signature.c +68 -200
  247. data/vendor/libgit2/src/signature.h +1 -1
  248. data/vendor/libgit2/src/stash.c +663 -0
  249. data/vendor/libgit2/src/status.c +101 -79
  250. data/vendor/libgit2/src/strmap.h +1 -1
  251. data/vendor/libgit2/src/submodule.c +67 -51
  252. data/vendor/libgit2/src/submodule.h +1 -1
  253. data/vendor/libgit2/src/tag.c +35 -29
  254. data/vendor/libgit2/src/tag.h +1 -1
  255. data/vendor/libgit2/src/thread-utils.c +1 -1
  256. data/vendor/libgit2/src/thread-utils.h +2 -2
  257. data/vendor/libgit2/src/trace.c +39 -0
  258. data/vendor/libgit2/src/trace.h +56 -0
  259. data/vendor/libgit2/src/transport.c +81 -34
  260. data/vendor/libgit2/src/transports/cred.c +60 -0
  261. data/vendor/libgit2/src/transports/cred_helpers.c +49 -0
  262. data/vendor/libgit2/src/transports/git.c +234 -127
  263. data/vendor/libgit2/src/transports/http.c +761 -433
  264. data/vendor/libgit2/src/transports/local.c +460 -64
  265. data/vendor/libgit2/src/transports/smart.c +345 -0
  266. data/vendor/libgit2/src/transports/smart.h +179 -0
  267. data/vendor/libgit2/src/{pkt.c → transports/smart_pkt.c} +131 -12
  268. data/vendor/libgit2/src/transports/smart_protocol.c +856 -0
  269. data/vendor/libgit2/src/transports/winhttp.c +1136 -0
  270. data/vendor/libgit2/src/tree-cache.c +2 -2
  271. data/vendor/libgit2/src/tree-cache.h +1 -1
  272. data/vendor/libgit2/src/tree.c +239 -166
  273. data/vendor/libgit2/src/tree.h +11 -2
  274. data/vendor/libgit2/src/tsort.c +39 -23
  275. data/vendor/libgit2/src/unix/map.c +1 -1
  276. data/vendor/libgit2/src/unix/posix.h +12 -2
  277. data/vendor/libgit2/src/unix/realpath.c +30 -0
  278. data/vendor/libgit2/src/util.c +250 -13
  279. data/vendor/libgit2/src/util.h +71 -14
  280. data/vendor/libgit2/src/vector.c +123 -60
  281. data/vendor/libgit2/src/vector.h +24 -22
  282. data/vendor/libgit2/src/win32/dir.c +1 -1
  283. data/vendor/libgit2/src/win32/dir.h +1 -1
  284. data/vendor/libgit2/src/win32/error.c +77 -0
  285. data/vendor/libgit2/src/win32/error.h +13 -0
  286. data/vendor/libgit2/src/win32/findfile.c +143 -54
  287. data/vendor/libgit2/src/win32/findfile.h +10 -6
  288. data/vendor/libgit2/src/win32/map.c +1 -1
  289. data/vendor/libgit2/src/win32/mingw-compat.h +1 -1
  290. data/vendor/libgit2/src/win32/msvc-compat.h +10 -1
  291. data/vendor/libgit2/src/win32/posix.h +10 -1
  292. data/vendor/libgit2/src/win32/posix_w32.c +132 -63
  293. data/vendor/libgit2/src/win32/precompiled.c +1 -1
  294. data/vendor/libgit2/src/win32/pthread.c +1 -1
  295. data/vendor/libgit2/src/win32/pthread.h +1 -1
  296. data/vendor/libgit2/src/win32/utf-conv.c +5 -5
  297. data/vendor/libgit2/src/win32/utf-conv.h +3 -3
  298. data/vendor/libgit2/src/win32/version.h +20 -0
  299. metadata +308 -252
  300. data/test/fixtures/testrepo.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  301. data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
  302. data/test/fixtures/testrepo.git/objects/a3/e05719b428a2d0ed7a55c4ce53dcc5768c6d5e +0 -0
  303. data/test/index_test.rb~ +0 -218
  304. data/vendor/libgit2/src/pkt.h +0 -91
  305. data/vendor/libgit2/src/ppc/sha1.c +0 -70
  306. data/vendor/libgit2/src/ppc/sha1.h +0 -26
  307. data/vendor/libgit2/src/protocol.c +0 -110
  308. data/vendor/libgit2/src/protocol.h +0 -21
  309. data/vendor/libgit2/src/sha1.h +0 -33
  310. data/vendor/libgit2/src/transport.h +0 -148
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -12,169 +12,194 @@
12
12
  #include "vector.h"
13
13
  #include "buffer.h"
14
14
 
15
- #define ITERATOR_PREFIXCMP(ITER, STR, PREFIX) (((ITER).ignore_case) ? \
16
- git__prefixcmp_icase((STR), (PREFIX)) : \
17
- git__prefixcmp((STR), (PREFIX)))
18
-
19
15
  typedef struct git_iterator git_iterator;
20
16
 
21
17
  typedef enum {
22
- GIT_ITERATOR_EMPTY = 0,
23
- GIT_ITERATOR_TREE = 1,
24
- GIT_ITERATOR_INDEX = 2,
25
- GIT_ITERATOR_WORKDIR = 3,
26
- GIT_ITERATOR_SPOOLANDSORT = 4
18
+ GIT_ITERATOR_TYPE_EMPTY = 0,
19
+ GIT_ITERATOR_TYPE_TREE = 1,
20
+ GIT_ITERATOR_TYPE_INDEX = 2,
21
+ GIT_ITERATOR_TYPE_WORKDIR = 3,
27
22
  } git_iterator_type_t;
28
23
 
24
+ typedef enum {
25
+ /** ignore case for entry sort order */
26
+ GIT_ITERATOR_IGNORE_CASE = (1 << 0),
27
+ /** force case sensitivity for entry sort order */
28
+ GIT_ITERATOR_DONT_IGNORE_CASE = (1 << 1),
29
+ /** return tree items in addition to blob items */
30
+ GIT_ITERATOR_INCLUDE_TREES = (1 << 2),
31
+ /** don't flatten trees, requiring advance_into (implies INCLUDE_TREES) */
32
+ GIT_ITERATOR_DONT_AUTOEXPAND = (1 << 3),
33
+ } git_iterator_flag_t;
34
+
35
+ typedef struct {
36
+ int (*current)(const git_index_entry **, git_iterator *);
37
+ int (*advance)(const git_index_entry **, git_iterator *);
38
+ int (*advance_into)(const git_index_entry **, git_iterator *);
39
+ int (*seek)(git_iterator *, const char *prefix);
40
+ int (*reset)(git_iterator *, const char *start, const char *end);
41
+ int (*at_end)(git_iterator *);
42
+ void (*free)(git_iterator *);
43
+ } git_iterator_callbacks;
44
+
29
45
  struct git_iterator {
30
46
  git_iterator_type_t type;
47
+ git_iterator_callbacks *cb;
48
+ git_repository *repo;
31
49
  char *start;
32
50
  char *end;
33
- int (*current)(git_iterator *, const git_index_entry **);
34
- int (*at_end)(git_iterator *);
35
- int (*advance)(git_iterator *, const git_index_entry **);
36
- int (*seek)(git_iterator *, const char *prefix);
37
- int (*reset)(git_iterator *);
38
- void (*free)(git_iterator *);
39
- unsigned int ignore_case:1;
51
+ int (*prefixcomp)(const char *str, const char *prefix);
52
+ unsigned int flags;
40
53
  };
41
54
 
42
- extern int git_iterator_for_nothing(git_iterator **iter);
55
+ extern int git_iterator_for_nothing(
56
+ git_iterator **out,
57
+ git_iterator_flag_t flags,
58
+ const char *start,
59
+ const char *end);
43
60
 
44
- extern int git_iterator_for_tree_range(
45
- git_iterator **iter, git_repository *repo, git_tree *tree,
46
- const char *start, const char *end);
61
+ /* tree iterators will match the ignore_case value from the index of the
62
+ * repository, unless you override with a non-zero flag value
63
+ */
64
+ extern int git_iterator_for_tree(
65
+ git_iterator **out,
66
+ git_tree *tree,
67
+ git_iterator_flag_t flags,
68
+ const char *start,
69
+ const char *end);
70
+
71
+ /* index iterators will take the ignore_case value from the index; the
72
+ * ignore_case flags are not used
73
+ */
74
+ extern int git_iterator_for_index(
75
+ git_iterator **out,
76
+ git_index *index,
77
+ git_iterator_flag_t flags,
78
+ const char *start,
79
+ const char *end);
80
+
81
+ /* workdir iterators will match the ignore_case value from the index of the
82
+ * repository, unless you override with a non-zero flag value
83
+ */
84
+ extern int git_iterator_for_workdir(
85
+ git_iterator **out,
86
+ git_repository *repo,
87
+ git_iterator_flag_t flags,
88
+ const char *start,
89
+ const char *end);
90
+
91
+ extern void git_iterator_free(git_iterator *iter);
47
92
 
48
- GIT_INLINE(int) git_iterator_for_tree(
49
- git_iterator **iter, git_repository *repo, git_tree *tree)
93
+ /* Return a git_index_entry structure for the current value the iterator
94
+ * is looking at or NULL if the iterator is at the end.
95
+ *
96
+ * The entry may noy be fully populated. Tree iterators will only have a
97
+ * value mode, OID, and path. Workdir iterators will not have an OID (but
98
+ * you can use `git_iterator_current_oid()` to calculate it on demand).
99
+ *
100
+ * You do not need to free the entry. It is still "owned" by the iterator.
101
+ * Once you call `git_iterator_advance()` then the old entry is no longer
102
+ * guaranteed to be valid - it may be freed or just overwritten in place.
103
+ */
104
+ GIT_INLINE(int) git_iterator_current(
105
+ const git_index_entry **entry, git_iterator *iter)
50
106
  {
51
- return git_iterator_for_tree_range(iter, repo, tree, NULL, NULL);
107
+ return iter->cb->current(entry, iter);
52
108
  }
53
109
 
54
- extern int git_iterator_for_index_range(
55
- git_iterator **iter, git_repository *repo,
56
- const char *start, const char *end);
57
-
58
- GIT_INLINE(int) git_iterator_for_index(
59
- git_iterator **iter, git_repository *repo)
110
+ /**
111
+ * Advance to the next item for the iterator.
112
+ *
113
+ * If GIT_ITERATOR_INCLUDE_TREES is set, this may be a tree item. If
114
+ * GIT_ITERATOR_DONT_AUTOEXPAND is set, calling this again when on a tree
115
+ * item will skip over all the items under that tree.
116
+ */
117
+ GIT_INLINE(int) git_iterator_advance(
118
+ const git_index_entry **entry, git_iterator *iter)
60
119
  {
61
- return git_iterator_for_index_range(iter, repo, NULL, NULL);
120
+ return iter->cb->advance(entry, iter);
62
121
  }
63
122
 
64
- extern int git_iterator_for_workdir_range(
65
- git_iterator **iter, git_repository *repo,
66
- const char *start, const char *end);
67
-
68
- GIT_INLINE(int) git_iterator_for_workdir(
69
- git_iterator **iter, git_repository *repo)
123
+ /**
124
+ * Iterate into a tree item (when GIT_ITERATOR_DONT_AUTOEXPAND is set).
125
+ *
126
+ * git_iterator_advance() steps through all items being iterated over
127
+ * (either with or without trees, depending on GIT_ITERATOR_INCLUDE_TREES),
128
+ * but if GIT_ITERATOR_DONT_AUTOEXPAND is set, it will skip to the next
129
+ * sibling of a tree instead of going to the first child of the tree. In
130
+ * that case, use this function to advance to the first child of the tree.
131
+ *
132
+ * If the current item is not a tree, this is a no-op.
133
+ *
134
+ * For working directory iterators only, a tree (i.e. directory) can be
135
+ * empty. In that case, this function returns GIT_ENOTFOUND and does not
136
+ * advance. That can't happen for tree and index iterators.
137
+ */
138
+ GIT_INLINE(int) git_iterator_advance_into(
139
+ const git_index_entry **entry, git_iterator *iter)
70
140
  {
71
- return git_iterator_for_workdir_range(iter, repo, NULL, NULL);
141
+ return iter->cb->advance_into(entry, iter);
72
142
  }
73
143
 
74
- extern int git_iterator_spoolandsort_range(
75
- git_iterator **iter, git_iterator *towrap,
76
- git_vector_cmp comparer, bool ignore_case,
77
- const char *start, const char *end);
78
-
79
- GIT_INLINE(int) git_iterator_spoolandsort(
80
- git_iterator **iter, git_iterator *towrap,
81
- git_vector_cmp comparer, bool ignore_case)
144
+ GIT_INLINE(int) git_iterator_seek(
145
+ git_iterator *iter, const char *prefix)
82
146
  {
83
- return git_iterator_spoolandsort_range(iter, towrap, comparer, ignore_case, NULL, NULL);
147
+ return iter->cb->seek(iter, prefix);
84
148
  }
85
149
 
86
- /* Entry is not guaranteed to be fully populated. For a tree iterator,
87
- * we will only populate the mode, oid and path, for example. For a workdir
88
- * iterator, we will not populate the oid.
89
- *
90
- * You do not need to free the entry. It is still "owned" by the iterator.
91
- * Once you call `git_iterator_advance`, then content of the old entry is
92
- * no longer guaranteed to be valid.
93
- */
94
- GIT_INLINE(int) git_iterator_current(
95
- git_iterator *iter, const git_index_entry **entry)
150
+ GIT_INLINE(int) git_iterator_reset(
151
+ git_iterator *iter, const char *start, const char *end)
96
152
  {
97
- return iter->current(iter, entry);
153
+ return iter->cb->reset(iter, start, end);
98
154
  }
99
155
 
100
156
  GIT_INLINE(int) git_iterator_at_end(git_iterator *iter)
101
157
  {
102
- return iter->at_end(iter);
158
+ return iter->cb->at_end(iter);
103
159
  }
104
160
 
105
- GIT_INLINE(int) git_iterator_advance(
106
- git_iterator *iter, const git_index_entry **entry)
161
+ GIT_INLINE(git_iterator_type_t) git_iterator_type(git_iterator *iter)
107
162
  {
108
- return iter->advance(iter, entry);
163
+ return iter->type;
109
164
  }
110
165
 
111
- GIT_INLINE(int) git_iterator_seek(
112
- git_iterator *iter, const char *prefix)
166
+ GIT_INLINE(git_repository *) git_iterator_owner(git_iterator *iter)
113
167
  {
114
- return iter->seek(iter, prefix);
168
+ return iter->repo;
115
169
  }
116
170
 
117
- GIT_INLINE(int) git_iterator_reset(git_iterator *iter)
171
+ GIT_INLINE(git_iterator_flag_t) git_iterator_flags(git_iterator *iter)
118
172
  {
119
- return iter->reset(iter);
173
+ return iter->flags;
120
174
  }
121
175
 
122
- GIT_INLINE(void) git_iterator_free(git_iterator *iter)
176
+ GIT_INLINE(bool) git_iterator_ignore_case(git_iterator *iter)
123
177
  {
124
- if (iter == NULL)
125
- return;
126
-
127
- iter->free(iter);
128
-
129
- git__free(iter->start);
130
- git__free(iter->end);
131
-
132
- memset(iter, 0, sizeof(*iter));
133
-
134
- git__free(iter);
178
+ return ((iter->flags & GIT_ITERATOR_IGNORE_CASE) != 0);
135
179
  }
136
180
 
137
- GIT_INLINE(git_iterator_type_t) git_iterator_type(git_iterator *iter)
138
- {
139
- return iter->type;
140
- }
181
+ extern int git_iterator_set_ignore_case(git_iterator *iter, bool ignore_case);
141
182
 
142
183
  extern int git_iterator_current_tree_entry(
143
- git_iterator *iter, const git_tree_entry **tree_entry);
184
+ const git_tree_entry **entry_out, git_iterator *iter);
144
185
 
145
186
  extern int git_iterator_current_parent_tree(
146
- git_iterator *iter, const char *parent_path, const git_tree **tree_ptr);
187
+ const git_tree **tree_out, git_iterator *iter, const char *parent_path);
147
188
 
148
- extern int git_iterator_current_is_ignored(git_iterator *iter);
149
-
150
- /**
151
- * Iterate into a workdir directory.
152
- *
153
- * Workdir iterators do not automatically descend into directories (so that
154
- * when comparing two iterator entries you can detect a newly created
155
- * directory in the workdir). As a result, you may get S_ISDIR items from
156
- * a workdir iterator. If you wish to iterate over the contents of the
157
- * directories you encounter, then call this function when you encounter
158
- * a directory.
159
- *
160
- * If there are no files in the directory, this will end up acting like a
161
- * regular advance and will skip past the directory, so you should be
162
- * prepared for that case.
163
- *
164
- * On non-workdir iterators or if not pointing at a directory, this is a
165
- * no-op and will not advance the iterator.
166
- */
167
- extern int git_iterator_advance_into_directory(
168
- git_iterator *iter, const git_index_entry **entry);
189
+ extern bool git_iterator_current_is_ignored(git_iterator *iter);
169
190
 
170
191
  extern int git_iterator_cmp(
171
192
  git_iterator *iter, const char *path_prefix);
172
193
 
173
194
  /**
174
- * Get the full path of the current item from a workdir iterator.
175
- * This will return NULL for a non-workdir iterator.
195
+ * Get full path of the current item from a workdir iterator. This will
196
+ * return NULL for a non-workdir iterator. The git_buf is still owned by
197
+ * the iterator; this is exposed just for efficiency.
176
198
  */
177
199
  extern int git_iterator_current_workdir_path(
178
- git_iterator *iter, git_buf **path);
200
+ git_buf **path, git_iterator *iter);
201
+
202
+ /* Return index pointer if index iterator, else NULL */
203
+ extern git_index *git_iterator_get_index(git_iterator *iter);
179
204
 
180
205
  #endif
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -0,0 +1,296 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "repository.h"
9
+ #include "revwalk.h"
10
+ #include "buffer.h"
11
+ #include "merge.h"
12
+ #include "refs.h"
13
+ #include "git2/repository.h"
14
+ #include "git2/merge.h"
15
+ #include "git2/reset.h"
16
+ #include "commit_list.h"
17
+
18
+ int git_repository_merge_cleanup(git_repository *repo)
19
+ {
20
+ int error = 0;
21
+ git_buf merge_head_path = GIT_BUF_INIT,
22
+ merge_mode_path = GIT_BUF_INIT,
23
+ merge_msg_path = GIT_BUF_INIT;
24
+
25
+ assert(repo);
26
+
27
+ if (git_buf_joinpath(&merge_head_path, repo->path_repository, GIT_MERGE_HEAD_FILE) < 0 ||
28
+ git_buf_joinpath(&merge_mode_path, repo->path_repository, GIT_MERGE_MODE_FILE) < 0 ||
29
+ git_buf_joinpath(&merge_msg_path, repo->path_repository, GIT_MERGE_MSG_FILE) < 0)
30
+ return -1;
31
+
32
+ if (git_path_isfile(merge_head_path.ptr)) {
33
+ if ((error = p_unlink(merge_head_path.ptr)) < 0)
34
+ goto cleanup;
35
+ }
36
+
37
+ if (git_path_isfile(merge_mode_path.ptr))
38
+ (void)p_unlink(merge_mode_path.ptr);
39
+
40
+ if (git_path_isfile(merge_msg_path.ptr))
41
+ (void)p_unlink(merge_msg_path.ptr);
42
+
43
+ cleanup:
44
+ git_buf_free(&merge_msg_path);
45
+ git_buf_free(&merge_mode_path);
46
+ git_buf_free(&merge_head_path);
47
+
48
+ return error;
49
+ }
50
+
51
+ int git_merge_base_many(git_oid *out, git_repository *repo, const git_oid input_array[], size_t length)
52
+ {
53
+ git_revwalk *walk;
54
+ git_vector list;
55
+ git_commit_list *result = NULL;
56
+ int error = -1;
57
+ unsigned int i;
58
+ git_commit_list_node *commit;
59
+
60
+ assert(out && repo && input_array);
61
+
62
+ if (length < 2) {
63
+ giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
64
+ return -1;
65
+ }
66
+
67
+ if (git_vector_init(&list, length - 1, NULL) < 0)
68
+ return -1;
69
+
70
+ if (git_revwalk_new(&walk, repo) < 0)
71
+ goto cleanup;
72
+
73
+ for (i = 1; i < length; i++) {
74
+ commit = git_revwalk__commit_lookup(walk, &input_array[i]);
75
+ if (commit == NULL)
76
+ goto cleanup;
77
+
78
+ git_vector_insert(&list, commit);
79
+ }
80
+
81
+ commit = git_revwalk__commit_lookup(walk, &input_array[0]);
82
+ if (commit == NULL)
83
+ goto cleanup;
84
+
85
+ if (git_merge__bases_many(&result, walk, commit, &list) < 0)
86
+ goto cleanup;
87
+
88
+ if (!result) {
89
+ error = GIT_ENOTFOUND;
90
+ goto cleanup;
91
+ }
92
+
93
+ git_oid_cpy(out, &result->item->oid);
94
+
95
+ error = 0;
96
+
97
+ cleanup:
98
+ git_commit_list_free(&result);
99
+ git_revwalk_free(walk);
100
+ git_vector_free(&list);
101
+ return error;
102
+ }
103
+
104
+ int git_merge_base(git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two)
105
+ {
106
+ git_revwalk *walk;
107
+ git_vector list;
108
+ git_commit_list *result = NULL;
109
+ git_commit_list_node *commit;
110
+ void *contents[1];
111
+
112
+ if (git_revwalk_new(&walk, repo) < 0)
113
+ return -1;
114
+
115
+ commit = git_revwalk__commit_lookup(walk, two);
116
+ if (commit == NULL)
117
+ goto on_error;
118
+
119
+ /* This is just one value, so we can do it on the stack */
120
+ memset(&list, 0x0, sizeof(git_vector));
121
+ contents[0] = commit;
122
+ list.length = 1;
123
+ list.contents = contents;
124
+
125
+ commit = git_revwalk__commit_lookup(walk, one);
126
+ if (commit == NULL)
127
+ goto on_error;
128
+
129
+ if (git_merge__bases_many(&result, walk, commit, &list) < 0)
130
+ goto on_error;
131
+
132
+ if (!result) {
133
+ git_revwalk_free(walk);
134
+ giterr_clear();
135
+ return GIT_ENOTFOUND;
136
+ }
137
+
138
+ git_oid_cpy(out, &result->item->oid);
139
+ git_commit_list_free(&result);
140
+ git_revwalk_free(walk);
141
+
142
+ return 0;
143
+
144
+ on_error:
145
+ git_revwalk_free(walk);
146
+ return -1;
147
+ }
148
+
149
+ static int interesting(git_pqueue *list)
150
+ {
151
+ unsigned int i;
152
+ /* element 0 isn't used - we need to start at 1 */
153
+ for (i = 1; i < list->size; i++) {
154
+ git_commit_list_node *commit = list->d[i];
155
+ if ((commit->flags & STALE) == 0)
156
+ return 1;
157
+ }
158
+
159
+ return 0;
160
+ }
161
+
162
+ int git_merge__bases_many(git_commit_list **out, git_revwalk *walk, git_commit_list_node *one, git_vector *twos)
163
+ {
164
+ int error;
165
+ unsigned int i;
166
+ git_commit_list_node *two;
167
+ git_commit_list *result = NULL, *tmp = NULL;
168
+ git_pqueue list;
169
+
170
+ /* if the commit is repeated, we have a our merge base already */
171
+ git_vector_foreach(twos, i, two) {
172
+ if (one == two)
173
+ return git_commit_list_insert(one, out) ? 0 : -1;
174
+ }
175
+
176
+ if (git_pqueue_init(&list, twos->length * 2, git_commit_list_time_cmp) < 0)
177
+ return -1;
178
+
179
+ if (git_commit_list_parse(walk, one) < 0)
180
+ return -1;
181
+
182
+ one->flags |= PARENT1;
183
+ if (git_pqueue_insert(&list, one) < 0)
184
+ return -1;
185
+
186
+ git_vector_foreach(twos, i, two) {
187
+ git_commit_list_parse(walk, two);
188
+ two->flags |= PARENT2;
189
+ if (git_pqueue_insert(&list, two) < 0)
190
+ return -1;
191
+ }
192
+
193
+ /* as long as there are non-STALE commits */
194
+ while (interesting(&list)) {
195
+ git_commit_list_node *commit;
196
+ int flags;
197
+
198
+ commit = git_pqueue_pop(&list);
199
+
200
+ flags = commit->flags & (PARENT1 | PARENT2 | STALE);
201
+ if (flags == (PARENT1 | PARENT2)) {
202
+ if (!(commit->flags & RESULT)) {
203
+ commit->flags |= RESULT;
204
+ if (git_commit_list_insert(commit, &result) == NULL)
205
+ return -1;
206
+ }
207
+ /* we mark the parents of a merge stale */
208
+ flags |= STALE;
209
+ }
210
+
211
+ for (i = 0; i < commit->out_degree; i++) {
212
+ git_commit_list_node *p = commit->parents[i];
213
+ if ((p->flags & flags) == flags)
214
+ continue;
215
+
216
+ if ((error = git_commit_list_parse(walk, p)) < 0)
217
+ return error;
218
+
219
+ p->flags |= flags;
220
+ if (git_pqueue_insert(&list, p) < 0)
221
+ return -1;
222
+ }
223
+ }
224
+
225
+ git_pqueue_free(&list);
226
+
227
+ /* filter out any stale commits in the results */
228
+ tmp = result;
229
+ result = NULL;
230
+
231
+ while (tmp) {
232
+ struct git_commit_list *next = tmp->next;
233
+ if (!(tmp->item->flags & STALE))
234
+ if (git_commit_list_insert_by_date(tmp->item, &result) == NULL)
235
+ return -1;
236
+
237
+ git__free(tmp);
238
+ tmp = next;
239
+ }
240
+
241
+ *out = result;
242
+ return 0;
243
+ }
244
+
245
+ int git_repository_mergehead_foreach(git_repository *repo,
246
+ git_repository_mergehead_foreach_cb cb,
247
+ void *payload)
248
+ {
249
+ git_buf merge_head_path = GIT_BUF_INIT, merge_head_file = GIT_BUF_INIT;
250
+ char *buffer, *line;
251
+ size_t line_num = 1;
252
+ git_oid oid;
253
+ int error = 0;
254
+
255
+ assert(repo && cb);
256
+
257
+ if ((error = git_buf_joinpath(&merge_head_path, repo->path_repository,
258
+ GIT_MERGE_HEAD_FILE)) < 0)
259
+ return error;
260
+
261
+ if ((error = git_futils_readbuffer(&merge_head_file,
262
+ git_buf_cstr(&merge_head_path))) < 0)
263
+ goto cleanup;
264
+
265
+ buffer = merge_head_file.ptr;
266
+
267
+ while ((line = git__strsep(&buffer, "\n")) != NULL) {
268
+ if (strlen(line) != GIT_OID_HEXSZ) {
269
+ giterr_set(GITERR_INVALID, "Unable to parse OID - invalid length");
270
+ error = -1;
271
+ goto cleanup;
272
+ }
273
+
274
+ if ((error = git_oid_fromstr(&oid, line)) < 0)
275
+ goto cleanup;
276
+
277
+ if (cb(&oid, payload) < 0) {
278
+ error = GIT_EUSER;
279
+ goto cleanup;
280
+ }
281
+
282
+ ++line_num;
283
+ }
284
+
285
+ if (*buffer) {
286
+ giterr_set(GITERR_MERGE, "No EOL at line %d", line_num);
287
+ error = -1;
288
+ goto cleanup;
289
+ }
290
+
291
+ cleanup:
292
+ git_buf_free(&merge_head_path);
293
+ git_buf_free(&merge_head_file);
294
+
295
+ return error;
296
+ }