rugged 0.16.0 → 0.17.0b1

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 (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
@@ -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.
@@ -14,13 +14,46 @@
14
14
 
15
15
  static const size_t WRITE_BUFFER_SIZE = (4096 * 2);
16
16
 
17
+ enum buferr_t {
18
+ BUFERR_OK = 0,
19
+ BUFERR_WRITE,
20
+ BUFERR_ZLIB,
21
+ BUFERR_MEM
22
+ };
23
+
24
+ #define ENSURE_BUF_OK(buf) if ((buf)->last_error != BUFERR_OK) { return -1; }
25
+
26
+ static int verify_last_error(git_filebuf *file)
27
+ {
28
+ switch (file->last_error) {
29
+ case BUFERR_WRITE:
30
+ giterr_set(GITERR_OS, "Failed to write out file");
31
+ return -1;
32
+
33
+ case BUFERR_MEM:
34
+ giterr_set_oom();
35
+ return -1;
36
+
37
+ case BUFERR_ZLIB:
38
+ giterr_set(GITERR_ZLIB,
39
+ "Buffer error when writing out ZLib data");
40
+ return -1;
41
+
42
+ default:
43
+ return 0;
44
+ }
45
+ }
46
+
17
47
  static int lock_file(git_filebuf *file, int flags)
18
48
  {
19
- if (git_futils_exists(file->path_lock) == 0) {
49
+ if (git_path_exists(file->path_lock) == true) {
20
50
  if (flags & GIT_FILEBUF_FORCE)
21
51
  p_unlink(file->path_lock);
22
- else
23
- return git__throw(GIT_EOSERR, "Failed to lock file");
52
+ else {
53
+ giterr_set(GITERR_OS,
54
+ "Failed to lock file '%s' for writing", file->path_lock);
55
+ return -1;
56
+ }
24
57
  }
25
58
 
26
59
  /* create path to the file buffer is required */
@@ -32,16 +65,22 @@ static int lock_file(git_filebuf *file, int flags)
32
65
  }
33
66
 
34
67
  if (file->fd < 0)
35
- return git__throw(GIT_EOSERR, "Failed to create lock");
68
+ return -1;
69
+
70
+ file->fd_is_open = true;
36
71
 
37
- if ((flags & GIT_FILEBUF_APPEND) && git_futils_exists(file->path_original) == 0) {
72
+ if ((flags & GIT_FILEBUF_APPEND) && git_path_exists(file->path_original) == true) {
38
73
  git_file source;
39
74
  char buffer[2048];
40
75
  size_t read_bytes;
41
76
 
42
77
  source = p_open(file->path_original, O_RDONLY);
43
- if (source < 0)
44
- return git__throw(GIT_EOSERR, "Failed to lock file. Could not open %s", file->path_original);
78
+ if (source < 0) {
79
+ giterr_set(GITERR_OS,
80
+ "Failed to open file '%s' for reading",
81
+ file->path_original);
82
+ return -1;
83
+ }
45
84
 
46
85
  while ((read_bytes = p_read(source, buffer, 2048)) > 0) {
47
86
  p_write(file->fd, buffer, read_bytes);
@@ -52,15 +91,15 @@ static int lock_file(git_filebuf *file, int flags)
52
91
  p_close(source);
53
92
  }
54
93
 
55
- return GIT_SUCCESS;
94
+ return 0;
56
95
  }
57
96
 
58
97
  void git_filebuf_cleanup(git_filebuf *file)
59
98
  {
60
- if (file->fd >= 0)
99
+ if (file->fd_is_open && file->fd >= 0)
61
100
  p_close(file->fd);
62
101
 
63
- if (file->fd >= 0 && file->path_lock && git_futils_exists(file->path_lock) == GIT_SUCCESS)
102
+ if (file->fd_is_open && file->path_lock && git_path_exists(file->path_lock))
64
103
  p_unlink(file->path_lock);
65
104
 
66
105
  if (file->digest)
@@ -91,22 +130,28 @@ GIT_INLINE(int) flush_buffer(git_filebuf *file)
91
130
  return result;
92
131
  }
93
132
 
94
- static int write_normal(git_filebuf *file, void *source, size_t len)
133
+ int git_filebuf_flush(git_filebuf *file)
95
134
  {
96
- int result = 0;
135
+ return flush_buffer(file);
136
+ }
97
137
 
138
+ static int write_normal(git_filebuf *file, void *source, size_t len)
139
+ {
98
140
  if (len > 0) {
99
- result = p_write(file->fd, (void *)source, len);
141
+ if (p_write(file->fd, (void *)source, len) < 0) {
142
+ file->last_error = BUFERR_WRITE;
143
+ return -1;
144
+ }
145
+
100
146
  if (file->digest)
101
147
  git_hash_update(file->digest, source, len);
102
148
  }
103
149
 
104
- return result;
150
+ return 0;
105
151
  }
106
152
 
107
153
  static int write_deflate(git_filebuf *file, void *source, size_t len)
108
154
  {
109
- int result = Z_OK;
110
155
  z_stream *zs = &file->zs;
111
156
 
112
157
  if (len > 0 || file->flush_mode == Z_FINISH) {
@@ -119,14 +164,17 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
119
164
  zs->next_out = file->z_buf;
120
165
  zs->avail_out = (uInt)file->buf_size;
121
166
 
122
- result = deflate(zs, file->flush_mode);
123
- if (result == Z_STREAM_ERROR)
124
- return git__throw(GIT_ERROR, "Failed to deflate input");
167
+ if (deflate(zs, file->flush_mode) == Z_STREAM_ERROR) {
168
+ file->last_error = BUFERR_ZLIB;
169
+ return -1;
170
+ }
125
171
 
126
172
  have = file->buf_size - (size_t)zs->avail_out;
127
173
 
128
- if (p_write(file->fd, file->z_buf, have) < GIT_SUCCESS)
129
- return git__throw(GIT_EOSERR, "Failed to write to file");
174
+ if (p_write(file->fd, file->z_buf, have) < 0) {
175
+ file->last_error = BUFERR_WRITE;
176
+ return -1;
177
+ }
130
178
 
131
179
  } while (zs->avail_out == 0);
132
180
 
@@ -136,38 +184,39 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
136
184
  git_hash_update(file->digest, source, len);
137
185
  }
138
186
 
139
- return GIT_SUCCESS;
187
+ return 0;
140
188
  }
141
189
 
142
190
  int git_filebuf_open(git_filebuf *file, const char *path, int flags)
143
191
  {
144
- int error, compression;
192
+ int compression;
145
193
  size_t path_len;
146
194
 
147
- assert(file && path);
148
-
149
- if (file->buffer)
150
- return git__throw(GIT_EINVALIDARGS, "Tried to reopen an open filebuf");
195
+ /* opening an already open buffer is a programming error;
196
+ * assert that this never happens instead of returning
197
+ * an error code */
198
+ assert(file && path && file->buffer == NULL);
151
199
 
152
200
  memset(file, 0x0, sizeof(git_filebuf));
153
201
 
202
+ if (flags & GIT_FILEBUF_DO_NOT_BUFFER)
203
+ file->do_not_buffer = true;
204
+
154
205
  file->buf_size = WRITE_BUFFER_SIZE;
155
206
  file->buf_pos = 0;
156
207
  file->fd = -1;
208
+ file->last_error = BUFERR_OK;
157
209
 
158
210
  /* Allocate the main cache buffer */
159
- file->buffer = git__malloc(file->buf_size);
160
- if (file->buffer == NULL){
161
- error = GIT_ENOMEM;
162
- goto cleanup;
211
+ if (!file->do_not_buffer) {
212
+ file->buffer = git__malloc(file->buf_size);
213
+ GITERR_CHECK_ALLOC(file->buffer);
163
214
  }
164
215
 
165
216
  /* If we are hashing on-write, allocate a new hash context */
166
217
  if (flags & GIT_FILEBUF_HASH_CONTENTS) {
167
- if ((file->digest = git_hash_new_ctx()) == NULL) {
168
- error = GIT_ENOMEM;
169
- goto cleanup;
170
- }
218
+ file->digest = git_hash_new_ctx();
219
+ GITERR_CHECK_ALLOC(file->digest);
171
220
  }
172
221
 
173
222
  compression = flags >> GIT_FILEBUF_DEFLATE_SHIFT;
@@ -176,16 +225,13 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
176
225
  if (compression != 0) {
177
226
  /* Initialize the ZLib stream */
178
227
  if (deflateInit(&file->zs, compression) != Z_OK) {
179
- error = git__throw(GIT_EZLIB, "Failed to initialize zlib");
228
+ giterr_set(GITERR_ZLIB, "Failed to initialize zlib");
180
229
  goto cleanup;
181
230
  }
182
231
 
183
232
  /* Allocate the Zlib cache buffer */
184
233
  file->z_buf = git__malloc(file->buf_size);
185
- if (file->z_buf == NULL){
186
- error = GIT_ENOMEM;
187
- goto cleanup;
188
- }
234
+ GITERR_CHECK_ALLOC(file->z_buf);
189
235
 
190
236
  /* Never flush */
191
237
  file->flush_mode = Z_NO_FLUSH;
@@ -196,107 +242,105 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
196
242
 
197
243
  /* If we are writing to a temp file */
198
244
  if (flags & GIT_FILEBUF_TEMPORARY) {
199
- char tmp_path[GIT_PATH_MAX];
245
+ git_buf tmp_path = GIT_BUF_INIT;
200
246
 
201
247
  /* Open the file as temporary for locking */
202
- file->fd = git_futils_mktmp(tmp_path, path);
248
+ file->fd = git_futils_mktmp(&tmp_path, path);
249
+
203
250
  if (file->fd < 0) {
204
- error = GIT_EOSERR;
251
+ git_buf_free(&tmp_path);
205
252
  goto cleanup;
206
253
  }
254
+ file->fd_is_open = true;
207
255
 
208
256
  /* No original path */
209
257
  file->path_original = NULL;
210
- file->path_lock = git__strdup(tmp_path);
211
-
212
- if (file->path_lock == NULL) {
213
- error = GIT_ENOMEM;
214
- goto cleanup;
215
- }
258
+ file->path_lock = git_buf_detach(&tmp_path);
259
+ GITERR_CHECK_ALLOC(file->path_lock);
216
260
  } else {
217
261
  path_len = strlen(path);
218
262
 
219
263
  /* Save the original path of the file */
220
264
  file->path_original = git__strdup(path);
221
- if (file->path_original == NULL) {
222
- error = GIT_ENOMEM;
223
- goto cleanup;
224
- }
265
+ GITERR_CHECK_ALLOC(file->path_original);
225
266
 
226
267
  /* create the locking path by appending ".lock" to the original */
227
268
  file->path_lock = git__malloc(path_len + GIT_FILELOCK_EXTLENGTH);
228
- if (file->path_lock == NULL) {
229
- error = GIT_ENOMEM;
230
- goto cleanup;
231
- }
269
+ GITERR_CHECK_ALLOC(file->path_lock);
232
270
 
233
271
  memcpy(file->path_lock, file->path_original, path_len);
234
272
  memcpy(file->path_lock + path_len, GIT_FILELOCK_EXTENSION, GIT_FILELOCK_EXTLENGTH);
235
273
 
236
274
  /* open the file for locking */
237
- if ((error = lock_file(file, flags)) < GIT_SUCCESS)
275
+ if (lock_file(file, flags) < 0)
238
276
  goto cleanup;
239
277
  }
240
278
 
241
- return GIT_SUCCESS;
279
+ return 0;
242
280
 
243
281
  cleanup:
244
282
  git_filebuf_cleanup(file);
245
- return git__rethrow(error, "Failed to open file buffer for '%s'", path);
283
+ return -1;
246
284
  }
247
285
 
248
286
  int git_filebuf_hash(git_oid *oid, git_filebuf *file)
249
287
  {
250
- int error;
251
-
252
288
  assert(oid && file && file->digest);
253
289
 
254
- if ((error = flush_buffer(file)) < GIT_SUCCESS)
255
- return git__rethrow(error, "Failed to get hash for file");
290
+ flush_buffer(file);
291
+
292
+ if (verify_last_error(file) < 0)
293
+ return -1;
256
294
 
257
295
  git_hash_final(oid, file->digest);
258
296
  git_hash_free_ctx(file->digest);
259
297
  file->digest = NULL;
260
298
 
261
- return GIT_SUCCESS;
299
+ return 0;
262
300
  }
263
301
 
264
302
  int git_filebuf_commit_at(git_filebuf *file, const char *path, mode_t mode)
265
303
  {
266
304
  git__free(file->path_original);
267
305
  file->path_original = git__strdup(path);
268
- if (file->path_original == NULL)
269
- return GIT_ENOMEM;
306
+ GITERR_CHECK_ALLOC(file->path_original);
270
307
 
271
308
  return git_filebuf_commit(file, mode);
272
309
  }
273
310
 
274
311
  int git_filebuf_commit(git_filebuf *file, mode_t mode)
275
312
  {
276
- int error;
277
-
278
313
  /* temporary files cannot be committed */
279
314
  assert(file && file->path_original);
280
315
 
281
316
  file->flush_mode = Z_FINISH;
282
- if ((error = flush_buffer(file)) < GIT_SUCCESS)
283
- goto cleanup;
317
+ flush_buffer(file);
318
+
319
+ if (verify_last_error(file) < 0)
320
+ goto on_error;
284
321
 
285
322
  p_close(file->fd);
286
323
  file->fd = -1;
324
+ file->fd_is_open = false;
287
325
 
288
326
  if (p_chmod(file->path_lock, mode)) {
289
- error = git__throw(GIT_EOSERR, "Failed to chmod locked file before committing");
290
- goto cleanup;
327
+ giterr_set(GITERR_OS, "Failed to set attributes for file at '%s'", file->path_lock);
328
+ goto on_error;
291
329
  }
292
330
 
293
- error = p_rename(file->path_lock, file->path_original);
331
+ p_unlink(file->path_original);
294
332
 
295
- cleanup:
333
+ if (p_rename(file->path_lock, file->path_original) < 0) {
334
+ giterr_set(GITERR_OS, "Failed to rename lockfile to '%s'", file->path_original);
335
+ goto on_error;
336
+ }
337
+
338
+ git_filebuf_cleanup(file);
339
+ return 0;
340
+
341
+ on_error:
296
342
  git_filebuf_cleanup(file);
297
- if (error < GIT_SUCCESS)
298
- return git__rethrow(error, "Failed to commit locked file from buffer");
299
- return GIT_SUCCESS;
343
+ return -1;
300
344
  }
301
345
 
302
346
  GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len)
@@ -307,22 +351,25 @@ GIT_INLINE(void) add_to_cache(git_filebuf *file, const void *buf, size_t len)
307
351
 
308
352
  int git_filebuf_write(git_filebuf *file, const void *buff, size_t len)
309
353
  {
310
- int error;
311
354
  const unsigned char *buf = buff;
312
355
 
356
+ ENSURE_BUF_OK(file);
357
+
358
+ if (file->do_not_buffer)
359
+ return file->write(file, (void *)buff, len);
360
+
313
361
  for (;;) {
314
362
  size_t space_left = file->buf_size - file->buf_pos;
315
363
 
316
364
  /* cache if it's small */
317
365
  if (space_left > len) {
318
366
  add_to_cache(file, buf, len);
319
- return GIT_SUCCESS;
367
+ return 0;
320
368
  }
321
369
 
322
370
  add_to_cache(file, buf, space_left);
323
-
324
- if ((error = flush_buffer(file)) < GIT_SUCCESS)
325
- return git__rethrow(error, "Failed to write to buffer");
371
+ if (flush_buffer(file) < 0)
372
+ return -1;
326
373
 
327
374
  len -= space_left;
328
375
  buf += space_left;
@@ -331,32 +378,37 @@ int git_filebuf_write(git_filebuf *file, const void *buff, size_t len)
331
378
 
332
379
  int git_filebuf_reserve(git_filebuf *file, void **buffer, size_t len)
333
380
  {
334
- int error;
335
381
  size_t space_left = file->buf_size - file->buf_pos;
336
382
 
337
383
  *buffer = NULL;
338
384
 
339
- if (len > file->buf_size)
340
- return GIT_ENOMEM;
385
+ ENSURE_BUF_OK(file);
386
+
387
+ if (len > file->buf_size) {
388
+ file->last_error = BUFERR_MEM;
389
+ return -1;
390
+ }
341
391
 
342
392
  if (space_left <= len) {
343
- if ((error = flush_buffer(file)) < GIT_SUCCESS)
344
- return git__rethrow(error, "Failed to reserve buffer");
393
+ if (flush_buffer(file) < 0)
394
+ return -1;
345
395
  }
346
396
 
347
397
  *buffer = (file->buffer + file->buf_pos);
348
398
  file->buf_pos += len;
349
399
 
350
- return GIT_SUCCESS;
400
+ return 0;
351
401
  }
352
402
 
353
403
  int git_filebuf_printf(git_filebuf *file, const char *format, ...)
354
404
  {
355
405
  va_list arglist;
356
406
  size_t space_left;
357
- int len, error;
407
+ int len, res;
358
408
  char *tmp_buffer;
359
409
 
410
+ ENSURE_BUF_OK(file);
411
+
360
412
  space_left = file->buf_size - file->buf_pos;
361
413
 
362
414
  do {
@@ -364,24 +416,28 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
364
416
  len = p_vsnprintf((char *)file->buffer + file->buf_pos, space_left, format, arglist);
365
417
  va_end(arglist);
366
418
 
367
- if (len < 0)
368
- return git__throw(GIT_EOSERR, "Failed to format string");
419
+ if (len < 0) {
420
+ file->last_error = BUFERR_MEM;
421
+ return -1;
422
+ }
369
423
 
370
424
  if ((size_t)len + 1 <= space_left) {
371
425
  file->buf_pos += len;
372
- return GIT_SUCCESS;
426
+ return 0;
373
427
  }
374
428
 
375
- if ((error = flush_buffer(file)) < GIT_SUCCESS)
376
- return git__rethrow(error, "Failed to output to buffer");
429
+ if (flush_buffer(file) < 0)
430
+ return -1;
377
431
 
378
432
  space_left = file->buf_size - file->buf_pos;
379
433
 
380
434
  } while ((size_t)len + 1 <= space_left);
381
435
 
382
436
  tmp_buffer = git__malloc(len + 1);
383
- if (!tmp_buffer)
384
- return GIT_ENOMEM;
437
+ if (!tmp_buffer) {
438
+ file->last_error = BUFERR_MEM;
439
+ return -1;
440
+ }
385
441
 
386
442
  va_start(arglist, format);
387
443
  len = p_vsnprintf(tmp_buffer, len + 1, format, arglist);
@@ -389,12 +445,13 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
389
445
 
390
446
  if (len < 0) {
391
447
  git__free(tmp_buffer);
392
- return git__throw(GIT_EOSERR, "Failed to format string");
448
+ file->last_error = BUFERR_MEM;
449
+ return -1;
393
450
  }
394
451
 
395
- error = git_filebuf_write(file, tmp_buffer, len);
452
+ res = git_filebuf_write(file, tmp_buffer, len);
396
453
  git__free(tmp_buffer);
397
454
 
398
- return error;
455
+ return res;
399
456
  }
400
457
 
@@ -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.
@@ -9,7 +9,7 @@
9
9
 
10
10
  #include "fileops.h"
11
11
  #include "hash.h"
12
- #include "git2/zlib.h"
12
+ #include <zlib.h>
13
13
 
14
14
  #ifdef GIT_THREADS
15
15
  # define GIT_FILEBUF_THREADS
@@ -19,7 +19,8 @@
19
19
  #define GIT_FILEBUF_APPEND (1 << 2)
20
20
  #define GIT_FILEBUF_FORCE (1 << 3)
21
21
  #define GIT_FILEBUF_TEMPORARY (1 << 4)
22
- #define GIT_FILEBUF_DEFLATE_SHIFT (5)
22
+ #define GIT_FILEBUF_DO_NOT_BUFFER (1 << 5)
23
+ #define GIT_FILEBUF_DEFLATE_SHIFT (6)
23
24
 
24
25
  #define GIT_FILELOCK_EXTENSION ".lock\0"
25
26
  #define GIT_FILELOCK_EXTLENGTH 6
@@ -40,25 +41,37 @@ struct git_filebuf {
40
41
 
41
42
  size_t buf_size, buf_pos;
42
43
  git_file fd;
44
+ bool fd_is_open;
45
+ bool do_not_buffer;
46
+ int last_error;
43
47
  };
44
48
 
45
49
  typedef struct git_filebuf git_filebuf;
46
50
 
47
51
  #define GIT_FILEBUF_INIT {0}
48
52
 
49
- /* The git_filebuf object lifecycle is:
53
+ /*
54
+ * The git_filebuf object lifecycle is:
50
55
  * - Allocate git_filebuf, preferably using GIT_FILEBUF_INIT.
56
+ *
51
57
  * - Call git_filebuf_open() to initialize the filebuf for use.
58
+ *
52
59
  * - Make as many calls to git_filebuf_write(), git_filebuf_printf(),
53
- * git_filebuf_reserve() as you like.
60
+ * git_filebuf_reserve() as you like. The error codes for these
61
+ * functions don't need to be checked. They are stored internally
62
+ * by the file buffer.
63
+ *
54
64
  * - While you are writing, you may call git_filebuf_hash() to get
55
- * the hash of all you have written so far.
65
+ * the hash of all you have written so far. This function will
66
+ * fail if any of the previous writes to the buffer failed.
67
+ *
56
68
  * - To close the git_filebuf, you may call git_filebuf_commit() or
57
69
  * git_filebuf_commit_at() to save the file, or
58
70
  * git_filebuf_cleanup() to abandon the file. All of these will
59
- * clear the git_filebuf object.
71
+ * free the git_filebuf object. Likewise, all of these will fail
72
+ * if any of the previous writes to the buffer failed, and set
73
+ * an error code accordingly.
60
74
  */
61
-
62
75
  int git_filebuf_write(git_filebuf *lock, const void *buff, size_t len);
63
76
  int git_filebuf_reserve(git_filebuf *file, void **buff, size_t len);
64
77
  int git_filebuf_printf(git_filebuf *file, const char *format, ...) GIT_FORMAT_PRINTF(2, 3);
@@ -68,5 +81,6 @@ int git_filebuf_commit(git_filebuf *lock, mode_t mode);
68
81
  int git_filebuf_commit_at(git_filebuf *lock, const char *path, mode_t mode);
69
82
  void git_filebuf_cleanup(git_filebuf *lock);
70
83
  int git_filebuf_hash(git_oid *oid, git_filebuf *file);
84
+ int git_filebuf_flush(git_filebuf *file);
71
85
 
72
86
  #endif