rugged 1.3.2.3 → 1.4.2

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 (329) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rugged/extconf.rb +1 -1
  3. data/ext/rugged/rugged_config.c +7 -2
  4. data/ext/rugged/rugged_remote.c +17 -0
  5. data/lib/rugged/version.rb +1 -1
  6. data/vendor/libgit2/CMakeLists.txt +103 -276
  7. data/vendor/libgit2/COPYING +36 -19
  8. data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
  9. data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
  10. data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
  11. data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
  12. data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
  13. data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
  14. data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
  15. data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
  16. data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
  17. data/vendor/libgit2/cmake/FindPCRE.cmake +13 -13
  18. data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
  19. data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
  20. data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
  21. data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
  22. data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
  23. data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
  24. data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
  25. data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
  26. data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
  27. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
  28. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
  29. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
  30. data/vendor/libgit2/cmake/SelectHashes.cmake +39 -49
  31. data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
  32. data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
  33. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
  34. data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
  35. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
  36. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +31 -31
  37. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +1 -1
  38. data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
  39. data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
  40. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
  41. data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
  42. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
  43. data/vendor/libgit2/deps/zlib/adler32.c +0 -7
  44. data/vendor/libgit2/deps/zlib/crc32.c +288 -975
  45. data/vendor/libgit2/deps/zlib/crc32.h +436 -9441
  46. data/vendor/libgit2/deps/zlib/deflate.c +31 -83
  47. data/vendor/libgit2/deps/zlib/deflate.h +15 -12
  48. data/vendor/libgit2/deps/zlib/gzguts.h +2 -3
  49. data/vendor/libgit2/deps/zlib/infback.c +1 -2
  50. data/vendor/libgit2/deps/zlib/inffast.c +14 -14
  51. data/vendor/libgit2/deps/zlib/inflate.c +8 -39
  52. data/vendor/libgit2/deps/zlib/inflate.h +2 -3
  53. data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
  54. data/vendor/libgit2/deps/zlib/trees.c +48 -27
  55. data/vendor/libgit2/deps/zlib/zlib.h +100 -126
  56. data/vendor/libgit2/deps/zlib/zutil.c +2 -2
  57. data/vendor/libgit2/deps/zlib/zutil.h +9 -12
  58. data/vendor/libgit2/include/git2/apply.h +16 -2
  59. data/vendor/libgit2/include/git2/attr.h +11 -2
  60. data/vendor/libgit2/include/git2/blame.h +4 -1
  61. data/vendor/libgit2/include/git2/blob.h +14 -1
  62. data/vendor/libgit2/include/git2/branch.h +2 -0
  63. data/vendor/libgit2/include/git2/buffer.h +18 -78
  64. data/vendor/libgit2/include/git2/cert.h +2 -2
  65. data/vendor/libgit2/include/git2/checkout.h +5 -2
  66. data/vendor/libgit2/include/git2/clone.h +3 -3
  67. data/vendor/libgit2/include/git2/commit.h +2 -0
  68. data/vendor/libgit2/include/git2/common.h +5 -12
  69. data/vendor/libgit2/include/git2/config.h +19 -3
  70. data/vendor/libgit2/include/git2/credential.h +2 -1
  71. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  72. data/vendor/libgit2/include/git2/deprecated.h +1 -1
  73. data/vendor/libgit2/include/git2/describe.h +7 -2
  74. data/vendor/libgit2/include/git2/diff.h +17 -9
  75. data/vendor/libgit2/include/git2/email.h +1 -1
  76. data/vendor/libgit2/include/git2/errors.h +1 -2
  77. data/vendor/libgit2/include/git2/filter.h +7 -2
  78. data/vendor/libgit2/include/git2/graph.h +1 -0
  79. data/vendor/libgit2/include/git2/ignore.h +1 -1
  80. data/vendor/libgit2/include/git2/index.h +11 -5
  81. data/vendor/libgit2/include/git2/indexer.h +19 -0
  82. data/vendor/libgit2/include/git2/merge.h +23 -3
  83. data/vendor/libgit2/include/git2/message.h +2 -0
  84. data/vendor/libgit2/include/git2/object.h +23 -0
  85. data/vendor/libgit2/include/git2/odb.h +37 -7
  86. data/vendor/libgit2/include/git2/odb_backend.h +1 -1
  87. data/vendor/libgit2/include/git2/pack.h +24 -8
  88. data/vendor/libgit2/include/git2/patch.h +8 -0
  89. data/vendor/libgit2/include/git2/pathspec.h +1 -1
  90. data/vendor/libgit2/include/git2/proxy.h +1 -1
  91. data/vendor/libgit2/include/git2/rebase.h +9 -1
  92. data/vendor/libgit2/include/git2/refdb.h +3 -0
  93. data/vendor/libgit2/include/git2/reflog.h +1 -1
  94. data/vendor/libgit2/include/git2/refs.h +2 -2
  95. data/vendor/libgit2/include/git2/remote.h +184 -37
  96. data/vendor/libgit2/include/git2/repository.h +14 -9
  97. data/vendor/libgit2/include/git2/reset.h +2 -2
  98. data/vendor/libgit2/include/git2/revparse.h +1 -1
  99. data/vendor/libgit2/include/git2/revwalk.h +4 -1
  100. data/vendor/libgit2/include/git2/signature.h +1 -1
  101. data/vendor/libgit2/include/git2/stash.h +3 -3
  102. data/vendor/libgit2/include/git2/status.h +9 -3
  103. data/vendor/libgit2/include/git2/submodule.h +7 -2
  104. data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
  105. data/vendor/libgit2/include/git2/sys/odb_backend.h +2 -5
  106. data/vendor/libgit2/include/git2/sys/remote.h +31 -0
  107. data/vendor/libgit2/include/git2/sys/stream.h +1 -1
  108. data/vendor/libgit2/include/git2/sys/transport.h +25 -34
  109. data/vendor/libgit2/include/git2/tag.h +1 -0
  110. data/vendor/libgit2/include/git2/tree.h +4 -3
  111. data/vendor/libgit2/include/git2/types.h +7 -7
  112. data/vendor/libgit2/include/git2/version.h +3 -3
  113. data/vendor/libgit2/include/git2/worktree.h +12 -2
  114. data/vendor/libgit2/src/CMakeLists.txt +189 -315
  115. data/vendor/libgit2/src/annotated_commit.h +1 -1
  116. data/vendor/libgit2/src/apply.c +18 -18
  117. data/vendor/libgit2/src/apply.h +2 -2
  118. data/vendor/libgit2/src/attr.c +18 -18
  119. data/vendor/libgit2/src/attr_file.c +17 -17
  120. data/vendor/libgit2/src/attr_file.h +4 -4
  121. data/vendor/libgit2/src/attrcache.c +17 -12
  122. data/vendor/libgit2/src/blame_git.c +1 -1
  123. data/vendor/libgit2/src/blob.c +33 -26
  124. data/vendor/libgit2/src/blob.h +1 -1
  125. data/vendor/libgit2/src/branch.c +150 -109
  126. data/vendor/libgit2/src/branch.h +15 -3
  127. data/vendor/libgit2/src/buf.c +126 -0
  128. data/vendor/libgit2/src/buf.h +50 -0
  129. data/vendor/libgit2/src/cc-compat.h +1 -1
  130. data/vendor/libgit2/src/checkout.c +74 -68
  131. data/vendor/libgit2/src/cherrypick.c +10 -10
  132. data/vendor/libgit2/src/clone.c +66 -66
  133. data/vendor/libgit2/src/commit.c +128 -58
  134. data/vendor/libgit2/src/commit.h +24 -1
  135. data/vendor/libgit2/src/commit_graph.c +68 -53
  136. data/vendor/libgit2/src/commit_graph.h +10 -3
  137. data/vendor/libgit2/src/commit_list.c +2 -3
  138. data/vendor/libgit2/src/common.h +10 -3
  139. data/vendor/libgit2/src/config.c +99 -77
  140. data/vendor/libgit2/src/config.h +15 -2
  141. data/vendor/libgit2/src/config_file.c +103 -91
  142. data/vendor/libgit2/src/config_mem.c +9 -9
  143. data/vendor/libgit2/src/config_parse.c +27 -23
  144. data/vendor/libgit2/src/crlf.c +24 -21
  145. data/vendor/libgit2/src/date.c +10 -17
  146. data/vendor/libgit2/src/date.h +33 -0
  147. data/vendor/libgit2/src/describe.c +27 -19
  148. data/vendor/libgit2/src/diff.c +25 -8
  149. data/vendor/libgit2/src/diff.h +2 -4
  150. data/vendor/libgit2/src/diff_driver.c +34 -36
  151. data/vendor/libgit2/src/diff_driver.h +3 -3
  152. data/vendor/libgit2/src/diff_file.c +29 -20
  153. data/vendor/libgit2/src/diff_generate.c +30 -6
  154. data/vendor/libgit2/src/diff_generate.h +5 -3
  155. data/vendor/libgit2/src/diff_print.c +102 -95
  156. data/vendor/libgit2/src/diff_stats.c +40 -29
  157. data/vendor/libgit2/src/{message.h → diff_stats.h} +7 -6
  158. data/vendor/libgit2/src/diff_tform.c +9 -8
  159. data/vendor/libgit2/src/diff_xdiff.c +3 -8
  160. data/vendor/libgit2/src/email.c +54 -38
  161. data/vendor/libgit2/src/email.h +1 -1
  162. data/vendor/libgit2/src/errors.c +18 -18
  163. data/vendor/libgit2/src/features.h.in +6 -1
  164. data/vendor/libgit2/src/fetch.c +69 -24
  165. data/vendor/libgit2/src/fetch.h +1 -1
  166. data/vendor/libgit2/src/fetchhead.c +19 -19
  167. data/vendor/libgit2/src/filebuf.c +28 -28
  168. data/vendor/libgit2/src/filebuf.h +1 -1
  169. data/vendor/libgit2/src/filter.c +96 -52
  170. data/vendor/libgit2/src/filter.h +26 -5
  171. data/vendor/libgit2/src/fs_path.c +1912 -0
  172. data/vendor/libgit2/src/fs_path.h +752 -0
  173. data/vendor/libgit2/src/futils.c +91 -85
  174. data/vendor/libgit2/src/futils.h +26 -14
  175. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +2 -2
  176. data/vendor/libgit2/src/hash/sha1/common_crypto.c +2 -2
  177. data/vendor/libgit2/src/hash/sha1/generic.c +2 -2
  178. data/vendor/libgit2/src/hash/sha1/mbedtls.c +2 -2
  179. data/vendor/libgit2/src/hash/sha1/openssl.c +2 -2
  180. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +1 -1
  181. data/vendor/libgit2/src/hash/sha1/win32.c +6 -6
  182. data/vendor/libgit2/src/hash/sha1.h +3 -1
  183. data/vendor/libgit2/src/hash.c +67 -35
  184. data/vendor/libgit2/src/hash.h +12 -12
  185. data/vendor/libgit2/src/ident.c +18 -18
  186. data/vendor/libgit2/src/ignore.c +35 -34
  187. data/vendor/libgit2/src/ignore.h +2 -2
  188. data/vendor/libgit2/src/index.c +79 -80
  189. data/vendor/libgit2/src/index.h +6 -3
  190. data/vendor/libgit2/src/indexer.c +75 -57
  191. data/vendor/libgit2/src/iterator.c +64 -56
  192. data/vendor/libgit2/src/iterator.h +5 -5
  193. data/vendor/libgit2/src/khash.h +1 -1
  194. data/vendor/libgit2/src/libgit2.c +22 -19
  195. data/vendor/libgit2/src/mailmap.c +38 -36
  196. data/vendor/libgit2/src/merge.c +27 -27
  197. data/vendor/libgit2/src/merge.h +1 -14
  198. data/vendor/libgit2/src/merge_driver.c +2 -2
  199. data/vendor/libgit2/src/merge_file.c +13 -3
  200. data/vendor/libgit2/src/message.c +21 -10
  201. data/vendor/libgit2/src/midx.c +83 -66
  202. data/vendor/libgit2/src/midx.h +3 -3
  203. data/vendor/libgit2/src/mwindow.c +1 -1
  204. data/vendor/libgit2/src/net.c +278 -68
  205. data/vendor/libgit2/src/net.h +10 -3
  206. data/vendor/libgit2/src/netops.c +1 -1
  207. data/vendor/libgit2/src/netops.h +1 -1
  208. data/vendor/libgit2/src/notes.c +20 -29
  209. data/vendor/libgit2/src/object.c +49 -9
  210. data/vendor/libgit2/src/object.h +1 -1
  211. data/vendor/libgit2/src/odb.c +35 -32
  212. data/vendor/libgit2/src/odb.h +1 -1
  213. data/vendor/libgit2/src/odb_loose.c +68 -68
  214. data/vendor/libgit2/src/odb_mempack.c +18 -5
  215. data/vendor/libgit2/src/odb_pack.c +43 -43
  216. data/vendor/libgit2/src/oid.c +11 -4
  217. data/vendor/libgit2/src/oid.h +15 -0
  218. data/vendor/libgit2/src/pack-objects.c +41 -26
  219. data/vendor/libgit2/src/pack-objects.h +11 -6
  220. data/vendor/libgit2/src/pack.c +10 -10
  221. data/vendor/libgit2/src/patch.c +3 -3
  222. data/vendor/libgit2/src/patch.h +1 -0
  223. data/vendor/libgit2/src/patch_generate.c +27 -11
  224. data/vendor/libgit2/src/patch_generate.h +5 -5
  225. data/vendor/libgit2/src/patch_parse.c +24 -24
  226. data/vendor/libgit2/src/path.c +76 -1951
  227. data/vendor/libgit2/src/path.h +34 -741
  228. data/vendor/libgit2/src/pathspec.c +6 -6
  229. data/vendor/libgit2/src/pathspec.h +2 -2
  230. data/vendor/libgit2/src/posix.c +3 -3
  231. data/vendor/libgit2/src/posix.h +1 -0
  232. data/vendor/libgit2/src/pqueue.h +1 -1
  233. data/vendor/libgit2/src/proxy.c +4 -1
  234. data/vendor/libgit2/src/proxy.h +1 -1
  235. data/vendor/libgit2/src/push.c +30 -35
  236. data/vendor/libgit2/src/push.h +4 -16
  237. data/vendor/libgit2/src/rand.c +226 -0
  238. data/vendor/libgit2/src/rand.h +37 -0
  239. data/vendor/libgit2/src/reader.c +8 -8
  240. data/vendor/libgit2/src/reader.h +2 -2
  241. data/vendor/libgit2/src/rebase.c +89 -88
  242. data/vendor/libgit2/src/refdb_fs.c +447 -173
  243. data/vendor/libgit2/src/refs.c +32 -32
  244. data/vendor/libgit2/src/refs.h +2 -2
  245. data/vendor/libgit2/src/refspec.c +32 -37
  246. data/vendor/libgit2/src/refspec.h +5 -2
  247. data/vendor/libgit2/src/regexp.c +1 -1
  248. data/vendor/libgit2/src/remote.c +713 -419
  249. data/vendor/libgit2/src/remote.h +15 -10
  250. data/vendor/libgit2/src/repository.c +350 -467
  251. data/vendor/libgit2/src/repository.h +11 -10
  252. data/vendor/libgit2/src/reset.c +8 -5
  253. data/vendor/libgit2/src/revert.c +10 -10
  254. data/vendor/libgit2/src/revparse.c +48 -35
  255. data/vendor/libgit2/src/revwalk.c +7 -7
  256. data/vendor/libgit2/src/signature.c +12 -6
  257. data/vendor/libgit2/src/signature.h +1 -1
  258. data/vendor/libgit2/src/sortedcache.c +1 -1
  259. data/vendor/libgit2/src/sortedcache.h +1 -1
  260. data/vendor/libgit2/src/stash.c +36 -37
  261. data/vendor/libgit2/src/status.c +4 -1
  262. data/vendor/libgit2/src/{buffer.c → str.c} +157 -151
  263. data/vendor/libgit2/src/str.h +357 -0
  264. data/vendor/libgit2/src/streams/mbedtls.c +8 -6
  265. data/vendor/libgit2/src/streams/openssl_dynamic.h +3 -3
  266. data/vendor/libgit2/src/submodule.c +171 -159
  267. data/vendor/libgit2/src/submodule.h +1 -1
  268. data/vendor/libgit2/src/sysdir.c +68 -52
  269. data/vendor/libgit2/src/sysdir.h +15 -10
  270. data/vendor/libgit2/src/tag.c +29 -27
  271. data/vendor/libgit2/src/thread.h +3 -3
  272. data/vendor/libgit2/src/threadstate.c +3 -3
  273. data/vendor/libgit2/src/threadstate.h +1 -1
  274. data/vendor/libgit2/src/trace.c +1 -14
  275. data/vendor/libgit2/src/trace.h +5 -22
  276. data/vendor/libgit2/src/trailer.c +1 -1
  277. data/vendor/libgit2/src/transaction.c +1 -1
  278. data/vendor/libgit2/src/transport.c +10 -10
  279. data/vendor/libgit2/src/transports/auth.c +7 -9
  280. data/vendor/libgit2/src/transports/auth.h +2 -3
  281. data/vendor/libgit2/src/transports/auth_negotiate.c +12 -13
  282. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -10
  283. data/vendor/libgit2/src/transports/auth_ntlm.h +0 -1
  284. data/vendor/libgit2/src/transports/git.c +9 -11
  285. data/vendor/libgit2/src/transports/http.c +37 -17
  286. data/vendor/libgit2/src/transports/http.h +2 -3
  287. data/vendor/libgit2/src/transports/httpclient.c +65 -65
  288. data/vendor/libgit2/src/transports/local.c +124 -116
  289. data/vendor/libgit2/src/transports/smart.c +51 -139
  290. data/vendor/libgit2/src/transports/smart.h +25 -31
  291. data/vendor/libgit2/src/transports/smart_pkt.c +33 -33
  292. data/vendor/libgit2/src/transports/smart_protocol.c +57 -39
  293. data/vendor/libgit2/src/transports/ssh.c +47 -112
  294. data/vendor/libgit2/src/transports/winhttp.c +50 -56
  295. data/vendor/libgit2/src/tree-cache.c +5 -5
  296. data/vendor/libgit2/src/tree-cache.h +2 -2
  297. data/vendor/libgit2/src/tree.c +59 -48
  298. data/vendor/libgit2/src/tree.h +1 -1
  299. data/vendor/libgit2/src/unix/map.c +0 -2
  300. data/vendor/libgit2/src/unix/posix.h +1 -4
  301. data/vendor/libgit2/src/unix/realpath.c +0 -2
  302. data/vendor/libgit2/src/util.c +14 -14
  303. data/vendor/libgit2/src/util.h +2 -28
  304. data/vendor/libgit2/src/vector.h +1 -1
  305. data/vendor/libgit2/src/win32/findfile.c +172 -116
  306. data/vendor/libgit2/src/win32/findfile.h +7 -4
  307. data/vendor/libgit2/src/win32/path_w32.c +140 -9
  308. data/vendor/libgit2/src/win32/path_w32.h +2 -0
  309. data/vendor/libgit2/src/win32/posix.h +0 -1
  310. data/vendor/libgit2/src/win32/posix_w32.c +11 -27
  311. data/vendor/libgit2/src/win32/w32_buffer.c +2 -3
  312. data/vendor/libgit2/src/win32/w32_buffer.h +2 -3
  313. data/vendor/libgit2/src/win32/w32_leakcheck.c +1 -1
  314. data/vendor/libgit2/src/worktree.c +116 -94
  315. data/vendor/libgit2/src/worktree.h +1 -1
  316. data/vendor/libgit2/src/xdiff/git-xdiff.h +53 -0
  317. data/vendor/libgit2/src/xdiff/xdiff.h +15 -15
  318. data/vendor/libgit2/src/xdiff/xdiffi.c +134 -108
  319. data/vendor/libgit2/src/xdiff/xemit.c +23 -7
  320. data/vendor/libgit2/src/xdiff/xhistogram.c +87 -78
  321. data/vendor/libgit2/src/xdiff/xinclude.h +1 -12
  322. data/vendor/libgit2/src/xdiff/xmerge.c +104 -117
  323. data/vendor/libgit2/src/xdiff/xpatience.c +6 -17
  324. data/vendor/libgit2/src/xdiff/xprepare.c +15 -20
  325. data/vendor/libgit2/src/xdiff/xutils.c +18 -7
  326. data/vendor/libgit2/src/zstream.c +5 -5
  327. data/vendor/libgit2/src/zstream.h +4 -4
  328. metadata +25 -10
  329. data/vendor/libgit2/src/buffer.h +0 -374
@@ -7,9 +7,7 @@
7
7
  #ifndef INCLUDE_unix_posix_h__
8
8
  #define INCLUDE_unix_posix_h__
9
9
 
10
- #ifndef LIBGIT2_NO_FEATURES_H
11
- # include "git2/sys/features.h"
12
- #endif
10
+ #include "common.h"
13
11
 
14
12
  #include <stdio.h>
15
13
  #include <dirent.h>
@@ -60,7 +58,6 @@ GIT_INLINE(int) p_fsync(int fd)
60
58
  #define p_strncasecmp(s1, s2, c) strncasecmp(s1, s2, c)
61
59
  #define p_vsnprintf(b, c, f, a) vsnprintf(b, c, f, a)
62
60
  #define p_snprintf snprintf
63
- #define p_mkstemp(p) mkstemp(p)
64
61
  #define p_chdir(p) chdir(p)
65
62
  #define p_rmdir(p) rmdir(p)
66
63
  #define p_access(p,m) access(p,m)
@@ -7,8 +7,6 @@
7
7
 
8
8
  #include "common.h"
9
9
 
10
- #include "git2/common.h"
11
-
12
10
  #ifndef GIT_WIN32
13
11
 
14
12
  #include <limits.h>
@@ -18,7 +18,7 @@
18
18
  # endif
19
19
  # include <windows.h>
20
20
 
21
- # ifdef HAVE_QSORT_S
21
+ # ifdef GIT_QSORT_S
22
22
  # include <search.h>
23
23
  # endif
24
24
  #endif
@@ -673,7 +673,7 @@ size_t git__unescape(char *str)
673
673
  return (pos - str);
674
674
  }
675
675
 
676
- #if defined(HAVE_QSORT_S) || defined(HAVE_QSORT_R_BSD)
676
+ #if defined(GIT_QSORT_S) || defined(GIT_QSORT_R_BSD)
677
677
  typedef struct {
678
678
  git__sort_r_cmp cmp;
679
679
  void *payload;
@@ -688,9 +688,9 @@ static int GIT_LIBGIT2_CALL git__qsort_r_glue_cmp(
688
688
  #endif
689
689
 
690
690
 
691
- #if !defined(HAVE_QSORT_R_BSD) && \
692
- !defined(HAVE_QSORT_R_GNU) && \
693
- !defined(HAVE_QSORT_S)
691
+ #if !defined(GIT_QSORT_R_BSD) && \
692
+ !defined(GIT_QSORT_R_GNU) && \
693
+ !defined(GIT_QSORT_S)
694
694
  static void swap(uint8_t *a, uint8_t *b, size_t elsize)
695
695
  {
696
696
  char tmp[256];
@@ -721,12 +721,12 @@ static void insertsort(
721
721
  void git__qsort_r(
722
722
  void *els, size_t nel, size_t elsize, git__sort_r_cmp cmp, void *payload)
723
723
  {
724
- #if defined(HAVE_QSORT_R_BSD)
724
+ #if defined(GIT_QSORT_R_BSD)
725
725
  git__qsort_r_glue glue = { cmp, payload };
726
726
  qsort_r(els, nel, elsize, &glue, git__qsort_r_glue_cmp);
727
- #elif defined(HAVE_QSORT_R_GNU)
727
+ #elif defined(GIT_QSORT_R_GNU)
728
728
  qsort_r(els, nel, elsize, cmp, payload);
729
- #elif defined(HAVE_QSORT_S)
729
+ #elif defined(GIT_QSORT_S)
730
730
  git__qsort_r_glue glue = { cmp, payload };
731
731
  qsort_s(els, nel, elsize, git__qsort_r_glue_cmp, &glue);
732
732
  #else
@@ -735,13 +735,13 @@ void git__qsort_r(
735
735
  }
736
736
 
737
737
  #ifdef GIT_WIN32
738
- int git__getenv(git_buf *out, const char *name)
738
+ int git__getenv(git_str *out, const char *name)
739
739
  {
740
740
  wchar_t *wide_name = NULL, *wide_value = NULL;
741
741
  DWORD value_len;
742
742
  int error = -1;
743
743
 
744
- git_buf_clear(out);
744
+ git_str_clear(out);
745
745
 
746
746
  if (git__utf8_to_16_alloc(&wide_name, name) < 0)
747
747
  return -1;
@@ -754,7 +754,7 @@ int git__getenv(git_buf *out, const char *name)
754
754
  }
755
755
 
756
756
  if (value_len)
757
- error = git_buf_put_w(out, wide_value, value_len);
757
+ error = git_str_put_w(out, wide_value, value_len);
758
758
  else if (GetLastError() == ERROR_SUCCESS || GetLastError() == ERROR_ENVVAR_NOT_FOUND)
759
759
  error = GIT_ENOTFOUND;
760
760
  else
@@ -765,16 +765,16 @@ int git__getenv(git_buf *out, const char *name)
765
765
  return error;
766
766
  }
767
767
  #else
768
- int git__getenv(git_buf *out, const char *name)
768
+ int git__getenv(git_str *out, const char *name)
769
769
  {
770
770
  const char *val = getenv(name);
771
771
 
772
- git_buf_clear(out);
772
+ git_str_clear(out);
773
773
 
774
774
  if (!val)
775
775
  return GIT_ENOTFOUND;
776
776
 
777
- return git_buf_puts(out, val);
777
+ return git_str_puts(out, val);
778
778
  }
779
779
  #endif
780
780
 
@@ -7,15 +7,11 @@
7
7
  #ifndef INCLUDE_util_h__
8
8
  #define INCLUDE_util_h__
9
9
 
10
- #include "common.h"
11
-
12
10
  #ifndef GIT_WIN32
13
11
  # include <ctype.h>
14
12
  #endif
15
13
 
16
- #include "git2/buffer.h"
17
-
18
- #include "buffer.h"
14
+ #include "str.h"
19
15
  #include "common.h"
20
16
  #include "strnlen.h"
21
17
  #include "thread.h"
@@ -41,8 +37,6 @@
41
37
  # define GIT_CONTAINER_OF(ptr, type, member) (type *)(ptr)
42
38
  #endif
43
39
 
44
- #define GIT_DATE_RFC2822_SZ 32
45
-
46
40
  /**
47
41
  * Return the length of a constant string.
48
42
  * We are aware that `strlen` performs the same task and is usually
@@ -298,26 +292,6 @@ GIT_INLINE(bool) git__isxdigit(int c)
298
292
  */
299
293
  extern int git__parse_bool(int *out, const char *value);
300
294
 
301
- /*
302
- * Parse a string into a value as a git_time_t.
303
- *
304
- * Sample valid input:
305
- * - "yesterday"
306
- * - "July 17, 2003"
307
- * - "2003-7-17 08:23"
308
- */
309
- extern int git__date_parse(git_time_t *out, const char *date);
310
-
311
- /*
312
- * Format a git_time as a RFC2822 string
313
- *
314
- * @param out buffer to store formatted date; a '\\0' terminator will automatically be added.
315
- * @param len size of the buffer; should be atleast `GIT_DATE_RFC2822_SZ` in size;
316
- * @param date the date to be formatted
317
- * @return 0 if successful; -1 on error
318
- */
319
- extern int git__date_rfc2822_fmt(char *out, size_t len, const git_time *date);
320
-
321
295
  /*
322
296
  * Unescapes a string in-place.
323
297
  *
@@ -402,7 +376,7 @@ GIT_INLINE(double) git__timer(void)
402
376
 
403
377
  #endif
404
378
 
405
- extern int git__getenv(git_buf *out, const char *name);
379
+ extern int git__getenv(git_str *out, const char *name);
406
380
 
407
381
  extern int git__online_cpus(void);
408
382
 
@@ -13,7 +13,7 @@ typedef int (*git_vector_cmp)(const void *, const void *);
13
13
 
14
14
  enum {
15
15
  GIT_VECTOR_SORTED = (1u << 0),
16
- GIT_VECTOR_FLAG_MAX = (1u << 1),
16
+ GIT_VECTOR_FLAG_MAX = (1u << 1)
17
17
  };
18
18
 
19
19
  typedef struct git_vector {
@@ -9,32 +9,22 @@
9
9
 
10
10
  #include "path_w32.h"
11
11
  #include "utf-conv.h"
12
- #include "path.h"
12
+ #include "fs_path.h"
13
13
 
14
- #define REG_MSYSGIT_INSTALL_LOCAL L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
14
+ #define REG_GITFORWINDOWS_KEY L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
15
+ #define REG_GITFORWINDOWS_KEY_WOW64 L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
15
16
 
16
- #ifndef _WIN64
17
- #define REG_MSYSGIT_INSTALL REG_MSYSGIT_INSTALL_LOCAL
18
- #else
19
- #define REG_MSYSGIT_INSTALL L"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Git_is1"
20
- #endif
21
-
22
- typedef struct {
23
- git_win32_path path;
24
- DWORD len;
25
- } _findfile_path;
26
-
27
- static int git_win32__expand_path(_findfile_path *dest, const wchar_t *src)
17
+ static int git_win32__expand_path(git_win32_path dest, const wchar_t *src)
28
18
  {
29
- dest->len = ExpandEnvironmentStringsW(src, dest->path, ARRAY_SIZE(dest->path));
19
+ DWORD len = ExpandEnvironmentStringsW(src, dest, GIT_WIN_PATH_UTF16);
30
20
 
31
- if (!dest->len || dest->len > ARRAY_SIZE(dest->path))
21
+ if (!len || len > GIT_WIN_PATH_UTF16)
32
22
  return -1;
33
23
 
34
24
  return 0;
35
25
  }
36
26
 
37
- static int win32_path_to_8(git_buf *dest, const wchar_t *src)
27
+ static int win32_path_to_8(git_str *dest, const wchar_t *src)
38
28
  {
39
29
  git_win32_utf8_path utf8_path;
40
30
 
@@ -44,155 +34,221 @@ static int win32_path_to_8(git_buf *dest, const wchar_t *src)
44
34
  }
45
35
 
46
36
  /* Convert backslashes to forward slashes */
47
- git_path_mkposix(utf8_path);
37
+ git_fs_path_mkposix(utf8_path);
48
38
 
49
- return git_buf_sets(dest, utf8_path);
39
+ return git_str_sets(dest, utf8_path);
50
40
  }
51
41
 
52
- static wchar_t *win32_walkpath(wchar_t *path, wchar_t *buf, size_t buflen)
53
- {
54
- wchar_t term, *base = path;
55
-
56
- GIT_ASSERT_ARG_WITH_RETVAL(path, NULL);
57
- GIT_ASSERT_ARG_WITH_RETVAL(buf, NULL);
58
- GIT_ASSERT_ARG_WITH_RETVAL(buflen, NULL);
59
-
60
- term = (*path == L'"') ? *path++ : L';';
42
+ static git_win32_path mock_registry;
43
+ static bool mock_registry_set;
61
44
 
62
- for (buflen--; *path && *path != term && buflen; buflen--)
63
- *buf++ = *path++;
64
-
65
- *buf = L'\0'; /* reserved a byte via initial subtract */
45
+ extern int git_win32__set_registry_system_dir(const wchar_t *mock_sysdir)
46
+ {
47
+ if (!mock_sysdir) {
48
+ mock_registry[0] = L'\0';
49
+ mock_registry_set = false;
50
+ } else {
51
+ size_t len = wcslen(mock_sysdir);
52
+
53
+ if (len > GIT_WIN_PATH_MAX) {
54
+ git_error_set(GIT_ERROR_INVALID, "mock path too long");
55
+ return -1;
56
+ }
66
57
 
67
- while (*path == term || *path == L';')
68
- path++;
58
+ wcscpy(mock_registry, mock_sysdir);
59
+ mock_registry_set = true;
60
+ }
69
61
 
70
- return (path != base) ? path : NULL;
62
+ return 0;
71
63
  }
72
64
 
73
- static int win32_find_git_in_path(git_buf *buf, const wchar_t *gitexe, const wchar_t *subdir)
65
+ static int lookup_registry_key(
66
+ git_win32_path out,
67
+ const HKEY hive,
68
+ const wchar_t* key,
69
+ const wchar_t *value)
74
70
  {
75
- wchar_t *env = _wgetenv(L"PATH"), lastch;
76
- _findfile_path root;
77
- size_t gitexe_len = wcslen(gitexe);
71
+ HKEY hkey;
72
+ DWORD type, size;
73
+ int error = GIT_ENOTFOUND;
78
74
 
79
- if (!env)
80
- return -1;
75
+ /*
76
+ * Registry data may not be NUL terminated, provide room to do
77
+ * it ourselves.
78
+ */
79
+ size = (DWORD)((sizeof(git_win32_path) - 1) * sizeof(wchar_t));
80
+
81
+ if (RegOpenKeyExW(hive, key, 0, KEY_READ, &hkey) != 0)
82
+ return GIT_ENOTFOUND;
83
+
84
+ if (RegQueryValueExW(hkey, value, NULL, &type, (LPBYTE)out, &size) == 0 &&
85
+ type == REG_SZ &&
86
+ size > 0 &&
87
+ size < sizeof(git_win32_path)) {
88
+ size_t wsize = size / sizeof(wchar_t);
89
+ size_t len = wsize - 1;
90
+
91
+ if (out[wsize - 1] != L'\0') {
92
+ len = wsize;
93
+ out[wsize] = L'\0';
94
+ }
81
95
 
82
- while ((env = win32_walkpath(env, root.path, MAX_PATH-1)) && *root.path) {
83
- root.len = (DWORD)wcslen(root.path);
84
- lastch = root.path[root.len - 1];
96
+ if (out[len - 1] == L'\\')
97
+ out[len - 1] = L'\0';
85
98
 
86
- /* ensure trailing slash (MAX_PATH-1 to walkpath guarantees space) */
87
- if (lastch != L'/' && lastch != L'\\') {
88
- root.path[root.len++] = L'\\';
89
- root.path[root.len] = L'\0';
90
- }
99
+ if (_waccess(out, F_OK) == 0)
100
+ error = 0;
101
+ }
91
102
 
92
- if (root.len + gitexe_len >= MAX_PATH)
93
- continue;
94
- wcscpy(&root.path[root.len], gitexe);
103
+ RegCloseKey(hkey);
104
+ return error;
105
+ }
95
106
 
96
- if (_waccess(root.path, F_OK) == 0 && root.len > 5) {
97
- /* replace "bin\\" or "cmd\\" with subdir */
98
- wcscpy(&root.path[root.len - 4], subdir);
107
+ static int find_sysdir_in_registry(git_win32_path out)
108
+ {
109
+ if (mock_registry_set) {
110
+ if (mock_registry[0] == L'\0')
111
+ return GIT_ENOTFOUND;
99
112
 
100
- win32_path_to_8(buf, root.path);
101
- return 0;
102
- }
113
+ wcscpy(out, mock_registry);
114
+ return 0;
103
115
  }
104
116
 
105
- return GIT_ENOTFOUND;
117
+ if (lookup_registry_key(out, HKEY_CURRENT_USER, REG_GITFORWINDOWS_KEY, L"InstallLocation") == 0 ||
118
+ lookup_registry_key(out, HKEY_CURRENT_USER, REG_GITFORWINDOWS_KEY_WOW64, L"InstallLocation") == 0 ||
119
+ lookup_registry_key(out, HKEY_LOCAL_MACHINE, REG_GITFORWINDOWS_KEY, L"InstallLocation") == 0 ||
120
+ lookup_registry_key(out, HKEY_LOCAL_MACHINE, REG_GITFORWINDOWS_KEY_WOW64, L"InstallLocation") == 0)
121
+ return 0;
122
+
123
+ return GIT_ENOTFOUND;
106
124
  }
107
125
 
108
- static int win32_find_git_in_registry(
109
- git_buf *buf, const HKEY hive, const wchar_t *key, const wchar_t *subdir)
126
+ static int find_sysdir_in_path(git_win32_path out)
110
127
  {
111
- HKEY hKey;
112
- int error = GIT_ENOTFOUND;
128
+ size_t out_len;
113
129
 
114
- GIT_ASSERT_ARG(buf);
130
+ if (git_win32_path_find_executable(out, L"git.exe") < 0 &&
131
+ git_win32_path_find_executable(out, L"git.cmd") < 0)
132
+ return GIT_ENOTFOUND;
115
133
 
116
- if (!RegOpenKeyExW(hive, key, 0, KEY_READ, &hKey)) {
117
- DWORD dwType, cbData;
118
- git_win32_path path;
134
+ out_len = wcslen(out);
119
135
 
120
- /* Ensure that the buffer is big enough to have the suffix attached
121
- * after we receive the result. */
122
- cbData = (DWORD)(sizeof(path) - wcslen(subdir) * sizeof(wchar_t));
136
+ /* Trim the file name */
137
+ if (out_len <= CONST_STRLEN(L"git.exe"))
138
+ return GIT_ENOTFOUND;
123
139
 
124
- /* InstallLocation points to the root of the git directory */
125
- if (!RegQueryValueExW(hKey, L"InstallLocation", NULL, &dwType, (LPBYTE)path, &cbData) &&
126
- dwType == REG_SZ) {
140
+ out_len -= CONST_STRLEN(L"git.exe");
127
141
 
128
- /* Append the suffix */
129
- wcscat(path, subdir);
142
+ if (out_len && out[out_len - 1] == L'\\')
143
+ out_len--;
130
144
 
131
- /* Convert to UTF-8, with forward slashes, and output the path
132
- * to the provided buffer */
133
- if (!win32_path_to_8(buf, path))
134
- error = 0;
135
- }
145
+ /*
146
+ * Git for Windows usually places the command in a 'bin' or
147
+ * 'cmd' directory, trim that.
148
+ */
149
+ if (out_len >= CONST_STRLEN(L"\\bin") &&
150
+ wcsncmp(&out[out_len - CONST_STRLEN(L"\\bin")], L"\\bin", CONST_STRLEN(L"\\bin")) == 0)
151
+ out_len -= CONST_STRLEN(L"\\bin");
152
+ else if (out_len >= CONST_STRLEN(L"\\cmd") &&
153
+ wcsncmp(&out[out_len - CONST_STRLEN(L"\\cmd")], L"\\cmd", CONST_STRLEN(L"\\cmd")) == 0)
154
+ out_len -= CONST_STRLEN(L"\\cmd");
136
155
 
137
- RegCloseKey(hKey);
138
- }
156
+ if (!out_len)
157
+ return GIT_ENOTFOUND;
139
158
 
140
- return error;
159
+ out[out_len] = L'\0';
160
+ return 0;
141
161
  }
142
162
 
143
163
  static int win32_find_existing_dirs(
144
- git_buf *out, const wchar_t *tmpl[])
164
+ git_str* out,
165
+ const wchar_t* tmpl[])
145
166
  {
146
- _findfile_path path16;
147
- git_buf buf = GIT_BUF_INIT;
167
+ git_win32_path path16;
168
+ git_str buf = GIT_STR_INIT;
148
169
 
149
- git_buf_clear(out);
170
+ git_str_clear(out);
150
171
 
151
172
  for (; *tmpl != NULL; tmpl++) {
152
- if (!git_win32__expand_path(&path16, *tmpl) &&
153
- path16.path[0] != L'%' &&
154
- !_waccess(path16.path, F_OK))
155
- {
156
- win32_path_to_8(&buf, path16.path);
173
+ if (!git_win32__expand_path(path16, *tmpl) &&
174
+ path16[0] != L'%' &&
175
+ !_waccess(path16, F_OK)) {
176
+ win32_path_to_8(&buf, path16);
157
177
 
158
178
  if (buf.size)
159
- git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
179
+ git_str_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
160
180
  }
161
181
  }
162
182
 
163
- git_buf_dispose(&buf);
183
+ git_str_dispose(&buf);
164
184
 
165
- return (git_buf_oom(out) ? -1 : 0);
185
+ return (git_str_oom(out) ? -1 : 0);
166
186
  }
167
187
 
168
- int git_win32__find_system_dirs(git_buf *out, const wchar_t *subdir)
188
+ static int append_subdir(git_str *out, git_str *path, const char *subdir)
169
189
  {
170
- git_buf buf = GIT_BUF_INIT;
190
+ static const char* architecture_roots[] = {
191
+ "",
192
+ "mingw64",
193
+ "mingw32",
194
+ NULL
195
+ };
196
+ const char **root;
197
+ size_t orig_path_len = path->size;
198
+
199
+ for (root = architecture_roots; *root; root++) {
200
+ if ((*root[0] && git_str_joinpath(path, path->ptr, *root) < 0) ||
201
+ git_str_joinpath(path, path->ptr, subdir) < 0)
202
+ return -1;
171
203
 
172
- /* directories where git.exe & git.cmd are found */
173
- if (!win32_find_git_in_path(&buf, L"git.exe", subdir) && buf.size)
174
- git_buf_set(out, buf.ptr, buf.size);
175
- else
176
- git_buf_clear(out);
204
+ if (git_fs_path_exists(path->ptr) &&
205
+ git_str_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, path->ptr) < 0)
206
+ return -1;
177
207
 
178
- if (!win32_find_git_in_path(&buf, L"git.cmd", subdir) && buf.size)
179
- git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
208
+ git_str_truncate(path, orig_path_len);
209
+ }
180
210
 
181
- /* directories where git is installed according to registry */
182
- if (!win32_find_git_in_registry(
183
- &buf, HKEY_CURRENT_USER, REG_MSYSGIT_INSTALL_LOCAL, subdir) && buf.size)
184
- git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
211
+ return 0;
212
+ }
185
213
 
186
- if (!win32_find_git_in_registry(
187
- &buf, HKEY_LOCAL_MACHINE, REG_MSYSGIT_INSTALL, subdir) && buf.size)
188
- git_buf_join(out, GIT_PATH_LIST_SEPARATOR, out->ptr, buf.ptr);
214
+ int git_win32__find_system_dirs(git_str *out, const char *subdir)
215
+ {
216
+ git_win32_path pathdir, regdir;
217
+ git_str path8 = GIT_STR_INIT;
218
+ bool has_pathdir, has_regdir;
219
+ int error;
220
+
221
+ has_pathdir = (find_sysdir_in_path(pathdir) == 0);
222
+ has_regdir = (find_sysdir_in_registry(regdir) == 0);
223
+
224
+ if (!has_pathdir && !has_regdir)
225
+ return 0;
226
+
227
+ /*
228
+ * Usually the git in the path is the same git in the registry,
229
+ * in this case there's no need to duplicate the paths.
230
+ */
231
+ if (has_pathdir && has_regdir && wcscmp(pathdir, regdir) == 0)
232
+ has_regdir = false;
233
+
234
+ if (has_pathdir) {
235
+ if ((error = win32_path_to_8(&path8, pathdir)) < 0 ||
236
+ (error = append_subdir(out, &path8, subdir)) < 0)
237
+ goto done;
238
+ }
189
239
 
190
- git_buf_dispose(&buf);
240
+ if (has_regdir) {
241
+ if ((error = win32_path_to_8(&path8, regdir)) < 0 ||
242
+ (error = append_subdir(out, &path8, subdir)) < 0)
243
+ goto done;
244
+ }
191
245
 
192
- return (git_buf_oom(out) ? -1 : 0);
246
+ done:
247
+ git_str_dispose(&path8);
248
+ return error;
193
249
  }
194
250
 
195
- int git_win32__find_global_dirs(git_buf *out)
251
+ int git_win32__find_global_dirs(git_str *out)
196
252
  {
197
253
  static const wchar_t *global_tmpls[4] = {
198
254
  L"%HOME%\\",
@@ -204,7 +260,7 @@ int git_win32__find_global_dirs(git_buf *out)
204
260
  return win32_find_existing_dirs(out, global_tmpls);
205
261
  }
206
262
 
207
- int git_win32__find_xdg_dirs(git_buf *out)
263
+ int git_win32__find_xdg_dirs(git_str *out)
208
264
  {
209
265
  static const wchar_t *global_tmpls[7] = {
210
266
  L"%XDG_CONFIG_HOME%\\git",
@@ -219,7 +275,7 @@ int git_win32__find_xdg_dirs(git_buf *out)
219
275
  return win32_find_existing_dirs(out, global_tmpls);
220
276
  }
221
277
 
222
- int git_win32__find_programdata_dirs(git_buf *out)
278
+ int git_win32__find_programdata_dirs(git_str *out)
223
279
  {
224
280
  static const wchar_t *programdata_tmpls[2] = {
225
281
  L"%PROGRAMDATA%\\Git",
@@ -10,10 +10,13 @@
10
10
 
11
11
  #include "common.h"
12
12
 
13
- extern int git_win32__find_system_dirs(git_buf *out, const wchar_t *subpath);
14
- extern int git_win32__find_global_dirs(git_buf *out);
15
- extern int git_win32__find_xdg_dirs(git_buf *out);
16
- extern int git_win32__find_programdata_dirs(git_buf *out);
13
+ /** Sets the mock registry root for Git for Windows for testing. */
14
+ extern int git_win32__set_registry_system_dir(const wchar_t *mock_sysdir);
15
+
16
+ extern int git_win32__find_system_dirs(git_str *out, const char *subpath);
17
+ extern int git_win32__find_global_dirs(git_str *out);
18
+ extern int git_win32__find_xdg_dirs(git_str *out);
19
+ extern int git_win32__find_programdata_dirs(git_str *out);
17
20
 
18
21
  #endif
19
22