rugged 1.7.2 → 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 (361) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rugged/version.rb +1 -1
  3. data/vendor/libgit2/AUTHORS +1 -0
  4. data/vendor/libgit2/CMakeLists.txt +23 -10
  5. data/vendor/libgit2/COPYING +195 -1
  6. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  7. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  8. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +1 -1
  9. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  10. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +17 -8
  11. data/vendor/libgit2/cmake/SelectHashes.cmake +28 -11
  12. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  13. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  14. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  15. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  16. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  17. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  18. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  19. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  20. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  21. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  22. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  23. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  24. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  25. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  26. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  27. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  28. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  29. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  30. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  31. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  32. data/vendor/libgit2/deps/xdiff/xmerge.c +2 -2
  33. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  34. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  35. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  36. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  37. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  38. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  39. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  40. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  41. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  42. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  43. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  44. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  45. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  46. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  47. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  48. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  49. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  50. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  51. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  52. data/vendor/libgit2/include/git2/apply.h +27 -6
  53. data/vendor/libgit2/include/git2/attr.h +17 -4
  54. data/vendor/libgit2/include/git2/blame.h +133 -28
  55. data/vendor/libgit2/include/git2/blob.h +71 -28
  56. data/vendor/libgit2/include/git2/branch.h +22 -15
  57. data/vendor/libgit2/include/git2/buffer.h +6 -4
  58. data/vendor/libgit2/include/git2/cert.h +2 -1
  59. data/vendor/libgit2/include/git2/checkout.h +83 -32
  60. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  61. data/vendor/libgit2/include/git2/clone.h +25 -9
  62. data/vendor/libgit2/include/git2/commit.h +132 -3
  63. data/vendor/libgit2/include/git2/common.h +120 -63
  64. data/vendor/libgit2/include/git2/config.h +93 -23
  65. data/vendor/libgit2/include/git2/credential.h +30 -2
  66. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  67. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  68. data/vendor/libgit2/include/git2/describe.h +13 -1
  69. data/vendor/libgit2/include/git2/diff.h +38 -8
  70. data/vendor/libgit2/include/git2/email.h +9 -29
  71. data/vendor/libgit2/include/git2/errors.h +46 -73
  72. data/vendor/libgit2/include/git2/filter.h +14 -7
  73. data/vendor/libgit2/include/git2/global.h +8 -1
  74. data/vendor/libgit2/include/git2/graph.h +3 -2
  75. data/vendor/libgit2/include/git2/ignore.h +10 -0
  76. data/vendor/libgit2/include/git2/index.h +99 -14
  77. data/vendor/libgit2/include/git2/indexer.h +21 -4
  78. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  79. data/vendor/libgit2/include/git2/merge.h +46 -1
  80. data/vendor/libgit2/include/git2/message.h +2 -2
  81. data/vendor/libgit2/include/git2/net.h +3 -1
  82. data/vendor/libgit2/include/git2/notes.h +9 -6
  83. data/vendor/libgit2/include/git2/object.h +9 -8
  84. data/vendor/libgit2/include/git2/odb.h +91 -49
  85. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  86. data/vendor/libgit2/include/git2/oid.h +23 -24
  87. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  88. data/vendor/libgit2/include/git2/pack.h +13 -1
  89. data/vendor/libgit2/include/git2/patch.h +2 -3
  90. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  91. data/vendor/libgit2/include/git2/proxy.h +10 -0
  92. data/vendor/libgit2/include/git2/rebase.h +9 -6
  93. data/vendor/libgit2/include/git2/refdb.h +2 -2
  94. data/vendor/libgit2/include/git2/reflog.h +3 -2
  95. data/vendor/libgit2/include/git2/refs.h +9 -6
  96. data/vendor/libgit2/include/git2/refspec.h +14 -4
  97. data/vendor/libgit2/include/git2/remote.h +94 -18
  98. data/vendor/libgit2/include/git2/repository.h +57 -21
  99. data/vendor/libgit2/include/git2/reset.h +16 -3
  100. data/vendor/libgit2/include/git2/revert.h +9 -4
  101. data/vendor/libgit2/include/git2/revparse.h +3 -3
  102. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  103. data/vendor/libgit2/include/git2/signature.h +46 -1
  104. data/vendor/libgit2/include/git2/stash.h +17 -3
  105. data/vendor/libgit2/include/git2/status.h +10 -6
  106. data/vendor/libgit2/include/git2/stdint.h +87 -85
  107. data/vendor/libgit2/include/git2/strarray.h +2 -3
  108. data/vendor/libgit2/include/git2/submodule.h +20 -9
  109. data/vendor/libgit2/include/git2/sys/alloc.h +12 -0
  110. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  111. data/vendor/libgit2/include/git2/sys/commit_graph.h +103 -62
  112. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  113. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  114. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  115. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  116. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  117. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  118. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  119. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  120. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  121. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  122. data/vendor/libgit2/include/git2/sys/midx.h +43 -4
  123. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  124. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  125. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  126. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  127. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  128. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  129. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  130. data/vendor/libgit2/include/git2/sys/stream.h +11 -2
  131. data/vendor/libgit2/include/git2/sys/transport.h +24 -3
  132. data/vendor/libgit2/include/git2/tag.h +3 -1
  133. data/vendor/libgit2/include/git2/trace.h +9 -3
  134. data/vendor/libgit2/include/git2/transaction.h +3 -2
  135. data/vendor/libgit2/include/git2/transport.h +11 -3
  136. data/vendor/libgit2/include/git2/tree.h +16 -5
  137. data/vendor/libgit2/include/git2/types.h +19 -3
  138. data/vendor/libgit2/include/git2/version.h +44 -8
  139. data/vendor/libgit2/include/git2/worktree.h +16 -6
  140. data/vendor/libgit2/src/CMakeLists.txt +6 -4
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  142. data/vendor/libgit2/src/cli/cmd.c +1 -1
  143. data/vendor/libgit2/src/cli/cmd.h +4 -0
  144. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  145. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  146. data/vendor/libgit2/src/cli/cmd_clone.c +5 -7
  147. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  149. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  150. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  151. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  152. data/vendor/libgit2/src/cli/common.c +168 -0
  153. data/vendor/libgit2/src/cli/common.h +63 -0
  154. data/vendor/libgit2/src/cli/error.h +1 -1
  155. data/vendor/libgit2/src/cli/main.c +52 -24
  156. data/vendor/libgit2/src/cli/opt.c +29 -3
  157. data/vendor/libgit2/src/cli/opt.h +21 -3
  158. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  159. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  160. data/vendor/libgit2/src/cli/progress.c +51 -2
  161. data/vendor/libgit2/src/cli/progress.h +12 -0
  162. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  163. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  164. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  165. data/vendor/libgit2/src/libgit2/CMakeLists.txt +26 -8
  166. data/vendor/libgit2/src/libgit2/apply.c +10 -13
  167. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  168. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  169. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  170. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  171. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  172. data/vendor/libgit2/src/libgit2/blame.c +130 -44
  173. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  174. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  175. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  176. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  177. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  178. data/vendor/libgit2/src/libgit2/cherrypick.c +1 -2
  179. data/vendor/libgit2/src/libgit2/clone.c +186 -166
  180. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  181. data/vendor/libgit2/src/libgit2/commit.c +92 -0
  182. data/vendor/libgit2/src/libgit2/commit_graph.c +67 -56
  183. data/vendor/libgit2/src/libgit2/commit_graph.h +1 -2
  184. data/vendor/libgit2/src/libgit2/config.c +389 -298
  185. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  186. data/vendor/libgit2/src/libgit2/config.h +9 -4
  187. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  188. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  189. data/vendor/libgit2/src/libgit2/config_file.c +99 -88
  190. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  191. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  192. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  193. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  194. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  195. data/vendor/libgit2/src/libgit2/describe.c +24 -24
  196. data/vendor/libgit2/src/libgit2/diff.c +1 -1
  197. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  198. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  199. data/vendor/libgit2/src/libgit2/diff_generate.c +3 -3
  200. data/vendor/libgit2/src/libgit2/diff_parse.c +2 -2
  201. data/vendor/libgit2/src/libgit2/diff_print.c +65 -9
  202. data/vendor/libgit2/src/libgit2/diff_tform.c +36 -8
  203. data/vendor/libgit2/src/libgit2/email.c +1 -0
  204. data/vendor/libgit2/src/libgit2/fetch.c +5 -3
  205. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  206. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  207. data/vendor/libgit2/src/libgit2/grafts.c +18 -20
  208. data/vendor/libgit2/src/libgit2/grafts.h +0 -1
  209. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  210. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  211. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  212. data/vendor/libgit2/src/libgit2/index.c +68 -90
  213. data/vendor/libgit2/src/libgit2/index.h +2 -2
  214. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  215. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  216. data/vendor/libgit2/src/libgit2/indexer.c +34 -38
  217. data/vendor/libgit2/src/libgit2/iterator.c +14 -8
  218. data/vendor/libgit2/src/libgit2/libgit2.c +153 -368
  219. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  220. data/vendor/libgit2/src/libgit2/merge.c +42 -37
  221. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  222. data/vendor/libgit2/src/libgit2/midx.c +28 -15
  223. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  224. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  225. data/vendor/libgit2/src/libgit2/object.c +6 -5
  226. data/vendor/libgit2/src/libgit2/odb.c +5 -4
  227. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  228. data/vendor/libgit2/src/libgit2/odb_pack.c +13 -5
  229. data/vendor/libgit2/src/libgit2/oid.c +32 -5
  230. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  231. data/vendor/libgit2/src/libgit2/pack-objects.c +58 -31
  232. data/vendor/libgit2/src/libgit2/pack-objects.h +12 -4
  233. data/vendor/libgit2/src/libgit2/pack.c +30 -24
  234. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  235. data/vendor/libgit2/src/libgit2/patch_parse.c +2 -2
  236. data/vendor/libgit2/src/libgit2/path.c +1 -1
  237. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  238. data/vendor/libgit2/src/libgit2/push.c +79 -28
  239. data/vendor/libgit2/src/libgit2/push.h +1 -0
  240. data/vendor/libgit2/src/libgit2/refdb_fs.c +128 -61
  241. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  242. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  243. data/vendor/libgit2/src/libgit2/refs.c +26 -7
  244. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  245. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  246. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  247. data/vendor/libgit2/src/libgit2/remote.c +121 -61
  248. data/vendor/libgit2/src/libgit2/repository.c +231 -51
  249. data/vendor/libgit2/src/libgit2/repository.h +10 -6
  250. data/vendor/libgit2/src/libgit2/revert.c +1 -2
  251. data/vendor/libgit2/src/libgit2/revparse.c +2 -2
  252. data/vendor/libgit2/src/libgit2/revwalk.c +13 -10
  253. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  254. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  255. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  256. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  257. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  258. data/vendor/libgit2/src/libgit2/status.c +1 -1
  259. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -60
  260. data/vendor/libgit2/src/libgit2/streams/openssl.c +32 -7
  261. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  262. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  263. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  264. data/vendor/libgit2/src/libgit2/streams/stransport.c +39 -7
  265. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  266. data/vendor/libgit2/src/libgit2/submodule.h +6 -7
  267. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  268. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  269. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  270. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  271. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  272. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  273. data/vendor/libgit2/src/libgit2/transports/http.c +1 -2
  274. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  275. data/vendor/libgit2/src/libgit2/transports/httpclient.c +112 -72
  276. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  277. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  278. data/vendor/libgit2/src/libgit2/transports/local.c +8 -7
  279. data/vendor/libgit2/src/libgit2/transports/smart.c +20 -8
  280. data/vendor/libgit2/src/libgit2/transports/smart.h +4 -2
  281. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +2 -2
  282. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +55 -10
  283. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  284. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  285. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  286. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  287. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  288. data/vendor/libgit2/src/libgit2/transports/winhttp.c +35 -7
  289. data/vendor/libgit2/src/libgit2/tree.c +34 -26
  290. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  291. data/vendor/libgit2/src/libgit2/worktree.c +14 -17
  292. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  293. data/vendor/libgit2/src/util/alloc.c +4 -1
  294. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  295. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  296. data/vendor/libgit2/src/util/allocators/stdalloc.c +0 -10
  297. data/vendor/libgit2/src/util/array.h +18 -17
  298. data/vendor/libgit2/src/util/cc-compat.h +2 -0
  299. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  300. data/vendor/libgit2/src/util/date.c +22 -14
  301. data/vendor/libgit2/src/util/date.h +12 -0
  302. data/vendor/libgit2/src/util/errors.c +401 -0
  303. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  304. data/vendor/libgit2/src/util/fs_path.c +15 -4
  305. data/vendor/libgit2/src/util/fs_path.h +23 -0
  306. data/vendor/libgit2/src/util/futils.c +6 -5
  307. data/vendor/libgit2/src/util/futils.h +13 -4
  308. data/vendor/libgit2/src/util/git2_features.h.in +12 -1
  309. data/vendor/libgit2/src/util/git2_util.h +6 -0
  310. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  311. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  312. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  313. data/vendor/libgit2/src/util/hashmap.h +424 -0
  314. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  315. data/vendor/libgit2/src/util/integer.h +3 -1
  316. data/vendor/libgit2/src/util/net.c +13 -7
  317. data/vendor/libgit2/src/util/net.h +2 -0
  318. data/vendor/libgit2/src/util/pool.c +1 -1
  319. data/vendor/libgit2/src/util/pool.h +5 -0
  320. data/vendor/libgit2/src/util/pqueue.h +1 -1
  321. data/vendor/libgit2/src/util/process.h +222 -0
  322. data/vendor/libgit2/src/util/rand.c +1 -7
  323. data/vendor/libgit2/src/util/regexp.c +1 -1
  324. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  325. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  326. data/vendor/libgit2/src/util/str.c +2 -2
  327. data/vendor/libgit2/src/util/strlist.c +108 -0
  328. data/vendor/libgit2/src/util/strlist.h +36 -0
  329. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  330. data/vendor/libgit2/src/util/unix/process.c +629 -0
  331. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  332. data/vendor/libgit2/src/util/util.c +2 -2
  333. data/vendor/libgit2/src/util/util.h +4 -38
  334. data/vendor/libgit2/src/util/vector.c +3 -3
  335. data/vendor/libgit2/src/util/vector.h +2 -2
  336. data/vendor/libgit2/src/util/win32/posix_w32.c +29 -6
  337. data/vendor/libgit2/src/util/win32/process.c +506 -0
  338. metadata +45 -28
  339. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  340. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  341. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  342. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  343. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  344. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  345. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  346. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  347. data/vendor/libgit2/src/libgit2/errors.c +0 -293
  348. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  349. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  350. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  351. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  352. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  353. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  354. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  355. data/vendor/libgit2/src/libgit2/threadstate.c +0 -97
  356. data/vendor/libgit2/src/libgit2/threadstate.h +0 -22
  357. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  358. data/vendor/libgit2/src/util/khash.h +0 -615
  359. data/vendor/libgit2/src/util/strmap.c +0 -100
  360. data/vendor/libgit2/src/util/strmap.h +0 -131
  361. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
@@ -7,15 +7,15 @@
7
7
  #ifndef INCLUDE_util_h__
8
8
  #define INCLUDE_util_h__
9
9
 
10
- #ifndef GIT_WIN32
11
- # include <ctype.h>
12
- #endif
13
-
14
10
  #include "str.h"
15
11
  #include "git2_util.h"
16
12
  #include "strnlen.h"
17
13
  #include "thread.h"
18
14
 
15
+ #ifndef GIT_WIN32
16
+ # include <ctype.h>
17
+ #endif
18
+
19
19
  #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
20
20
  #define bitsizeof(x) (CHAR_BIT * sizeof(x))
21
21
  #define MSB(x, bits) ((x) & (~UINT64_C(0) << (bitsizeof(x) - (bits))))
@@ -83,15 +83,6 @@ extern char *git__strsep(char **end, const char *sep);
83
83
  extern void git__strntolower(char *str, size_t len);
84
84
  extern void git__strtolower(char *str);
85
85
 
86
- #ifdef GIT_WIN32
87
- GIT_INLINE(int) git__tolower(int c)
88
- {
89
- return (c >= 'A' && c <= 'Z') ? (c + 32) : c;
90
- }
91
- #else
92
- # define git__tolower(a) tolower(a)
93
- #endif
94
-
95
86
  extern size_t git__linenlen(const char *buffer, size_t buffer_len);
96
87
 
97
88
  GIT_INLINE(const char *) git__next_line(const char *s)
@@ -249,26 +240,6 @@ GIT_INLINE(size_t) git__size_t_powerof2(size_t v)
249
240
  return git__size_t_bitmask(v) + 1;
250
241
  }
251
242
 
252
- GIT_INLINE(bool) git__isupper(int c)
253
- {
254
- return (c >= 'A' && c <= 'Z');
255
- }
256
-
257
- GIT_INLINE(bool) git__isalpha(int c)
258
- {
259
- return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
260
- }
261
-
262
- GIT_INLINE(bool) git__isdigit(int c)
263
- {
264
- return (c >= '0' && c <= '9');
265
- }
266
-
267
- GIT_INLINE(bool) git__isspace(int c)
268
- {
269
- return (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '\r' || c == '\v');
270
- }
271
-
272
243
  GIT_INLINE(bool) git__isspace_nonlf(int c)
273
244
  {
274
245
  return (c == ' ' || c == '\t' || c == '\f' || c == '\r' || c == '\v');
@@ -279,11 +250,6 @@ GIT_INLINE(bool) git__iswildcard(int c)
279
250
  return (c == '*' || c == '?' || c == '[');
280
251
  }
281
252
 
282
- GIT_INLINE(bool) git__isxdigit(int c)
283
- {
284
- return ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
285
- }
286
-
287
253
  /*
288
254
  * Parse a string value as a boolean, just like Core Git does.
289
255
  *
@@ -76,7 +76,7 @@ int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp)
76
76
  return 0;
77
77
  }
78
78
 
79
- void git_vector_free(git_vector *v)
79
+ void git_vector_dispose(git_vector *v)
80
80
  {
81
81
  if (!v)
82
82
  return;
@@ -88,7 +88,7 @@ void git_vector_free(git_vector *v)
88
88
  v->_alloc_size = 0;
89
89
  }
90
90
 
91
- void git_vector_free_deep(git_vector *v)
91
+ void git_vector_dispose_deep(git_vector *v)
92
92
  {
93
93
  size_t i;
94
94
 
@@ -100,7 +100,7 @@ void git_vector_free_deep(git_vector *v)
100
100
  v->contents[i] = NULL;
101
101
  }
102
102
 
103
- git_vector_free(v);
103
+ git_vector_dispose(v);
104
104
  }
105
105
 
106
106
  int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp)
@@ -28,8 +28,8 @@ typedef struct git_vector {
28
28
 
29
29
  GIT_WARN_UNUSED_RESULT int git_vector_init(
30
30
  git_vector *v, size_t initial_size, git_vector_cmp cmp);
31
- void git_vector_free(git_vector *v);
32
- void git_vector_free_deep(git_vector *v); /* free each entry and self */
31
+ void git_vector_dispose(git_vector *v);
32
+ void git_vector_dispose_deep(git_vector *v); /* free each entry and self */
33
33
  void git_vector_clear(git_vector *v);
34
34
  GIT_WARN_UNUSED_RESULT int git_vector_dup(
35
35
  git_vector *v, const git_vector *src, git_vector_cmp cmp);
@@ -770,6 +770,7 @@ int p_rmdir(const char *path)
770
770
  * handle to the directory." This sounds like what everybody else calls
771
771
  * EBUSY. Let's convert appropriate error codes.
772
772
  */
773
+ case ERROR_ACCESS_DENIED:
773
774
  case ERROR_SHARING_VIOLATION:
774
775
  errno = EBUSY;
775
776
  break;
@@ -787,13 +788,19 @@ int p_rmdir(const char *path)
787
788
  char *p_realpath(const char *orig_path, char *buffer)
788
789
  {
789
790
  git_win32_path orig_path_w, buffer_w;
791
+ DWORD long_len;
790
792
 
791
793
  if (git_win32_path_from_utf8(orig_path_w, orig_path) < 0)
792
794
  return NULL;
793
795
 
794
- /* Note that if the path provided is a relative path, then the current directory
796
+ /*
797
+ * POSIX realpath performs two functions: first, it turns relative
798
+ * paths into absolute paths. For this, we need GetFullPathName.
799
+ *
800
+ * Note that if the path provided is a relative path, then the current directory
795
801
  * is used to resolve the path -- which is a concurrency issue because the current
796
- * directory is a process-wide variable. */
802
+ * directory is a process-wide variable.
803
+ */
797
804
  if (!GetFullPathNameW(orig_path_w, GIT_WIN_PATH_UTF16, buffer_w, NULL)) {
798
805
  if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
799
806
  errno = ENAMETOOLONG;
@@ -803,9 +810,26 @@ char *p_realpath(const char *orig_path, char *buffer)
803
810
  return NULL;
804
811
  }
805
812
 
806
- /* The path must exist. */
807
- if (GetFileAttributesW(buffer_w) == INVALID_FILE_ATTRIBUTES) {
808
- errno = ENOENT;
813
+ /*
814
+ * Then, the path is canonicalized. eg, on macOS,
815
+ * "/TMP" -> "/private/tmp". For this, we need GetLongPathName.
816
+ */
817
+ if ((long_len = GetLongPathNameW(buffer_w, buffer_w, GIT_WIN_PATH_UTF16)) == 0) {
818
+ DWORD error = GetLastError();
819
+
820
+ if (error == ERROR_FILE_NOT_FOUND ||
821
+ error == ERROR_PATH_NOT_FOUND)
822
+ errno = ENOENT;
823
+ else if (error == ERROR_ACCESS_DENIED)
824
+ errno = EPERM;
825
+ else
826
+ errno = EINVAL;
827
+
828
+ return NULL;
829
+ }
830
+
831
+ if (long_len > GIT_WIN_PATH_UTF16) {
832
+ errno = ENAMETOOLONG;
809
833
  return NULL;
810
834
  }
811
835
 
@@ -821,7 +845,6 @@ char *p_realpath(const char *orig_path, char *buffer)
821
845
  return NULL;
822
846
 
823
847
  git_fs_path_mkposix(buffer);
824
-
825
848
  return buffer;
826
849
  }
827
850
 
@@ -0,0 +1,506 @@
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 <git2.h>
10
+
11
+ #include "git2_util.h"
12
+ #include "process.h"
13
+ #include "strlist.h"
14
+
15
+ #ifndef DWORD_MAX
16
+ # define DWORD_MAX INT32_MAX
17
+ #endif
18
+
19
+ #define ENV_MAX 32767
20
+
21
+ struct git_process {
22
+ wchar_t *appname;
23
+ wchar_t *cmdline;
24
+ wchar_t *env;
25
+
26
+ wchar_t *cwd;
27
+
28
+ unsigned int capture_in : 1,
29
+ capture_out : 1,
30
+ capture_err : 1;
31
+
32
+ PROCESS_INFORMATION process_info;
33
+
34
+ HANDLE child_in;
35
+ HANDLE child_out;
36
+ HANDLE child_err;
37
+
38
+ git_process_result_status status;
39
+ };
40
+
41
+ /*
42
+ * Windows processes have a single command-line that is split by the
43
+ * invoked application into arguments (instead of an array of
44
+ * command-line arguments). This command-line is split by space or
45
+ * tab delimiters, unless that whitespace is within a double quote.
46
+ * Literal double-quotes themselves can be escaped by a backslash,
47
+ * but only when not within double quotes. Literal backslashes can
48
+ * be escaped by a backslash.
49
+ *
50
+ * Effectively, this means that instead of thinking about quoting
51
+ * individual strings, think about double quotes as an escaping
52
+ * mechanism for whitespace.
53
+ *
54
+ * In other words (using ` as a string boundary):
55
+ * [ `foo`, `bar` ] => `foo bar`
56
+ * [ `foo bar` ] => `foo" "bar`
57
+ * [ `foo bar`, `foo bar` ] => `foo" "bar foo" "bar`
58
+ * [ `foo "bar" foo` ] => `foo" "\"bar\"" "foo`
59
+ */
60
+ int git_process__cmdline(
61
+ git_str *out,
62
+ const char **in,
63
+ size_t in_len)
64
+ {
65
+ bool quoted = false;
66
+ const char *c;
67
+ size_t i;
68
+
69
+ for (i = 0; i < in_len; i++) {
70
+ /* Arguments are delimited by an unquoted space */
71
+ if (i)
72
+ git_str_putc(out, ' ');
73
+
74
+ for (c = in[i]; *c; c++) {
75
+ /* Start or stop quoting spaces within an argument */
76
+ if ((*c == ' ' || *c == '\t') && !quoted) {
77
+ git_str_putc(out, '"');
78
+ quoted = true;
79
+ } else if (*c != ' ' && *c != '\t' && quoted) {
80
+ git_str_putc(out, '"');
81
+ quoted = false;
82
+ }
83
+
84
+ /* Escape double-quotes and backslashes */
85
+ if (*c == '"' || *c == '\\')
86
+ git_str_putc(out, '\\');
87
+
88
+ git_str_putc(out, *c);
89
+ }
90
+ }
91
+
92
+ return git_str_oom(out) ? -1 : 0;
93
+ }
94
+
95
+ GIT_INLINE(bool) is_delete_env(const char *env)
96
+ {
97
+ char *c = strchr(env, '=');
98
+
99
+ if (c == NULL)
100
+ return false;
101
+
102
+ return *(c+1) == '\0';
103
+ }
104
+
105
+ static int merge_env(wchar_t **out, const char **in, size_t in_len, bool exclude_env)
106
+ {
107
+ git_str merged = GIT_STR_INIT;
108
+ wchar_t *in16 = NULL, *env = NULL, *e;
109
+ char *e8 = NULL;
110
+ size_t e_len;
111
+ int ret = 0;
112
+ size_t i;
113
+
114
+ *out = NULL;
115
+
116
+ in16 = git__malloc(ENV_MAX * sizeof(wchar_t));
117
+ GIT_ERROR_CHECK_ALLOC(in16);
118
+
119
+ e8 = git__malloc(ENV_MAX);
120
+ GIT_ERROR_CHECK_ALLOC(e8);
121
+
122
+ for (i = 0; in && i < in_len; i++) {
123
+ if (is_delete_env(in[i]))
124
+ continue;
125
+
126
+ if ((ret = git_utf8_to_16(in16, ENV_MAX, in[i])) < 0)
127
+ goto done;
128
+
129
+ git_str_put(&merged, (const char *)in16, ret * 2);
130
+ git_str_put(&merged, "\0\0", 2);
131
+ }
132
+
133
+ if (!exclude_env) {
134
+ env = GetEnvironmentStringsW();
135
+
136
+ for (e = env; *e; e += (e_len + 1)) {
137
+ e_len = wcslen(e);
138
+
139
+ if ((ret = git_utf8_from_16(e8, ENV_MAX, e)) < 0)
140
+ goto done;
141
+
142
+ if (git_strlist_contains_key(in, in_len, e8, '='))
143
+ continue;
144
+
145
+ git_str_put(&merged, (const char *)e, e_len * 2);
146
+ git_str_put(&merged, "\0\0", 2);
147
+ }
148
+ }
149
+
150
+ git_str_put(&merged, "\0\0", 2);
151
+
152
+ *out = (wchar_t *)git_str_detach(&merged);
153
+
154
+ done:
155
+ if (env)
156
+ FreeEnvironmentStringsW(env);
157
+
158
+ git_str_dispose(&merged);
159
+ git__free(e8);
160
+ git__free(in16);
161
+
162
+ return ret < 0 ? -1 : 0;
163
+ }
164
+
165
+ static int process_new(
166
+ git_process **out,
167
+ const char *appname,
168
+ const char *cmdline,
169
+ const char **env,
170
+ size_t env_len,
171
+ git_process_options *opts)
172
+ {
173
+ git_process *process;
174
+ int error = 0;
175
+
176
+ *out = NULL;
177
+
178
+ process = git__calloc(1, sizeof(git_process));
179
+ GIT_ERROR_CHECK_ALLOC(process);
180
+
181
+ if (appname &&
182
+ git_utf8_to_16_alloc(&process->appname, appname) < 0) {
183
+ error = -1;
184
+ goto done;
185
+ }
186
+
187
+ if (git_utf8_to_16_alloc(&process->cmdline, cmdline) < 0) {
188
+ error = -1;
189
+ goto done;
190
+ }
191
+
192
+ if (opts && opts->cwd &&
193
+ git_utf8_to_16_alloc(&process->cwd, opts->cwd) < 0) {
194
+ error = -1;
195
+ goto done;
196
+ }
197
+
198
+ if (env && (error = merge_env(&process->env, env, env_len, opts && opts->exclude_env) < 0))
199
+ goto done;
200
+
201
+ if (opts) {
202
+ process->capture_in = opts->capture_in;
203
+ process->capture_out = opts->capture_out;
204
+ process->capture_err = opts->capture_err;
205
+ }
206
+
207
+ done:
208
+ if (error)
209
+ git_process_free(process);
210
+ else
211
+ *out = process;
212
+
213
+ return error;
214
+ }
215
+
216
+ int git_process_new_from_cmdline(
217
+ git_process **out,
218
+ const char *cmdline,
219
+ const char **env,
220
+ size_t env_len,
221
+ git_process_options *opts)
222
+ {
223
+ GIT_ASSERT_ARG(out && cmdline);
224
+
225
+ return process_new(out, NULL, cmdline, env, env_len, opts);
226
+ }
227
+
228
+ int git_process_new(
229
+ git_process **out,
230
+ const char **args,
231
+ size_t args_len,
232
+ const char **env,
233
+ size_t env_len,
234
+ git_process_options *opts)
235
+ {
236
+ git_str cmdline = GIT_STR_INIT;
237
+ int error;
238
+
239
+ GIT_ASSERT_ARG(out && args && args_len > 0);
240
+
241
+ if ((error = git_process__cmdline(&cmdline, args, args_len)) < 0)
242
+ goto done;
243
+
244
+ error = process_new(out, args[0], cmdline.ptr, env, env_len, opts);
245
+
246
+ done:
247
+ git_str_dispose(&cmdline);
248
+ return error;
249
+ }
250
+
251
+ #define CLOSE_HANDLE(h) do { if ((h) != NULL) CloseHandle(h); } while(0)
252
+
253
+ int git_process_start(git_process *process)
254
+ {
255
+ STARTUPINFOW startup_info;
256
+ SECURITY_ATTRIBUTES security_attrs;
257
+ DWORD flags = CREATE_UNICODE_ENVIRONMENT;
258
+ HANDLE in[2] = { NULL, NULL },
259
+ out[2] = { NULL, NULL },
260
+ err[2] = { NULL, NULL };
261
+
262
+ memset(&security_attrs, 0, sizeof(SECURITY_ATTRIBUTES));
263
+ security_attrs.bInheritHandle = TRUE;
264
+
265
+ memset(&startup_info, 0, sizeof(STARTUPINFOW));
266
+ startup_info.cb = sizeof(STARTUPINFOW);
267
+ startup_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
268
+ startup_info.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
269
+ startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);
270
+
271
+ if (process->capture_in) {
272
+ if (!CreatePipe(&in[0], &in[1], &security_attrs, 0) ||
273
+ !SetHandleInformation(in[1], HANDLE_FLAG_INHERIT, 0)) {
274
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
275
+ goto on_error;
276
+ }
277
+
278
+ startup_info.hStdInput = in[0];
279
+ startup_info.dwFlags |= STARTF_USESTDHANDLES;
280
+ }
281
+
282
+ if (process->capture_out) {
283
+ if (!CreatePipe(&out[0], &out[1], &security_attrs, 0) ||
284
+ !SetHandleInformation(out[0], HANDLE_FLAG_INHERIT, 0)) {
285
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
286
+ goto on_error;
287
+ }
288
+
289
+ startup_info.hStdOutput = out[1];
290
+ startup_info.dwFlags |= STARTF_USESTDHANDLES;
291
+ }
292
+
293
+ if (process->capture_err) {
294
+ if (!CreatePipe(&err[0], &err[1], &security_attrs, 0) ||
295
+ !SetHandleInformation(err[0], HANDLE_FLAG_INHERIT, 0)) {
296
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
297
+ goto on_error;
298
+ }
299
+
300
+ startup_info.hStdError = err[1];
301
+ startup_info.dwFlags |= STARTF_USESTDHANDLES;
302
+ }
303
+
304
+ memset(&process->process_info, 0, sizeof(PROCESS_INFORMATION));
305
+
306
+ if (!CreateProcessW(process->appname, process->cmdline,
307
+ NULL, NULL, TRUE, flags, process->env,
308
+ process->cwd,
309
+ &startup_info,
310
+ &process->process_info)) {
311
+ git_error_set(GIT_ERROR_OS, "could not create process");
312
+ goto on_error;
313
+ }
314
+
315
+ CLOSE_HANDLE(in[0]); process->child_in = in[1];
316
+ CLOSE_HANDLE(out[1]); process->child_out = out[0];
317
+ CLOSE_HANDLE(err[1]); process->child_err = err[0];
318
+
319
+ return 0;
320
+
321
+ on_error:
322
+ CLOSE_HANDLE(in[0]); CLOSE_HANDLE(in[1]);
323
+ CLOSE_HANDLE(out[0]); CLOSE_HANDLE(out[1]);
324
+ CLOSE_HANDLE(err[0]); CLOSE_HANDLE(err[1]);
325
+ return -1;
326
+ }
327
+
328
+ int git_process_id(p_pid_t *out, git_process *process)
329
+ {
330
+ GIT_ASSERT(out && process);
331
+
332
+ if (!process->process_info.dwProcessId) {
333
+ git_error_set(GIT_ERROR_INVALID, "process not running");
334
+ return -1;
335
+ }
336
+
337
+ *out = process->process_info.dwProcessId;
338
+ return 0;
339
+ }
340
+
341
+ ssize_t git_process_read(git_process *process, void *buf, size_t count)
342
+ {
343
+ DWORD ret;
344
+
345
+ if (count > DWORD_MAX)
346
+ count = DWORD_MAX;
347
+ if (count > SSIZE_MAX)
348
+ count = SSIZE_MAX;
349
+
350
+ if (!ReadFile(process->child_out, buf, (DWORD)count, &ret, NULL)) {
351
+ if (GetLastError() == ERROR_BROKEN_PIPE)
352
+ return 0;
353
+
354
+ git_error_set(GIT_ERROR_OS, "could not read");
355
+ return -1;
356
+ }
357
+
358
+ return ret;
359
+ }
360
+
361
+ ssize_t git_process_write(git_process *process, const void *buf, size_t count)
362
+ {
363
+ DWORD ret;
364
+
365
+ if (count > DWORD_MAX)
366
+ count = DWORD_MAX;
367
+ if (count > SSIZE_MAX)
368
+ count = SSIZE_MAX;
369
+
370
+ if (!WriteFile(process->child_in, buf, (DWORD)count, &ret, NULL)) {
371
+ git_error_set(GIT_ERROR_OS, "could not write");
372
+ return -1;
373
+ }
374
+
375
+ return ret;
376
+ }
377
+
378
+ int git_process_close_in(git_process *process)
379
+ {
380
+ if (!process->capture_in) {
381
+ git_error_set(GIT_ERROR_INVALID, "input is not open");
382
+ return -1;
383
+ }
384
+
385
+ if (process->child_in) {
386
+ CloseHandle(process->child_in);
387
+ process->child_in = NULL;
388
+ }
389
+
390
+ return 0;
391
+ }
392
+
393
+ int git_process_close_out(git_process *process)
394
+ {
395
+ if (!process->capture_out) {
396
+ git_error_set(GIT_ERROR_INVALID, "output is not open");
397
+ return -1;
398
+ }
399
+
400
+ if (process->child_out) {
401
+ CloseHandle(process->child_out);
402
+ process->child_out = NULL;
403
+ }
404
+
405
+ return 0;
406
+ }
407
+
408
+ int git_process_close_err(git_process *process)
409
+ {
410
+ if (!process->capture_err) {
411
+ git_error_set(GIT_ERROR_INVALID, "error is not open");
412
+ return -1;
413
+ }
414
+
415
+ if (process->child_err) {
416
+ CloseHandle(process->child_err);
417
+ process->child_err = NULL;
418
+ }
419
+
420
+ return 0;
421
+ }
422
+
423
+ int git_process_close(git_process *process)
424
+ {
425
+ if (process->child_in) {
426
+ CloseHandle(process->child_in);
427
+ process->child_in = NULL;
428
+ }
429
+
430
+ if (process->child_out) {
431
+ CloseHandle(process->child_out);
432
+ process->child_out = NULL;
433
+ }
434
+
435
+ if (process->child_err) {
436
+ CloseHandle(process->child_err);
437
+ process->child_err = NULL;
438
+ }
439
+
440
+ CloseHandle(process->process_info.hProcess);
441
+ process->process_info.hProcess = NULL;
442
+
443
+ CloseHandle(process->process_info.hThread);
444
+ process->process_info.hThread = NULL;
445
+
446
+ return 0;
447
+ }
448
+
449
+ int git_process_wait(git_process_result *result, git_process *process)
450
+ {
451
+ DWORD exitcode;
452
+
453
+ if (result)
454
+ memset(result, 0, sizeof(git_process_result));
455
+
456
+ if (!process->process_info.dwProcessId) {
457
+ git_error_set(GIT_ERROR_INVALID, "process is stopped");
458
+ return -1;
459
+ }
460
+
461
+ if (WaitForSingleObject(process->process_info.hProcess, INFINITE) == WAIT_FAILED) {
462
+ git_error_set(GIT_ERROR_OS, "could not wait for process");
463
+ return -1;
464
+ }
465
+
466
+ if (!GetExitCodeProcess(process->process_info.hProcess, &exitcode)) {
467
+ git_error_set(GIT_ERROR_OS, "could not get process exit code");
468
+ return -1;
469
+ }
470
+
471
+ result->status = GIT_PROCESS_STATUS_NORMAL;
472
+ result->exitcode = exitcode;
473
+
474
+ memset(&process->process_info, 0, sizeof(PROCESS_INFORMATION));
475
+ return 0;
476
+ }
477
+
478
+ int git_process_result_msg(git_str *out, git_process_result *result)
479
+ {
480
+ if (result->status == GIT_PROCESS_STATUS_NONE) {
481
+ return git_str_puts(out, "process not started");
482
+ } else if (result->status == GIT_PROCESS_STATUS_NORMAL) {
483
+ return git_str_printf(out, "process exited with code %d",
484
+ result->exitcode);
485
+ } else if (result->signal) {
486
+ return git_str_printf(out, "process exited on signal %d",
487
+ result->signal);
488
+ }
489
+
490
+ return git_str_puts(out, "unknown error");
491
+ }
492
+
493
+ void git_process_free(git_process *process)
494
+ {
495
+ if (!process)
496
+ return;
497
+
498
+ if (process->process_info.hProcess)
499
+ git_process_close(process);
500
+
501
+ git__free(process->env);
502
+ git__free(process->cwd);
503
+ git__free(process->cmdline);
504
+ git__free(process->appname);
505
+ git__free(process);
506
+ }