rugged 0.1.2 → 0.16.0b1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) hide show
  1. data/README.md +25 -36
  2. data/Rakefile +20 -98
  3. data/ext/rugged/extconf.rb +44 -4
  4. data/ext/rugged/remote.c +215 -0
  5. data/ext/rugged/rugged.c +171 -0
  6. data/ext/rugged/rugged.h +126 -0
  7. data/ext/rugged/rugged_blob.c +99 -0
  8. data/ext/rugged/rugged_commit.c +224 -0
  9. data/ext/rugged/rugged_config.c +238 -0
  10. data/ext/rugged/rugged_index.c +440 -0
  11. data/ext/rugged/rugged_object.c +203 -0
  12. data/ext/rugged/rugged_reference.c +401 -0
  13. data/ext/rugged/rugged_repo.c +482 -0
  14. data/ext/rugged/rugged_revwalk.c +138 -0
  15. data/ext/rugged/rugged_signature.c +80 -0
  16. data/ext/rugged/rugged_tag.c +216 -0
  17. data/ext/rugged/rugged_tree.c +322 -0
  18. data/ext/rugged/vendor/libgit2-dist.tar.gz +0 -0
  19. data/ext/rugged/vendor/libgit2-dist/deps/http-parser/http_parser.c +1778 -0
  20. data/ext/rugged/vendor/libgit2-dist/deps/http-parser/http_parser.h +267 -0
  21. data/ext/rugged/vendor/libgit2-dist/deps/zlib/adler32.c +169 -0
  22. data/ext/rugged/vendor/libgit2-dist/deps/zlib/crc32.c +442 -0
  23. data/ext/rugged/vendor/libgit2-dist/deps/zlib/crc32.h +441 -0
  24. data/ext/rugged/vendor/libgit2-dist/deps/zlib/deflate.c +1834 -0
  25. data/ext/rugged/vendor/libgit2-dist/deps/zlib/deflate.h +342 -0
  26. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inffast.c +340 -0
  27. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inffast.h +11 -0
  28. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inffixed.h +94 -0
  29. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inflate.c +1480 -0
  30. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inflate.h +122 -0
  31. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inftrees.c +330 -0
  32. data/ext/rugged/vendor/libgit2-dist/deps/zlib/inftrees.h +62 -0
  33. data/ext/rugged/vendor/libgit2-dist/deps/zlib/trees.c +1244 -0
  34. data/ext/rugged/vendor/libgit2-dist/deps/zlib/trees.h +128 -0
  35. data/ext/rugged/vendor/libgit2-dist/deps/zlib/zconf.h +54 -0
  36. data/ext/rugged/vendor/libgit2-dist/deps/zlib/zlib.h +1613 -0
  37. data/ext/rugged/vendor/libgit2-dist/deps/zlib/zutil.c +318 -0
  38. data/ext/rugged/vendor/libgit2-dist/deps/zlib/zutil.h +274 -0
  39. data/ext/rugged/vendor/libgit2-dist/examples/general.c +451 -0
  40. data/ext/rugged/vendor/libgit2-dist/examples/network/common.h +14 -0
  41. data/ext/rugged/vendor/libgit2-dist/examples/network/fetch.c +97 -0
  42. data/ext/rugged/vendor/libgit2-dist/examples/network/git2.c +58 -0
  43. data/ext/rugged/vendor/libgit2-dist/examples/network/index-pack.c +47 -0
  44. data/ext/rugged/vendor/libgit2-dist/examples/network/ls-remote.c +76 -0
  45. data/ext/rugged/vendor/libgit2-dist/examples/showindex.c +43 -0
  46. data/ext/rugged/vendor/libgit2-dist/include/git2.h +44 -0
  47. data/ext/rugged/vendor/libgit2-dist/include/git2/blob.h +120 -0
  48. data/ext/rugged/vendor/libgit2-dist/include/git2/branch.h +15 -0
  49. data/ext/rugged/vendor/libgit2-dist/include/git2/commit.h +263 -0
  50. data/ext/rugged/vendor/libgit2-dist/include/git2/common.h +103 -0
  51. data/ext/rugged/vendor/libgit2-dist/include/git2/config.h +278 -0
  52. data/ext/rugged/vendor/libgit2-dist/include/git2/errors.h +144 -0
  53. data/ext/rugged/vendor/libgit2-dist/include/git2/index.h +306 -0
  54. data/ext/rugged/vendor/libgit2-dist/include/git2/indexer.h +76 -0
  55. data/ext/rugged/vendor/libgit2-dist/include/git2/inttypes.h +305 -0
  56. data/ext/rugged/vendor/libgit2-dist/include/git2/net.h +51 -0
  57. data/ext/rugged/vendor/libgit2-dist/include/git2/object.h +173 -0
  58. data/ext/rugged/vendor/libgit2-dist/include/git2/odb.h +331 -0
  59. data/ext/rugged/vendor/libgit2-dist/include/git2/odb_backend.h +100 -0
  60. data/ext/rugged/vendor/libgit2-dist/include/git2/oid.h +218 -0
  61. data/ext/rugged/vendor/libgit2-dist/include/git2/reflog.h +128 -0
  62. data/ext/rugged/vendor/libgit2-dist/include/git2/refs.h +309 -0
  63. data/ext/rugged/vendor/libgit2-dist/include/git2/refspec.h +60 -0
  64. data/ext/rugged/vendor/libgit2-dist/include/git2/remote.h +176 -0
  65. data/ext/rugged/vendor/libgit2-dist/include/git2/repository.h +290 -0
  66. data/ext/rugged/vendor/libgit2-dist/include/git2/revwalk.h +169 -0
  67. data/ext/rugged/vendor/libgit2-dist/include/git2/signature.h +65 -0
  68. data/ext/rugged/vendor/libgit2-dist/include/git2/status.h +63 -0
  69. data/ext/rugged/vendor/libgit2-dist/include/git2/stdint.h +247 -0
  70. data/ext/rugged/vendor/libgit2-dist/include/git2/tag.h +279 -0
  71. data/ext/rugged/vendor/libgit2-dist/include/git2/threads.h +48 -0
  72. data/ext/rugged/vendor/libgit2-dist/include/git2/tree.h +318 -0
  73. data/ext/rugged/vendor/libgit2-dist/include/git2/types.h +169 -0
  74. data/ext/rugged/vendor/libgit2-dist/include/git2/version.h +15 -0
  75. data/ext/rugged/vendor/libgit2-dist/include/git2/windows.h +59 -0
  76. data/ext/rugged/vendor/libgit2-dist/include/git2/zlib.h +40 -0
  77. data/ext/rugged/vendor/libgit2-dist/src/blob.c +135 -0
  78. data/ext/rugged/vendor/libgit2-dist/src/blob.h +23 -0
  79. data/ext/rugged/vendor/libgit2-dist/src/bswap.h +97 -0
  80. data/ext/rugged/vendor/libgit2-dist/src/buffer.c +113 -0
  81. data/ext/rugged/vendor/libgit2-dist/src/buffer.h +32 -0
  82. data/ext/rugged/vendor/libgit2-dist/src/cache.c +111 -0
  83. data/ext/rugged/vendor/libgit2-dist/src/cache.h +64 -0
  84. data/ext/rugged/vendor/libgit2-dist/src/cc-compat.h +67 -0
  85. data/ext/rugged/vendor/libgit2-dist/src/commit.c +299 -0
  86. data/ext/rugged/vendor/libgit2-dist/src/commit.h +34 -0
  87. data/ext/rugged/vendor/libgit2-dist/src/common.h +64 -0
  88. data/ext/rugged/vendor/libgit2-dist/src/config.c +418 -0
  89. data/ext/rugged/vendor/libgit2-dist/src/config.h +24 -0
  90. data/ext/rugged/vendor/libgit2-dist/src/config_file.c +1210 -0
  91. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.c +115 -0
  92. data/ext/rugged/vendor/libgit2-dist/src/delta-apply.h +33 -0
  93. data/ext/rugged/vendor/libgit2-dist/src/dir.h +47 -0
  94. data/ext/rugged/vendor/libgit2-dist/src/errors.c +104 -0
  95. data/ext/rugged/vendor/libgit2-dist/src/fetch.c +172 -0
  96. data/ext/rugged/vendor/libgit2-dist/src/fetch.h +18 -0
  97. data/ext/rugged/vendor/libgit2-dist/src/filebuf.c +400 -0
  98. data/ext/rugged/vendor/libgit2-dist/src/filebuf.h +72 -0
  99. data/ext/rugged/vendor/libgit2-dist/src/fileops.c +358 -0
  100. data/ext/rugged/vendor/libgit2-dist/src/fileops.h +151 -0
  101. data/ext/rugged/vendor/libgit2-dist/src/global.c +134 -0
  102. data/ext/rugged/vendor/libgit2-dist/src/global.h +24 -0
  103. data/ext/rugged/vendor/libgit2-dist/src/hash.c +74 -0
  104. data/ext/rugged/vendor/libgit2-dist/src/hash.h +29 -0
  105. data/ext/rugged/vendor/libgit2-dist/src/hashtable.c +243 -0
  106. data/ext/rugged/vendor/libgit2-dist/src/hashtable.h +80 -0
  107. data/ext/rugged/vendor/libgit2-dist/src/index.c +918 -0
  108. data/ext/rugged/vendor/libgit2-dist/src/index.h +34 -0
  109. data/ext/rugged/vendor/libgit2-dist/src/indexer.c +401 -0
  110. data/ext/rugged/vendor/libgit2-dist/src/map.h +37 -0
  111. data/ext/rugged/vendor/libgit2-dist/src/mwindow.c +272 -0
  112. data/ext/rugged/vendor/libgit2-dist/src/mwindow.h +45 -0
  113. data/ext/rugged/vendor/libgit2-dist/src/netops.c +198 -0
  114. data/ext/rugged/vendor/libgit2-dist/src/netops.h +36 -0
  115. data/ext/rugged/vendor/libgit2-dist/src/object.c +295 -0
  116. data/ext/rugged/vendor/libgit2-dist/src/odb.c +672 -0
  117. data/ext/rugged/vendor/libgit2-dist/src/odb.h +43 -0
  118. data/ext/rugged/vendor/libgit2-dist/src/odb_loose.c +855 -0
  119. data/ext/rugged/vendor/libgit2-dist/src/odb_pack.c +485 -0
  120. data/ext/rugged/vendor/libgit2-dist/src/oid.c +388 -0
  121. data/ext/rugged/vendor/libgit2-dist/src/pack.c +788 -0
  122. data/ext/rugged/vendor/libgit2-dist/src/pack.h +99 -0
  123. data/ext/rugged/vendor/libgit2-dist/src/path.c +270 -0
  124. data/ext/rugged/vendor/libgit2-dist/src/path.h +84 -0
  125. data/ext/rugged/vendor/libgit2-dist/src/pkt.c +426 -0
  126. data/ext/rugged/vendor/libgit2-dist/src/pkt.h +77 -0
  127. data/ext/rugged/vendor/libgit2-dist/src/posix.c +94 -0
  128. data/ext/rugged/vendor/libgit2-dist/src/posix.h +69 -0
  129. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.c +70 -0
  130. data/ext/rugged/vendor/libgit2-dist/src/ppc/sha1.h +26 -0
  131. data/ext/rugged/vendor/libgit2-dist/src/pqueue.c +141 -0
  132. data/ext/rugged/vendor/libgit2-dist/src/pqueue.h +81 -0
  133. data/ext/rugged/vendor/libgit2-dist/src/protocol.c +50 -0
  134. data/ext/rugged/vendor/libgit2-dist/src/protocol.h +23 -0
  135. data/ext/rugged/vendor/libgit2-dist/src/reflog.c +318 -0
  136. data/ext/rugged/vendor/libgit2-dist/src/reflog.h +34 -0
  137. data/ext/rugged/vendor/libgit2-dist/src/refs.c +1693 -0
  138. data/ext/rugged/vendor/libgit2-dist/src/refs.h +58 -0
  139. data/ext/rugged/vendor/libgit2-dist/src/refspec.c +95 -0
  140. data/ext/rugged/vendor/libgit2-dist/src/refspec.h +23 -0
  141. data/ext/rugged/vendor/libgit2-dist/src/remote.c +339 -0
  142. data/ext/rugged/vendor/libgit2-dist/src/remote.h +25 -0
  143. data/ext/rugged/vendor/libgit2-dist/src/repository.c +849 -0
  144. data/ext/rugged/vendor/libgit2-dist/src/repository.h +60 -0
  145. data/ext/rugged/vendor/libgit2-dist/src/revwalk.c +569 -0
  146. data/ext/rugged/vendor/libgit2-dist/src/sha1.c +280 -0
  147. data/ext/rugged/vendor/libgit2-dist/src/sha1.h +21 -0
  148. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.c +177 -0
  149. data/ext/rugged/vendor/libgit2-dist/src/sha1_lookup.h +18 -0
  150. data/ext/rugged/vendor/libgit2-dist/src/signature.c +335 -0
  151. data/ext/rugged/vendor/libgit2-dist/src/signature.h +18 -0
  152. data/ext/rugged/vendor/libgit2-dist/src/status.c +696 -0
  153. data/ext/rugged/vendor/libgit2-dist/src/tag.c +446 -0
  154. data/ext/rugged/vendor/libgit2-dist/src/tag.h +28 -0
  155. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.c +55 -0
  156. data/ext/rugged/vendor/libgit2-dist/src/thread-utils.h +108 -0
  157. data/ext/rugged/vendor/libgit2-dist/src/transport.c +85 -0
  158. data/ext/rugged/vendor/libgit2-dist/src/transport.h +110 -0
  159. data/ext/rugged/vendor/libgit2-dist/src/transports/git.c +502 -0
  160. data/ext/rugged/vendor/libgit2-dist/src/transports/http.c +756 -0
  161. data/ext/rugged/vendor/libgit2-dist/src/transports/local.c +235 -0
  162. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.c +201 -0
  163. data/ext/rugged/vendor/libgit2-dist/src/tree-cache.h +31 -0
  164. data/ext/rugged/vendor/libgit2-dist/src/tree.c +758 -0
  165. data/ext/rugged/vendor/libgit2-dist/src/tree.h +37 -0
  166. data/ext/rugged/vendor/libgit2-dist/src/tsort.c +365 -0
  167. data/ext/rugged/vendor/libgit2-dist/src/unix/map.c +70 -0
  168. data/ext/rugged/vendor/libgit2-dist/src/unix/posix.h +25 -0
  169. data/ext/rugged/vendor/libgit2-dist/src/util.c +381 -0
  170. data/ext/rugged/vendor/libgit2-dist/src/util.h +137 -0
  171. data/ext/rugged/vendor/libgit2-dist/src/vector.c +174 -0
  172. data/ext/rugged/vendor/libgit2-dist/src/vector.h +45 -0
  173. data/ext/rugged/vendor/libgit2-dist/src/win32/dir.c +115 -0
  174. data/ext/rugged/vendor/libgit2-dist/src/win32/fnmatch.c +180 -0
  175. data/ext/rugged/vendor/libgit2-dist/src/win32/fnmatch.h +27 -0
  176. data/ext/rugged/vendor/libgit2-dist/src/win32/map.c +131 -0
  177. data/ext/rugged/vendor/libgit2-dist/src/win32/mingw-compat.h +24 -0
  178. data/ext/rugged/vendor/libgit2-dist/src/win32/msvc-compat.h +38 -0
  179. data/ext/rugged/vendor/libgit2-dist/src/win32/posix.h +53 -0
  180. data/ext/rugged/vendor/libgit2-dist/src/win32/posix_w32.c +404 -0
  181. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.c +65 -0
  182. data/ext/rugged/vendor/libgit2-dist/src/win32/pthread.h +40 -0
  183. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.c +88 -0
  184. data/ext/rugged/vendor/libgit2-dist/src/win32/utf-conv.h +17 -0
  185. data/ext/rugged/vendor/libgit2-dist/tests-clay/buf/basic.c +29 -0
  186. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay.h +187 -0
  187. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_libgit2.h +28 -0
  188. data/ext/rugged/vendor/libgit2-dist/tests-clay/clay_main.c +1073 -0
  189. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/add.c +37 -0
  190. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/new.c +36 -0
  191. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/read.c +209 -0
  192. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/stress.c +39 -0
  193. data/ext/rugged/vendor/libgit2-dist/tests-clay/config/write.c +77 -0
  194. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/dirent.c +222 -0
  195. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/filebuf.c +106 -0
  196. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/oid.c +18 -0
  197. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/path.c +139 -0
  198. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/rmdir.c +50 -0
  199. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/string.c +28 -0
  200. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/strtol.c +37 -0
  201. data/ext/rugged/vendor/libgit2-dist/tests-clay/core/vector.c +66 -0
  202. data/ext/rugged/vendor/libgit2-dist/tests-clay/index/rename.c +60 -0
  203. data/ext/rugged/vendor/libgit2-dist/tests-clay/network/remotes.c +50 -0
  204. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/chars.c +52 -0
  205. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/compare.c +124 -0
  206. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/convert.c +75 -0
  207. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/data.h +323 -0
  208. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/fromstr.c +30 -0
  209. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/hash.c +162 -0
  210. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/short.c +94 -0
  211. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/size.c +13 -0
  212. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/raw/type2string.c +54 -0
  213. data/ext/rugged/vendor/libgit2-dist/tests-clay/object/tree/frompath.c +75 -0
  214. data/ext/rugged/vendor/libgit2-dist/tests-clay/odb/loose.c +84 -0
  215. data/ext/rugged/vendor/libgit2-dist/tests-clay/odb/loose_data.h +522 -0
  216. data/ext/rugged/vendor/libgit2-dist/tests-clay/odb/pack_data.h +151 -0
  217. data/ext/rugged/vendor/libgit2-dist/tests-clay/odb/packed.c +78 -0
  218. data/ext/rugged/vendor/libgit2-dist/tests-clay/odb/sorting.c +71 -0
  219. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/getters.c +68 -0
  220. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/init.c +104 -0
  221. data/ext/rugged/vendor/libgit2-dist/tests-clay/repo/open.c +54 -0
  222. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/single.c +38 -0
  223. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/status_data.h +48 -0
  224. data/ext/rugged/vendor/libgit2-dist/tests-clay/status/worktree.c +124 -0
  225. data/ext/rugged/vendor/libgit2-dist/tests/t00-core.c +628 -0
  226. data/ext/rugged/vendor/libgit2-dist/tests/t01-data.h +322 -0
  227. data/ext/rugged/vendor/libgit2-dist/tests/t01-rawobj.c +638 -0
  228. data/ext/rugged/vendor/libgit2-dist/tests/t03-data.h +344 -0
  229. data/ext/rugged/vendor/libgit2-dist/tests/t03-objwrite.c +255 -0
  230. data/ext/rugged/vendor/libgit2-dist/tests/t04-commit.c +788 -0
  231. data/ext/rugged/vendor/libgit2-dist/tests/t05-revwalk.c +140 -0
  232. data/ext/rugged/vendor/libgit2-dist/tests/t06-index.c +219 -0
  233. data/ext/rugged/vendor/libgit2-dist/tests/t07-hashtable.c +192 -0
  234. data/ext/rugged/vendor/libgit2-dist/tests/t08-tag.c +357 -0
  235. data/ext/rugged/vendor/libgit2-dist/tests/t09-tree.c +221 -0
  236. data/ext/rugged/vendor/libgit2-dist/tests/t10-refs.c +1294 -0
  237. data/ext/rugged/vendor/libgit2-dist/tests/t12-repo.c +174 -0
  238. data/ext/rugged/vendor/libgit2-dist/tests/t13-threads.c +41 -0
  239. data/ext/rugged/vendor/libgit2-dist/tests/t17-bufs.c +61 -0
  240. data/ext/rugged/vendor/libgit2-dist/tests/t18-status.c +448 -0
  241. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.c +310 -0
  242. data/ext/rugged/vendor/libgit2-dist/tests/test_helpers.h +83 -0
  243. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.c +198 -0
  244. data/ext/rugged/vendor/libgit2-dist/tests/test_lib.h +54 -0
  245. data/ext/rugged/vendor/libgit2-dist/tests/test_main.c +89 -0
  246. data/lib/rugged.rb +4 -3
  247. data/lib/rugged/index.rb +0 -8
  248. data/lib/rugged/objects.rb +45 -0
  249. data/lib/rugged/repository.rb +29 -0
  250. data/lib/rugged/tree.rb +16 -6
  251. data/lib/rugged/version.rb +1 -1
  252. data/lib/rugged/walker.rb +5 -0
  253. data/test/blob_test.rb +18 -14
  254. data/test/commit_test.rb +28 -26
  255. data/test/coverage/HEAD.json +1 -0
  256. data/test/coverage/cover.rb +106 -0
  257. data/test/fixtures/testrepo.git/refs/heads/new_name +1 -0
  258. data/test/index_test.rb +101 -78
  259. data/test/lib_test.rb +4 -4
  260. data/test/object_test.rb +3 -3
  261. data/test/reference_test.rb +75 -0
  262. data/test/remote_test.rb +19 -0
  263. data/test/repo_pack_test.rb +4 -4
  264. data/test/repo_test.rb +44 -15
  265. data/test/tag_test.rb +7 -17
  266. data/test/test_helper.rb +24 -5
  267. data/test/tree_test.rb +30 -12
  268. data/test/walker_test.rb +40 -31
  269. metadata +273 -50
  270. data/lib/rugged/person.rb +0 -20
  271. data/lib/rugged/tree_entry.rb +0 -9
  272. data/test/fixtures/testrepo.git/objects/1d/83f106355e4309a293e42ad2a2c4b8bdbe77ae +0 -0
  273. data/test/fixtures/testrepo.git/objects/2f/3321418db5b2a841375b8b70880a8ab5a4148f +0 -0
  274. data/test/fixtures/testrepo.git/objects/36/9b00a7700cca3a506d79e301d6ad8bf735d9ee +0 -3
  275. data/test/fixtures/testrepo.git/objects/3d/b1b5ceace59ff65279757003763046fd4cbbe6 +0 -0
  276. data/test/fixtures/testrepo.git/objects/4c/d1604907792e2c43e03dcec1216f99d63e68c4 +0 -3
  277. data/test/fixtures/testrepo.git/objects/e0/f46d77041c149296549b01ed4a18b02c4b7400 +0 -0
@@ -0,0 +1,788 @@
1
+ /*
2
+ * This file is free software; you can redistribute it and/or modify
3
+ * it under the terms of the GNU General Public License, version 2,
4
+ * as published by the Free Software Foundation.
5
+ *
6
+ * In addition to the permissions in the GNU General Public License,
7
+ * the authors give you unlimited permission to link the compiled
8
+ * version of this file into combinations with other programs,
9
+ * and to distribute those combinations without any restriction
10
+ * coming from the use of this file. (The General Public License
11
+ * restrictions do apply in other respects; for example, they cover
12
+ * modification of the file, and distribution when not linked into
13
+ * a combined executable.)
14
+ *
15
+ * This file is distributed in the hope that it will be useful, but
16
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
+ * General Public License for more details.
19
+ *
20
+ * You should have received a copy of the GNU General Public License
21
+ * along with this program; see the file COPYING. If not, write to
22
+ * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
23
+ * Boston, MA 02110-1301, USA.
24
+ */
25
+ #include "test_lib.h"
26
+ #include "test_helpers.h"
27
+
28
+ #include "commit.h"
29
+ #include "signature.h"
30
+
31
+ static char *test_commits_broken[] = {
32
+
33
+ /* empty commit */
34
+ "",
35
+
36
+ /* random garbage */
37
+ "asd97sa9du902e9a0jdsuusad09as9du098709aweu8987sd\n",
38
+
39
+ /* broken endlines 1 */
40
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\r\n\
41
+ parent 05452d6349abcd67aa396dfb28660d765d8b2a36\r\n\
42
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\r\n\
43
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\r\n\
44
+ \r\n\
45
+ a test commit with broken endlines\r\n",
46
+
47
+ /* broken endlines 2 */
48
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\
49
+ parent 05452d6349abcd67aa396dfb28660d765d8b2a36\
50
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\
51
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\
52
+ \
53
+ another test commit with broken endlines",
54
+
55
+ /* starting endlines */
56
+ "\ntree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
57
+ parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n\
58
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
59
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
60
+ \n\
61
+ a test commit with a starting endline\n",
62
+
63
+ /* corrupted commit 1 */
64
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
65
+ parent 05452d6349abcd67aa396df",
66
+
67
+ /* corrupted commit 2 */
68
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
69
+ parent ",
70
+
71
+ /* corrupted commit 3 */
72
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
73
+ parent ",
74
+
75
+ /* corrupted commit 4 */
76
+ "tree f6c0dad3c7b3481caa9d73db21f91964894a945b\n\
77
+ par",
78
+
79
+ };
80
+
81
+
82
+ static char *test_commits_working[] = {
83
+ /* simple commit with no message */
84
+ "tree 1810dff58d8a660512d4832e740f692884338ccd\n\
85
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
86
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
87
+ \n",
88
+
89
+ /* simple commit, no parent */
90
+ "tree 1810dff58d8a660512d4832e740f692884338ccd\n\
91
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
92
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
93
+ \n\
94
+ a simple commit which works\n",
95
+
96
+ /* simple commit, no parent, no newline in message */
97
+ "tree 1810dff58d8a660512d4832e740f692884338ccd\n\
98
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
99
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
100
+ \n\
101
+ a simple commit which works",
102
+
103
+ /* simple commit, 1 parent */
104
+ "tree 1810dff58d8a660512d4832e740f692884338ccd\n\
105
+ parent e90810b8df3e80c413d903f631643c716887138d\n\
106
+ author Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
107
+ committer Vicent Marti <tanoku@gmail.com> 1273848544 +0200\n\
108
+ \n\
109
+ a simple commit which works\n",
110
+ };
111
+
112
+ BEGIN_TEST(parse0, "parse the OID line in a commit")
113
+
114
+ git_oid oid;
115
+
116
+ #define TEST_OID_PASS(string, header) { \
117
+ const char *ptr = string;\
118
+ const char *ptr_original = ptr;\
119
+ size_t len = strlen(ptr);\
120
+ must_pass(git_oid__parse(&oid, &ptr, ptr + len, header));\
121
+ must_be_true(ptr == ptr_original + len);\
122
+ }
123
+
124
+ #define TEST_OID_FAIL(string, header) { \
125
+ const char *ptr = string;\
126
+ size_t len = strlen(ptr);\
127
+ must_fail(git_oid__parse(&oid, &ptr, ptr + len, header));\
128
+ }
129
+
130
+ TEST_OID_PASS("parent 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "parent ");
131
+ TEST_OID_PASS("tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
132
+ TEST_OID_PASS("random_heading 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "random_heading ");
133
+ TEST_OID_PASS("stuck_heading05452d6349abcd67aa396dfb28660d765d8b2a36\n", "stuck_heading");
134
+ TEST_OID_PASS("tree 5F4BEFFC0759261D015AA63A3A85613FF2F235DE\n", "tree ");
135
+ TEST_OID_PASS("tree 1A669B8AB81B5EB7D9DB69562D34952A38A9B504\n", "tree ");
136
+ TEST_OID_PASS("tree 5B20DCC6110FCC75D31C6CEDEBD7F43ECA65B503\n", "tree ");
137
+ TEST_OID_PASS("tree 173E7BF00EA5C33447E99E6C1255954A13026BE4\n", "tree ");
138
+
139
+ TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb28660d765d8b2a36", "parent ");
140
+ TEST_OID_FAIL("05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
141
+ TEST_OID_FAIL("parent05452d6349abcd67aa396dfb28660d765d8b2a6a\n", "parent ");
142
+ TEST_OID_FAIL("parent 05452d6349abcd67aa396dfb280d765d8b2a6\n", "parent ");
143
+ TEST_OID_FAIL("tree 05452d6349abcd67aa396dfb28660d765d8b2a36\n", "tree ");
144
+ TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36\n", "parent ");
145
+ TEST_OID_FAIL("parent 0545xd6349abcd67aa396dfb28660d765d8b2a36FF\n", "parent ");
146
+ TEST_OID_FAIL("", "tree ");
147
+ TEST_OID_FAIL("", "");
148
+
149
+ #undef TEST_OID_PASS
150
+ #undef TEST_OID_FAIL
151
+
152
+ END_TEST
153
+
154
+ BEGIN_TEST(parse1, "parse the signature line in a commit")
155
+
156
+ #define TEST_SIGNATURE_PASS(_string, _header, _name, _email, _time, _offset) { \
157
+ const char *ptr = _string; \
158
+ size_t len = strlen(_string);\
159
+ git_signature person = {NULL, NULL, {0, 0}}; \
160
+ must_pass(git_signature__parse(&person, &ptr, ptr + len, _header, '\n'));\
161
+ must_be_true(strcmp(_name, person.name) == 0);\
162
+ must_be_true(strcmp(_email, person.email) == 0);\
163
+ must_be_true(_time == person.when.time);\
164
+ must_be_true(_offset == person.when.offset);\
165
+ git__free(person.name); git__free(person.email);\
166
+ }
167
+
168
+ #define TEST_SIGNATURE_FAIL(_string, _header) { \
169
+ const char *ptr = _string; \
170
+ size_t len = strlen(_string);\
171
+ git_signature person = {NULL, NULL, {0, 0}}; \
172
+ must_fail(git_signature__parse(&person, &ptr, ptr + len, _header, '\n'));\
173
+ git__free(person.name); git__free(person.email);\
174
+ }
175
+
176
+ TEST_SIGNATURE_PASS(
177
+ "author Vicent Marti <tanoku@gmail.com> 12345 \n",
178
+ "author ",
179
+ "Vicent Marti",
180
+ "tanoku@gmail.com",
181
+ 12345,
182
+ 0);
183
+
184
+ TEST_SIGNATURE_PASS(
185
+ "author Vicent Marti <> 12345 \n",
186
+ "author ",
187
+ "Vicent Marti",
188
+ "",
189
+ 12345,
190
+ 0);
191
+
192
+ TEST_SIGNATURE_PASS(
193
+ "author Vicent Marti <tanoku@gmail.com> 231301 +1020\n",
194
+ "author ",
195
+ "Vicent Marti",
196
+ "tanoku@gmail.com",
197
+ 231301,
198
+ 620);
199
+
200
+ TEST_SIGNATURE_PASS(
201
+ "author Vicent Marti with an outrageously long name \
202
+ which will probably overflow the buffer <tanoku@gmail.com> 12345 \n",
203
+ "author ",
204
+ "Vicent Marti with an outrageously long name \
205
+ which will probably overflow the buffer",
206
+ "tanoku@gmail.com",
207
+ 12345,
208
+ 0);
209
+
210
+ TEST_SIGNATURE_PASS(
211
+ "author Vicent Marti <tanokuwithaveryveryverylongemail\
212
+ whichwillprobablyvoverflowtheemailbuffer@gmail.com> 12345 \n",
213
+ "author ",
214
+ "Vicent Marti",
215
+ "tanokuwithaveryveryverylongemail\
216
+ whichwillprobablyvoverflowtheemailbuffer@gmail.com",
217
+ 12345,
218
+ 0);
219
+
220
+ TEST_SIGNATURE_PASS(
221
+ "committer Vicent Marti <tanoku@gmail.com> 123456 +0000 \n",
222
+ "committer ",
223
+ "Vicent Marti",
224
+ "tanoku@gmail.com",
225
+ 123456,
226
+ 0);
227
+
228
+ TEST_SIGNATURE_PASS(
229
+ "committer Vicent Marti <tanoku@gmail.com> 123456 +0100 \n",
230
+ "committer ",
231
+ "Vicent Marti",
232
+ "tanoku@gmail.com",
233
+ 123456,
234
+ 60);
235
+
236
+ TEST_SIGNATURE_PASS(
237
+ "committer Vicent Marti <tanoku@gmail.com> 123456 -0100 \n",
238
+ "committer ",
239
+ "Vicent Marti",
240
+ "tanoku@gmail.com",
241
+ 123456,
242
+ -60);
243
+
244
+ /* Parse a signature without an author field */
245
+ TEST_SIGNATURE_PASS(
246
+ "committer <tanoku@gmail.com> 123456 -0100 \n",
247
+ "committer ",
248
+ "",
249
+ "tanoku@gmail.com",
250
+ 123456,
251
+ -60);
252
+
253
+ /* Parse a signature without an author field */
254
+ TEST_SIGNATURE_PASS(
255
+ "committer <tanoku@gmail.com> 123456 -0100 \n",
256
+ "committer ",
257
+ "",
258
+ "tanoku@gmail.com",
259
+ 123456,
260
+ -60);
261
+
262
+ /* Parse a signature with an empty author field */
263
+ TEST_SIGNATURE_PASS(
264
+ "committer <tanoku@gmail.com> 123456 -0100 \n",
265
+ "committer ",
266
+ "",
267
+ "tanoku@gmail.com",
268
+ 123456,
269
+ -60);
270
+
271
+ /* Parse a signature with an empty email field */
272
+ TEST_SIGNATURE_PASS(
273
+ "committer Vicent Marti <> 123456 -0100 \n",
274
+ "committer ",
275
+ "Vicent Marti",
276
+ "",
277
+ 123456,
278
+ -60);
279
+
280
+ /* Parse a signature with an empty email field */
281
+ TEST_SIGNATURE_PASS(
282
+ "committer Vicent Marti < > 123456 -0100 \n",
283
+ "committer ",
284
+ "Vicent Marti",
285
+ "",
286
+ 123456,
287
+ -60);
288
+
289
+ /* Parse a signature with empty name and email */
290
+ TEST_SIGNATURE_PASS(
291
+ "committer <> 123456 -0100 \n",
292
+ "committer ",
293
+ "",
294
+ "",
295
+ 123456,
296
+ -60);
297
+
298
+ /* Parse a signature with empty name and email */
299
+ TEST_SIGNATURE_PASS(
300
+ "committer <> 123456 -0100 \n",
301
+ "committer ",
302
+ "",
303
+ "",
304
+ 123456,
305
+ -60);
306
+
307
+ /* Parse a signature with empty name and email */
308
+ TEST_SIGNATURE_PASS(
309
+ "committer < > 123456 -0100 \n",
310
+ "committer ",
311
+ "",
312
+ "",
313
+ 123456,
314
+ -60);
315
+
316
+ /* Parse an obviously invalid signature */
317
+ TEST_SIGNATURE_PASS(
318
+ "committer foo<@bar> 123456 -0100 \n",
319
+ "committer ",
320
+ "foo",
321
+ "@bar",
322
+ 123456,
323
+ -60);
324
+
325
+ /* Parse an obviously invalid signature */
326
+ TEST_SIGNATURE_PASS(
327
+ "committer foo<@bar>123456 -0100 \n",
328
+ "committer ",
329
+ "foo",
330
+ "@bar",
331
+ 123456,
332
+ -60);
333
+
334
+ /* Parse an obviously invalid signature */
335
+ TEST_SIGNATURE_PASS(
336
+ "committer <>\n",
337
+ "committer ",
338
+ "",
339
+ "",
340
+ 0,
341
+ 0);
342
+
343
+ TEST_SIGNATURE_PASS(
344
+ "committer Vicent Marti <tanoku@gmail.com> 123456 -1500 \n",
345
+ "committer ",
346
+ "Vicent Marti",
347
+ "tanoku@gmail.com",
348
+ 0,
349
+ 0);
350
+
351
+ TEST_SIGNATURE_PASS(
352
+ "committer Vicent Marti <tanoku@gmail.com> 123456 +0163 \n",
353
+ "committer ",
354
+ "Vicent Marti",
355
+ "tanoku@gmail.com",
356
+ 0,
357
+ 0);
358
+
359
+ TEST_SIGNATURE_PASS(
360
+ "author Vicent Marti <tanoku@gmail.com> notime \n",
361
+ "author ",
362
+ "Vicent Marti",
363
+ "tanoku@gmail.com",
364
+ 0,
365
+ 0);
366
+
367
+ TEST_SIGNATURE_PASS(
368
+ "author Vicent Marti <tanoku@gmail.com> 123456 notimezone \n",
369
+ "author ",
370
+ "Vicent Marti",
371
+ "tanoku@gmail.com",
372
+ 0,
373
+ 0);
374
+
375
+ TEST_SIGNATURE_PASS(
376
+ "author Vicent Marti <tanoku@gmail.com> notime +0100\n",
377
+ "author ",
378
+ "Vicent Marti",
379
+ "tanoku@gmail.com",
380
+ 0,
381
+ 0);
382
+
383
+ TEST_SIGNATURE_PASS(
384
+ "author Vicent Marti <tanoku@gmail.com>\n",
385
+ "author ",
386
+ "Vicent Marti",
387
+ "tanoku@gmail.com",
388
+ 0,
389
+ 0);
390
+
391
+ TEST_SIGNATURE_PASS(
392
+ "author A U Thor <author@example.com>, C O. Miter <comiter@example.com> 1234567890 -0700\n",
393
+ "author ",
394
+ "A U Thor",
395
+ "author@example.com",
396
+ 1234567890,
397
+ -420);
398
+
399
+ TEST_SIGNATURE_PASS(
400
+ "author A U Thor <author@example.com> and others 1234567890 -0700\n",
401
+ "author ",
402
+ "A U Thor",
403
+ "author@example.com",
404
+ 1234567890,
405
+ -420);
406
+
407
+ TEST_SIGNATURE_PASS(
408
+ "author A U Thor <author@example.com> and others 1234567890\n",
409
+ "author ",
410
+ "A U Thor",
411
+ "author@example.com",
412
+ 1234567890,
413
+ 0);
414
+
415
+ TEST_SIGNATURE_PASS(
416
+ "author A U Thor> <author@example.com> and others 1234567890\n",
417
+ "author ",
418
+ "A U Thor>",
419
+ "author@example.com",
420
+ 1234567890,
421
+ 0);
422
+
423
+ TEST_SIGNATURE_FAIL(
424
+ "committer Vicent Marti tanoku@gmail.com> 123456 -0100 \n",
425
+ "committer ");
426
+
427
+ TEST_SIGNATURE_FAIL(
428
+ "author Vicent Marti <tanoku@gmail.com> 12345 \n",
429
+ "author ");
430
+
431
+ TEST_SIGNATURE_FAIL(
432
+ "author Vicent Marti <tanoku@gmail.com> 12345 \n",
433
+ "committer ");
434
+
435
+ TEST_SIGNATURE_FAIL(
436
+ "author Vicent Marti 12345 \n",
437
+ "author ");
438
+
439
+ TEST_SIGNATURE_FAIL(
440
+ "author Vicent Marti <broken@email 12345 \n",
441
+ "author ");
442
+
443
+ TEST_SIGNATURE_FAIL(
444
+ "committer Vicent Marti ><\n",
445
+ "committer ");
446
+
447
+ TEST_SIGNATURE_FAIL(
448
+ "author ",
449
+ "author ");
450
+
451
+ #undef TEST_SIGNATURE_PASS
452
+ #undef TEST_SIGNATURE_FAIL
453
+
454
+ END_TEST
455
+
456
+ static int try_build_signature(const char *name, const char *email, git_time_t time, int offset)
457
+ {
458
+ git_signature *sign;
459
+ int error = GIT_SUCCESS;
460
+
461
+ if ((error = git_signature_new(&sign, name, email, time, offset)) < GIT_SUCCESS)
462
+ return error;
463
+
464
+ git_signature_free((git_signature *)sign);
465
+
466
+ return error;
467
+ }
468
+
469
+ BEGIN_TEST(signature0, "creating a signature trims leading and trailing spaces")
470
+ git_signature *sign;
471
+ must_pass(git_signature_new(&sign, " nulltoken ", " emeric.fermas@gmail.com ", 1234567890, 60));
472
+ must_be_true(strcmp(sign->name, "nulltoken") == 0);
473
+ must_be_true(strcmp(sign->email, "emeric.fermas@gmail.com") == 0);
474
+ git_signature_free((git_signature *)sign);
475
+ END_TEST
476
+
477
+ BEGIN_TEST(signature1, "can not create a signature with empty name or email")
478
+ must_pass(try_build_signature("nulltoken", "emeric.fermas@gmail.com", 1234567890, 60));
479
+
480
+ must_fail(try_build_signature("", "emeric.fermas@gmail.com", 1234567890, 60));
481
+ must_fail(try_build_signature(" ", "emeric.fermas@gmail.com", 1234567890, 60));
482
+ must_fail(try_build_signature("nulltoken", "", 1234567890, 60));
483
+ must_fail(try_build_signature("nulltoken", " ", 1234567890, 60));
484
+ END_TEST
485
+
486
+ BEGIN_TEST(signature2, "creating a one character signature")
487
+ git_signature *sign;
488
+ must_pass(git_signature_new(&sign, "x", "foo@bar.baz", 1234567890, 60));
489
+ must_be_true(strcmp(sign->name, "x") == 0);
490
+ must_be_true(strcmp(sign->email, "foo@bar.baz") == 0);
491
+ git_signature_free((git_signature *)sign);
492
+ END_TEST
493
+
494
+ BEGIN_TEST(signature3, "creating a two character signature")
495
+ git_signature *sign;
496
+ must_pass(git_signature_new(&sign, "xx", "x@y.z", 1234567890, 60));
497
+ must_be_true(strcmp(sign->name, "xx") == 0);
498
+ must_be_true(strcmp(sign->email, "x@y.z") == 0);
499
+ git_signature_free((git_signature *)sign);
500
+ END_TEST
501
+
502
+ BEGIN_TEST(signature4, "creating a zero character signature")
503
+ git_signature *sign;
504
+ must_fail(git_signature_new(&sign, "", "x@y.z", 1234567890, 60));
505
+ must_be_true(sign == NULL);
506
+ END_TEST
507
+
508
+
509
+ BEGIN_TEST(parse2, "parse a whole commit buffer")
510
+ const int broken_commit_count = sizeof(test_commits_broken) / sizeof(*test_commits_broken);
511
+ const int working_commit_count = sizeof(test_commits_working) / sizeof(*test_commits_working);
512
+
513
+ int i;
514
+ git_repository *repo;
515
+
516
+ must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
517
+
518
+ for (i = 0; i < broken_commit_count; ++i) {
519
+ git_commit *commit;
520
+ commit = git__malloc(sizeof(git_commit));
521
+ memset(commit, 0x0, sizeof(git_commit));
522
+ commit->object.repo = repo;
523
+
524
+ must_fail(git_commit__parse_buffer(
525
+ commit,
526
+ test_commits_broken[i],
527
+ strlen(test_commits_broken[i]))
528
+ );
529
+
530
+ git_commit__free(commit);
531
+ }
532
+
533
+ for (i = 0; i < working_commit_count; ++i) {
534
+ git_commit *commit;
535
+
536
+ commit = git__malloc(sizeof(git_commit));
537
+ memset(commit, 0x0, sizeof(git_commit));
538
+ commit->object.repo = repo;
539
+
540
+ must_pass(git_commit__parse_buffer(
541
+ commit,
542
+ test_commits_working[i],
543
+ strlen(test_commits_working[i]))
544
+ );
545
+
546
+ git_commit__free(commit);
547
+
548
+ commit = git__malloc(sizeof(git_commit));
549
+ memset(commit, 0x0, sizeof(git_commit));
550
+ commit->object.repo = repo;
551
+
552
+ must_pass(git_commit__parse_buffer(
553
+ commit,
554
+ test_commits_working[i],
555
+ strlen(test_commits_working[i]))
556
+ );
557
+
558
+ git_commit__free(commit);
559
+ }
560
+
561
+ git_repository_free(repo);
562
+ END_TEST
563
+
564
+ static const char *commit_ids[] = {
565
+ "a4a7dce85cf63874e984719f4fdd239f5145052f", /* 0 */
566
+ "9fd738e8f7967c078dceed8190330fc8648ee56a", /* 1 */
567
+ "4a202b346bb0fb0db7eff3cffeb3c70babbd2045", /* 2 */
568
+ "c47800c7266a2be04c571c04d5a6614691ea99bd", /* 3 */
569
+ "8496071c1b46c854b31185ea97743be6a8774479", /* 4 */
570
+ "5b5b025afb0b4c913b4c338a42934a3863bf3644", /* 5 */
571
+ "a65fedf39aefe402d3bb6e24df4d4f5fe4547750", /* 6 */
572
+ };
573
+
574
+ BEGIN_TEST(details0, "query the details on a parsed commit")
575
+ const size_t commit_count = sizeof(commit_ids) / sizeof(const char *);
576
+
577
+ unsigned int i;
578
+ git_repository *repo;
579
+
580
+ must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
581
+
582
+ for (i = 0; i < commit_count; ++i) {
583
+ git_oid id;
584
+ git_commit *commit;
585
+
586
+ const git_signature *author, *committer;
587
+ const char *message;
588
+ git_time_t commit_time;
589
+ unsigned int parents, p;
590
+ git_commit *parent = NULL, *old_parent = NULL;
591
+
592
+ git_oid_fromstr(&id, commit_ids[i]);
593
+
594
+ must_pass(git_commit_lookup(&commit, repo, &id));
595
+
596
+ message = git_commit_message(commit);
597
+ author = git_commit_author(commit);
598
+ committer = git_commit_committer(commit);
599
+ commit_time = git_commit_time(commit);
600
+ parents = git_commit_parentcount(commit);
601
+
602
+ must_be_true(strcmp(author->name, "Scott Chacon") == 0);
603
+ must_be_true(strcmp(author->email, "schacon@gmail.com") == 0);
604
+ must_be_true(strcmp(committer->name, "Scott Chacon") == 0);
605
+ must_be_true(strcmp(committer->email, "schacon@gmail.com") == 0);
606
+ must_be_true(message != NULL);
607
+ must_be_true(strchr(message, '\n') != NULL);
608
+ must_be_true(commit_time > 0);
609
+ must_be_true(parents <= 2);
610
+ for (p = 0;p < parents;p++) {
611
+ if (old_parent != NULL)
612
+ git_commit_free(old_parent);
613
+
614
+ old_parent = parent;
615
+ must_pass(git_commit_parent(&parent, commit, p));
616
+ must_be_true(parent != NULL);
617
+ must_be_true(git_commit_author(parent) != NULL); // is it really a commit?
618
+ }
619
+ git_commit_free(old_parent);
620
+ git_commit_free(parent);
621
+
622
+ must_fail(git_commit_parent(&parent, commit, parents));
623
+ git_commit_free(commit);
624
+ }
625
+
626
+ git_repository_free(repo);
627
+ END_TEST
628
+
629
+ #define COMMITTER_NAME "Vicent Marti"
630
+ #define COMMITTER_EMAIL "vicent@github.com"
631
+ #define COMMIT_MESSAGE "This commit has been created in memory\n\
632
+ This is a commit created in memory and it will be written back to disk\n"
633
+
634
+ static const char *tree_oid = "1810dff58d8a660512d4832e740f692884338ccd";
635
+
636
+ BEGIN_TEST(write0, "write a new commit object from memory to disk")
637
+ git_repository *repo;
638
+ git_commit *commit;
639
+ git_oid tree_id, parent_id, commit_id;
640
+ git_signature *author, *committer;
641
+ const git_signature *author1, *committer1;
642
+ git_commit *parent;
643
+ git_tree *tree;
644
+
645
+ must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
646
+
647
+ git_oid_fromstr(&tree_id, tree_oid);
648
+ must_pass(git_tree_lookup(&tree, repo, &tree_id));
649
+
650
+ git_oid_fromstr(&parent_id, commit_ids[4]);
651
+ must_pass(git_commit_lookup(&parent, repo, &parent_id));
652
+
653
+ /* create signatures */
654
+ must_pass(git_signature_new(&committer, COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60));
655
+ must_pass(git_signature_new(&author, COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90));
656
+
657
+ must_pass(git_commit_create_v(
658
+ &commit_id, /* out id */
659
+ repo,
660
+ NULL, /* do not update the HEAD */
661
+ author,
662
+ committer,
663
+ NULL,
664
+ COMMIT_MESSAGE,
665
+ tree,
666
+ 1, parent));
667
+
668
+ git_object_free((git_object *)parent);
669
+ git_object_free((git_object *)tree);
670
+
671
+ git_signature_free(committer);
672
+ git_signature_free(author);
673
+
674
+ must_pass(git_commit_lookup(&commit, repo, &commit_id));
675
+
676
+ /* Check attributes were set correctly */
677
+ author1 = git_commit_author(commit);
678
+ must_be_true(author1 != NULL);
679
+ must_be_true(strcmp(author1->name, COMMITTER_NAME) == 0);
680
+ must_be_true(strcmp(author1->email, COMMITTER_EMAIL) == 0);
681
+ must_be_true(author1->when.time == 987654321);
682
+ must_be_true(author1->when.offset == 90);
683
+
684
+ committer1 = git_commit_committer(commit);
685
+ must_be_true(committer1 != NULL);
686
+ must_be_true(strcmp(committer1->name, COMMITTER_NAME) == 0);
687
+ must_be_true(strcmp(committer1->email, COMMITTER_EMAIL) == 0);
688
+ must_be_true(committer1->when.time == 123456789);
689
+ must_be_true(committer1->when.offset == 60);
690
+
691
+ must_be_true(strcmp(git_commit_message(commit), COMMIT_MESSAGE) == 0);
692
+
693
+ #ifndef GIT_WIN32
694
+ must_be_true((loose_object_mode(REPOSITORY_FOLDER, (git_object *)commit) & 0777) == GIT_OBJECT_FILE_MODE);
695
+ #endif
696
+
697
+ must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
698
+
699
+ git_commit_free(commit);
700
+ git_repository_free(repo);
701
+ END_TEST
702
+
703
+ #define ROOT_COMMIT_MESSAGE "This is a root commit\n\
704
+ This is a root commit and should be the only one in this branch\n"
705
+
706
+ BEGIN_TEST(root0, "create a root commit")
707
+ git_repository *repo;
708
+ git_commit *commit;
709
+ git_oid tree_id, commit_id;
710
+ const git_oid *branch_oid;
711
+ git_signature *author, *committer;
712
+ const char *branch_name = "refs/heads/root-commit-branch";
713
+ git_reference *head, *branch;
714
+ char *head_old;
715
+ git_tree *tree;
716
+
717
+ must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
718
+
719
+ git_oid_fromstr(&tree_id, tree_oid);
720
+ must_pass(git_tree_lookup(&tree, repo, &tree_id));
721
+
722
+ /* create signatures */
723
+ must_pass(git_signature_new(&committer, COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60));
724
+ must_pass(git_signature_new(&author, COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90));
725
+
726
+ /* First we need to update HEAD so it points to our non-existant branch */
727
+ must_pass(git_reference_lookup(&head, repo, "HEAD"));
728
+ must_be_true(git_reference_type(head) == GIT_REF_SYMBOLIC);
729
+ head_old = git__strdup(git_reference_target(head));
730
+ must_be_true(head_old != NULL);
731
+
732
+ must_pass(git_reference_set_target(head, branch_name));
733
+
734
+ must_pass(git_commit_create_v(
735
+ &commit_id, /* out id */
736
+ repo,
737
+ "HEAD",
738
+ author,
739
+ committer,
740
+ NULL,
741
+ ROOT_COMMIT_MESSAGE,
742
+ tree,
743
+ 0));
744
+
745
+ git_object_free((git_object *)tree);
746
+ git_signature_free(committer);
747
+ git_signature_free(author);
748
+
749
+ /*
750
+ * The fact that creating a commit works has already been
751
+ * tested. Here we just make sure it's our commit and that it was
752
+ * written as a root commit.
753
+ */
754
+ must_pass(git_commit_lookup(&commit, repo, &commit_id));
755
+ must_be_true(git_commit_parentcount(commit) == 0);
756
+ must_pass(git_reference_lookup(&branch, repo, branch_name));
757
+ branch_oid = git_reference_oid(branch);
758
+ must_pass(git_oid_cmp(branch_oid, &commit_id));
759
+ must_be_true(!strcmp(git_commit_message(commit), ROOT_COMMIT_MESSAGE));
760
+
761
+ /* Remove the data we just added to the repo */
762
+ must_pass(git_reference_lookup(&head, repo, "HEAD"));
763
+ must_pass(git_reference_set_target(head, head_old));
764
+ must_pass(git_reference_delete(branch));
765
+ must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
766
+ git__free(head_old);
767
+ git_commit_free(commit);
768
+ git_repository_free(repo);
769
+
770
+ git_reference_free(head);
771
+ END_TEST
772
+
773
+ BEGIN_SUITE(commit)
774
+ ADD_TEST(parse0);
775
+ ADD_TEST(parse1);
776
+ ADD_TEST(parse2);
777
+ ADD_TEST(details0);
778
+
779
+ ADD_TEST(write0);
780
+
781
+ ADD_TEST(root0);
782
+
783
+ ADD_TEST(signature0);
784
+ ADD_TEST(signature1);
785
+ ADD_TEST(signature2);
786
+ ADD_TEST(signature3);
787
+ ADD_TEST(signature4);
788
+ END_SUITE