rugged 0.17.0.b7 → 0.18.0.b1

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 (310) hide show
  1. data/LICENSE +1 -1
  2. data/README.md +88 -32
  3. data/ext/rugged/extconf.rb +4 -2
  4. data/ext/rugged/rugged.c +72 -10
  5. data/ext/rugged/rugged.h +14 -10
  6. data/ext/rugged/rugged_blob.c +8 -10
  7. data/ext/rugged/rugged_branch.c +11 -14
  8. data/ext/rugged/rugged_commit.c +31 -24
  9. data/ext/rugged/rugged_config.c +2 -2
  10. data/ext/rugged/rugged_index.c +133 -198
  11. data/ext/rugged/rugged_note.c +372 -0
  12. data/ext/rugged/rugged_object.c +50 -22
  13. data/ext/rugged/rugged_reference.c +122 -130
  14. data/ext/rugged/rugged_remote.c +72 -29
  15. data/ext/rugged/rugged_repo.c +402 -20
  16. data/ext/rugged/rugged_revwalk.c +7 -3
  17. data/ext/rugged/rugged_settings.c +110 -0
  18. data/ext/rugged/rugged_signature.c +23 -7
  19. data/ext/rugged/rugged_tag.c +32 -16
  20. data/ext/rugged/rugged_tree.c +44 -15
  21. data/lib/rugged.rb +1 -0
  22. data/lib/rugged/index.rb +8 -0
  23. data/lib/rugged/remote.rb +13 -0
  24. data/lib/rugged/repository.rb +3 -3
  25. data/lib/rugged/version.rb +1 -1
  26. data/test/blob_test.rb +13 -15
  27. data/test/branch_test.rb +32 -67
  28. data/test/commit_test.rb +50 -12
  29. data/test/config_test.rb +12 -11
  30. data/test/coverage/HEAD.json +1 -1
  31. data/test/coverage/cover.rb +40 -21
  32. data/test/errors_test.rb +34 -0
  33. data/test/fixtures/alternate/objects/14/6ae76773c91e3b1d00cf7a338ec55ae58297e2 +0 -0
  34. data/test/fixtures/alternate/objects/14/9c32d47e99d0a3572ff1e70a2e0051bbf347a9 +0 -0
  35. data/test/fixtures/alternate/objects/14/fb3108588f9421bf764041e5e3ac305eb6277f +0 -0
  36. data/test/fixtures/testrepo.git/logs/refs/notes/commits +1 -0
  37. data/test/fixtures/testrepo.git/objects/44/1034f860c1d5d90e4188d11ae0d325176869a8 +1 -0
  38. data/test/fixtures/testrepo.git/objects/60/d415052a33de2150bf68757f6461df4f563ae4 +0 -0
  39. data/test/fixtures/testrepo.git/objects/68/8a8f4ef7496901d15322972f96e212a9e466cc +1 -0
  40. data/test/fixtures/testrepo.git/objects/94/eca2de348d5f672faf56b0decafa5937e3235e +0 -0
  41. data/test/fixtures/testrepo.git/objects/9b/7384fe1676186192842f5d3e129457b62db9e3 +0 -0
  42. data/test/fixtures/testrepo.git/objects/b7/4713326bc972cc15751ed504dca6f6f3b91f7a +3 -0
  43. data/test/fixtures/testrepo.git/refs/notes/commits +1 -0
  44. data/test/index_test.rb +65 -69
  45. data/test/lib_test.rb +76 -11
  46. data/test/note_test.rb +158 -0
  47. data/test/object_test.rb +8 -11
  48. data/test/reference_test.rb +77 -85
  49. data/test/remote_test.rb +86 -8
  50. data/test/repo_pack_test.rb +9 -7
  51. data/test/repo_reset_test.rb +80 -0
  52. data/test/repo_test.rb +176 -53
  53. data/test/tag_test.rb +44 -7
  54. data/test/test_helper.rb +63 -35
  55. data/test/tree_test.rb +34 -13
  56. data/test/walker_test.rb +14 -14
  57. data/vendor/libgit2/Makefile.embed +1 -1
  58. data/vendor/libgit2/deps/http-parser/http_parser.c +974 -578
  59. data/vendor/libgit2/deps/http-parser/http_parser.h +106 -70
  60. data/vendor/libgit2/deps/regex/regcomp.c +7 -6
  61. data/vendor/libgit2/deps/regex/regex_internal.c +1 -1
  62. data/vendor/libgit2/deps/regex/regex_internal.h +12 -3
  63. data/vendor/libgit2/deps/regex/regexec.c +5 -5
  64. data/vendor/libgit2/include/git2.h +5 -1
  65. data/vendor/libgit2/include/git2/attr.h +4 -2
  66. data/vendor/libgit2/include/git2/blob.h +39 -12
  67. data/vendor/libgit2/include/git2/branch.h +123 -35
  68. data/vendor/libgit2/include/git2/checkout.h +206 -48
  69. data/vendor/libgit2/include/git2/clone.h +72 -27
  70. data/vendor/libgit2/include/git2/commit.h +20 -17
  71. data/vendor/libgit2/include/git2/common.h +67 -1
  72. data/vendor/libgit2/include/git2/config.h +81 -60
  73. data/vendor/libgit2/include/git2/cred_helpers.h +53 -0
  74. data/vendor/libgit2/include/git2/diff.h +459 -150
  75. data/vendor/libgit2/include/git2/errors.h +9 -1
  76. data/vendor/libgit2/include/git2/graph.h +41 -0
  77. data/vendor/libgit2/include/git2/ignore.h +7 -6
  78. data/vendor/libgit2/include/git2/index.h +323 -97
  79. data/vendor/libgit2/include/git2/indexer.h +27 -59
  80. data/vendor/libgit2/include/git2/inttypes.h +4 -0
  81. data/vendor/libgit2/include/git2/merge.h +13 -3
  82. data/vendor/libgit2/include/git2/message.h +14 -8
  83. data/vendor/libgit2/include/git2/net.h +9 -7
  84. data/vendor/libgit2/include/git2/notes.h +88 -29
  85. data/vendor/libgit2/include/git2/object.h +16 -6
  86. data/vendor/libgit2/include/git2/odb.h +80 -17
  87. data/vendor/libgit2/include/git2/odb_backend.h +47 -11
  88. data/vendor/libgit2/include/git2/oid.h +26 -17
  89. data/vendor/libgit2/include/git2/pack.h +62 -8
  90. data/vendor/libgit2/include/git2/push.h +131 -0
  91. data/vendor/libgit2/include/git2/refdb.h +103 -0
  92. data/vendor/libgit2/include/git2/refdb_backend.h +109 -0
  93. data/vendor/libgit2/include/git2/reflog.h +30 -21
  94. data/vendor/libgit2/include/git2/refs.h +215 -193
  95. data/vendor/libgit2/include/git2/refspec.h +22 -2
  96. data/vendor/libgit2/include/git2/remote.h +158 -37
  97. data/vendor/libgit2/include/git2/repository.h +150 -31
  98. data/vendor/libgit2/include/git2/reset.h +43 -9
  99. data/vendor/libgit2/include/git2/revparse.h +48 -4
  100. data/vendor/libgit2/include/git2/revwalk.h +25 -10
  101. data/vendor/libgit2/include/git2/signature.h +20 -12
  102. data/vendor/libgit2/include/git2/stash.h +121 -0
  103. data/vendor/libgit2/include/git2/status.h +122 -53
  104. data/vendor/libgit2/include/git2/strarray.h +17 -11
  105. data/vendor/libgit2/include/git2/submodule.h +42 -7
  106. data/vendor/libgit2/include/git2/tag.h +72 -59
  107. data/vendor/libgit2/include/git2/threads.h +4 -2
  108. data/vendor/libgit2/include/git2/trace.h +68 -0
  109. data/vendor/libgit2/include/git2/transport.h +328 -0
  110. data/vendor/libgit2/include/git2/tree.h +149 -120
  111. data/vendor/libgit2/include/git2/types.h +13 -12
  112. data/vendor/libgit2/include/git2/version.h +3 -3
  113. data/vendor/libgit2/src/amiga/map.c +2 -2
  114. data/vendor/libgit2/src/attr.c +58 -48
  115. data/vendor/libgit2/src/attr.h +4 -18
  116. data/vendor/libgit2/src/attr_file.c +30 -6
  117. data/vendor/libgit2/src/attr_file.h +6 -8
  118. data/vendor/libgit2/src/attrcache.h +24 -0
  119. data/vendor/libgit2/src/blob.c +30 -7
  120. data/vendor/libgit2/src/blob.h +1 -1
  121. data/vendor/libgit2/src/branch.c +361 -68
  122. data/vendor/libgit2/src/branch.h +17 -0
  123. data/vendor/libgit2/src/bswap.h +1 -1
  124. data/vendor/libgit2/src/buf_text.c +291 -0
  125. data/vendor/libgit2/src/buf_text.h +122 -0
  126. data/vendor/libgit2/src/buffer.c +27 -101
  127. data/vendor/libgit2/src/buffer.h +54 -39
  128. data/vendor/libgit2/src/cache.c +15 -6
  129. data/vendor/libgit2/src/cache.h +1 -1
  130. data/vendor/libgit2/src/cc-compat.h +3 -1
  131. data/vendor/libgit2/src/checkout.c +1165 -222
  132. data/vendor/libgit2/src/checkout.h +24 -0
  133. data/vendor/libgit2/src/clone.c +171 -86
  134. data/vendor/libgit2/src/commit.c +44 -45
  135. data/vendor/libgit2/src/commit.h +3 -3
  136. data/vendor/libgit2/src/commit_list.c +194 -0
  137. data/vendor/libgit2/src/commit_list.h +49 -0
  138. data/vendor/libgit2/src/common.h +44 -10
  139. data/vendor/libgit2/src/compress.c +1 -1
  140. data/vendor/libgit2/src/compress.h +1 -1
  141. data/vendor/libgit2/src/config.c +211 -124
  142. data/vendor/libgit2/src/config.h +23 -4
  143. data/vendor/libgit2/src/config_cache.c +2 -2
  144. data/vendor/libgit2/src/config_file.c +129 -53
  145. data/vendor/libgit2/src/config_file.h +10 -8
  146. data/vendor/libgit2/src/crlf.c +66 -67
  147. data/vendor/libgit2/src/date.c +12 -12
  148. data/vendor/libgit2/src/delta-apply.c +14 -1
  149. data/vendor/libgit2/src/delta-apply.h +18 -1
  150. data/vendor/libgit2/src/delta.c +40 -107
  151. data/vendor/libgit2/src/delta.h +19 -17
  152. data/vendor/libgit2/src/diff.c +347 -496
  153. data/vendor/libgit2/src/diff.h +27 -1
  154. data/vendor/libgit2/src/diff_output.c +564 -249
  155. data/vendor/libgit2/src/diff_output.h +15 -8
  156. data/vendor/libgit2/src/diff_tform.c +687 -0
  157. data/vendor/libgit2/src/errors.c +27 -36
  158. data/vendor/libgit2/src/fetch.c +13 -351
  159. data/vendor/libgit2/src/fetch.h +13 -3
  160. data/vendor/libgit2/src/fetchhead.c +295 -0
  161. data/vendor/libgit2/src/fetchhead.h +34 -0
  162. data/vendor/libgit2/src/filebuf.c +42 -15
  163. data/vendor/libgit2/src/filebuf.h +4 -2
  164. data/vendor/libgit2/src/fileops.c +466 -113
  165. data/vendor/libgit2/src/fileops.h +154 -28
  166. data/vendor/libgit2/src/filter.c +3 -75
  167. data/vendor/libgit2/src/filter.h +1 -29
  168. data/vendor/libgit2/src/fnmatch.c +1 -1
  169. data/vendor/libgit2/src/fnmatch.h +1 -1
  170. data/vendor/libgit2/src/global.c +54 -10
  171. data/vendor/libgit2/src/global.h +10 -1
  172. data/vendor/libgit2/src/graph.c +178 -0
  173. data/vendor/libgit2/src/hash.c +25 -52
  174. data/vendor/libgit2/src/hash.h +21 -9
  175. data/vendor/libgit2/src/{sha1/sha1.c → hash/hash_generic.c} +20 -12
  176. data/vendor/libgit2/src/hash/hash_generic.h +24 -0
  177. data/vendor/libgit2/src/hash/hash_openssl.h +45 -0
  178. data/vendor/libgit2/src/hash/hash_win32.c +291 -0
  179. data/vendor/libgit2/src/hash/hash_win32.h +140 -0
  180. data/vendor/libgit2/src/hashsig.c +368 -0
  181. data/vendor/libgit2/src/hashsig.h +72 -0
  182. data/vendor/libgit2/src/ignore.c +22 -15
  183. data/vendor/libgit2/src/ignore.h +6 -1
  184. data/vendor/libgit2/src/index.c +770 -171
  185. data/vendor/libgit2/src/index.h +13 -5
  186. data/vendor/libgit2/src/indexer.c +286 -431
  187. data/vendor/libgit2/src/iterator.c +854 -466
  188. data/vendor/libgit2/src/iterator.h +134 -109
  189. data/vendor/libgit2/src/map.h +1 -1
  190. data/vendor/libgit2/src/merge.c +296 -0
  191. data/vendor/libgit2/src/merge.h +22 -0
  192. data/vendor/libgit2/src/message.c +1 -1
  193. data/vendor/libgit2/src/message.h +1 -1
  194. data/vendor/libgit2/src/mwindow.c +35 -30
  195. data/vendor/libgit2/src/mwindow.h +2 -2
  196. data/vendor/libgit2/src/netops.c +162 -98
  197. data/vendor/libgit2/src/netops.h +50 -15
  198. data/vendor/libgit2/src/notes.c +109 -58
  199. data/vendor/libgit2/src/notes.h +2 -1
  200. data/vendor/libgit2/src/object.c +46 -57
  201. data/vendor/libgit2/src/object.h +1 -8
  202. data/vendor/libgit2/src/odb.c +151 -40
  203. data/vendor/libgit2/src/odb.h +5 -1
  204. data/vendor/libgit2/src/odb_loose.c +4 -5
  205. data/vendor/libgit2/src/odb_pack.c +122 -80
  206. data/vendor/libgit2/src/offmap.h +65 -0
  207. data/vendor/libgit2/src/oid.c +12 -4
  208. data/vendor/libgit2/src/oidmap.h +1 -1
  209. data/vendor/libgit2/src/pack-objects.c +88 -61
  210. data/vendor/libgit2/src/pack-objects.h +8 -8
  211. data/vendor/libgit2/src/pack.c +293 -28
  212. data/vendor/libgit2/src/pack.h +49 -4
  213. data/vendor/libgit2/src/path.c +103 -14
  214. data/vendor/libgit2/src/path.h +23 -7
  215. data/vendor/libgit2/src/pathspec.c +168 -0
  216. data/vendor/libgit2/src/pathspec.h +40 -0
  217. data/vendor/libgit2/src/pool.c +29 -4
  218. data/vendor/libgit2/src/pool.h +8 -1
  219. data/vendor/libgit2/src/posix.c +26 -27
  220. data/vendor/libgit2/src/posix.h +2 -3
  221. data/vendor/libgit2/src/pqueue.c +23 -1
  222. data/vendor/libgit2/src/pqueue.h +23 -1
  223. data/vendor/libgit2/src/push.c +653 -0
  224. data/vendor/libgit2/src/push.h +51 -0
  225. data/vendor/libgit2/src/refdb.c +185 -0
  226. data/vendor/libgit2/src/refdb.h +46 -0
  227. data/vendor/libgit2/src/refdb_fs.c +1024 -0
  228. data/vendor/libgit2/src/refdb_fs.h +15 -0
  229. data/vendor/libgit2/src/reflog.c +77 -45
  230. data/vendor/libgit2/src/reflog.h +1 -3
  231. data/vendor/libgit2/src/refs.c +366 -1326
  232. data/vendor/libgit2/src/refs.h +22 -13
  233. data/vendor/libgit2/src/refspec.c +46 -7
  234. data/vendor/libgit2/src/refspec.h +11 -1
  235. data/vendor/libgit2/src/remote.c +758 -120
  236. data/vendor/libgit2/src/remote.h +10 -5
  237. data/vendor/libgit2/src/repo_template.h +6 -6
  238. data/vendor/libgit2/src/repository.c +315 -96
  239. data/vendor/libgit2/src/repository.h +5 -3
  240. data/vendor/libgit2/src/reset.c +99 -81
  241. data/vendor/libgit2/src/revparse.c +157 -84
  242. data/vendor/libgit2/src/revwalk.c +68 -470
  243. data/vendor/libgit2/src/revwalk.h +44 -0
  244. data/vendor/libgit2/src/sha1_lookup.c +1 -1
  245. data/vendor/libgit2/src/sha1_lookup.h +1 -1
  246. data/vendor/libgit2/src/signature.c +68 -200
  247. data/vendor/libgit2/src/signature.h +1 -1
  248. data/vendor/libgit2/src/stash.c +663 -0
  249. data/vendor/libgit2/src/status.c +101 -79
  250. data/vendor/libgit2/src/strmap.h +1 -1
  251. data/vendor/libgit2/src/submodule.c +67 -51
  252. data/vendor/libgit2/src/submodule.h +1 -1
  253. data/vendor/libgit2/src/tag.c +35 -29
  254. data/vendor/libgit2/src/tag.h +1 -1
  255. data/vendor/libgit2/src/thread-utils.c +1 -1
  256. data/vendor/libgit2/src/thread-utils.h +2 -2
  257. data/vendor/libgit2/src/trace.c +39 -0
  258. data/vendor/libgit2/src/trace.h +56 -0
  259. data/vendor/libgit2/src/transport.c +81 -34
  260. data/vendor/libgit2/src/transports/cred.c +60 -0
  261. data/vendor/libgit2/src/transports/cred_helpers.c +49 -0
  262. data/vendor/libgit2/src/transports/git.c +234 -127
  263. data/vendor/libgit2/src/transports/http.c +761 -433
  264. data/vendor/libgit2/src/transports/local.c +460 -64
  265. data/vendor/libgit2/src/transports/smart.c +345 -0
  266. data/vendor/libgit2/src/transports/smart.h +179 -0
  267. data/vendor/libgit2/src/{pkt.c → transports/smart_pkt.c} +131 -12
  268. data/vendor/libgit2/src/transports/smart_protocol.c +856 -0
  269. data/vendor/libgit2/src/transports/winhttp.c +1136 -0
  270. data/vendor/libgit2/src/tree-cache.c +2 -2
  271. data/vendor/libgit2/src/tree-cache.h +1 -1
  272. data/vendor/libgit2/src/tree.c +239 -166
  273. data/vendor/libgit2/src/tree.h +11 -2
  274. data/vendor/libgit2/src/tsort.c +39 -23
  275. data/vendor/libgit2/src/unix/map.c +1 -1
  276. data/vendor/libgit2/src/unix/posix.h +12 -2
  277. data/vendor/libgit2/src/unix/realpath.c +30 -0
  278. data/vendor/libgit2/src/util.c +250 -13
  279. data/vendor/libgit2/src/util.h +71 -14
  280. data/vendor/libgit2/src/vector.c +123 -60
  281. data/vendor/libgit2/src/vector.h +24 -22
  282. data/vendor/libgit2/src/win32/dir.c +1 -1
  283. data/vendor/libgit2/src/win32/dir.h +1 -1
  284. data/vendor/libgit2/src/win32/error.c +77 -0
  285. data/vendor/libgit2/src/win32/error.h +13 -0
  286. data/vendor/libgit2/src/win32/findfile.c +143 -54
  287. data/vendor/libgit2/src/win32/findfile.h +10 -6
  288. data/vendor/libgit2/src/win32/map.c +1 -1
  289. data/vendor/libgit2/src/win32/mingw-compat.h +1 -1
  290. data/vendor/libgit2/src/win32/msvc-compat.h +10 -1
  291. data/vendor/libgit2/src/win32/posix.h +10 -1
  292. data/vendor/libgit2/src/win32/posix_w32.c +132 -63
  293. data/vendor/libgit2/src/win32/precompiled.c +1 -1
  294. data/vendor/libgit2/src/win32/pthread.c +1 -1
  295. data/vendor/libgit2/src/win32/pthread.h +1 -1
  296. data/vendor/libgit2/src/win32/utf-conv.c +5 -5
  297. data/vendor/libgit2/src/win32/utf-conv.h +3 -3
  298. data/vendor/libgit2/src/win32/version.h +20 -0
  299. metadata +308 -252
  300. data/test/fixtures/testrepo.git/objects/4b/825dc642cb6eb9a060e54bf8d69288fbee4904 +0 -0
  301. data/test/fixtures/testrepo.git/objects/7f/043268ea43ce18e3540acaabf9e090c91965b0 +0 -0
  302. data/test/fixtures/testrepo.git/objects/a3/e05719b428a2d0ed7a55c4ce53dcc5768c6d5e +0 -0
  303. data/test/index_test.rb~ +0 -218
  304. data/vendor/libgit2/src/pkt.h +0 -91
  305. data/vendor/libgit2/src/ppc/sha1.c +0 -70
  306. data/vendor/libgit2/src/ppc/sha1.h +0 -26
  307. data/vendor/libgit2/src/protocol.c +0 -110
  308. data/vendor/libgit2/src/protocol.h +0 -21
  309. data/vendor/libgit2/src/sha1.h +0 -33
  310. data/vendor/libgit2/src/transport.h +0 -148
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
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.
@@ -10,9 +10,19 @@
10
10
  #include "netops.h"
11
11
 
12
12
  int git_fetch_negotiate(git_remote *remote);
13
- int git_fetch_download_pack(git_remote *remote, git_off_t *bytes, git_indexer_stats *stats);
14
13
 
15
- int git_fetch__download_pack(git_transport *t, git_repository *repo, git_off_t *bytes, git_indexer_stats *stats);
14
+ int git_fetch_download_pack(
15
+ git_remote *remote,
16
+ git_transfer_progress_callback progress_cb,
17
+ void *progress_payload);
18
+
19
+ int git_fetch__download_pack(
20
+ git_transport *t,
21
+ git_repository *repo,
22
+ git_transfer_progress *stats,
23
+ git_transfer_progress_callback progress_cb,
24
+ void *progress_payload);
25
+
16
26
  int git_fetch_setup_walk(git_revwalk **out, git_repository *repo);
17
27
 
18
28
  #endif
@@ -0,0 +1,295 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "git2/types.h"
9
+ #include "git2/oid.h"
10
+
11
+ #include "fetchhead.h"
12
+ #include "common.h"
13
+ #include "buffer.h"
14
+ #include "fileops.h"
15
+ #include "filebuf.h"
16
+ #include "refs.h"
17
+ #include "repository.h"
18
+
19
+ int git_fetchhead_ref_cmp(const void *a, const void *b)
20
+ {
21
+ const git_fetchhead_ref *one = (const git_fetchhead_ref *)a;
22
+ const git_fetchhead_ref *two = (const git_fetchhead_ref *)b;
23
+
24
+ if (one->is_merge && !two->is_merge)
25
+ return -1;
26
+ if (two->is_merge && !one->is_merge)
27
+ return 1;
28
+
29
+ if (one->ref_name && two->ref_name)
30
+ return strcmp(one->ref_name, two->ref_name);
31
+ else if (one->ref_name)
32
+ return -1;
33
+ else if (two->ref_name)
34
+ return 1;
35
+
36
+ return 0;
37
+ }
38
+
39
+ int git_fetchhead_ref_create(
40
+ git_fetchhead_ref **out,
41
+ git_oid *oid,
42
+ unsigned int is_merge,
43
+ const char *ref_name,
44
+ const char *remote_url)
45
+ {
46
+ git_fetchhead_ref *fetchhead_ref;
47
+
48
+ assert(out && oid);
49
+
50
+ *out = NULL;
51
+
52
+ fetchhead_ref = git__malloc(sizeof(git_fetchhead_ref));
53
+ GITERR_CHECK_ALLOC(fetchhead_ref);
54
+
55
+ memset(fetchhead_ref, 0x0, sizeof(git_fetchhead_ref));
56
+
57
+ git_oid_cpy(&fetchhead_ref->oid, oid);
58
+ fetchhead_ref->is_merge = is_merge;
59
+
60
+ if (ref_name)
61
+ fetchhead_ref->ref_name = git__strdup(ref_name);
62
+
63
+ if (remote_url)
64
+ fetchhead_ref->remote_url = git__strdup(remote_url);
65
+
66
+ *out = fetchhead_ref;
67
+
68
+ return 0;
69
+ }
70
+
71
+ static int fetchhead_ref_write(
72
+ git_filebuf *file,
73
+ git_fetchhead_ref *fetchhead_ref)
74
+ {
75
+ char oid[GIT_OID_HEXSZ + 1];
76
+ const char *type, *name;
77
+
78
+ assert(file && fetchhead_ref);
79
+
80
+ git_oid_fmt(oid, &fetchhead_ref->oid);
81
+ oid[GIT_OID_HEXSZ] = '\0';
82
+
83
+ if (git__prefixcmp(fetchhead_ref->ref_name, GIT_REFS_HEADS_DIR) == 0) {
84
+ type = "branch ";
85
+ name = fetchhead_ref->ref_name + strlen(GIT_REFS_HEADS_DIR);
86
+ } else if(git__prefixcmp(fetchhead_ref->ref_name,
87
+ GIT_REFS_TAGS_DIR) == 0) {
88
+ type = "tag ";
89
+ name = fetchhead_ref->ref_name + strlen(GIT_REFS_TAGS_DIR);
90
+ } else {
91
+ type = "";
92
+ name = fetchhead_ref->ref_name;
93
+ }
94
+
95
+ return git_filebuf_printf(file, "%s\t%s\t%s'%s' of %s\n",
96
+ oid,
97
+ (fetchhead_ref->is_merge) ? "" : "not-for-merge",
98
+ type,
99
+ name,
100
+ fetchhead_ref->remote_url);
101
+ }
102
+
103
+ int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs)
104
+ {
105
+ git_filebuf file = GIT_FILEBUF_INIT;
106
+ git_buf path = GIT_BUF_INIT;
107
+ unsigned int i;
108
+ git_fetchhead_ref *fetchhead_ref;
109
+
110
+ assert(repo && fetchhead_refs);
111
+
112
+ if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0)
113
+ return -1;
114
+
115
+ if (git_filebuf_open(&file, path.ptr, GIT_FILEBUF_FORCE) < 0) {
116
+ git_buf_free(&path);
117
+ return -1;
118
+ }
119
+
120
+ git_buf_free(&path);
121
+
122
+ git_vector_sort(fetchhead_refs);
123
+
124
+ git_vector_foreach(fetchhead_refs, i, fetchhead_ref)
125
+ fetchhead_ref_write(&file, fetchhead_ref);
126
+
127
+ return git_filebuf_commit(&file, GIT_REFS_FILE_MODE);
128
+ }
129
+
130
+ static int fetchhead_ref_parse(
131
+ git_oid *oid,
132
+ unsigned int *is_merge,
133
+ git_buf *ref_name,
134
+ const char **remote_url,
135
+ char *line,
136
+ size_t line_num)
137
+ {
138
+ char *oid_str, *is_merge_str, *desc, *name = NULL;
139
+ const char *type = NULL;
140
+ int error = 0;
141
+
142
+ *remote_url = NULL;
143
+
144
+ if (!*line) {
145
+ giterr_set(GITERR_FETCHHEAD,
146
+ "Empty line in FETCH_HEAD line %d", line_num);
147
+ return -1;
148
+ }
149
+
150
+ /* Compat with old git clients that wrote FETCH_HEAD like a loose ref. */
151
+ if ((oid_str = git__strsep(&line, "\t")) == NULL) {
152
+ oid_str = line;
153
+ line += strlen(line);
154
+
155
+ *is_merge = 1;
156
+ }
157
+
158
+ if (strlen(oid_str) != GIT_OID_HEXSZ) {
159
+ giterr_set(GITERR_FETCHHEAD,
160
+ "Invalid object ID in FETCH_HEAD line %d", line_num);
161
+ return -1;
162
+ }
163
+
164
+ if (git_oid_fromstr(oid, oid_str) < 0) {
165
+ const git_error *oid_err = giterr_last();
166
+ const char *err_msg = oid_err ? oid_err->message : "Invalid object ID";
167
+
168
+ giterr_set(GITERR_FETCHHEAD, "%s in FETCH_HEAD line %d",
169
+ err_msg, line_num);
170
+ return -1;
171
+ }
172
+
173
+ /* Parse new data from newer git clients */
174
+ if (*line) {
175
+ if ((is_merge_str = git__strsep(&line, "\t")) == NULL) {
176
+ giterr_set(GITERR_FETCHHEAD,
177
+ "Invalid description data in FETCH_HEAD line %d", line_num);
178
+ return -1;
179
+ }
180
+
181
+ if (*is_merge_str == '\0')
182
+ *is_merge = 1;
183
+ else if (strcmp(is_merge_str, "not-for-merge") == 0)
184
+ *is_merge = 0;
185
+ else {
186
+ giterr_set(GITERR_FETCHHEAD,
187
+ "Invalid for-merge entry in FETCH_HEAD line %d", line_num);
188
+ return -1;
189
+ }
190
+
191
+ if ((desc = line) == NULL) {
192
+ giterr_set(GITERR_FETCHHEAD,
193
+ "Invalid description in FETCH_HEAD line %d", line_num);
194
+ return -1;
195
+ }
196
+
197
+ if (git__prefixcmp(desc, "branch '") == 0) {
198
+ type = GIT_REFS_HEADS_DIR;
199
+ name = desc + 8;
200
+ } else if (git__prefixcmp(desc, "tag '") == 0) {
201
+ type = GIT_REFS_TAGS_DIR;
202
+ name = desc + 5;
203
+ } else if (git__prefixcmp(desc, "'") == 0)
204
+ name = desc + 1;
205
+
206
+ if (name) {
207
+ if ((desc = strchr(name, '\'')) == NULL ||
208
+ git__prefixcmp(desc, "' of ") != 0) {
209
+ giterr_set(GITERR_FETCHHEAD,
210
+ "Invalid description in FETCH_HEAD line %d", line_num);
211
+ return -1;
212
+ }
213
+
214
+ *desc = '\0';
215
+ desc += 5;
216
+ }
217
+
218
+ *remote_url = desc;
219
+ }
220
+
221
+ git_buf_clear(ref_name);
222
+
223
+ if (type)
224
+ git_buf_join(ref_name, '/', type, name);
225
+ else if(name)
226
+ git_buf_puts(ref_name, name);
227
+
228
+ return error;
229
+ }
230
+
231
+ int git_repository_fetchhead_foreach(git_repository *repo,
232
+ git_repository_fetchhead_foreach_cb cb,
233
+ void *payload)
234
+ {
235
+ git_buf path = GIT_BUF_INIT, file = GIT_BUF_INIT, name = GIT_BUF_INIT;
236
+ const char *ref_name;
237
+ git_oid oid;
238
+ const char *remote_url;
239
+ unsigned int is_merge = 0;
240
+ char *buffer, *line;
241
+ size_t line_num = 0;
242
+ int error = 0;
243
+
244
+ assert(repo && cb);
245
+
246
+ if (git_buf_joinpath(&path, repo->path_repository, GIT_FETCH_HEAD_FILE) < 0)
247
+ return -1;
248
+
249
+ if ((error = git_futils_readbuffer(&file, git_buf_cstr(&path))) < 0)
250
+ goto done;
251
+
252
+ buffer = file.ptr;
253
+
254
+ while ((line = git__strsep(&buffer, "\n")) != NULL) {
255
+ ++line_num;
256
+
257
+ if ((error = fetchhead_ref_parse(&oid, &is_merge, &name, &remote_url,
258
+ line, line_num)) < 0)
259
+ goto done;
260
+
261
+ if (git_buf_len(&name) > 0)
262
+ ref_name = git_buf_cstr(&name);
263
+ else
264
+ ref_name = NULL;
265
+
266
+ if ((cb(ref_name, remote_url, &oid, is_merge, payload)) != 0) {
267
+ error = GIT_EUSER;
268
+ goto done;
269
+ }
270
+ }
271
+
272
+ if (*buffer) {
273
+ giterr_set(GITERR_FETCHHEAD, "No EOL at line %d", line_num+1);
274
+ error = -1;
275
+ goto done;
276
+ }
277
+
278
+ done:
279
+ git_buf_free(&file);
280
+ git_buf_free(&path);
281
+ git_buf_free(&name);
282
+
283
+ return error;
284
+ }
285
+
286
+ void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref)
287
+ {
288
+ if (fetchhead_ref == NULL)
289
+ return;
290
+
291
+ git__free(fetchhead_ref->remote_url);
292
+ git__free(fetchhead_ref->ref_name);
293
+ git__free(fetchhead_ref);
294
+ }
295
+
@@ -0,0 +1,34 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+ #ifndef INCLUDE_fetchhead_h__
8
+ #define INCLUDE_fetchhead_h__
9
+
10
+ #include "vector.h"
11
+
12
+ struct git_fetchhead_ref {
13
+ git_oid oid;
14
+ unsigned int is_merge;
15
+ char *ref_name;
16
+ char *remote_url;
17
+ };
18
+
19
+ typedef struct git_fetchhead_ref git_fetchhead_ref;
20
+
21
+ int git_fetchhead_ref_create(
22
+ git_fetchhead_ref **fetchhead_ref_out,
23
+ git_oid *oid,
24
+ unsigned int is_merge,
25
+ const char *ref_name,
26
+ const char *remote_url);
27
+
28
+ int git_fetchhead_ref_cmp(const void *a, const void *b);
29
+
30
+ int git_fetchhead_write(git_repository *repo, git_vector *fetchhead_refs);
31
+
32
+ void git_fetchhead_ref_free(git_fetchhead_ref *fetchhead_ref);
33
+
34
+ #endif
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (C) 2009-2012 the libgit2 contributors
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
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.
@@ -85,8 +85,8 @@ static int lock_file(git_filebuf *file, int flags)
85
85
 
86
86
  while ((read_bytes = p_read(source, buffer, sizeof(buffer))) > 0) {
87
87
  p_write(file->fd, buffer, read_bytes);
88
- if (file->digest)
89
- git_hash_update(file->digest, buffer, read_bytes);
88
+ if (file->compute_digest)
89
+ git_hash_update(&file->digest, buffer, read_bytes);
90
90
  }
91
91
 
92
92
  p_close(source);
@@ -108,8 +108,10 @@ void git_filebuf_cleanup(git_filebuf *file)
108
108
  if (file->fd_is_open && file->path_lock && git_path_exists(file->path_lock))
109
109
  p_unlink(file->path_lock);
110
110
 
111
- if (file->digest)
112
- git_hash_free_ctx(file->digest);
111
+ if (file->compute_digest) {
112
+ git_hash_ctx_cleanup(&file->digest);
113
+ file->compute_digest = 0;
114
+ }
113
115
 
114
116
  if (file->buffer)
115
117
  git__free(file->buffer);
@@ -149,8 +151,8 @@ static int write_normal(git_filebuf *file, void *source, size_t len)
149
151
  return -1;
150
152
  }
151
153
 
152
- if (file->digest)
153
- git_hash_update(file->digest, source, len);
154
+ if (file->compute_digest)
155
+ git_hash_update(&file->digest, source, len);
154
156
  }
155
157
 
156
158
  return 0;
@@ -186,8 +188,8 @@ static int write_deflate(git_filebuf *file, void *source, size_t len)
186
188
 
187
189
  assert(zs->avail_in == 0);
188
190
 
189
- if (file->digest)
190
- git_hash_update(file->digest, source, len);
191
+ if (file->compute_digest)
192
+ git_hash_update(&file->digest, source, len);
191
193
  }
192
194
 
193
195
  return 0;
@@ -221,8 +223,10 @@ int git_filebuf_open(git_filebuf *file, const char *path, int flags)
221
223
 
222
224
  /* If we are hashing on-write, allocate a new hash context */
223
225
  if (flags & GIT_FILEBUF_HASH_CONTENTS) {
224
- file->digest = git_hash_new_ctx();
225
- GITERR_CHECK_ALLOC(file->digest);
226
+ file->compute_digest = 1;
227
+
228
+ if (git_hash_ctx_init(&file->digest) < 0)
229
+ goto cleanup;
226
230
  }
227
231
 
228
232
  compression = flags >> GIT_FILEBUF_DEFLATE_SHIFT;
@@ -291,16 +295,16 @@ cleanup:
291
295
 
292
296
  int git_filebuf_hash(git_oid *oid, git_filebuf *file)
293
297
  {
294
- assert(oid && file && file->digest);
298
+ assert(oid && file && file->compute_digest);
295
299
 
296
300
  flush_buffer(file);
297
301
 
298
302
  if (verify_last_error(file) < 0)
299
303
  return -1;
300
304
 
301
- git_hash_final(oid, file->digest);
302
- git_hash_free_ctx(file->digest);
303
- file->digest = NULL;
305
+ git_hash_final(oid, &file->digest);
306
+ git_hash_ctx_cleanup(&file->digest);
307
+ file->compute_digest = 0;
304
308
 
305
309
  return 0;
306
310
  }
@@ -466,3 +470,26 @@ int git_filebuf_printf(git_filebuf *file, const char *format, ...)
466
470
  return res;
467
471
  }
468
472
 
473
+ int git_filebuf_stats(time_t *mtime, size_t *size, git_filebuf *file)
474
+ {
475
+ int res;
476
+ struct stat st;
477
+
478
+ if (file->fd_is_open)
479
+ res = p_fstat(file->fd, &st);
480
+ else
481
+ res = p_stat(file->path_original, &st);
482
+
483
+ if (res < 0) {
484
+ giterr_set(GITERR_OS, "Could not get stat info for '%s'",
485
+ file->path_original);
486
+ return res;
487
+ }
488
+
489
+ if (mtime)
490
+ *mtime = st.st_mtime;
491
+ if (size)
492
+ *size = (size_t)st.st_size;
493
+
494
+ return 0;
495
+ }