rugged 1.7.2 → 1.9.4

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 (405) 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 +195 -1
  32. data/vendor/libgit2/cmake/DefaultCFlags.cmake +4 -1
  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 +6 -1
  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/pcre/CMakeLists.txt +3 -3
  59. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +1 -1
  60. data/vendor/libgit2/deps/xdiff/xmerge.c +16 -12
  61. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  62. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  63. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  64. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  65. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  66. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  67. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  68. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  69. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  70. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  71. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  72. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  73. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  74. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  75. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  76. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  77. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  78. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  79. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  80. data/vendor/libgit2/include/git2/apply.h +27 -6
  81. data/vendor/libgit2/include/git2/attr.h +17 -4
  82. data/vendor/libgit2/include/git2/blame.h +133 -28
  83. data/vendor/libgit2/include/git2/blob.h +71 -28
  84. data/vendor/libgit2/include/git2/branch.h +22 -15
  85. data/vendor/libgit2/include/git2/buffer.h +6 -4
  86. data/vendor/libgit2/include/git2/cert.h +2 -1
  87. data/vendor/libgit2/include/git2/checkout.h +83 -32
  88. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  89. data/vendor/libgit2/include/git2/clone.h +25 -9
  90. data/vendor/libgit2/include/git2/commit.h +132 -3
  91. data/vendor/libgit2/include/git2/common.h +120 -63
  92. data/vendor/libgit2/include/git2/config.h +93 -23
  93. data/vendor/libgit2/include/git2/credential.h +30 -2
  94. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  95. data/vendor/libgit2/include/git2/deprecated.h +134 -4
  96. data/vendor/libgit2/include/git2/describe.h +13 -1
  97. data/vendor/libgit2/include/git2/diff.h +38 -8
  98. data/vendor/libgit2/include/git2/email.h +9 -29
  99. data/vendor/libgit2/include/git2/errors.h +46 -73
  100. data/vendor/libgit2/include/git2/filter.h +14 -7
  101. data/vendor/libgit2/include/git2/global.h +8 -1
  102. data/vendor/libgit2/include/git2/graph.h +3 -2
  103. data/vendor/libgit2/include/git2/ignore.h +10 -0
  104. data/vendor/libgit2/include/git2/index.h +100 -15
  105. data/vendor/libgit2/include/git2/indexer.h +21 -4
  106. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  107. data/vendor/libgit2/include/git2/merge.h +50 -3
  108. data/vendor/libgit2/include/git2/message.h +2 -2
  109. data/vendor/libgit2/include/git2/net.h +3 -1
  110. data/vendor/libgit2/include/git2/notes.h +9 -6
  111. data/vendor/libgit2/include/git2/object.h +9 -8
  112. data/vendor/libgit2/include/git2/odb.h +91 -49
  113. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  114. data/vendor/libgit2/include/git2/oid.h +23 -25
  115. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  116. data/vendor/libgit2/include/git2/pack.h +13 -1
  117. data/vendor/libgit2/include/git2/patch.h +2 -3
  118. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  119. data/vendor/libgit2/include/git2/proxy.h +12 -3
  120. data/vendor/libgit2/include/git2/rebase.h +9 -6
  121. data/vendor/libgit2/include/git2/refdb.h +2 -2
  122. data/vendor/libgit2/include/git2/reflog.h +3 -2
  123. data/vendor/libgit2/include/git2/refs.h +9 -6
  124. data/vendor/libgit2/include/git2/refspec.h +14 -4
  125. data/vendor/libgit2/include/git2/remote.h +113 -25
  126. data/vendor/libgit2/include/git2/repository.h +57 -21
  127. data/vendor/libgit2/include/git2/reset.h +16 -3
  128. data/vendor/libgit2/include/git2/revert.h +9 -4
  129. data/vendor/libgit2/include/git2/revparse.h +3 -3
  130. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  131. data/vendor/libgit2/include/git2/signature.h +46 -1
  132. data/vendor/libgit2/include/git2/stash.h +17 -3
  133. data/vendor/libgit2/include/git2/status.h +10 -6
  134. data/vendor/libgit2/include/git2/stdint.h +87 -85
  135. data/vendor/libgit2/include/git2/strarray.h +2 -3
  136. data/vendor/libgit2/include/git2/submodule.h +20 -9
  137. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  138. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  139. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  140. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  141. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  142. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  143. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  144. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  145. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  146. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  147. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  148. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  149. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  150. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  151. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  152. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  153. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  154. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  155. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  156. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  157. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  158. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  159. data/vendor/libgit2/include/git2/sys/transport.h +25 -4
  160. data/vendor/libgit2/include/git2/tag.h +3 -1
  161. data/vendor/libgit2/include/git2/trace.h +9 -3
  162. data/vendor/libgit2/include/git2/transaction.h +3 -2
  163. data/vendor/libgit2/include/git2/transport.h +11 -3
  164. data/vendor/libgit2/include/git2/tree.h +16 -5
  165. data/vendor/libgit2/include/git2/types.h +19 -3
  166. data/vendor/libgit2/include/git2/version.h +46 -8
  167. data/vendor/libgit2/include/git2/worktree.h +16 -6
  168. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  169. data/vendor/libgit2/src/cli/CMakeLists.txt +3 -4
  170. data/vendor/libgit2/src/cli/cmd.c +1 -1
  171. data/vendor/libgit2/src/cli/cmd.h +4 -0
  172. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  173. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  174. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  175. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  176. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  177. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  178. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  179. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  180. data/vendor/libgit2/src/cli/common.c +168 -0
  181. data/vendor/libgit2/src/cli/common.h +63 -0
  182. data/vendor/libgit2/src/cli/error.h +1 -1
  183. data/vendor/libgit2/src/cli/main.c +52 -24
  184. data/vendor/libgit2/src/cli/opt.c +31 -5
  185. data/vendor/libgit2/src/cli/opt.h +21 -3
  186. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  187. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  188. data/vendor/libgit2/src/cli/progress.c +51 -2
  189. data/vendor/libgit2/src/cli/progress.h +12 -0
  190. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  191. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  192. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  193. data/vendor/libgit2/src/libgit2/CMakeLists.txt +55 -21
  194. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  195. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  196. data/vendor/libgit2/src/libgit2/attr_file.c +17 -5
  197. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  198. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  199. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  200. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  201. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  202. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  203. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  204. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  205. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  206. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  207. data/vendor/libgit2/src/libgit2/clone.c +192 -166
  208. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  209. data/vendor/libgit2/src/libgit2/commit.c +93 -1
  210. data/vendor/libgit2/src/libgit2/commit_graph.c +68 -58
  211. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  212. data/vendor/libgit2/src/libgit2/config.c +390 -299
  213. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  214. data/vendor/libgit2/src/libgit2/config.h +9 -4
  215. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  216. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  217. data/vendor/libgit2/src/libgit2/config_file.c +101 -89
  218. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  219. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  220. data/vendor/libgit2/src/libgit2/config_mem.c +195 -40
  221. data/vendor/libgit2/src/libgit2/config_parse.c +12 -10
  222. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  223. data/vendor/libgit2/src/libgit2/delta.c +5 -1
  224. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  225. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  226. data/vendor/libgit2/src/libgit2/diff_driver.c +13 -20
  227. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  228. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  229. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  230. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  231. data/vendor/libgit2/src/libgit2/diff_stats.c +19 -12
  232. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  233. data/vendor/libgit2/src/libgit2/email.c +1 -0
  234. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  235. data/vendor/libgit2/src/libgit2/fetchhead.c +1 -1
  236. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  237. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  238. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  239. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  240. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  241. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  242. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  243. data/vendor/libgit2/src/libgit2/index.c +76 -98
  244. data/vendor/libgit2/src/libgit2/index.h +5 -2
  245. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  246. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  247. data/vendor/libgit2/src/libgit2/indexer.c +36 -40
  248. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  249. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +43 -38
  252. data/vendor/libgit2/src/libgit2/merge.h +4 -0
  253. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  254. data/vendor/libgit2/src/libgit2/merge_file.c +43 -30
  255. data/vendor/libgit2/src/libgit2/message.c +1 -1
  256. data/vendor/libgit2/src/libgit2/midx.c +30 -18
  257. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  258. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  259. data/vendor/libgit2/src/libgit2/object.c +6 -5
  260. data/vendor/libgit2/src/libgit2/odb.c +7 -10
  261. data/vendor/libgit2/src/libgit2/odb_loose.c +24 -14
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  264. data/vendor/libgit2/src/libgit2/oid.c +36 -10
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/pack-objects.c +59 -34
  267. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  268. data/vendor/libgit2/src/libgit2/pack.c +33 -24
  269. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  270. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  271. data/vendor/libgit2/src/libgit2/path.c +1 -1
  272. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  273. data/vendor/libgit2/src/libgit2/push.c +79 -28
  274. data/vendor/libgit2/src/libgit2/push.h +1 -0
  275. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  276. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  277. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  278. data/vendor/libgit2/src/libgit2/refs.c +41 -13
  279. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  280. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  281. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  282. data/vendor/libgit2/src/libgit2/remote.c +125 -62
  283. data/vendor/libgit2/src/libgit2/remote.h +0 -1
  284. data/vendor/libgit2/src/libgit2/repository.c +235 -54
  285. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  286. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  287. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  288. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  289. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  290. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  291. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  292. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  293. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  294. data/vendor/libgit2/src/libgit2/status.c +1 -1
  295. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  296. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  297. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  298. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  299. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  300. data/vendor/libgit2/src/libgit2/streams/socket.c +30 -0
  301. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  302. data/vendor/libgit2/src/libgit2/submodule.c +118 -68
  303. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  304. data/vendor/libgit2/src/libgit2/tag.c +4 -2
  305. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  306. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  307. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  308. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  309. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +2 -0
  310. data/vendor/libgit2/src/libgit2/transports/credential.c +2 -2
  311. data/vendor/libgit2/src/libgit2/transports/git.c +1 -1
  312. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  313. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  314. data/vendor/libgit2/src/libgit2/transports/httpclient.c +124 -81
  315. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  316. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  317. data/vendor/libgit2/src/libgit2/transports/local.c +16 -8
  318. data/vendor/libgit2/src/libgit2/transports/smart.c +25 -13
  319. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  320. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +5 -5
  321. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  322. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  323. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +386 -0
  324. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  325. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  326. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  327. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  328. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  329. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  330. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  331. data/vendor/libgit2/src/util/CMakeLists.txt +7 -10
  332. data/vendor/libgit2/src/util/alloc.c +4 -1
  333. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  334. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  335. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  336. data/vendor/libgit2/src/util/array.h +18 -17
  337. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  338. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  339. data/vendor/libgit2/src/util/date.c +22 -14
  340. data/vendor/libgit2/src/util/date.h +12 -0
  341. data/vendor/libgit2/src/util/errors.c +401 -0
  342. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  343. data/vendor/libgit2/src/util/fs_path.c +81 -10
  344. data/vendor/libgit2/src/util/fs_path.h +29 -0
  345. data/vendor/libgit2/src/util/futils.c +6 -5
  346. data/vendor/libgit2/src/util/futils.h +24 -7
  347. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  348. data/vendor/libgit2/src/util/git2_util.h +6 -0
  349. data/vendor/libgit2/src/util/hash/builtin.c +14 -4
  350. data/vendor/libgit2/src/util/hash/openssl.c +148 -0
  351. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  352. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +8 -6
  353. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  354. data/vendor/libgit2/src/util/hashmap.h +425 -0
  355. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  356. data/vendor/libgit2/src/util/integer.h +3 -1
  357. data/vendor/libgit2/src/util/net.c +17 -11
  358. data/vendor/libgit2/src/util/net.h +2 -0
  359. data/vendor/libgit2/src/util/pool.c +1 -1
  360. data/vendor/libgit2/src/util/pool.h +5 -0
  361. data/vendor/libgit2/src/util/pqueue.h +1 -1
  362. data/vendor/libgit2/src/util/process.h +223 -0
  363. data/vendor/libgit2/src/util/rand.c +1 -7
  364. data/vendor/libgit2/src/util/regexp.c +1 -1
  365. data/vendor/libgit2/src/util/runtime.c +2 -2
  366. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  367. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  368. data/vendor/libgit2/src/util/str.c +20 -8
  369. data/vendor/libgit2/src/util/str.h +5 -3
  370. data/vendor/libgit2/src/util/strlist.c +108 -0
  371. data/vendor/libgit2/src/util/strlist.h +36 -0
  372. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  373. data/vendor/libgit2/src/util/unix/process.c +706 -0
  374. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  375. data/vendor/libgit2/src/util/util.c +18 -5
  376. data/vendor/libgit2/src/util/util.h +5 -38
  377. data/vendor/libgit2/src/util/vector.c +3 -3
  378. data/vendor/libgit2/src/util/vector.h +2 -2
  379. data/vendor/libgit2/src/util/win32/path_w32.c +81 -5
  380. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  381. data/vendor/libgit2/src/util/win32/process.c +522 -0
  382. metadata +60 -32
  383. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  384. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  385. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  386. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  387. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  388. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  389. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  390. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  391. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  392. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  393. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  394. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  395. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  396. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  397. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  398. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  399. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  400. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  401. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  402. data/vendor/libgit2/src/util/khash.h +0 -615
  403. data/vendor/libgit2/src/util/strmap.c +0 -100
  404. data/vendor/libgit2/src/util/strmap.h +0 -131
  405. /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
+ }