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.
@@ -13,6 +13,9 @@
13
13
  #ifndef min
14
14
  # define min(a,b) ((a) < (b) ? (a) : (b))
15
15
  #endif
16
+ #ifndef max
17
+ # define max(a,b) ((a) > (b) ? (a) : (b))
18
+ #endif
16
19
 
17
20
  /*
18
21
  * Custom memory allocation wrappers
@@ -42,25 +45,31 @@ GIT_INLINE(char *) git__strdup(const char *str)
42
45
 
43
46
  GIT_INLINE(char *) git__strndup(const char *str, size_t n)
44
47
  {
45
- size_t length;
48
+ size_t length = 0;
46
49
  char *ptr;
47
50
 
48
- length = strlen(str);
49
- if (n < length)
50
- length = n;
51
+ while (length < n && str[length])
52
+ ++length;
51
53
 
52
- ptr = (char*)malloc(length + 1);
53
- if (!ptr) {
54
- giterr_set_oom();
55
- return NULL;
56
- }
54
+ ptr = (char*)git__malloc(length + 1);
55
+
56
+ if (length)
57
+ memcpy(ptr, str, length);
57
58
 
58
- memcpy(ptr, str, length);
59
59
  ptr[length] = '\0';
60
60
 
61
61
  return ptr;
62
62
  }
63
63
 
64
+ /* NOTE: This doesn't do null or '\0' checking. Watch those boundaries! */
65
+ GIT_INLINE(char *) git__substrdup(const char *start, size_t n)
66
+ {
67
+ char *ptr = (char*)git__malloc(n+1);
68
+ memcpy(ptr, start, n);
69
+ ptr[n] = '\0';
70
+ return ptr;
71
+ }
72
+
64
73
  GIT_INLINE(void *) git__realloc(void *ptr, size_t size)
65
74
  {
66
75
  void *new_ptr = realloc(ptr, size);
@@ -80,6 +89,11 @@ extern int git__prefixcmp(const char *str, const char *prefix);
80
89
  extern int git__prefixcmp_icase(const char *str, const char *prefix);
81
90
  extern int git__suffixcmp(const char *str, const char *suffix);
82
91
 
92
+ GIT_INLINE(int) git__signum(int val)
93
+ {
94
+ return ((val > 0) - (val < 0));
95
+ }
96
+
83
97
  extern int git__strtol32(int32_t *n, const char *buff, const char **end_buf, int base);
84
98
  extern int git__strtol64(int64_t *n, const char *buff, const char **end_buf, int base);
85
99
 
@@ -101,6 +115,7 @@ GIT_INLINE(int) git__is_sizet(git_off_t p)
101
115
  #endif
102
116
 
103
117
  extern char *git__strtok(char **end, const char *sep);
118
+ extern char *git__strsep(char **end, const char *sep);
104
119
 
105
120
  extern void git__strntolower(char *str, size_t len);
106
121
  extern void git__strtolower(char *str);
@@ -112,22 +127,64 @@ GIT_INLINE(const char *) git__next_line(const char *s)
112
127
  return s;
113
128
  }
114
129
 
115
- extern void git__tsort(void **dst, size_t size, int (*cmp)(const void *, const void *));
130
+ GIT_INLINE(const void *) git__memrchr(const void *s, int c, size_t n)
131
+ {
132
+ const unsigned char *cp;
133
+
134
+ if (n != 0) {
135
+ cp = (unsigned char *)s + n;
136
+ do {
137
+ if (*(--cp) == (unsigned char)c)
138
+ return cp;
139
+ } while (--n != 0);
140
+ }
141
+
142
+ return NULL;
143
+ }
144
+
145
+ typedef int (*git__tsort_cmp)(const void *a, const void *b);
146
+
147
+ extern void git__tsort(void **dst, size_t size, git__tsort_cmp cmp);
148
+
149
+ typedef int (*git__sort_r_cmp)(const void *a, const void *b, void *payload);
150
+
151
+ extern void git__tsort_r(
152
+ void **dst, size_t size, git__sort_r_cmp cmp, void *payload);
153
+
154
+ extern void git__qsort_r(
155
+ void *els, size_t nel, size_t elsize, git__sort_r_cmp cmp, void *payload);
156
+
157
+ extern void git__insertsort_r(
158
+ void *els, size_t nel, size_t elsize, void *swapel,
159
+ git__sort_r_cmp cmp, void *payload);
116
160
 
117
161
  /**
118
162
  * @param position If non-NULL, this will be set to the position where the
119
163
  * element is or would be inserted if not found.
120
- * @return pos (>=0) if found or -1 if not found
164
+ * @return 0 if found; GIT_ENOTFOUND if not found
121
165
  */
122
166
  extern int git__bsearch(
123
167
  void **array,
124
168
  size_t array_len,
125
169
  const void *key,
126
- int (*compare)(const void *, const void *),
170
+ int (*compare)(const void *key, const void *element),
171
+ size_t *position);
172
+
173
+ extern int git__bsearch_r(
174
+ void **array,
175
+ size_t array_len,
176
+ const void *key,
177
+ int (*compare_r)(const void *key, const void *element, void *payload),
178
+ void *payload,
127
179
  size_t *position);
128
180
 
129
181
  extern int git__strcmp_cb(const void *a, const void *b);
130
182
 
183
+ extern int git__strcmp(const char *a, const char *b);
184
+ extern int git__strcasecmp(const char *a, const char *b);
185
+ extern int git__strncmp(const char *a, const char *b, size_t sz);
186
+ extern int git__strncasecmp(const char *a, const char *b, size_t sz);
187
+
131
188
  typedef struct {
132
189
  short refcount;
133
190
  void *owner;
@@ -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,33 +9,59 @@
9
9
  #include "repository.h"
10
10
  #include "vector.h"
11
11
 
12
- static const double resize_factor = 1.75;
13
- static const unsigned int minimum_size = 8;
12
+ /* In elements, not bytes */
13
+ #define MIN_ALLOCSIZE 8
14
14
 
15
- static int resize_vector(git_vector *v)
15
+ GIT_INLINE(size_t) compute_new_size(git_vector *v)
16
16
  {
17
- v->_alloc_size = ((unsigned int)(v->_alloc_size * resize_factor)) + 1;
18
- if (v->_alloc_size < minimum_size)
19
- v->_alloc_size = minimum_size;
17
+ size_t new_size = v->_alloc_size;
18
+
19
+ /* Use a resize factor of 1.5, which is quick to compute using integer
20
+ * instructions and less than the golden ratio (1.618...) */
21
+ if (new_size < MIN_ALLOCSIZE)
22
+ new_size = MIN_ALLOCSIZE;
23
+ else if (new_size <= (SIZE_MAX / 3) * 2)
24
+ new_size += new_size / 2;
25
+ else
26
+ new_size = SIZE_MAX;
27
+
28
+ return new_size;
29
+ }
20
30
 
21
- v->contents = git__realloc(v->contents, v->_alloc_size * sizeof(void *));
22
- GITERR_CHECK_ALLOC(v->contents);
31
+ GIT_INLINE(int) resize_vector(git_vector *v, size_t new_size)
32
+ {
33
+ size_t new_bytes = new_size * sizeof(void *);
34
+ void *new_contents;
35
+
36
+ /* Check for overflow */
37
+ if (new_bytes / sizeof(void *) != new_size)
38
+ GITERR_CHECK_ALLOC(NULL);
39
+
40
+ new_contents = git__realloc(v->contents, new_bytes);
41
+ GITERR_CHECK_ALLOC(new_contents);
42
+
43
+ v->_alloc_size = new_size;
44
+ v->contents = new_contents;
23
45
 
24
46
  return 0;
25
47
  }
26
48
 
27
- int git_vector_dup(git_vector *v, git_vector *src, git_vector_cmp cmp)
49
+ int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp)
28
50
  {
51
+ size_t bytes;
52
+
29
53
  assert(v && src);
30
54
 
55
+ bytes = src->length * sizeof(void *);
56
+
31
57
  v->_alloc_size = src->length;
32
58
  v->_cmp = cmp;
33
59
  v->length = src->length;
34
60
  v->sorted = src->sorted && cmp == src->_cmp;
35
- v->contents = git__malloc(src->length * sizeof(void *));
61
+ v->contents = git__malloc(bytes);
36
62
  GITERR_CHECK_ALLOC(v->contents);
37
63
 
38
- memcpy(v->contents, src->contents, src->length * sizeof(void *));
64
+ memcpy(v->contents, src->contents, bytes);
39
65
 
40
66
  return 0;
41
67
  }
@@ -55,21 +81,13 @@ int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp)
55
81
  {
56
82
  assert(v);
57
83
 
58
- memset(v, 0x0, sizeof(git_vector));
59
-
60
- if (initial_size == 0)
61
- initial_size = minimum_size;
62
-
63
- v->_alloc_size = initial_size;
84
+ v->_alloc_size = 0;
64
85
  v->_cmp = cmp;
65
-
66
86
  v->length = 0;
67
87
  v->sorted = 1;
88
+ v->contents = NULL;
68
89
 
69
- v->contents = git__malloc(v->_alloc_size * sizeof(void *));
70
- GITERR_CHECK_ALLOC(v->contents);
71
-
72
- return 0;
90
+ return resize_vector(v, max(initial_size, MIN_ALLOCSIZE));
73
91
  }
74
92
 
75
93
  int git_vector_insert(git_vector *v, void *element)
@@ -77,7 +95,7 @@ int git_vector_insert(git_vector *v, void *element)
77
95
  assert(v);
78
96
 
79
97
  if (v->length >= v->_alloc_size &&
80
- resize_vector(v) < 0)
98
+ resize_vector(v, compute_new_size(v)) < 0)
81
99
  return -1;
82
100
 
83
101
  v->contents[v->length++] = element;
@@ -98,26 +116,25 @@ int git_vector_insert_sorted(
98
116
  git_vector_sort(v);
99
117
 
100
118
  if (v->length >= v->_alloc_size &&
101
- resize_vector(v) < 0)
119
+ resize_vector(v, compute_new_size(v)) < 0)
102
120
  return -1;
103
121
 
104
122
  /* If we find the element and have a duplicate handler callback,
105
123
  * invoke it. If it returns non-zero, then cancel insert, otherwise
106
124
  * proceed with normal insert.
107
125
  */
108
- if (git__bsearch(v->contents, v->length, element, v->_cmp, &pos) >= 0 &&
109
- on_dup != NULL &&
110
- (result = on_dup(&v->contents[pos], element)) < 0)
126
+ if (!git__bsearch(v->contents, v->length, element, v->_cmp, &pos) &&
127
+ on_dup && (result = on_dup(&v->contents[pos], element)) < 0)
111
128
  return result;
112
129
 
113
130
  /* shift elements to the right */
114
- if (pos < v->length) {
131
+ if (pos < v->length)
115
132
  memmove(v->contents + pos + 1, v->contents + pos,
116
133
  (v->length - pos) * sizeof(void *));
117
- }
118
134
 
119
135
  v->contents[pos] = element;
120
136
  v->length++;
137
+
121
138
  return 0;
122
139
  }
123
140
 
@@ -125,47 +142,44 @@ void git_vector_sort(git_vector *v)
125
142
  {
126
143
  assert(v);
127
144
 
128
- if (v->sorted || v->_cmp == NULL)
145
+ if (v->sorted || !v->_cmp)
129
146
  return;
130
147
 
131
148
  git__tsort(v->contents, v->length, v->_cmp);
132
149
  v->sorted = 1;
133
150
  }
134
151
 
135
- int git_vector_bsearch3(
136
- unsigned int *at_pos,
152
+ int git_vector_bsearch2(
153
+ size_t *at_pos,
137
154
  git_vector *v,
138
155
  git_vector_cmp key_lookup,
139
156
  const void *key)
140
157
  {
141
- int rval;
142
- size_t pos;
143
-
144
158
  assert(v && key && key_lookup);
145
159
 
146
160
  /* need comparison function to sort the vector */
147
- assert(v->_cmp != NULL);
161
+ if (!v->_cmp)
162
+ return -1;
148
163
 
149
164
  git_vector_sort(v);
150
165
 
151
- rval = git__bsearch(v->contents, v->length, key, key_lookup, &pos);
152
-
153
- if (at_pos != NULL)
154
- *at_pos = (unsigned int)pos;
155
-
156
- return (rval >= 0) ? (int)pos : GIT_ENOTFOUND;
166
+ return git__bsearch(v->contents, v->length, key, key_lookup, at_pos);
157
167
  }
158
168
 
159
169
  int git_vector_search2(
160
- git_vector *v, git_vector_cmp key_lookup, const void *key)
170
+ size_t *at_pos, const git_vector *v, git_vector_cmp key_lookup, const void *key)
161
171
  {
162
- unsigned int i;
172
+ size_t i;
163
173
 
164
174
  assert(v && key && key_lookup);
165
175
 
166
176
  for (i = 0; i < v->length; ++i) {
167
- if (key_lookup(key, v->contents[i]) == 0)
168
- return i;
177
+ if (key_lookup(key, v->contents[i]) == 0) {
178
+ if (at_pos)
179
+ *at_pos = i;
180
+
181
+ return 0;
182
+ }
169
183
  }
170
184
 
171
185
  return GIT_ENOTFOUND;
@@ -176,22 +190,25 @@ static int strict_comparison(const void *a, const void *b)
176
190
  return (a == b) ? 0 : -1;
177
191
  }
178
192
 
179
- int git_vector_search(git_vector *v, const void *entry)
193
+ int git_vector_search(size_t *at_pos, const git_vector *v, const void *entry)
180
194
  {
181
- return git_vector_search2(v, v->_cmp ? v->_cmp : strict_comparison, entry);
195
+ return git_vector_search2(at_pos, v, v->_cmp ? v->_cmp : strict_comparison, entry);
182
196
  }
183
197
 
184
- int git_vector_remove(git_vector *v, unsigned int idx)
198
+ int git_vector_remove(git_vector *v, size_t idx)
185
199
  {
186
- unsigned int i;
200
+ size_t shift_count;
187
201
 
188
202
  assert(v);
189
203
 
190
- if (idx >= v->length || v->length == 0)
204
+ if (idx >= v->length)
191
205
  return GIT_ENOTFOUND;
192
206
 
193
- for (i = idx; i < v->length - 1; ++i)
194
- v->contents[i] = v->contents[i + 1];
207
+ shift_count = v->length - idx - 1;
208
+
209
+ if (shift_count)
210
+ memmove(&v->contents[idx], &v->contents[idx + 1],
211
+ shift_count * sizeof(void *));
195
212
 
196
213
  v->length--;
197
214
  return 0;
@@ -206,7 +223,7 @@ void git_vector_pop(git_vector *v)
206
223
  void git_vector_uniq(git_vector *v)
207
224
  {
208
225
  git_vector_cmp cmp;
209
- unsigned int i, j;
226
+ size_t i, j;
210
227
 
211
228
  if (v->length <= 1)
212
229
  return;
@@ -223,6 +240,21 @@ void git_vector_uniq(git_vector *v)
223
240
  v->length -= j - i - 1;
224
241
  }
225
242
 
243
+ void git_vector_remove_matching(
244
+ git_vector *v, int (*match)(const git_vector *v, size_t idx))
245
+ {
246
+ size_t i, j;
247
+
248
+ for (i = 0, j = 0; j < v->length; ++j) {
249
+ v->contents[i] = v->contents[j];
250
+
251
+ if (!match(v, i))
252
+ i++;
253
+ }
254
+
255
+ v->length = i;
256
+ }
257
+
226
258
  void git_vector_clear(git_vector *v)
227
259
  {
228
260
  assert(v);
@@ -234,10 +266,41 @@ void git_vector_swap(git_vector *a, git_vector *b)
234
266
  {
235
267
  git_vector t;
236
268
 
237
- if (!a || !b || a == b)
238
- return;
269
+ assert(a && b);
239
270
 
240
- memcpy(&t, a, sizeof(t));
241
- memcpy(a, b, sizeof(t));
242
- memcpy(b, &t, sizeof(t));
271
+ if (a != b) {
272
+ memcpy(&t, a, sizeof(t));
273
+ memcpy(a, b, sizeof(t));
274
+ memcpy(b, &t, sizeof(t));
275
+ }
276
+ }
277
+
278
+ int git_vector_resize_to(git_vector *v, size_t new_length)
279
+ {
280
+ if (new_length <= v->length)
281
+ return 0;
282
+
283
+ if (new_length > v->_alloc_size &&
284
+ resize_vector(v, new_length) < 0)
285
+ return -1;
286
+
287
+ memset(&v->contents[v->length], 0,
288
+ sizeof(void *) * (new_length - v->length));
289
+
290
+ v->length = new_length;
291
+
292
+ return 0;
293
+ }
294
+
295
+ int git_vector_set(void **old, git_vector *v, size_t position, void *value)
296
+ {
297
+ if (git_vector_resize_to(v, position + 1) < 0)
298
+ return -1;
299
+
300
+ if (old != NULL)
301
+ *old = v->contents[position];
302
+
303
+ v->contents[position] = value;
304
+
305
+ return 0;
243
306
  }