rugged 1.6.3 → 1.9.0

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 (443) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/AUTHORS +1 -0
  5. data/vendor/libgit2/CMakeLists.txt +25 -17
  6. data/vendor/libgit2/COPYING +195 -1
  7. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  8. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  9. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  10. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
  11. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
  14. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  15. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  16. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  17. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  18. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  19. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  20. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  21. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  22. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  23. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  25. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  27. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  28. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  29. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  30. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  31. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  32. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  33. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  34. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  35. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  36. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  37. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  38. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  39. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  40. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  41. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  42. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  43. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  44. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  45. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  46. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
  47. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  48. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  49. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  50. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  51. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  52. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  53. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  54. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  55. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  56. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  57. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  58. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  59. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  60. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  61. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  62. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  63. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  64. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  65. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  66. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  67. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  68. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  69. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  70. data/vendor/libgit2/include/git2/apply.h +27 -6
  71. data/vendor/libgit2/include/git2/attr.h +17 -4
  72. data/vendor/libgit2/include/git2/blame.h +133 -28
  73. data/vendor/libgit2/include/git2/blob.h +71 -28
  74. data/vendor/libgit2/include/git2/branch.h +22 -15
  75. data/vendor/libgit2/include/git2/buffer.h +6 -4
  76. data/vendor/libgit2/include/git2/cert.h +2 -1
  77. data/vendor/libgit2/include/git2/checkout.h +83 -32
  78. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  79. data/vendor/libgit2/include/git2/clone.h +25 -9
  80. data/vendor/libgit2/include/git2/commit.h +132 -3
  81. data/vendor/libgit2/include/git2/common.h +138 -56
  82. data/vendor/libgit2/include/git2/config.h +93 -23
  83. data/vendor/libgit2/include/git2/credential.h +30 -2
  84. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  85. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  86. data/vendor/libgit2/include/git2/describe.h +13 -1
  87. data/vendor/libgit2/include/git2/diff.h +77 -9
  88. data/vendor/libgit2/include/git2/email.h +9 -29
  89. data/vendor/libgit2/include/git2/errors.h +49 -74
  90. data/vendor/libgit2/include/git2/filter.h +14 -7
  91. data/vendor/libgit2/include/git2/global.h +8 -1
  92. data/vendor/libgit2/include/git2/graph.h +3 -2
  93. data/vendor/libgit2/include/git2/ignore.h +10 -0
  94. data/vendor/libgit2/include/git2/index.h +100 -6
  95. data/vendor/libgit2/include/git2/indexer.h +21 -4
  96. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  97. data/vendor/libgit2/include/git2/merge.h +46 -1
  98. data/vendor/libgit2/include/git2/message.h +2 -2
  99. data/vendor/libgit2/include/git2/net.h +3 -1
  100. data/vendor/libgit2/include/git2/notes.h +9 -6
  101. data/vendor/libgit2/include/git2/object.h +9 -8
  102. data/vendor/libgit2/include/git2/odb.h +91 -49
  103. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  104. data/vendor/libgit2/include/git2/oid.h +24 -25
  105. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  106. data/vendor/libgit2/include/git2/pack.h +13 -1
  107. data/vendor/libgit2/include/git2/patch.h +2 -3
  108. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  109. data/vendor/libgit2/include/git2/proxy.h +10 -0
  110. data/vendor/libgit2/include/git2/rebase.h +9 -6
  111. data/vendor/libgit2/include/git2/refdb.h +2 -2
  112. data/vendor/libgit2/include/git2/reflog.h +3 -2
  113. data/vendor/libgit2/include/git2/refs.h +9 -6
  114. data/vendor/libgit2/include/git2/refspec.h +14 -4
  115. data/vendor/libgit2/include/git2/remote.h +112 -18
  116. data/vendor/libgit2/include/git2/repository.h +61 -15
  117. data/vendor/libgit2/include/git2/reset.h +16 -3
  118. data/vendor/libgit2/include/git2/revert.h +9 -4
  119. data/vendor/libgit2/include/git2/revparse.h +3 -3
  120. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  121. data/vendor/libgit2/include/git2/signature.h +46 -1
  122. data/vendor/libgit2/include/git2/stash.h +17 -3
  123. data/vendor/libgit2/include/git2/status.h +10 -6
  124. data/vendor/libgit2/include/git2/stdint.h +87 -85
  125. data/vendor/libgit2/include/git2/strarray.h +2 -3
  126. data/vendor/libgit2/include/git2/submodule.h +20 -9
  127. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  128. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  129. data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
  130. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  131. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  132. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  133. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  134. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  135. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  136. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  137. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  138. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  139. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  140. data/vendor/libgit2/include/git2/sys/midx.h +47 -4
  141. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  142. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  143. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  144. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  145. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  146. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  147. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  148. data/vendor/libgit2/include/git2/sys/stream.h +25 -2
  149. data/vendor/libgit2/include/git2/sys/transport.h +44 -5
  150. data/vendor/libgit2/include/git2/tag.h +3 -1
  151. data/vendor/libgit2/include/git2/trace.h +9 -3
  152. data/vendor/libgit2/include/git2/transaction.h +3 -2
  153. data/vendor/libgit2/include/git2/transport.h +11 -3
  154. data/vendor/libgit2/include/git2/tree.h +16 -5
  155. data/vendor/libgit2/include/git2/types.h +19 -3
  156. data/vendor/libgit2/include/git2/version.h +44 -8
  157. data/vendor/libgit2/include/git2/worktree.h +19 -7
  158. data/vendor/libgit2/src/CMakeLists.txt +40 -15
  159. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  160. data/vendor/libgit2/src/cli/cmd.c +1 -1
  161. data/vendor/libgit2/src/cli/cmd.h +4 -0
  162. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  163. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  164. data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
  165. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  166. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  167. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  168. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  169. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  170. data/vendor/libgit2/src/cli/common.c +168 -0
  171. data/vendor/libgit2/src/cli/common.h +63 -0
  172. data/vendor/libgit2/src/cli/error.h +1 -1
  173. data/vendor/libgit2/src/cli/main.c +52 -24
  174. data/vendor/libgit2/src/cli/opt.c +29 -3
  175. data/vendor/libgit2/src/cli/opt.h +21 -3
  176. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  177. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  178. data/vendor/libgit2/src/cli/progress.c +60 -10
  179. data/vendor/libgit2/src/cli/progress.h +16 -4
  180. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  181. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  182. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  183. data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
  184. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  185. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  186. data/vendor/libgit2/src/libgit2/apply.c +14 -16
  187. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  188. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  189. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  190. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  191. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  192. data/vendor/libgit2/src/libgit2/blame.c +152 -59
  193. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  194. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  195. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  196. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  197. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  198. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  199. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  200. data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
  201. data/vendor/libgit2/src/libgit2/clone.c +186 -164
  202. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  203. data/vendor/libgit2/src/libgit2/commit.c +123 -9
  204. data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
  205. data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
  206. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  207. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  208. data/vendor/libgit2/src/libgit2/config.c +394 -300
  209. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  210. data/vendor/libgit2/src/libgit2/config.h +9 -4
  211. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  212. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  213. data/vendor/libgit2/src/libgit2/config_file.c +113 -96
  214. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  215. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  216. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  217. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  218. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  219. data/vendor/libgit2/src/libgit2/describe.c +34 -31
  220. data/vendor/libgit2/src/libgit2/diff.c +17 -8
  221. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  222. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  223. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  224. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  225. data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
  226. data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
  227. data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
  228. data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
  229. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  230. data/vendor/libgit2/src/libgit2/email.c +5 -3
  231. data/vendor/libgit2/src/libgit2/fetch.c +39 -9
  232. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  233. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  234. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  235. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  236. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  237. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  238. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  239. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  240. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  241. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  242. data/vendor/libgit2/src/libgit2/index.c +392 -208
  243. data/vendor/libgit2/src/libgit2/index.h +16 -3
  244. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  245. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  246. data/vendor/libgit2/src/libgit2/indexer.c +44 -41
  247. data/vendor/libgit2/src/libgit2/iterator.c +34 -13
  248. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  249. data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +56 -46
  252. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  253. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  254. data/vendor/libgit2/src/libgit2/midx.c +86 -44
  255. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  256. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  257. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  258. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  259. data/vendor/libgit2/src/libgit2/object.c +42 -16
  260. data/vendor/libgit2/src/libgit2/object.h +6 -0
  261. data/vendor/libgit2/src/libgit2/odb.c +16 -9
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
  264. data/vendor/libgit2/src/libgit2/oid.c +35 -2
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  267. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  268. data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
  269. data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
  270. data/vendor/libgit2/src/libgit2/pack.c +33 -27
  271. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  272. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  273. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  274. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  275. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  276. data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
  277. data/vendor/libgit2/src/libgit2/path.c +1 -1
  278. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  279. data/vendor/libgit2/src/libgit2/push.c +81 -30
  280. data/vendor/libgit2/src/libgit2/push.h +1 -0
  281. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  282. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  283. data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
  284. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  285. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  286. data/vendor/libgit2/src/libgit2/refs.c +34 -8
  287. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  288. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  289. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  290. data/vendor/libgit2/src/libgit2/remote.c +136 -67
  291. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  292. data/vendor/libgit2/src/libgit2/repository.c +789 -330
  293. data/vendor/libgit2/src/libgit2/repository.h +22 -3
  294. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  295. data/vendor/libgit2/src/libgit2/revert.c +9 -13
  296. data/vendor/libgit2/src/libgit2/revparse.c +6 -3
  297. data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
  298. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  299. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  300. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  301. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  302. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  303. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  304. data/vendor/libgit2/src/libgit2/status.c +1 -1
  305. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
  306. data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
  307. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  308. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  309. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  310. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  311. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  312. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  313. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  314. data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
  315. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  316. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  317. data/vendor/libgit2/src/libgit2/submodule.h +9 -10
  318. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  319. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  320. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  321. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  322. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  323. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  324. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  325. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  326. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  327. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  328. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  329. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  330. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  331. data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
  332. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  333. data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
  334. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  335. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  336. data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
  337. data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
  338. data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
  339. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
  340. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
  341. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  342. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  343. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  344. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  345. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  346. data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
  347. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  348. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  349. data/vendor/libgit2/src/libgit2/tree.c +35 -27
  350. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  351. data/vendor/libgit2/src/libgit2/worktree.c +39 -27
  352. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  353. data/vendor/libgit2/src/util/alloc.c +69 -7
  354. data/vendor/libgit2/src/util/alloc.h +34 -9
  355. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  356. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  357. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  358. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  359. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
  360. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  361. data/vendor/libgit2/src/util/array.h +24 -18
  362. data/vendor/libgit2/src/util/cc-compat.h +4 -0
  363. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  364. data/vendor/libgit2/src/util/date.c +22 -14
  365. data/vendor/libgit2/src/util/date.h +12 -0
  366. data/vendor/libgit2/src/util/errors.c +401 -0
  367. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  368. data/vendor/libgit2/src/util/filebuf.c +6 -1
  369. data/vendor/libgit2/src/util/filebuf.h +19 -6
  370. data/vendor/libgit2/src/util/fs_path.c +16 -5
  371. data/vendor/libgit2/src/util/fs_path.h +23 -0
  372. data/vendor/libgit2/src/util/futils.c +14 -10
  373. data/vendor/libgit2/src/util/futils.h +13 -4
  374. data/vendor/libgit2/src/util/git2_features.h.in +21 -4
  375. data/vendor/libgit2/src/util/git2_util.h +6 -0
  376. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  377. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  378. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  379. data/vendor/libgit2/src/util/hashmap.h +424 -0
  380. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  381. data/vendor/libgit2/src/util/integer.h +3 -1
  382. data/vendor/libgit2/src/util/net.c +318 -161
  383. data/vendor/libgit2/src/util/net.h +27 -0
  384. data/vendor/libgit2/src/util/pool.c +1 -1
  385. data/vendor/libgit2/src/util/pool.h +5 -0
  386. data/vendor/libgit2/src/util/posix.c +54 -0
  387. data/vendor/libgit2/src/util/posix.h +22 -0
  388. data/vendor/libgit2/src/util/pqueue.h +1 -1
  389. data/vendor/libgit2/src/util/process.h +222 -0
  390. data/vendor/libgit2/src/util/rand.c +6 -10
  391. data/vendor/libgit2/src/util/regexp.c +1 -1
  392. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  393. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  394. data/vendor/libgit2/src/util/staticstr.h +66 -0
  395. data/vendor/libgit2/src/util/str.c +2 -2
  396. data/vendor/libgit2/src/util/strlist.c +108 -0
  397. data/vendor/libgit2/src/util/strlist.h +36 -0
  398. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  399. data/vendor/libgit2/src/util/unix/process.c +629 -0
  400. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  401. data/vendor/libgit2/src/util/util.c +17 -12
  402. data/vendor/libgit2/src/util/util.h +28 -54
  403. data/vendor/libgit2/src/util/vector.c +3 -3
  404. data/vendor/libgit2/src/util/vector.h +2 -2
  405. data/vendor/libgit2/src/util/win32/error.c +1 -1
  406. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  407. data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
  408. data/vendor/libgit2/src/util/win32/process.c +506 -0
  409. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  410. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  411. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  412. metadata +72 -49
  413. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  414. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  415. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  416. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  417. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  418. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  419. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  420. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  421. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  422. data/vendor/libgit2/src/libgit2/errors.c +0 -238
  423. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  424. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  425. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  426. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  427. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  428. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  429. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  430. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  431. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  432. data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
  433. data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
  434. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  435. data/vendor/libgit2/src/util/khash.h +0 -615
  436. data/vendor/libgit2/src/util/strmap.c +0 -100
  437. data/vendor/libgit2/src/util/strmap.h +0 -131
  438. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
  439. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  440. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  441. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  442. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  443. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -0,0 +1,168 @@
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 <git2/sys/config.h>
10
+
11
+ #include "git2_util.h"
12
+ #include "vector.h"
13
+ #include "fs_path.h"
14
+
15
+ #include "common.h"
16
+ #include "error.h"
17
+
18
+ static int parse_option(cli_opt *opt, void *data)
19
+ {
20
+ git_str kv = GIT_STR_INIT, env = GIT_STR_INIT;
21
+ git_vector *cmdline_config = data;
22
+ int error = 0;
23
+
24
+ if (opt->spec && opt->spec->alias == 'c') {
25
+ if (git_str_puts(&kv, opt->value) < 0) {
26
+ error = cli_error_git();
27
+ goto done;
28
+ }
29
+ }
30
+
31
+ else if (opt->spec && !strcmp(opt->spec->name, "config-env")) {
32
+ char *val = strchr(opt->value, '=');
33
+
34
+ if (val == NULL || *(val + 1) == '\0') {
35
+ error = cli_error("invalid config format: '%s'", opt->value);
36
+ goto done;
37
+ }
38
+
39
+ if (git_str_put(&kv, opt->value, (val - opt->value)) < 0) {
40
+ error = cli_error_git();
41
+ goto done;
42
+ }
43
+
44
+ val++;
45
+
46
+ if ((error = git__getenv(&env, val)) == GIT_ENOTFOUND) {
47
+ error = cli_error("missing environment variable '%s' for configuration '%s'", val, kv.ptr);
48
+ goto done;
49
+ } else if (error) {
50
+ error = cli_error_git();
51
+ goto done;
52
+ }
53
+
54
+ if (git_str_putc(&kv, '=') < 0 ||
55
+ git_str_puts(&kv, env.ptr) < 0) {
56
+ error = cli_error_git();
57
+ goto done;
58
+ }
59
+ }
60
+
61
+ if (kv.size > 0 &&
62
+ git_vector_insert(cmdline_config, git_str_detach(&kv)) < 0)
63
+ error = cli_error_git();
64
+
65
+ done:
66
+ git_str_dispose(&env);
67
+ git_str_dispose(&kv);
68
+ return error;
69
+ }
70
+
71
+ static int parse_common_options(
72
+ git_repository *repo,
73
+ cli_repository_open_options *opts)
74
+ {
75
+ cli_opt_spec common_opts[] = {
76
+ { CLI_COMMON_OPT_CONFIG },
77
+ { CLI_COMMON_OPT_CONFIG_ENV },
78
+ { 0 }
79
+ };
80
+ git_config_backend_memory_options config_opts =
81
+ GIT_CONFIG_BACKEND_MEMORY_OPTIONS_INIT;
82
+ git_vector cmdline = GIT_VECTOR_INIT;
83
+ git_config *config = NULL;
84
+ git_config_backend *backend = NULL;
85
+ int error = 0;
86
+
87
+ config_opts.backend_type = "command line";
88
+
89
+ if ((error = cli_opt_foreach(common_opts, opts->args,
90
+ opts->args_len, CLI_OPT_PARSE_GNU, parse_option,
91
+ &cmdline)) < 0)
92
+ goto done;
93
+
94
+ if (git_vector_length(&cmdline) == 0)
95
+ goto done;
96
+
97
+ if (git_repository_config(&config, repo) < 0 ||
98
+ git_config_backend_from_values(&backend,
99
+ (const char **)cmdline.contents, cmdline.length,
100
+ &config_opts) < 0 ||
101
+ git_config_add_backend(config, backend, GIT_CONFIG_LEVEL_APP,
102
+ repo, 0) < 0)
103
+ error = cli_error_git();
104
+
105
+ done:
106
+ if (error && backend)
107
+ backend->free(backend);
108
+ git_config_free(config);
109
+ git_vector_dispose_deep(&cmdline);
110
+ return error;
111
+ }
112
+
113
+ int cli_repository_open(
114
+ git_repository **out,
115
+ cli_repository_open_options *opts)
116
+ {
117
+ git_repository *repo;
118
+
119
+ if (git_repository_open_ext(&repo, ".", GIT_REPOSITORY_OPEN_FROM_ENV, NULL) < 0)
120
+ return -1;
121
+
122
+ if (opts && parse_common_options(repo, opts) < 0)
123
+ return -1;
124
+
125
+ *out = repo;
126
+ return 0;
127
+ }
128
+
129
+ /*
130
+ * This resolves paths - not _pathspecs_ like git - it accepts an absolute
131
+ * path (to a path within the repository working directory) or a path
132
+ * relative to the current directory.
133
+ */
134
+ int cli_resolve_path(git_str *out, git_repository *repo, const char *given_path)
135
+ {
136
+ git_str path = GIT_STR_INIT;
137
+ int error = 0;
138
+
139
+ if (!git_fs_path_is_absolute(given_path)) {
140
+ char cwd[GIT_PATH_MAX];
141
+
142
+ if (p_getcwd(cwd, GIT_PATH_MAX) < 0)
143
+ error = cli_error_os();
144
+ else if (git_str_puts(&path, cwd) < 0 ||
145
+ git_fs_path_apply_relative(&path, given_path) < 0)
146
+ error = cli_error_git();
147
+
148
+ if (error)
149
+ goto done;
150
+ } else if (git_str_puts(&path, given_path) < 0) {
151
+ error = cli_error_git();
152
+ goto done;
153
+ }
154
+
155
+ error = git_fs_path_make_relative(&path, git_repository_workdir(repo));
156
+
157
+ if (error == GIT_ENOTFOUND)
158
+ error = cli_error("path '%s' is not inside the git repository '%s'",
159
+ given_path, git_repository_workdir(repo));
160
+ else if (error < 0)
161
+ error = cli_error_git();
162
+ else
163
+ git_str_swap(out, &path);
164
+
165
+ done:
166
+ git_str_dispose(&path);
167
+ return error;
168
+ }
@@ -0,0 +1,63 @@
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 CLI_common_h__
9
+ #define CLI_common_h__
10
+
11
+ #define PROGRAM_NAME "git2"
12
+
13
+ #include "git2_util.h"
14
+
15
+ #include "error.h"
16
+ #include "opt.h"
17
+ #include "opt_usage.h"
18
+
19
+ /*
20
+ * Common command arguments.
21
+ */
22
+
23
+ extern int cli_opt__show_help;
24
+ extern int cli_opt__use_pager;
25
+
26
+ #define CLI_COMMON_OPT_HELP \
27
+ CLI_OPT_TYPE_SWITCH, "help", 0, &cli_opt__show_help, 1, \
28
+ CLI_OPT_USAGE_HIDDEN | CLI_OPT_USAGE_STOP_PARSING, \
29
+ NULL, "display help information"
30
+ #define CLI_COMMON_OPT_CONFIG \
31
+ CLI_OPT_TYPE_VALUE, NULL, 'c', NULL, 0, \
32
+ CLI_OPT_USAGE_HIDDEN, \
33
+ "key=value", "add configuration value"
34
+ #define CLI_COMMON_OPT_CONFIG_ENV \
35
+ CLI_OPT_TYPE_VALUE, "config-env", 0, NULL, 0, \
36
+ CLI_OPT_USAGE_HIDDEN, \
37
+ "key=value", "set configuration value to environment variable"
38
+ #define CLI_COMMON_OPT_NO_PAGER \
39
+ CLI_OPT_TYPE_SWITCH, "no-pager", 0, &cli_opt__use_pager, 0, \
40
+ CLI_OPT_USAGE_HIDDEN, \
41
+ NULL, "don't paginate multi-page output"
42
+
43
+ #define CLI_COMMON_OPT \
44
+ { CLI_COMMON_OPT_HELP }, \
45
+ { CLI_COMMON_OPT_CONFIG }, \
46
+ { CLI_COMMON_OPT_CONFIG_ENV }, \
47
+ { CLI_COMMON_OPT_NO_PAGER }
48
+
49
+ typedef struct {
50
+ char **args;
51
+ int args_len;
52
+ } cli_repository_open_options;
53
+
54
+ extern int cli_repository_open(
55
+ git_repository **out,
56
+ cli_repository_open_options *opts);
57
+
58
+ extern int cli_resolve_path(
59
+ git_str *out,
60
+ git_repository *repo,
61
+ const char *given_path);
62
+
63
+ #endif /* CLI_common_h__ */
@@ -8,7 +8,7 @@
8
8
  #ifndef CLI_error_h__
9
9
  #define CLI_error_h__
10
10
 
11
- #include "cli.h"
11
+ #include "common.h"
12
12
  #include <stdio.h>
13
13
 
14
14
  #define CLI_EXIT_OK 0
@@ -7,17 +7,19 @@
7
7
 
8
8
  #include <stdio.h>
9
9
  #include <git2.h>
10
- #include "cli.h"
10
+ #include "common.h"
11
11
  #include "cmd.h"
12
12
 
13
- static int show_help = 0;
13
+ int cli_opt__show_help = 0;
14
+ int cli_opt__use_pager = 1;
15
+
14
16
  static int show_version = 0;
15
17
  static char *command = NULL;
16
18
  static char **args = NULL;
17
19
 
18
20
  const cli_opt_spec cli_common_opts[] = {
19
- { CLI_OPT_TYPE_SWITCH, "help", 0, &show_help, 1,
20
- CLI_OPT_USAGE_DEFAULT, NULL, "display help information" },
21
+ CLI_COMMON_OPT,
22
+
21
23
  { CLI_OPT_TYPE_SWITCH, "version", 0, &show_version, 1,
22
24
  CLI_OPT_USAGE_DEFAULT, NULL, "display the version" },
23
25
  { CLI_OPT_TYPE_ARG, "command", 0, &command, 0,
@@ -28,21 +30,57 @@ const cli_opt_spec cli_common_opts[] = {
28
30
  };
29
31
 
30
32
  const cli_cmd_spec cli_cmds[] = {
33
+ { "blame", cmd_blame, "Show the origin of each line of a file" },
31
34
  { "cat-file", cmd_cat_file, "Display an object in the repository" },
32
35
  { "clone", cmd_clone, "Clone a repository into a new directory" },
36
+ { "config", cmd_config, "View or set configuration values " },
33
37
  { "hash-object", cmd_hash_object, "Hash a raw object and product its object ID" },
34
38
  { "help", cmd_help, "Display help information" },
39
+ { "index-pack", cmd_index_pack, "Create an index for a packfile" },
40
+ { "init", cmd_init, "Create a new git repository" },
35
41
  { NULL }
36
42
  };
37
43
 
44
+ /*
45
+ * Reorder the argv as it was given, since git has the notion of global
46
+ * options (like `--help` or `-c key=val`) that we want to pass to the
47
+ * subcommand, and that can appear early in the arguments, before the
48
+ * command name. Put the command-name in argv[1] to allow easier parsing.
49
+ */
50
+ static void reorder_args(char **argv, size_t first)
51
+ {
52
+ char *tmp;
53
+ size_t i;
54
+
55
+ if (first == 1)
56
+ return;
57
+
58
+ tmp = argv[first];
59
+
60
+ for (i = first; i > 1; i--)
61
+ argv[i] = argv[i - 1];
62
+
63
+ argv[1] = tmp;
64
+ }
65
+
66
+ /*
67
+ * When invoked without a command, or just with `--help`, we invoke
68
+ * the help command; but we want to preserve only arguments that would
69
+ * be useful for that.
70
+ */
71
+ static void help_args(int *argc, char **argv)
72
+ {
73
+ cli_opt__show_help = 0;
74
+
75
+ argv[0] = "help";
76
+ *argc = 1;
77
+ }
78
+
38
79
  int main(int argc, char **argv)
39
80
  {
40
81
  const cli_cmd_spec *cmd;
41
82
  cli_opt_parser optparser;
42
83
  cli_opt opt;
43
- char *help_args[3] = { NULL };
44
- int help_args_len;
45
- int args_len = 0;
46
84
  int ret = 0;
47
85
 
48
86
  if (git_libgit2_init() < 0) {
@@ -56,7 +94,7 @@ int main(int argc, char **argv)
56
94
  while (cli_opt_parser_next(&opt, &optparser)) {
57
95
  if (!opt.spec) {
58
96
  cli_opt_status_fprint(stderr, PROGRAM_NAME, &opt);
59
- cli_opt_usage_fprint(stderr, PROGRAM_NAME, NULL, cli_common_opts);
97
+ cli_opt_usage_fprint(stderr, PROGRAM_NAME, NULL, cli_common_opts, CLI_OPT_USAGE_SHOW_HIDDEN);
60
98
  ret = CLI_EXIT_USAGE;
61
99
  goto done;
62
100
  }
@@ -66,8 +104,7 @@ int main(int argc, char **argv)
66
104
  * remaining arguments as args for the command itself.
67
105
  */
68
106
  if (command) {
69
- args = &argv[optparser.idx];
70
- args_len = (int)(argc - optparser.idx);
107
+ reorder_args(argv, optparser.idx);
71
108
  break;
72
109
  }
73
110
  }
@@ -77,19 +114,10 @@ int main(int argc, char **argv)
77
114
  goto done;
78
115
  }
79
116
 
80
- /*
81
- * If `--help <command>` is specified, delegate to that command's
82
- * `--help` option. If no command is specified, run the `help`
83
- * command. Do this by updating the args to emulate that behavior.
84
- */
85
- if (!command || show_help) {
86
- help_args[0] = command ? (char *)command : "help";
87
- help_args[1] = command ? "--help" : NULL;
88
- help_args_len = command ? 2 : 1;
89
-
90
- command = help_args[0];
91
- args = help_args;
92
- args_len = help_args_len;
117
+ if (!command) {
118
+ help_args(&argc, argv);
119
+ ret = cmd_help(argc, argv);
120
+ goto done;
93
121
  }
94
122
 
95
123
  if ((cmd = cli_cmd_spec_byname(command)) == NULL) {
@@ -98,7 +126,7 @@ int main(int argc, char **argv)
98
126
  goto done;
99
127
  }
100
128
 
101
- ret = cmd->fn(args_len, args);
129
+ ret = cmd->fn(argc - 1, &argv[1]);
102
130
 
103
131
  done:
104
132
  git_libgit2_shutdown();
@@ -10,7 +10,7 @@
10
10
  * This file was produced by using the `rename.pl` script included with
11
11
  * adopt. The command-line specified was:
12
12
  *
13
- * ./rename.pl cli_opt --filename=opt --include=cli.h --inline=GIT_INLINE --header-guard=CLI_opt_h__ --lowercase-status --without-usage
13
+ * ./rename.pl cli_opt --filename=opt --include=common.h --inline=GIT_INLINE --header-guard=CLI_opt_h__ --lowercase-status --without-usage
14
14
  */
15
15
 
16
16
  #include <stdlib.h>
@@ -19,7 +19,11 @@
19
19
  #include <limits.h>
20
20
  #include <assert.h>
21
21
 
22
- #include "cli.h"
22
+ #if defined(__sun) || defined(__illumos__)
23
+ # include <alloca.h>
24
+ #endif
25
+
26
+ #include "common.h"
23
27
  #include "opt.h"
24
28
 
25
29
  #ifdef _WIN32
@@ -73,7 +77,7 @@ GIT_INLINE(const cli_opt_spec *) spec_for_long(
73
77
 
74
78
  /* Handle --option=value arguments */
75
79
  if (spec->type == CLI_OPT_TYPE_VALUE &&
76
- eql &&
80
+ spec->name && eql &&
77
81
  strncmp(arg, spec->name, eql_pos) == 0 &&
78
82
  spec->name[eql_pos] == '\0') {
79
83
  *has_value = 1;
@@ -575,6 +579,28 @@ cli_opt_status_t cli_opt_parse(
575
579
  return validate_required(opt, specs, given_specs);
576
580
  }
577
581
 
582
+ int cli_opt_foreach(
583
+ const cli_opt_spec specs[],
584
+ char **args,
585
+ size_t args_len,
586
+ unsigned int flags,
587
+ int (*callback)(cli_opt *, void *),
588
+ void *callback_data)
589
+ {
590
+ cli_opt_parser parser;
591
+ cli_opt opt;
592
+ int ret;
593
+
594
+ cli_opt_parser_init(&parser, specs, args, args_len, flags);
595
+
596
+ while (cli_opt_parser_next(&opt, &parser)) {
597
+ if ((ret = callback(&opt, callback_data)) != 0)
598
+ return ret;
599
+ }
600
+
601
+ return 0;
602
+ }
603
+
578
604
  static int spec_name_fprint(FILE *file, const cli_opt_spec *spec)
579
605
  {
580
606
  int error;
@@ -10,7 +10,7 @@
10
10
  * This file was produced by using the `rename.pl` script included with
11
11
  * adopt. The command-line specified was:
12
12
  *
13
- * ./rename.pl cli_opt --filename=opt --include=cli.h --inline=GIT_INLINE --header-guard=CLI_opt_h__ --lowercase-status --without-usage
13
+ * ./rename.pl cli_opt --filename=opt --include=common.h --inline=GIT_INLINE --header-guard=CLI_opt_h__ --lowercase-status --without-usage
14
14
  */
15
15
 
16
16
  #ifndef CLI_opt_h__
@@ -275,8 +275,8 @@ typedef struct cli_opt_parser {
275
275
  size_t arg_idx;
276
276
  size_t in_args;
277
277
  size_t in_short;
278
- int needs_sort : 1,
279
- in_literal : 1;
278
+ unsigned int needs_sort : 1,
279
+ in_literal : 1;
280
280
  } cli_opt_parser;
281
281
 
282
282
  /**
@@ -300,6 +300,24 @@ cli_opt_status_t cli_opt_parse(
300
300
  size_t args_len,
301
301
  unsigned int flags);
302
302
 
303
+ /**
304
+ * Quickly executes the given callback for each argument.
305
+ *
306
+ * @param specs A NULL-terminated array of `cli_opt_spec`s that can be parsed
307
+ * @param args The arguments that will be parsed
308
+ * @param args_len The length of arguments to be parsed
309
+ * @param flags The `cli_opt_flag_t flags for parsing
310
+ * @param callback The callback to invoke for each specified option
311
+ * @param callback_data Data to be provided to the callback
312
+ */
313
+ int cli_opt_foreach(
314
+ const cli_opt_spec specs[],
315
+ char **args,
316
+ size_t args_len,
317
+ unsigned int flags,
318
+ int (*callback)(cli_opt *, void *),
319
+ void *callback_data);
320
+
303
321
  /**
304
322
  * Initializes a parser that parses the given arguments according to the
305
323
  * given specifications.
@@ -5,35 +5,84 @@
5
5
  * a Linking Exception. For full terms see the included COPYING file.
6
6
  */
7
7
 
8
- #include "cli.h"
8
+ #include "common.h"
9
9
  #include "str.h"
10
10
 
11
- static int print_spec_name(git_str *out, const cli_opt_spec *spec)
11
+ #define is_switch_or_value(spec) \
12
+ ((spec)->type == CLI_OPT_TYPE_SWITCH || \
13
+ (spec)->type == CLI_OPT_TYPE_VALUE)
14
+
15
+ static int print_spec_args(git_str *out, const cli_opt_spec *spec)
12
16
  {
13
- if (spec->type == CLI_OPT_TYPE_VALUE && spec->alias &&
14
- !(spec->usage & CLI_OPT_USAGE_VALUE_OPTIONAL) &&
15
- !(spec->usage & CLI_OPT_USAGE_SHOW_LONG))
16
- return git_str_printf(out, "-%c <%s>", spec->alias, spec->value_name);
17
- if (spec->type == CLI_OPT_TYPE_VALUE && spec->alias &&
18
- !(spec->usage & CLI_OPT_USAGE_SHOW_LONG))
19
- return git_str_printf(out, "-%c [<%s>]", spec->alias, spec->value_name);
20
- if (spec->type == CLI_OPT_TYPE_VALUE &&
21
- !(spec->usage & CLI_OPT_USAGE_VALUE_OPTIONAL))
22
- return git_str_printf(out, "--%s[=<%s>]", spec->name, spec->value_name);
23
- if (spec->type == CLI_OPT_TYPE_VALUE)
24
- return git_str_printf(out, "--%s=<%s>", spec->name, spec->value_name);
17
+ GIT_ASSERT(!is_switch_or_value(spec));
18
+
25
19
  if (spec->type == CLI_OPT_TYPE_ARG)
26
20
  return git_str_printf(out, "<%s>", spec->value_name);
27
21
  if (spec->type == CLI_OPT_TYPE_ARGS)
28
22
  return git_str_printf(out, "<%s>...", spec->value_name);
29
23
  if (spec->type == CLI_OPT_TYPE_LITERAL)
30
24
  return git_str_printf(out, "--");
31
- if (spec->alias && !(spec->usage & CLI_OPT_USAGE_SHOW_LONG))
25
+
26
+ GIT_ASSERT(!"unknown option spec type");
27
+ return -1;
28
+ }
29
+
30
+ GIT_INLINE(int) print_spec_alias(git_str *out, const cli_opt_spec *spec)
31
+ {
32
+ GIT_ASSERT(is_switch_or_value(spec) && spec->alias);
33
+
34
+ if (spec->type == CLI_OPT_TYPE_VALUE &&
35
+ !(spec->usage & CLI_OPT_USAGE_VALUE_OPTIONAL))
36
+ return git_str_printf(out, "-%c <%s>", spec->alias, spec->value_name);
37
+ else if (spec->type == CLI_OPT_TYPE_VALUE)
38
+ return git_str_printf(out, "-%c [<%s>]", spec->alias, spec->value_name);
39
+ else
32
40
  return git_str_printf(out, "-%c", spec->alias);
33
- if (spec->name)
41
+ }
42
+
43
+ GIT_INLINE(int) print_spec_name(git_str *out, const cli_opt_spec *spec)
44
+ {
45
+ GIT_ASSERT(is_switch_or_value(spec) && spec->name);
46
+
47
+ if (spec->type == CLI_OPT_TYPE_VALUE &&
48
+ !(spec->usage & CLI_OPT_USAGE_VALUE_OPTIONAL))
49
+ return git_str_printf(out, "--%s=<%s>", spec->name, spec->value_name);
50
+ else if (spec->type == CLI_OPT_TYPE_VALUE)
51
+ return git_str_printf(out, "--%s[=<%s>]", spec->name, spec->value_name);
52
+ else
34
53
  return git_str_printf(out, "--%s", spec->name);
54
+ }
55
+
56
+ GIT_INLINE(int) print_spec_full(git_str *out, const cli_opt_spec *spec)
57
+ {
58
+ int error = 0;
35
59
 
36
- GIT_ASSERT(0);
60
+ if (is_switch_or_value(spec)) {
61
+ if (spec->alias)
62
+ error |= print_spec_alias(out, spec);
63
+
64
+ if (spec->alias && spec->name)
65
+ error |= git_str_printf(out, ", ");
66
+
67
+ if (spec->name)
68
+ error |= print_spec_name(out, spec);
69
+ } else {
70
+ error |= print_spec_args(out, spec);
71
+ }
72
+
73
+ return error;
74
+ }
75
+
76
+ GIT_INLINE(int) print_spec(git_str *out, const cli_opt_spec *spec)
77
+ {
78
+ if (is_switch_or_value(spec)) {
79
+ if (spec->alias && !(spec->usage & CLI_OPT_USAGE_SHOW_LONG))
80
+ return print_spec_alias(out, spec);
81
+ else
82
+ return print_spec_name(out, spec);
83
+ }
84
+
85
+ return print_spec_args(out, spec);
37
86
  }
38
87
 
39
88
  /*
@@ -46,7 +95,8 @@ int cli_opt_usage_fprint(
46
95
  FILE *file,
47
96
  const char *command,
48
97
  const char *subcommand,
49
- const cli_opt_spec specs[])
98
+ const cli_opt_spec specs[],
99
+ unsigned int print_flags)
50
100
  {
51
101
  git_str usage = GIT_BUF_INIT, opt = GIT_BUF_INIT;
52
102
  const cli_opt_spec *spec;
@@ -55,7 +105,7 @@ int cli_opt_usage_fprint(
55
105
  int error;
56
106
 
57
107
  /* TODO: query actual console width. */
58
- int console_width = 80;
108
+ int console_width = 78;
59
109
 
60
110
  if ((error = git_str_printf(&usage, "usage: %s", command)) < 0)
61
111
  goto done;
@@ -73,7 +123,8 @@ int cli_opt_usage_fprint(
73
123
 
74
124
  next_choice = !!((spec + 1)->usage & CLI_OPT_USAGE_CHOICE);
75
125
 
76
- if (spec->usage & CLI_OPT_USAGE_HIDDEN)
126
+ if ((spec->usage & CLI_OPT_USAGE_HIDDEN) &&
127
+ !(print_flags & CLI_OPT_USAGE_SHOW_HIDDEN))
77
128
  continue;
78
129
 
79
130
  if (choice)
@@ -86,7 +137,7 @@ int cli_opt_usage_fprint(
86
137
  if (!optional && !choice && next_choice)
87
138
  git_str_putc(&opt, '(');
88
139
 
89
- if ((error = print_spec_name(&opt, spec)) < 0)
140
+ if ((error = print_spec(&opt, spec)) < 0)
90
141
  goto done;
91
142
 
92
143
  if (!optional && choice && !next_choice)
@@ -111,11 +162,11 @@ int cli_opt_usage_fprint(
111
162
  git_str_putc(&usage, ' ');
112
163
 
113
164
  linelen = prefixlen;
114
- } else {
115
- git_str_putc(&usage, ' ');
116
- linelen += git_str_len(&opt) + 1;
117
165
  }
118
166
 
167
+ git_str_putc(&usage, ' ');
168
+ linelen += git_str_len(&opt) + 1;
169
+
119
170
  git_str_puts(&usage, git_str_cstr(&opt));
120
171
 
121
172
  if (git_str_oom(&usage)) {
@@ -140,7 +191,7 @@ int cli_opt_usage_error(
140
191
  const cli_opt *invalid_opt)
141
192
  {
142
193
  cli_opt_status_fprint(stderr, PROGRAM_NAME, invalid_opt);
143
- cli_opt_usage_fprint(stderr, PROGRAM_NAME, subcommand, specs);
194
+ cli_opt_usage_fprint(stderr, PROGRAM_NAME, subcommand, specs, 0);
144
195
  return CLI_EXIT_USAGE;
145
196
  }
146
197
 
@@ -150,35 +201,53 @@ int cli_opt_help_fprint(
150
201
  {
151
202
  git_str help = GIT_BUF_INIT;
152
203
  const cli_opt_spec *spec;
204
+ bool required;
153
205
  int error = 0;
154
206
 
155
207
  /* Display required arguments first */
156
208
  for (spec = specs; spec->type; ++spec) {
157
- if (! (spec->usage & CLI_OPT_USAGE_REQUIRED) ||
158
- (spec->usage & CLI_OPT_USAGE_HIDDEN))
209
+ if ((spec->usage & CLI_OPT_USAGE_HIDDEN) ||
210
+ (spec->type == CLI_OPT_TYPE_LITERAL))
211
+ continue;
212
+
213
+ required = ((spec->usage & CLI_OPT_USAGE_REQUIRED) ||
214
+ ((spec->usage & CLI_OPT_USAGE_CHOICE) && required));
215
+
216
+ if (!required)
159
217
  continue;
160
218
 
161
219
  git_str_printf(&help, " ");
162
220
 
163
- if ((error = print_spec_name(&help, spec)) < 0)
221
+ if ((error = print_spec_full(&help, spec)) < 0)
164
222
  goto done;
165
223
 
166
- git_str_printf(&help, ": %s\n", spec->help);
224
+ git_str_printf(&help, "\n");
225
+
226
+ if (spec->help)
227
+ git_str_printf(&help, " %s\n", spec->help);
167
228
  }
168
229
 
169
230
  /* Display the remaining arguments */
170
231
  for (spec = specs; spec->type; ++spec) {
171
- if ((spec->usage & CLI_OPT_USAGE_REQUIRED) ||
172
- (spec->usage & CLI_OPT_USAGE_HIDDEN))
232
+ if ((spec->usage & CLI_OPT_USAGE_HIDDEN) ||
233
+ (spec->type == CLI_OPT_TYPE_LITERAL))
234
+ continue;
235
+
236
+ required = ((spec->usage & CLI_OPT_USAGE_REQUIRED) ||
237
+ ((spec->usage & CLI_OPT_USAGE_CHOICE) && required));
238
+
239
+ if (required)
173
240
  continue;
174
241
 
175
242
  git_str_printf(&help, " ");
176
243
 
177
- if ((error = print_spec_name(&help, spec)) < 0)
244
+ if ((error = print_spec_full(&help, spec)) < 0)
178
245
  goto done;
179
246
 
180
- git_str_printf(&help, ": %s\n", spec->help);
247
+ git_str_printf(&help, "\n");
181
248
 
249
+ if (spec->help)
250
+ git_str_printf(&help, " %s\n", spec->help);
182
251
  }
183
252
 
184
253
  if (git_str_oom(&help) ||