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.
@@ -40,52 +40,34 @@ void giterr_set(int error_class, const char *string, ...)
40
40
  {
41
41
  git_buf buf = GIT_BUF_INIT;
42
42
  va_list arglist;
43
-
44
- int unix_error_code = 0;
45
-
46
- #ifdef GIT_WIN32
47
- DWORD win32_error_code = 0;
48
- #endif
49
-
50
- if (error_class == GITERR_OS) {
51
- unix_error_code = errno;
52
- errno = 0;
53
-
54
43
  #ifdef GIT_WIN32
55
- win32_error_code = GetLastError();
56
- SetLastError(0);
44
+ DWORD win32_error_code = (error_class == GITERR_OS) ? GetLastError() : 0;
57
45
  #endif
58
- }
46
+ int error_code = (error_class == GITERR_OS) ? errno : 0;
59
47
 
60
48
  va_start(arglist, string);
61
49
  git_buf_vprintf(&buf, string, arglist);
62
50
  va_end(arglist);
63
51
 
64
- /* automatically suffix strerror(errno) for GITERR_OS errors */
65
52
  if (error_class == GITERR_OS) {
66
-
67
- if (unix_error_code != 0) {
53
+ #ifdef GIT_WIN32
54
+ char * win32_error = git_win32_get_error_message(win32_error_code);
55
+ if (win32_error) {
68
56
  git_buf_PUTS(&buf, ": ");
69
- git_buf_puts(&buf, strerror(unix_error_code));
70
- }
57
+ git_buf_puts(&buf, win32_error);
58
+ git__free(win32_error);
71
59
 
72
- #ifdef GIT_WIN32
73
- else if (win32_error_code != 0) {
74
- LPVOID lpMsgBuf = NULL;
75
-
76
- FormatMessage(
77
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
78
- FORMAT_MESSAGE_FROM_SYSTEM |
79
- FORMAT_MESSAGE_IGNORE_INSERTS,
80
- NULL, win32_error_code, 0, (LPTSTR) &lpMsgBuf, 0, NULL);
81
-
82
- if (lpMsgBuf) {
83
- git_buf_PUTS(&buf, ": ");
84
- git_buf_puts(&buf, lpMsgBuf);
85
- LocalFree(lpMsgBuf);
86
- }
60
+ SetLastError(0);
87
61
  }
62
+ else
88
63
  #endif
64
+ if (error_code) {
65
+ git_buf_PUTS(&buf, ": ");
66
+ git_buf_puts(&buf, strerror(error_code));
67
+ }
68
+
69
+ if (error_code)
70
+ errno = 0;
89
71
  }
90
72
 
91
73
  if (!git_buf_oom(&buf))
@@ -104,15 +86,24 @@ void giterr_set_str(int error_class, const char *string)
104
86
  set_error(error_class, message);
105
87
  }
106
88
 
107
- void giterr_set_regex(const regex_t *regex, int error_code)
89
+ int giterr_set_regex(const regex_t *regex, int error_code)
108
90
  {
109
91
  char error_buf[1024];
92
+
93
+ assert(error_code);
94
+
110
95
  regerror(error_code, regex, error_buf, sizeof(error_buf));
111
96
  giterr_set_str(GITERR_REGEX, error_buf);
97
+
98
+ if (error_code == REG_NOMATCH)
99
+ return GIT_ENOTFOUND;
100
+
101
+ return GIT_EINVALIDSPEC;
112
102
  }
113
103
 
114
104
  void giterr_clear(void)
115
105
  {
106
+ set_error(0, NULL);
116
107
  GIT_GLOBAL->last_error = NULL;
117
108
 
118
109
  errno = 0;
@@ -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.
@@ -8,16 +8,14 @@
8
8
  #include "git2/oid.h"
9
9
  #include "git2/refs.h"
10
10
  #include "git2/revwalk.h"
11
- #include "git2/indexer.h"
11
+ #include "git2/transport.h"
12
12
 
13
13
  #include "common.h"
14
- #include "transport.h"
15
14
  #include "remote.h"
16
15
  #include "refspec.h"
17
16
  #include "pack.h"
18
17
  #include "fetch.h"
19
18
  #include "netops.h"
20
- #include "pkt.h"
21
19
 
22
20
  struct filter_payload {
23
21
  git_remote *remote;
@@ -86,61 +84,6 @@ cleanup:
86
84
  return error;
87
85
  }
88
86
 
89
- /* Wait until we get an ack from the */
90
- static int recv_pkt(git_pkt **out, gitno_buffer *buf)
91
- {
92
- const char *ptr = buf->data, *line_end = ptr;
93
- git_pkt *pkt;
94
- int pkt_type, error = 0, ret;
95
-
96
- do {
97
- if (buf->offset > 0)
98
- error = git_pkt_parse_line(&pkt, ptr, &line_end, buf->offset);
99
- else
100
- error = GIT_EBUFS;
101
-
102
- if (error == 0)
103
- break; /* return the pkt */
104
-
105
- if (error < 0 && error != GIT_EBUFS)
106
- return -1;
107
-
108
- if ((ret = gitno_recv(buf)) < 0)
109
- return -1;
110
- } while (error);
111
-
112
- gitno_consume(buf, line_end);
113
- pkt_type = pkt->type;
114
- if (out != NULL)
115
- *out = pkt;
116
- else
117
- git__free(pkt);
118
-
119
- return pkt_type;
120
- }
121
-
122
- static int store_common(git_transport *t)
123
- {
124
- git_pkt *pkt = NULL;
125
- gitno_buffer *buf = &t->buffer;
126
-
127
- do {
128
- if (recv_pkt(&pkt, buf) < 0)
129
- return -1;
130
-
131
- if (pkt->type == GIT_PKT_ACK) {
132
- if (git_vector_insert(&t->common, pkt) < 0)
133
- return -1;
134
- } else {
135
- git__free(pkt);
136
- return 0;
137
- }
138
-
139
- } while (1);
140
-
141
- return 0;
142
- }
143
-
144
87
  /*
145
88
  * In this first version, we push all our refs in and start sending
146
89
  * them out. When we get an ACK we hide that commit and continue
@@ -149,13 +92,7 @@ static int store_common(git_transport *t)
149
92
  int git_fetch_negotiate(git_remote *remote)
150
93
  {
151
94
  git_transport *t = remote->transport;
152
- gitno_buffer *buf = &t->buffer;
153
- git_buf data = GIT_BUF_INIT;
154
- git_revwalk *walk = NULL;
155
- int error = -1, pkt_type;
156
- unsigned int i;
157
- git_oid oid;
158
-
95
+
159
96
  if (filter_wants(remote) < 0) {
160
97
  giterr_set(GITERR_NET, "Failed to filter the reference list for wants");
161
98
  return -1;
@@ -167,298 +104,23 @@ int git_fetch_negotiate(git_remote *remote)
167
104
 
168
105
  /*
169
106
  * Now we have everything set up so we can start tell the
170
- * server what we want and what we have. Call the function if
171
- * the transport has its own logic. This is transitional and
172
- * will be removed once this function can support git and http.
173
- */
174
- if (t->own_logic)
175
- return t->negotiate_fetch(t, remote->repo, &remote->refs);
176
-
177
- /* No own logic, do our thing */
178
- if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
179
- return -1;
180
-
181
- if (git_fetch_setup_walk(&walk, remote->repo) < 0)
182
- goto on_error;
183
- /*
184
- * We don't support any kind of ACK extensions, so the negotiation
185
- * boils down to sending what we have and listening for an ACK
186
- * every once in a while.
107
+ * server what we want and what we have.
187
108
  */
188
- i = 0;
189
- while ((error = git_revwalk_next(&oid, walk)) == 0) {
190
- git_pkt_buffer_have(&oid, &data);
191
- i++;
192
- if (i % 20 == 0) {
193
- if (t->cancel.val) {
194
- giterr_set(GITERR_NET, "The fetch was cancelled by the user");
195
- error = GIT_EUSER;
196
- goto on_error;
197
- }
198
-
199
- git_pkt_buffer_flush(&data);
200
- if (git_buf_oom(&data))
201
- goto on_error;
202
-
203
- if (t->negotiation_step(t, data.ptr, data.size) < 0)
204
- goto on_error;
205
-
206
- git_buf_clear(&data);
207
- if (t->caps.multi_ack) {
208
- if (store_common(t) < 0)
209
- goto on_error;
210
- } else {
211
- pkt_type = recv_pkt(NULL, buf);
212
-
213
- if (pkt_type == GIT_PKT_ACK) {
214
- break;
215
- } else if (pkt_type == GIT_PKT_NAK) {
216
- continue;
217
- } else {
218
- giterr_set(GITERR_NET, "Unexpected pkt type");
219
- goto on_error;
220
- }
221
- }
222
- }
223
-
224
- if (t->common.length > 0)
225
- break;
226
-
227
- if (i % 20 == 0 && t->rpc) {
228
- git_pkt_ack *pkt;
229
- unsigned int i;
230
-
231
- if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
232
- goto on_error;
233
-
234
- git_vector_foreach(&t->common, i, pkt) {
235
- git_pkt_buffer_have(&pkt->oid, &data);
236
- }
237
-
238
- if (git_buf_oom(&data))
239
- goto on_error;
240
- }
241
- }
242
-
243
- if (error < 0 && error != GIT_ITEROVER)
244
- goto on_error;
245
-
246
- /* Tell the other end that we're done negotiating */
247
- if (t->rpc && t->common.length > 0) {
248
- git_pkt_ack *pkt;
249
- unsigned int i;
250
-
251
- if (git_pkt_buffer_wants(&remote->refs, &t->caps, &data) < 0)
252
- goto on_error;
253
-
254
- git_vector_foreach(&t->common, i, pkt) {
255
- git_pkt_buffer_have(&pkt->oid, &data);
256
- }
257
-
258
- if (git_buf_oom(&data))
259
- goto on_error;
260
- }
261
-
262
- git_pkt_buffer_done(&data);
263
- if (t->cancel.val) {
264
- giterr_set(GITERR_NET, "The fetch was cancelled by the user");
265
- error = GIT_EUSER;
266
- goto on_error;
267
- }
268
- if (t->negotiation_step(t, data.ptr, data.size) < 0)
269
- goto on_error;
270
-
271
- git_buf_free(&data);
272
- git_revwalk_free(walk);
273
-
274
- /* Now let's eat up whatever the server gives us */
275
- if (!t->caps.multi_ack) {
276
- pkt_type = recv_pkt(NULL, buf);
277
- if (pkt_type != GIT_PKT_ACK && pkt_type != GIT_PKT_NAK) {
278
- giterr_set(GITERR_NET, "Unexpected pkt type");
279
- return -1;
280
- }
281
- } else {
282
- git_pkt_ack *pkt;
283
- do {
284
- if (recv_pkt((git_pkt **)&pkt, buf) < 0)
285
- return -1;
286
-
287
- if (pkt->type == GIT_PKT_NAK ||
288
- (pkt->type == GIT_PKT_ACK && pkt->status != GIT_ACK_CONTINUE)) {
289
- git__free(pkt);
290
- break;
291
- }
292
-
293
- git__free(pkt);
294
- } while (1);
295
- }
296
-
297
- return 0;
298
-
299
- on_error:
300
- git_revwalk_free(walk);
301
- git_buf_free(&data);
302
- return error;
109
+ return t->negotiate_fetch(t,
110
+ remote->repo,
111
+ (const git_remote_head * const *)remote->refs.contents,
112
+ remote->refs.length);
303
113
  }
304
114
 
305
- int git_fetch_download_pack(git_remote *remote, git_off_t *bytes, git_indexer_stats *stats)
115
+ int git_fetch_download_pack(
116
+ git_remote *remote,
117
+ git_transfer_progress_callback progress_cb,
118
+ void *progress_payload)
306
119
  {
307
120
  git_transport *t = remote->transport;
308
121
 
309
122
  if(!remote->need_pack)
310
123
  return 0;
311
124
 
312
- if (t->own_logic)
313
- return t->download_pack(t, remote->repo, bytes, stats);
314
-
315
- return git_fetch__download_pack(t, remote->repo, bytes, stats);
316
-
317
- }
318
-
319
- static int no_sideband(git_transport *t, git_indexer_stream *idx, gitno_buffer *buf, git_off_t *bytes, git_indexer_stats *stats)
320
- {
321
- int recvd;
322
-
323
- do {
324
- if (t->cancel.val) {
325
- giterr_set(GITERR_NET, "The fetch was cancelled by the user");
326
- return GIT_EUSER;
327
- }
328
-
329
- if (git_indexer_stream_add(idx, buf->data, buf->offset, stats) < 0)
330
- return -1;
331
-
332
- gitno_consume_n(buf, buf->offset);
333
-
334
- if ((recvd = gitno_recv(buf)) < 0)
335
- return -1;
336
-
337
- *bytes += recvd;
338
- } while(recvd > 0);
339
-
340
- if (git_indexer_stream_finalize(idx, stats))
341
- return -1;
342
-
343
- return 0;
344
- }
345
-
346
- /* Receiving data from a socket and storing it is pretty much the same for git and HTTP */
347
- int git_fetch__download_pack(
348
- git_transport *t,
349
- git_repository *repo,
350
- git_off_t *bytes,
351
- git_indexer_stats *stats)
352
- {
353
- git_buf path = GIT_BUF_INIT;
354
- gitno_buffer *buf = &t->buffer;
355
- git_indexer_stream *idx = NULL;
356
- int error = -1;
357
-
358
- if (git_buf_joinpath(&path, git_repository_path(repo), "objects/pack") < 0)
359
- return -1;
360
-
361
- if (git_indexer_stream_new(&idx, git_buf_cstr(&path)) < 0)
362
- goto on_error;
363
-
364
- git_buf_free(&path);
365
- memset(stats, 0, sizeof(git_indexer_stats));
366
- *bytes = 0;
367
-
368
- /*
369
- * If the remote doesn't support the side-band, we can feed
370
- * the data directly to the indexer. Otherwise, we need to
371
- * check which one belongs there.
372
- */
373
- if (!t->caps.side_band && !t->caps.side_band_64k) {
374
- if (no_sideband(t, idx, buf, bytes, stats) < 0)
375
- goto on_error;
376
-
377
- git_indexer_stream_free(idx);
378
- return 0;
379
- }
380
-
381
- do {
382
- git_pkt *pkt;
383
-
384
- if (t->cancel.val) {
385
- giterr_set(GITERR_NET, "The fetch was cancelled by the user");
386
- error = GIT_EUSER;
387
- goto on_error;
388
- }
389
-
390
- if (recv_pkt(&pkt, buf) < 0)
391
- goto on_error;
392
-
393
- if (pkt->type == GIT_PKT_PROGRESS) {
394
- if (t->progress_cb) {
395
- git_pkt_progress *p = (git_pkt_progress *) pkt;
396
- t->progress_cb(p->data, p->len, t->cb_data);
397
- }
398
- git__free(pkt);
399
- } else if (pkt->type == GIT_PKT_DATA) {
400
- git_pkt_data *p = (git_pkt_data *) pkt;
401
- *bytes += p->len;
402
- if (git_indexer_stream_add(idx, p->data, p->len, stats) < 0)
403
- goto on_error;
404
-
405
- git__free(pkt);
406
- } else if (pkt->type == GIT_PKT_FLUSH) {
407
- /* A flush indicates the end of the packfile */
408
- git__free(pkt);
409
- break;
410
- }
411
- } while (1);
412
-
413
- if (git_indexer_stream_finalize(idx, stats) < 0)
414
- goto on_error;
415
-
416
- git_indexer_stream_free(idx);
417
- return 0;
418
-
419
- on_error:
420
- git_buf_free(&path);
421
- git_indexer_stream_free(idx);
422
- return error;
423
- }
424
-
425
- int git_fetch_setup_walk(git_revwalk **out, git_repository *repo)
426
- {
427
- git_revwalk *walk;
428
- git_strarray refs;
429
- unsigned int i;
430
- git_reference *ref;
431
-
432
- if (git_reference_list(&refs, repo, GIT_REF_LISTALL) < 0)
433
- return -1;
434
-
435
- if (git_revwalk_new(&walk, repo) < 0)
436
- return -1;
437
-
438
- git_revwalk_sorting(walk, GIT_SORT_TIME);
439
-
440
- for (i = 0; i < refs.count; ++i) {
441
- /* No tags */
442
- if (!git__prefixcmp(refs.strings[i], GIT_REFS_TAGS_DIR))
443
- continue;
444
-
445
- if (git_reference_lookup(&ref, repo, refs.strings[i]) < 0)
446
- goto on_error;
447
-
448
- if (git_reference_type(ref) == GIT_REF_SYMBOLIC)
449
- continue;
450
- if (git_revwalk_push(walk, git_reference_oid(ref)) < 0)
451
- goto on_error;
452
-
453
- git_reference_free(ref);
454
- }
455
-
456
- git_strarray_free(&refs);
457
- *out = walk;
458
- return 0;
459
-
460
- on_error:
461
- git_reference_free(ref);
462
- git_strarray_free(&refs);
463
- return -1;
125
+ return t->download_pack(t, remote->repo, &remote->stats, progress_cb, progress_payload);
464
126
  }