rugged 1.7.2 → 1.9.6

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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +4 -4
  3. data/ext/rugged/rugged.c +12 -1
  4. data/ext/rugged/rugged_blame.c +22 -6
  5. data/ext/rugged/rugged_blob.c +24 -9
  6. data/ext/rugged/rugged_branch.c +10 -7
  7. data/ext/rugged/rugged_branch_collection.c +8 -6
  8. data/ext/rugged/rugged_commit.c +7 -6
  9. data/ext/rugged/rugged_config.c +20 -11
  10. data/ext/rugged/rugged_diff.c +26 -12
  11. data/ext/rugged/rugged_diff_hunk.c +2 -1
  12. data/ext/rugged/rugged_index.c +39 -29
  13. data/ext/rugged/rugged_note.c +7 -6
  14. data/ext/rugged/rugged_object.c +3 -2
  15. data/ext/rugged/rugged_patch.c +23 -9
  16. data/ext/rugged/rugged_rebase.c +22 -10
  17. data/ext/rugged/rugged_reference.c +22 -13
  18. data/ext/rugged/rugged_reference_collection.c +9 -7
  19. data/ext/rugged/rugged_remote.c +23 -12
  20. data/ext/rugged/rugged_remote_collection.c +11 -9
  21. data/ext/rugged/rugged_repo.c +60 -45
  22. data/ext/rugged/rugged_revwalk.c +22 -12
  23. data/ext/rugged/rugged_submodule.c +23 -20
  24. data/ext/rugged/rugged_submodule_collection.c +20 -9
  25. data/ext/rugged/rugged_tag.c +6 -4
  26. data/ext/rugged/rugged_tag_collection.c +7 -5
  27. data/ext/rugged/rugged_tree.c +27 -15
  28. data/lib/rugged/version.rb +1 -1
  29. data/vendor/libgit2/AUTHORS +3 -0
  30. data/vendor/libgit2/CMakeLists.txt +23 -10
  31. data/vendor/libgit2/COPYING +278 -12
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +8 -3
  33. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  34. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  35. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  36. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  37. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  38. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  39. data/vendor/libgit2/cmake/SelectRegex.cmake +14 -4
  40. data/vendor/libgit2/cmake/SelectSSH.cmake +30 -19
  41. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  42. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  43. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  44. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  45. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  46. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  47. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  48. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  49. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  50. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  51. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  52. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  53. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  54. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  55. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  56. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  57. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  58. data/vendor/libgit2/deps/pcre2/CMakeLists.txt +110 -0
  59. data/vendor/libgit2/deps/pcre2/LICENCE.md +104 -0
  60. data/vendor/libgit2/deps/pcre2/config.h.in +54 -0
  61. data/vendor/libgit2/deps/pcre2/pcre2.h +1079 -0
  62. data/vendor/libgit2/deps/pcre2/pcre2_auto_possess.c +1416 -0
  63. data/vendor/libgit2/deps/{pcre/pcre_chartables.c → pcre2/pcre2_chartables.c} +41 -47
  64. data/vendor/libgit2/deps/{pcre/pcre_ord2utf8.c → pcre2/pcre2_chkdint.c} +36 -36
  65. data/vendor/libgit2/deps/pcre2/pcre2_compile.c +11345 -0
  66. data/vendor/libgit2/deps/pcre2/pcre2_compile.h +356 -0
  67. data/vendor/libgit2/deps/pcre2/pcre2_compile_cgroup.c +632 -0
  68. data/vendor/libgit2/deps/pcre2/pcre2_compile_class.c +2777 -0
  69. data/vendor/libgit2/deps/pcre2/pcre2_config.c +250 -0
  70. data/vendor/libgit2/deps/pcre2/pcre2_context.c +557 -0
  71. data/vendor/libgit2/deps/pcre2/pcre2_convert.c +1263 -0
  72. data/vendor/libgit2/deps/{pcre/pcre_dfa_exec.c → pcre2/pcre2_dfa_match.c} +1402 -943
  73. data/vendor/libgit2/deps/pcre2/pcre2_error.c +384 -0
  74. data/vendor/libgit2/deps/pcre2/pcre2_extuni.c +159 -0
  75. data/vendor/libgit2/deps/pcre2/pcre2_find_bracket.c +217 -0
  76. data/vendor/libgit2/deps/pcre2/pcre2_fuzzsupport.c +844 -0
  77. data/vendor/libgit2/deps/pcre2/pcre2_internal.h +2353 -0
  78. data/vendor/libgit2/deps/pcre2/pcre2_intmodedep.h +1044 -0
  79. data/vendor/libgit2/deps/pcre2/pcre2_maketables.c +177 -0
  80. data/vendor/libgit2/deps/pcre2/pcre2_match.c +8244 -0
  81. data/vendor/libgit2/deps/pcre2/pcre2_match_data.c +184 -0
  82. data/vendor/libgit2/deps/pcre2/pcre2_match_next.c +171 -0
  83. data/vendor/libgit2/deps/{pcre/pcre_newline.c → pcre2/pcre2_newline.c} +92 -63
  84. data/vendor/libgit2/deps/{pcre/pcre_refcount.c → pcre2/pcre2_ord2utf.c} +64 -38
  85. data/vendor/libgit2/deps/pcre2/pcre2_pattern_info.c +430 -0
  86. data/vendor/libgit2/deps/pcre2/pcre2_printint_inc.h +1098 -0
  87. data/vendor/libgit2/deps/pcre2/pcre2_script_run.c +344 -0
  88. data/vendor/libgit2/deps/pcre2/pcre2_serialize.c +284 -0
  89. data/vendor/libgit2/deps/pcre2/pcre2_string_utils.c +199 -0
  90. data/vendor/libgit2/deps/pcre2/pcre2_study.c +2087 -0
  91. data/vendor/libgit2/deps/pcre2/pcre2_substitute.c +1761 -0
  92. data/vendor/libgit2/deps/pcre2/pcre2_substring.c +553 -0
  93. data/vendor/libgit2/deps/pcre2/pcre2_tables.c +310 -0
  94. data/vendor/libgit2/deps/pcre2/pcre2_ucd.c +5805 -0
  95. data/vendor/libgit2/deps/pcre2/pcre2_ucp.h +408 -0
  96. data/vendor/libgit2/deps/pcre2/pcre2_ucptables_inc.h +1596 -0
  97. data/vendor/libgit2/deps/pcre2/pcre2_util.h +179 -0
  98. data/vendor/libgit2/deps/pcre2/pcre2_valid_utf.c +397 -0
  99. data/vendor/libgit2/deps/pcre2/pcre2_xclass.c +547 -0
  100. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  101. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  102. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  103. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  104. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  105. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  106. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  107. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  108. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  109. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  110. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  111. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  112. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  113. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  114. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  115. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  116. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  117. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  118. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  119. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  120. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  121. data/vendor/libgit2/include/git2/apply.h +27 -6
  122. data/vendor/libgit2/include/git2/attr.h +17 -4
  123. data/vendor/libgit2/include/git2/blame.h +133 -28
  124. data/vendor/libgit2/include/git2/blob.h +71 -28
  125. data/vendor/libgit2/include/git2/branch.h +22 -15
  126. data/vendor/libgit2/include/git2/buffer.h +6 -4
  127. data/vendor/libgit2/include/git2/cert.h +2 -1
  128. data/vendor/libgit2/include/git2/checkout.h +83 -32
  129. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  130. data/vendor/libgit2/include/git2/clone.h +25 -9
  131. data/vendor/libgit2/include/git2/commit.h +132 -3
  132. data/vendor/libgit2/include/git2/common.h +132 -63
  133. data/vendor/libgit2/include/git2/config.h +93 -23
  134. data/vendor/libgit2/include/git2/credential.h +30 -2
  135. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  136. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  137. data/vendor/libgit2/include/git2/describe.h +13 -1
  138. data/vendor/libgit2/include/git2/diff.h +38 -8
  139. data/vendor/libgit2/include/git2/email.h +9 -29
  140. data/vendor/libgit2/include/git2/errors.h +46 -73
  141. data/vendor/libgit2/include/git2/filter.h +14 -7
  142. data/vendor/libgit2/include/git2/global.h +8 -1
  143. data/vendor/libgit2/include/git2/graph.h +3 -2
  144. data/vendor/libgit2/include/git2/ignore.h +10 -0
  145. data/vendor/libgit2/include/git2/index.h +100 -15
  146. data/vendor/libgit2/include/git2/indexer.h +21 -4
  147. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  148. data/vendor/libgit2/include/git2/merge.h +50 -3
  149. data/vendor/libgit2/include/git2/message.h +2 -2
  150. data/vendor/libgit2/include/git2/net.h +3 -1
  151. data/vendor/libgit2/include/git2/notes.h +9 -6
  152. data/vendor/libgit2/include/git2/object.h +9 -8
  153. data/vendor/libgit2/include/git2/odb.h +91 -49
  154. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  155. data/vendor/libgit2/include/git2/oid.h +23 -25
  156. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  157. data/vendor/libgit2/include/git2/pack.h +13 -1
  158. data/vendor/libgit2/include/git2/patch.h +2 -3
  159. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  160. data/vendor/libgit2/include/git2/proxy.h +12 -3
  161. data/vendor/libgit2/include/git2/rebase.h +9 -6
  162. data/vendor/libgit2/include/git2/refdb.h +2 -2
  163. data/vendor/libgit2/include/git2/reflog.h +3 -2
  164. data/vendor/libgit2/include/git2/refs.h +9 -6
  165. data/vendor/libgit2/include/git2/refspec.h +14 -4
  166. data/vendor/libgit2/include/git2/remote.h +113 -25
  167. data/vendor/libgit2/include/git2/repository.h +57 -21
  168. data/vendor/libgit2/include/git2/reset.h +16 -3
  169. data/vendor/libgit2/include/git2/revert.h +9 -4
  170. data/vendor/libgit2/include/git2/revparse.h +3 -3
  171. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  172. data/vendor/libgit2/include/git2/signature.h +46 -1
  173. data/vendor/libgit2/include/git2/stash.h +17 -3
  174. data/vendor/libgit2/include/git2/status.h +10 -6
  175. data/vendor/libgit2/include/git2/stdint.h +87 -85
  176. data/vendor/libgit2/include/git2/strarray.h +2 -3
  177. data/vendor/libgit2/include/git2/submodule.h +20 -9
  178. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  179. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  180. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  181. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  182. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  183. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  184. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  185. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  186. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  187. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  188. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  189. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  190. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  191. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  192. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  193. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  194. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  195. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  196. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  197. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  198. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  199. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  200. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  201. data/vendor/libgit2/include/git2/tag.h +3 -1
  202. data/vendor/libgit2/include/git2/trace.h +9 -3
  203. data/vendor/libgit2/include/git2/transaction.h +3 -2
  204. data/vendor/libgit2/include/git2/transport.h +11 -3
  205. data/vendor/libgit2/include/git2/tree.h +16 -5
  206. data/vendor/libgit2/include/git2/types.h +19 -3
  207. data/vendor/libgit2/include/git2/version.h +46 -8
  208. data/vendor/libgit2/include/git2/worktree.h +16 -6
  209. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  210. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  211. data/vendor/libgit2/src/cli/cmd.c +1 -1
  212. data/vendor/libgit2/src/cli/cmd.h +4 -0
  213. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  214. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  215. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  216. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  217. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  218. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  219. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  220. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  221. data/vendor/libgit2/src/cli/common.c +168 -0
  222. data/vendor/libgit2/src/cli/common.h +63 -0
  223. data/vendor/libgit2/src/cli/error.h +1 -1
  224. data/vendor/libgit2/src/cli/main.c +52 -24
  225. data/vendor/libgit2/src/cli/opt.c +31 -5
  226. data/vendor/libgit2/src/cli/opt.h +21 -3
  227. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  228. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  229. data/vendor/libgit2/src/cli/progress.c +51 -2
  230. data/vendor/libgit2/src/cli/progress.h +12 -0
  231. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  232. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  233. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  234. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  235. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  236. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  237. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  238. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  239. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  240. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  241. data/vendor/libgit2/src/libgit2/blame.c +135 -43
  242. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  243. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  244. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  245. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  246. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  247. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  248. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  249. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  250. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  251. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  252. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  253. data/vendor/libgit2/src/libgit2/config.c +390 -299
  254. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  255. data/vendor/libgit2/src/libgit2/config.h +9 -4
  256. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  257. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  258. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  259. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  260. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  261. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  262. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  263. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  264. data/vendor/libgit2/src/libgit2/delta.c +13 -1
  265. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  266. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  267. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  268. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  269. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  270. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  272. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  273. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  274. data/vendor/libgit2/src/libgit2/email.c +1 -0
  275. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  276. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  277. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  278. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  279. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  280. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  281. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  282. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  283. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  284. data/vendor/libgit2/src/libgit2/index.c +76 -98
  285. data/vendor/libgit2/src/libgit2/index.h +5 -2
  286. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  287. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  288. data/vendor/libgit2/src/libgit2/indexer.c +38 -41
  289. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  290. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  291. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  292. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  293. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  294. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  295. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  296. data/vendor/libgit2/src/libgit2/message.c +1 -1
  297. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  298. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  299. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  300. data/vendor/libgit2/src/libgit2/object.c +6 -5
  301. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  302. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  303. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  304. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  305. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  306. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  307. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  308. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  309. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  310. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  311. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  312. data/vendor/libgit2/src/libgit2/path.c +1 -1
  313. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  314. data/vendor/libgit2/src/libgit2/push.c +79 -28
  315. data/vendor/libgit2/src/libgit2/push.h +1 -0
  316. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  317. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  318. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  319. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  320. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  321. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  322. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  323. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  324. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  325. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  326. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  327. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  328. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  329. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  330. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  331. data/vendor/libgit2/src/libgit2/settings.c +477 -0
  332. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  333. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  334. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  335. data/vendor/libgit2/src/libgit2/status.c +1 -1
  336. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  337. data/vendor/libgit2/src/libgit2/streams/openssl.c +36 -8
  338. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  339. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  340. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  341. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  342. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  343. data/vendor/libgit2/src/libgit2/submodule.c +195 -80
  344. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  345. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  346. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  347. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  348. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  349. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  350. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  351. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  352. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  353. data/vendor/libgit2/src/libgit2/transports/http.c +5 -6
  354. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  355. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  356. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  357. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  358. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  359. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  360. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  361. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +7 -6
  362. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  363. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  364. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  365. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  366. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1132 -0
  367. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  368. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  369. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  370. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  371. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  372. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  373. data/vendor/libgit2/src/util/alloc.c +4 -1
  374. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  375. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  376. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  377. data/vendor/libgit2/src/util/array.h +18 -17
  378. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  379. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  380. data/vendor/libgit2/src/util/date.c +22 -14
  381. data/vendor/libgit2/src/util/date.h +12 -0
  382. data/vendor/libgit2/src/util/errors.c +401 -0
  383. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  384. data/vendor/libgit2/src/util/fs_path.c +81 -10
  385. data/vendor/libgit2/src/util/fs_path.h +39 -10
  386. data/vendor/libgit2/src/util/futils.c +6 -5
  387. data/vendor/libgit2/src/util/futils.h +24 -7
  388. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  389. data/vendor/libgit2/src/util/git2_util.h +6 -0
  390. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  391. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  392. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  393. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  394. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  395. data/vendor/libgit2/src/util/hashmap.h +425 -0
  396. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  397. data/vendor/libgit2/src/util/integer.h +3 -1
  398. data/vendor/libgit2/src/util/net.c +17 -11
  399. data/vendor/libgit2/src/util/net.h +2 -0
  400. data/vendor/libgit2/src/util/pool.c +1 -1
  401. data/vendor/libgit2/src/util/pool.h +5 -0
  402. data/vendor/libgit2/src/util/pqueue.h +1 -1
  403. data/vendor/libgit2/src/util/process.h +223 -0
  404. data/vendor/libgit2/src/util/rand.c +1 -7
  405. data/vendor/libgit2/src/util/regexp.c +28 -13
  406. data/vendor/libgit2/src/util/regexp.h +7 -2
  407. data/vendor/libgit2/src/util/runtime.c +2 -2
  408. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  409. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  410. data/vendor/libgit2/src/util/str.c +20 -8
  411. data/vendor/libgit2/src/util/str.h +5 -3
  412. data/vendor/libgit2/src/util/strlist.c +108 -0
  413. data/vendor/libgit2/src/util/strlist.h +36 -0
  414. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  415. data/vendor/libgit2/src/util/unix/process.c +706 -0
  416. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  417. data/vendor/libgit2/src/util/util.c +18 -5
  418. data/vendor/libgit2/src/util/util.h +5 -38
  419. data/vendor/libgit2/src/util/vector.c +3 -3
  420. data/vendor/libgit2/src/util/vector.h +2 -2
  421. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  422. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  423. data/vendor/libgit2/src/util/win32/process.c +522 -0
  424. metadata +102 -67
  425. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  426. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  427. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  428. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  429. data/vendor/libgit2/deps/pcre/CMakeLists.txt +0 -140
  430. data/vendor/libgit2/deps/pcre/COPYING +0 -5
  431. data/vendor/libgit2/deps/pcre/LICENCE +0 -93
  432. data/vendor/libgit2/deps/pcre/cmake/COPYING-CMAKE-SCRIPTS +0 -22
  433. data/vendor/libgit2/deps/pcre/cmake/FindEditline.cmake +0 -17
  434. data/vendor/libgit2/deps/pcre/cmake/FindPackageHandleStandardArgs.cmake +0 -58
  435. data/vendor/libgit2/deps/pcre/cmake/FindReadline.cmake +0 -29
  436. data/vendor/libgit2/deps/pcre/config.h.in +0 -57
  437. data/vendor/libgit2/deps/pcre/pcre.h +0 -641
  438. data/vendor/libgit2/deps/pcre/pcre_byte_order.c +0 -319
  439. data/vendor/libgit2/deps/pcre/pcre_compile.c +0 -9815
  440. data/vendor/libgit2/deps/pcre/pcre_config.c +0 -190
  441. data/vendor/libgit2/deps/pcre/pcre_exec.c +0 -7173
  442. data/vendor/libgit2/deps/pcre/pcre_fullinfo.c +0 -245
  443. data/vendor/libgit2/deps/pcre/pcre_get.c +0 -669
  444. data/vendor/libgit2/deps/pcre/pcre_globals.c +0 -86
  445. data/vendor/libgit2/deps/pcre/pcre_internal.h +0 -2787
  446. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +0 -11913
  447. data/vendor/libgit2/deps/pcre/pcre_maketables.c +0 -156
  448. data/vendor/libgit2/deps/pcre/pcre_printint.c +0 -834
  449. data/vendor/libgit2/deps/pcre/pcre_string_utils.c +0 -211
  450. data/vendor/libgit2/deps/pcre/pcre_study.c +0 -1686
  451. data/vendor/libgit2/deps/pcre/pcre_tables.c +0 -727
  452. data/vendor/libgit2/deps/pcre/pcre_ucd.c +0 -3644
  453. data/vendor/libgit2/deps/pcre/pcre_valid_utf8.c +0 -301
  454. data/vendor/libgit2/deps/pcre/pcre_version.c +0 -98
  455. data/vendor/libgit2/deps/pcre/pcre_xclass.c +0 -268
  456. data/vendor/libgit2/deps/pcre/pcreposix.c +0 -420
  457. data/vendor/libgit2/deps/pcre/pcreposix.h +0 -117
  458. data/vendor/libgit2/deps/pcre/ucp.h +0 -224
  459. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  460. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  461. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  462. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  463. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  464. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  465. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  466. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  467. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  468. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  469. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  470. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  471. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  472. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  473. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  474. data/vendor/libgit2/src/util/khash.h +0 -615
  475. data/vendor/libgit2/src/util/strmap.c +0 -100
  476. data/vendor/libgit2/src/util/strmap.h +0 -131
  477. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -0,0 +1,706 @@
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 <stdio.h>
9
+ #include <sys/wait.h>
10
+ #include <signal.h>
11
+ #include <git2.h>
12
+
13
+ #include "git2_util.h"
14
+ #include "vector.h"
15
+ #include "futils.h"
16
+ #include "process.h"
17
+ #include "strlist.h"
18
+
19
+ #ifdef __APPLE__
20
+ #include <crt_externs.h>
21
+ #define environ (*_NSGetEnviron())
22
+ #else
23
+ extern char **environ;
24
+ #endif
25
+
26
+ struct git_process {
27
+ char **args;
28
+ char **env;
29
+
30
+ char *cwd;
31
+
32
+ unsigned int use_shell : 1,
33
+ capture_in : 1,
34
+ capture_out : 1,
35
+ capture_err : 1;
36
+
37
+ pid_t pid;
38
+
39
+ int child_in;
40
+ int child_out;
41
+ int child_err;
42
+ git_process_result_status status;
43
+ };
44
+
45
+ GIT_INLINE(bool) is_delete_env(const char *env)
46
+ {
47
+ const char *c = strchr(env, '=');
48
+
49
+ if (c == NULL)
50
+ return false;
51
+
52
+ return *(c+1) == '\0';
53
+ }
54
+
55
+ GIT_INLINE(int) insert_dup(git_vector *v, const char *s)
56
+ {
57
+ char *dup = git__strdup(s);
58
+
59
+ GIT_ERROR_CHECK_ALLOC(dup);
60
+
61
+ return git_vector_insert(v, dup);
62
+ }
63
+
64
+ static int setup_args(
65
+ char ***out,
66
+ const char **args,
67
+ size_t args_len,
68
+ bool use_shell)
69
+ {
70
+ git_vector prefixed = GIT_VECTOR_INIT;
71
+ git_str first = GIT_STR_INIT;
72
+ size_t cnt;
73
+
74
+ GIT_ASSERT(args && args_len);
75
+
76
+ if (use_shell) {
77
+ if (git_str_puts(&first, args[0]) < 0 ||
78
+ git_str_puts(&first, " \"$@\"") < 0 ||
79
+ insert_dup(&prefixed, "/bin/sh") < 0 ||
80
+ insert_dup(&prefixed, "-c") < 0 ||
81
+ git_vector_insert(&prefixed, git_str_detach(&first)) < 0)
82
+ goto on_error;
83
+ }
84
+
85
+ for (cnt = 0; args && cnt < args_len; cnt++) {
86
+ if (insert_dup(&prefixed, args[cnt]) < 0)
87
+ goto on_error;
88
+ }
89
+
90
+ git_vector_insert(&prefixed, NULL);
91
+
92
+ *out = (char **)prefixed.contents;
93
+
94
+ return 0;
95
+
96
+ on_error:
97
+ git_str_dispose(&first);
98
+ git_vector_dispose_deep(&prefixed);
99
+ return -1;
100
+ }
101
+
102
+ static int merge_env(
103
+ char ***out,
104
+ const char **env,
105
+ size_t env_len,
106
+ bool exclude_env)
107
+ {
108
+ git_vector merged = GIT_VECTOR_INIT;
109
+ char **kv;
110
+ size_t max, cnt;
111
+ int error = 0;
112
+
113
+ for (max = env_len, kv = environ; !exclude_env && *kv; kv++)
114
+ max++;
115
+
116
+ if ((error = git_vector_init(&merged, max, NULL)) < 0)
117
+ goto on_error;
118
+
119
+ for (cnt = 0; env && cnt < env_len; cnt++) {
120
+ if (is_delete_env(env[cnt]))
121
+ continue;
122
+
123
+ if (insert_dup(&merged, env[cnt]) < 0)
124
+ goto on_error;
125
+ }
126
+
127
+ if (!exclude_env) {
128
+ for (kv = environ; *kv; kv++) {
129
+ if (env && git_strlist_contains_key(env, env_len, *kv, '='))
130
+ continue;
131
+
132
+ if (insert_dup(&merged, *kv) < 0)
133
+ goto on_error;
134
+ }
135
+ }
136
+
137
+ if (merged.length == 0) {
138
+ *out = NULL;
139
+ error = 0;
140
+ goto on_error;
141
+ }
142
+
143
+ git_vector_insert(&merged, NULL);
144
+
145
+ *out = (char **)merged.contents;
146
+
147
+ return 0;
148
+
149
+ on_error:
150
+ git_vector_dispose_deep(&merged);
151
+ return error;
152
+ }
153
+
154
+ int git_process_new(
155
+ git_process **out,
156
+ const char **args,
157
+ size_t args_len,
158
+ const char **env,
159
+ size_t env_len,
160
+ git_process_options *opts)
161
+ {
162
+ git_process *process;
163
+
164
+ GIT_ASSERT_ARG(out && args && args_len > 0);
165
+
166
+ *out = NULL;
167
+
168
+ process = git__calloc(sizeof(git_process), 1);
169
+ GIT_ERROR_CHECK_ALLOC(process);
170
+
171
+ if (setup_args(&process->args, args, args_len, opts ? opts->use_shell : false) < 0 ||
172
+ merge_env(&process->env, env, env_len, opts ? opts->exclude_env : false) < 0) {
173
+ git_process_free(process);
174
+ return -1;
175
+ }
176
+
177
+ if (opts) {
178
+ process->use_shell = opts->use_shell;
179
+ process->capture_in = opts->capture_in;
180
+ process->capture_out = opts->capture_out;
181
+ process->capture_err = opts->capture_err;
182
+
183
+ if (opts->cwd) {
184
+ process->cwd = git__strdup(opts->cwd);
185
+ GIT_ERROR_CHECK_ALLOC(process->cwd);
186
+ }
187
+ }
188
+
189
+ process->child_in = -1;
190
+ process->child_out = -1;
191
+ process->child_err = -1;
192
+ process->status = -1;
193
+
194
+ *out = process;
195
+ return 0;
196
+ }
197
+
198
+ extern int git_process_new_from_cmdline(
199
+ git_process **out,
200
+ const char *cmdline,
201
+ const char **env,
202
+ size_t env_len,
203
+ git_process_options *opts)
204
+ {
205
+ git_process_options merged_opts = {0};
206
+
207
+ memcpy(&merged_opts, opts, sizeof(git_process_options));
208
+ merged_opts.use_shell = 1;
209
+
210
+ return git_process_new(out, &cmdline, 1, env, env_len, &merged_opts);
211
+ }
212
+
213
+ #define CLOSE_FD(fd) \
214
+ if (fd >= 0) { \
215
+ close(fd); \
216
+ fd = -1; \
217
+ }
218
+
219
+ static int try_read_status(size_t *out, int fd, void *buf, size_t len)
220
+ {
221
+ size_t read_len = 0;
222
+ int ret = -1;
223
+
224
+ while (ret && read_len < len) {
225
+ ret = read(fd, buf + read_len, len - read_len);
226
+
227
+ if (ret < 0 && errno != EAGAIN && errno != EINTR) {
228
+ git_error_set(GIT_ERROR_OS, "could not read child status");
229
+ return -1;
230
+ }
231
+
232
+ read_len += ret;
233
+ }
234
+
235
+ *out = read_len;
236
+ return 0;
237
+ }
238
+
239
+
240
+ static int read_status(int fd)
241
+ {
242
+ size_t status_len = sizeof(int) * 3, read_len = 0;
243
+ char buffer[status_len], fn[128];
244
+ int error, fn_error, os_error, fn_len = 0;
245
+
246
+ if ((error = try_read_status(&read_len, fd, buffer, status_len)) < 0)
247
+ return error;
248
+
249
+ /* Immediate EOF indicates the exec succeeded. */
250
+ if (read_len == 0)
251
+ return 0;
252
+
253
+ if (read_len < status_len) {
254
+ git_error_set(GIT_ERROR_INVALID, "child status truncated");
255
+ return -1;
256
+ }
257
+
258
+ memcpy(&fn_error, &buffer[0], sizeof(int));
259
+ memcpy(&os_error, &buffer[sizeof(int)], sizeof(int));
260
+ memcpy(&fn_len, &buffer[sizeof(int) * 2], sizeof(int));
261
+
262
+ if (fn_len > 0) {
263
+ fn_len = min(fn_len, (int)(ARRAY_SIZE(fn) - 1));
264
+
265
+ if ((error = try_read_status(&read_len, fd, fn, fn_len)) < 0)
266
+ return error;
267
+
268
+ fn[fn_len] = '\0';
269
+ } else {
270
+ fn[0] = '\0';
271
+ }
272
+
273
+ if (fn_error) {
274
+ errno = os_error;
275
+ git_error_set(GIT_ERROR_OS, "could not %s", fn[0] ? fn : "(unknown)");
276
+ }
277
+
278
+ return fn_error;
279
+ }
280
+
281
+ static bool try_write_status(int fd, const void *buf, size_t len)
282
+ {
283
+ size_t write_len;
284
+ int ret;
285
+
286
+ for (write_len = 0; write_len < len; ) {
287
+ ret = write(fd, buf + write_len, len - write_len);
288
+
289
+ if (ret <= 0)
290
+ break;
291
+
292
+ write_len += ret;
293
+ }
294
+
295
+ return (len == write_len);
296
+ }
297
+
298
+ static void write_status(int fd, const char *fn, int error, int os_error)
299
+ {
300
+ size_t status_len = sizeof(int) * 3, fn_len;
301
+ char buffer[status_len];
302
+
303
+ fn_len = strlen(fn);
304
+
305
+ if (fn_len > INT_MAX)
306
+ fn_len = INT_MAX;
307
+
308
+ memcpy(&buffer[0], &error, sizeof(int));
309
+ memcpy(&buffer[sizeof(int)], &os_error, sizeof(int));
310
+ memcpy(&buffer[sizeof(int) * 2], &fn_len, sizeof(int));
311
+
312
+ /* Do our best effort to write all the status. */
313
+ if (!try_write_status(fd, buffer, status_len))
314
+ return;
315
+
316
+ if (fn_len)
317
+ try_write_status(fd, fn, fn_len);
318
+ }
319
+
320
+ static int resolve_path(git_process *process)
321
+ {
322
+ git_str full_path = GIT_STR_INIT;
323
+ int error = 0;
324
+
325
+ /* The shell will resolve the path for us */
326
+ if (process->use_shell)
327
+ goto done;
328
+
329
+ error = git_fs_path_find_executable(&full_path, process->args[0]);
330
+
331
+ if (error == GIT_ENOTFOUND) {
332
+ git_error_set(GIT_ERROR_SSH, "cannot run %s: No such file or directory", process->args[0]);
333
+ error = -1;
334
+ }
335
+
336
+ if (error)
337
+ goto done;
338
+
339
+ git__free(process->args[0]);
340
+ process->args[0] = git_str_detach(&full_path);
341
+
342
+ done:
343
+ git_str_dispose(&full_path);
344
+ return error;
345
+ }
346
+
347
+ int git_process_start(git_process *process)
348
+ {
349
+ int in[2] = { -1, -1 }, out[2] = { -1, -1 },
350
+ err[2] = { -1, -1 }, status[2] = { -1, -1 };
351
+ int fdflags, state, error;
352
+ pid_t pid;
353
+
354
+ /* Locate the path (unless we're letting the shell do it for us) */
355
+ if ((error = resolve_path(process)) < 0)
356
+ goto on_error;
357
+
358
+ /* Set up the pipes to read from/write to the process */
359
+ if ((process->capture_in && pipe(in) < 0) ||
360
+ (process->capture_out && pipe(out) < 0) ||
361
+ (process->capture_err && pipe(err) < 0)) {
362
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
363
+ goto on_error;
364
+ }
365
+
366
+ /* Set up a self-pipe for status from the forked process. */
367
+ if (pipe(status) < 0 ||
368
+ (fdflags = fcntl(status[1], F_GETFD)) < 0 ||
369
+ fcntl(status[1], F_SETFD, fdflags | FD_CLOEXEC) < 0) {
370
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
371
+ goto on_error;
372
+ }
373
+
374
+ switch (pid = fork()) {
375
+ case -1:
376
+ git_error_set(GIT_ERROR_OS, "could not fork");
377
+ goto on_error;
378
+
379
+ /* Child: start the process. */
380
+ case 0:
381
+ /* Close the opposing side of the pipes */
382
+ CLOSE_FD(status[0]);
383
+
384
+ if (process->capture_in) {
385
+ CLOSE_FD(in[1]);
386
+ dup2(in[0], STDIN_FILENO);
387
+ }
388
+
389
+ if (process->capture_out) {
390
+ CLOSE_FD(out[0]);
391
+ dup2(out[1], STDOUT_FILENO);
392
+ }
393
+
394
+ if (process->capture_err) {
395
+ CLOSE_FD(err[0]);
396
+ dup2(err[1], STDERR_FILENO);
397
+ }
398
+
399
+ if (process->cwd && (error = chdir(process->cwd)) < 0) {
400
+ write_status(status[1], "chdir", error, errno);
401
+ exit(0);
402
+ }
403
+
404
+ /*
405
+ * Exec the process and write the results back if the
406
+ * call fails. If it succeeds, we'll close the status
407
+ * pipe (via CLOEXEC) and the parent will know.
408
+ */
409
+ error = execve(process->args[0],
410
+ process->args,
411
+ process->env);
412
+
413
+ write_status(status[1], "execve", error, errno);
414
+ exit(0);
415
+
416
+ /* Parent: make sure the child process exec'd correctly. */
417
+ default:
418
+ /* Close the opposing side of the pipes */
419
+ CLOSE_FD(status[1]);
420
+
421
+ if (process->capture_in) {
422
+ CLOSE_FD(in[0]);
423
+ process->child_in = in[1];
424
+ }
425
+
426
+ if (process->capture_out) {
427
+ CLOSE_FD(out[1]);
428
+ process->child_out = out[0];
429
+ }
430
+
431
+ if (process->capture_err) {
432
+ CLOSE_FD(err[1]);
433
+ process->child_err = err[0];
434
+ }
435
+
436
+ /* Try to read the status */
437
+ process->status = status[0];
438
+ if ((error = read_status(status[0])) < 0) {
439
+ waitpid(process->pid, &state, 0);
440
+ goto on_error;
441
+ }
442
+
443
+ process->pid = pid;
444
+ return 0;
445
+ }
446
+
447
+ on_error:
448
+ CLOSE_FD(in[0]); CLOSE_FD(in[1]);
449
+ CLOSE_FD(out[0]); CLOSE_FD(out[1]);
450
+ CLOSE_FD(err[0]); CLOSE_FD(err[1]);
451
+ CLOSE_FD(status[0]); CLOSE_FD(status[1]);
452
+ return -1;
453
+ }
454
+
455
+ int git_process_id(p_pid_t *out, git_process *process)
456
+ {
457
+ GIT_ASSERT(out && process);
458
+
459
+ if (!process->pid) {
460
+ git_error_set(GIT_ERROR_INVALID, "process not running");
461
+ return -1;
462
+ }
463
+
464
+ *out = process->pid;
465
+ return 0;
466
+ }
467
+
468
+ static ssize_t process_read(int fd, void *buf, size_t count)
469
+ {
470
+ ssize_t ret;
471
+
472
+ if (count > SSIZE_MAX)
473
+ count = SSIZE_MAX;
474
+
475
+ if ((ret = read(fd, buf, count)) < 0) {
476
+ git_error_set(GIT_ERROR_OS, "could not read from child process");
477
+ return -1;
478
+ }
479
+
480
+ return ret;
481
+ }
482
+
483
+ ssize_t git_process_read(git_process *process, void *buf, size_t count)
484
+ {
485
+ GIT_ASSERT_ARG(process);
486
+ GIT_ASSERT(process->capture_out);
487
+
488
+ return process_read(process->child_out, buf, count);
489
+ }
490
+
491
+ ssize_t git_process_read_err(git_process *process, void *buf, size_t count)
492
+ {
493
+ GIT_ASSERT_ARG(process);
494
+ GIT_ASSERT(process->capture_err);
495
+
496
+ return process_read(process->child_err, buf, count);
497
+ }
498
+
499
+ #ifdef GIT_THREADS
500
+
501
+ # define signal_state sigset_t
502
+
503
+ /*
504
+ * Since signal-handling is process-wide, we cannot simply use
505
+ * SIG_IGN to avoid SIGPIPE. Instead: http://www.microhowto.info:80/howto/ignore_sigpipe_without_affecting_other_threads_in_a_process.html
506
+ */
507
+
508
+ GIT_INLINE(int) disable_signals(sigset_t *saved_mask)
509
+ {
510
+ sigset_t sigpipe_mask;
511
+
512
+ sigemptyset(&sigpipe_mask);
513
+ sigaddset(&sigpipe_mask, SIGPIPE);
514
+
515
+ if (pthread_sigmask(SIG_BLOCK, &sigpipe_mask, saved_mask) < 0) {
516
+ git_error_set(GIT_ERROR_OS, "could not configure signal mask");
517
+ return -1;
518
+ }
519
+
520
+ return 0;
521
+ }
522
+
523
+ GIT_INLINE(int) restore_signals(sigset_t *saved_mask)
524
+ {
525
+ sigset_t sigpipe_mask, pending;
526
+ int signal;
527
+
528
+ sigemptyset(&sigpipe_mask);
529
+ sigaddset(&sigpipe_mask, SIGPIPE);
530
+
531
+ if (sigpending(&pending) < 0) {
532
+ git_error_set(GIT_ERROR_OS, "could not examine pending signals");
533
+ return -1;
534
+ }
535
+
536
+ if (sigismember(&pending, SIGPIPE) == 1 &&
537
+ sigwait(&sigpipe_mask, &signal) < 0) {
538
+ git_error_set(GIT_ERROR_OS, "could not wait for (blocking) signal delivery");
539
+ return -1;
540
+ }
541
+
542
+ if (pthread_sigmask(SIG_SETMASK, saved_mask, 0) < 0) {
543
+ git_error_set(GIT_ERROR_OS, "could not configure signal mask");
544
+ return -1;
545
+ }
546
+
547
+ return 0;
548
+ }
549
+
550
+ #else
551
+
552
+ # define signal_state struct sigaction
553
+
554
+ GIT_INLINE(int) disable_signals(struct sigaction *saved_handler)
555
+ {
556
+ struct sigaction ign_handler = { 0 };
557
+
558
+ ign_handler.sa_handler = SIG_IGN;
559
+
560
+ if (sigaction(SIGPIPE, &ign_handler, saved_handler) < 0) {
561
+ git_error_set(GIT_ERROR_OS, "could not configure signal handler");
562
+ return -1;
563
+ }
564
+
565
+ return 0;
566
+ }
567
+
568
+ GIT_INLINE(int) restore_signals(struct sigaction *saved_handler)
569
+ {
570
+ if (sigaction(SIGPIPE, saved_handler, NULL) < 0) {
571
+ git_error_set(GIT_ERROR_OS, "could not configure signal handler");
572
+ return -1;
573
+ }
574
+
575
+ return 0;
576
+ }
577
+
578
+ #endif
579
+
580
+ ssize_t git_process_write(git_process *process, const void *buf, size_t count)
581
+ {
582
+ signal_state saved_signal;
583
+ ssize_t ret;
584
+
585
+ GIT_ASSERT_ARG(process);
586
+ GIT_ASSERT(process->capture_in);
587
+
588
+ if (count > SSIZE_MAX)
589
+ count = SSIZE_MAX;
590
+
591
+ if (disable_signals(&saved_signal) < 0)
592
+ return -1;
593
+
594
+ if ((ret = write(process->child_in, buf, count)) < 0)
595
+ git_error_set(GIT_ERROR_OS, "could not write to child process");
596
+
597
+ if (restore_signals(&saved_signal) < 0)
598
+ return -1;
599
+
600
+ return (ret < 0) ? -1 : ret;
601
+ }
602
+
603
+ int git_process_close_in(git_process *process)
604
+ {
605
+ if (!process->capture_in) {
606
+ git_error_set(GIT_ERROR_INVALID, "input is not open");
607
+ return -1;
608
+ }
609
+
610
+ CLOSE_FD(process->child_in);
611
+ return 0;
612
+ }
613
+
614
+ int git_process_close_out(git_process *process)
615
+ {
616
+ if (!process->capture_out) {
617
+ git_error_set(GIT_ERROR_INVALID, "output is not open");
618
+ return -1;
619
+ }
620
+
621
+ CLOSE_FD(process->child_out);
622
+ return 0;
623
+ }
624
+
625
+ int git_process_close_err(git_process *process)
626
+ {
627
+ if (!process->capture_err) {
628
+ git_error_set(GIT_ERROR_INVALID, "error is not open");
629
+ return -1;
630
+ }
631
+
632
+ CLOSE_FD(process->child_err);
633
+ return 0;
634
+ }
635
+
636
+ int git_process_close(git_process *process)
637
+ {
638
+ CLOSE_FD(process->child_in);
639
+ CLOSE_FD(process->child_out);
640
+ CLOSE_FD(process->child_err);
641
+
642
+ return 0;
643
+ }
644
+
645
+ int git_process_wait(git_process_result *result, git_process *process)
646
+ {
647
+ int state;
648
+
649
+ if (result)
650
+ memset(result, 0, sizeof(git_process_result));
651
+
652
+ if (!process->pid) {
653
+ git_error_set(GIT_ERROR_INVALID, "process is stopped");
654
+ return -1;
655
+ }
656
+
657
+ if (waitpid(process->pid, &state, 0) < 0) {
658
+ git_error_set(GIT_ERROR_OS, "could not wait for child");
659
+ return -1;
660
+ }
661
+
662
+ process->pid = 0;
663
+
664
+ if (result) {
665
+ if (WIFEXITED(state)) {
666
+ result->status = GIT_PROCESS_STATUS_NORMAL;
667
+ result->exitcode = WEXITSTATUS(state);
668
+ } else if (WIFSIGNALED(state)) {
669
+ result->status = GIT_PROCESS_STATUS_ERROR;
670
+ result->signal = WTERMSIG(state);
671
+ } else {
672
+ result->status = GIT_PROCESS_STATUS_ERROR;
673
+ }
674
+ }
675
+
676
+ return 0;
677
+ }
678
+
679
+ int git_process_result_msg(git_str *out, git_process_result *result)
680
+ {
681
+ if (result->status == GIT_PROCESS_STATUS_NONE) {
682
+ return git_str_puts(out, "process not started");
683
+ } else if (result->status == GIT_PROCESS_STATUS_NORMAL) {
684
+ return git_str_printf(out, "process exited with code %d",
685
+ result->exitcode);
686
+ } else if (result->signal) {
687
+ return git_str_printf(out, "process exited on signal %d",
688
+ result->signal);
689
+ }
690
+
691
+ return git_str_puts(out, "unknown error");
692
+ }
693
+
694
+ void git_process_free(git_process *process)
695
+ {
696
+ if (!process)
697
+ return;
698
+
699
+ if (process->pid)
700
+ git_process_close(process);
701
+
702
+ git__free(process->cwd);
703
+ git_strlist_free_with_null(process->args);
704
+ git_strlist_free_with_null(process->env);
705
+ git__free(process);
706
+ }