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.
@@ -8,6 +8,15 @@
8
8
  #define INCLUDE_global_h__
9
9
 
10
10
  #include "mwindow.h"
11
+ #include "hash.h"
12
+
13
+ #if defined(GIT_THREADS) && defined(_MSC_VER)
14
+ # define GIT_MEMORY_BARRIER MemoryBarrier()
15
+ #elif defined(GIT_THREADS)
16
+ # define GIT_MEMORY_BARRIER __sync_synchronize()
17
+ #else
18
+ # define GIT_MEMORY_BARRIER /* noop */
19
+ #endif
11
20
 
12
21
  typedef struct {
13
22
  git_error *last_error;
@@ -0,0 +1,178 @@
1
+
2
+ /*
3
+ * Copyright (C) the libgit2 contributors. All rights reserved.
4
+ *
5
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
6
+ * a Linking Exception. For full terms see the included COPYING file.
7
+ */
8
+
9
+ #include "revwalk.h"
10
+ #include "merge.h"
11
+ #include "git2/graph.h"
12
+
13
+ static int interesting(git_pqueue *list, git_commit_list *roots)
14
+ {
15
+ unsigned int i;
16
+ /* element 0 isn't used - we need to start at 1 */
17
+ for (i = 1; i < list->size; i++) {
18
+ git_commit_list_node *commit = list->d[i];
19
+ if ((commit->flags & STALE) == 0)
20
+ return 1;
21
+ }
22
+
23
+ while(roots) {
24
+ if ((roots->item->flags & STALE) == 0)
25
+ return 1;
26
+ roots = roots->next;
27
+ }
28
+
29
+ return 0;
30
+ }
31
+
32
+ static int mark_parents(git_revwalk *walk, git_commit_list_node *one,
33
+ git_commit_list_node *two)
34
+ {
35
+ unsigned int i;
36
+ git_commit_list *roots = NULL;
37
+ git_pqueue list;
38
+
39
+ /* if the commit is repeated, we have a our merge base already */
40
+ if (one == two) {
41
+ one->flags |= PARENT1 | PARENT2 | RESULT;
42
+ return 0;
43
+ }
44
+
45
+ if (git_pqueue_init(&list, 2, git_commit_list_time_cmp) < 0)
46
+ return -1;
47
+
48
+ if (git_commit_list_parse(walk, one) < 0)
49
+ goto on_error;
50
+ one->flags |= PARENT1;
51
+ if (git_pqueue_insert(&list, one) < 0)
52
+ goto on_error;
53
+
54
+ if (git_commit_list_parse(walk, two) < 0)
55
+ goto on_error;
56
+ two->flags |= PARENT2;
57
+ if (git_pqueue_insert(&list, two) < 0)
58
+ goto on_error;
59
+
60
+ /* as long as there are non-STALE commits */
61
+ while (interesting(&list, roots)) {
62
+ git_commit_list_node *commit;
63
+ int flags;
64
+
65
+ commit = git_pqueue_pop(&list);
66
+ if (commit == NULL)
67
+ break;
68
+
69
+ flags = commit->flags & (PARENT1 | PARENT2 | STALE);
70
+ if (flags == (PARENT1 | PARENT2)) {
71
+ if (!(commit->flags & RESULT))
72
+ commit->flags |= RESULT;
73
+ /* we mark the parents of a merge stale */
74
+ flags |= STALE;
75
+ }
76
+
77
+ for (i = 0; i < commit->out_degree; i++) {
78
+ git_commit_list_node *p = commit->parents[i];
79
+ if ((p->flags & flags) == flags)
80
+ continue;
81
+
82
+ if (git_commit_list_parse(walk, p) < 0)
83
+ goto on_error;
84
+
85
+ p->flags |= flags;
86
+ if (git_pqueue_insert(&list, p) < 0)
87
+ goto on_error;
88
+ }
89
+
90
+ /* Keep track of root commits, to make sure the path gets marked */
91
+ if (commit->out_degree == 0) {
92
+ if (git_commit_list_insert(commit, &roots) == NULL)
93
+ goto on_error;
94
+ }
95
+ }
96
+
97
+ git_commit_list_free(&roots);
98
+ git_pqueue_free(&list);
99
+ return 0;
100
+
101
+ on_error:
102
+ git_commit_list_free(&roots);
103
+ git_pqueue_free(&list);
104
+ return -1;
105
+ }
106
+
107
+
108
+ static int ahead_behind(git_commit_list_node *one, git_commit_list_node *two,
109
+ size_t *ahead, size_t *behind)
110
+ {
111
+ git_commit_list_node *commit;
112
+ git_pqueue pq;
113
+ int i;
114
+ *ahead = 0;
115
+ *behind = 0;
116
+
117
+ if (git_pqueue_init(&pq, 2, git_commit_list_time_cmp) < 0)
118
+ return -1;
119
+ if (git_pqueue_insert(&pq, one) < 0)
120
+ goto on_error;
121
+ if (git_pqueue_insert(&pq, two) < 0)
122
+ goto on_error;
123
+
124
+ while ((commit = git_pqueue_pop(&pq)) != NULL) {
125
+ if (commit->flags & RESULT ||
126
+ (commit->flags & (PARENT1 | PARENT2)) == (PARENT1 | PARENT2))
127
+ continue;
128
+ else if (commit->flags & PARENT1)
129
+ (*behind)++;
130
+ else if (commit->flags & PARENT2)
131
+ (*ahead)++;
132
+
133
+ for (i = 0; i < commit->out_degree; i++) {
134
+ git_commit_list_node *p = commit->parents[i];
135
+ if (git_pqueue_insert(&pq, p) < 0)
136
+ return -1;
137
+ }
138
+ commit->flags |= RESULT;
139
+ }
140
+
141
+ git_pqueue_free(&pq);
142
+ return 0;
143
+
144
+ on_error:
145
+ git_pqueue_free(&pq);
146
+ return -1;
147
+ }
148
+
149
+ int git_graph_ahead_behind(size_t *ahead, size_t *behind, git_repository *repo,
150
+ const git_oid *local, const git_oid *upstream)
151
+ {
152
+ git_revwalk *walk;
153
+ git_commit_list_node *commit_u, *commit_l;
154
+
155
+ if (git_revwalk_new(&walk, repo) < 0)
156
+ return -1;
157
+
158
+ commit_u = git_revwalk__commit_lookup(walk, upstream);
159
+ if (commit_u == NULL)
160
+ goto on_error;
161
+
162
+ commit_l = git_revwalk__commit_lookup(walk, local);
163
+ if (commit_l == NULL)
164
+ goto on_error;
165
+
166
+ if (mark_parents(walk, commit_l, commit_u) < 0)
167
+ goto on_error;
168
+ if (ahead_behind(commit_l, commit_u, ahead, behind) < 0)
169
+ goto on_error;
170
+
171
+ git_revwalk_free(walk);
172
+
173
+ return 0;
174
+
175
+ on_error:
176
+ git_revwalk_free(walk);
177
+ return -1;
178
+ }
@@ -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.
@@ -8,67 +8,40 @@
8
8
  #include "common.h"
9
9
  #include "hash.h"
10
10
 
11
- #if defined(PPC_SHA1)
12
- # include "ppc/sha1.h"
13
- #else
14
- # include "sha1.h"
15
- #endif
16
-
17
- struct git_hash_ctx {
18
- SHA_CTX c;
19
- };
20
-
21
- git_hash_ctx *git_hash_new_ctx(void)
11
+ int git_hash_buf(git_oid *out, const void *data, size_t len)
22
12
  {
23
- git_hash_ctx *ctx = git__malloc(sizeof(*ctx));
24
-
25
- if (!ctx)
26
- return NULL;
27
-
28
- SHA1_Init(&ctx->c);
13
+ git_hash_ctx ctx;
14
+ int error = 0;
29
15
 
30
- return ctx;
31
- }
16
+ if (git_hash_ctx_init(&ctx) < 0)
17
+ return -1;
32
18
 
33
- void git_hash_free_ctx(git_hash_ctx *ctx)
34
- {
35
- git__free(ctx);
36
- }
19
+ if ((error = git_hash_update(&ctx, data, len)) >= 0)
20
+ error = git_hash_final(out, &ctx);
37
21
 
38
- void git_hash_init(git_hash_ctx *ctx)
39
- {
40
- assert(ctx);
41
- SHA1_Init(&ctx->c);
22
+ git_hash_ctx_cleanup(&ctx);
23
+
24
+ return error;
42
25
  }
43
26
 
44
- void git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
27
+ int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
45
28
  {
46
- assert(ctx);
47
- SHA1_Update(&ctx->c, data, len);
48
- }
29
+ git_hash_ctx ctx;
30
+ size_t i;
31
+ int error = 0;
49
32
 
50
- void git_hash_final(git_oid *out, git_hash_ctx *ctx)
51
- {
52
- assert(ctx);
53
- SHA1_Final(out->id, &ctx->c);
54
- }
33
+ if (git_hash_ctx_init(&ctx) < 0)
34
+ return -1;
55
35
 
56
- void git_hash_buf(git_oid *out, const void *data, size_t len)
57
- {
58
- SHA_CTX c;
36
+ for (i = 0; i < n; i++) {
37
+ if ((error = git_hash_update(&ctx, vec[i].data, vec[i].len)) < 0)
38
+ goto done;
39
+ }
59
40
 
60
- SHA1_Init(&c);
61
- SHA1_Update(&c, data, len);
62
- SHA1_Final(out->id, &c);
63
- }
41
+ error = git_hash_final(out, &ctx);
64
42
 
65
- void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n)
66
- {
67
- SHA_CTX c;
68
- size_t i;
43
+ done:
44
+ git_hash_ctx_cleanup(&ctx);
69
45
 
70
- SHA1_Init(&c);
71
- for (i = 0; i < n; i++)
72
- SHA1_Update(&c, vec[i].data, vec[i].len);
73
- SHA1_Final(out->id, &c);
46
+ return error;
74
47
  }
@@ -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.
@@ -9,21 +9,33 @@
9
9
 
10
10
  #include "git2/oid.h"
11
11
 
12
+ typedef struct git_hash_prov git_hash_prov;
12
13
  typedef struct git_hash_ctx git_hash_ctx;
13
14
 
15
+ int git_hash_global_init(void);
16
+ void git_hash_global_shutdown(void);
17
+
18
+ int git_hash_ctx_init(git_hash_ctx *ctx);
19
+ void git_hash_ctx_cleanup(git_hash_ctx *ctx);
20
+
21
+ #if defined(OPENSSL_SHA1)
22
+ # include "hash/hash_openssl.h"
23
+ #elif defined(WIN32_SHA1)
24
+ # include "hash/hash_win32.h"
25
+ #else
26
+ # include "hash/hash_generic.h"
27
+ #endif
28
+
14
29
  typedef struct {
15
30
  void *data;
16
31
  size_t len;
17
32
  } git_buf_vec;
18
33
 
19
- git_hash_ctx *git_hash_new_ctx(void);
20
- void git_hash_free_ctx(git_hash_ctx *ctx);
21
-
22
- void git_hash_init(git_hash_ctx *c);
23
- void git_hash_update(git_hash_ctx *c, const void *data, size_t len);
24
- void git_hash_final(git_oid *out, git_hash_ctx *c);
34
+ int git_hash_init(git_hash_ctx *c);
35
+ int git_hash_update(git_hash_ctx *c, const void *data, size_t len);
36
+ int git_hash_final(git_oid *out, git_hash_ctx *c);
25
37
 
26
- void git_hash_buf(git_oid *out, const void *data, size_t len);
27
- void git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n);
38
+ int git_hash_buf(git_oid *out, const void *data, size_t len);
39
+ int git_hash_vec(git_oid *out, git_buf_vec *vec, size_t n);
28
40
 
29
41
  #endif /* INCLUDE_hash_h__ */
@@ -1,12 +1,13 @@
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.
6
6
  */
7
7
 
8
8
  #include "common.h"
9
- #include "sha1.h"
9
+ #include "hash.h"
10
+ #include "hash/hash_generic.h"
10
11
 
11
12
  #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
12
13
 
@@ -112,7 +113,7 @@
112
113
  #define T_40_59(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, ((B&C)+(D&(B^C))) , 0x8f1bbcdc, A, B, C, D, E )
113
114
  #define T_60_79(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6, A, B, C, D, E )
114
115
 
115
- static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data)
116
+ static void hash__block(git_hash_ctx *ctx, const unsigned int *data)
116
117
  {
117
118
  unsigned int A,B,C,D,E;
118
119
  unsigned int array[16];
@@ -220,7 +221,7 @@ static void blk_SHA1_Block(blk_SHA_CTX *ctx, const unsigned int *data)
220
221
  ctx->H[4] += E;
221
222
  }
222
223
 
223
- void git__blk_SHA1_Init(blk_SHA_CTX *ctx)
224
+ int git_hash_init(git_hash_ctx *ctx)
224
225
  {
225
226
  ctx->size = 0;
226
227
 
@@ -230,9 +231,11 @@ void git__blk_SHA1_Init(blk_SHA_CTX *ctx)
230
231
  ctx->H[2] = 0x98badcfe;
231
232
  ctx->H[3] = 0x10325476;
232
233
  ctx->H[4] = 0xc3d2e1f0;
234
+
235
+ return 0;
233
236
  }
234
237
 
235
- void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, size_t len)
238
+ int git_hash_update(git_hash_ctx *ctx, const void *data, size_t len)
236
239
  {
237
240
  unsigned int lenW = ctx->size & 63;
238
241
 
@@ -248,19 +251,21 @@ void git__blk_SHA1_Update(blk_SHA_CTX *ctx, const void *data, size_t len)
248
251
  len -= left;
249
252
  data = ((const char *)data + left);
250
253
  if (lenW)
251
- return;
252
- blk_SHA1_Block(ctx, ctx->W);
254
+ return 0;
255
+ hash__block(ctx, ctx->W);
253
256
  }
254
257
  while (len >= 64) {
255
- blk_SHA1_Block(ctx, data);
258
+ hash__block(ctx, data);
256
259
  data = ((const char *)data + 64);
257
260
  len -= 64;
258
261
  }
259
262
  if (len)
260
263
  memcpy(ctx->W, data, len);
264
+
265
+ return 0;
261
266
  }
262
267
 
263
- void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)
268
+ int git_hash_final(git_oid *out, git_hash_ctx *ctx)
264
269
  {
265
270
  static const unsigned char pad[64] = { 0x80 };
266
271
  unsigned int padlen[2];
@@ -271,10 +276,13 @@ void git__blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)
271
276
  padlen[1] = htonl((uint32_t)(ctx->size << 3));
272
277
 
273
278
  i = ctx->size & 63;
274
- git__blk_SHA1_Update(ctx, pad, 1+ (63 & (55 - i)));
275
- git__blk_SHA1_Update(ctx, padlen, 8);
279
+ git_hash_update(ctx, pad, 1+ (63 & (55 - i)));
280
+ git_hash_update(ctx, padlen, 8);
276
281
 
277
282
  /* Output hash */
278
283
  for (i = 0; i < 5; i++)
279
- put_be32(hashout + i*4, ctx->H[i]);
284
+ put_be32(out->id + i*4, ctx->H[i]);
285
+
286
+ return 0;
280
287
  }
288
+
@@ -0,0 +1,24 @@
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
+ #ifndef INCLUDE_hash_generic_h__
9
+ #define INCLUDE_hash_generic_h__
10
+
11
+ #include "hash.h"
12
+
13
+ struct git_hash_ctx {
14
+ unsigned long long size;
15
+ unsigned int H[5];
16
+ unsigned int W[16];
17
+ };
18
+
19
+ #define git_hash_global_init() 0
20
+ #define git_hash_global_shutdown() /* noop */
21
+ #define git_hash_ctx_init(ctx) git_hash_init(ctx)
22
+ #define git_hash_ctx_cleanup(ctx)
23
+
24
+ #endif /* INCLUDE_hash_generic_h__ */