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
@@ -0,0 +1,60 @@
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.h"
9
+ #include "smart.h"
10
+ #include "git2/cred_helpers.h"
11
+
12
+ static void plaintext_free(struct git_cred *cred)
13
+ {
14
+ git_cred_userpass_plaintext *c = (git_cred_userpass_plaintext *)cred;
15
+ size_t pass_len = strlen(c->password);
16
+
17
+ git__free(c->username);
18
+
19
+ /* Zero the memory which previously held the password */
20
+ memset(c->password, 0x0, pass_len);
21
+ git__free(c->password);
22
+
23
+ memset(c, 0, sizeof(*c));
24
+
25
+ git__free(c);
26
+ }
27
+
28
+ int git_cred_userpass_plaintext_new(
29
+ git_cred **cred,
30
+ const char *username,
31
+ const char *password)
32
+ {
33
+ git_cred_userpass_plaintext *c;
34
+
35
+ if (!cred)
36
+ return -1;
37
+
38
+ c = git__malloc(sizeof(git_cred_userpass_plaintext));
39
+ GITERR_CHECK_ALLOC(c);
40
+
41
+ c->parent.credtype = GIT_CREDTYPE_USERPASS_PLAINTEXT;
42
+ c->parent.free = plaintext_free;
43
+ c->username = git__strdup(username);
44
+
45
+ if (!c->username) {
46
+ git__free(c);
47
+ return -1;
48
+ }
49
+
50
+ c->password = git__strdup(password);
51
+
52
+ if (!c->password) {
53
+ git__free(c->username);
54
+ git__free(c);
55
+ return -1;
56
+ }
57
+
58
+ *cred = &c->parent;
59
+ return 0;
60
+ }
@@ -0,0 +1,49 @@
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 "common.h"
9
+ #include "git2/cred_helpers.h"
10
+
11
+ int git_cred_userpass(
12
+ git_cred **cred,
13
+ const char *url,
14
+ const char *user_from_url,
15
+ unsigned int allowed_types,
16
+ void *payload)
17
+ {
18
+ git_cred_userpass_payload *userpass = (git_cred_userpass_payload*)payload;
19
+ const char *effective_username = NULL;
20
+
21
+ GIT_UNUSED(url);
22
+
23
+ if (!userpass || !userpass->password) return -1;
24
+
25
+ /* Username resolution: a username can be passed with the URL, the
26
+ * credentials payload, or both. Here's what we do. Note that if we get
27
+ * this far, we know that any password the url may contain has already
28
+ * failed at least once, so we ignore it.
29
+ *
30
+ * | Payload | URL | Used |
31
+ * +-------------+----------+-----------+
32
+ * | yes | no | payload |
33
+ * | yes | yes | payload |
34
+ * | no | yes | url |
35
+ * | no | no | FAIL |
36
+ */
37
+ if (userpass->username)
38
+ effective_username = userpass->username;
39
+ else if (user_from_url)
40
+ effective_username = user_from_url;
41
+ else
42
+ return -1;
43
+
44
+ if ((GIT_CREDTYPE_USERPASS_PLAINTEXT & allowed_types) == 0 ||
45
+ git_cred_userpass_plaintext_new(cred, effective_username, userpass->password) < 0)
46
+ return -1;
47
+
48
+ return 0;
49
+ }
@@ -1,44 +1,42 @@
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.
6
6
  */
7
7
 
8
- #include "git2/net.h"
9
- #include "git2/common.h"
10
- #include "git2/types.h"
11
- #include "git2/errors.h"
12
- #include "git2/net.h"
13
- #include "git2/revwalk.h"
14
-
15
- #include "vector.h"
16
- #include "transport.h"
17
- #include "pkt.h"
18
- #include "common.h"
8
+ #include "git2.h"
9
+ #include "buffer.h"
19
10
  #include "netops.h"
20
- #include "filebuf.h"
21
- #include "repository.h"
22
- #include "fetch.h"
23
- #include "protocol.h"
11
+
12
+ #define OWNING_SUBTRANSPORT(s) ((git_subtransport *)(s)->parent.subtransport)
13
+
14
+ static const char prefix_git[] = "git://";
15
+ static const char cmd_uploadpack[] = "git-upload-pack";
16
+ static const char cmd_receivepack[] = "git-receive-pack";
17
+
18
+ typedef struct {
19
+ git_smart_subtransport_stream parent;
20
+ gitno_socket socket;
21
+ const char *cmd;
22
+ char *url;
23
+ unsigned sent_command : 1;
24
+ } git_stream;
24
25
 
25
26
  typedef struct {
26
- git_transport parent;
27
- char buff[65536];
28
- #ifdef GIT_WIN32
29
- WSADATA wsd;
30
- #endif
31
- } transport_git;
27
+ git_smart_subtransport parent;
28
+ git_transport *owner;
29
+ git_stream *current_stream;
30
+ } git_subtransport;
32
31
 
33
32
  /*
34
- * Create a git procol request.
33
+ * Create a git protocol request.
35
34
  *
36
35
  * For example: 0035git-upload-pack /libgit2/libgit2\0host=github.com\0
37
36
  */
38
37
  static int gen_proto(git_buf *request, const char *cmd, const char *url)
39
38
  {
40
39
  char *delim, *repo;
41
- char default_command[] = "git-upload-pack";
42
40
  char host[] = "host=";
43
41
  size_t len;
44
42
 
@@ -54,9 +52,6 @@ static int gen_proto(git_buf *request, const char *cmd, const char *url)
54
52
  if (delim == NULL)
55
53
  delim = strchr(url, '/');
56
54
 
57
- if (cmd == NULL)
58
- cmd = default_command;
59
-
60
55
  len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + strlen(host) + (delim - url) + 1;
61
56
 
62
57
  git_buf_grow(request, len);
@@ -71,175 +66,287 @@ static int gen_proto(git_buf *request, const char *cmd, const char *url)
71
66
  return 0;
72
67
  }
73
68
 
74
- static int send_request(git_transport *t, const char *cmd, const char *url)
69
+ static int send_command(git_stream *s)
75
70
  {
76
71
  int error;
77
72
  git_buf request = GIT_BUF_INIT;
78
73
 
79
- error = gen_proto(&request, cmd, url);
74
+ error = gen_proto(&request, s->cmd, s->url);
80
75
  if (error < 0)
81
76
  goto cleanup;
82
77
 
83
- error = gitno_send(t, request.ptr, request.size, 0);
78
+ /* It looks like negative values are errors here, and positive values
79
+ * are the number of bytes sent. */
80
+ error = gitno_send(&s->socket, request.ptr, request.size, 0);
81
+
82
+ if (error >= 0)
83
+ s->sent_command = 1;
84
84
 
85
85
  cleanup:
86
86
  git_buf_free(&request);
87
87
  return error;
88
88
  }
89
89
 
90
- /*
91
- * Parse the URL and connect to a server, storing the socket in
92
- * out. For convenience this also takes care of asking for the remote
93
- * refs
94
- */
95
- static int do_connect(transport_git *t, const char *url)
90
+ static int git_stream_read(
91
+ git_smart_subtransport_stream *stream,
92
+ char *buffer,
93
+ size_t buf_size,
94
+ size_t *bytes_read)
96
95
  {
97
- char *host, *port;
98
- const char prefix[] = "git://";
96
+ git_stream *s = (git_stream *)stream;
97
+ gitno_buffer buf;
99
98
 
100
- if (!git__prefixcmp(url, prefix))
101
- url += strlen(prefix);
99
+ *bytes_read = 0;
102
100
 
103
- if (gitno_extract_host_and_port(&host, &port, url, GIT_DEFAULT_PORT) < 0)
101
+ if (!s->sent_command && send_command(s) < 0)
104
102
  return -1;
105
103
 
106
- if (gitno_connect((git_transport *)t, host, port) < 0)
107
- goto on_error;
104
+ gitno_buffer_setup(&s->socket, &buf, buffer, buf_size);
108
105
 
109
- if (send_request((git_transport *)t, NULL, url) < 0)
110
- goto on_error;
106
+ if (gitno_recv(&buf) < 0)
107
+ return -1;
111
108
 
112
- git__free(host);
113
- git__free(port);
109
+ *bytes_read = buf.offset;
114
110
 
115
111
  return 0;
116
-
117
- on_error:
118
- git__free(host);
119
- git__free(port);
120
- gitno_close(t->parent.socket);
121
- return -1;
122
112
  }
123
113
 
124
- /*
125
- * Since this is a network connection, we need to parse and store the
126
- * pkt-lines at this stage and keep them there.
127
- */
128
- static int git_connect(git_transport *transport, int direction)
114
+ static int git_stream_write(
115
+ git_smart_subtransport_stream *stream,
116
+ const char *buffer,
117
+ size_t len)
129
118
  {
130
- transport_git *t = (transport_git *) transport;
119
+ git_stream *s = (git_stream *)stream;
131
120
 
132
- if (direction == GIT_DIR_PUSH) {
133
- giterr_set(GITERR_NET, "Pushing over git:// is not supported");
121
+ if (!s->sent_command && send_command(s) < 0)
134
122
  return -1;
123
+
124
+ return gitno_send(&s->socket, buffer, len, 0);
125
+ }
126
+
127
+ static void git_stream_free(git_smart_subtransport_stream *stream)
128
+ {
129
+ git_stream *s = (git_stream *)stream;
130
+ git_subtransport *t = OWNING_SUBTRANSPORT(s);
131
+ int ret;
132
+
133
+ GIT_UNUSED(ret);
134
+
135
+ t->current_stream = NULL;
136
+
137
+ if (s->socket.socket) {
138
+ ret = gitno_close(&s->socket);
139
+ assert(!ret);
135
140
  }
136
141
 
137
- t->parent.direction = direction;
142
+ git__free(s->url);
143
+ git__free(s);
144
+ }
138
145
 
139
- /* Connect and ask for the refs */
140
- if (do_connect(t, transport->url) < 0)
146
+ static int git_stream_alloc(
147
+ git_subtransport *t,
148
+ const char *url,
149
+ const char *cmd,
150
+ git_smart_subtransport_stream **stream)
151
+ {
152
+ git_stream *s;
153
+
154
+ if (!stream)
141
155
  return -1;
142
156
 
143
- gitno_buffer_setup(transport, &transport->buffer, t->buff, sizeof(t->buff));
157
+ s = git__calloc(sizeof(git_stream), 1);
158
+ GITERR_CHECK_ALLOC(s);
159
+
160
+ s->parent.subtransport = &t->parent;
161
+ s->parent.read = git_stream_read;
162
+ s->parent.write = git_stream_write;
163
+ s->parent.free = git_stream_free;
164
+
165
+ s->cmd = cmd;
166
+ s->url = git__strdup(url);
144
167
 
145
- t->parent.connected = 1;
146
- if (git_protocol_store_refs(transport, 1) < 0)
168
+ if (!s->url) {
169
+ git__free(s);
147
170
  return -1;
171
+ }
172
+
173
+ *stream = &s->parent;
174
+ return 0;
175
+ }
176
+
177
+ static int _git_uploadpack_ls(
178
+ git_subtransport *t,
179
+ const char *url,
180
+ git_smart_subtransport_stream **stream)
181
+ {
182
+ char *host, *port, *user=NULL, *pass=NULL;
183
+ git_stream *s;
148
184
 
149
- if (git_protocol_detect_caps(git_vector_get(&transport->refs, 0), &transport->caps) < 0)
185
+ *stream = NULL;
186
+
187
+ if (!git__prefixcmp(url, prefix_git))
188
+ url += strlen(prefix_git);
189
+
190
+ if (git_stream_alloc(t, url, cmd_uploadpack, stream) < 0)
150
191
  return -1;
151
192
 
193
+ s = (git_stream *)*stream;
194
+
195
+ if (gitno_extract_url_parts(&host, &port, &user, &pass, url, GIT_DEFAULT_PORT) < 0)
196
+ goto on_error;
197
+
198
+ if (gitno_connect(&s->socket, host, port, 0) < 0)
199
+ goto on_error;
200
+
201
+ t->current_stream = s;
202
+ git__free(host);
203
+ git__free(port);
204
+ git__free(user);
205
+ git__free(pass);
152
206
  return 0;
207
+
208
+ on_error:
209
+ if (*stream)
210
+ git_stream_free(*stream);
211
+
212
+ git__free(host);
213
+ git__free(port);
214
+ return -1;
153
215
  }
154
216
 
155
- static int git_negotiation_step(struct git_transport *transport, void *data, size_t len)
217
+ static int _git_uploadpack(
218
+ git_subtransport *t,
219
+ const char *url,
220
+ git_smart_subtransport_stream **stream)
156
221
  {
157
- return gitno_send(transport, data, len, 0);
222
+ GIT_UNUSED(url);
223
+
224
+ if (t->current_stream) {
225
+ *stream = &t->current_stream->parent;
226
+ return 0;
227
+ }
228
+
229
+ giterr_set(GITERR_NET, "Must call UPLOADPACK_LS before UPLOADPACK");
230
+ return -1;
158
231
  }
159
232
 
160
- static int git_close(git_transport *t)
233
+ static int _git_receivepack_ls(
234
+ git_subtransport *t,
235
+ const char *url,
236
+ git_smart_subtransport_stream **stream)
161
237
  {
162
- git_buf buf = GIT_BUF_INIT;
238
+ char *host, *port, *user=NULL, *pass=NULL;
239
+ git_stream *s;
163
240
 
164
- if (git_pkt_buffer_flush(&buf) < 0)
165
- return -1;
166
- /* Can't do anything if there's an error, so don't bother checking */
167
- gitno_send(t, buf.ptr, buf.size, 0);
168
- git_buf_free(&buf);
241
+ *stream = NULL;
242
+
243
+ if (!git__prefixcmp(url, prefix_git))
244
+ url += strlen(prefix_git);
169
245
 
170
- if (gitno_close(t->socket) < 0) {
171
- giterr_set(GITERR_NET, "Failed to close socket");
246
+ if (git_stream_alloc(t, url, cmd_receivepack, stream) < 0)
172
247
  return -1;
173
- }
174
248
 
175
- t->connected = 0;
249
+ s = (git_stream *)*stream;
176
250
 
177
- #ifdef GIT_WIN32
178
- WSACleanup();
179
- #endif
251
+ if (gitno_extract_url_parts(&host, &port, &user, &pass, url, GIT_DEFAULT_PORT) < 0)
252
+ goto on_error;
253
+
254
+ if (gitno_connect(&s->socket, host, port, 0) < 0)
255
+ goto on_error;
180
256
 
257
+ t->current_stream = s;
258
+ git__free(host);
259
+ git__free(port);
260
+ git__free(user);
261
+ git__free(pass);
181
262
  return 0;
263
+
264
+ on_error:
265
+ if (*stream)
266
+ git_stream_free(*stream);
267
+
268
+ git__free(host);
269
+ git__free(port);
270
+ return -1;
182
271
  }
183
272
 
184
- static void git_free(git_transport *transport)
273
+ static int _git_receivepack(
274
+ git_subtransport *t,
275
+ const char *url,
276
+ git_smart_subtransport_stream **stream)
185
277
  {
186
- transport_git *t = (transport_git *) transport;
187
- git_vector *refs = &transport->refs;
188
- unsigned int i;
278
+ GIT_UNUSED(url);
189
279
 
190
- for (i = 0; i < refs->length; ++i) {
191
- git_pkt *p = git_vector_get(refs, i);
192
- git_pkt_free(p);
280
+ if (t->current_stream) {
281
+ *stream = &t->current_stream->parent;
282
+ return 0;
193
283
  }
194
- git_vector_free(refs);
195
284
 
196
- refs = &transport->common;
197
- for (i = 0; i < refs->length; ++i) {
198
- git_pkt *p = git_vector_get(refs, i);
199
- git_pkt_free(p);
285
+ giterr_set(GITERR_NET, "Must call RECEIVEPACK_LS before RECEIVEPACK");
286
+ return -1;
287
+ }
288
+
289
+ static int _git_action(
290
+ git_smart_subtransport_stream **stream,
291
+ git_smart_subtransport *subtransport,
292
+ const char *url,
293
+ git_smart_service_t action)
294
+ {
295
+ git_subtransport *t = (git_subtransport *) subtransport;
296
+
297
+ switch (action) {
298
+ case GIT_SERVICE_UPLOADPACK_LS:
299
+ return _git_uploadpack_ls(t, url, stream);
300
+
301
+ case GIT_SERVICE_UPLOADPACK:
302
+ return _git_uploadpack(t, url, stream);
303
+
304
+ case GIT_SERVICE_RECEIVEPACK_LS:
305
+ return _git_receivepack_ls(t, url, stream);
306
+
307
+ case GIT_SERVICE_RECEIVEPACK:
308
+ return _git_receivepack(t, url, stream);
200
309
  }
201
- git_vector_free(refs);
202
310
 
203
- git__free(t->parent.url);
204
- git__free(t);
311
+ *stream = NULL;
312
+ return -1;
205
313
  }
206
314
 
207
- int git_transport_git(git_transport **out)
315
+ static int _git_close(git_smart_subtransport *subtransport)
208
316
  {
209
- transport_git *t;
210
- #ifdef GIT_WIN32
211
- int ret;
212
- #endif
317
+ git_subtransport *t = (git_subtransport *) subtransport;
213
318
 
214
- t = git__malloc(sizeof(transport_git));
215
- GITERR_CHECK_ALLOC(t);
319
+ assert(!t->current_stream);
216
320
 
217
- memset(t, 0x0, sizeof(transport_git));
218
- if (git_vector_init(&t->parent.common, 8, NULL))
219
- goto on_error;
321
+ GIT_UNUSED(t);
220
322
 
221
- if (git_vector_init(&t->parent.refs, 16, NULL) < 0)
222
- goto on_error;
323
+ return 0;
324
+ }
223
325
 
224
- t->parent.connect = git_connect;
225
- t->parent.negotiation_step = git_negotiation_step;
226
- t->parent.close = git_close;
227
- t->parent.free = git_free;
326
+ static void _git_free(git_smart_subtransport *subtransport)
327
+ {
328
+ git_subtransport *t = (git_subtransport *) subtransport;
228
329
 
229
- *out = (git_transport *) t;
330
+ assert(!t->current_stream);
230
331
 
231
- #ifdef GIT_WIN32
232
- ret = WSAStartup(MAKEWORD(2,2), &t->wsd);
233
- if (ret != 0) {
234
- git_free(*out);
235
- giterr_set(GITERR_NET, "Winsock init failed");
332
+ git__free(t);
333
+ }
334
+
335
+ int git_smart_subtransport_git(git_smart_subtransport **out, git_transport *owner)
336
+ {
337
+ git_subtransport *t;
338
+
339
+ if (!out)
236
340
  return -1;
237
- }
238
- #endif
239
341
 
240
- return 0;
342
+ t = git__calloc(sizeof(git_subtransport), 1);
343
+ GITERR_CHECK_ALLOC(t);
241
344
 
242
- on_error:
243
- git__free(t);
244
- return -1;
345
+ t->owner = owner;
346
+ t->parent.action = _git_action;
347
+ t->parent.close = _git_close;
348
+ t->parent.free = _git_free;
349
+
350
+ *out = (git_smart_subtransport *) t;
351
+ return 0;
245
352
  }