rugged 1.6.3 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (443) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/rugged_allocator.c +0 -54
  3. data/lib/rugged/version.rb +1 -1
  4. data/vendor/libgit2/AUTHORS +1 -0
  5. data/vendor/libgit2/CMakeLists.txt +25 -17
  6. data/vendor/libgit2/COPYING +195 -1
  7. data/vendor/libgit2/cmake/CheckPrototypeDefinitionSafe.cmake +16 -0
  8. data/vendor/libgit2/cmake/{FindIconv.cmake → FindIntlIconv.cmake} +6 -0
  9. data/vendor/libgit2/cmake/FindLLHTTP.cmake +39 -0
  10. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +4 -4
  11. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +23 -8
  12. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +34 -6
  13. data/vendor/libgit2/cmake/SelectHashes.cmake +32 -11
  14. data/vendor/libgit2/cmake/SelectRegex.cmake +6 -1
  15. data/vendor/libgit2/cmake/SelectSSH.cmake +22 -17
  16. data/vendor/libgit2/cmake/SelectXdiff.cmake +9 -0
  17. data/vendor/libgit2/cmake/SelectZlib.cmake +4 -0
  18. data/vendor/libgit2/deps/llhttp/CMakeLists.txt +8 -0
  19. data/vendor/libgit2/deps/llhttp/LICENSE-MIT +22 -0
  20. data/vendor/libgit2/deps/llhttp/api.c +510 -0
  21. data/vendor/libgit2/deps/llhttp/http.c +170 -0
  22. data/vendor/libgit2/deps/llhttp/llhttp.c +10168 -0
  23. data/vendor/libgit2/deps/llhttp/llhttp.h +897 -0
  24. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +1 -1
  25. data/vendor/libgit2/deps/ntlmclient/crypt_builtin_md4.c +311 -0
  26. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +2 -1
  27. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +0 -20
  28. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +4 -4
  29. data/vendor/libgit2/deps/ntlmclient/ntlm.c +21 -21
  30. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +5 -4
  31. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +2 -1
  32. data/vendor/libgit2/deps/ntlmclient/utf8.h +1176 -721
  33. data/vendor/libgit2/deps/ntlmclient/util.h +11 -0
  34. data/vendor/libgit2/deps/pcre/CMakeLists.txt +1 -0
  35. data/vendor/libgit2/deps/pcre/LICENCE +5 -5
  36. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  37. data/vendor/libgit2/deps/pcre/pcre_compile.c +6 -3
  38. data/vendor/libgit2/deps/pcre/pcre_exec.c +2 -2
  39. data/vendor/libgit2/deps/xdiff/CMakeLists.txt +28 -0
  40. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/git-xdiff.h +4 -1
  41. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.c +19 -18
  42. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiffi.h +2 -4
  43. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.c +3 -3
  44. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xhistogram.c +7 -18
  45. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmacros.h +18 -1
  46. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xmerge.c +22 -20
  47. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xpatience.c +21 -30
  48. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.c +13 -30
  49. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.c +18 -1
  50. data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xutils.h +2 -1
  51. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -1
  52. data/vendor/libgit2/deps/zlib/LICENSE +22 -0
  53. data/vendor/libgit2/deps/zlib/adler32.c +5 -27
  54. data/vendor/libgit2/deps/zlib/crc32.c +94 -167
  55. data/vendor/libgit2/deps/zlib/deflate.c +358 -435
  56. data/vendor/libgit2/deps/zlib/deflate.h +41 -10
  57. data/vendor/libgit2/deps/zlib/gzguts.h +13 -18
  58. data/vendor/libgit2/deps/zlib/infback.c +17 -30
  59. data/vendor/libgit2/deps/zlib/inffast.c +1 -4
  60. data/vendor/libgit2/deps/zlib/inffast.h +1 -1
  61. data/vendor/libgit2/deps/zlib/inflate.c +36 -102
  62. data/vendor/libgit2/deps/zlib/inftrees.c +6 -11
  63. data/vendor/libgit2/deps/zlib/inftrees.h +6 -6
  64. data/vendor/libgit2/deps/zlib/trees.c +287 -352
  65. data/vendor/libgit2/deps/zlib/zconf.h +23 -14
  66. data/vendor/libgit2/deps/zlib/zlib.h +202 -202
  67. data/vendor/libgit2/deps/zlib/zutil.c +18 -44
  68. data/vendor/libgit2/deps/zlib/zutil.h +13 -33
  69. data/vendor/libgit2/include/git2/annotated_commit.h +12 -5
  70. data/vendor/libgit2/include/git2/apply.h +27 -6
  71. data/vendor/libgit2/include/git2/attr.h +17 -4
  72. data/vendor/libgit2/include/git2/blame.h +133 -28
  73. data/vendor/libgit2/include/git2/blob.h +71 -28
  74. data/vendor/libgit2/include/git2/branch.h +22 -15
  75. data/vendor/libgit2/include/git2/buffer.h +6 -4
  76. data/vendor/libgit2/include/git2/cert.h +2 -1
  77. data/vendor/libgit2/include/git2/checkout.h +83 -32
  78. data/vendor/libgit2/include/git2/cherrypick.h +10 -3
  79. data/vendor/libgit2/include/git2/clone.h +25 -9
  80. data/vendor/libgit2/include/git2/commit.h +132 -3
  81. data/vendor/libgit2/include/git2/common.h +138 -56
  82. data/vendor/libgit2/include/git2/config.h +93 -23
  83. data/vendor/libgit2/include/git2/credential.h +30 -2
  84. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  85. data/vendor/libgit2/include/git2/deprecated.h +133 -3
  86. data/vendor/libgit2/include/git2/describe.h +13 -1
  87. data/vendor/libgit2/include/git2/diff.h +77 -9
  88. data/vendor/libgit2/include/git2/email.h +9 -29
  89. data/vendor/libgit2/include/git2/errors.h +49 -74
  90. data/vendor/libgit2/include/git2/filter.h +14 -7
  91. data/vendor/libgit2/include/git2/global.h +8 -1
  92. data/vendor/libgit2/include/git2/graph.h +3 -2
  93. data/vendor/libgit2/include/git2/ignore.h +10 -0
  94. data/vendor/libgit2/include/git2/index.h +100 -6
  95. data/vendor/libgit2/include/git2/indexer.h +21 -4
  96. data/vendor/libgit2/include/git2/mailmap.h +7 -1
  97. data/vendor/libgit2/include/git2/merge.h +46 -1
  98. data/vendor/libgit2/include/git2/message.h +2 -2
  99. data/vendor/libgit2/include/git2/net.h +3 -1
  100. data/vendor/libgit2/include/git2/notes.h +9 -6
  101. data/vendor/libgit2/include/git2/object.h +9 -8
  102. data/vendor/libgit2/include/git2/odb.h +91 -49
  103. data/vendor/libgit2/include/git2/odb_backend.h +80 -52
  104. data/vendor/libgit2/include/git2/oid.h +24 -25
  105. data/vendor/libgit2/include/git2/oidarray.h +7 -1
  106. data/vendor/libgit2/include/git2/pack.h +13 -1
  107. data/vendor/libgit2/include/git2/patch.h +2 -3
  108. data/vendor/libgit2/include/git2/pathspec.h +9 -0
  109. data/vendor/libgit2/include/git2/proxy.h +10 -0
  110. data/vendor/libgit2/include/git2/rebase.h +9 -6
  111. data/vendor/libgit2/include/git2/refdb.h +2 -2
  112. data/vendor/libgit2/include/git2/reflog.h +3 -2
  113. data/vendor/libgit2/include/git2/refs.h +9 -6
  114. data/vendor/libgit2/include/git2/refspec.h +14 -4
  115. data/vendor/libgit2/include/git2/remote.h +112 -18
  116. data/vendor/libgit2/include/git2/repository.h +61 -15
  117. data/vendor/libgit2/include/git2/reset.h +16 -3
  118. data/vendor/libgit2/include/git2/revert.h +9 -4
  119. data/vendor/libgit2/include/git2/revparse.h +3 -3
  120. data/vendor/libgit2/include/git2/revwalk.h +3 -2
  121. data/vendor/libgit2/include/git2/signature.h +46 -1
  122. data/vendor/libgit2/include/git2/stash.h +17 -3
  123. data/vendor/libgit2/include/git2/status.h +10 -6
  124. data/vendor/libgit2/include/git2/stdint.h +87 -85
  125. data/vendor/libgit2/include/git2/strarray.h +2 -3
  126. data/vendor/libgit2/include/git2/submodule.h +20 -9
  127. data/vendor/libgit2/include/git2/sys/alloc.h +12 -34
  128. data/vendor/libgit2/include/git2/sys/commit.h +77 -3
  129. data/vendor/libgit2/include/git2/sys/commit_graph.h +109 -58
  130. data/vendor/libgit2/include/git2/sys/config.h +80 -4
  131. data/vendor/libgit2/include/git2/sys/credential.h +4 -3
  132. data/vendor/libgit2/include/git2/sys/diff.h +21 -1
  133. data/vendor/libgit2/include/git2/sys/email.h +7 -0
  134. data/vendor/libgit2/include/git2/sys/errors.h +76 -0
  135. data/vendor/libgit2/include/git2/sys/filter.h +66 -3
  136. data/vendor/libgit2/include/git2/sys/hashsig.h +11 -0
  137. data/vendor/libgit2/include/git2/sys/index.h +3 -2
  138. data/vendor/libgit2/include/git2/sys/mempack.h +32 -2
  139. data/vendor/libgit2/include/git2/sys/merge.h +55 -7
  140. data/vendor/libgit2/include/git2/sys/midx.h +47 -4
  141. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -3
  142. data/vendor/libgit2/include/git2/sys/openssl.h +8 -1
  143. data/vendor/libgit2/include/git2/sys/path.h +12 -1
  144. data/vendor/libgit2/include/git2/sys/refdb_backend.h +40 -36
  145. data/vendor/libgit2/include/git2/sys/refs.h +3 -2
  146. data/vendor/libgit2/include/git2/sys/remote.h +8 -1
  147. data/vendor/libgit2/include/git2/sys/repository.h +63 -3
  148. data/vendor/libgit2/include/git2/sys/stream.h +25 -2
  149. data/vendor/libgit2/include/git2/sys/transport.h +44 -5
  150. data/vendor/libgit2/include/git2/tag.h +3 -1
  151. data/vendor/libgit2/include/git2/trace.h +9 -3
  152. data/vendor/libgit2/include/git2/transaction.h +3 -2
  153. data/vendor/libgit2/include/git2/transport.h +11 -3
  154. data/vendor/libgit2/include/git2/tree.h +16 -5
  155. data/vendor/libgit2/include/git2/types.h +19 -3
  156. data/vendor/libgit2/include/git2/version.h +44 -8
  157. data/vendor/libgit2/include/git2/worktree.h +19 -7
  158. data/vendor/libgit2/src/CMakeLists.txt +40 -15
  159. data/vendor/libgit2/src/cli/CMakeLists.txt +2 -2
  160. data/vendor/libgit2/src/cli/cmd.c +1 -1
  161. data/vendor/libgit2/src/cli/cmd.h +4 -0
  162. data/vendor/libgit2/src/cli/cmd_blame.c +287 -0
  163. data/vendor/libgit2/src/cli/cmd_cat_file.c +6 -8
  164. data/vendor/libgit2/src/cli/cmd_clone.c +27 -13
  165. data/vendor/libgit2/src/cli/cmd_config.c +241 -0
  166. data/vendor/libgit2/src/cli/cmd_hash_object.c +6 -8
  167. data/vendor/libgit2/src/cli/cmd_help.c +6 -7
  168. data/vendor/libgit2/src/cli/cmd_index_pack.c +114 -0
  169. data/vendor/libgit2/src/cli/cmd_init.c +102 -0
  170. data/vendor/libgit2/src/cli/common.c +168 -0
  171. data/vendor/libgit2/src/cli/common.h +63 -0
  172. data/vendor/libgit2/src/cli/error.h +1 -1
  173. data/vendor/libgit2/src/cli/main.c +52 -24
  174. data/vendor/libgit2/src/cli/opt.c +29 -3
  175. data/vendor/libgit2/src/cli/opt.h +21 -3
  176. data/vendor/libgit2/src/cli/opt_usage.c +102 -33
  177. data/vendor/libgit2/src/cli/opt_usage.h +6 -1
  178. data/vendor/libgit2/src/cli/progress.c +60 -10
  179. data/vendor/libgit2/src/cli/progress.h +16 -4
  180. data/vendor/libgit2/src/cli/unix/sighandler.c +2 -1
  181. data/vendor/libgit2/src/cli/win32/precompiled.h +1 -1
  182. data/vendor/libgit2/src/cli/win32/sighandler.c +1 -1
  183. data/vendor/libgit2/src/libgit2/CMakeLists.txt +27 -27
  184. data/vendor/libgit2/src/libgit2/annotated_commit.c +2 -2
  185. data/vendor/libgit2/src/libgit2/annotated_commit.h +1 -1
  186. data/vendor/libgit2/src/libgit2/apply.c +14 -16
  187. data/vendor/libgit2/src/libgit2/attr.c +30 -13
  188. data/vendor/libgit2/src/libgit2/attr_file.c +7 -2
  189. data/vendor/libgit2/src/libgit2/attr_file.h +2 -0
  190. data/vendor/libgit2/src/libgit2/attrcache.c +69 -33
  191. data/vendor/libgit2/src/libgit2/attrcache.h +5 -9
  192. data/vendor/libgit2/src/libgit2/blame.c +152 -59
  193. data/vendor/libgit2/src/libgit2/blame.h +1 -0
  194. data/vendor/libgit2/src/libgit2/blame_git.c +0 -1
  195. data/vendor/libgit2/src/libgit2/branch.c +2 -2
  196. data/vendor/libgit2/src/libgit2/cache.c +22 -17
  197. data/vendor/libgit2/src/libgit2/cache.h +7 -9
  198. data/vendor/libgit2/src/libgit2/checkout.c +34 -24
  199. data/vendor/libgit2/src/libgit2/checkout.h +0 -2
  200. data/vendor/libgit2/src/libgit2/cherrypick.c +4 -5
  201. data/vendor/libgit2/src/libgit2/clone.c +186 -164
  202. data/vendor/libgit2/src/libgit2/clone.h +4 -1
  203. data/vendor/libgit2/src/libgit2/commit.c +123 -9
  204. data/vendor/libgit2/src/libgit2/commit_graph.c +166 -88
  205. data/vendor/libgit2/src/libgit2/commit_graph.h +21 -6
  206. data/vendor/libgit2/src/libgit2/commit_list.c +12 -5
  207. data/vendor/libgit2/src/libgit2/commit_list.h +1 -0
  208. data/vendor/libgit2/src/libgit2/config.c +394 -300
  209. data/vendor/libgit2/src/libgit2/config.cmake.in +3 -0
  210. data/vendor/libgit2/src/libgit2/config.h +9 -4
  211. data/vendor/libgit2/src/libgit2/config_backend.h +8 -10
  212. data/vendor/libgit2/src/libgit2/config_cache.c +4 -5
  213. data/vendor/libgit2/src/libgit2/config_file.c +113 -96
  214. data/vendor/libgit2/src/libgit2/config_list.c +285 -0
  215. data/vendor/libgit2/src/libgit2/config_list.h +32 -0
  216. data/vendor/libgit2/src/libgit2/config_mem.c +194 -40
  217. data/vendor/libgit2/src/libgit2/config_parse.c +10 -9
  218. data/vendor/libgit2/src/libgit2/config_snapshot.c +24 -31
  219. data/vendor/libgit2/src/libgit2/describe.c +34 -31
  220. data/vendor/libgit2/src/libgit2/diff.c +17 -8
  221. data/vendor/libgit2/src/libgit2/diff.h +6 -6
  222. data/vendor/libgit2/src/libgit2/diff_driver.c +12 -19
  223. data/vendor/libgit2/src/libgit2/diff_driver.h +2 -2
  224. data/vendor/libgit2/src/libgit2/diff_file.c +7 -7
  225. data/vendor/libgit2/src/libgit2/diff_generate.c +39 -18
  226. data/vendor/libgit2/src/libgit2/diff_parse.c +22 -6
  227. data/vendor/libgit2/src/libgit2/diff_print.c +88 -13
  228. data/vendor/libgit2/src/libgit2/diff_tform.c +40 -12
  229. data/vendor/libgit2/src/libgit2/diff_xdiff.h +1 -1
  230. data/vendor/libgit2/src/libgit2/email.c +5 -3
  231. data/vendor/libgit2/src/libgit2/fetch.c +39 -9
  232. data/vendor/libgit2/src/libgit2/fetch.h +0 -2
  233. data/vendor/libgit2/src/libgit2/fetchhead.c +11 -9
  234. data/vendor/libgit2/src/libgit2/filter.c +5 -5
  235. data/vendor/libgit2/src/libgit2/git2.rc +3 -3
  236. data/vendor/libgit2/src/libgit2/grafts.c +270 -0
  237. data/vendor/libgit2/src/libgit2/grafts.h +35 -0
  238. data/vendor/libgit2/src/libgit2/graph.c +1 -1
  239. data/vendor/libgit2/src/libgit2/hashmap_oid.h +30 -0
  240. data/vendor/libgit2/src/libgit2/ident.c +3 -3
  241. data/vendor/libgit2/src/libgit2/ignore.c +9 -5
  242. data/vendor/libgit2/src/libgit2/index.c +392 -208
  243. data/vendor/libgit2/src/libgit2/index.h +16 -3
  244. data/vendor/libgit2/src/libgit2/index_map.c +95 -0
  245. data/vendor/libgit2/src/libgit2/index_map.h +28 -0
  246. data/vendor/libgit2/src/libgit2/indexer.c +44 -41
  247. data/vendor/libgit2/src/libgit2/iterator.c +34 -13
  248. data/vendor/libgit2/src/libgit2/iterator.h +3 -0
  249. data/vendor/libgit2/src/libgit2/libgit2.c +155 -331
  250. data/vendor/libgit2/src/libgit2/mailmap.c +1 -1
  251. data/vendor/libgit2/src/libgit2/merge.c +56 -46
  252. data/vendor/libgit2/src/libgit2/merge_driver.c +2 -2
  253. data/vendor/libgit2/src/libgit2/merge_file.c +0 -2
  254. data/vendor/libgit2/src/libgit2/midx.c +86 -44
  255. data/vendor/libgit2/src/libgit2/midx.h +13 -3
  256. data/vendor/libgit2/src/libgit2/mwindow.c +38 -45
  257. data/vendor/libgit2/src/libgit2/mwindow.h +4 -0
  258. data/vendor/libgit2/src/libgit2/notes.c +9 -8
  259. data/vendor/libgit2/src/libgit2/object.c +42 -16
  260. data/vendor/libgit2/src/libgit2/object.h +6 -0
  261. data/vendor/libgit2/src/libgit2/odb.c +16 -9
  262. data/vendor/libgit2/src/libgit2/odb_mempack.c +49 -17
  263. data/vendor/libgit2/src/libgit2/odb_pack.c +28 -7
  264. data/vendor/libgit2/src/libgit2/oid.c +35 -2
  265. data/vendor/libgit2/src/libgit2/oid.h +11 -0
  266. data/vendor/libgit2/src/libgit2/oidarray.c +49 -3
  267. data/vendor/libgit2/src/libgit2/oidarray.h +5 -1
  268. data/vendor/libgit2/src/libgit2/pack-objects.c +77 -43
  269. data/vendor/libgit2/src/libgit2/pack-objects.h +17 -6
  270. data/vendor/libgit2/src/libgit2/pack.c +33 -27
  271. data/vendor/libgit2/src/libgit2/pack.h +15 -10
  272. data/vendor/libgit2/src/libgit2/parse.c +7 -4
  273. data/vendor/libgit2/src/libgit2/parse.h +1 -1
  274. data/vendor/libgit2/src/libgit2/patch.h +7 -1
  275. data/vendor/libgit2/src/libgit2/patch_generate.c +24 -5
  276. data/vendor/libgit2/src/libgit2/patch_parse.c +18 -10
  277. data/vendor/libgit2/src/libgit2/path.c +1 -1
  278. data/vendor/libgit2/src/libgit2/pathspec.c +1 -1
  279. data/vendor/libgit2/src/libgit2/push.c +81 -30
  280. data/vendor/libgit2/src/libgit2/push.h +1 -0
  281. data/vendor/libgit2/src/libgit2/reader.c +1 -1
  282. data/vendor/libgit2/src/libgit2/rebase.c +72 -84
  283. data/vendor/libgit2/src/libgit2/refdb_fs.c +146 -70
  284. data/vendor/libgit2/src/libgit2/reflog.c +1 -2
  285. data/vendor/libgit2/src/libgit2/reflog.h +2 -0
  286. data/vendor/libgit2/src/libgit2/refs.c +34 -8
  287. data/vendor/libgit2/src/libgit2/refs.h +6 -1
  288. data/vendor/libgit2/src/libgit2/refspec.c +28 -1
  289. data/vendor/libgit2/src/libgit2/refspec.h +8 -0
  290. data/vendor/libgit2/src/libgit2/remote.c +136 -67
  291. data/vendor/libgit2/src/libgit2/remote.h +1 -0
  292. data/vendor/libgit2/src/libgit2/repository.c +789 -330
  293. data/vendor/libgit2/src/libgit2/repository.h +22 -3
  294. data/vendor/libgit2/src/libgit2/reset.c +2 -2
  295. data/vendor/libgit2/src/libgit2/revert.c +9 -13
  296. data/vendor/libgit2/src/libgit2/revparse.c +6 -3
  297. data/vendor/libgit2/src/libgit2/revwalk.c +36 -11
  298. data/vendor/libgit2/src/libgit2/revwalk.h +3 -3
  299. data/vendor/libgit2/src/libgit2/settings.c +468 -0
  300. data/vendor/libgit2/src/libgit2/settings.h +6 -2
  301. data/vendor/libgit2/src/libgit2/signature.c +132 -15
  302. data/vendor/libgit2/src/libgit2/signature.h +0 -1
  303. data/vendor/libgit2/src/libgit2/stash.c +9 -8
  304. data/vendor/libgit2/src/libgit2/status.c +1 -1
  305. data/vendor/libgit2/src/libgit2/streams/mbedtls.c +54 -61
  306. data/vendor/libgit2/src/libgit2/streams/openssl.c +40 -23
  307. data/vendor/libgit2/src/libgit2/streams/openssl.h +2 -0
  308. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.c +4 -0
  309. data/vendor/libgit2/src/libgit2/streams/openssl_dynamic.h +3 -0
  310. data/vendor/libgit2/src/libgit2/streams/schannel.c +715 -0
  311. data/vendor/libgit2/src/libgit2/streams/schannel.h +28 -0
  312. data/vendor/libgit2/src/libgit2/streams/socket.c +237 -51
  313. data/vendor/libgit2/src/libgit2/streams/socket.h +3 -1
  314. data/vendor/libgit2/src/libgit2/streams/stransport.c +79 -19
  315. data/vendor/libgit2/src/libgit2/streams/tls.c +5 -0
  316. data/vendor/libgit2/src/libgit2/submodule.c +106 -63
  317. data/vendor/libgit2/src/libgit2/submodule.h +9 -10
  318. data/vendor/libgit2/src/libgit2/tag.c +1 -1
  319. data/vendor/libgit2/src/libgit2/trailer.c +6 -6
  320. data/vendor/libgit2/src/libgit2/transaction.c +26 -20
  321. data/vendor/libgit2/src/libgit2/transaction.h +4 -1
  322. data/vendor/libgit2/src/libgit2/transport.c +4 -1
  323. data/vendor/libgit2/src/libgit2/transports/auth.h +1 -2
  324. data/vendor/libgit2/src/libgit2/transports/{auth_negotiate.c → auth_gssapi.c} +32 -32
  325. data/vendor/libgit2/src/libgit2/transports/auth_negotiate.h +1 -1
  326. data/vendor/libgit2/src/libgit2/transports/auth_ntlm.h +1 -1
  327. data/vendor/libgit2/src/libgit2/transports/{auth_ntlm.c → auth_ntlmclient.c} +12 -12
  328. data/vendor/libgit2/src/libgit2/transports/auth_sspi.c +341 -0
  329. data/vendor/libgit2/src/libgit2/transports/credential.c +1 -1
  330. data/vendor/libgit2/src/libgit2/transports/git.c +7 -8
  331. data/vendor/libgit2/src/libgit2/transports/http.c +8 -4
  332. data/vendor/libgit2/src/libgit2/transports/http.h +0 -10
  333. data/vendor/libgit2/src/libgit2/transports/httpclient.c +117 -72
  334. data/vendor/libgit2/src/libgit2/transports/httpparser.c +128 -0
  335. data/vendor/libgit2/src/libgit2/transports/httpparser.h +99 -0
  336. data/vendor/libgit2/src/libgit2/transports/local.c +21 -11
  337. data/vendor/libgit2/src/libgit2/transports/smart.c +50 -32
  338. data/vendor/libgit2/src/libgit2/transports/smart.h +26 -9
  339. data/vendor/libgit2/src/libgit2/transports/smart_pkt.c +139 -18
  340. data/vendor/libgit2/src/libgit2/transports/smart_protocol.c +209 -57
  341. data/vendor/libgit2/src/libgit2/transports/ssh.c +41 -1103
  342. data/vendor/libgit2/src/libgit2/transports/ssh_exec.c +347 -0
  343. data/vendor/libgit2/src/libgit2/transports/ssh_exec.h +26 -0
  344. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.c +1126 -0
  345. data/vendor/libgit2/src/libgit2/transports/ssh_libssh2.h +28 -0
  346. data/vendor/libgit2/src/libgit2/transports/winhttp.c +48 -21
  347. data/vendor/libgit2/src/libgit2/tree-cache.c +26 -16
  348. data/vendor/libgit2/src/libgit2/tree-cache.h +5 -3
  349. data/vendor/libgit2/src/libgit2/tree.c +35 -27
  350. data/vendor/libgit2/src/libgit2/tree.h +3 -2
  351. data/vendor/libgit2/src/libgit2/worktree.c +39 -27
  352. data/vendor/libgit2/src/util/CMakeLists.txt +4 -6
  353. data/vendor/libgit2/src/util/alloc.c +69 -7
  354. data/vendor/libgit2/src/util/alloc.h +34 -9
  355. data/vendor/libgit2/src/util/allocators/debugalloc.c +73 -0
  356. data/vendor/libgit2/src/{cli/cli.h → util/allocators/debugalloc.h} +6 -9
  357. data/vendor/libgit2/src/util/allocators/failalloc.c +0 -60
  358. data/vendor/libgit2/src/util/allocators/failalloc.h +0 -6
  359. data/vendor/libgit2/src/util/allocators/stdalloc.c +2 -115
  360. data/vendor/libgit2/src/util/allocators/win32_leakcheck.c +0 -68
  361. data/vendor/libgit2/src/util/array.h +24 -18
  362. data/vendor/libgit2/src/util/cc-compat.h +4 -0
  363. data/vendor/libgit2/src/util/ctype_compat.h +70 -0
  364. data/vendor/libgit2/src/util/date.c +22 -14
  365. data/vendor/libgit2/src/util/date.h +12 -0
  366. data/vendor/libgit2/src/util/errors.c +401 -0
  367. data/vendor/libgit2/src/{libgit2 → util}/errors.h +21 -17
  368. data/vendor/libgit2/src/util/filebuf.c +6 -1
  369. data/vendor/libgit2/src/util/filebuf.h +19 -6
  370. data/vendor/libgit2/src/util/fs_path.c +16 -5
  371. data/vendor/libgit2/src/util/fs_path.h +23 -0
  372. data/vendor/libgit2/src/util/futils.c +14 -10
  373. data/vendor/libgit2/src/util/futils.h +13 -4
  374. data/vendor/libgit2/src/util/git2_features.h.in +21 -4
  375. data/vendor/libgit2/src/util/git2_util.h +6 -0
  376. data/vendor/libgit2/src/util/hash/openssl.c +152 -0
  377. data/vendor/libgit2/src/util/hash/openssl.h +17 -1
  378. data/vendor/libgit2/src/util/hash/sha.h +4 -1
  379. data/vendor/libgit2/src/util/hashmap.h +424 -0
  380. data/vendor/libgit2/src/util/hashmap_str.h +43 -0
  381. data/vendor/libgit2/src/util/integer.h +3 -1
  382. data/vendor/libgit2/src/util/net.c +318 -161
  383. data/vendor/libgit2/src/util/net.h +27 -0
  384. data/vendor/libgit2/src/util/pool.c +1 -1
  385. data/vendor/libgit2/src/util/pool.h +5 -0
  386. data/vendor/libgit2/src/util/posix.c +54 -0
  387. data/vendor/libgit2/src/util/posix.h +22 -0
  388. data/vendor/libgit2/src/util/pqueue.h +1 -1
  389. data/vendor/libgit2/src/util/process.h +222 -0
  390. data/vendor/libgit2/src/util/rand.c +6 -10
  391. data/vendor/libgit2/src/util/regexp.c +1 -1
  392. data/vendor/libgit2/src/util/sortedcache.c +14 -13
  393. data/vendor/libgit2/src/util/sortedcache.h +3 -3
  394. data/vendor/libgit2/src/util/staticstr.h +66 -0
  395. data/vendor/libgit2/src/util/str.c +2 -2
  396. data/vendor/libgit2/src/util/strlist.c +108 -0
  397. data/vendor/libgit2/src/util/strlist.h +36 -0
  398. data/vendor/libgit2/src/util/unix/posix.h +0 -2
  399. data/vendor/libgit2/src/util/unix/process.c +629 -0
  400. data/vendor/libgit2/src/util/unix/realpath.c +23 -5
  401. data/vendor/libgit2/src/util/util.c +17 -12
  402. data/vendor/libgit2/src/util/util.h +28 -54
  403. data/vendor/libgit2/src/util/vector.c +3 -3
  404. data/vendor/libgit2/src/util/vector.h +2 -2
  405. data/vendor/libgit2/src/util/win32/error.c +1 -1
  406. data/vendor/libgit2/src/util/win32/path_w32.c +8 -8
  407. data/vendor/libgit2/src/util/win32/posix_w32.c +30 -7
  408. data/vendor/libgit2/src/util/win32/process.c +506 -0
  409. data/vendor/libgit2/src/util/win32/utf-conv.c +73 -75
  410. data/vendor/libgit2/src/util/win32/utf-conv.h +81 -14
  411. data/vendor/libgit2/src/util/win32/w32_util.c +1 -1
  412. metadata +72 -49
  413. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +0 -17
  414. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +0 -6
  415. data/vendor/libgit2/deps/http-parser/COPYING +0 -23
  416. data/vendor/libgit2/deps/http-parser/http_parser.c +0 -2182
  417. data/vendor/libgit2/deps/http-parser/http_parser.h +0 -305
  418. data/vendor/libgit2/deps/zlib/COPYING +0 -27
  419. data/vendor/libgit2/include/git2/sys/reflog.h +0 -21
  420. data/vendor/libgit2/src/libgit2/config_entries.c +0 -237
  421. data/vendor/libgit2/src/libgit2/config_entries.h +0 -24
  422. data/vendor/libgit2/src/libgit2/errors.c +0 -238
  423. data/vendor/libgit2/src/libgit2/idxmap.c +0 -157
  424. data/vendor/libgit2/src/libgit2/idxmap.h +0 -177
  425. data/vendor/libgit2/src/libgit2/libgit2.h +0 -15
  426. data/vendor/libgit2/src/libgit2/netops.c +0 -124
  427. data/vendor/libgit2/src/libgit2/netops.h +0 -68
  428. data/vendor/libgit2/src/libgit2/offmap.c +0 -101
  429. data/vendor/libgit2/src/libgit2/offmap.h +0 -133
  430. data/vendor/libgit2/src/libgit2/oidmap.c +0 -107
  431. data/vendor/libgit2/src/libgit2/oidmap.h +0 -128
  432. data/vendor/libgit2/src/libgit2/threadstate.c +0 -84
  433. data/vendor/libgit2/src/libgit2/threadstate.h +0 -24
  434. data/vendor/libgit2/src/libgit2/transports/ssh.h +0 -14
  435. data/vendor/libgit2/src/util/khash.h +0 -615
  436. data/vendor/libgit2/src/util/strmap.c +0 -100
  437. data/vendor/libgit2/src/util/strmap.h +0 -131
  438. /data/vendor/libgit2/cmake/{FindHTTPParser.cmake → FindHTTP_Parser.cmake} +0 -0
  439. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xdiff.h +0 -0
  440. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xemit.h +0 -0
  441. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xinclude.h +0 -0
  442. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xprepare.h +0 -0
  443. /data/vendor/libgit2/{src/libgit2 → deps}/xdiff/xtypes.h +0 -0
@@ -0,0 +1,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
+ }
@@ -15,108 +15,114 @@ GIT_INLINE(void) git__set_errno(void)
15
15
  errno = EINVAL;
16
16
  }
17
17
 
18
- /**
19
- * Converts a UTF-8 string to wide characters.
20
- *
21
- * @param dest The buffer to receive the wide string.
22
- * @param dest_size The size of the buffer, in characters.
23
- * @param src The UTF-8 string to convert.
24
- * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure
25
- */
26
- int git__utf8_to_16(wchar_t *dest, size_t dest_size, const char *src)
18
+ int git_utf8_to_16(wchar_t *dest, size_t dest_size, const char *src)
19
+ {
20
+ /* Length of -1 indicates NULL termination of the input string. */
21
+ return git_utf8_to_16_with_len(dest, dest_size, src, -1);
22
+ }
23
+
24
+ int git_utf8_to_16_with_len(
25
+ wchar_t *dest,
26
+ size_t _dest_size,
27
+ const char *src,
28
+ int src_len)
27
29
  {
30
+ int dest_size = (int)min(_dest_size, INT_MAX);
28
31
  int len;
29
32
 
30
- /* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to
31
- * turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's
32
- * length. MultiByteToWideChar never returns int's minvalue, so underflow is not possible */
33
- if ((len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, dest, (int)dest_size) - 1) < 0)
33
+ /*
34
+ * Subtract 1 from the result to turn 0 into -1 (an error code) and
35
+ * to not count the NULL terminator as part of the string's length.
36
+ * MultiByteToWideChar never returns int's minvalue, so underflow
37
+ * is not possible.
38
+ */
39
+ len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
40
+ src, src_len, dest, dest_size) - 1;
41
+
42
+ if (len < 0)
34
43
  git__set_errno();
35
44
 
36
45
  return len;
37
46
  }
38
47
 
39
- /**
40
- * Converts a wide string to UTF-8.
41
- *
42
- * @param dest The buffer to receive the UTF-8 string.
43
- * @param dest_size The size of the buffer, in bytes.
44
- * @param src The wide string to convert.
45
- * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure
46
- */
47
- int git__utf16_to_8(char *dest, size_t dest_size, const wchar_t *src)
48
+ int git_utf8_from_16(char *dest, size_t dest_size, const wchar_t *src)
48
49
  {
50
+ /* Length of -1 indicates NULL termination of the input string. */
51
+ return git_utf8_from_16_with_len(dest, dest_size, src, -1);
52
+ }
53
+
54
+ int git_utf8_from_16_with_len(
55
+ char *dest,
56
+ size_t _dest_size,
57
+ const wchar_t *src,
58
+ int src_len)
59
+ {
60
+ int dest_size = (int)min(_dest_size, INT_MAX);
49
61
  int len;
50
62
 
51
- /* Length of -1 indicates NULL termination of the input string. Subtract 1 from the result to
52
- * turn 0 into -1 (an error code) and to not count the NULL terminator as part of the string's
53
- * length. WideCharToMultiByte never returns int's minvalue, so underflow is not possible */
54
- if ((len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, src, -1, dest, (int)dest_size, NULL, NULL) - 1) < 0)
63
+ /*
64
+ * Subtract 1 from the result to turn 0 into -1 (an error code) and
65
+ * to not count the NULL terminator as part of the string's length.
66
+ * WideCharToMultiByte never returns int's minvalue, so underflow
67
+ * is not possible.
68
+ */
69
+ len = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,
70
+ src, src_len, dest, dest_size, NULL, NULL) - 1;
71
+
72
+ if (len < 0)
55
73
  git__set_errno();
56
74
 
57
75
  return len;
58
76
  }
59
77
 
60
- /**
61
- * Converts a UTF-8 string to wide characters.
62
- * Memory is allocated to hold the converted string.
63
- * The caller is responsible for freeing the string with git__free.
64
- *
65
- * @param dest Receives a pointer to the wide string.
66
- * @param src The UTF-8 string to convert.
67
- * @return The length of the wide string, in characters (not counting the NULL terminator), or < 0 for failure
68
- */
69
- int git__utf8_to_16_alloc(wchar_t **dest, const char *src)
78
+ int git_utf8_to_16_alloc(wchar_t **dest, const char *src)
79
+ {
80
+ /* Length of -1 indicates NULL termination of the input string. */
81
+ return git_utf8_to_16_alloc_with_len(dest, src, -1);
82
+ }
83
+
84
+ int git_utf8_to_16_alloc_with_len(wchar_t **dest, const char *src, int src_len)
70
85
  {
71
86
  int utf16_size;
72
87
 
73
88
  *dest = NULL;
74
89
 
75
- /* Length of -1 indicates NULL termination of the input string */
76
- utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, NULL, 0);
90
+ utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
91
+ src, src_len, NULL, 0);
77
92
 
78
93
  if (!utf16_size) {
79
94
  git__set_errno();
80
95
  return -1;
81
96
  }
82
97
 
83
- if (!(*dest = git__mallocarray(utf16_size, sizeof(wchar_t)))) {
84
- errno = ENOMEM;
85
- return -1;
86
- }
98
+ *dest = git__mallocarray(utf16_size, sizeof(wchar_t));
99
+ GIT_ERROR_CHECK_ALLOC(*dest);
87
100
 
88
- utf16_size = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, src, -1, *dest, utf16_size);
89
-
90
- if (!utf16_size) {
91
- git__set_errno();
101
+ utf16_size = git_utf8_to_16_with_len(*dest, (size_t)utf16_size,
102
+ src, src_len);
92
103
 
104
+ if (utf16_size < 0) {
93
105
  git__free(*dest);
94
106
  *dest = NULL;
95
107
  }
96
108
 
97
- /* Subtract 1 from the result to turn 0 into -1 (an error code) and to not count the NULL
98
- * terminator as part of the string's length. MultiByteToWideChar never returns int's minvalue,
99
- * so underflow is not possible */
100
- return utf16_size - 1;
109
+ return utf16_size;
101
110
  }
102
111
 
103
- /**
104
- * Converts a wide string to UTF-8.
105
- * Memory is allocated to hold the converted string.
106
- * The caller is responsible for freeing the string with git__free.
107
- *
108
- * @param dest Receives a pointer to the UTF-8 string.
109
- * @param src The wide string to convert.
110
- * @return The length of the UTF-8 string, in bytes (not counting the NULL terminator), or < 0 for failure
111
- */
112
- int git__utf16_to_8_alloc(char **dest, const wchar_t *src)
112
+ int git_utf8_from_16_alloc(char **dest, const wchar_t *src)
113
+ {
114
+ /* Length of -1 indicates NULL termination of the input string. */
115
+ return git_utf8_from_16_alloc_with_len(dest, src, -1);
116
+ }
117
+
118
+ int git_utf8_from_16_alloc_with_len(char **dest, const wchar_t *src, int src_len)
113
119
  {
114
120
  int utf8_size;
115
121
 
116
122
  *dest = NULL;
117
123
 
118
- /* Length of -1 indicates NULL termination of the input string */
119
- utf8_size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, src, -1, NULL, 0, NULL, NULL);
124
+ utf8_size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,
125
+ src, src_len, NULL, 0, NULL, NULL);
120
126
 
121
127
  if (!utf8_size) {
122
128
  git__set_errno();
@@ -124,23 +130,15 @@ int git__utf16_to_8_alloc(char **dest, const wchar_t *src)
124
130
  }
125
131
 
126
132
  *dest = git__malloc(utf8_size);
133
+ GIT_ERROR_CHECK_ALLOC(*dest);
127
134
 
128
- if (!*dest) {
129
- errno = ENOMEM;
130
- return -1;
131
- }
132
-
133
- utf8_size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, src, -1, *dest, utf8_size, NULL, NULL);
134
-
135
- if (!utf8_size) {
136
- git__set_errno();
135
+ utf8_size = WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS,
136
+ src, src_len, *dest, utf8_size, NULL, NULL);
137
137
 
138
+ if (utf8_size < 0) {
138
139
  git__free(*dest);
139
140
  *dest = NULL;
140
141
  }
141
142
 
142
- /* Subtract 1 from the result to turn 0 into -1 (an error code) and to not count the NULL
143
- * terminator as part of the string's length. MultiByteToWideChar never returns int's minvalue,
144
- * so underflow is not possible */
145
- return utf8_size - 1;
143
+ return utf8_size;
146
144
  }