rugged 1.7.2 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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
@@ -623,12 +623,12 @@ int git__bsearch_r(
623
623
  */
624
624
  int git__strcmp_cb(const void *a, const void *b)
625
625
  {
626
- return strcmp((const char *)a, (const char *)b);
626
+ return git__strcmp((const char *)a, (const char *)b);
627
627
  }
628
628
 
629
629
  int git__strcasecmp_cb(const void *a, const void *b)
630
630
  {
631
- return strcasecmp((const char *)a, (const char *)b);
631
+ return git__strcasecmp((const char *)a, (const char *)b);
632
632
  }
633
633
 
634
634
  int git__parse_bool(int *out, const char *value)