rugged 0.26.7 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (341) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/rugged/rugged_blame.c +6 -3
  4. data/ext/rugged/rugged_branch_collection.c +3 -6
  5. data/ext/rugged/rugged_commit.c +56 -0
  6. data/ext/rugged/rugged_config.c +44 -9
  7. data/ext/rugged/rugged_diff.c +3 -14
  8. data/ext/rugged/rugged_diff_hunk.c +1 -3
  9. data/ext/rugged/rugged_index.c +1 -5
  10. data/ext/rugged/rugged_note.c +1 -4
  11. data/ext/rugged/rugged_patch.c +1 -4
  12. data/ext/rugged/rugged_reference_collection.c +1 -7
  13. data/ext/rugged/rugged_remote.c +5 -8
  14. data/ext/rugged/rugged_remote_collection.c +1 -6
  15. data/ext/rugged/rugged_repo.c +16 -48
  16. data/ext/rugged/rugged_revwalk.c +7 -16
  17. data/ext/rugged/rugged_settings.c +28 -0
  18. data/ext/rugged/rugged_submodule_collection.c +3 -4
  19. data/ext/rugged/rugged_tag_collection.c +1 -5
  20. data/ext/rugged/rugged_tree.c +2 -3
  21. data/lib/rugged/repository.rb +43 -0
  22. data/lib/rugged/version.rb +1 -1
  23. data/vendor/libgit2/AUTHORS +1 -0
  24. data/vendor/libgit2/CMakeLists.txt +61 -510
  25. data/vendor/libgit2/cmake/Modules/EnableWarnings.cmake +14 -0
  26. data/vendor/libgit2/cmake/Modules/FindCoreFoundation.cmake +25 -8
  27. data/vendor/libgit2/cmake/Modules/FindSecurity.cmake +27 -8
  28. data/vendor/libgit2/cmake/Modules/FindStatNsec.cmake +20 -0
  29. data/vendor/libgit2/cmake/Modules/IdeSplitSources.cmake +22 -0
  30. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +3 -0
  31. data/vendor/libgit2/deps/regex/CMakeLists.txt +2 -0
  32. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +26 -0
  33. data/vendor/libgit2/deps/zlib/CMakeLists.txt +4 -0
  34. data/vendor/libgit2/include/git2/config.h +29 -2
  35. data/vendor/libgit2/include/git2/describe.h +1 -1
  36. data/vendor/libgit2/include/git2/diff.h +59 -8
  37. data/vendor/libgit2/include/git2/graph.h +3 -0
  38. data/vendor/libgit2/include/git2/merge.h +6 -0
  39. data/vendor/libgit2/include/git2/message.h +43 -3
  40. data/vendor/libgit2/include/git2/notes.h +89 -0
  41. data/vendor/libgit2/include/git2/odb.h +8 -1
  42. data/vendor/libgit2/include/git2/patch.h +2 -2
  43. data/vendor/libgit2/include/git2/pathspec.h +35 -18
  44. data/vendor/libgit2/include/git2/refs.h +3 -0
  45. data/vendor/libgit2/include/git2/remote.h +34 -4
  46. data/vendor/libgit2/include/git2/repository.h +6 -6
  47. data/vendor/libgit2/include/git2/reset.h +4 -4
  48. data/vendor/libgit2/include/git2/status.h +4 -0
  49. data/vendor/libgit2/include/git2/sys/config.h +4 -1
  50. data/vendor/libgit2/include/git2/sys/odb_backend.h +2 -1
  51. data/vendor/libgit2/include/git2/tree.h +4 -3
  52. data/vendor/libgit2/include/git2/types.h +1 -0
  53. data/vendor/libgit2/include/git2/version.h +4 -4
  54. data/vendor/libgit2/include/git2/worktree.h +1 -1
  55. data/vendor/libgit2/src/CMakeLists.txt +463 -0
  56. data/vendor/libgit2/src/annotated_commit.c +1 -1
  57. data/vendor/libgit2/src/annotated_commit.h +2 -0
  58. data/vendor/libgit2/src/apply.c +2 -1
  59. data/vendor/libgit2/src/apply.h +2 -0
  60. data/vendor/libgit2/src/attr.c +24 -4
  61. data/vendor/libgit2/src/attr.h +2 -0
  62. data/vendor/libgit2/src/attr_file.c +9 -2
  63. data/vendor/libgit2/src/attr_file.h +2 -0
  64. data/vendor/libgit2/src/attrcache.c +9 -1
  65. data/vendor/libgit2/src/attrcache.h +2 -0
  66. data/vendor/libgit2/src/blame.c +1 -0
  67. data/vendor/libgit2/src/blame.h +2 -1
  68. data/vendor/libgit2/src/blame_git.c +1 -0
  69. data/vendor/libgit2/src/blame_git.h +2 -0
  70. data/vendor/libgit2/src/blob.c +2 -2
  71. data/vendor/libgit2/src/blob.h +2 -0
  72. data/vendor/libgit2/src/branch.c +8 -1
  73. data/vendor/libgit2/src/branch.h +2 -0
  74. data/vendor/libgit2/src/buf_text.c +7 -7
  75. data/vendor/libgit2/src/buf_text.h +3 -3
  76. data/vendor/libgit2/src/buffer.c +31 -1
  77. data/vendor/libgit2/src/buffer.h +3 -0
  78. data/vendor/libgit2/src/cache.c +2 -2
  79. data/vendor/libgit2/src/cache.h +2 -0
  80. data/vendor/libgit2/src/cc-compat.h +3 -3
  81. data/vendor/libgit2/src/checkout.c +30 -19
  82. data/vendor/libgit2/src/checkout.h +2 -0
  83. data/vendor/libgit2/src/cherrypick.c +1 -0
  84. data/vendor/libgit2/src/clone.c +2 -1
  85. data/vendor/libgit2/src/clone.h +4 -0
  86. data/vendor/libgit2/src/commit.c +2 -1
  87. data/vendor/libgit2/src/commit.h +2 -0
  88. data/vendor/libgit2/src/commit_list.c +1 -1
  89. data/vendor/libgit2/src/commit_list.h +2 -0
  90. data/vendor/libgit2/src/common.h +11 -5
  91. data/vendor/libgit2/src/config.c +12 -10
  92. data/vendor/libgit2/src/config.h +2 -0
  93. data/vendor/libgit2/src/config_cache.c +1 -0
  94. data/vendor/libgit2/src/config_file.c +287 -786
  95. data/vendor/libgit2/src/config_file.h +4 -3
  96. data/vendor/libgit2/src/config_parse.c +525 -0
  97. data/vendor/libgit2/src/config_parse.h +64 -0
  98. data/vendor/libgit2/src/crlf.c +2 -1
  99. data/vendor/libgit2/src/delta.c +28 -30
  100. data/vendor/libgit2/src/delta.h +1 -0
  101. data/vendor/libgit2/src/describe.c +3 -1
  102. data/vendor/libgit2/src/diff.c +148 -2
  103. data/vendor/libgit2/src/diff.h +3 -1
  104. data/vendor/libgit2/src/diff_driver.c +12 -9
  105. data/vendor/libgit2/src/diff_driver.h +4 -1
  106. data/vendor/libgit2/src/diff_file.c +7 -4
  107. data/vendor/libgit2/src/diff_file.h +1 -0
  108. data/vendor/libgit2/src/diff_generate.c +6 -3
  109. data/vendor/libgit2/src/diff_generate.h +6 -1
  110. data/vendor/libgit2/src/diff_parse.c +5 -4
  111. data/vendor/libgit2/src/diff_parse.h +2 -0
  112. data/vendor/libgit2/src/diff_print.c +2 -0
  113. data/vendor/libgit2/src/diff_stats.c +2 -0
  114. data/vendor/libgit2/src/diff_tform.c +2 -1
  115. data/vendor/libgit2/src/diff_tform.h +4 -1
  116. data/vendor/libgit2/src/diff_xdiff.c +5 -2
  117. data/vendor/libgit2/src/diff_xdiff.h +2 -0
  118. data/vendor/libgit2/src/errors.c +2 -0
  119. data/vendor/libgit2/src/features.h.in +36 -0
  120. data/vendor/libgit2/src/fetch.c +2 -2
  121. data/vendor/libgit2/src/fetch.h +4 -0
  122. data/vendor/libgit2/src/fetchhead.c +3 -3
  123. data/vendor/libgit2/src/fetchhead.h +3 -0
  124. data/vendor/libgit2/src/filebuf.c +2 -1
  125. data/vendor/libgit2/src/filebuf.h +2 -0
  126. data/vendor/libgit2/src/fileops.c +12 -1
  127. data/vendor/libgit2/src/fileops.h +7 -1
  128. data/vendor/libgit2/src/filter.c +2 -1
  129. data/vendor/libgit2/src/filter.h +1 -0
  130. data/vendor/libgit2/src/fnmatch.c +2 -2
  131. data/vendor/libgit2/src/fnmatch.h +3 -4
  132. data/vendor/libgit2/src/global.c +4 -3
  133. data/vendor/libgit2/src/global.h +1 -5
  134. data/vendor/libgit2/src/graph.c +2 -0
  135. data/vendor/libgit2/src/hash.c +0 -1
  136. data/vendor/libgit2/src/hash.h +3 -1
  137. data/vendor/libgit2/src/hash/hash_collisiondetect.h +3 -3
  138. data/vendor/libgit2/src/hash/hash_common_crypto.h +18 -5
  139. data/vendor/libgit2/src/hash/hash_generic.c +2 -2
  140. data/vendor/libgit2/src/hash/hash_generic.h +5 -3
  141. data/vendor/libgit2/src/hash/hash_openssl.h +3 -3
  142. data/vendor/libgit2/src/hash/hash_win32.c +57 -14
  143. data/vendor/libgit2/src/hash/hash_win32.h +4 -3
  144. data/vendor/libgit2/src/hashsig.c +3 -0
  145. data/vendor/libgit2/src/ident.c +2 -0
  146. data/vendor/libgit2/src/idxmap.h +2 -1
  147. data/vendor/libgit2/src/ignore.c +14 -2
  148. data/vendor/libgit2/src/ignore.h +2 -0
  149. data/vendor/libgit2/src/index.c +20 -40
  150. data/vendor/libgit2/src/index.h +2 -0
  151. data/vendor/libgit2/src/indexer.c +13 -5
  152. data/vendor/libgit2/src/indexer.h +5 -1
  153. data/vendor/libgit2/src/integer.h +1 -1
  154. data/vendor/libgit2/src/iterator.c +44 -3
  155. data/vendor/libgit2/src/iterator.h +3 -0
  156. data/vendor/libgit2/src/map.h +1 -1
  157. data/vendor/libgit2/src/merge.c +155 -33
  158. data/vendor/libgit2/src/merge.h +2 -0
  159. data/vendor/libgit2/src/merge_driver.c +2 -2
  160. data/vendor/libgit2/src/merge_driver.h +2 -0
  161. data/vendor/libgit2/src/merge_file.c +3 -0
  162. data/vendor/libgit2/src/message.h +3 -1
  163. data/vendor/libgit2/src/mwindow.c +1 -1
  164. data/vendor/libgit2/src/mwindow.h +2 -0
  165. data/vendor/libgit2/src/netops.c +75 -62
  166. data/vendor/libgit2/src/netops.h +2 -1
  167. data/vendor/libgit2/src/notes.c +164 -48
  168. data/vendor/libgit2/src/notes.h +1 -1
  169. data/vendor/libgit2/src/object.c +14 -3
  170. data/vendor/libgit2/src/object.h +4 -0
  171. data/vendor/libgit2/src/object_api.c +3 -2
  172. data/vendor/libgit2/src/odb.c +104 -38
  173. data/vendor/libgit2/src/odb.h +3 -1
  174. data/vendor/libgit2/src/odb_loose.c +414 -267
  175. data/vendor/libgit2/src/odb_mempack.c +1 -0
  176. data/vendor/libgit2/src/odb_pack.c +2 -1
  177. data/vendor/libgit2/src/offmap.h +1 -0
  178. data/vendor/libgit2/src/oid.c +2 -1
  179. data/vendor/libgit2/src/oid.h +3 -8
  180. data/vendor/libgit2/src/oidarray.c +2 -1
  181. data/vendor/libgit2/src/oidarray.h +1 -0
  182. data/vendor/libgit2/src/oidmap.h +1 -0
  183. data/vendor/libgit2/src/pack-objects.c +5 -1
  184. data/vendor/libgit2/src/pack-objects.h +1 -1
  185. data/vendor/libgit2/src/pack.c +2 -6
  186. data/vendor/libgit2/src/pack.h +2 -1
  187. data/vendor/libgit2/src/parse.c +121 -0
  188. data/vendor/libgit2/src/parse.h +61 -0
  189. data/vendor/libgit2/src/patch.c +9 -2
  190. data/vendor/libgit2/src/patch.h +2 -0
  191. data/vendor/libgit2/src/patch_generate.c +6 -5
  192. data/vendor/libgit2/src/patch_generate.h +1 -0
  193. data/vendor/libgit2/src/patch_parse.c +265 -276
  194. data/vendor/libgit2/src/patch_parse.h +6 -11
  195. data/vendor/libgit2/src/path.c +24 -181
  196. data/vendor/libgit2/src/path.h +14 -73
  197. data/vendor/libgit2/src/pathspec.c +2 -1
  198. data/vendor/libgit2/src/pathspec.h +2 -1
  199. data/vendor/libgit2/src/pool.c +8 -0
  200. data/vendor/libgit2/src/pool.h +1 -0
  201. data/vendor/libgit2/src/posix.c +2 -1
  202. data/vendor/libgit2/src/posix.h +1 -0
  203. data/vendor/libgit2/src/pqueue.c +1 -0
  204. data/vendor/libgit2/src/pqueue.h +2 -0
  205. data/vendor/libgit2/src/proxy.c +2 -1
  206. data/vendor/libgit2/src/proxy.h +3 -1
  207. data/vendor/libgit2/src/push.c +4 -171
  208. data/vendor/libgit2/src/push.h +2 -0
  209. data/vendor/libgit2/src/rebase.c +1 -0
  210. data/vendor/libgit2/src/refdb.c +2 -3
  211. data/vendor/libgit2/src/refdb.h +2 -0
  212. data/vendor/libgit2/src/refdb_fs.c +5 -3
  213. data/vendor/libgit2/src/refdb_fs.h +4 -0
  214. data/vendor/libgit2/src/reflog.c +1 -0
  215. data/vendor/libgit2/src/reflog.h +2 -1
  216. data/vendor/libgit2/src/refs.c +1 -0
  217. data/vendor/libgit2/src/refs.h +2 -1
  218. data/vendor/libgit2/src/refspec.c +2 -2
  219. data/vendor/libgit2/src/refspec.h +2 -0
  220. data/vendor/libgit2/src/remote.c +56 -10
  221. data/vendor/libgit2/src/remote.h +2 -0
  222. data/vendor/libgit2/src/repository.c +16 -14
  223. data/vendor/libgit2/src/repository.h +2 -0
  224. data/vendor/libgit2/src/reset.c +6 -5
  225. data/vendor/libgit2/src/revert.c +1 -0
  226. data/vendor/libgit2/src/revparse.c +3 -5
  227. data/vendor/libgit2/src/revwalk.c +2 -2
  228. data/vendor/libgit2/src/revwalk.h +2 -0
  229. data/vendor/libgit2/src/settings.c +6 -8
  230. data/vendor/libgit2/src/sha1_lookup.c +2 -216
  231. data/vendor/libgit2/src/sha1_lookup.h +2 -6
  232. data/vendor/libgit2/src/signature.c +8 -3
  233. data/vendor/libgit2/src/signature.h +2 -0
  234. data/vendor/libgit2/src/sortedcache.c +7 -0
  235. data/vendor/libgit2/src/sortedcache.h +2 -0
  236. data/vendor/libgit2/src/stash.c +1 -0
  237. data/vendor/libgit2/src/status.c +14 -9
  238. data/vendor/libgit2/src/status.h +2 -0
  239. data/vendor/libgit2/src/{curl_stream.c → streams/curl.c} +2 -0
  240. data/vendor/libgit2/src/{curl_stream.h → streams/curl.h} +4 -2
  241. data/vendor/libgit2/src/{openssl_stream.c → streams/openssl.c} +47 -18
  242. data/vendor/libgit2/src/{openssl_stream.h → streams/openssl.h} +6 -2
  243. data/vendor/libgit2/src/{socket_stream.c → streams/socket.c} +2 -2
  244. data/vendor/libgit2/src/{socket_stream.h → streams/socket.h} +4 -2
  245. data/vendor/libgit2/src/{stransport_stream.c → streams/stransport.c} +4 -2
  246. data/vendor/libgit2/src/{stransport_stream.h → streams/stransport.h} +4 -2
  247. data/vendor/libgit2/src/{tls_stream.c → streams/tls.c} +4 -3
  248. data/vendor/libgit2/src/{tls_stream.h → streams/tls.h} +4 -2
  249. data/vendor/libgit2/src/submodule.c +28 -80
  250. data/vendor/libgit2/src/submodule.h +2 -13
  251. data/vendor/libgit2/src/sysdir.c +75 -8
  252. data/vendor/libgit2/src/sysdir.h +2 -1
  253. data/vendor/libgit2/src/tag.c +2 -2
  254. data/vendor/libgit2/src/tag.h +2 -0
  255. data/vendor/libgit2/src/thread-utils.c +1 -0
  256. data/vendor/libgit2/src/thread-utils.h +1 -1
  257. data/vendor/libgit2/src/trace.c +2 -2
  258. data/vendor/libgit2/src/trace.h +2 -0
  259. data/vendor/libgit2/src/trailer.c +416 -0
  260. data/vendor/libgit2/src/transaction.c +2 -1
  261. data/vendor/libgit2/src/transport.c +2 -0
  262. data/vendor/libgit2/src/transports/auth.c +2 -1
  263. data/vendor/libgit2/src/transports/auth.h +4 -3
  264. data/vendor/libgit2/src/transports/auth_negotiate.c +2 -1
  265. data/vendor/libgit2/src/transports/auth_negotiate.h +3 -3
  266. data/vendor/libgit2/src/transports/cred.c +2 -0
  267. data/vendor/libgit2/src/transports/cred.h +4 -2
  268. data/vendor/libgit2/src/transports/cred_helpers.c +1 -0
  269. data/vendor/libgit2/src/transports/git.c +3 -1
  270. data/vendor/libgit2/src/transports/http.c +10 -14
  271. data/vendor/libgit2/src/transports/http.h +23 -0
  272. data/vendor/libgit2/src/transports/local.c +23 -5
  273. data/vendor/libgit2/src/transports/smart.c +3 -1
  274. data/vendor/libgit2/src/transports/smart.h +23 -16
  275. data/vendor/libgit2/src/transports/smart_pkt.c +114 -130
  276. data/vendor/libgit2/src/transports/smart_protocol.c +26 -22
  277. data/vendor/libgit2/src/transports/ssh.c +12 -7
  278. data/vendor/libgit2/src/transports/ssh.h +4 -2
  279. data/vendor/libgit2/src/transports/winhttp.c +19 -21
  280. data/vendor/libgit2/src/tree-cache.c +1 -0
  281. data/vendor/libgit2/src/tree-cache.h +1 -0
  282. data/vendor/libgit2/src/tree.c +20 -14
  283. data/vendor/libgit2/src/tree.h +2 -0
  284. data/vendor/libgit2/src/tsort.c +0 -1
  285. data/vendor/libgit2/src/unix/map.c +4 -1
  286. data/vendor/libgit2/src/unix/posix.h +8 -4
  287. data/vendor/libgit2/src/unix/pthread.h +1 -1
  288. data/vendor/libgit2/src/unix/realpath.c +4 -1
  289. data/vendor/libgit2/src/util.c +6 -5
  290. data/vendor/libgit2/src/util.h +39 -111
  291. data/vendor/libgit2/src/varint.c +0 -1
  292. data/vendor/libgit2/src/varint.h +2 -0
  293. data/vendor/libgit2/src/vector.c +1 -1
  294. data/vendor/libgit2/src/win32/dir.c +3 -0
  295. data/vendor/libgit2/src/win32/dir.h +4 -3
  296. data/vendor/libgit2/src/win32/error.c +1 -1
  297. data/vendor/libgit2/src/win32/error.h +4 -2
  298. data/vendor/libgit2/src/win32/findfile.c +2 -1
  299. data/vendor/libgit2/src/win32/findfile.h +4 -2
  300. data/vendor/libgit2/src/win32/map.c +2 -0
  301. data/vendor/libgit2/src/win32/mingw-compat.h +3 -3
  302. data/vendor/libgit2/src/win32/msvc-compat.h +3 -3
  303. data/vendor/libgit2/src/win32/path_w32.c +7 -12
  304. data/vendor/libgit2/src/win32/path_w32.h +3 -2
  305. data/vendor/libgit2/src/win32/posix.h +2 -2
  306. data/vendor/libgit2/src/win32/posix_w32.c +11 -5
  307. data/vendor/libgit2/src/win32/precompiled.h +2 -1
  308. data/vendor/libgit2/src/win32/reparse.h +2 -2
  309. data/vendor/libgit2/src/win32/thread.c +1 -0
  310. data/vendor/libgit2/src/win32/thread.h +2 -2
  311. data/vendor/libgit2/src/win32/utf-conv.c +0 -1
  312. data/vendor/libgit2/src/win32/utf-conv.h +4 -3
  313. data/vendor/libgit2/src/win32/w32_buffer.c +1 -1
  314. data/vendor/libgit2/src/win32/w32_buffer.h +4 -2
  315. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.c +2 -1
  316. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +85 -2
  317. data/vendor/libgit2/src/win32/w32_stack.c +2 -1
  318. data/vendor/libgit2/src/win32/w32_stack.h +5 -3
  319. data/vendor/libgit2/src/win32/w32_util.h +4 -2
  320. data/vendor/libgit2/src/win32/win32-compat.h +3 -3
  321. data/vendor/libgit2/src/worktree.c +4 -5
  322. data/vendor/libgit2/src/worktree.h +2 -0
  323. data/vendor/libgit2/src/xdiff/xdiff.h +22 -13
  324. data/vendor/libgit2/src/xdiff/xdiffi.c +523 -81
  325. data/vendor/libgit2/src/xdiff/xdiffi.h +2 -2
  326. data/vendor/libgit2/src/xdiff/xemit.c +63 -39
  327. data/vendor/libgit2/src/xdiff/xemit.h +2 -2
  328. data/vendor/libgit2/src/xdiff/xhistogram.c +0 -1
  329. data/vendor/libgit2/src/xdiff/xinclude.h +3 -2
  330. data/vendor/libgit2/src/xdiff/xmacros.h +2 -2
  331. data/vendor/libgit2/src/xdiff/xmerge.c +80 -20
  332. data/vendor/libgit2/src/xdiff/xpatience.c +41 -9
  333. data/vendor/libgit2/src/xdiff/xprepare.c +2 -2
  334. data/vendor/libgit2/src/xdiff/xprepare.h +2 -2
  335. data/vendor/libgit2/src/xdiff/xtypes.h +2 -2
  336. data/vendor/libgit2/src/xdiff/xutils.c +47 -27
  337. data/vendor/libgit2/src/xdiff/xutils.h +2 -5
  338. data/vendor/libgit2/src/zstream.c +65 -45
  339. data/vendor/libgit2/src/zstream.h +9 -2
  340. metadata +27 -13
  341. data/vendor/libgit2/include/git2/sys/remote.h +0 -16
@@ -5,7 +5,8 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
- #include "common.h"
8
+ #include "transaction.h"
9
+
9
10
  #include "repository.h"
10
11
  #include "strmap.h"
11
12
  #include "refdb.h"
@@ -4,7 +4,9 @@
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 "common.h"
9
+
8
10
  #include "git2/types.h"
9
11
  #include "git2/remote.h"
10
12
  #include "git2/net.h"
@@ -5,9 +5,10 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
+ #include "auth.h"
9
+
8
10
  #include "git2.h"
9
11
  #include "buffer.h"
10
- #include "auth.h"
11
12
 
12
13
  static int basic_next_token(
13
14
  git_buf *out, git_http_auth_context *ctx, git_cred *c)
@@ -5,8 +5,10 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
- #ifndef INCLUDE_http_auth_h__
9
- #define INCLUDE_http_auth_h__
8
+ #ifndef INCLUDE_transports_auth_h__
9
+ #define INCLUDE_transports_auth_h__
10
+
11
+ #include "common.h"
10
12
 
11
13
  #include "git2.h"
12
14
  #include "netops.h"
@@ -60,4 +62,3 @@ int git_http_auth_basic(
60
62
  const gitno_connection_data *connection_data);
61
63
 
62
64
  #endif
63
-
@@ -5,10 +5,11 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
+ #include "auth_negotiate.h"
9
+
8
10
  #ifdef GIT_GSSAPI
9
11
 
10
12
  #include "git2.h"
11
- #include "common.h"
12
13
  #include "buffer.h"
13
14
  #include "auth.h"
14
15
 
@@ -5,9 +5,10 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
- #ifndef INCLUDE_auth_negotiate_h__
9
- #define INCLUDE_auth_negotiate_h__
8
+ #ifndef INCLUDE_transports_auth_negotiate_h__
9
+ #define INCLUDE_transports_auth_negotiate_h__
10
10
 
11
+ #include "common.h"
11
12
  #include "git2.h"
12
13
  #include "auth.h"
13
14
 
@@ -24,4 +25,3 @@ extern int git_http_auth_negotiate(
24
25
  #endif /* GIT_GSSAPI */
25
26
 
26
27
  #endif
27
-
@@ -5,6 +5,8 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
+ #include "cred.h"
9
+
8
10
  #include "git2.h"
9
11
  #include "smart.h"
10
12
  #include "git2/cred_helpers.h"
@@ -4,8 +4,10 @@
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
- #ifndef INCLUDE_git_cred_h__
8
- #define INCLUDE_git_cred_h__
7
+ #ifndef INCLUDE_transports_cred_h__
8
+ #define INCLUDE_transports_cred_h__
9
+
10
+ #include "common.h"
9
11
 
10
12
  #include "git2/transport.h"
11
13
 
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  #include "common.h"
9
+
9
10
  #include "git2/cred_helpers.h"
10
11
 
11
12
  int git_cred_userpass(
@@ -5,12 +5,14 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
+ #include "common.h"
9
+
8
10
  #include "git2.h"
9
11
  #include "buffer.h"
10
12
  #include "netops.h"
11
13
  #include "git2/sys/transport.h"
12
14
  #include "stream.h"
13
- #include "socket_stream.h"
15
+ #include "streams/socket.h"
14
16
 
15
17
  #define OWNING_SUBTRANSPORT(s) ((git_subtransport *)(s)->parent.subtransport)
16
18
 
@@ -4,6 +4,9 @@
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
+
8
+ #include "common.h"
9
+
7
10
  #ifndef GIT_WINHTTP
8
11
 
9
12
  #include "git2.h"
@@ -14,10 +17,11 @@
14
17
  #include "remote.h"
15
18
  #include "smart.h"
16
19
  #include "auth.h"
20
+ #include "http.h"
17
21
  #include "auth_negotiate.h"
18
- #include "tls_stream.h"
19
- #include "socket_stream.h"
20
- #include "curl_stream.h"
22
+ #include "streams/tls.h"
23
+ #include "streams/socket.h"
24
+ #include "streams/curl.h"
21
25
 
22
26
  git_http_auth_scheme auth_schemes[] = {
23
27
  { GIT_AUTHTYPE_NEGOTIATE, "Negotiate", GIT_CREDTYPE_DEFAULT, git_http_auth_negotiate },
@@ -187,16 +191,6 @@ static int apply_credentials(git_buf *buf, http_subtransport *t)
187
191
  return context->next_token(buf, context, cred);
188
192
  }
189
193
 
190
- static const char *user_agent(void)
191
- {
192
- const char *custom = git_libgit2__user_agent();
193
-
194
- if (custom)
195
- return custom;
196
-
197
- return "libgit2 " LIBGIT2_VERSION;
198
- }
199
-
200
194
  static int gen_request(
201
195
  git_buf *buf,
202
196
  http_stream *s,
@@ -208,7 +202,9 @@ static int gen_request(
208
202
 
209
203
  git_buf_printf(buf, "%s %s%s HTTP/1.1\r\n", s->verb, path, s->service_url);
210
204
 
211
- git_buf_printf(buf, "User-Agent: git/2.0 (%s)\r\n", user_agent());
205
+ git_buf_puts(buf, "User-Agent: ");
206
+ git_http__user_agent(buf);
207
+ git_buf_puts(buf, "\r\n");
212
208
  git_buf_printf(buf, "Host: %s\r\n", t->connection_data.host);
213
209
 
214
210
  if (s->chunked || content_length > 0) {
@@ -0,0 +1,23 @@
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
+ #ifndef INCLUDE_transports_http_h__
9
+ #define INCLUDE_transports_http_h__
10
+
11
+ #include "buffer.h"
12
+
13
+ GIT_INLINE(int) git_http__user_agent(git_buf *buf)
14
+ {
15
+ const char *ua = git_libgit2__user_agent();
16
+
17
+ if (!ua)
18
+ ua = "libgit2 " LIBGIT2_VERSION;
19
+
20
+ return git_buf_printf(buf, "git/2.0 (%s)", ua);
21
+ }
22
+
23
+ #endif
@@ -4,7 +4,9 @@
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 "common.h"
9
+
8
10
  #include "git2/types.h"
9
11
  #include "git2/net.h"
10
12
  #include "git2/repository.h"
@@ -16,6 +18,7 @@
16
18
  #include "git2/pack.h"
17
19
  #include "git2/commit.h"
18
20
  #include "git2/revparse.h"
21
+
19
22
  #include "pack-objects.h"
20
23
  #include "refs.h"
21
24
  #include "posix.h"
@@ -504,6 +507,23 @@ static int local_counting(int stage, unsigned int current, unsigned int total, v
504
507
  return error;
505
508
  }
506
509
 
510
+ static int foreach_reference_cb(git_reference *reference, void *payload)
511
+ {
512
+ git_revwalk *walk = (git_revwalk *)payload;
513
+
514
+ int error = git_revwalk_hide(walk, git_reference_target(reference));
515
+ /* The reference is in the local repository, so the target may not
516
+ * exist on the remote. It also may not be a commit. */
517
+ if (error == GIT_ENOTFOUND || error == GITERR_INVALID) {
518
+ giterr_clear();
519
+ error = 0;
520
+ }
521
+
522
+ git_reference_free(reference);
523
+
524
+ return error;
525
+ }
526
+
507
527
  static int local_download_pack(
508
528
  git_transport *transport,
509
529
  git_repository *repo,
@@ -543,11 +563,6 @@ static int local_download_pack(
543
563
  if (git_object_type(obj) == GIT_OBJ_COMMIT) {
544
564
  /* Revwalker includes only wanted commits */
545
565
  error = git_revwalk_push(walk, &rhead->oid);
546
- if (!error && !git_oid_iszero(&rhead->loid)) {
547
- error = git_revwalk_hide(walk, &rhead->loid);
548
- if (error == GIT_ENOTFOUND)
549
- error = 0;
550
- }
551
566
  } else {
552
567
  /* Tag or some other wanted object. Add it on its own */
553
568
  error = git_packbuilder_insert_recur(pack, &rhead->oid, rhead->name);
@@ -557,6 +572,9 @@ static int local_download_pack(
557
572
  goto cleanup;
558
573
  }
559
574
 
575
+ if ((error = git_reference_foreach(repo, foreach_reference_cb, walk)))
576
+ goto cleanup;
577
+
560
578
  if ((error = git_packbuilder_insert_walk(pack, walk)))
561
579
  goto cleanup;
562
580
 
@@ -4,8 +4,10 @@
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
- #include "git2.h"
7
+
8
8
  #include "smart.h"
9
+
10
+ #include "git2.h"
9
11
  #include "refs.h"
10
12
  #include "refspec.h"
11
13
  #include "proxy.h"
@@ -4,6 +4,11 @@
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
+ #ifndef INCLUDE_transports_smart_h__
8
+ #define INCLUDE_transports_smart_h__
9
+
10
+ #include "common.h"
11
+
7
12
  #include "git2.h"
8
13
  #include "vector.h"
9
14
  #include "netops.h"
@@ -28,14 +33,14 @@
28
33
 
29
34
  extern bool git_smart__ofs_delta_enabled;
30
35
 
31
- typedef enum {
36
+ enum git_pkt_type {
32
37
  GIT_PKT_CMD,
33
38
  GIT_PKT_FLUSH,
34
39
  GIT_PKT_REF,
35
40
  GIT_PKT_HAVE,
36
41
  GIT_PKT_ACK,
37
42
  GIT_PKT_NAK,
38
- GIT_PKT_PACK__UNUSED,
43
+ GIT_PKT_PACK,
39
44
  GIT_PKT_COMMENT,
40
45
  GIT_PKT_ERR,
41
46
  GIT_PKT_DATA,
@@ -43,7 +48,7 @@ typedef enum {
43
48
  GIT_PKT_OK,
44
49
  GIT_PKT_NG,
45
50
  GIT_PKT_UNPACK,
46
- } git_pkt_type;
51
+ };
47
52
 
48
53
  /* Used for multi_ack and mutli_ack_detailed */
49
54
  enum git_ack_status {
@@ -55,11 +60,11 @@ enum git_ack_status {
55
60
 
56
61
  /* This would be a flush pkt */
57
62
  typedef struct {
58
- git_pkt_type type;
63
+ enum git_pkt_type type;
59
64
  } git_pkt;
60
65
 
61
66
  struct git_pkt_cmd {
62
- git_pkt_type type;
67
+ enum git_pkt_type type;
63
68
  char *cmd;
64
69
  char *path;
65
70
  char *host;
@@ -67,50 +72,50 @@ struct git_pkt_cmd {
67
72
 
68
73
  /* This is a pkt-line with some info in it */
69
74
  typedef struct {
70
- git_pkt_type type;
75
+ enum git_pkt_type type;
71
76
  git_remote_head head;
72
77
  char *capabilities;
73
78
  } git_pkt_ref;
74
79
 
75
80
  /* Useful later */
76
81
  typedef struct {
77
- git_pkt_type type;
82
+ enum git_pkt_type type;
78
83
  git_oid oid;
79
84
  enum git_ack_status status;
80
85
  } git_pkt_ack;
81
86
 
82
87
  typedef struct {
83
- git_pkt_type type;
88
+ enum git_pkt_type type;
84
89
  char comment[GIT_FLEX_ARRAY];
85
90
  } git_pkt_comment;
86
91
 
87
92
  typedef struct {
88
- git_pkt_type type;
89
- size_t len;
93
+ enum git_pkt_type type;
94
+ int len;
90
95
  char data[GIT_FLEX_ARRAY];
91
96
  } git_pkt_data;
92
97
 
93
98
  typedef git_pkt_data git_pkt_progress;
94
99
 
95
100
  typedef struct {
96
- git_pkt_type type;
97
- size_t len;
101
+ enum git_pkt_type type;
102
+ int len;
98
103
  char error[GIT_FLEX_ARRAY];
99
104
  } git_pkt_err;
100
105
 
101
106
  typedef struct {
102
- git_pkt_type type;
107
+ enum git_pkt_type type;
103
108
  char *ref;
104
109
  } git_pkt_ok;
105
110
 
106
111
  typedef struct {
107
- git_pkt_type type;
112
+ enum git_pkt_type type;
108
113
  char *ref;
109
114
  char *msg;
110
115
  } git_pkt_ng;
111
116
 
112
117
  typedef struct {
113
- git_pkt_type type;
118
+ enum git_pkt_type type;
114
119
  int unpack_ok;
115
120
  } git_pkt_unpack;
116
121
 
@@ -184,10 +189,12 @@ int git_smart__get_push_stream(transport_smart *t, git_smart_subtransport_stream
184
189
  int git_smart__update_heads(transport_smart *t, git_vector *symrefs);
185
190
 
186
191
  /* smart_pkt.c */
187
- int git_pkt_parse_line(git_pkt **head, const char **endptr, const char *line, size_t linelen);
192
+ int git_pkt_parse_line(git_pkt **head, const char *line, const char **out, size_t len);
188
193
  int git_pkt_buffer_flush(git_buf *buf);
189
194
  int git_pkt_send_flush(GIT_SOCKET s);
190
195
  int git_pkt_buffer_done(git_buf *buf);
191
196
  int git_pkt_buffer_wants(const git_remote_head * const *refs, size_t count, transport_smart_caps *caps, git_buf *buf);
192
197
  int git_pkt_buffer_have(git_oid *oid, git_buf *buf);
193
198
  void git_pkt_free(git_pkt *pkt);
199
+
200
+ #endif
@@ -43,43 +43,34 @@ static int flush_pkt(git_pkt **out)
43
43
  static int ack_pkt(git_pkt **out, const char *line, size_t len)
44
44
  {
45
45
  git_pkt_ack *pkt;
46
+ GIT_UNUSED(line);
47
+ GIT_UNUSED(len);
46
48
 
47
49
  pkt = git__calloc(1, sizeof(git_pkt_ack));
48
50
  GITERR_CHECK_ALLOC(pkt);
49
- pkt->type = GIT_PKT_ACK;
50
-
51
- if (git__prefixncmp(line, len, "ACK "))
52
- goto out_err;
53
- line += 4;
54
- len -= 4;
55
51
 
56
- if (len < GIT_OID_HEXSZ || git_oid_fromstr(&pkt->oid, line) < 0)
57
- goto out_err;
58
- line += GIT_OID_HEXSZ;
59
- len -= GIT_OID_HEXSZ;
52
+ pkt->type = GIT_PKT_ACK;
53
+ line += 3;
54
+ len -= 3;
60
55
 
61
- if (len && line[0] == ' ') {
62
- line++;
63
- len--;
56
+ if (len >= GIT_OID_HEXSZ) {
57
+ git_oid_fromstr(&pkt->oid, line + 1);
58
+ line += GIT_OID_HEXSZ + 1;
59
+ len -= GIT_OID_HEXSZ + 1;
60
+ }
64
61
 
65
- if (!git__prefixncmp(line, len, "continue"))
62
+ if (len >= 7) {
63
+ if (!git__prefixcmp(line + 1, "continue"))
66
64
  pkt->status = GIT_ACK_CONTINUE;
67
- else if (!git__prefixncmp(line, len, "common"))
65
+ if (!git__prefixcmp(line + 1, "common"))
68
66
  pkt->status = GIT_ACK_COMMON;
69
- else if (!git__prefixncmp(line, len, "ready"))
67
+ if (!git__prefixcmp(line + 1, "ready"))
70
68
  pkt->status = GIT_ACK_READY;
71
- else
72
- goto out_err;
73
69
  }
74
70
 
75
71
  *out = (git_pkt *) pkt;
76
72
 
77
73
  return 0;
78
-
79
- out_err:
80
- giterr_set(GITERR_NET, "error parsing ACK pkt-line");
81
- git__free(pkt);
82
- return -1;
83
74
  }
84
75
 
85
76
  static int nak_pkt(git_pkt **out)
@@ -95,6 +86,19 @@ static int nak_pkt(git_pkt **out)
95
86
  return 0;
96
87
  }
97
88
 
89
+ static int pack_pkt(git_pkt **out)
90
+ {
91
+ git_pkt *pkt;
92
+
93
+ pkt = git__malloc(sizeof(git_pkt));
94
+ GITERR_CHECK_ALLOC(pkt);
95
+
96
+ pkt->type = GIT_PKT_PACK;
97
+ *out = pkt;
98
+
99
+ return 0;
100
+ }
101
+
98
102
  static int comment_pkt(git_pkt **out, const char *line, size_t len)
99
103
  {
100
104
  git_pkt_comment *pkt;
@@ -116,12 +120,10 @@ static int comment_pkt(git_pkt **out, const char *line, size_t len)
116
120
 
117
121
  static int err_pkt(git_pkt **out, const char *line, size_t len)
118
122
  {
119
- git_pkt_err *pkt = NULL;
123
+ git_pkt_err *pkt;
120
124
  size_t alloclen;
121
125
 
122
126
  /* Remove "ERR " from the line */
123
- if (git__prefixncmp(line, len, "ERR "))
124
- goto out_err;
125
127
  line += 4;
126
128
  len -= 4;
127
129
 
@@ -129,20 +131,15 @@ static int err_pkt(git_pkt **out, const char *line, size_t len)
129
131
  GITERR_CHECK_ALLOC_ADD(&alloclen, alloclen, 1);
130
132
  pkt = git__malloc(alloclen);
131
133
  GITERR_CHECK_ALLOC(pkt);
132
- pkt->type = GIT_PKT_ERR;
133
- pkt->len = len;
134
134
 
135
+ pkt->type = GIT_PKT_ERR;
136
+ pkt->len = (int)len;
135
137
  memcpy(pkt->error, line, len);
136
138
  pkt->error[len] = '\0';
137
139
 
138
140
  *out = (git_pkt *) pkt;
139
141
 
140
142
  return 0;
141
-
142
- out_err:
143
- giterr_set(GITERR_NET, "error parsing ERR pkt-line");
144
- git__free(pkt);
145
- return -1;
146
143
  }
147
144
 
148
145
  static int data_pkt(git_pkt **out, const char *line, size_t len)
@@ -158,7 +155,7 @@ static int data_pkt(git_pkt **out, const char *line, size_t len)
158
155
  GITERR_CHECK_ALLOC(pkt);
159
156
 
160
157
  pkt->type = GIT_PKT_DATA;
161
- pkt->len = len;
158
+ pkt->len = (int) len;
162
159
  memcpy(pkt->data, line, len);
163
160
 
164
161
  *out = (git_pkt *) pkt;
@@ -179,7 +176,7 @@ static int sideband_progress_pkt(git_pkt **out, const char *line, size_t len)
179
176
  GITERR_CHECK_ALLOC(pkt);
180
177
 
181
178
  pkt->type = GIT_PKT_PROGRESS;
182
- pkt->len = len;
179
+ pkt->len = (int) len;
183
180
  memcpy(pkt->data, line, len);
184
181
 
185
182
  *out = (git_pkt *) pkt;
@@ -215,25 +212,28 @@ static int sideband_error_pkt(git_pkt **out, const char *line, size_t len)
215
212
  */
216
213
  static int ref_pkt(git_pkt **out, const char *line, size_t len)
217
214
  {
215
+ int error;
218
216
  git_pkt_ref *pkt;
219
217
  size_t alloclen;
220
218
 
221
- pkt = git__calloc(1, sizeof(git_pkt_ref));
219
+ pkt = git__malloc(sizeof(git_pkt_ref));
222
220
  GITERR_CHECK_ALLOC(pkt);
223
- pkt->type = GIT_PKT_REF;
224
221
 
225
- if (len < GIT_OID_HEXSZ || git_oid_fromstr(&pkt->head.oid, line) < 0)
226
- goto out_err;
227
- line += GIT_OID_HEXSZ;
228
- len -= GIT_OID_HEXSZ;
229
-
230
- if (git__prefixncmp(line, len, " "))
231
- goto out_err;
232
- line++;
233
- len--;
222
+ memset(pkt, 0x0, sizeof(git_pkt_ref));
223
+ pkt->type = GIT_PKT_REF;
224
+ if ((error = git_oid_fromstr(&pkt->head.oid, line)) < 0)
225
+ goto error_out;
226
+
227
+ /* Check for a bit of consistency */
228
+ if (line[GIT_OID_HEXSZ] != ' ') {
229
+ giterr_set(GITERR_NET, "error parsing pkt-line");
230
+ error = -1;
231
+ goto error_out;
232
+ }
234
233
 
235
- if (!len)
236
- goto out_err;
234
+ /* Jump from the name */
235
+ line += GIT_OID_HEXSZ + 1;
236
+ len -= (GIT_OID_HEXSZ + 1);
237
237
 
238
238
  if (line[len - 1] == '\n')
239
239
  --len;
@@ -245,36 +245,36 @@ static int ref_pkt(git_pkt **out, const char *line, size_t len)
245
245
  memcpy(pkt->head.name, line, len);
246
246
  pkt->head.name[len] = '\0';
247
247
 
248
- if (strlen(pkt->head.name) < len)
248
+ if (strlen(pkt->head.name) < len) {
249
249
  pkt->capabilities = strchr(pkt->head.name, '\0') + 1;
250
+ }
250
251
 
251
252
  *out = (git_pkt *)pkt;
252
253
  return 0;
253
254
 
254
- out_err:
255
- giterr_set(GITERR_NET, "error parsing REF pkt-line");
256
- if (pkt)
257
- git__free(pkt->head.name);
255
+ error_out:
258
256
  git__free(pkt);
259
- return -1;
257
+ return error;
260
258
  }
261
259
 
262
260
  static int ok_pkt(git_pkt **out, const char *line, size_t len)
263
261
  {
264
262
  git_pkt_ok *pkt;
263
+ const char *ptr;
265
264
  size_t alloc_len;
266
265
 
267
266
  pkt = git__malloc(sizeof(*pkt));
268
267
  GITERR_CHECK_ALLOC(pkt);
269
- pkt->type = GIT_PKT_OK;
270
268
 
271
- if (git__prefixncmp(line, len, "ok "))
272
- goto out_err;
273
- line += 3;
274
- len -= 3;
269
+ pkt->type = GIT_PKT_OK;
275
270
 
276
- if (line[len - 1] == '\n')
277
- --len;
271
+ line += 3; /* skip "ok " */
272
+ if (!(ptr = strchr(line, '\n'))) {
273
+ giterr_set(GITERR_NET, "invalid packet line");
274
+ git__free(pkt);
275
+ return -1;
276
+ }
277
+ len = ptr - line;
278
278
 
279
279
  GITERR_CHECK_ALLOC_ADD(&alloc_len, len, 1);
280
280
  pkt->ref = git__malloc(alloc_len);
@@ -285,17 +285,12 @@ static int ok_pkt(git_pkt **out, const char *line, size_t len)
285
285
 
286
286
  *out = (git_pkt *)pkt;
287
287
  return 0;
288
-
289
- out_err:
290
- giterr_set(GITERR_NET, "error parsing OK pkt-line");
291
- git__free(pkt);
292
- return -1;
293
288
  }
294
289
 
295
290
  static int ng_pkt(git_pkt **out, const char *line, size_t len)
296
291
  {
297
292
  git_pkt_ng *pkt;
298
- const char *ptr, *eol;
293
+ const char *ptr;
299
294
  size_t alloclen;
300
295
 
301
296
  pkt = git__malloc(sizeof(*pkt));
@@ -304,13 +299,8 @@ static int ng_pkt(git_pkt **out, const char *line, size_t len)
304
299
  pkt->ref = NULL;
305
300
  pkt->type = GIT_PKT_NG;
306
301
 
307
- eol = line + len;
308
-
309
- if (git__prefixncmp(line, len, "ng "))
310
- goto out_err;
311
- line += 3;
312
-
313
- if (!(ptr = memchr(line, ' ', eol - line)))
302
+ line += 3; /* skip "ng " */
303
+ if (!(ptr = strchr(line, ' ')))
314
304
  goto out_err;
315
305
  len = ptr - line;
316
306
 
@@ -322,10 +312,7 @@ static int ng_pkt(git_pkt **out, const char *line, size_t len)
322
312
  pkt->ref[len] = '\0';
323
313
 
324
314
  line = ptr + 1;
325
- if (line >= eol)
326
- goto out_err;
327
-
328
- if (!(ptr = memchr(line, '\n', eol - line)))
315
+ if (!(ptr = strchr(line, '\n')))
329
316
  goto out_err;
330
317
  len = ptr - line;
331
318
 
@@ -350,11 +337,13 @@ static int unpack_pkt(git_pkt **out, const char *line, size_t len)
350
337
  {
351
338
  git_pkt_unpack *pkt;
352
339
 
340
+ GIT_UNUSED(len);
341
+
353
342
  pkt = git__malloc(sizeof(*pkt));
354
343
  GITERR_CHECK_ALLOC(pkt);
355
- pkt->type = GIT_PKT_UNPACK;
356
344
 
357
- if (!git__prefixncmp(line, len, "unpack ok"))
345
+ pkt->type = GIT_PKT_UNPACK;
346
+ if (!git__prefixcmp(line, "unpack ok"))
358
347
  pkt->unpack_ok = 1;
359
348
  else
360
349
  pkt->unpack_ok = 0;
@@ -363,17 +352,13 @@ static int unpack_pkt(git_pkt **out, const char *line, size_t len)
363
352
  return 0;
364
353
  }
365
354
 
366
- static int parse_len(size_t *out, const char *line, size_t linelen)
355
+ static int32_t parse_len(const char *line)
367
356
  {
368
357
  char num[PKT_LEN_SIZE + 1];
369
358
  int i, k, error;
370
359
  int32_t len;
371
360
  const char *num_end;
372
361
 
373
- /* Not even enough for the length */
374
- if (linelen < PKT_LEN_SIZE)
375
- return GIT_EBUFS;
376
-
377
362
  memcpy(num, line, PKT_LEN_SIZE);
378
363
  num[PKT_LEN_SIZE] = '\0';
379
364
 
@@ -385,7 +370,7 @@ static int parse_len(size_t *out, const char *line, size_t linelen)
385
370
  num[k] = '.';
386
371
  }
387
372
  }
388
-
373
+
389
374
  giterr_set(GITERR_NET, "invalid hex digit in length: '%s'", num);
390
375
  return -1;
391
376
  }
@@ -394,11 +379,7 @@ static int parse_len(size_t *out, const char *line, size_t linelen)
394
379
  if ((error = git__strtol32(&len, num, &num_end, 16)) < 0)
395
380
  return error;
396
381
 
397
- if (len < 0)
398
- return -1;
399
-
400
- *out = (size_t) len;
401
- return 0;
382
+ return len;
402
383
  }
403
384
 
404
385
  /*
@@ -415,32 +396,35 @@ static int parse_len(size_t *out, const char *line, size_t linelen)
415
396
  */
416
397
 
417
398
  int git_pkt_parse_line(
418
- git_pkt **pkt, const char **endptr, const char *line, size_t linelen)
399
+ git_pkt **head, const char *line, const char **out, size_t bufflen)
419
400
  {
420
- int error;
421
- size_t len;
401
+ int ret;
402
+ int32_t len;
422
403
 
423
- if ((error = parse_len(&len, line, linelen)) < 0) {
404
+ /* Not even enough for the length */
405
+ if (bufflen > 0 && bufflen < PKT_LEN_SIZE)
406
+ return GIT_EBUFS;
407
+
408
+ len = parse_len(line);
409
+ if (len < 0) {
424
410
  /*
425
- * If we fail to parse the length, it might be
426
- * because the server is trying to send us the
427
- * packfile already or because we do not yet have
428
- * enough data.
411
+ * If we fail to parse the length, it might be because the
412
+ * server is trying to send us the packfile already.
429
413
  */
430
- if (error == GIT_EBUFS)
431
- ;
432
- else if (!git__prefixncmp(line, linelen, "PACK"))
433
- giterr_set(GITERR_NET, "unexpected pack file");
434
- else
435
- giterr_set(GITERR_NET, "bad packet length");
436
- return error;
414
+ if (bufflen >= 4 && !git__prefixcmp(line, "PACK")) {
415
+ giterr_clear();
416
+ *out = line;
417
+ return pack_pkt(head);
418
+ }
419
+
420
+ return (int)len;
437
421
  }
438
422
 
439
423
  /*
440
- * Make sure there is enough in the buffer to satisfy
441
- * this line.
424
+ * If we were given a buffer length, then make sure there is
425
+ * enough in the buffer to satisfy this line
442
426
  */
443
- if (linelen < len)
427
+ if (bufflen > 0 && bufflen < (size_t)len)
444
428
  return GIT_EBUFS;
445
429
 
446
430
  /*
@@ -463,38 +447,38 @@ int git_pkt_parse_line(
463
447
  }
464
448
 
465
449
  if (len == 0) { /* Flush pkt */
466
- *endptr = line;
467
- return flush_pkt(pkt);
450
+ *out = line;
451
+ return flush_pkt(head);
468
452
  }
469
453
 
470
454
  len -= PKT_LEN_SIZE; /* the encoded length includes its own size */
471
455
 
472
456
  if (*line == GIT_SIDE_BAND_DATA)
473
- error = data_pkt(pkt, line, len);
457
+ ret = data_pkt(head, line, len);
474
458
  else if (*line == GIT_SIDE_BAND_PROGRESS)
475
- error = sideband_progress_pkt(pkt, line, len);
459
+ ret = sideband_progress_pkt(head, line, len);
476
460
  else if (*line == GIT_SIDE_BAND_ERROR)
477
- error = sideband_error_pkt(pkt, line, len);
478
- else if (!git__prefixncmp(line, len, "ACK"))
479
- error = ack_pkt(pkt, line, len);
480
- else if (!git__prefixncmp(line, len, "NAK"))
481
- error = nak_pkt(pkt);
482
- else if (!git__prefixncmp(line, len, "ERR"))
483
- error = err_pkt(pkt, line, len);
461
+ ret = sideband_error_pkt(head, line, len);
462
+ else if (!git__prefixcmp(line, "ACK"))
463
+ ret = ack_pkt(head, line, len);
464
+ else if (!git__prefixcmp(line, "NAK"))
465
+ ret = nak_pkt(head);
466
+ else if (!git__prefixcmp(line, "ERR "))
467
+ ret = err_pkt(head, line, len);
484
468
  else if (*line == '#')
485
- error = comment_pkt(pkt, line, len);
486
- else if (!git__prefixncmp(line, len, "ok"))
487
- error = ok_pkt(pkt, line, len);
488
- else if (!git__prefixncmp(line, len, "ng"))
489
- error = ng_pkt(pkt, line, len);
490
- else if (!git__prefixncmp(line, len, "unpack"))
491
- error = unpack_pkt(pkt, line, len);
469
+ ret = comment_pkt(head, line, len);
470
+ else if (!git__prefixcmp(line, "ok"))
471
+ ret = ok_pkt(head, line, len);
472
+ else if (!git__prefixcmp(line, "ng"))
473
+ ret = ng_pkt(head, line, len);
474
+ else if (!git__prefixcmp(line, "unpack"))
475
+ ret = unpack_pkt(head, line, len);
492
476
  else
493
- error = ref_pkt(pkt, line, len);
477
+ ret = ref_pkt(head, line, len);
494
478
 
495
- *endptr = line + len;
479
+ *out = line + len;
496
480
 
497
- return error;
481
+ return ret;
498
482
  }
499
483
 
500
484
  void git_pkt_free(git_pkt *pkt)