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
@@ -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.
@@ -32,7 +32,6 @@ typedef struct {
32
32
  git_protocol proto;
33
33
  git_vector refs;
34
34
  git_vector common;
35
- int socket;
36
35
  git_buf buf;
37
36
  git_remote_head **heads;
38
37
  int error;
@@ -43,6 +42,7 @@ typedef struct {
43
42
  enum last_cb last_cb;
44
43
  http_parser parser;
45
44
  char *content_type;
45
+ char *path;
46
46
  char *host;
47
47
  char *port;
48
48
  char *service;
@@ -52,12 +52,9 @@ typedef struct {
52
52
  #endif
53
53
  } transport_http;
54
54
 
55
- static int gen_request(git_buf *buf, const char *url, const char *host, const char *op,
55
+ static int gen_request(git_buf *buf, const char *path, const char *host, const char *op,
56
56
  const char *service, ssize_t content_length, int ls)
57
57
  {
58
- const char *path = url;
59
-
60
- path = strchr(path, '/');
61
58
  if (path == NULL) /* Is 'git fetch http://host.com/' valid? */
62
59
  path = "/";
63
60
 
@@ -71,33 +68,29 @@ static int gen_request(git_buf *buf, const char *url, const char *host, const ch
71
68
  if (content_length > 0) {
72
69
  git_buf_printf(buf, "Accept: application/x-git-%s-result\r\n", service);
73
70
  git_buf_printf(buf, "Content-Type: application/x-git-%s-request\r\n", service);
74
- git_buf_printf(buf, "Content-Length: %zd\r\n", content_length);
71
+ git_buf_printf(buf, "Content-Length: %"PRIuZ "\r\n", content_length);
75
72
  } else {
76
73
  git_buf_puts(buf, "Accept: */*\r\n");
77
74
  }
78
75
  git_buf_puts(buf, "\r\n");
79
76
 
80
77
  if (git_buf_oom(buf))
81
- return GIT_ENOMEM;
78
+ return -1;
82
79
 
83
- return GIT_SUCCESS;
80
+ return 0;
84
81
  }
85
82
 
86
83
  static int do_connect(transport_http *t, const char *host, const char *port)
87
84
  {
88
- GIT_SOCKET s = -1;
89
-
90
85
  if (t->parent.connected && http_should_keep_alive(&t->parser))
91
- return GIT_SUCCESS;
86
+ return 0;
87
+
88
+ if (gitno_connect((git_transport *) t, host, port) < 0)
89
+ return -1;
92
90
 
93
- s = gitno_connect(host, port);
94
- if (s < GIT_SUCCESS) {
95
- return git__rethrow(s, "Failed to connect to host");
96
- }
97
- t->socket = s;
98
91
  t->parent.connected = 1;
99
92
 
100
- return GIT_SUCCESS;
93
+ return 0;
101
94
  }
102
95
 
103
96
  /*
@@ -119,8 +112,7 @@ static int on_header_field(http_parser *parser, const char *str, size_t len)
119
112
  t->ct_finished = 1;
120
113
  t->ct_found = 0;
121
114
  t->content_type = git__strdup(git_buf_cstr(buf));
122
- if (t->content_type == NULL)
123
- return t->error = GIT_ENOMEM;
115
+ GITERR_CHECK_ALLOC(t->content_type);
124
116
  git_buf_clear(buf);
125
117
  }
126
118
 
@@ -167,19 +159,25 @@ static int on_headers_complete(http_parser *parser)
167
159
  transport_http *t = (transport_http *) parser->data;
168
160
  git_buf *buf = &t->buf;
169
161
 
162
+ /* The content-type is text/plain for 404, so don't validate */
163
+ if (parser->status_code == 404) {
164
+ git_buf_clear(buf);
165
+ return 0;
166
+ }
167
+
170
168
  if (t->content_type == NULL) {
171
169
  t->content_type = git__strdup(git_buf_cstr(buf));
172
170
  if (t->content_type == NULL)
173
- return t->error = GIT_ENOMEM;
171
+ return t->error = -1;
174
172
  }
175
173
 
176
174
  git_buf_clear(buf);
177
175
  git_buf_printf(buf, "application/x-git-%s-advertisement", t->service);
178
176
  if (git_buf_oom(buf))
179
- return GIT_ENOMEM;
177
+ return t->error = -1;
180
178
 
181
179
  if (strcmp(t->content_type, git_buf_cstr(buf)))
182
- return t->error = git__throw(GIT_EOBJCORRUPTED, "Content-Type '%s' is wrong", t->content_type);
180
+ return t->error = -1;
183
181
 
184
182
  git_buf_clear(buf);
185
183
  return 0;
@@ -189,6 +187,10 @@ static int on_body_store_refs(http_parser *parser, const char *str, size_t len)
189
187
  {
190
188
  transport_http *t = (transport_http *) parser->data;
191
189
 
190
+ if (parser->status_code == 404) {
191
+ return git_buf_put(&t->buf, str, len);
192
+ }
193
+
192
194
  return git_protocol_store_refs(&t->proto, str, len);
193
195
  }
194
196
 
@@ -197,16 +199,22 @@ static int on_message_complete(http_parser *parser)
197
199
  transport_http *t = (transport_http *) parser->data;
198
200
 
199
201
  t->transfer_finished = 1;
202
+
203
+ if (parser->status_code == 404) {
204
+ giterr_set(GITERR_NET, "Remote error: %s", git_buf_cstr(&t->buf));
205
+ t->error = -1;
206
+ }
207
+
200
208
  return 0;
201
209
  }
202
210
 
203
211
  static int store_refs(transport_http *t)
204
212
  {
205
- int error = GIT_SUCCESS;
206
213
  http_parser_settings settings;
207
214
  char buffer[1024];
208
215
  gitno_buffer buf;
209
216
  git_pkt *pkt;
217
+ int ret;
210
218
 
211
219
  http_parser_init(&t->parser, HTTP_RESPONSE);
212
220
  t->parser.data = t;
@@ -217,88 +225,92 @@ static int store_refs(transport_http *t)
217
225
  settings.on_body = on_body_store_refs;
218
226
  settings.on_message_complete = on_message_complete;
219
227
 
220
- gitno_buffer_setup(&buf, buffer, sizeof(buffer), t->socket);
228
+ gitno_buffer_setup((git_transport *)t, &buf, buffer, sizeof(buffer));
221
229
 
222
230
  while(1) {
223
231
  size_t parsed;
224
232
 
225
- error = gitno_recv(&buf);
226
- if (error < GIT_SUCCESS)
227
- return git__rethrow(error, "Error receiving data from network");
233
+ if ((ret = gitno_recv(&buf)) < 0)
234
+ return -1;
228
235
 
229
236
  parsed = http_parser_execute(&t->parser, &settings, buf.data, buf.offset);
230
237
  /* Both should happen at the same time */
231
- if (parsed != buf.offset || t->error < GIT_SUCCESS)
232
- return git__rethrow(t->error, "Error parsing HTTP data");
238
+ if (parsed != buf.offset || t->error < 0)
239
+ return t->error;
233
240
 
234
241
  gitno_consume_n(&buf, parsed);
235
242
 
236
- if (error == 0 || t->transfer_finished)
237
- return GIT_SUCCESS;
243
+ if (ret == 0 || t->transfer_finished)
244
+ return 0;
238
245
  }
239
246
 
240
247
  pkt = git_vector_get(&t->refs, 0);
241
- if (pkt == NULL || pkt->type != GIT_PKT_COMMENT)
242
- return t->error = git__throw(GIT_EOBJCORRUPTED, "Not a valid smart HTTP response");
243
- else
248
+ if (pkt == NULL || pkt->type != GIT_PKT_COMMENT) {
249
+ giterr_set(GITERR_NET, "Invalid HTTP response");
250
+ return t->error = -1;
251
+ } else {
244
252
  git_vector_remove(&t->refs, 0);
253
+ }
245
254
 
246
- return error;
255
+ return 0;
247
256
  }
248
257
 
249
258
  static int http_connect(git_transport *transport, int direction)
250
259
  {
251
260
  transport_http *t = (transport_http *) transport;
252
- int error;
261
+ int ret;
253
262
  git_buf request = GIT_BUF_INIT;
254
263
  const char *service = "upload-pack";
255
- const char *url = t->parent.url, *prefix = "http://";
264
+ const char *url = t->parent.url, *prefix_http = "http://", *prefix_https = "https://";
265
+ const char *default_port;
256
266
 
257
- if (direction == GIT_DIR_PUSH)
258
- return git__throw(GIT_EINVALIDARGS, "Pushing over HTTP is not supported");
267
+ if (direction == GIT_DIR_PUSH) {
268
+ giterr_set(GITERR_NET, "Pushing over HTTP is not implemented");
269
+ return -1;
270
+ }
259
271
 
260
272
  t->parent.direction = direction;
261
- error = git_vector_init(&t->refs, 16, NULL);
262
- if (error < GIT_SUCCESS)
263
- return git__rethrow(error, "Failed to init refs vector");
273
+ if (git_vector_init(&t->refs, 16, NULL) < 0)
274
+ return -1;
264
275
 
265
- if (!git__prefixcmp(url, prefix))
266
- url += strlen(prefix);
276
+ if (!git__prefixcmp(url, prefix_http)) {
277
+ url = t->parent.url + strlen(prefix_http);
278
+ default_port = "80";
279
+ }
267
280
 
268
- error = gitno_extract_host_and_port(&t->host, &t->port, url, "80");
269
- if (error < GIT_SUCCESS)
281
+ if (!git__prefixcmp(url, prefix_https)) {
282
+ url += strlen(prefix_https);
283
+ default_port = "443";
284
+ }
285
+
286
+ t->path = strchr(url, '/');
287
+
288
+ if ((ret = gitno_extract_host_and_port(&t->host, &t->port, url, default_port)) < 0)
270
289
  goto cleanup;
271
290
 
272
291
  t->service = git__strdup(service);
273
- if (t->service == NULL) {
274
- error = GIT_ENOMEM;
275
- goto cleanup;
276
- }
292
+ GITERR_CHECK_ALLOC(t->service);
277
293
 
278
- error = do_connect(t, t->host, t->port);
279
- if (error < GIT_SUCCESS) {
280
- error = git__rethrow(error, "Failed to connect to host");
294
+ if ((ret = do_connect(t, t->host, t->port)) < 0)
281
295
  goto cleanup;
282
- }
283
296
 
284
297
  /* Generate and send the HTTP request */
285
- error = gen_request(&request, url, t->host, "GET", service, 0, 1);
286
- if (error < GIT_SUCCESS) {
287
- error = git__throw(error, "Failed to generate request");
298
+ if ((ret = gen_request(&request, t->path, t->host, "GET", service, 0, 1)) < 0) {
299
+ giterr_set(GITERR_NET, "Failed to generate request");
288
300
  goto cleanup;
289
301
  }
290
302
 
291
- error = gitno_send(t->socket, request.ptr, request.size, 0);
292
- if (error < GIT_SUCCESS)
293
- error = git__rethrow(error, "Failed to send the HTTP request");
294
303
 
295
- error = store_refs(t);
304
+ if (gitno_send(transport, request.ptr, request.size, 0) < 0)
305
+ goto cleanup;
306
+
307
+ ret = store_refs(t);
296
308
 
297
309
  cleanup:
298
310
  git_buf_free(&request);
299
311
  git_buf_clear(&t->buf);
300
312
 
301
- return error;
313
+ return ret;
302
314
  }
303
315
 
304
316
  static int http_ls(git_transport *transport, git_headlist_cb list_cb, void *opaque)
@@ -312,12 +324,13 @@ static int http_ls(git_transport *transport, git_headlist_cb list_cb, void *opaq
312
324
  if (p->type != GIT_PKT_REF)
313
325
  continue;
314
326
 
315
- if (list_cb(&p->head, opaque) < 0)
316
- return git__throw(GIT_ERROR,
317
- "The user callback returned an error code");
327
+ if (list_cb(&p->head, opaque) < 0) {
328
+ giterr_set(GITERR_NET, "The user callback returned error");
329
+ return -1;
330
+ }
318
331
  }
319
332
 
320
- return GIT_SUCCESS;
333
+ return 0;
321
334
  }
322
335
 
323
336
  static int on_body_parse_response(http_parser *parser, const char *str, size_t len)
@@ -329,10 +342,12 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
329
342
  const char *line_end, *ptr;
330
343
 
331
344
  if (len == 0) { /* EOF */
332
- if (buf->size != 0)
333
- return t->error = git__throw(GIT_ERROR, "EOF and unprocessed data");
334
- else
345
+ if (git_buf_len(buf) != 0) {
346
+ giterr_set(GITERR_NET, "Unexpected EOF");
347
+ return t->error = -1;
348
+ } else {
335
349
  return 0;
350
+ }
336
351
  }
337
352
 
338
353
  git_buf_put(buf, str, len);
@@ -340,15 +355,15 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
340
355
  while (1) {
341
356
  git_pkt *pkt;
342
357
 
343
- if (buf->size == 0)
358
+ if (git_buf_len(buf) == 0)
344
359
  return 0;
345
360
 
346
- error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->size);
347
- if (error == GIT_ESHORTBUFFER) {
361
+ error = git_pkt_parse_line(&pkt, ptr, &line_end, git_buf_len(buf));
362
+ if (error == GIT_EBUFS) {
348
363
  return 0; /* Ask for more */
349
364
  }
350
- if (error < GIT_SUCCESS)
351
- return t->error = git__rethrow(error, "Failed to parse pkt-line");
365
+ if (error < 0)
366
+ return t->error = -1;
352
367
 
353
368
  git_buf_consume(buf, line_end);
354
369
 
@@ -368,9 +383,8 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
368
383
  continue;
369
384
  }
370
385
 
371
- error = git_vector_insert(common, pkt);
372
- if (error < GIT_SUCCESS)
373
- return t->error = git__rethrow(error, "Failed to add pkt to list");
386
+ if (git_vector_insert(common, pkt) < 0)
387
+ return -1;
374
388
  }
375
389
 
376
390
  return error;
@@ -379,7 +393,7 @@ static int on_body_parse_response(http_parser *parser, const char *str, size_t l
379
393
 
380
394
  static int parse_response(transport_http *t)
381
395
  {
382
- int error = GIT_SUCCESS;
396
+ int ret = 0;
383
397
  http_parser_settings settings;
384
398
  char buffer[1024];
385
399
  gitno_buffer buf;
@@ -394,79 +408,33 @@ static int parse_response(transport_http *t)
394
408
  settings.on_body = on_body_parse_response;
395
409
  settings.on_message_complete = on_message_complete;
396
410
 
397
- gitno_buffer_setup(&buf, buffer, sizeof(buffer), t->socket);
411
+ gitno_buffer_setup((git_transport *)t, &buf, buffer, sizeof(buffer));
398
412
 
399
413
  while(1) {
400
414
  size_t parsed;
401
415
 
402
- error = gitno_recv(&buf);
403
- if (error < GIT_SUCCESS)
404
- return git__rethrow(error, "Error receiving data from network");
416
+ if ((ret = gitno_recv(&buf)) < 0)
417
+ return -1;
405
418
 
406
419
  parsed = http_parser_execute(&t->parser, &settings, buf.data, buf.offset);
407
420
  /* Both should happen at the same time */
408
- if (parsed != buf.offset || t->error < GIT_SUCCESS)
409
- return git__rethrow(t->error, "Error parsing HTTP data");
421
+ if (parsed != buf.offset || t->error < 0)
422
+ return t->error;
410
423
 
411
424
  gitno_consume_n(&buf, parsed);
412
425
 
413
- if (error == 0 || t->transfer_finished || t->pack_ready) {
414
- return GIT_SUCCESS;
415
- }
416
- }
417
-
418
- return error;
419
- }
420
-
421
- static int setup_walk(git_revwalk **out, git_repository *repo)
422
- {
423
- git_revwalk *walk;
424
- git_strarray refs;
425
- unsigned int i;
426
- git_reference *ref;
427
- int error;
428
-
429
- error = git_reference_listall(&refs, repo, GIT_REF_LISTALL);
430
- if (error < GIT_SUCCESS)
431
- return git__rethrow(error, "Failed to list references");
432
-
433
- error = git_revwalk_new(&walk, repo);
434
- if (error < GIT_SUCCESS)
435
- return git__rethrow(error, "Failed to setup walk");
436
-
437
- git_revwalk_sorting(walk, GIT_SORT_TIME);
438
-
439
- for (i = 0; i < refs.count; ++i) {
440
- /* No tags */
441
- if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR))
442
- continue;
443
-
444
- error = git_reference_lookup(&ref, repo, refs.strings[i]);
445
- if (error < GIT_ERROR) {
446
- error = git__rethrow(error, "Failed to lookup %s", refs.strings[i]);
447
- goto cleanup;
448
- }
449
-
450
- if (git_reference_type(ref) == GIT_REF_SYMBOLIC)
451
- continue;
452
- error = git_revwalk_push(walk, git_reference_oid(ref));
453
- if (error < GIT_ERROR) {
454
- error = git__rethrow(error, "Failed to push %s", refs.strings[i]);
455
- goto cleanup;
426
+ if (ret == 0 || t->transfer_finished || t->pack_ready) {
427
+ return 0;
456
428
  }
457
429
  }
458
430
 
459
- *out = walk;
460
- cleanup:
461
- git_strarray_free(&refs);
462
-
463
- return error;
431
+ return ret;
464
432
  }
465
433
 
466
434
  static int http_negotiate_fetch(git_transport *transport, git_repository *repo, const git_vector *wants)
467
435
  {
468
436
  transport_http *t = (transport_http *) transport;
469
- int error;
437
+ int ret;
470
438
  unsigned int i;
471
439
  char buff[128];
472
440
  gitno_buffer buf;
@@ -474,90 +442,59 @@ static int http_negotiate_fetch(git_transport *transport, git_repository *repo,
474
442
  git_oid oid;
475
443
  git_pkt_ack *pkt;
476
444
  git_vector *common = &t->common;
477
- const char *prefix = "http://", *url = t->parent.url;
478
445
  git_buf request = GIT_BUF_INIT, data = GIT_BUF_INIT;
479
- gitno_buffer_setup(&buf, buff, sizeof(buff), t->socket);
480
446
 
481
- /* TODO: Store url in the transport */
482
- if (!git__prefixcmp(url, prefix))
483
- url += strlen(prefix);
447
+ gitno_buffer_setup(transport, &buf, buff, sizeof(buff));
484
448
 
485
- error = git_vector_init(common, 16, NULL);
486
- if (error < GIT_SUCCESS)
487
- return git__rethrow(error, "Failed to init common vector");
449
+ if (git_vector_init(common, 16, NULL) < 0)
450
+ return -1;
488
451
 
489
- error = setup_walk(&walk, repo);
490
- if (error < GIT_SUCCESS) {
491
- error = git__rethrow(error, "Failed to setup walk");
492
- goto cleanup;
493
- }
452
+ if (git_fetch_setup_walk(&walk, repo) < 0)
453
+ return -1;
494
454
 
495
455
  do {
496
- error = do_connect(t, t->host, t->port);
497
- if (error < GIT_SUCCESS) {
498
- error = git__rethrow(error, "Failed to connect to host");
456
+ if ((ret = do_connect(t, t->host, t->port)) < 0)
499
457
  goto cleanup;
500
- }
501
458
 
502
- error = git_pkt_buffer_wants(wants, &t->caps, &data);
503
- if (error < GIT_SUCCESS) {
504
- error = git__rethrow(error, "Failed to send wants");
459
+ if ((ret = git_pkt_buffer_wants(wants, &t->caps, &data)) < 0)
505
460
  goto cleanup;
506
- }
507
461
 
508
462
  /* We need to send these on each connection */
509
463
  git_vector_foreach (common, i, pkt) {
510
- error = git_pkt_buffer_have(&pkt->oid, &data);
511
- if (error < GIT_SUCCESS) {
512
- error = git__rethrow(error, "Failed to buffer common have");
464
+ if ((ret = git_pkt_buffer_have(&pkt->oid, &data)) < 0)
513
465
  goto cleanup;
514
- }
515
466
  }
516
467
 
517
468
  i = 0;
518
- while ((i < 20) && ((error = git_revwalk_next(&oid, walk)) == GIT_SUCCESS)) {
519
- error = git_pkt_buffer_have(&oid, &data);
520
- if (error < GIT_SUCCESS) {
521
- error = git__rethrow(error, "Failed to buffer have");
469
+ while ((i < 20) && ((ret = git_revwalk_next(&oid, walk)) == 0)) {
470
+ if ((ret = git_pkt_buffer_have(&oid, &data)) < 0)
522
471
  goto cleanup;
523
- }
472
+
524
473
  i++;
525
474
  }
526
475
 
527
476
  git_pkt_buffer_done(&data);
528
477
 
529
- error = gen_request(&request, url, t->host, "POST", "upload-pack", data.size, 0);
530
- if (error < GIT_SUCCESS) {
531
- error = git__rethrow(error, "Failed to generate request");
478
+ if ((ret = gen_request(&request, t->path, t->host, "POST", "upload-pack", data.size, 0)) < 0)
532
479
  goto cleanup;
533
- }
534
480
 
535
- error = gitno_send(t->socket, request.ptr, request.size, 0);
536
- if (error < GIT_SUCCESS) {
537
- error = git__rethrow(error, "Failed to send request");
481
+ if ((ret = gitno_send(transport, request.ptr, request.size, 0)) < 0)
538
482
  goto cleanup;
539
- }
540
483
 
541
- error = gitno_send(t->socket, data.ptr, data.size, 0);
542
- if (error < GIT_SUCCESS) {
543
- error = git__rethrow(error, "Failed to send data");
484
+ if ((ret = gitno_send(transport, data.ptr, data.size, 0)) < 0)
544
485
  goto cleanup;
545
- }
546
486
 
547
487
  git_buf_clear(&request);
548
488
  git_buf_clear(&data);
549
489
 
550
- if (error < GIT_SUCCESS || i >= 256)
490
+ if (ret < 0 || i >= 256)
551
491
  break;
552
492
 
553
- error = parse_response(t);
554
- if (error < GIT_SUCCESS) {
555
- error = git__rethrow(error, "Error parsing the response");
493
+ if ((ret = parse_response(t)) < 0)
556
494
  goto cleanup;
557
- }
558
495
 
559
496
  if (t->pack_ready) {
560
- error = GIT_SUCCESS;
497
+ ret = 0;
561
498
  goto cleanup;
562
499
  }
563
500
 
@@ -567,11 +504,12 @@ cleanup:
567
504
  git_buf_free(&request);
568
505
  git_buf_free(&data);
569
506
  git_revwalk_free(walk);
570
- return error;
507
+ return ret;
571
508
  }
572
509
 
573
510
  typedef struct {
574
- git_filebuf *file;
511
+ git_indexer_stream *idx;
512
+ git_indexer_stats *stats;
575
513
  transport_http *transport;
576
514
  } download_pack_cbdata;
577
515
 
@@ -587,10 +525,10 @@ static int on_body_download_pack(http_parser *parser, const char *str, size_t le
587
525
  {
588
526
  download_pack_cbdata *data = (download_pack_cbdata *) parser->data;
589
527
  transport_http *t = data->transport;
590
- git_filebuf *file = data->file;
528
+ git_indexer_stream *idx = data->idx;
529
+ git_indexer_stats *stats = data->stats;
591
530
 
592
-
593
- return t->error = git_filebuf_write(file, str, len);
531
+ return t->error = git_indexer_stream_add(idx, str, len, stats);
594
532
  }
595
533
 
596
534
  /*
@@ -599,92 +537,85 @@ static int on_body_download_pack(http_parser *parser, const char *str, size_t le
599
537
  * the simple downloader. Furthermore, we're using keep-alive
600
538
  * connections, so the simple downloader would just hang.
601
539
  */
602
- static int http_download_pack(char **out, git_transport *transport, git_repository *repo)
540
+ static int http_download_pack(git_transport *transport, git_repository *repo, git_off_t *bytes, git_indexer_stats *stats)
603
541
  {
604
542
  transport_http *t = (transport_http *) transport;
605
543
  git_buf *oldbuf = &t->buf;
606
- int error = GIT_SUCCESS;
544
+ int recvd;
607
545
  http_parser_settings settings;
608
546
  char buffer[1024];
609
547
  gitno_buffer buf;
548
+ git_indexer_stream *idx = NULL;
610
549
  download_pack_cbdata data;
611
- git_filebuf file;
612
- char path[GIT_PATH_MAX], suff[] = "/objects/pack/pack-received\0";
550
+
551
+ gitno_buffer_setup(transport, &buf, buffer, sizeof(buffer));
552
+
553
+ if (memcmp(oldbuf->ptr, "PACK", strlen("PACK"))) {
554
+ giterr_set(GITERR_NET, "The pack doesn't start with a pack signature");
555
+ return -1;
556
+ }
557
+
558
+ if (git_indexer_stream_new(&idx, git_repository_path(repo)) < 0)
559
+ return -1;
613
560
 
614
561
  /*
615
562
  * This is part of the previous response, so we don't want to
616
563
  * re-init the parser, just set these two callbacks.
617
564
  */
618
- data.file = &file;
565
+ memset(stats, 0, sizeof(git_indexer_stats));
566
+ data.stats = stats;
567
+ data.idx = idx;
619
568
  data.transport = t;
620
569
  t->parser.data = &data;
621
570
  t->transfer_finished = 0;
622
571
  memset(&settings, 0x0, sizeof(settings));
623
572
  settings.on_message_complete = on_message_complete_download_pack;
624
573
  settings.on_body = on_body_download_pack;
574
+ *bytes = git_buf_len(oldbuf);
625
575
 
626
- gitno_buffer_setup(&buf, buffer, sizeof(buffer), t->socket);
627
-
628
- git_path_join(path, repo->path_repository, suff);
576
+ if (git_indexer_stream_add(idx, git_buf_cstr(oldbuf), git_buf_len(oldbuf), stats) < 0)
577
+ goto on_error;
629
578
 
630
- if (memcmp(oldbuf->ptr, "PACK", strlen("PACK"))) {
631
- return git__throw(GIT_ERROR, "The pack doesn't start with the signature");
632
- }
633
-
634
- error = git_filebuf_open(&file, path, GIT_FILEBUF_TEMPORARY);
635
- if (error < GIT_SUCCESS)
636
- goto cleanup;
579
+ gitno_buffer_setup(transport, &buf, buffer, sizeof(buffer));
637
580
 
638
- /* Part of the packfile has been received, don't loose it */
639
- error = git_filebuf_write(&file, oldbuf->ptr, oldbuf->size);
640
- if (error < GIT_SUCCESS)
641
- goto cleanup;
642
-
643
- while(1) {
581
+ do {
644
582
  size_t parsed;
645
583
 
646
- error = gitno_recv(&buf);
647
- if (error < GIT_SUCCESS)
648
- return git__rethrow(error, "Error receiving data from network");
584
+ if ((recvd = gitno_recv(&buf)) < 0)
585
+ goto on_error;
649
586
 
650
587
  parsed = http_parser_execute(&t->parser, &settings, buf.data, buf.offset);
651
- /* Both should happen at the same time */
652
- if (parsed != buf.offset || t->error < GIT_SUCCESS)
653
- return git__rethrow(t->error, "Error parsing HTTP data");
588
+ if (parsed != buf.offset || t->error < 0)
589
+ goto on_error;
654
590
 
591
+ *bytes += recvd;
655
592
  gitno_consume_n(&buf, parsed);
593
+ } while (recvd > 0 && !t->transfer_finished);
656
594
 
657
- if (error == 0 || t->transfer_finished) {
658
- break;
659
- }
660
- }
661
-
662
- *out = git__strdup(file.path_lock);
663
- if (*out == NULL) {
664
- error = GIT_ENOMEM;
665
- goto cleanup;
666
- }
667
-
668
- /* A bit dodgy, but we need to keep the pack at the temporary path */
669
- error = git_filebuf_commit_at(&file, file.path_lock, GIT_PACK_FILE_MODE);
595
+ if (git_indexer_stream_finalize(idx, stats) < 0)
596
+ goto on_error;
670
597
 
671
- cleanup:
672
- if (error < GIT_SUCCESS)
673
- git_filebuf_cleanup(&file);
598
+ git_indexer_stream_free(idx);
599
+ return 0;
674
600
 
675
- return error;
601
+ on_error:
602
+ git_indexer_stream_free(idx);
603
+ return -1;
676
604
  }
677
605
 
678
606
  static int http_close(git_transport *transport)
679
607
  {
680
- transport_http *t = (transport_http *) transport;
681
- int error;
608
+ if (gitno_ssl_teardown(transport) < 0)
609
+ return -1;
682
610
 
683
- error = gitno_close(t->socket);
684
- if (error < 0)
685
- return git__throw(GIT_EOSERR, "Failed to close the socket: %s", strerror(errno));
611
+ if (gitno_close(transport->socket) < 0) {
612
+ giterr_set(GITERR_OS, "Failed to close the socket: %s", strerror(errno));
613
+ return -1;
614
+ }
615
+
616
+ transport->connected = 0;
686
617
 
687
- return GIT_SUCCESS;
618
+ return 0;
688
619
  }
689
620
 
690
621
 
@@ -728,8 +659,7 @@ int git_transport_http(git_transport **out)
728
659
  transport_http *t;
729
660
 
730
661
  t = git__malloc(sizeof(transport_http));
731
- if (t == NULL)
732
- return GIT_ENOMEM;
662
+ GITERR_CHECK_ALLOC(t);
733
663
 
734
664
  memset(t, 0x0, sizeof(transport_http));
735
665
 
@@ -747,10 +677,31 @@ int git_transport_http(git_transport **out)
747
677
  * before any socket calls can be performed */
748
678
  if (WSAStartup(MAKEWORD(2,2), &t->wsd) != 0) {
749
679
  http_free((git_transport *) t);
750
- return git__throw(GIT_EOSERR, "Winsock init failed");
680
+ giterr_set(GITERR_OS, "Winsock init failed");
681
+ return -1;
751
682
  }
752
683
  #endif
753
684
 
754
685
  *out = (git_transport *) t;
755
- return GIT_SUCCESS;
686
+ return 0;
687
+ }
688
+
689
+ int git_transport_https(git_transport **out)
690
+ {
691
+ #ifdef GIT_SSL
692
+ transport_http *t;
693
+ if (git_transport_http((git_transport **)&t) < 0)
694
+ return -1;
695
+
696
+ t->parent.encrypt = 1;
697
+ t->parent.check_cert = 1;
698
+ *out = (git_transport *) t;
699
+
700
+ return 0;
701
+ #else
702
+ GIT_UNUSED(out);
703
+
704
+ giterr_set(GITERR_NET, "HTTPS support not available");
705
+ return -1;
706
+ #endif
756
707
  }