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,36 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #ifndef INCLUDE_runtime_h__
9
+ #define INCLUDE_runtime_h__
10
+
11
+ #include "git2_util.h"
12
+
13
+ extern int git_strlist_copy(char ***out, const char **in, size_t len);
14
+
15
+ extern int git_strlist_copy_with_null(
16
+ char ***out,
17
+ const char **in,
18
+ size_t len);
19
+
20
+ extern bool git_strlist_contains_prefix(
21
+ const char **strings,
22
+ size_t len,
23
+ const char *str,
24
+ size_t n);
25
+
26
+ extern bool git_strlist_contains_key(
27
+ const char **strings,
28
+ size_t len,
29
+ const char *key,
30
+ char delimiter);
31
+
32
+ extern void git_strlist_free(char **strings, size_t len);
33
+
34
+ extern void git_strlist_free_with_null(char **strings);
35
+
36
+ #endif
@@ -54,8 +54,6 @@ GIT_INLINE(int) p_fsync(int fd)
54
54
  #define p_send(s,b,l,f) send(s,b,l,f)
55
55
  #define p_inet_pton(a, b, c) inet_pton(a, b, c)
56
56
 
57
- #define p_strcasecmp(s1, s2) strcasecmp(s1, s2)
58
- #define p_strncasecmp(s1, s2, c) strncasecmp(s1, s2, c)
59
57
  #define p_vsnprintf(b, c, f, a) vsnprintf(b, c, f, a)
60
58
  #define p_snprintf snprintf
61
59
  #define p_chdir(p) chdir(p)
@@ -0,0 +1,629 @@
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 "process.h"
16
+ #include "strlist.h"
17
+
18
+ #ifdef __APPLE__
19
+ #include <crt_externs.h>
20
+ #define environ (*_NSGetEnviron())
21
+ #else
22
+ extern char **environ;
23
+ #endif
24
+
25
+ struct git_process {
26
+ char **args;
27
+ char **env;
28
+
29
+ char *cwd;
30
+
31
+ unsigned int capture_in : 1,
32
+ capture_out : 1,
33
+ capture_err : 1;
34
+
35
+ pid_t pid;
36
+
37
+ int child_in;
38
+ int child_out;
39
+ int child_err;
40
+ git_process_result_status status;
41
+ };
42
+
43
+ GIT_INLINE(bool) is_delete_env(const char *env)
44
+ {
45
+ char *c = strchr(env, '=');
46
+
47
+ if (c == NULL)
48
+ return false;
49
+
50
+ return *(c+1) == '\0';
51
+ }
52
+
53
+ static int merge_env(
54
+ char ***out,
55
+ const char **env,
56
+ size_t env_len,
57
+ bool exclude_env)
58
+ {
59
+ git_vector merged = GIT_VECTOR_INIT;
60
+ char **kv, *dup;
61
+ size_t max, cnt;
62
+ int error = 0;
63
+
64
+ for (max = env_len, kv = environ; !exclude_env && *kv; kv++)
65
+ max++;
66
+
67
+ if ((error = git_vector_init(&merged, max, NULL)) < 0)
68
+ goto on_error;
69
+
70
+ for (cnt = 0; env && cnt < env_len; cnt++) {
71
+ if (is_delete_env(env[cnt]))
72
+ continue;
73
+
74
+ dup = git__strdup(env[cnt]);
75
+ GIT_ERROR_CHECK_ALLOC(dup);
76
+
77
+ if ((error = git_vector_insert(&merged, dup)) < 0)
78
+ goto on_error;
79
+ }
80
+
81
+ if (!exclude_env) {
82
+ for (kv = environ; *kv; kv++) {
83
+ if (env && git_strlist_contains_key(env, env_len, *kv, '='))
84
+ continue;
85
+
86
+ dup = git__strdup(*kv);
87
+ GIT_ERROR_CHECK_ALLOC(dup);
88
+
89
+ if ((error = git_vector_insert(&merged, dup)) < 0)
90
+ goto on_error;
91
+ }
92
+ }
93
+
94
+ if (merged.length == 0) {
95
+ *out = NULL;
96
+ error = 0;
97
+ goto on_error;
98
+ }
99
+
100
+ git_vector_insert(&merged, NULL);
101
+
102
+ *out = (char **)merged.contents;
103
+
104
+ return 0;
105
+
106
+ on_error:
107
+ git_vector_dispose_deep(&merged);
108
+ return error;
109
+ }
110
+
111
+ int git_process_new(
112
+ git_process **out,
113
+ const char **args,
114
+ size_t args_len,
115
+ const char **env,
116
+ size_t env_len,
117
+ git_process_options *opts)
118
+ {
119
+ git_process *process;
120
+
121
+ GIT_ASSERT_ARG(out && args && args_len > 0);
122
+
123
+ *out = NULL;
124
+
125
+ process = git__calloc(sizeof(git_process), 1);
126
+ GIT_ERROR_CHECK_ALLOC(process);
127
+
128
+ if (git_strlist_copy_with_null(&process->args, args, args_len) < 0 ||
129
+ merge_env(&process->env, env, env_len, opts ? opts->exclude_env : false) < 0) {
130
+ git_process_free(process);
131
+ return -1;
132
+ }
133
+
134
+ if (opts) {
135
+ process->capture_in = opts->capture_in;
136
+ process->capture_out = opts->capture_out;
137
+ process->capture_err = opts->capture_err;
138
+
139
+ if (opts->cwd) {
140
+ process->cwd = git__strdup(opts->cwd);
141
+ GIT_ERROR_CHECK_ALLOC(process->cwd);
142
+ }
143
+ }
144
+
145
+ process->child_in = -1;
146
+ process->child_out = -1;
147
+ process->child_err = -1;
148
+ process->status = -1;
149
+
150
+ *out = process;
151
+ return 0;
152
+ }
153
+
154
+ extern int git_process_new_from_cmdline(
155
+ git_process **out,
156
+ const char *cmdline,
157
+ const char **env,
158
+ size_t env_len,
159
+ git_process_options *opts)
160
+ {
161
+ const char *args[] = { "/bin/sh", "-c", cmdline };
162
+
163
+ return git_process_new(out,
164
+ args, ARRAY_SIZE(args), env, env_len, opts);
165
+ }
166
+
167
+ #define CLOSE_FD(fd) \
168
+ if (fd >= 0) { \
169
+ close(fd); \
170
+ fd = -1; \
171
+ }
172
+
173
+ static int try_read_status(size_t *out, int fd, void *buf, size_t len)
174
+ {
175
+ size_t read_len = 0;
176
+ int ret = -1;
177
+
178
+ while (ret && read_len < len) {
179
+ ret = read(fd, buf + read_len, len - read_len);
180
+
181
+ if (ret < 0 && errno != EAGAIN && errno != EINTR) {
182
+ git_error_set(GIT_ERROR_OS, "could not read child status");
183
+ return -1;
184
+ }
185
+
186
+ read_len += ret;
187
+ }
188
+
189
+ *out = read_len;
190
+ return 0;
191
+ }
192
+
193
+
194
+ static int read_status(int fd)
195
+ {
196
+ size_t status_len = sizeof(int) * 3, read_len = 0;
197
+ char buffer[status_len], fn[128];
198
+ int error, fn_error, os_error, fn_len = 0;
199
+
200
+ if ((error = try_read_status(&read_len, fd, buffer, status_len)) < 0)
201
+ return error;
202
+
203
+ /* Immediate EOF indicates the exec succeeded. */
204
+ if (read_len == 0)
205
+ return 0;
206
+
207
+ if (read_len < status_len) {
208
+ git_error_set(GIT_ERROR_INVALID, "child status truncated");
209
+ return -1;
210
+ }
211
+
212
+ memcpy(&fn_error, &buffer[0], sizeof(int));
213
+ memcpy(&os_error, &buffer[sizeof(int)], sizeof(int));
214
+ memcpy(&fn_len, &buffer[sizeof(int) * 2], sizeof(int));
215
+
216
+ if (fn_len > 0) {
217
+ fn_len = min(fn_len, (int)(ARRAY_SIZE(fn) - 1));
218
+
219
+ if ((error = try_read_status(&read_len, fd, fn, fn_len)) < 0)
220
+ return error;
221
+
222
+ fn[fn_len] = '\0';
223
+ } else {
224
+ fn[0] = '\0';
225
+ }
226
+
227
+ if (fn_error) {
228
+ errno = os_error;
229
+ git_error_set(GIT_ERROR_OS, "could not %s", fn[0] ? fn : "(unknown)");
230
+ }
231
+
232
+ return fn_error;
233
+ }
234
+
235
+ static bool try_write_status(int fd, const void *buf, size_t len)
236
+ {
237
+ size_t write_len;
238
+ int ret;
239
+
240
+ for (write_len = 0; write_len < len; ) {
241
+ ret = write(fd, buf + write_len, len - write_len);
242
+
243
+ if (ret <= 0)
244
+ break;
245
+
246
+ write_len += ret;
247
+ }
248
+
249
+ return (len == write_len);
250
+ }
251
+
252
+ static void write_status(int fd, const char *fn, int error, int os_error)
253
+ {
254
+ size_t status_len = sizeof(int) * 3, fn_len;
255
+ char buffer[status_len];
256
+
257
+ fn_len = strlen(fn);
258
+
259
+ if (fn_len > INT_MAX)
260
+ fn_len = INT_MAX;
261
+
262
+ memcpy(&buffer[0], &error, sizeof(int));
263
+ memcpy(&buffer[sizeof(int)], &os_error, sizeof(int));
264
+ memcpy(&buffer[sizeof(int) * 2], &fn_len, sizeof(int));
265
+
266
+ /* Do our best effort to write all the status. */
267
+ if (!try_write_status(fd, buffer, status_len))
268
+ return;
269
+
270
+ if (fn_len)
271
+ try_write_status(fd, fn, fn_len);
272
+ }
273
+
274
+ int git_process_start(git_process *process)
275
+ {
276
+ int in[2] = { -1, -1 }, out[2] = { -1, -1 },
277
+ err[2] = { -1, -1 }, status[2] = { -1, -1 };
278
+ int fdflags, state, error;
279
+ pid_t pid;
280
+
281
+ /* Set up the pipes to read from/write to the process */
282
+ if ((process->capture_in && pipe(in) < 0) ||
283
+ (process->capture_out && pipe(out) < 0) ||
284
+ (process->capture_err && pipe(err) < 0)) {
285
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
286
+ goto on_error;
287
+ }
288
+
289
+ /* Set up a self-pipe for status from the forked process. */
290
+ if (pipe(status) < 0 ||
291
+ (fdflags = fcntl(status[1], F_GETFD)) < 0 ||
292
+ fcntl(status[1], F_SETFD, fdflags | FD_CLOEXEC) < 0) {
293
+ git_error_set(GIT_ERROR_OS, "could not create pipe");
294
+ goto on_error;
295
+ }
296
+
297
+ switch (pid = fork()) {
298
+ case -1:
299
+ git_error_set(GIT_ERROR_OS, "could not fork");
300
+ goto on_error;
301
+
302
+ /* Child: start the process. */
303
+ case 0:
304
+ /* Close the opposing side of the pipes */
305
+ CLOSE_FD(status[0]);
306
+
307
+ if (process->capture_in) {
308
+ CLOSE_FD(in[1]);
309
+ dup2(in[0], STDIN_FILENO);
310
+ }
311
+
312
+ if (process->capture_out) {
313
+ CLOSE_FD(out[0]);
314
+ dup2(out[1], STDOUT_FILENO);
315
+ }
316
+
317
+ if (process->capture_err) {
318
+ CLOSE_FD(err[0]);
319
+ dup2(err[1], STDERR_FILENO);
320
+ }
321
+
322
+ if (process->cwd && (error = chdir(process->cwd)) < 0) {
323
+ write_status(status[1], "chdir", error, errno);
324
+ exit(0);
325
+ }
326
+
327
+ /*
328
+ * Exec the process and write the results back if the
329
+ * call fails. If it succeeds, we'll close the status
330
+ * pipe (via CLOEXEC) and the parent will know.
331
+ */
332
+ error = execve(process->args[0],
333
+ process->args,
334
+ process->env);
335
+
336
+ write_status(status[1], "execve", error, errno);
337
+ exit(0);
338
+
339
+ /* Parent: make sure the child process exec'd correctly. */
340
+ default:
341
+ /* Close the opposing side of the pipes */
342
+ CLOSE_FD(status[1]);
343
+
344
+ if (process->capture_in) {
345
+ CLOSE_FD(in[0]);
346
+ process->child_in = in[1];
347
+ }
348
+
349
+ if (process->capture_out) {
350
+ CLOSE_FD(out[1]);
351
+ process->child_out = out[0];
352
+ }
353
+
354
+ if (process->capture_err) {
355
+ CLOSE_FD(err[1]);
356
+ process->child_err = err[0];
357
+ }
358
+
359
+ /* Try to read the status */
360
+ process->status = status[0];
361
+ if ((error = read_status(status[0])) < 0) {
362
+ waitpid(process->pid, &state, 0);
363
+ goto on_error;
364
+ }
365
+
366
+ process->pid = pid;
367
+ return 0;
368
+ }
369
+
370
+ on_error:
371
+ CLOSE_FD(in[0]); CLOSE_FD(in[1]);
372
+ CLOSE_FD(out[0]); CLOSE_FD(out[1]);
373
+ CLOSE_FD(err[0]); CLOSE_FD(err[1]);
374
+ CLOSE_FD(status[0]); CLOSE_FD(status[1]);
375
+ return -1;
376
+ }
377
+
378
+ int git_process_id(p_pid_t *out, git_process *process)
379
+ {
380
+ GIT_ASSERT(out && process);
381
+
382
+ if (!process->pid) {
383
+ git_error_set(GIT_ERROR_INVALID, "process not running");
384
+ return -1;
385
+ }
386
+
387
+ *out = process->pid;
388
+ return 0;
389
+ }
390
+
391
+ static ssize_t process_read(int fd, void *buf, size_t count)
392
+ {
393
+ ssize_t ret;
394
+
395
+ if (count > SSIZE_MAX)
396
+ count = SSIZE_MAX;
397
+
398
+ if ((ret = read(fd, buf, count)) < 0) {
399
+ git_error_set(GIT_ERROR_OS, "could not read from child process");
400
+ return -1;
401
+ }
402
+
403
+ return ret;
404
+ }
405
+
406
+ ssize_t git_process_read(git_process *process, void *buf, size_t count)
407
+ {
408
+ GIT_ASSERT_ARG(process);
409
+ GIT_ASSERT(process->capture_out);
410
+
411
+ return process_read(process->child_out, buf, count);
412
+ }
413
+
414
+ ssize_t git_process_read_err(git_process *process, void *buf, size_t count)
415
+ {
416
+ GIT_ASSERT_ARG(process);
417
+ GIT_ASSERT(process->capture_err);
418
+
419
+ return process_read(process->child_err, buf, count);
420
+ }
421
+
422
+ #ifdef GIT_THREADS
423
+
424
+ # define signal_state sigset_t
425
+
426
+ /*
427
+ * Since signal-handling is process-wide, we cannot simply use
428
+ * SIG_IGN to avoid SIGPIPE. Instead: http://www.microhowto.info:80/howto/ignore_sigpipe_without_affecting_other_threads_in_a_process.html
429
+ */
430
+
431
+ GIT_INLINE(int) disable_signals(sigset_t *saved_mask)
432
+ {
433
+ sigset_t sigpipe_mask;
434
+
435
+ sigemptyset(&sigpipe_mask);
436
+ sigaddset(&sigpipe_mask, SIGPIPE);
437
+
438
+ if (pthread_sigmask(SIG_BLOCK, &sigpipe_mask, saved_mask) < 0) {
439
+ git_error_set(GIT_ERROR_OS, "could not configure signal mask");
440
+ return -1;
441
+ }
442
+
443
+ return 0;
444
+ }
445
+
446
+ GIT_INLINE(int) restore_signals(sigset_t *saved_mask)
447
+ {
448
+ sigset_t sigpipe_mask, pending;
449
+ int signal;
450
+
451
+ sigemptyset(&sigpipe_mask);
452
+ sigaddset(&sigpipe_mask, SIGPIPE);
453
+
454
+ if (sigpending(&pending) < 0) {
455
+ git_error_set(GIT_ERROR_OS, "could not examine pending signals");
456
+ return -1;
457
+ }
458
+
459
+ if (sigismember(&pending, SIGPIPE) == 1 &&
460
+ sigwait(&sigpipe_mask, &signal) < 0) {
461
+ git_error_set(GIT_ERROR_OS, "could not wait for (blocking) signal delivery");
462
+ return -1;
463
+ }
464
+
465
+ if (pthread_sigmask(SIG_SETMASK, saved_mask, 0) < 0) {
466
+ git_error_set(GIT_ERROR_OS, "could not configure signal mask");
467
+ return -1;
468
+ }
469
+
470
+ return 0;
471
+ }
472
+
473
+ #else
474
+
475
+ # define signal_state struct sigaction
476
+
477
+ GIT_INLINE(int) disable_signals(struct sigaction *saved_handler)
478
+ {
479
+ struct sigaction ign_handler = { 0 };
480
+
481
+ ign_handler.sa_handler = SIG_IGN;
482
+
483
+ if (sigaction(SIGPIPE, &ign_handler, saved_handler) < 0) {
484
+ git_error_set(GIT_ERROR_OS, "could not configure signal handler");
485
+ return -1;
486
+ }
487
+
488
+ return 0;
489
+ }
490
+
491
+ GIT_INLINE(int) restore_signals(struct sigaction *saved_handler)
492
+ {
493
+ if (sigaction(SIGPIPE, saved_handler, NULL) < 0) {
494
+ git_error_set(GIT_ERROR_OS, "could not configure signal handler");
495
+ return -1;
496
+ }
497
+
498
+ return 0;
499
+ }
500
+
501
+ #endif
502
+
503
+ ssize_t git_process_write(git_process *process, const void *buf, size_t count)
504
+ {
505
+ signal_state saved_signal;
506
+ ssize_t ret;
507
+
508
+ GIT_ASSERT_ARG(process);
509
+ GIT_ASSERT(process->capture_in);
510
+
511
+ if (count > SSIZE_MAX)
512
+ count = SSIZE_MAX;
513
+
514
+ if (disable_signals(&saved_signal) < 0)
515
+ return -1;
516
+
517
+ if ((ret = write(process->child_in, buf, count)) < 0)
518
+ git_error_set(GIT_ERROR_OS, "could not write to child process");
519
+
520
+ if (restore_signals(&saved_signal) < 0)
521
+ return -1;
522
+
523
+ return (ret < 0) ? -1 : ret;
524
+ }
525
+
526
+ int git_process_close_in(git_process *process)
527
+ {
528
+ if (!process->capture_in) {
529
+ git_error_set(GIT_ERROR_INVALID, "input is not open");
530
+ return -1;
531
+ }
532
+
533
+ CLOSE_FD(process->child_in);
534
+ return 0;
535
+ }
536
+
537
+ int git_process_close_out(git_process *process)
538
+ {
539
+ if (!process->capture_out) {
540
+ git_error_set(GIT_ERROR_INVALID, "output is not open");
541
+ return -1;
542
+ }
543
+
544
+ CLOSE_FD(process->child_out);
545
+ return 0;
546
+ }
547
+
548
+ int git_process_close_err(git_process *process)
549
+ {
550
+ if (!process->capture_err) {
551
+ git_error_set(GIT_ERROR_INVALID, "error is not open");
552
+ return -1;
553
+ }
554
+
555
+ CLOSE_FD(process->child_err);
556
+ return 0;
557
+ }
558
+
559
+ int git_process_close(git_process *process)
560
+ {
561
+ CLOSE_FD(process->child_in);
562
+ CLOSE_FD(process->child_out);
563
+ CLOSE_FD(process->child_err);
564
+
565
+ return 0;
566
+ }
567
+
568
+ int git_process_wait(git_process_result *result, git_process *process)
569
+ {
570
+ int state;
571
+
572
+ if (result)
573
+ memset(result, 0, sizeof(git_process_result));
574
+
575
+ if (!process->pid) {
576
+ git_error_set(GIT_ERROR_INVALID, "process is stopped");
577
+ return -1;
578
+ }
579
+
580
+ if (waitpid(process->pid, &state, 0) < 0) {
581
+ git_error_set(GIT_ERROR_OS, "could not wait for child");
582
+ return -1;
583
+ }
584
+
585
+ process->pid = 0;
586
+
587
+ if (result) {
588
+ if (WIFEXITED(state)) {
589
+ result->status = GIT_PROCESS_STATUS_NORMAL;
590
+ result->exitcode = WEXITSTATUS(state);
591
+ } else if (WIFSIGNALED(state)) {
592
+ result->status = GIT_PROCESS_STATUS_ERROR;
593
+ result->signal = WTERMSIG(state);
594
+ } else {
595
+ result->status = GIT_PROCESS_STATUS_ERROR;
596
+ }
597
+ }
598
+
599
+ return 0;
600
+ }
601
+
602
+ int git_process_result_msg(git_str *out, git_process_result *result)
603
+ {
604
+ if (result->status == GIT_PROCESS_STATUS_NONE) {
605
+ return git_str_puts(out, "process not started");
606
+ } else if (result->status == GIT_PROCESS_STATUS_NORMAL) {
607
+ return git_str_printf(out, "process exited with code %d",
608
+ result->exitcode);
609
+ } else if (result->signal) {
610
+ return git_str_printf(out, "process exited on signal %d",
611
+ result->signal);
612
+ }
613
+
614
+ return git_str_puts(out, "unknown error");
615
+ }
616
+
617
+ void git_process_free(git_process *process)
618
+ {
619
+ if (!process)
620
+ return;
621
+
622
+ if (process->pid)
623
+ git_process_close(process);
624
+
625
+ git__free(process->cwd);
626
+ git_strlist_free_with_null(process->args);
627
+ git_strlist_free_with_null(process->env);
628
+ git__free(process);
629
+ }
@@ -16,17 +16,35 @@
16
16
 
17
17
  char *p_realpath(const char *pathname, char *resolved)
18
18
  {
19
- char *ret;
20
- if ((ret = realpath(pathname, resolved)) == NULL)
19
+ char *result;
20
+
21
+ if ((result = realpath(pathname, resolved)) == NULL)
21
22
  return NULL;
22
23
 
23
24
  #ifdef __OpenBSD__
24
25
  /* The OpenBSD realpath function behaves differently,
25
26
  * figure out if the file exists */
26
- if (access(ret, F_OK) < 0)
27
- ret = NULL;
27
+ if (access(result, F_OK) < 0) {
28
+ if (!resolved)
29
+ free(result);
30
+
31
+ return NULL;
32
+ }
28
33
  #endif
29
- return ret;
34
+
35
+ /*
36
+ * If resolved == NULL, the system has allocated the result
37
+ * string. We need to strdup this into _our_ allocator pool
38
+ * so that callers can free it with git__free.
39
+ */
40
+ if (!resolved) {
41
+ char *dup = git__strdup(result);
42
+ free(result);
43
+
44
+ result = dup;
45
+ }
46
+
47
+ return result;
30
48
  }
31
49
 
32
50
  #endif