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.
@@ -115,7 +115,7 @@ static int git_mwindow_close_lru(git_mwindow_file *mwf)
115
115
  unsigned int i;
116
116
  git_mwindow *lru_w = NULL, *lru_l = NULL, **list = &mwf->windows;
117
117
 
118
- /* FIMXE: Does this give us any advantage? */
118
+ /* FIXME: Does this give us any advantage? */
119
119
  if(mwf->windows)
120
120
  git_mwindow_scan_lru(mwf, &lru_w, &lru_l);
121
121
 
@@ -127,22 +127,23 @@ static int git_mwindow_close_lru(git_mwindow_file *mwf)
127
127
  list = &cur->windows;
128
128
  }
129
129
 
130
- if (lru_w) {
131
- ctl->mapped -= lru_w->window_map.len;
132
- git_futils_mmap_free(&lru_w->window_map);
130
+ if (!lru_w) {
131
+ giterr_set(GITERR_OS, "Failed to close memory window. Couldn't find LRU");
132
+ return -1;
133
+ }
133
134
 
134
- if (lru_l)
135
- lru_l->next = lru_w->next;
136
- else
137
- *list = lru_w->next;
135
+ ctl->mapped -= lru_w->window_map.len;
136
+ git_futils_mmap_free(&lru_w->window_map);
138
137
 
139
- git__free(lru_w);
140
- ctl->open_windows--;
138
+ if (lru_l)
139
+ lru_l->next = lru_w->next;
140
+ else
141
+ *list = lru_w->next;
141
142
 
142
- return GIT_SUCCESS;
143
- }
143
+ git__free(lru_w);
144
+ ctl->open_windows--;
144
145
 
145
- return git__throw(GIT_ERROR, "Failed to close memory window. Couln't find LRU");
146
+ return 0;
146
147
  }
147
148
 
148
149
  static git_mwindow *new_window(
@@ -158,7 +159,7 @@ static git_mwindow *new_window(
158
159
 
159
160
  w = git__malloc(sizeof(*w));
160
161
  if (w == NULL)
161
- return w;
162
+ return NULL;
162
163
 
163
164
  memset(w, 0x0, sizeof(*w));
164
165
  w->offset = (offset / walign) * walign;
@@ -170,7 +171,7 @@ static git_mwindow *new_window(
170
171
  ctl->mapped += (size_t)len;
171
172
 
172
173
  while (_mw_options.mapped_limit < ctl->mapped &&
173
- git_mwindow_close_lru(mwf) == GIT_SUCCESS) /* nop */;
174
+ git_mwindow_close_lru(mwf) == 0) /* nop */;
174
175
 
175
176
  /*
176
177
  * We treat _mw_options.mapped_limit as a soft limit. If we can't find a
@@ -178,8 +179,10 @@ static git_mwindow *new_window(
178
179
  * window.
179
180
  */
180
181
 
181
- if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < GIT_SUCCESS)
182
- goto cleanup;
182
+ if (git_futils_mmap_ro(&w->window_map, fd, w->offset, (size_t)len) < 0) {
183
+ git__free(w);
184
+ return NULL;
185
+ }
183
186
 
184
187
  ctl->mmap_calls++;
185
188
  ctl->open_windows++;
@@ -191,10 +194,6 @@ static git_mwindow *new_window(
191
194
  ctl->peak_open_windows = ctl->open_windows;
192
195
 
193
196
  return w;
194
-
195
- cleanup:
196
- git__free(w);
197
- return NULL;
198
197
  }
199
198
 
200
199
  /*
@@ -205,19 +204,20 @@ unsigned char *git_mwindow_open(
205
204
  git_mwindow_file *mwf,
206
205
  git_mwindow **cursor,
207
206
  git_off_t offset,
208
- int extra,
207
+ size_t extra,
209
208
  unsigned int *left)
210
209
  {
211
210
  git_mwindow_ctl *ctl = &GIT_GLOBAL->mem_ctl;
212
211
  git_mwindow *w = *cursor;
213
212
 
214
- if (!w || !git_mwindow_contains(w, offset + extra)) {
213
+ if (!w || !(git_mwindow_contains(w, offset) && git_mwindow_contains(w, offset + extra))) {
215
214
  if (w) {
216
215
  w->inuse_cnt--;
217
216
  }
218
217
 
219
218
  for (w = mwf->windows; w; w = w->next) {
220
- if (git_mwindow_contains(w, offset + extra))
219
+ if (git_mwindow_contains(w, offset) &&
220
+ git_mwindow_contains(w, offset + extra))
221
221
  break;
222
222
  }
223
223
 
@@ -242,7 +242,6 @@ unsigned char *git_mwindow_open(
242
242
  }
243
243
 
244
244
  offset -= w->offset;
245
- assert(git__is_sizet(offset));
246
245
 
247
246
  if (left)
248
247
  *left = (unsigned int)(w->window_map.len - offset);
@@ -253,11 +252,10 @@ unsigned char *git_mwindow_open(
253
252
  int git_mwindow_file_register(git_mwindow_file *mwf)
254
253
  {
255
254
  git_mwindow_ctl *ctl = &GIT_GLOBAL->mem_ctl;
256
- int error;
257
255
 
258
256
  if (ctl->windowfiles.length == 0 &&
259
- (error = git_vector_init(&ctl->windowfiles, 8, NULL)) < GIT_SUCCESS)
260
- return error;
257
+ git_vector_init(&ctl->windowfiles, 8, NULL) < 0)
258
+ return -1;
261
259
 
262
260
  return git_vector_insert(&ctl->windowfiles, mwf);
263
261
  }
@@ -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.
@@ -15,8 +15,8 @@ typedef struct git_mwindow {
15
15
  struct git_mwindow *next;
16
16
  git_map window_map;
17
17
  git_off_t offset;
18
- unsigned int last_used;
19
- unsigned int inuse_cnt;
18
+ size_t last_used;
19
+ size_t inuse_cnt;
20
20
  } git_mwindow;
21
21
 
22
22
  typedef struct git_mwindow_file {
@@ -37,7 +37,7 @@ typedef struct git_mwindow_ctl {
37
37
 
38
38
  int git_mwindow_contains(git_mwindow *win, git_off_t offset);
39
39
  void git_mwindow_free_all(git_mwindow_file *mwf);
40
- unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset, int extra, unsigned int *left);
40
+ unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, git_off_t offset, size_t extra, unsigned int *left);
41
41
  void git_mwindow_scan_lru(git_mwindow_file *mwf, git_mwindow **lru_w, git_mwindow **lru_l);
42
42
  int git_mwindow_file_register(git_mwindow_file *mwf);
43
43
  void git_mwindow_close(git_mwindow **w_cursor);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2011 the libgit2 contributors
2
+ * Copyright (C) 2009-2012 the libgit2 contributors
3
3
  *
4
4
  * This file is part of libgit2, distributed under the GNU GPL v2 with
5
5
  * a Linking Exception. For full terms see the included COPYING file.
@@ -8,45 +8,114 @@
8
8
  # include <sys/types.h>
9
9
  # include <sys/socket.h>
10
10
  # include <sys/select.h>
11
+ # include <sys/time.h>
11
12
  # include <netdb.h>
13
+ # include <arpa/inet.h>
12
14
  #else
13
- # define _WIN32_WINNT 0x0501
14
15
  # include <winsock2.h>
15
- # include <Ws2tcpip.h>
16
+ # include <ws2tcpip.h>
16
17
  # ifdef _MSC_VER
17
- # pragma comment(lib, "Ws2_32.lib")
18
+ # pragma comment(lib, "ws2_32.lib")
18
19
  # endif
19
20
  #endif
20
21
 
22
+ #ifdef GIT_SSL
23
+ # include <openssl/ssl.h>
24
+ # include <openssl/x509v3.h>
25
+ #endif
21
26
 
27
+ #include <ctype.h>
22
28
  #include "git2/errors.h"
23
29
 
24
30
  #include "common.h"
25
31
  #include "netops.h"
26
32
  #include "posix.h"
33
+ #include "buffer.h"
34
+ #include "transport.h"
27
35
 
28
- void gitno_buffer_setup(gitno_buffer *buf, char *data, unsigned int len, int fd)
36
+ #ifdef GIT_WIN32
37
+ static void net_set_error(const char *str)
38
+ {
39
+ int size, error = WSAGetLastError();
40
+ LPSTR err_str = NULL;
41
+
42
+ size = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
43
+ 0, error, 0, (LPSTR)&err_str, 0, 0);
44
+
45
+ giterr_set(GITERR_NET, "%s: %s", str, err_str);
46
+ LocalFree(err_str);
47
+ }
48
+ #else
49
+ static void net_set_error(const char *str)
50
+ {
51
+ giterr_set(GITERR_NET, "%s: %s", str, strerror(errno));
52
+ }
53
+ #endif
54
+
55
+ #ifdef GIT_SSL
56
+ static int ssl_set_error(gitno_ssl *ssl, int error)
57
+ {
58
+ int err;
59
+ err = SSL_get_error(ssl->ssl, error);
60
+ giterr_set(GITERR_NET, "SSL error: %s", ERR_error_string(err, NULL));
61
+ return -1;
62
+ }
63
+ #endif
64
+
65
+ void gitno_buffer_setup(git_transport *t, gitno_buffer *buf, char *data, unsigned int len)
29
66
  {
30
67
  memset(buf, 0x0, sizeof(gitno_buffer));
31
68
  memset(data, 0x0, len);
32
69
  buf->data = data;
33
70
  buf->len = len;
34
71
  buf->offset = 0;
35
- buf->fd = fd;
72
+ buf->fd = t->socket;
73
+ #ifdef GIT_SSL
74
+ if (t->encrypt)
75
+ buf->ssl = &t->ssl;
76
+ #endif
36
77
  }
37
78
 
38
- int gitno_recv(gitno_buffer *buf)
79
+ #ifdef GIT_SSL
80
+ static int ssl_recv(gitno_ssl *ssl, void *data, size_t len)
39
81
  {
40
82
  int ret;
41
83
 
42
- ret = recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
84
+ do {
85
+ ret = SSL_read(ssl->ssl, data, len);
86
+ } while (SSL_get_error(ssl->ssl, ret) == SSL_ERROR_WANT_READ);
87
+
43
88
  if (ret < 0)
44
- return git__throw(GIT_EOSERR, "Failed to receive data: %s", strerror(errno));
45
- if (ret == 0) /* Orderly shutdown, so exit */
46
- return GIT_SUCCESS;
89
+ return ssl_set_error(ssl, ret);
47
90
 
48
- buf->offset += ret;
91
+ return ret;
92
+ }
93
+ #endif
94
+
95
+ int gitno_recv(gitno_buffer *buf)
96
+ {
97
+ int ret;
98
+
99
+ #ifdef GIT_SSL
100
+ if (buf->ssl != NULL) {
101
+ if ((ret = ssl_recv(buf->ssl, buf->data + buf->offset, buf->len - buf->offset)) < 0)
102
+ return -1;
103
+ } else {
104
+ ret = p_recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
105
+ if (ret < 0) {
106
+ net_set_error("Error receiving socket data");
107
+ return -1;
108
+ }
109
+ }
110
+ #else
111
+ ret = p_recv(buf->fd, buf->data + buf->offset, buf->len - buf->offset, 0);
112
+ if (ret < 0) {
113
+ net_set_error("Error receiving socket data");
114
+ return -1;
115
+ }
116
+ #endif
49
117
 
118
+ buf->offset += ret;
50
119
  return ret;
51
120
  }
52
121
 
@@ -73,71 +142,325 @@ void gitno_consume_n(gitno_buffer *buf, size_t cons)
73
142
  buf->offset -= cons;
74
143
  }
75
144
 
76
- int gitno_connect(const char *host, const char *port)
145
+ int gitno_ssl_teardown(git_transport *t)
146
+ {
147
+ #ifdef GIT_SSL
148
+ int ret;
149
+ #endif
150
+
151
+ if (!t->encrypt)
152
+ return 0;
153
+
154
+ #ifdef GIT_SSL
155
+
156
+ do {
157
+ ret = SSL_shutdown(t->ssl.ssl);
158
+ } while (ret == 0);
159
+ if (ret < 0)
160
+ return ssl_set_error(&t->ssl, ret);
161
+
162
+ SSL_free(t->ssl.ssl);
163
+ SSL_CTX_free(t->ssl.ctx);
164
+ #endif
165
+ return 0;
166
+ }
167
+
168
+
169
+ #ifdef GIT_SSL
170
+ /* Match host names according to RFC 2818 rules */
171
+ static int match_host(const char *pattern, const char *host)
172
+ {
173
+ for (;;) {
174
+ char c = tolower(*pattern++);
175
+
176
+ if (c == '\0')
177
+ return *host ? -1 : 0;
178
+
179
+ if (c == '*') {
180
+ c = *pattern;
181
+ /* '*' at the end matches everything left */
182
+ if (c == '\0')
183
+ return 0;
184
+
185
+ /*
186
+ * We've found a pattern, so move towards the next matching
187
+ * char. The '.' is handled specially because wildcards aren't
188
+ * allowed to cross subdomains.
189
+ */
190
+
191
+ while(*host) {
192
+ char h = tolower(*host);
193
+ if (c == h)
194
+ return match_host(pattern, host++);
195
+ if (h == '.')
196
+ return match_host(pattern, host);
197
+ host++;
198
+ }
199
+ return -1;
200
+ }
201
+
202
+ if (c != tolower(*host++))
203
+ return -1;
204
+ }
205
+
206
+ return -1;
207
+ }
208
+
209
+ static int check_host_name(const char *name, const char *host)
210
+ {
211
+ if (!strcasecmp(name, host))
212
+ return 0;
213
+
214
+ if (match_host(name, host) < 0)
215
+ return -1;
216
+
217
+ return 0;
218
+ }
219
+
220
+ static int verify_server_cert(git_transport *t, const char *host)
221
+ {
222
+ X509 *cert;
223
+ X509_NAME *peer_name;
224
+ ASN1_STRING *str;
225
+ unsigned char *peer_cn = NULL;
226
+ int matched = -1, type = GEN_DNS;
227
+ GENERAL_NAMES *alts;
228
+ struct in6_addr addr6;
229
+ struct in_addr addr4;
230
+ void *addr;
231
+ int i = -1,j;
232
+
233
+
234
+ /* Try to parse the host as an IP address to see if it is */
235
+ if (inet_pton(AF_INET, host, &addr4)) {
236
+ type = GEN_IPADD;
237
+ addr = &addr4;
238
+ } else {
239
+ if(inet_pton(AF_INET6, host, &addr6)) {
240
+ type = GEN_IPADD;
241
+ addr = &addr6;
242
+ }
243
+ }
244
+
245
+
246
+ cert = SSL_get_peer_certificate(t->ssl.ssl);
247
+
248
+ /* Check the alternative names */
249
+ alts = X509_get_ext_d2i(cert, NID_subject_alt_name, NULL, NULL);
250
+ if (alts) {
251
+ int num;
252
+
253
+ num = sk_GENERAL_NAME_num(alts);
254
+ for (i = 0; i < num && matched != 1; i++) {
255
+ const GENERAL_NAME *gn = sk_GENERAL_NAME_value(alts, i);
256
+ const char *name = (char *) ASN1_STRING_data(gn->d.ia5);
257
+ size_t namelen = (size_t) ASN1_STRING_length(gn->d.ia5);
258
+
259
+ /* Skip any names of a type we're not looking for */
260
+ if (gn->type != type)
261
+ continue;
262
+
263
+ if (type == GEN_DNS) {
264
+ /* If it contains embedded NULs, don't even try */
265
+ if (memchr(name, '\0', namelen))
266
+ continue;
267
+
268
+ if (check_host_name(name, host) < 0)
269
+ matched = 0;
270
+ else
271
+ matched = 1;
272
+ } else if (type == GEN_IPADD) {
273
+ /* Here name isn't so much a name but a binary representation of the IP */
274
+ matched = !!memcmp(name, addr, namelen);
275
+ }
276
+ }
277
+ }
278
+ GENERAL_NAMES_free(alts);
279
+
280
+ if (matched == 0)
281
+ goto on_error;
282
+
283
+ if (matched == 1)
284
+ return 0;
285
+
286
+ /* If no alternative names are available, check the common name */
287
+ peer_name = X509_get_subject_name(cert);
288
+ if (peer_name == NULL)
289
+ goto on_error;
290
+
291
+ if (peer_name) {
292
+ /* Get the index of the last CN entry */
293
+ while ((j = X509_NAME_get_index_by_NID(peer_name, NID_commonName, i)) >= 0)
294
+ i = j;
295
+ }
296
+
297
+ if (i < 0)
298
+ goto on_error;
299
+
300
+ str = X509_NAME_ENTRY_get_data(X509_NAME_get_entry(peer_name, i));
301
+ if (str == NULL)
302
+ goto on_error;
303
+
304
+ /* Work around a bug in OpenSSL whereby ASN1_STRING_to_UTF8 fails if it's already in utf-8 */
305
+ if (ASN1_STRING_type(str) == V_ASN1_UTF8STRING) {
306
+ int size = ASN1_STRING_length(str);
307
+
308
+ if (size > 0) {
309
+ peer_cn = OPENSSL_malloc(size + 1);
310
+ GITERR_CHECK_ALLOC(peer_cn);
311
+ memcpy(peer_cn, ASN1_STRING_data(str), size);
312
+ peer_cn[size] = '\0';
313
+ }
314
+ } else {
315
+ int size = ASN1_STRING_to_UTF8(&peer_cn, str);
316
+ GITERR_CHECK_ALLOC(peer_cn);
317
+ if (memchr(peer_cn, '\0', size))
318
+ goto cert_fail;
319
+ }
320
+
321
+ if (check_host_name((char *)peer_cn, host) < 0)
322
+ goto cert_fail;
323
+
324
+ OPENSSL_free(peer_cn);
325
+
326
+ return 0;
327
+
328
+ on_error:
329
+ OPENSSL_free(peer_cn);
330
+ return ssl_set_error(&t->ssl, 0);
331
+
332
+ cert_fail:
333
+ OPENSSL_free(peer_cn);
334
+ giterr_set(GITERR_SSL, "Certificate host name check failed");
335
+ return -1;
336
+ }
337
+
338
+ static int ssl_setup(git_transport *t, const char *host)
339
+ {
340
+ int ret;
341
+
342
+ SSL_library_init();
343
+ SSL_load_error_strings();
344
+ t->ssl.ctx = SSL_CTX_new(SSLv23_method());
345
+ if (t->ssl.ctx == NULL)
346
+ return ssl_set_error(&t->ssl, 0);
347
+
348
+ SSL_CTX_set_mode(t->ssl.ctx, SSL_MODE_AUTO_RETRY);
349
+ SSL_CTX_set_verify(t->ssl.ctx, SSL_VERIFY_PEER, NULL);
350
+ if (!SSL_CTX_set_default_verify_paths(t->ssl.ctx))
351
+ return ssl_set_error(&t->ssl, 0);
352
+
353
+ t->ssl.ssl = SSL_new(t->ssl.ctx);
354
+ if (t->ssl.ssl == NULL)
355
+ return ssl_set_error(&t->ssl, 0);
356
+
357
+ if((ret = SSL_set_fd(t->ssl.ssl, t->socket)) == 0)
358
+ return ssl_set_error(&t->ssl, ret);
359
+
360
+ if ((ret = SSL_connect(t->ssl.ssl)) <= 0)
361
+ return ssl_set_error(&t->ssl, ret);
362
+
363
+ if (t->check_cert && verify_server_cert(t, host) < 0)
364
+ return -1;
365
+
366
+ return 0;
367
+ }
368
+ #else
369
+ static int ssl_setup(git_transport *t, const char *host)
370
+ {
371
+ GIT_UNUSED(t);
372
+ GIT_UNUSED(host);
373
+ return 0;
374
+ }
375
+ #endif
376
+
377
+ int gitno_connect(git_transport *t, const char *host, const char *port)
77
378
  {
78
- struct addrinfo *info, *p;
379
+ struct addrinfo *info = NULL, *p;
79
380
  struct addrinfo hints;
80
- int ret, error = GIT_SUCCESS;
81
- GIT_SOCKET s;
381
+ int ret;
382
+ GIT_SOCKET s = INVALID_SOCKET;
82
383
 
83
384
  memset(&hints, 0x0, sizeof(struct addrinfo));
84
385
  hints.ai_family = AF_UNSPEC;
85
386
  hints.ai_socktype = SOCK_STREAM;
86
387
 
87
- ret = getaddrinfo(host, port, &hints, &info);
88
- if (ret != 0) {
89
- error = GIT_EOSERR;
90
- info = NULL;
91
- goto cleanup;
388
+ if ((ret = getaddrinfo(host, port, &hints, &info)) < 0) {
389
+ giterr_set(GITERR_NET, "Failed to resolve address for %s: %s", host, gai_strerror(ret));
390
+ return -1;
92
391
  }
93
392
 
94
393
  for (p = info; p != NULL; p = p->ai_next) {
95
394
  s = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
96
- #ifdef GIT_WIN32
97
395
  if (s == INVALID_SOCKET) {
98
- #else
99
- if (s < 0) {
100
- #endif
101
- error = GIT_EOSERR;
102
- goto cleanup;
396
+ net_set_error("error creating socket");
397
+ break;
103
398
  }
104
399
 
105
- ret = connect(s, p->ai_addr, p->ai_addrlen);
106
- /* If we can't connect, try the next one */
107
- if (ret < 0) {
108
- continue;
109
- }
400
+ if (connect(s, p->ai_addr, (socklen_t)p->ai_addrlen) == 0)
401
+ break;
110
402
 
111
- /* Return the socket */
112
- error = s;
113
- goto cleanup;
403
+ /* If we can't connect, try the next one */
404
+ gitno_close(s);
405
+ s = INVALID_SOCKET;
114
406
  }
115
407
 
116
408
  /* Oops, we couldn't connect to any address */
117
- error = git__throw(GIT_EOSERR, "Failed to connect: %s", strerror(errno));
409
+ if (s == INVALID_SOCKET && p == NULL) {
410
+ giterr_set(GITERR_OS, "Failed to connect to %s", host);
411
+ return -1;
412
+ }
118
413
 
119
- cleanup:
414
+ t->socket = s;
120
415
  freeaddrinfo(info);
121
- return error;
416
+
417
+ if (t->encrypt && ssl_setup(t, host) < 0)
418
+ return -1;
419
+
420
+ return 0;
122
421
  }
123
422
 
124
- int gitno_send(GIT_SOCKET s, const char *msg, size_t len, int flags)
423
+ #ifdef GIT_SSL
424
+ static int send_ssl(gitno_ssl *ssl, const char *msg, size_t len)
125
425
  {
126
426
  int ret;
127
427
  size_t off = 0;
128
428
 
129
429
  while (off < len) {
130
- errno = 0;
131
-
132
- ret = send(s, msg + off, len - off, flags);
133
- if (ret < 0)
134
- return git__throw(GIT_EOSERR, "Error sending data: %s", strerror(errno));
430
+ ret = SSL_write(ssl->ssl, msg + off, len - off);
431
+ if (ret <= 0)
432
+ return ssl_set_error(ssl, ret);
135
433
 
136
434
  off += ret;
137
435
  }
138
436
 
139
437
  return off;
140
438
  }
439
+ #endif
440
+
441
+ int gitno_send(git_transport *t, const char *msg, size_t len, int flags)
442
+ {
443
+ int ret;
444
+ size_t off = 0;
445
+
446
+ #ifdef GIT_SSL
447
+ if (t->encrypt)
448
+ return send_ssl(&t->ssl, msg, len);
449
+ #endif
450
+
451
+ while (off < len) {
452
+ errno = 0;
453
+ ret = p_send(t->socket, msg + off, len - off, flags);
454
+ if (ret < 0) {
455
+ net_set_error("Error sending data");
456
+ return -1;
457
+ }
458
+
459
+ off += ret;
460
+ }
461
+
462
+ return (int)off;
463
+ }
141
464
 
142
465
 
143
466
  #ifdef GIT_WIN32
@@ -164,35 +487,31 @@ int gitno_select_in(gitno_buffer *buf, long int sec, long int usec)
164
487
  FD_SET(buf->fd, &fds);
165
488
 
166
489
  /* The select(2) interface is silly */
167
- return select(buf->fd + 1, &fds, NULL, NULL, &tv);
490
+ return select((int)buf->fd + 1, &fds, NULL, NULL, &tv);
168
491
  }
169
492
 
170
493
  int gitno_extract_host_and_port(char **host, char **port, const char *url, const char *default_port)
171
494
  {
172
495
  char *colon, *slash, *delim;
173
- int error = GIT_SUCCESS;
174
496
 
175
497
  colon = strchr(url, ':');
176
498
  slash = strchr(url, '/');
177
499
 
178
- if (slash == NULL)
179
- return git__throw(GIT_EOBJCORRUPTED, "Malformed URL: missing /");
500
+ if (slash == NULL) {
501
+ giterr_set(GITERR_NET, "Malformed URL: missing /");
502
+ return -1;
503
+ }
180
504
 
181
505
  if (colon == NULL) {
182
506
  *port = git__strdup(default_port);
183
507
  } else {
184
508
  *port = git__strndup(colon + 1, slash - colon - 1);
185
509
  }
186
- if (*port == NULL)
187
- return GIT_ENOMEM;;
188
-
510
+ GITERR_CHECK_ALLOC(*port);
189
511
 
190
512
  delim = colon == NULL ? slash : colon;
191
513
  *host = git__strndup(url, delim - url);
192
- if (*host == NULL) {
193
- git__free(*port);
194
- error = GIT_ENOMEM;
195
- }
514
+ GITERR_CHECK_ALLOC(*host);
196
515
 
197
- return error;
516
+ return 0;
198
517
  }