rugged 0.16.0 → 0.17.0b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (392) hide show
  1. data/README.md +373 -243
  2. data/Rakefile +22 -0
  3. data/ext/rugged/extconf.rb +9 -6
  4. data/ext/rugged/rugged.c +123 -31
  5. data/ext/rugged/rugged.h +11 -10
  6. data/ext/rugged/rugged_blob.c +181 -18
  7. data/ext/rugged/rugged_commit.c +196 -18
  8. data/ext/rugged/rugged_config.c +94 -5
  9. data/ext/rugged/rugged_object.c +54 -1
  10. data/ext/rugged/rugged_reference.c +203 -15
  11. data/ext/rugged/{remote.c → rugged_remote.c} +35 -10
  12. data/ext/rugged/rugged_repo.c +323 -81
  13. data/ext/rugged/rugged_revwalk.c +57 -4
  14. data/ext/rugged/rugged_signature.c +3 -3
  15. data/ext/rugged/rugged_tag.c +72 -1
  16. data/ext/rugged/rugged_tree.c +70 -2
  17. data/ext/rugged/vendor/libgit2-dist/deps/regex/config.h +7 -0
  18. data/ext/rugged/vendor/libgit2-dist/deps/regex/regcomp.c +3856 -0
  19. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.c +85 -0
  20. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex.h +582 -0
  21. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.c +1744 -0
  22. data/ext/rugged/vendor/libgit2-dist/deps/regex/regex_internal.h +810 -0
  23. data/ext/rugged/vendor/libgit2-dist/deps/regex/regexec.c +4369 -0
  24. data/ext/rugged/vendor/libgit2-dist/examples/diff.c +238 -0
  25. data/ext/rugged/vendor/libgit2-dist/examples/general.c +4 -4
  26. data/ext/rugged/vendor/libgit2-dist/examples/network/fetch.c +101 -85
  27. data/ext/rugged/vendor/libgit2-dist/examples/network/git2.c +7 -3
  28. data/ext/rugged/vendor/libgit2-dist/examples/network/index-pack.c +80 -25
  29. data/ext/rugged/vendor/libgit2-dist/examples/network/ls-remote.c +6 -6
  30. data/ext/rugged/vendor/libgit2-dist/include/git2/attr.h +224 -0
  31. data/ext/rugged/vendor/libgit2-dist/include/git2/blob.h +59 -5
  32. data/ext/rugged/vendor/libgit2-dist/include/git2/branch.h +114 -7
  33. data/ext/rugged/vendor/libgit2-dist/include/git2/commit.h +14 -7
  34. data/ext/rugged/vendor/libgit2-dist/include/git2/common.h +4 -3
  35. data/ext/rugged/vendor/libgit2-dist/include/git2/config.h +105 -27
  36. data/ext/rugged/vendor/libgit2-dist/include/git2/diff.h +409 -0
  37. data/ext/rugged/vendor/libgit2-dist/include/git2/errors.h +47 -82
  38. data/ext/rugged/vendor/libgit2-dist/include/git2/index.h +25 -10
  39. data/ext/rugged/vendor/libgit2-dist/include/git2/indexer.h +46 -1
  40. data/ext/rugged/vendor/libgit2-dist/include/git2/merge.h +35 -0
  41. data/ext/rugged/vendor/libgit2-dist/include/git2/net.h +1 -1
  42. data/ext/rugged/vendor/libgit2-dist/include/git2/notes.h +139 -0
  43. data/ext/rugged/vendor/libgit2-dist/include/git2/object.h +5 -5
  44. data/ext/rugged/vendor/libgit2-dist/include/git2/odb.h +13 -13
  45. data/ext/rugged/vendor/libgit2-dist/include/git2/odb_backend.h +8 -8
  46. data/ext/rugged/vendor/libgit2-dist/include/git2/oid.h +14 -9
  47. data/ext/rugged/vendor/libgit2-dist/include/git2/reflog.h +5 -5
  48. data/ext/rugged/vendor/libgit2-dist/include/git2/refs.h +37 -17
  49. data/ext/rugged/vendor/libgit2-dist/include/git2/refspec.h +17 -9
  50. data/ext/rugged/vendor/libgit2-dist/include/git2/remote.h +83 -16
  51. data/ext/rugged/vendor/libgit2-dist/include/git2/repository.h +24 -10
  52. data/ext/rugged/vendor/libgit2-dist/include/git2/reset.h +44 -0
  53. data/ext/rugged/vendor/libgit2-dist/include/git2/revparse.h +36 -0
  54. data/ext/rugged/vendor/libgit2-dist/include/git2/revwalk.h +74 -6
  55. data/ext/rugged/vendor/libgit2-dist/include/git2/signature.h +3 -3
  56. data/ext/rugged/vendor/libgit2-dist/include/git2/status.h +120 -19
  57. data/ext/rugged/vendor/libgit2-dist/include/git2/submodule.h +103 -0
  58. data/ext/rugged/vendor/libgit2-dist/include/git2/tag.h +28 -10
  59. data/ext/rugged/vendor/libgit2-dist/include/git2/threads.h +1 -1
  60. data/ext/rugged/vendor/libgit2-dist/include/git2/tree.h +13 -13
  61. data/ext/rugged/vendor/libgit2-dist/include/git2/types.h +16 -2
  62. data/ext/rugged/vendor/libgit2-dist/include/git2/version.h +3 -3
  63. data/ext/rugged/vendor/libgit2-dist/include/git2/windows.h +1 -1
  64. data/ext/rugged/vendor/libgit2-dist/include/git2.h +7 -2
  65. data/ext/rugged/vendor/libgit2-dist/src/attr.c +677 -0
  66. data/ext/rugged/vendor/libgit2-dist/src/attr.h +56 -0
  67. data/ext/rugged/vendor/libgit2-dist/src/attr_file.c +609 -0
  68. data/ext/rugged/vendor/libgit2-dist/src/attr_file.h +145 -0
  69. data/ext/rugged/vendor/libgit2-dist/src/blob.c +213 -60
  70. data/ext/rugged/vendor/libgit2-dist/src/blob.h +2 -1
  71. data/ext/rugged/vendor/libgit2-dist/src/branch.c +208 -0
  72. data/ext/rugged/vendor/libgit2-dist/src/branch.h +17 -0
  73. data/ext/rugged/vendor/libgit2-dist/src/bswap.h +1 -1
  74. data/ext/rugged/vendor/libgit2-dist/src/buffer.c +395 -46
  75. data/ext/rugged/vendor/libgit2-dist/src/buffer.h +112 -9
  76. data/ext/rugged/vendor/libgit2-dist/src/cache.c +37 -49
  77. data/ext/rugged/vendor/libgit2-dist/src/cache.h +7 -17
  78. data/ext/rugged/vendor/libgit2-dist/src/cc-compat.h +18 -16
  79. data/ext/rugged/vendor/libgit2-dist/src/commit.c +56 -90
  80. data/ext/rugged/vendor/libgit2-dist/src/commit.h +1 -1
  81. data/ext/rugged/vendor/libgit2-dist/src/common.h +12 -5
  82. data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.c +1 -1
  83. data/ext/rugged/vendor/libgit2-dist/src/{win32 → compat}/fnmatch.h +3 -3
  84. data/ext/rugged/vendor/libgit2-dist/src/config.c +247 -158
  85. data/ext/rugged/vendor/libgit2-dist/src/config.h +10 -1
  86. data/ext/rugged/vendor/libgit2-dist/src/config_cache.c +94 -0
  87. data/ext/rugged/vendor/libgit2-dist/src/config_file.c +606 -496
  88. data/ext/rugged/vendor/libgit2-dist/src/config_file.h +31 -0
  89. data/ext/rugged/vendor/libgit2-dist/src/crlf.c +228 -0
  90. data/ext/rugged/vendor/libgit2-dist/src/date.c +876 -0
  91. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.c +15 -9
  92. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.h +2 -2
  93. data/ext/rugged/vendor/libgit2-dist/src/diff.c +814 -0
  94. data/ext/rugged/vendor/libgit2-dist/src/diff.h +43 -0
  95. data/ext/rugged/vendor/libgit2-dist/src/diff_output.c +794 -0
  96. data/ext/rugged/vendor/libgit2-dist/src/errors.c +89 -74
  97. data/ext/rugged/vendor/libgit2-dist/src/fetch.c +94 -66
  98. data/ext/rugged/vendor/libgit2-dist/src/fetch.h +5 -4
  99. data/ext/rugged/vendor/libgit2-dist/src/filebuf.c +157 -100
  100. data/ext/rugged/vendor/libgit2-dist/src/filebuf.h +22 -8
  101. data/ext/rugged/vendor/libgit2-dist/src/fileops.c +330 -206
  102. data/ext/rugged/vendor/libgit2-dist/src/fileops.h +82 -51
  103. data/ext/rugged/vendor/libgit2-dist/src/filter.c +165 -0
  104. data/ext/rugged/vendor/libgit2-dist/src/filter.h +119 -0
  105. data/ext/rugged/vendor/libgit2-dist/src/global.c +4 -4
  106. data/ext/rugged/vendor/libgit2-dist/src/global.h +4 -1
  107. data/ext/rugged/vendor/libgit2-dist/src/hash.c +1 -1
  108. data/ext/rugged/vendor/libgit2-dist/src/hash.h +1 -1
  109. data/ext/rugged/vendor/libgit2-dist/src/ignore.c +203 -0
  110. data/ext/rugged/vendor/libgit2-dist/src/ignore.h +38 -0
  111. data/ext/rugged/vendor/libgit2-dist/src/index.c +220 -169
  112. data/ext/rugged/vendor/libgit2-dist/src/index.h +5 -1
  113. data/ext/rugged/vendor/libgit2-dist/src/indexer.c +601 -102
  114. data/ext/rugged/vendor/libgit2-dist/src/iterator.c +748 -0
  115. data/ext/rugged/vendor/libgit2-dist/src/iterator.h +151 -0
  116. data/ext/rugged/vendor/libgit2-dist/src/khash.h +608 -0
  117. data/ext/rugged/vendor/libgit2-dist/src/map.h +6 -1
  118. data/ext/rugged/vendor/libgit2-dist/src/message.c +61 -0
  119. data/ext/rugged/vendor/libgit2-dist/src/message.h +14 -0
  120. data/ext/rugged/vendor/libgit2-dist/src/mwindow.c +27 -29
  121. data/ext/rugged/vendor/libgit2-dist/src/mwindow.h +4 -4
  122. data/ext/rugged/vendor/libgit2-dist/src/netops.c +375 -56
  123. data/ext/rugged/vendor/libgit2-dist/src/netops.h +12 -9
  124. data/ext/rugged/vendor/libgit2-dist/src/notes.c +548 -0
  125. data/ext/rugged/vendor/libgit2-dist/src/notes.h +28 -0
  126. data/ext/rugged/vendor/libgit2-dist/src/object.c +59 -21
  127. data/ext/rugged/vendor/libgit2-dist/src/odb.c +212 -175
  128. data/ext/rugged/vendor/libgit2-dist/src/odb.h +39 -2
  129. data/ext/rugged/vendor/libgit2-dist/src/odb_loose.c +238 -241
  130. data/ext/rugged/vendor/libgit2-dist/src/odb_pack.c +94 -106
  131. data/ext/rugged/vendor/libgit2-dist/src/oid.c +59 -60
  132. data/ext/rugged/vendor/libgit2-dist/src/oidmap.h +42 -0
  133. data/ext/rugged/vendor/libgit2-dist/src/pack.c +198 -170
  134. data/ext/rugged/vendor/libgit2-dist/src/pack.h +16 -9
  135. data/ext/rugged/vendor/libgit2-dist/src/path.c +496 -106
  136. data/ext/rugged/vendor/libgit2-dist/src/path.h +214 -20
  137. data/ext/rugged/vendor/libgit2-dist/src/pkt.c +88 -159
  138. data/ext/rugged/vendor/libgit2-dist/src/pkt.h +9 -5
  139. data/ext/rugged/vendor/libgit2-dist/src/pool.c +294 -0
  140. data/ext/rugged/vendor/libgit2-dist/src/pool.h +125 -0
  141. data/ext/rugged/vendor/libgit2-dist/src/posix.c +38 -16
  142. data/ext/rugged/vendor/libgit2-dist/src/posix.h +20 -2
  143. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.c +1 -1
  144. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.h +1 -1
  145. data/ext/rugged/vendor/libgit2-dist/src/pqueue.c +7 -7
  146. data/ext/rugged/vendor/libgit2-dist/src/pqueue.h +1 -1
  147. data/ext/rugged/vendor/libgit2-dist/src/protocol.c +21 -13
  148. data/ext/rugged/vendor/libgit2-dist/src/protocol.h +1 -1
  149. data/ext/rugged/vendor/libgit2-dist/src/reflog.c +125 -103
  150. data/ext/rugged/vendor/libgit2-dist/src/reflog.h +1 -1
  151. data/ext/rugged/vendor/libgit2-dist/src/refs.c +713 -640
  152. data/ext/rugged/vendor/libgit2-dist/src/refs.h +27 -3
  153. data/ext/rugged/vendor/libgit2-dist/src/refspec.c +51 -17
  154. data/ext/rugged/vendor/libgit2-dist/src/refspec.h +13 -1
  155. data/ext/rugged/vendor/libgit2-dist/src/remote.c +307 -119
  156. data/ext/rugged/vendor/libgit2-dist/src/remote.h +3 -2
  157. data/ext/rugged/vendor/libgit2-dist/src/repository.c +593 -442
  158. data/ext/rugged/vendor/libgit2-dist/src/repository.h +80 -2
  159. data/ext/rugged/vendor/libgit2-dist/src/reset.c +103 -0
  160. data/ext/rugged/vendor/libgit2-dist/src/revparse.c +753 -0
  161. data/ext/rugged/vendor/libgit2-dist/src/revwalk.c +434 -158
  162. data/ext/rugged/vendor/libgit2-dist/src/sha1.c +3 -3
  163. data/ext/rugged/vendor/libgit2-dist/src/sha1.h +2 -2
  164. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.c +3 -2
  165. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.h +1 -1
  166. data/ext/rugged/vendor/libgit2-dist/src/signature.c +69 -80
  167. data/ext/rugged/vendor/libgit2-dist/src/signature.h +1 -1
  168. data/ext/rugged/vendor/libgit2-dist/src/status.c +184 -638
  169. data/ext/rugged/vendor/libgit2-dist/src/strmap.h +64 -0
  170. data/ext/rugged/vendor/libgit2-dist/src/submodule.c +387 -0
  171. data/ext/rugged/vendor/libgit2-dist/src/tag.c +162 -137
  172. data/ext/rugged/vendor/libgit2-dist/src/tag.h +2 -1
  173. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.c +1 -1
  174. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.h +8 -8
  175. data/ext/rugged/vendor/libgit2-dist/src/transport.c +31 -19
  176. data/ext/rugged/vendor/libgit2-dist/src/transport.h +31 -11
  177. data/ext/rugged/vendor/libgit2-dist/src/transports/git.c +168 -193
  178. data/ext/rugged/vendor/libgit2-dist/src/transports/http.c +192 -241
  179. data/ext/rugged/vendor/libgit2-dist/src/transports/local.c +92 -86
  180. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.c +32 -49
  181. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.h +1 -1
  182. data/ext/rugged/vendor/libgit2-dist/src/tree.c +172 -145
  183. data/ext/rugged/vendor/libgit2-dist/src/tree.h +16 -2
  184. data/ext/rugged/vendor/libgit2-dist/src/tsort.c +16 -14
  185. data/ext/rugged/vendor/libgit2-dist/src/unix/map.c +8 -24
  186. data/ext/rugged/vendor/libgit2-dist/src/unix/posix.h +9 -3
  187. data/ext/rugged/vendor/libgit2-dist/src/util.c +94 -38
  188. data/ext/rugged/vendor/libgit2-dist/src/util.h +119 -13
  189. data/ext/rugged/vendor/libgit2-dist/src/vector.c +84 -31
  190. data/ext/rugged/vendor/libgit2-dist/src/vector.h +37 -4
  191. data/ext/rugged/vendor/libgit2-dist/src/win32/dir.c +81 -41
  192. data/ext/rugged/vendor/libgit2-dist/src/{dir.h → win32/dir.h} +4 -9
  193. data/ext/rugged/vendor/libgit2-dist/src/win32/map.c +19 -35
  194. data/ext/rugged/vendor/libgit2-dist/src/win32/mingw-compat.h +1 -1
  195. data/ext/rugged/vendor/libgit2-dist/src/win32/msvc-compat.h +5 -1
  196. data/ext/rugged/vendor/libgit2-dist/src/win32/posix.h +10 -8
  197. data/ext/rugged/vendor/libgit2-dist/src/win32/posix_w32.c +262 -118
  198. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.c +12 -9
  199. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.h +1 -1
  200. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.c +30 -26
  201. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.h +2 -1
  202. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiff.h +135 -0
  203. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.c +572 -0
  204. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xdiffi.h +63 -0
  205. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.c +253 -0
  206. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xemit.h +36 -0
  207. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xhistogram.c +371 -0
  208. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xinclude.h +46 -0
  209. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmacros.h +54 -0
  210. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xmerge.c +619 -0
  211. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xpatience.c +358 -0
  212. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.c +483 -0
  213. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xprepare.h +34 -0
  214. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xtypes.h +67 -0
  215. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.c +419 -0
  216. data/ext/rugged/vendor/libgit2-dist/src/xdiff/xutils.h +49 -0
  217. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/attr_expect.h +43 -0
  218. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/file.c +226 -0
  219. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/flags.c +108 -0
  220. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/lookup.c +262 -0
  221. data/ext/rugged/vendor/libgit2-dist/tests-clar/attr/repo.c +273 -0
  222. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/buf/basic.c +5 -5
  223. data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_helpers.c +181 -0
  224. data/ext/rugged/vendor/libgit2-dist/tests-clar/clar_libgit2.h +55 -0
  225. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/commit.c +44 -0
  226. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/parse.c +350 -0
  227. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/signature.c +65 -0
  228. data/ext/rugged/vendor/libgit2-dist/tests-clar/commit/write.c +140 -0
  229. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/add.c +3 -3
  230. data/ext/rugged/vendor/libgit2-dist/tests-clar/config/multivar.c +151 -0
  231. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/new.c +5 -5
  232. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/read.c +44 -32
  233. data/ext/rugged/vendor/libgit2-dist/tests-clar/config/stress.c +61 -0
  234. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/config/write.c +20 -5
  235. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/buffer.c +613 -0
  236. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/dirent.c +39 -26
  237. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/env.c +115 -0
  238. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/errors.c +60 -0
  239. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/filebuf.c +4 -18
  240. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/hex.c +22 -0
  241. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/oid.c +6 -6
  242. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/path.c +420 -0
  243. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/pool.c +85 -0
  244. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/rmdir.c +68 -0
  245. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/string.c +1 -1
  246. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/strmap.c +102 -0
  247. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/core/strtol.c +1 -1
  248. data/ext/rugged/vendor/libgit2-dist/tests-clar/core/vector.c +191 -0
  249. data/ext/rugged/vendor/libgit2-dist/tests-clar/date/date.c +15 -0
  250. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/blob.c +254 -0
  251. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.c +104 -0
  252. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/diff_helpers.h +47 -0
  253. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/index.c +92 -0
  254. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/iterator.c +572 -0
  255. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/patch.c +99 -0
  256. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/tree.c +210 -0
  257. data/ext/rugged/vendor/libgit2-dist/tests-clar/diff/workdir.c +543 -0
  258. data/ext/rugged/vendor/libgit2-dist/tests-clar/index/read_tree.c +46 -0
  259. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/index/rename.c +2 -12
  260. data/ext/rugged/vendor/libgit2-dist/tests-clar/index/tests.c +246 -0
  261. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/createremotethenload.c +33 -0
  262. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotelocal.c +137 -0
  263. data/ext/rugged/vendor/libgit2-dist/tests-clar/network/remotes.c +183 -0
  264. data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notes.c +133 -0
  265. data/ext/rugged/vendor/libgit2-dist/tests-clar/notes/notesref.c +57 -0
  266. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/filter.c +125 -0
  267. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/fromchunks.c +87 -0
  268. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/blob/write.c +69 -0
  269. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/commit/commitstagedfile.c +126 -0
  270. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/lookup.c +63 -0
  271. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/message.c +171 -0
  272. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/chars.c +3 -14
  273. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/compare.c +4 -4
  274. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/convert.c +10 -10
  275. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/data.h +0 -0
  276. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/fromstr.c +1 -1
  277. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/hash.c +21 -17
  278. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/short.c +1 -1
  279. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/size.c +1 -1
  280. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/raw/type2string.c +14 -14
  281. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/raw/write.c +455 -0
  282. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/peel.c +56 -0
  283. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/read.c +130 -0
  284. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tag/write.c +192 -0
  285. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/object/tree/frompath.c +22 -16
  286. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/read.c +75 -0
  287. data/ext/rugged/vendor/libgit2-dist/tests-clar/object/tree/write.c +84 -0
  288. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose.c +1 -1
  289. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/loose_data.h +0 -0
  290. data/ext/rugged/vendor/libgit2-dist/tests-clar/odb/mixed.c +24 -0
  291. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/pack_data.h +0 -0
  292. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/packed.c +1 -1
  293. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/odb/sorting.c +1 -1
  294. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/create.c +113 -0
  295. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/delete.c +91 -0
  296. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/listall.c +78 -0
  297. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/branches/move.c +72 -0
  298. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/crashes.c +17 -0
  299. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/create.c +149 -0
  300. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/delete.c +85 -0
  301. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/list.c +53 -0
  302. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/listall.c +36 -0
  303. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/lookup.c +42 -0
  304. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/normalize.c +200 -0
  305. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/overwrite.c +136 -0
  306. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/pack.c +67 -0
  307. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/read.c +194 -0
  308. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/reflog.c +123 -0
  309. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/rename.c +339 -0
  310. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/revparse.c +174 -0
  311. data/ext/rugged/vendor/libgit2-dist/tests-clar/refs/unicode.c +42 -0
  312. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/discover.c +142 -0
  313. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/repo/getters.c +19 -1
  314. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/init.c +235 -0
  315. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/open.c +282 -0
  316. data/ext/rugged/vendor/libgit2-dist/tests-clar/repo/setters.c +80 -0
  317. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/mixed.c +47 -0
  318. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.c +10 -0
  319. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/reset_helpers.h +6 -0
  320. data/ext/rugged/vendor/libgit2-dist/tests-clar/reset/soft.c +102 -0
  321. data/ext/rugged/vendor/libgit2-dist/{tests/t05-revwalk.c → tests-clar/revwalk/basic.c} +85 -44
  322. data/ext/rugged/vendor/libgit2-dist/tests-clar/revwalk/mergebase.c +148 -0
  323. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/ignore.c +133 -0
  324. data/ext/rugged/vendor/libgit2-dist/{tests-clay → tests-clar}/status/single.c +2 -11
  325. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_data.h +202 -0
  326. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.c +49 -0
  327. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/status_helpers.h +33 -0
  328. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/submodules.c +112 -0
  329. data/ext/rugged/vendor/libgit2-dist/tests-clar/status/worktree.c +649 -0
  330. data/ext/rugged/vendor/libgit2-dist/tests-clar/threads/basic.c +20 -0
  331. data/ext/rugged/vendor/libgit2-dist.tar.gz +0 -0
  332. data/lib/rugged/commit.rb +35 -0
  333. data/lib/rugged/object.rb +7 -0
  334. data/lib/rugged/reference.rb +9 -0
  335. data/lib/rugged/repository.rb +99 -3
  336. data/lib/rugged/tag.rb +22 -0
  337. data/lib/rugged/tree.rb +8 -0
  338. data/lib/rugged/version.rb +1 -1
  339. data/lib/rugged.rb +4 -1
  340. data/test/blob_test.rb +2 -2
  341. data/test/commit_test.rb +27 -13
  342. data/test/config_test.rb +44 -0
  343. data/test/coverage/HEAD.json +1 -1
  344. data/test/fixtures/testrepo.git/config +2 -0
  345. data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
  346. data/test/lib_test.rb +7 -0
  347. data/test/object_test.rb +3 -3
  348. data/test/reference_test.rb +46 -8
  349. data/test/remote_test.rb +8 -2
  350. data/test/repo_pack_test.rb +3 -3
  351. data/test/repo_test.rb +79 -11
  352. data/test/tag_test.rb +9 -2
  353. data/test/test_helper.rb +21 -0
  354. data/test/tree_test.rb +18 -6
  355. metadata +205 -81
  356. data/ext/rugged/vendor/libgit2-dist/include/git2/zlib.h +0 -40
  357. data/ext/rugged/vendor/libgit2-dist/src/hashtable.c +0 -243
  358. data/ext/rugged/vendor/libgit2-dist/src/hashtable.h +0 -80
  359. data/ext/rugged/vendor/libgit2-dist/tests/t00-core.c +0 -628
  360. data/ext/rugged/vendor/libgit2-dist/tests/t01-data.h +0 -322
  361. data/ext/rugged/vendor/libgit2-dist/tests/t01-rawobj.c +0 -638
  362. data/ext/rugged/vendor/libgit2-dist/tests/t03-data.h +0 -344
  363. data/ext/rugged/vendor/libgit2-dist/tests/t03-objwrite.c +0 -255
  364. data/ext/rugged/vendor/libgit2-dist/tests/t04-commit.c +0 -788
  365. data/ext/rugged/vendor/libgit2-dist/tests/t06-index.c +0 -219
  366. data/ext/rugged/vendor/libgit2-dist/tests/t07-hashtable.c +0 -192
  367. data/ext/rugged/vendor/libgit2-dist/tests/t08-tag.c +0 -357
  368. data/ext/rugged/vendor/libgit2-dist/tests/t09-tree.c +0 -221
  369. data/ext/rugged/vendor/libgit2-dist/tests/t10-refs.c +0 -1294
  370. data/ext/rugged/vendor/libgit2-dist/tests/t12-repo.c +0 -174
  371. data/ext/rugged/vendor/libgit2-dist/tests/t13-threads.c +0 -41
  372. data/ext/rugged/vendor/libgit2-dist/tests/t17-bufs.c +0 -61
  373. data/ext/rugged/vendor/libgit2-dist/tests/t18-status.c +0 -448
  374. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.c +0 -310
  375. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.h +0 -83
  376. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.c +0 -198
  377. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.h +0 -54
  378. data/ext/rugged/vendor/libgit2-dist/tests/test_main.c +0 -89
  379. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay.h +0 -187
  380. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_libgit2.h +0 -28
  381. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_main.c +0 -1073
  382. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/stress.c +0 -39
  383. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/path.c +0 -139
  384. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/rmdir.c +0 -50
  385. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/vector.c +0 -66
  386. data/ext/rugged/vendor/libgit2-dist/tests-clay/network/remotes.c +0 -50
  387. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/init.c +0 -104
  388. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/open.c +0 -54
  389. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/status_data.h +0 -48
  390. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/worktree.c +0 -124
  391. data/lib/rugged/objects.rb +0 -45
  392. data/test/fixtures/testrepo.git/refs/heads/new_name +0 -1
@@ -0,0 +1,609 @@
1
+ #include "common.h"
2
+ #include "repository.h"
3
+ #include "filebuf.h"
4
+ #include "git2/blob.h"
5
+ #include "git2/tree.h"
6
+ #include <ctype.h>
7
+
8
+ const char *git_attr__true = "[internal]__TRUE__";
9
+ const char *git_attr__false = "[internal]__FALSE__";
10
+ const char *git_attr__unset = "[internal]__UNSET__";
11
+
12
+ static int sort_by_hash_and_name(const void *a_raw, const void *b_raw);
13
+ static void git_attr_rule__clear(git_attr_rule *rule);
14
+
15
+ int git_attr_file__new(
16
+ git_attr_file **attrs_ptr,
17
+ git_attr_file_source from,
18
+ const char *path,
19
+ git_pool *pool)
20
+ {
21
+ git_attr_file *attrs = NULL;
22
+
23
+ attrs = git__calloc(1, sizeof(git_attr_file));
24
+ GITERR_CHECK_ALLOC(attrs);
25
+
26
+ if (pool)
27
+ attrs->pool = pool;
28
+ else {
29
+ attrs->pool = git__calloc(1, sizeof(git_pool));
30
+ if (!attrs->pool || git_pool_init(attrs->pool, 1, 0) < 0)
31
+ goto fail;
32
+ attrs->pool_is_allocated = true;
33
+ }
34
+
35
+ if (path) {
36
+ size_t len = strlen(path);
37
+
38
+ attrs->key = git_pool_malloc(attrs->pool, (uint32_t)len + 3);
39
+ GITERR_CHECK_ALLOC(attrs->key);
40
+
41
+ attrs->key[0] = '0' + from;
42
+ attrs->key[1] = '#';
43
+ memcpy(&attrs->key[2], path, len);
44
+ attrs->key[len + 2] = '\0';
45
+ }
46
+
47
+ if (git_vector_init(&attrs->rules, 4, NULL) < 0)
48
+ goto fail;
49
+
50
+ *attrs_ptr = attrs;
51
+ return 0;
52
+
53
+ fail:
54
+ git_attr_file__free(attrs);
55
+ attrs_ptr = NULL;
56
+ return -1;
57
+ }
58
+
59
+ int git_attr_file__parse_buffer(
60
+ git_repository *repo, const char *buffer, git_attr_file *attrs)
61
+ {
62
+ int error = 0;
63
+ const char *scan = NULL;
64
+ char *context = NULL;
65
+ git_attr_rule *rule = NULL;
66
+
67
+ assert(buffer && attrs);
68
+
69
+ scan = buffer;
70
+
71
+ /* if subdir file path, convert context for file paths */
72
+ if (attrs->key && git__suffixcmp(attrs->key, "/" GIT_ATTR_FILE) == 0) {
73
+ context = attrs->key + 2;
74
+ context[strlen(context) - strlen(GIT_ATTR_FILE)] = '\0';
75
+ }
76
+
77
+ while (!error && *scan) {
78
+ /* allocate rule if needed */
79
+ if (!rule && !(rule = git__calloc(1, sizeof(git_attr_rule)))) {
80
+ error = -1;
81
+ break;
82
+ }
83
+
84
+ /* parse the next "pattern attr attr attr" line */
85
+ if (!(error = git_attr_fnmatch__parse(
86
+ &rule->match, attrs->pool, context, &scan)) &&
87
+ !(error = git_attr_assignment__parse(
88
+ repo, attrs->pool, &rule->assigns, &scan)))
89
+ {
90
+ if (rule->match.flags & GIT_ATTR_FNMATCH_MACRO)
91
+ /* should generate error/warning if this is coming from any
92
+ * file other than .gitattributes at repo root.
93
+ */
94
+ error = git_attr_cache__insert_macro(repo, rule);
95
+ else
96
+ error = git_vector_insert(&attrs->rules, rule);
97
+ }
98
+
99
+ /* if the rule wasn't a pattern, on to the next */
100
+ if (error < 0) {
101
+ git_attr_rule__clear(rule); /* reset rule contents */
102
+ if (error == GIT_ENOTFOUND)
103
+ error = 0;
104
+ } else {
105
+ rule = NULL; /* vector now "owns" the rule */
106
+ }
107
+ }
108
+
109
+ git_attr_rule__free(rule);
110
+
111
+ /* restore file path used for context */
112
+ if (context)
113
+ context[strlen(context)] = '.'; /* first char of GIT_ATTR_FILE */
114
+
115
+ return error;
116
+ }
117
+
118
+ int git_attr_file__new_and_load(
119
+ git_attr_file **attrs_ptr,
120
+ const char *path)
121
+ {
122
+ int error;
123
+ git_buf content = GIT_BUF_INIT;
124
+
125
+ if ((error = git_attr_file__new(attrs_ptr, 0, path, NULL)) < 0)
126
+ return error;
127
+
128
+ if (!(error = git_futils_readbuffer(&content, path)))
129
+ error = git_attr_file__parse_buffer(
130
+ NULL, git_buf_cstr(&content), *attrs_ptr);
131
+
132
+ git_buf_free(&content);
133
+
134
+ if (error) {
135
+ git_attr_file__free(*attrs_ptr);
136
+ *attrs_ptr = NULL;
137
+ }
138
+
139
+ return error;
140
+ }
141
+
142
+ void git_attr_file__clear_rules(git_attr_file *file)
143
+ {
144
+ unsigned int i;
145
+ git_attr_rule *rule;
146
+
147
+ git_vector_foreach(&file->rules, i, rule)
148
+ git_attr_rule__free(rule);
149
+
150
+ git_vector_free(&file->rules);
151
+ }
152
+
153
+ void git_attr_file__free(git_attr_file *file)
154
+ {
155
+ if (!file)
156
+ return;
157
+
158
+ git_attr_file__clear_rules(file);
159
+
160
+ if (file->pool_is_allocated) {
161
+ git_pool_clear(file->pool);
162
+ git__free(file->pool);
163
+ }
164
+ file->pool = NULL;
165
+
166
+ git__free(file);
167
+ }
168
+
169
+ uint32_t git_attr_file__name_hash(const char *name)
170
+ {
171
+ uint32_t h = 5381;
172
+ int c;
173
+ assert(name);
174
+ while ((c = (int)*name++) != 0)
175
+ h = ((h << 5) + h) + c;
176
+ return h;
177
+ }
178
+
179
+
180
+ int git_attr_file__lookup_one(
181
+ git_attr_file *file,
182
+ const git_attr_path *path,
183
+ const char *attr,
184
+ const char **value)
185
+ {
186
+ unsigned int i;
187
+ git_attr_name name;
188
+ git_attr_rule *rule;
189
+
190
+ *value = NULL;
191
+
192
+ name.name = attr;
193
+ name.name_hash = git_attr_file__name_hash(attr);
194
+
195
+ git_attr_file__foreach_matching_rule(file, path, i, rule) {
196
+ int pos = git_vector_bsearch(&rule->assigns, &name);
197
+
198
+ if (pos >= 0) {
199
+ *value = ((git_attr_assignment *)
200
+ git_vector_get(&rule->assigns, pos))->value;
201
+ break;
202
+ }
203
+ }
204
+
205
+ return 0;
206
+ }
207
+
208
+
209
+ bool git_attr_fnmatch__match(
210
+ git_attr_fnmatch *match,
211
+ const git_attr_path *path)
212
+ {
213
+ int fnm;
214
+
215
+ if (match->flags & GIT_ATTR_FNMATCH_DIRECTORY && !path->is_dir)
216
+ return false;
217
+
218
+ if (match->flags & GIT_ATTR_FNMATCH_FULLPATH)
219
+ fnm = p_fnmatch(match->pattern, path->path, FNM_PATHNAME);
220
+ else if (path->is_dir)
221
+ fnm = p_fnmatch(match->pattern, path->basename, FNM_LEADING_DIR);
222
+ else
223
+ fnm = p_fnmatch(match->pattern, path->basename, 0);
224
+
225
+ return (fnm == FNM_NOMATCH) ? false : true;
226
+ }
227
+
228
+ bool git_attr_rule__match(
229
+ git_attr_rule *rule,
230
+ const git_attr_path *path)
231
+ {
232
+ bool matched = git_attr_fnmatch__match(&rule->match, path);
233
+
234
+ if (rule->match.flags & GIT_ATTR_FNMATCH_NEGATIVE)
235
+ matched = !matched;
236
+
237
+ return matched;
238
+ }
239
+
240
+
241
+ git_attr_assignment *git_attr_rule__lookup_assignment(
242
+ git_attr_rule *rule, const char *name)
243
+ {
244
+ int pos;
245
+ git_attr_name key;
246
+ key.name = name;
247
+ key.name_hash = git_attr_file__name_hash(name);
248
+
249
+ pos = git_vector_bsearch(&rule->assigns, &key);
250
+
251
+ return (pos >= 0) ? git_vector_get(&rule->assigns, pos) : NULL;
252
+ }
253
+
254
+ int git_attr_path__init(
255
+ git_attr_path *info, const char *path, const char *base)
256
+ {
257
+ /* build full path as best we can */
258
+ git_buf_init(&info->full, 0);
259
+
260
+ if (base != NULL && git_path_root(path) < 0) {
261
+ if (git_buf_joinpath(&info->full, base, path) < 0)
262
+ return -1;
263
+ info->path = info->full.ptr + strlen(base);
264
+ } else {
265
+ if (git_buf_sets(&info->full, path) < 0)
266
+ return -1;
267
+ info->path = info->full.ptr;
268
+ }
269
+
270
+ /* remove trailing slashes */
271
+ while (info->full.size > 0) {
272
+ if (info->full.ptr[info->full.size - 1] != '/')
273
+ break;
274
+ info->full.size--;
275
+ }
276
+ info->full.ptr[info->full.size] = '\0';
277
+
278
+ /* skip leading slashes in path */
279
+ while (*info->path == '/')
280
+ info->path++;
281
+
282
+ /* find trailing basename component */
283
+ info->basename = strrchr(info->path, '/');
284
+ if (info->basename)
285
+ info->basename++;
286
+ if (!info->basename || !*info->basename)
287
+ info->basename = info->path;
288
+
289
+ info->is_dir = (int)git_path_isdir(info->full.ptr);
290
+
291
+ return 0;
292
+ }
293
+
294
+ void git_attr_path__free(git_attr_path *info)
295
+ {
296
+ git_buf_free(&info->full);
297
+ info->path = NULL;
298
+ info->basename = NULL;
299
+ }
300
+
301
+
302
+ /*
303
+ * From gitattributes(5):
304
+ *
305
+ * Patterns have the following format:
306
+ *
307
+ * - A blank line matches no files, so it can serve as a separator for
308
+ * readability.
309
+ *
310
+ * - A line starting with # serves as a comment.
311
+ *
312
+ * - An optional prefix ! which negates the pattern; any matching file
313
+ * excluded by a previous pattern will become included again. If a negated
314
+ * pattern matches, this will override lower precedence patterns sources.
315
+ *
316
+ * - If the pattern ends with a slash, it is removed for the purpose of the
317
+ * following description, but it would only find a match with a directory. In
318
+ * other words, foo/ will match a directory foo and paths underneath it, but
319
+ * will not match a regular file or a symbolic link foo (this is consistent
320
+ * with the way how pathspec works in general in git).
321
+ *
322
+ * - If the pattern does not contain a slash /, git treats it as a shell glob
323
+ * pattern and checks for a match against the pathname without leading
324
+ * directories.
325
+ *
326
+ * - Otherwise, git treats the pattern as a shell glob suitable for consumption
327
+ * by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will
328
+ * not match a / in the pathname. For example, "Documentation/\*.html" matches
329
+ * "Documentation/git.html" but not "Documentation/ppc/ppc.html". A leading
330
+ * slash matches the beginning of the pathname; for example, "/\*.c" matches
331
+ * "cat-file.c" but not "mozilla-sha1/sha1.c".
332
+ */
333
+
334
+ /*
335
+ * This will return 0 if the spec was filled out,
336
+ * GIT_ENOTFOUND if the fnmatch does not require matching, or
337
+ * another error code there was an actual problem.
338
+ */
339
+ int git_attr_fnmatch__parse(
340
+ git_attr_fnmatch *spec,
341
+ git_pool *pool,
342
+ const char *source,
343
+ const char **base)
344
+ {
345
+ const char *pattern, *scan;
346
+ int slash_count, allow_space;
347
+
348
+ assert(spec && base && *base);
349
+
350
+ spec->flags = (spec->flags & GIT_ATTR_FNMATCH_ALLOWSPACE);
351
+ allow_space = (spec->flags != 0);
352
+
353
+ pattern = *base;
354
+
355
+ while (git__isspace(*pattern)) pattern++;
356
+ if (!*pattern || *pattern == '#') {
357
+ *base = git__next_line(pattern);
358
+ return GIT_ENOTFOUND;
359
+ }
360
+
361
+ if (*pattern == '[') {
362
+ if (strncmp(pattern, "[attr]", 6) == 0) {
363
+ spec->flags = spec->flags | GIT_ATTR_FNMATCH_MACRO;
364
+ pattern += 6;
365
+ }
366
+ /* else a character range like [a-e]* which is accepted */
367
+ }
368
+
369
+ if (*pattern == '!') {
370
+ spec->flags = spec->flags | GIT_ATTR_FNMATCH_NEGATIVE;
371
+ pattern++;
372
+ }
373
+
374
+ slash_count = 0;
375
+ for (scan = pattern; *scan != '\0'; ++scan) {
376
+ /* scan until (non-escaped) white space */
377
+ if (git__isspace(*scan) && *(scan - 1) != '\\') {
378
+ if (!allow_space || (*scan != ' ' && *scan != '\t'))
379
+ break;
380
+ }
381
+
382
+ if (*scan == '/') {
383
+ spec->flags = spec->flags | GIT_ATTR_FNMATCH_FULLPATH;
384
+ slash_count++;
385
+ if (pattern == scan)
386
+ pattern++;
387
+ }
388
+ /* remember if we see an unescaped wildcard in pattern */
389
+ else if (git__iswildcard(*scan) &&
390
+ (scan == pattern || (*(scan - 1) != '\\')))
391
+ spec->flags = spec->flags | GIT_ATTR_FNMATCH_HASWILD;
392
+ }
393
+
394
+ *base = scan;
395
+
396
+ spec->length = scan - pattern;
397
+
398
+ if (pattern[spec->length - 1] == '/') {
399
+ spec->length--;
400
+ spec->flags = spec->flags | GIT_ATTR_FNMATCH_DIRECTORY;
401
+ if (--slash_count <= 0)
402
+ spec->flags = spec->flags & ~GIT_ATTR_FNMATCH_FULLPATH;
403
+ }
404
+
405
+ if ((spec->flags & GIT_ATTR_FNMATCH_FULLPATH) != 0 &&
406
+ source != NULL && git_path_root(pattern) < 0)
407
+ {
408
+ size_t sourcelen = strlen(source);
409
+ /* given an unrooted fullpath match from a file inside a repo,
410
+ * prefix the pattern with the relative directory of the source file
411
+ */
412
+ spec->pattern = git_pool_malloc(
413
+ pool, (uint32_t)(sourcelen + spec->length + 1));
414
+ if (spec->pattern) {
415
+ memcpy(spec->pattern, source, sourcelen);
416
+ memcpy(spec->pattern + sourcelen, pattern, spec->length);
417
+ spec->length += sourcelen;
418
+ spec->pattern[spec->length] = '\0';
419
+ }
420
+ } else {
421
+ spec->pattern = git_pool_strndup(pool, pattern, spec->length);
422
+ }
423
+
424
+ if (!spec->pattern) {
425
+ *base = git__next_line(pattern);
426
+ return -1;
427
+ } else {
428
+ /* strip '\' that might have be used for internal whitespace */
429
+ char *to = spec->pattern;
430
+ for (scan = spec->pattern; *scan; to++, scan++) {
431
+ if (*scan == '\\')
432
+ scan++; /* skip '\' but include next char */
433
+ if (to != scan)
434
+ *to = *scan;
435
+ }
436
+ if (to != scan) {
437
+ *to = '\0';
438
+ spec->length = (to - spec->pattern);
439
+ }
440
+ }
441
+
442
+ return 0;
443
+ }
444
+
445
+ static int sort_by_hash_and_name(const void *a_raw, const void *b_raw)
446
+ {
447
+ const git_attr_name *a = a_raw;
448
+ const git_attr_name *b = b_raw;
449
+
450
+ if (b->name_hash < a->name_hash)
451
+ return 1;
452
+ else if (b->name_hash > a->name_hash)
453
+ return -1;
454
+ else
455
+ return strcmp(b->name, a->name);
456
+ }
457
+
458
+ static void git_attr_assignment__free(git_attr_assignment *assign)
459
+ {
460
+ /* name and value are stored in a git_pool associated with the
461
+ * git_attr_file, so they do not need to be freed here
462
+ */
463
+ assign->name = NULL;
464
+ assign->value = NULL;
465
+ git__free(assign);
466
+ }
467
+
468
+ static int merge_assignments(void **old_raw, void *new_raw)
469
+ {
470
+ git_attr_assignment **old = (git_attr_assignment **)old_raw;
471
+ git_attr_assignment *new = (git_attr_assignment *)new_raw;
472
+
473
+ GIT_REFCOUNT_DEC(*old, git_attr_assignment__free);
474
+ *old = new;
475
+ return GIT_EEXISTS;
476
+ }
477
+
478
+ int git_attr_assignment__parse(
479
+ git_repository *repo,
480
+ git_pool *pool,
481
+ git_vector *assigns,
482
+ const char **base)
483
+ {
484
+ int error;
485
+ const char *scan = *base;
486
+ git_attr_assignment *assign = NULL;
487
+
488
+ assert(assigns && !assigns->length);
489
+
490
+ assigns->_cmp = sort_by_hash_and_name;
491
+
492
+ while (*scan && *scan != '\n') {
493
+ const char *name_start, *value_start;
494
+
495
+ /* skip leading blanks */
496
+ while (git__isspace(*scan) && *scan != '\n') scan++;
497
+
498
+ /* allocate assign if needed */
499
+ if (!assign) {
500
+ assign = git__calloc(1, sizeof(git_attr_assignment));
501
+ GITERR_CHECK_ALLOC(assign);
502
+ GIT_REFCOUNT_INC(assign);
503
+ }
504
+
505
+ assign->name_hash = 5381;
506
+ assign->value = git_attr__true;
507
+
508
+ /* look for magic name prefixes */
509
+ if (*scan == '-') {
510
+ assign->value = git_attr__false;
511
+ scan++;
512
+ } else if (*scan == '!') {
513
+ assign->value = git_attr__unset; /* explicit unspecified state */
514
+ scan++;
515
+ } else if (*scan == '#') /* comment rest of line */
516
+ break;
517
+
518
+ /* find the name */
519
+ name_start = scan;
520
+ while (*scan && !git__isspace(*scan) && *scan != '=') {
521
+ assign->name_hash =
522
+ ((assign->name_hash << 5) + assign->name_hash) + *scan;
523
+ scan++;
524
+ }
525
+ if (scan == name_start) {
526
+ /* must have found lone prefix (" - ") or leading = ("=foo")
527
+ * or end of buffer -- advance until whitespace and continue
528
+ */
529
+ while (*scan && !git__isspace(*scan)) scan++;
530
+ continue;
531
+ }
532
+
533
+ /* allocate permanent storage for name */
534
+ assign->name = git_pool_strndup(pool, name_start, scan - name_start);
535
+ GITERR_CHECK_ALLOC(assign->name);
536
+
537
+ /* if there is an equals sign, find the value */
538
+ if (*scan == '=') {
539
+ for (value_start = ++scan; *scan && !git__isspace(*scan); ++scan);
540
+
541
+ /* if we found a value, allocate permanent storage for it */
542
+ if (scan > value_start) {
543
+ assign->value = git_pool_strndup(pool, value_start, scan - value_start);
544
+ GITERR_CHECK_ALLOC(assign->value);
545
+ }
546
+ }
547
+
548
+ /* expand macros (if given a repo with a macro cache) */
549
+ if (repo != NULL && assign->value == git_attr__true) {
550
+ git_attr_rule *macro =
551
+ git_attr_cache__lookup_macro(repo, assign->name);
552
+
553
+ if (macro != NULL) {
554
+ unsigned int i;
555
+ git_attr_assignment *massign;
556
+
557
+ git_vector_foreach(&macro->assigns, i, massign) {
558
+ GIT_REFCOUNT_INC(massign);
559
+
560
+ error = git_vector_insert_sorted(
561
+ assigns, massign, &merge_assignments);
562
+ if (error < 0 && error != GIT_EEXISTS)
563
+ return error;
564
+ }
565
+ }
566
+ }
567
+
568
+ /* insert allocated assign into vector */
569
+ error = git_vector_insert_sorted(assigns, assign, &merge_assignments);
570
+ if (error < 0 && error != GIT_EEXISTS)
571
+ return error;
572
+
573
+ /* clear assign since it is now "owned" by the vector */
574
+ assign = NULL;
575
+ }
576
+
577
+ if (assign != NULL)
578
+ git_attr_assignment__free(assign);
579
+
580
+ *base = git__next_line(scan);
581
+
582
+ return (assigns->length == 0) ? GIT_ENOTFOUND : 0;
583
+ }
584
+
585
+ static void git_attr_rule__clear(git_attr_rule *rule)
586
+ {
587
+ unsigned int i;
588
+ git_attr_assignment *assign;
589
+
590
+ if (!rule)
591
+ return;
592
+
593
+ if (!(rule->match.flags & GIT_ATTR_FNMATCH_IGNORE)) {
594
+ git_vector_foreach(&rule->assigns, i, assign)
595
+ GIT_REFCOUNT_DEC(assign, git_attr_assignment__free);
596
+ git_vector_free(&rule->assigns);
597
+ }
598
+
599
+ /* match.pattern is stored in a git_pool, so no need to free */
600
+ rule->match.pattern = NULL;
601
+ rule->match.length = 0;
602
+ }
603
+
604
+ void git_attr_rule__free(git_attr_rule *rule)
605
+ {
606
+ git_attr_rule__clear(rule);
607
+ git__free(rule);
608
+ }
609
+