rugged 0.16.0 → 0.17.0b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (392) hide show
  1. data/README.md +373 -243
  2. data/Rakefile +22 -0
  3. data/ext/rugged/extconf.rb +9 -6
  4. data/ext/rugged/rugged.c +123 -31
  5. data/ext/rugged/rugged.h +11 -10
  6. data/ext/rugged/rugged_blob.c +181 -18
  7. data/ext/rugged/rugged_commit.c +196 -18
  8. data/ext/rugged/rugged_config.c +94 -5
  9. data/ext/rugged/rugged_object.c +54 -1
  10. data/ext/rugged/rugged_reference.c +203 -15
  11. data/ext/rugged/{remote.c → rugged_remote.c} +35 -10
  12. data/ext/rugged/rugged_repo.c +323 -81
  13. data/ext/rugged/rugged_revwalk.c +57 -4
  14. data/ext/rugged/rugged_signature.c +3 -3
  15. data/ext/rugged/rugged_tag.c +72 -1
  16. data/ext/rugged/rugged_tree.c +70 -2
  17. data/ext/rugged/vendor/libgit2-dist/deps/regex/config.h +7 -0
  18. data/ext/rugged/vendor/libgit2-dist/deps/regex/regcomp.c +3856 -0
  19. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.c +85 -0
  20. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.h +582 -0
  21. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.c +1744 -0
  22. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.h +810 -0
  23. data/ext/rugged/vendor/libgit2-dist/deps/regex/regexec.c +4369 -0
  24. data/ext/rugged/vendor/libgit2-dist/examples/diff.c +238 -0
  25. data/ext/rugged/vendor/libgit2-dist/examples/general.c +4 -4
  26. data/ext/rugged/vendor/libgit2-dist/examples/network/fetch.c +101 -85
  27. data/ext/rugged/vendor/libgit2-dist/examples/network/git2.c +7 -3
  28. data/ext/rugged/vendor/libgit2-dist/examples/network/index-pack.c +80 -25
  29. data/ext/rugged/vendor/libgit2-dist/examples/network/ls-remote.c +6 -6
  30. data/ext/rugged/vendor/libgit2-dist/include/git2/attr.h +224 -0
  31. data/ext/rugged/vendor/libgit2-dist/include/git2/blob.h +59 -5
  32. data/ext/rugged/vendor/libgit2-dist/include/git2/branch.h +114 -7
  33. data/ext/rugged/vendor/libgit2-dist/include/git2/commit.h +14 -7
  34. data/ext/rugged/vendor/libgit2-dist/include/git2/common.h +4 -3
  35. data/ext/rugged/vendor/libgit2-dist/include/git2/config.h +105 -27
  36. data/ext/rugged/vendor/libgit2-dist/include/git2/diff.h +409 -0
  37. data/ext/rugged/vendor/libgit2-dist/include/git2/errors.h +47 -82
  38. data/ext/rugged/vendor/libgit2-dist/include/git2/index.h +25 -10
  39. data/ext/rugged/vendor/libgit2-dist/include/git2/indexer.h +46 -1
  40. data/ext/rugged/vendor/libgit2-dist/include/git2/merge.h +35 -0
  41. data/ext/rugged/vendor/libgit2-dist/include/git2/net.h +1 -1
  42. data/ext/rugged/vendor/libgit2-dist/include/git2/notes.h +139 -0
  43. data/ext/rugged/vendor/libgit2-dist/include/git2/object.h +5 -5
  44. data/ext/rugged/vendor/libgit2-dist/include/git2/odb.h +13 -13
  45. data/ext/rugged/vendor/libgit2-dist/include/git2/odb_backend.h +8 -8
  46. data/ext/rugged/vendor/libgit2-dist/include/git2/oid.h +14 -9
  47. data/ext/rugged/vendor/libgit2-dist/include/git2/reflog.h +5 -5
  48. data/ext/rugged/vendor/libgit2-dist/include/git2/refs.h +37 -17
  49. data/ext/rugged/vendor/libgit2-dist/include/git2/refspec.h +17 -9
  50. data/ext/rugged/vendor/libgit2-dist/include/git2/remote.h +83 -16
  51. data/ext/rugged/vendor/libgit2-dist/include/git2/repository.h +24 -10
  52. data/ext/rugged/vendor/libgit2-dist/include/git2/reset.h +44 -0
  53. data/ext/rugged/vendor/libgit2-dist/include/git2/revparse.h +36 -0
  54. data/ext/rugged/vendor/libgit2-dist/include/git2/revwalk.h +74 -6
  55. data/ext/rugged/vendor/libgit2-dist/include/git2/signature.h +3 -3
  56. data/ext/rugged/vendor/libgit2-dist/include/git2/status.h +120 -19
  57. data/ext/rugged/vendor/libgit2-dist/include/git2/submodule.h +103 -0
  58. data/ext/rugged/vendor/libgit2-dist/include/git2/tag.h +28 -10
  59. data/ext/rugged/vendor/libgit2-dist/include/git2/threads.h +1 -1
  60. data/ext/rugged/vendor/libgit2-dist/include/git2/tree.h +13 -13
  61. data/ext/rugged/vendor/libgit2-dist/include/git2/types.h +16 -2
  62. data/ext/rugged/vendor/libgit2-dist/include/git2/version.h +3 -3
  63. data/ext/rugged/vendor/libgit2-dist/include/git2/windows.h +1 -1
  64. data/ext/rugged/vendor/libgit2-dist/include/git2.h +7 -2
  65. data/ext/rugged/vendor/libgit2-dist/src/attr.c +677 -0
  66. data/ext/rugged/vendor/libgit2-dist/src/attr.h +56 -0
  67. data/ext/rugged/vendor/libgit2-dist/src/attr_file.c +609 -0
  68. data/ext/rugged/vendor/libgit2-dist/src/attr_file.h +145 -0
  69. data/ext/rugged/vendor/libgit2-dist/src/blob.c +213 -60
  70. data/ext/rugged/vendor/libgit2-dist/src/blob.h +2 -1
  71. data/ext/rugged/vendor/libgit2-dist/src/branch.c +208 -0
  72. data/ext/rugged/vendor/libgit2-dist/src/branch.h +17 -0
  73. data/ext/rugged/vendor/libgit2-dist/src/bswap.h +1 -1
  74. data/ext/rugged/vendor/libgit2-dist/src/buffer.c +395 -46
  75. data/ext/rugged/vendor/libgit2-dist/src/buffer.h +112 -9
  76. data/ext/rugged/vendor/libgit2-dist/src/cache.c +37 -49
  77. data/ext/rugged/vendor/libgit2-dist/src/cache.h +7 -17
  78. data/ext/rugged/vendor/libgit2-dist/src/cc-compat.h +18 -16
  79. data/ext/rugged/vendor/libgit2-dist/src/commit.c +56 -90
  80. data/ext/rugged/vendor/libgit2-dist/src/commit.h +1 -1
  81. data/ext/rugged/vendor/libgit2-dist/src/common.h +12 -5
  82. data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.c +1 -1
  83. data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.h +3 -3
  84. data/ext/rugged/vendor/libgit2-dist/src/config.c +247 -158
  85. data/ext/rugged/vendor/libgit2-dist/src/config.h +10 -1
  86. data/ext/rugged/vendor/libgit2-dist/src/config_cache.c +94 -0
  87. data/ext/rugged/vendor/libgit2-dist/src/config_file.c +606 -496
  88. data/ext/rugged/vendor/libgit2-dist/src/config_file.h +31 -0
  89. data/ext/rugged/vendor/libgit2-dist/src/crlf.c +228 -0
  90. data/ext/rugged/vendor/libgit2-dist/src/date.c +876 -0
  91. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.c +15 -9
  92. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.h +2 -2
  93. data/ext/rugged/vendor/libgit2-dist/src/diff.c +814 -0
  94. data/ext/rugged/vendor/libgit2-dist/src/diff.h +43 -0
  95. data/ext/rugged/vendor/libgit2-dist/src/diff_output.c +794 -0
  96. data/ext/rugged/vendor/libgit2-dist/src/errors.c +89 -74
  97. data/ext/rugged/vendor/libgit2-dist/src/fetch.c +94 -66
  98. data/ext/rugged/vendor/libgit2-dist/src/fetch.h +5 -4
  99. data/ext/rugged/vendor/libgit2-dist/src/filebuf.c +157 -100
  100. data/ext/rugged/vendor/libgit2-dist/src/filebuf.h +22 -8
  101. data/ext/rugged/vendor/libgit2-dist/src/fileops.c +330 -206
  102. data/ext/rugged/vendor/libgit2-dist/src/fileops.h +82 -51
  103. data/ext/rugged/vendor/libgit2-dist/src/filter.c +165 -0
  104. data/ext/rugged/vendor/libgit2-dist/src/filter.h +119 -0
  105. data/ext/rugged/vendor/libgit2-dist/src/global.c +4 -4
  106. data/ext/rugged/vendor/libgit2-dist/src/global.h +4 -1
  107. data/ext/rugged/vendor/libgit2-dist/src/hash.c +1 -1
  108. data/ext/rugged/vendor/libgit2-dist/src/hash.h +1 -1
  109. data/ext/rugged/vendor/libgit2-dist/src/ignore.c +203 -0
  110. data/ext/rugged/vendor/libgit2-dist/src/ignore.h +38 -0
  111. data/ext/rugged/vendor/libgit2-dist/src/index.c +220 -169
  112. data/ext/rugged/vendor/libgit2-dist/src/index.h +5 -1
  113. data/ext/rugged/vendor/libgit2-dist/src/indexer.c +601 -102
  114. data/ext/rugged/vendor/libgit2-dist/src/iterator.c +748 -0
  115. data/ext/rugged/vendor/libgit2-dist/src/iterator.h +151 -0
  116. data/ext/rugged/vendor/libgit2-dist/src/khash.h +608 -0
  117. data/ext/rugged/vendor/libgit2-dist/src/map.h +6 -1
  118. data/ext/rugged/vendor/libgit2-dist/src/message.c +61 -0
  119. data/ext/rugged/vendor/libgit2-dist/src/message.h +14 -0
  120. data/ext/rugged/vendor/libgit2-dist/src/mwindow.c +27 -29
  121. data/ext/rugged/vendor/libgit2-dist/src/mwindow.h +4 -4
  122. data/ext/rugged/vendor/libgit2-dist/src/netops.c +375 -56
  123. data/ext/rugged/vendor/libgit2-dist/src/netops.h +12 -9
  124. data/ext/rugged/vendor/libgit2-dist/src/notes.c +548 -0
  125. data/ext/rugged/vendor/libgit2-dist/src/notes.h +28 -0
  126. data/ext/rugged/vendor/libgit2-dist/src/object.c +59 -21
  127. data/ext/rugged/vendor/libgit2-dist/src/odb.c +212 -175
  128. data/ext/rugged/vendor/libgit2-dist/src/odb.h +39 -2
  129. data/ext/rugged/vendor/libgit2-dist/src/odb_loose.c +238 -241
  130. data/ext/rugged/vendor/libgit2-dist/src/odb_pack.c +94 -106
  131. data/ext/rugged/vendor/libgit2-dist/src/oid.c +59 -60
  132. data/ext/rugged/vendor/libgit2-dist/src/oidmap.h +42 -0
  133. data/ext/rugged/vendor/libgit2-dist/src/pack.c +198 -170
  134. data/ext/rugged/vendor/libgit2-dist/src/pack.h +16 -9
  135. data/ext/rugged/vendor/libgit2-dist/src/path.c +496 -106
  136. data/ext/rugged/vendor/libgit2-dist/src/path.h +214 -20
  137. data/ext/rugged/vendor/libgit2-dist/src/pkt.c +88 -159
  138. data/ext/rugged/vendor/libgit2-dist/src/pkt.h +9 -5
  139. data/ext/rugged/vendor/libgit2-dist/src/pool.c +294 -0
  140. data/ext/rugged/vendor/libgit2-dist/src/pool.h +125 -0
  141. data/ext/rugged/vendor/libgit2-dist/src/posix.c +38 -16
  142. data/ext/rugged/vendor/libgit2-dist/src/posix.h +20 -2
  143. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.c +1 -1
  144. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.h +1 -1
  145. data/ext/rugged/vendor/libgit2-dist/src/pqueue.c +7 -7
  146. data/ext/rugged/vendor/libgit2-dist/src/pqueue.h +1 -1
  147. data/ext/rugged/vendor/libgit2-dist/src/protocol.c +21 -13
  148. data/ext/rugged/vendor/libgit2-dist/src/protocol.h +1 -1
  149. data/ext/rugged/vendor/libgit2-dist/src/reflog.c +125 -103
  150. data/ext/rugged/vendor/libgit2-dist/src/reflog.h +1 -1
  151. data/ext/rugged/vendor/libgit2-dist/src/refs.c +713 -640
  152. data/ext/rugged/vendor/libgit2-dist/src/refs.h +27 -3
  153. data/ext/rugged/vendor/libgit2-dist/src/refspec.c +51 -17
  154. data/ext/rugged/vendor/libgit2-dist/src/refspec.h +13 -1
  155. data/ext/rugged/vendor/libgit2-dist/src/remote.c +307 -119
  156. data/ext/rugged/vendor/libgit2-dist/src/remote.h +3 -2
  157. data/ext/rugged/vendor/libgit2-dist/src/repository.c +593 -442
  158. data/ext/rugged/vendor/libgit2-dist/src/repository.h +80 -2
  159. data/ext/rugged/vendor/libgit2-dist/src/reset.c +103 -0
  160. data/ext/rugged/vendor/libgit2-dist/src/revparse.c +753 -0
  161. data/ext/rugged/vendor/libgit2-dist/src/revwalk.c +434 -158
  162. data/ext/rugged/vendor/libgit2-dist/src/sha1.c +3 -3
  163. data/ext/rugged/vendor/libgit2-dist/src/sha1.h +2 -2
  164. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.c +3 -2
  165. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.h +1 -1
  166. data/ext/rugged/vendor/libgit2-dist/src/signature.c +69 -80
  167. data/ext/rugged/vendor/libgit2-dist/src/signature.h +1 -1
  168. data/ext/rugged/vendor/libgit2-dist/src/status.c +184 -638
  169. data/ext/rugged/vendor/libgit2-dist/src/strmap.h +64 -0
  170. data/ext/rugged/vendor/libgit2-dist/src/submodule.c +387 -0
  171. data/ext/rugged/vendor/libgit2-dist/src/tag.c +162 -137
  172. data/ext/rugged/vendor/libgit2-dist/src/tag.h +2 -1
  173. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.c +1 -1
  174. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.h +8 -8
  175. data/ext/rugged/vendor/libgit2-dist/src/transport.c +31 -19
  176. data/ext/rugged/vendor/libgit2-dist/src/transport.h +31 -11
  177. data/ext/rugged/vendor/libgit2-dist/src/transports/git.c +168 -193
  178. data/ext/rugged/vendor/libgit2-dist/src/transports/http.c +192 -241
  179. data/ext/rugged/vendor/libgit2-dist/src/transports/local.c +92 -86
  180. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.c +32 -49
  181. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.h +1 -1
  182. data/ext/rugged/vendor/libgit2-dist/src/tree.c +172 -145
  183. data/ext/rugged/vendor/libgit2-dist/src/tree.h +16 -2
  184. data/ext/rugged/vendor/libgit2-dist/src/tsort.c +16 -14
  185. data/ext/rugged/vendor/libgit2-dist/src/unix/map.c +8 -24
  186. data/ext/rugged/vendor/libgit2-dist/src/unix/posix.h +9 -3
  187. data/ext/rugged/vendor/libgit2-dist/src/util.c +94 -38
  188. data/ext/rugged/vendor/libgit2-dist/src/util.h +119 -13
  189. data/ext/rugged/vendor/libgit2-dist/src/vector.c +84 -31
  190. data/ext/rugged/vendor/libgit2-dist/src/vector.h +37 -4
  191. data/ext/rugged/vendor/libgit2-dist/src/win32/dir.c +81 -41
  192. data/ext/rugged/vendor/libgit2-dist/src/{dir.h → win32/dir.h} +4 -9
  193. data/ext/rugged/vendor/libgit2-dist/src/win32/map.c +19 -35
  194. data/ext/rugged/vendor/libgit2-dist/src/win32/mingw-compat.h +1 -1
  195. data/ext/rugged/vendor/libgit2-dist/src/win32/msvc-compat.h +5 -1
  196. data/ext/rugged/vendor/libgit2-dist/src/win32/posix.h +10 -8
  197. data/ext/rugged/vendor/libgit2-dist/src/win32/posix_w32.c +262 -118
  198. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.c +12 -9
  199. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.h +1 -1
  200. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.c +30 -26
  201. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.h +2 -1
  202. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiff.h +135 -0
  203. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.c +572 -0
  204. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.h +63 -0
  205. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.c +253 -0
  206. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.h +36 -0
  207. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xhistogram.c +371 -0
  208. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xinclude.h +46 -0
  209. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmacros.h +54 -0
  210. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmerge.c +619 -0
  211. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xpatience.c +358 -0
  212. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.c +483 -0
  213. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.h +34 -0
  214. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xtypes.h +67 -0
  215. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.c +419 -0
  216. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.h +49 -0
  217. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/attr_expect.h +43 -0
  218. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/file.c +226 -0
  219. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/flags.c +108 -0
  220. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/lookup.c +262 -0
  221. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/repo.c +273 -0
  222. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/buf/basic.c +5 -5
  223. data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_helpers.c +181 -0
  224. data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_libgit2.h +55 -0
  225. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/commit.c +44 -0
  226. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/parse.c +350 -0
  227. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/signature.c +65 -0
  228. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/write.c +140 -0
  229. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/add.c +3 -3
  230. data/ext/rugged/vendor/libgit2-dist/tests-clar/config/multivar.c +151 -0
  231. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/new.c +5 -5
  232. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/read.c +44 -32
  233. data/ext/rugged/vendor/libgit2-dist/tests-clar/config/stress.c +61 -0
  234. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/write.c +20 -5
  235. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/buffer.c +613 -0
  236. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/dirent.c +39 -26
  237. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/env.c +115 -0
  238. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/errors.c +60 -0
  239. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/filebuf.c +4 -18
  240. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/hex.c +22 -0
  241. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/oid.c +6 -6
  242. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/path.c +420 -0
  243. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/pool.c +85 -0
  244. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/rmdir.c +68 -0
  245. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/string.c +1 -1
  246. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/strmap.c +102 -0
  247. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/strtol.c +1 -1
  248. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/vector.c +191 -0
  249. data/ext/rugged/vendor/libgit2-dist/tests-clar/date/date.c +15 -0
  250. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/blob.c +254 -0
  251. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.c +104 -0
  252. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.h +47 -0
  253. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/index.c +92 -0
  254. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/iterator.c +572 -0
  255. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/patch.c +99 -0
  256. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/tree.c +210 -0
  257. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/workdir.c +543 -0
  258. data/ext/rugged/vendor/libgit2-dist/tests-clar/index/read_tree.c +46 -0
  259. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/index/rename.c +2 -12
  260. data/ext/rugged/vendor/libgit2-dist/tests-clar/index/tests.c +246 -0
  261. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/createremotethenload.c +33 -0
  262. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotelocal.c +137 -0
  263. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotes.c +183 -0
  264. data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notes.c +133 -0
  265. data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notesref.c +57 -0
  266. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/filter.c +125 -0
  267. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/fromchunks.c +87 -0
  268. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/write.c +69 -0
  269. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/commit/commitstagedfile.c +126 -0
  270. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/lookup.c +63 -0
  271. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/message.c +171 -0
  272. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/chars.c +3 -14
  273. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/compare.c +4 -4
  274. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/convert.c +10 -10
  275. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/data.h +0 -0
  276. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/fromstr.c +1 -1
  277. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/hash.c +21 -17
  278. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/short.c +1 -1
  279. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/size.c +1 -1
  280. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/type2string.c +14 -14
  281. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/raw/write.c +455 -0
  282. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/peel.c +56 -0
  283. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/read.c +130 -0
  284. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/write.c +192 -0
  285. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/tree/frompath.c +22 -16
  286. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/read.c +75 -0
  287. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/write.c +84 -0
  288. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose.c +1 -1
  289. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose_data.h +0 -0
  290. data/ext/rugged/vendor/libgit2-dist/tests-clar/odb/mixed.c +24 -0
  291. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/pack_data.h +0 -0
  292. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/packed.c +1 -1
  293. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/sorting.c +1 -1
  294. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/create.c +113 -0
  295. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/delete.c +91 -0
  296. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/listall.c +78 -0
  297. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/move.c +72 -0
  298. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/crashes.c +17 -0
  299. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/create.c +149 -0
  300. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/delete.c +85 -0
  301. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/list.c +53 -0
  302. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/listall.c +36 -0
  303. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/lookup.c +42 -0
  304. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/normalize.c +200 -0
  305. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/overwrite.c +136 -0
  306. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/pack.c +67 -0
  307. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/read.c +194 -0
  308. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/reflog.c +123 -0
  309. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/rename.c +339 -0
  310. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/revparse.c +174 -0
  311. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/unicode.c +42 -0
  312. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/discover.c +142 -0
  313. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/repo/getters.c +19 -1
  314. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/init.c +235 -0
  315. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/open.c +282 -0
  316. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/setters.c +80 -0
  317. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/mixed.c +47 -0
  318. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.c +10 -0
  319. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.h +6 -0
  320. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/soft.c +102 -0
  321. data/ext/rugged/vendor/libgit2-dist/{tests/t05-revwalk.c → tests-clar/revwalk/basic.c} +85 -44
  322. data/ext/rugged/vendor/libgit2-dist/tests-clar/revwalk/mergebase.c +148 -0
  323. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/ignore.c +133 -0
  324. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/status/single.c +2 -11
  325. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_data.h +202 -0
  326. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.c +49 -0
  327. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.h +33 -0
  328. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/submodules.c +112 -0
  329. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/worktree.c +649 -0
  330. data/ext/rugged/vendor/libgit2-dist/tests-clar/threads/basic.c +20 -0
  331. data/ext/rugged/vendor/libgit2-dist.tar.gz +0 -0
  332. data/lib/rugged/commit.rb +35 -0
  333. data/lib/rugged/object.rb +7 -0
  334. data/lib/rugged/reference.rb +9 -0
  335. data/lib/rugged/repository.rb +99 -3
  336. data/lib/rugged/tag.rb +22 -0
  337. data/lib/rugged/tree.rb +8 -0
  338. data/lib/rugged/version.rb +1 -1
  339. data/lib/rugged.rb +4 -1
  340. data/test/blob_test.rb +2 -2
  341. data/test/commit_test.rb +27 -13
  342. data/test/config_test.rb +44 -0
  343. data/test/coverage/HEAD.json +1 -1
  344. data/test/fixtures/testrepo.git/config +2 -0
  345. data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
  346. data/test/lib_test.rb +7 -0
  347. data/test/object_test.rb +3 -3
  348. data/test/reference_test.rb +46 -8
  349. data/test/remote_test.rb +8 -2
  350. data/test/repo_pack_test.rb +3 -3
  351. data/test/repo_test.rb +79 -11
  352. data/test/tag_test.rb +9 -2
  353. data/test/test_helper.rb +21 -0
  354. data/test/tree_test.rb +18 -6
  355. metadata +205 -81
  356. data/ext/rugged/vendor/libgit2-dist/include/git2/zlib.h +0 -40
  357. data/ext/rugged/vendor/libgit2-dist/src/hashtable.c +0 -243
  358. data/ext/rugged/vendor/libgit2-dist/src/hashtable.h +0 -80
  359. data/ext/rugged/vendor/libgit2-dist/tests/t00-core.c +0 -628
  360. data/ext/rugged/vendor/libgit2-dist/tests/t01-data.h +0 -322
  361. data/ext/rugged/vendor/libgit2-dist/tests/t01-rawobj.c +0 -638
  362. data/ext/rugged/vendor/libgit2-dist/tests/t03-data.h +0 -344
  363. data/ext/rugged/vendor/libgit2-dist/tests/t03-objwrite.c +0 -255
  364. data/ext/rugged/vendor/libgit2-dist/tests/t04-commit.c +0 -788
  365. data/ext/rugged/vendor/libgit2-dist/tests/t06-index.c +0 -219
  366. data/ext/rugged/vendor/libgit2-dist/tests/t07-hashtable.c +0 -192
  367. data/ext/rugged/vendor/libgit2-dist/tests/t08-tag.c +0 -357
  368. data/ext/rugged/vendor/libgit2-dist/tests/t09-tree.c +0 -221
  369. data/ext/rugged/vendor/libgit2-dist/tests/t10-refs.c +0 -1294
  370. data/ext/rugged/vendor/libgit2-dist/tests/t12-repo.c +0 -174
  371. data/ext/rugged/vendor/libgit2-dist/tests/t13-threads.c +0 -41
  372. data/ext/rugged/vendor/libgit2-dist/tests/t17-bufs.c +0 -61
  373. data/ext/rugged/vendor/libgit2-dist/tests/t18-status.c +0 -448
  374. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.c +0 -310
  375. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.h +0 -83
  376. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.c +0 -198
  377. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.h +0 -54
  378. data/ext/rugged/vendor/libgit2-dist/tests/test_main.c +0 -89
  379. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay.h +0 -187
  380. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_libgit2.h +0 -28
  381. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_main.c +0 -1073
  382. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/stress.c +0 -39
  383. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/path.c +0 -139
  384. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/rmdir.c +0 -50
  385. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/vector.c +0 -66
  386. data/ext/rugged/vendor/libgit2-dist/tests-clay/network/remotes.c +0 -50
  387. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/init.c +0 -104
  388. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/open.c +0 -54
  389. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/status_data.h +0 -48
  390. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/worktree.c +0 -124
  391. data/lib/rugged/objects.rb +0 -45
  392. data/test/fixtures/testrepo.git/refs/heads/new_name +0 -1
@@ -0,0 +1,17 @@
1
+ /*
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
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
+ #ifndef INCLUDE_branch_h__
8
+ #define INCLUDE_branch_h__
9
+
10
+ #include "git2/branch.h"
11
+
12
+ struct git_branch {
13
+ char *remote; /* TODO: Make this a git_remote */
14
+ char *merge;
15
+ };
16
+
17
+ #endif
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2011 the libgit2 contributors
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
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.
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2011 the libgit2 contributors
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
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.
@@ -7,107 +7,456 @@
7
7
  #include "buffer.h"
8
8
  #include "posix.h"
9
9
  #include <stdarg.h>
10
+ #include <ctype.h>
11
+
12
+ /* Used as default value for git_buf->ptr so that people can always
13
+ * assume ptr is non-NULL and zero terminated even for new git_bufs.
14
+ */
15
+ char git_buf__initbuf[1];
16
+
17
+ char git_buf__oom[1];
10
18
 
11
19
  #define ENSURE_SIZE(b, d) \
12
- if ((ssize_t)(d) >= buf->asize && git_buf_grow(b, (d)) < GIT_SUCCESS)\
13
- return;
20
+ if ((d) > buf->asize && git_buf_grow(b, (d)) < 0)\
21
+ return -1;
22
+
23
+
24
+ void git_buf_init(git_buf *buf, size_t initial_size)
25
+ {
26
+ buf->asize = 0;
27
+ buf->size = 0;
28
+ buf->ptr = git_buf__initbuf;
29
+
30
+ if (initial_size)
31
+ git_buf_grow(buf, initial_size);
32
+ }
14
33
 
15
34
  int git_buf_grow(git_buf *buf, size_t target_size)
35
+ {
36
+ int error = git_buf_try_grow(buf, target_size);
37
+ if (error != 0)
38
+ buf->ptr = git_buf__oom;
39
+ return error;
40
+ }
41
+
42
+ int git_buf_try_grow(git_buf *buf, size_t target_size)
16
43
  {
17
44
  char *new_ptr;
45
+ size_t new_size;
18
46
 
19
- if (buf->asize < 0)
20
- return GIT_ENOMEM;
47
+ if (buf->ptr == git_buf__oom)
48
+ return -1;
21
49
 
22
- if (buf->asize == 0)
23
- buf->asize = target_size;
50
+ if (target_size <= buf->asize)
51
+ return 0;
52
+
53
+ if (buf->asize == 0) {
54
+ new_size = target_size;
55
+ new_ptr = NULL;
56
+ } else {
57
+ new_size = buf->asize;
58
+ new_ptr = buf->ptr;
59
+ }
24
60
 
25
61
  /* grow the buffer size by 1.5, until it's big enough
26
62
  * to fit our target size */
27
- while (buf->asize < (int)target_size)
28
- buf->asize = (buf->asize << 1) - (buf->asize >> 1);
63
+ while (new_size < target_size)
64
+ new_size = (new_size << 1) - (new_size >> 1);
29
65
 
30
- new_ptr = git__realloc(buf->ptr, buf->asize);
31
- if (!new_ptr) {
32
- buf->asize = -1;
33
- return GIT_ENOMEM;
34
- }
66
+ /* round allocation up to multiple of 8 */
67
+ new_size = (new_size + 7) & ~7;
68
+
69
+ new_ptr = git__realloc(new_ptr, new_size);
70
+ if (!new_ptr)
71
+ return -1;
35
72
 
36
- buf->ptr = new_ptr;
37
- return GIT_SUCCESS;
73
+ buf->asize = new_size;
74
+ buf->ptr = new_ptr;
75
+
76
+ /* truncate the existing buffer size if necessary */
77
+ if (buf->size >= buf->asize)
78
+ buf->size = buf->asize - 1;
79
+ buf->ptr[buf->size] = '\0';
80
+
81
+ return 0;
82
+ }
83
+
84
+ void git_buf_free(git_buf *buf)
85
+ {
86
+ if (!buf) return;
87
+
88
+ if (buf->ptr != git_buf__initbuf && buf->ptr != git_buf__oom)
89
+ git__free(buf->ptr);
90
+
91
+ git_buf_init(buf, 0);
92
+ }
93
+
94
+ void git_buf_clear(git_buf *buf)
95
+ {
96
+ buf->size = 0;
97
+ if (buf->asize > 0)
98
+ buf->ptr[0] = '\0';
99
+ }
100
+
101
+ int git_buf_set(git_buf *buf, const char *data, size_t len)
102
+ {
103
+ if (len == 0 || data == NULL) {
104
+ git_buf_clear(buf);
105
+ } else {
106
+ if (data != buf->ptr) {
107
+ ENSURE_SIZE(buf, len + 1);
108
+ memmove(buf->ptr, data, len);
109
+ }
110
+ buf->size = len;
111
+ buf->ptr[buf->size] = '\0';
112
+ }
113
+ return 0;
38
114
  }
39
115
 
40
- int git_buf_oom(const git_buf *buf)
116
+ int git_buf_sets(git_buf *buf, const char *string)
41
117
  {
42
- return (buf->asize < 0);
118
+ return git_buf_set(buf, string, string ? strlen(string) : 0);
43
119
  }
44
120
 
45
- void git_buf_putc(git_buf *buf, char c)
121
+ int git_buf_putc(git_buf *buf, char c)
46
122
  {
47
- ENSURE_SIZE(buf, buf->size + 1);
123
+ ENSURE_SIZE(buf, buf->size + 2);
48
124
  buf->ptr[buf->size++] = c;
125
+ buf->ptr[buf->size] = '\0';
126
+ return 0;
49
127
  }
50
128
 
51
- void git_buf_put(git_buf *buf, const char *data, size_t len)
129
+ int git_buf_put(git_buf *buf, const char *data, size_t len)
52
130
  {
53
- ENSURE_SIZE(buf, buf->size + len);
54
- memcpy(buf->ptr + buf->size, data, len);
131
+ ENSURE_SIZE(buf, buf->size + len + 1);
132
+ memmove(buf->ptr + buf->size, data, len);
55
133
  buf->size += len;
134
+ buf->ptr[buf->size] = '\0';
135
+ return 0;
56
136
  }
57
137
 
58
- void git_buf_puts(git_buf *buf, const char *string)
138
+ int git_buf_puts(git_buf *buf, const char *string)
59
139
  {
60
- git_buf_put(buf, string, strlen(string));
140
+ assert(string);
141
+ return git_buf_put(buf, string, strlen(string));
61
142
  }
62
143
 
63
- void git_buf_printf(git_buf *buf, const char *format, ...)
144
+ int git_buf_vprintf(git_buf *buf, const char *format, va_list ap)
64
145
  {
65
146
  int len;
66
- va_list arglist;
147
+ const size_t expected_size = buf->size + (strlen(format) * 2);
67
148
 
68
- ENSURE_SIZE(buf, buf->size + 1);
149
+ ENSURE_SIZE(buf, expected_size);
69
150
 
70
151
  while (1) {
71
- va_start(arglist, format);
72
- len = p_vsnprintf(buf->ptr + buf->size, buf->asize - buf->size, format, arglist);
73
- va_end(arglist);
152
+ va_list args;
153
+ va_copy(args, ap);
154
+
155
+ len = p_vsnprintf(
156
+ buf->ptr + buf->size,
157
+ buf->asize - buf->size,
158
+ format, args
159
+ );
74
160
 
75
161
  if (len < 0) {
76
- buf->asize = -1;
77
- return;
162
+ git__free(buf->ptr);
163
+ buf->ptr = git_buf__oom;
164
+ return -1;
78
165
  }
79
166
 
80
- if (len + 1 <= buf->asize - buf->size) {
167
+ if ((size_t)len + 1 <= buf->asize - buf->size) {
81
168
  buf->size += len;
82
- return;
169
+ break;
83
170
  }
84
171
 
85
172
  ENSURE_SIZE(buf, buf->size + len + 1);
86
173
  }
174
+
175
+ return 0;
176
+ }
177
+
178
+ int git_buf_printf(git_buf *buf, const char *format, ...)
179
+ {
180
+ int r;
181
+ va_list ap;
182
+
183
+ va_start(ap, format);
184
+ r = git_buf_vprintf(buf, format, ap);
185
+ va_end(ap);
186
+
187
+ return r;
188
+ }
189
+
190
+ void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf)
191
+ {
192
+ size_t copylen;
193
+
194
+ assert(data && datasize && buf);
195
+
196
+ data[0] = '\0';
197
+
198
+ if (buf->size == 0 || buf->asize <= 0)
199
+ return;
200
+
201
+ copylen = buf->size;
202
+ if (copylen > datasize - 1)
203
+ copylen = datasize - 1;
204
+ memmove(data, buf->ptr, copylen);
205
+ data[copylen] = '\0';
206
+ }
207
+
208
+ void git_buf_consume(git_buf *buf, const char *end)
209
+ {
210
+ if (end > buf->ptr && end <= buf->ptr + buf->size) {
211
+ size_t consumed = end - buf->ptr;
212
+ memmove(buf->ptr, end, buf->size - consumed);
213
+ buf->size -= consumed;
214
+ buf->ptr[buf->size] = '\0';
215
+ }
216
+ }
217
+
218
+ void git_buf_truncate(git_buf *buf, size_t len)
219
+ {
220
+ if (len < buf->size) {
221
+ buf->size = len;
222
+ buf->ptr[buf->size] = '\0';
223
+ }
224
+ }
225
+
226
+ void git_buf_rtruncate_at_char(git_buf *buf, char separator)
227
+ {
228
+ ssize_t idx = git_buf_rfind_next(buf, separator);
229
+ git_buf_truncate(buf, idx < 0 ? 0 : (size_t)idx);
230
+ }
231
+
232
+ void git_buf_swap(git_buf *buf_a, git_buf *buf_b)
233
+ {
234
+ git_buf t = *buf_a;
235
+ *buf_a = *buf_b;
236
+ *buf_b = t;
87
237
  }
88
238
 
89
- const char *git_buf_cstr(git_buf *buf)
239
+ char *git_buf_detach(git_buf *buf)
90
240
  {
91
- if (buf->size + 1 >= buf->asize && git_buf_grow(buf, buf->size + 1) < GIT_SUCCESS)
241
+ char *data = buf->ptr;
242
+
243
+ if (buf->asize == 0 || buf->ptr == git_buf__oom)
92
244
  return NULL;
93
245
 
246
+ git_buf_init(buf, 0);
247
+
248
+ return data;
249
+ }
250
+
251
+ void git_buf_attach(git_buf *buf, char *ptr, size_t asize)
252
+ {
253
+ git_buf_free(buf);
254
+
255
+ if (ptr) {
256
+ buf->ptr = ptr;
257
+ buf->size = strlen(ptr);
258
+ if (asize)
259
+ buf->asize = (asize < buf->size) ? buf->size + 1 : asize;
260
+ else /* pass 0 to fall back on strlen + 1 */
261
+ buf->asize = buf->size + 1;
262
+ } else {
263
+ git_buf_grow(buf, asize);
264
+ }
265
+ }
266
+
267
+ int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...)
268
+ {
269
+ va_list ap;
270
+ int i;
271
+ size_t total_size = 0, original_size = buf->size;
272
+ char *out, *original = buf->ptr;
273
+
274
+ if (buf->size > 0 && buf->ptr[buf->size - 1] != separator)
275
+ ++total_size; /* space for initial separator */
276
+
277
+ /* Make two passes to avoid multiple reallocation */
278
+
279
+ va_start(ap, nbuf);
280
+ for (i = 0; i < nbuf; ++i) {
281
+ const char* segment;
282
+ size_t segment_len;
283
+
284
+ segment = va_arg(ap, const char *);
285
+ if (!segment)
286
+ continue;
287
+
288
+ segment_len = strlen(segment);
289
+ total_size += segment_len;
290
+ if (segment_len == 0 || segment[segment_len - 1] != separator)
291
+ ++total_size; /* space for separator */
292
+ }
293
+ va_end(ap);
294
+
295
+ /* expand buffer if needed */
296
+ if (total_size == 0)
297
+ return 0;
298
+ if (git_buf_grow(buf, buf->size + total_size + 1) < 0)
299
+ return -1;
300
+
301
+ out = buf->ptr + buf->size;
302
+
303
+ /* append separator to existing buf if needed */
304
+ if (buf->size > 0 && out[-1] != separator)
305
+ *out++ = separator;
306
+
307
+ va_start(ap, nbuf);
308
+ for (i = 0; i < nbuf; ++i) {
309
+ const char* segment;
310
+ size_t segment_len;
311
+
312
+ segment = va_arg(ap, const char *);
313
+ if (!segment)
314
+ continue;
315
+
316
+ /* deal with join that references buffer's original content */
317
+ if (segment >= original && segment < original + original_size) {
318
+ size_t offset = (segment - original);
319
+ segment = buf->ptr + offset;
320
+ segment_len = original_size - offset;
321
+ } else {
322
+ segment_len = strlen(segment);
323
+ }
324
+
325
+ /* skip leading separators */
326
+ if (out > buf->ptr && out[-1] == separator)
327
+ while (segment_len > 0 && *segment == separator) {
328
+ segment++;
329
+ segment_len--;
330
+ }
331
+
332
+ /* copy over next buffer */
333
+ if (segment_len > 0) {
334
+ memmove(out, segment, segment_len);
335
+ out += segment_len;
336
+ }
337
+
338
+ /* append trailing separator (except for last item) */
339
+ if (i < nbuf - 1 && out > buf->ptr && out[-1] != separator)
340
+ *out++ = separator;
341
+ }
342
+ va_end(ap);
343
+
344
+ /* set size based on num characters actually written */
345
+ buf->size = out - buf->ptr;
94
346
  buf->ptr[buf->size] = '\0';
95
- return buf->ptr;
347
+
348
+ return 0;
96
349
  }
97
350
 
98
- void git_buf_free(git_buf *buf)
351
+ int git_buf_join(
352
+ git_buf *buf,
353
+ char separator,
354
+ const char *str_a,
355
+ const char *str_b)
99
356
  {
100
- git__free(buf->ptr);
357
+ size_t strlen_a = str_a ? strlen(str_a) : 0;
358
+ size_t strlen_b = strlen(str_b);
359
+ int need_sep = 0;
360
+ ssize_t offset_a = -1;
361
+
362
+ /* not safe to have str_b point internally to the buffer */
363
+ assert(str_b < buf->ptr || str_b > buf->ptr + buf->size);
364
+
365
+ /* figure out if we need to insert a separator */
366
+ if (separator && strlen_a) {
367
+ while (*str_b == separator) { str_b++; strlen_b--; }
368
+ if (str_a[strlen_a - 1] != separator)
369
+ need_sep = 1;
370
+ }
371
+
372
+ /* str_a could be part of the buffer */
373
+ if (str_a >= buf->ptr && str_a < buf->ptr + buf->size)
374
+ offset_a = str_a - buf->ptr;
375
+
376
+ if (git_buf_grow(buf, strlen_a + strlen_b + need_sep + 1) < 0)
377
+ return -1;
378
+
379
+ /* fix up internal pointers */
380
+ if (offset_a >= 0)
381
+ str_a = buf->ptr + offset_a;
382
+
383
+ /* do the actual copying */
384
+ if (offset_a != 0)
385
+ memmove(buf->ptr, str_a, strlen_a);
386
+ if (need_sep)
387
+ buf->ptr[strlen_a] = separator;
388
+ memcpy(buf->ptr + strlen_a + need_sep, str_b, strlen_b);
389
+
390
+ buf->size = strlen_a + strlen_b + need_sep;
391
+ buf->ptr[buf->size] = '\0';
392
+
393
+ return 0;
101
394
  }
102
395
 
103
- void git_buf_clear(git_buf *buf)
396
+ void git_buf_rtrim(git_buf *buf)
104
397
  {
105
- buf->size = 0;
398
+ while (buf->size > 0) {
399
+ if (!git__isspace(buf->ptr[buf->size - 1]))
400
+ break;
401
+
402
+ buf->size--;
403
+ }
404
+
405
+ buf->ptr[buf->size] = '\0';
106
406
  }
107
407
 
108
- void git_buf_consume(git_buf *buf, const char *end)
408
+ int git_buf_cmp(const git_buf *a, const git_buf *b)
109
409
  {
110
- size_t consumed = end - buf->ptr;
111
- memmove(buf->ptr, end, buf->size - consumed);
112
- buf->size -= consumed;
410
+ int result = memcmp(a->ptr, b->ptr, min(a->size, b->size));
411
+ return (result != 0) ? result :
412
+ (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0;
113
413
  }
414
+
415
+ int git_buf_common_prefix(git_buf *buf, const git_strarray *strings)
416
+ {
417
+ size_t i;
418
+ const char *str, *pfx;
419
+
420
+ git_buf_clear(buf);
421
+
422
+ if (!strings || !strings->count)
423
+ return 0;
424
+
425
+ /* initialize common prefix to first string */
426
+ if (git_buf_sets(buf, strings->strings[0]) < 0)
427
+ return -1;
428
+
429
+ /* go through the rest of the strings, truncating to shared prefix */
430
+ for (i = 1; i < strings->count; ++i) {
431
+
432
+ for (str = strings->strings[i], pfx = buf->ptr;
433
+ *str && *str == *pfx; str++, pfx++)
434
+ /* scanning */;
435
+
436
+ git_buf_truncate(buf, pfx - buf->ptr);
437
+
438
+ if (!buf->size)
439
+ break;
440
+ }
441
+
442
+ return 0;
443
+ }
444
+
445
+ bool git_buf_is_binary(const git_buf *buf)
446
+ {
447
+ size_t i;
448
+ int printable = 0, nonprintable = 0;
449
+
450
+ for (i = 0; i < buf->size; i++) {
451
+ unsigned char c = buf->ptr[i];
452
+ if (c > 0x1F && c < 0x7F)
453
+ printable++;
454
+ else if (c == '\0')
455
+ return true;
456
+ else if (!git__isspace(c))
457
+ nonprintable++;
458
+ }
459
+
460
+ return ((printable >> 7) < nonprintable);
461
+ }
462
+
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2011 the libgit2 contributors
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
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,25 +8,128 @@
8
8
  #define INCLUDE_buffer_h__
9
9
 
10
10
  #include "common.h"
11
+ #include <stdarg.h>
11
12
 
12
13
  typedef struct {
13
14
  char *ptr;
14
- ssize_t asize, size;
15
+ size_t asize, size;
15
16
  } git_buf;
16
17
 
17
- #define GIT_BUF_INIT {NULL, 0, 0}
18
+ extern char git_buf__initbuf[];
19
+ extern char git_buf__oom[];
18
20
 
21
+ #define GIT_BUF_INIT { git_buf__initbuf, 0, 0 }
22
+
23
+ /**
24
+ * Initialize a git_buf structure.
25
+ *
26
+ * For the cases where GIT_BUF_INIT cannot be used to do static
27
+ * initialization.
28
+ */
29
+ void git_buf_init(git_buf *buf, size_t initial_size);
30
+
31
+ /**
32
+ * Grow the buffer to hold at least `target_size` bytes.
33
+ *
34
+ * If the allocation fails, this will return an error and the buffer
35
+ * will be marked as invalid for future operations. The existing
36
+ * contents of the buffer will be preserved however.
37
+ * @return 0 on success or -1 on failure
38
+ */
19
39
  int git_buf_grow(git_buf *buf, size_t target_size);
20
- int git_buf_oom(const git_buf *buf);
21
- void git_buf_putc(git_buf *buf, char c);
22
- void git_buf_put(git_buf *buf, const char *data, size_t len);
23
- void git_buf_puts(git_buf *buf, const char *string);
24
- void git_buf_printf(git_buf *buf, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);
25
- const char *git_buf_cstr(git_buf *buf);
40
+
41
+ /**
42
+ * Attempt to grow the buffer to hold at least `target_size` bytes.
43
+ *
44
+ * This is just like `git_buf_grow` except that even if the allocation
45
+ * fails, the git_buf will still be left in a valid state.
46
+ */
47
+ int git_buf_try_grow(git_buf *buf, size_t target_size);
48
+
26
49
  void git_buf_free(git_buf *buf);
50
+ void git_buf_swap(git_buf *buf_a, git_buf *buf_b);
51
+ char *git_buf_detach(git_buf *buf);
52
+ void git_buf_attach(git_buf *buf, char *ptr, size_t asize);
53
+
54
+ /**
55
+ * Test if there have been any reallocation failures with this git_buf.
56
+ *
57
+ * Any function that writes to a git_buf can fail due to memory allocation
58
+ * issues. If one fails, the git_buf will be marked with an OOM error and
59
+ * further calls to modify the buffer will fail. Check git_buf_oom() at the
60
+ * end of your sequence and it will be true if you ran out of memory at any
61
+ * point with that buffer.
62
+ *
63
+ * @return false if no error, true if allocation error
64
+ */
65
+ GIT_INLINE(bool) git_buf_oom(const git_buf *buf)
66
+ {
67
+ return (buf->ptr == git_buf__oom);
68
+ }
69
+
70
+ /*
71
+ * Functions below that return int value error codes will return 0 on
72
+ * success or -1 on failure (which generally means an allocation failed).
73
+ * Using a git_buf where the allocation has failed with result in -1 from
74
+ * all further calls using that buffer. As a result, you can ignore the
75
+ * return code of these functions and call them in a series then just call
76
+ * git_buf_oom at the end.
77
+ */
78
+ int git_buf_set(git_buf *buf, const char *data, size_t len);
79
+ int git_buf_sets(git_buf *buf, const char *string);
80
+ int git_buf_putc(git_buf *buf, char c);
81
+ int git_buf_put(git_buf *buf, const char *data, size_t len);
82
+ int git_buf_puts(git_buf *buf, const char *string);
83
+ int git_buf_printf(git_buf *buf, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);
84
+ int git_buf_vprintf(git_buf *buf, const char *format, va_list ap);
27
85
  void git_buf_clear(git_buf *buf);
28
86
  void git_buf_consume(git_buf *buf, const char *end);
87
+ void git_buf_truncate(git_buf *buf, size_t len);
88
+ void git_buf_rtruncate_at_char(git_buf *path, char separator);
89
+
90
+ int git_buf_join_n(git_buf *buf, char separator, int nbuf, ...);
91
+ int git_buf_join(git_buf *buf, char separator, const char *str_a, const char *str_b);
92
+
93
+ /**
94
+ * Join two strings as paths, inserting a slash between as needed.
95
+ * @return 0 on success, -1 on failure
96
+ */
97
+ GIT_INLINE(int) git_buf_joinpath(git_buf *buf, const char *a, const char *b)
98
+ {
99
+ return git_buf_join(buf, '/', a, b);
100
+ }
101
+
102
+ GIT_INLINE(const char *) git_buf_cstr(const git_buf *buf)
103
+ {
104
+ return buf->ptr;
105
+ }
106
+
107
+ GIT_INLINE(size_t) git_buf_len(const git_buf *buf)
108
+ {
109
+ return buf->size;
110
+ }
111
+
112
+ void git_buf_copy_cstr(char *data, size_t datasize, const git_buf *buf);
29
113
 
30
114
  #define git_buf_PUTS(buf, str) git_buf_put(buf, str, sizeof(str) - 1)
31
115
 
116
+ GIT_INLINE(ssize_t) git_buf_rfind_next(git_buf *buf, char ch)
117
+ {
118
+ ssize_t idx = (ssize_t)buf->size - 1;
119
+ while (idx >= 0 && buf->ptr[idx] == ch) idx--;
120
+ while (idx >= 0 && buf->ptr[idx] != ch) idx--;
121
+ return idx;
122
+ }
123
+
124
+ /* Remove whitespace from the end of the buffer */
125
+ void git_buf_rtrim(git_buf *buf);
126
+
127
+ int git_buf_cmp(const git_buf *a, const git_buf *b);
128
+
129
+ /* Fill buf with the common prefix of a array of strings */
130
+ int git_buf_common_prefix(git_buf *buf, const git_strarray *strings);
131
+
132
+ /* Check if buffer looks like it contains binary data */
133
+ bool git_buf_is_binary(const git_buf *buf);
134
+
32
135
  #endif