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
@@ -10,11 +10,15 @@
10
10
  #include "runtime.h"
11
11
  #include "strmap.h"
12
12
  #include "hash.h"
13
+ #include "rand.h"
14
+
13
15
  #include <ctype.h>
14
16
  #if GIT_WIN32
15
17
  #include "win32/findfile.h"
16
18
  #endif
17
19
 
20
+ #define GIT_FILEMODE_DEFAULT 0100666
21
+
18
22
  int git_futils_mkpath2file(const char *file_path, const mode_t mode)
19
23
  {
20
24
  return git_futils_mkdir(
@@ -22,32 +26,31 @@ int git_futils_mkpath2file(const char *file_path, const mode_t mode)
22
26
  GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR);
23
27
  }
24
28
 
25
- int git_futils_mktmp(git_buf *path_out, const char *filename, mode_t mode)
29
+ int git_futils_mktmp(git_str *path_out, const char *filename, mode_t mode)
26
30
  {
31
+ const int open_flags = O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_CLOEXEC;
32
+ unsigned int tries = 32;
27
33
  int fd;
28
- mode_t mask;
29
-
30
- p_umask(mask = p_umask(0));
31
34
 
32
- git_buf_sets(path_out, filename);
33
- git_buf_puts(path_out, "_git2_XXXXXX");
35
+ while (tries--) {
36
+ uint64_t rand = git_rand_next();
34
37
 
35
- if (git_buf_oom(path_out))
36
- return -1;
38
+ git_str_sets(path_out, filename);
39
+ git_str_puts(path_out, "_git2_");
40
+ git_str_encode_hexstr(path_out, (void *)&rand, sizeof(uint64_t));
37
41
 
38
- if ((fd = p_mkstemp(path_out->ptr)) < 0) {
39
- git_error_set(GIT_ERROR_OS,
40
- "failed to create temporary file '%s'", path_out->ptr);
41
- return -1;
42
- }
42
+ if (git_str_oom(path_out))
43
+ return -1;
43
44
 
44
- if (p_chmod(path_out->ptr, (mode & ~mask))) {
45
- git_error_set(GIT_ERROR_OS,
46
- "failed to set permissions on file '%s'", path_out->ptr);
47
- return -1;
45
+ /* Note that we open with O_CREAT | O_EXCL */
46
+ if ((fd = p_open(path_out->ptr, open_flags, mode)) >= 0)
47
+ return fd;
48
48
  }
49
49
 
50
- return fd;
50
+ git_error_set(GIT_ERROR_OS,
51
+ "failed to create temporary file '%s'", path_out->ptr);
52
+ git_str_dispose(path_out);
53
+ return -1;
51
54
  }
52
55
 
53
56
  int git_futils_creat_withpath(const char *path, const mode_t dirmode, const mode_t mode)
@@ -99,7 +102,7 @@ int git_futils_open_ro(const char *path)
99
102
  {
100
103
  int fd = p_open(path, O_RDONLY);
101
104
  if (fd < 0)
102
- return git_path_set_error(errno, path, "open");
105
+ return git_fs_path_set_error(errno, path, "open");
103
106
  return fd;
104
107
  }
105
108
 
@@ -107,7 +110,7 @@ int git_futils_truncate(const char *path, int mode)
107
110
  {
108
111
  int fd = p_open(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, mode);
109
112
  if (fd < 0)
110
- return git_path_set_error(errno, path, "open");
113
+ return git_fs_path_set_error(errno, path, "open");
111
114
 
112
115
  close(fd);
113
116
  return 0;
@@ -145,12 +148,12 @@ mode_t git_futils_canonical_mode(mode_t raw_mode)
145
148
  return 0;
146
149
  }
147
150
 
148
- int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len)
151
+ int git_futils_readbuffer_fd(git_str *buf, git_file fd, size_t len)
149
152
  {
150
153
  ssize_t read_size = 0;
151
154
  size_t alloc_len;
152
155
 
153
- git_buf_clear(buf);
156
+ git_str_clear(buf);
154
157
 
155
158
  if (!git__is_ssizet(len)) {
156
159
  git_error_set(GIT_ERROR_INVALID, "read too large");
@@ -158,7 +161,7 @@ int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len)
158
161
  }
159
162
 
160
163
  GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, len, 1);
161
- if (git_buf_grow(buf, alloc_len) < 0)
164
+ if (git_str_grow(buf, alloc_len) < 0)
162
165
  return -1;
163
166
 
164
167
  /* p_read loops internally to read len bytes */
@@ -166,7 +169,7 @@ int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len)
166
169
 
167
170
  if (read_size != (ssize_t)len) {
168
171
  git_error_set(GIT_ERROR_OS, "failed to read descriptor");
169
- git_buf_dispose(buf);
172
+ git_str_dispose(buf);
170
173
  return -1;
171
174
  }
172
175
 
@@ -177,13 +180,16 @@ int git_futils_readbuffer_fd(git_buf *buf, git_file fd, size_t len)
177
180
  }
178
181
 
179
182
  int git_futils_readbuffer_updated(
180
- git_buf *out, const char *path, git_oid *checksum, int *updated)
183
+ git_str *out,
184
+ const char *path,
185
+ unsigned char checksum[GIT_HASH_SHA1_SIZE],
186
+ int *updated)
181
187
  {
182
188
  int error;
183
189
  git_file fd;
184
190
  struct stat st;
185
- git_buf buf = GIT_BUF_INIT;
186
- git_oid checksum_new;
191
+ git_str buf = GIT_STR_INIT;
192
+ unsigned char checksum_new[GIT_HASH_SHA1_SIZE];
187
193
 
188
194
  GIT_ASSERT_ARG(out);
189
195
  GIT_ASSERT_ARG(path && *path);
@@ -192,7 +198,7 @@ int git_futils_readbuffer_updated(
192
198
  *updated = 0;
193
199
 
194
200
  if (p_stat(path, &st) < 0)
195
- return git_path_set_error(errno, path, "stat");
201
+ return git_fs_path_set_error(errno, path, "stat");
196
202
 
197
203
 
198
204
  if (S_ISDIR(st.st_mode)) {
@@ -216,23 +222,23 @@ int git_futils_readbuffer_updated(
216
222
  p_close(fd);
217
223
 
218
224
  if (checksum) {
219
- if ((error = git_hash_buf(&checksum_new, buf.ptr, buf.size)) < 0) {
220
- git_buf_dispose(&buf);
225
+ if ((error = git_hash_buf(checksum_new, buf.ptr, buf.size, GIT_HASH_ALGORITHM_SHA1)) < 0) {
226
+ git_str_dispose(&buf);
221
227
  return error;
222
228
  }
223
229
 
224
230
  /*
225
231
  * If we were given a checksum, we only want to use it if it's different
226
232
  */
227
- if (!git_oid__cmp(checksum, &checksum_new)) {
228
- git_buf_dispose(&buf);
233
+ if (!memcmp(checksum, checksum_new, GIT_HASH_SHA1_SIZE)) {
234
+ git_str_dispose(&buf);
229
235
  if (updated)
230
236
  *updated = 0;
231
237
 
232
238
  return 0;
233
239
  }
234
240
 
235
- git_oid_cpy(checksum, &checksum_new);
241
+ memcpy(checksum, checksum_new, GIT_HASH_SHA1_SIZE);
236
242
  }
237
243
 
238
244
  /*
@@ -241,19 +247,19 @@ int git_futils_readbuffer_updated(
241
247
  if (updated != NULL)
242
248
  *updated = 1;
243
249
 
244
- git_buf_swap(out, &buf);
245
- git_buf_dispose(&buf);
250
+ git_str_swap(out, &buf);
251
+ git_str_dispose(&buf);
246
252
 
247
253
  return 0;
248
254
  }
249
255
 
250
- int git_futils_readbuffer(git_buf *buf, const char *path)
256
+ int git_futils_readbuffer(git_str *buf, const char *path)
251
257
  {
252
258
  return git_futils_readbuffer_updated(buf, path, NULL, NULL);
253
259
  }
254
260
 
255
261
  int git_futils_writebuffer(
256
- const git_buf *buf, const char *path, int flags, mode_t mode)
262
+ const git_str *buf, const char *path, int flags, mode_t mode)
257
263
  {
258
264
  int fd, do_fsync = 0, error = 0;
259
265
 
@@ -266,14 +272,14 @@ int git_futils_writebuffer(
266
272
  flags &= ~O_FSYNC;
267
273
 
268
274
  if (!mode)
269
- mode = GIT_FILEMODE_BLOB;
275
+ mode = GIT_FILEMODE_DEFAULT;
270
276
 
271
277
  if ((fd = p_open(path, flags, mode)) < 0) {
272
278
  git_error_set(GIT_ERROR_OS, "could not open '%s' for writing", path);
273
279
  return fd;
274
280
  }
275
281
 
276
- if ((error = p_write(fd, git_buf_cstr(buf), git_buf_len(buf))) < 0) {
282
+ if ((error = p_write(fd, git_str_cstr(buf), git_str_len(buf))) < 0) {
277
283
  git_error_set(GIT_ERROR_OS, "could not write to '%s'", path);
278
284
  (void)p_close(fd);
279
285
  return error;
@@ -415,7 +421,7 @@ GIT_INLINE(int) mkdir_validate_mode(
415
421
  }
416
422
 
417
423
  GIT_INLINE(int) mkdir_canonicalize(
418
- git_buf *path,
424
+ git_str *path,
419
425
  uint32_t flags)
420
426
  {
421
427
  ssize_t root_len;
@@ -426,7 +432,7 @@ GIT_INLINE(int) mkdir_canonicalize(
426
432
  }
427
433
 
428
434
  /* Trim trailing slashes (except the root) */
429
- if ((root_len = git_path_root(path->ptr)) < 0)
435
+ if ((root_len = git_fs_path_root(path->ptr)) < 0)
430
436
  root_len = 0;
431
437
  else
432
438
  root_len++;
@@ -436,18 +442,18 @@ GIT_INLINE(int) mkdir_canonicalize(
436
442
 
437
443
  /* if we are not supposed to made the last element, truncate it */
438
444
  if ((flags & GIT_MKDIR_SKIP_LAST2) != 0) {
439
- git_path_dirname_r(path, path->ptr);
445
+ git_fs_path_dirname_r(path, path->ptr);
440
446
  flags |= GIT_MKDIR_SKIP_LAST;
441
447
  }
442
448
  if ((flags & GIT_MKDIR_SKIP_LAST) != 0) {
443
- git_path_dirname_r(path, path->ptr);
449
+ git_fs_path_dirname_r(path, path->ptr);
444
450
  }
445
451
 
446
452
  /* We were either given the root path (or trimmed it to
447
453
  * the root), we don't have anything to do.
448
454
  */
449
455
  if (path->size <= (size_t)root_len)
450
- git_buf_clear(path);
456
+ git_str_clear(path);
451
457
 
452
458
  return 0;
453
459
  }
@@ -457,20 +463,20 @@ int git_futils_mkdir(
457
463
  mode_t mode,
458
464
  uint32_t flags)
459
465
  {
460
- git_buf make_path = GIT_BUF_INIT, parent_path = GIT_BUF_INIT;
466
+ git_str make_path = GIT_STR_INIT, parent_path = GIT_STR_INIT;
461
467
  const char *relative;
462
468
  struct git_futils_mkdir_options opts = { 0 };
463
469
  struct stat st;
464
470
  size_t depth = 0;
465
471
  int len = 0, root_len, error;
466
472
 
467
- if ((error = git_buf_puts(&make_path, path)) < 0 ||
473
+ if ((error = git_str_puts(&make_path, path)) < 0 ||
468
474
  (error = mkdir_canonicalize(&make_path, flags)) < 0 ||
469
- (error = git_buf_puts(&parent_path, make_path.ptr)) < 0 ||
475
+ (error = git_str_puts(&parent_path, make_path.ptr)) < 0 ||
470
476
  make_path.size == 0)
471
477
  goto done;
472
478
 
473
- root_len = git_path_root(make_path.ptr);
479
+ root_len = git_fs_path_root(make_path.ptr);
474
480
 
475
481
  /* find the first parent directory that exists. this will be used
476
482
  * as the base to dirname_relative.
@@ -489,7 +495,7 @@ int git_futils_mkdir(
489
495
  depth++;
490
496
 
491
497
  /* examine the parent of the current path */
492
- if ((len = git_path_dirname_r(&parent_path, parent_path.ptr)) < 0) {
498
+ if ((len = git_fs_path_dirname_r(&parent_path, parent_path.ptr)) < 0) {
493
499
  error = len;
494
500
  goto done;
495
501
  }
@@ -538,8 +544,8 @@ int git_futils_mkdir(
538
544
  parent_path.size ? parent_path.ptr : NULL, mode, flags, &opts);
539
545
 
540
546
  done:
541
- git_buf_dispose(&make_path);
542
- git_buf_dispose(&parent_path);
547
+ git_str_dispose(&make_path);
548
+ git_str_dispose(&parent_path);
543
549
  return error;
544
550
  }
545
551
 
@@ -555,7 +561,7 @@ int git_futils_mkdir_relative(
555
561
  uint32_t flags,
556
562
  struct git_futils_mkdir_options *opts)
557
563
  {
558
- git_buf make_path = GIT_BUF_INIT;
564
+ git_str make_path = GIT_STR_INIT;
559
565
  ssize_t root = 0, min_root_len;
560
566
  char lastch = '/', *tail;
561
567
  struct stat st;
@@ -566,7 +572,7 @@ int git_futils_mkdir_relative(
566
572
  opts = &empty_opts;
567
573
 
568
574
  /* build path and find "root" where we should start calling mkdir */
569
- if (git_path_join_unrooted(&make_path, relative_path, base, &root) < 0)
575
+ if (git_fs_path_join_unrooted(&make_path, relative_path, base, &root) < 0)
570
576
  return -1;
571
577
 
572
578
  if ((error = mkdir_canonicalize(&make_path, flags)) < 0 ||
@@ -575,10 +581,10 @@ int git_futils_mkdir_relative(
575
581
 
576
582
  /* if we are not supposed to make the whole path, reset root */
577
583
  if ((flags & GIT_MKDIR_PATH) == 0)
578
- root = git_buf_rfind(&make_path, '/');
584
+ root = git_str_rfind(&make_path, '/');
579
585
 
580
586
  /* advance root past drive name or network mount prefix */
581
- min_root_len = git_path_root(make_path.ptr);
587
+ min_root_len = git_fs_path_root(make_path.ptr);
582
588
  if (root < min_root_len)
583
589
  root = min_root_len;
584
590
  while (root >= 0 && make_path.ptr[root] == '/')
@@ -670,7 +676,7 @@ retry_lstat:
670
676
  }
671
677
 
672
678
  done:
673
- git_buf_dispose(&make_path);
679
+ git_str_dispose(&make_path);
674
680
  return error;
675
681
  }
676
682
 
@@ -694,13 +700,13 @@ static int futils__error_cannot_rmdir(const char *path, const char *filemsg)
694
700
  return -1;
695
701
  }
696
702
 
697
- static int futils__rm_first_parent(git_buf *path, const char *ceiling)
703
+ static int futils__rm_first_parent(git_str *path, const char *ceiling)
698
704
  {
699
705
  int error = GIT_ENOTFOUND;
700
706
  struct stat st;
701
707
 
702
708
  while (error == GIT_ENOTFOUND) {
703
- git_buf_rtruncate_at_char(path, '/');
709
+ git_str_rtruncate_at_char(path, '/');
704
710
 
705
711
  if (!path->size || git__prefixcmp(path->ptr, ceiling) != 0)
706
712
  error = 0;
@@ -719,7 +725,7 @@ static int futils__rm_first_parent(git_buf *path, const char *ceiling)
719
725
  return error;
720
726
  }
721
727
 
722
- static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path)
728
+ static int futils__rmdir_recurs_foreach(void *opaque, git_str *path)
723
729
  {
724
730
  int error = 0;
725
731
  futils__rmdir_data *data = opaque;
@@ -741,13 +747,13 @@ static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path)
741
747
  path->ptr, "parent is not directory");
742
748
  }
743
749
  else
744
- error = git_path_set_error(errno, path->ptr, "rmdir");
750
+ error = git_fs_path_set_error(errno, path->ptr, "rmdir");
745
751
  }
746
752
 
747
753
  else if (S_ISDIR(st.st_mode)) {
748
754
  data->depth++;
749
755
 
750
- error = git_path_direach(path, 0, futils__rmdir_recurs_foreach, data);
756
+ error = git_fs_path_direach(path, 0, futils__rmdir_recurs_foreach, data);
751
757
 
752
758
  data->depth--;
753
759
 
@@ -762,13 +768,13 @@ static int futils__rmdir_recurs_foreach(void *opaque, git_buf *path)
762
768
  (errno == ENOTEMPTY || errno == EEXIST || errno == EBUSY))
763
769
  error = 0;
764
770
  else
765
- error = git_path_set_error(errno, path->ptr, "rmdir");
771
+ error = git_fs_path_set_error(errno, path->ptr, "rmdir");
766
772
  }
767
773
  }
768
774
 
769
775
  else if ((data->flags & GIT_RMDIR_REMOVE_FILES) != 0) {
770
776
  if (p_unlink(path->ptr) < 0)
771
- error = git_path_set_error(errno, path->ptr, "remove");
777
+ error = git_fs_path_set_error(errno, path->ptr, "remove");
772
778
  }
773
779
 
774
780
  else if ((data->flags & GIT_RMDIR_SKIP_NONEMPTY) == 0)
@@ -792,11 +798,11 @@ static int futils__rmdir_empty_parent(void *opaque, const char *path)
792
798
  /* do nothing */
793
799
  } else if ((data->flags & GIT_RMDIR_SKIP_NONEMPTY) == 0 &&
794
800
  en == EBUSY) {
795
- error = git_path_set_error(errno, path, "rmdir");
801
+ error = git_fs_path_set_error(errno, path, "rmdir");
796
802
  } else if (en == ENOTEMPTY || en == EEXIST || en == EBUSY) {
797
803
  error = GIT_ITEROVER;
798
804
  } else {
799
- error = git_path_set_error(errno, path, "rmdir");
805
+ error = git_fs_path_set_error(errno, path, "rmdir");
800
806
  }
801
807
  }
802
808
 
@@ -807,11 +813,11 @@ int git_futils_rmdir_r(
807
813
  const char *path, const char *base, uint32_t flags)
808
814
  {
809
815
  int error;
810
- git_buf fullpath = GIT_BUF_INIT;
816
+ git_str fullpath = GIT_STR_INIT;
811
817
  futils__rmdir_data data;
812
818
 
813
819
  /* build path and find "root" where we should start calling mkdir */
814
- if (git_path_join_unrooted(&fullpath, path, base, NULL) < 0)
820
+ if (git_fs_path_join_unrooted(&fullpath, path, base, NULL) < 0)
815
821
  return -1;
816
822
 
817
823
  memset(&data, 0, sizeof(data));
@@ -823,7 +829,7 @@ int git_futils_rmdir_r(
823
829
 
824
830
  /* remove now-empty parents if requested */
825
831
  if (!error && (flags & GIT_RMDIR_EMPTY_PARENTS) != 0)
826
- error = git_path_walk_up(
832
+ error = git_fs_path_walk_up(
827
833
  &fullpath, base, futils__rmdir_empty_parent, &data);
828
834
 
829
835
  if (error == GIT_ITEROVER) {
@@ -831,7 +837,7 @@ int git_futils_rmdir_r(
831
837
  error = 0;
832
838
  }
833
839
 
834
- git_buf_dispose(&fullpath);
840
+ git_str_dispose(&fullpath);
835
841
 
836
842
  return error;
837
843
  }
@@ -884,7 +890,7 @@ int git_futils_cp(const char *from, const char *to, mode_t filemode)
884
890
 
885
891
  if ((ofd = p_open(to, O_WRONLY | O_CREAT | O_EXCL, filemode)) < 0) {
886
892
  p_close(ifd);
887
- return git_path_set_error(errno, to, "open for writing");
893
+ return git_fs_path_set_error(errno, to, "open for writing");
888
894
  }
889
895
 
890
896
  return cp_by_fd(ifd, ofd, true);
@@ -900,7 +906,7 @@ int git_futils_touch(const char *path, time_t *when)
900
906
 
901
907
  ret = p_utimes(path, times);
902
908
 
903
- return (ret < 0) ? git_path_set_error(errno, path, "touch") : 0;
909
+ return (ret < 0) ? git_fs_path_set_error(errno, path, "touch") : 0;
904
910
  }
905
911
 
906
912
  static int cp_link(const char *from, const char *to, size_t link_size)
@@ -935,7 +941,7 @@ static int cp_link(const char *from, const char *to, size_t link_size)
935
941
 
936
942
  typedef struct {
937
943
  const char *to_root;
938
- git_buf to;
944
+ git_str to;
939
945
  ssize_t from_prefix;
940
946
  uint32_t flags;
941
947
  uint32_t mkdir_flags;
@@ -944,7 +950,7 @@ typedef struct {
944
950
 
945
951
  #define GIT_CPDIR__MKDIR_DONE_FOR_TO_ROOT (1u << 10)
946
952
 
947
- static int _cp_r_mkdir(cp_r_info *info, git_buf *from)
953
+ static int _cp_r_mkdir(cp_r_info *info, git_str *from)
948
954
  {
949
955
  int error = 0;
950
956
 
@@ -966,7 +972,7 @@ static int _cp_r_mkdir(cp_r_info *info, git_buf *from)
966
972
  return error;
967
973
  }
968
974
 
969
- static int _cp_r_callback(void *ref, git_buf *from)
975
+ static int _cp_r_callback(void *ref, git_str *from)
970
976
  {
971
977
  int error = 0;
972
978
  cp_r_info *info = ref;
@@ -974,14 +980,14 @@ static int _cp_r_callback(void *ref, git_buf *from)
974
980
  bool exists = false;
975
981
 
976
982
  if ((info->flags & GIT_CPDIR_COPY_DOTFILES) == 0 &&
977
- from->ptr[git_path_basename_offset(from)] == '.')
983
+ from->ptr[git_fs_path_basename_offset(from)] == '.')
978
984
  return 0;
979
985
 
980
- if ((error = git_buf_joinpath(
986
+ if ((error = git_str_joinpath(
981
987
  &info->to, info->to_root, from->ptr + info->from_prefix)) < 0)
982
988
  return error;
983
989
 
984
- if (!(error = git_path_lstat(info->to.ptr, &to_st)))
990
+ if (!(error = git_fs_path_lstat(info->to.ptr, &to_st)))
985
991
  exists = true;
986
992
  else if (error != GIT_ENOTFOUND)
987
993
  return error;
@@ -990,7 +996,7 @@ static int _cp_r_callback(void *ref, git_buf *from)
990
996
  error = 0;
991
997
  }
992
998
 
993
- if ((error = git_path_lstat(from->ptr, &from_st)) < 0)
999
+ if ((error = git_fs_path_lstat(from->ptr, &from_st)) < 0)
994
1000
  return error;
995
1001
 
996
1002
  if (S_ISDIR(from_st.st_mode)) {
@@ -1006,7 +1012,7 @@ static int _cp_r_callback(void *ref, git_buf *from)
1006
1012
 
1007
1013
  /* recurse onto target directory */
1008
1014
  if (!error && (!exists || S_ISDIR(to_st.st_mode)))
1009
- error = git_path_direach(from, 0, _cp_r_callback, info);
1015
+ error = git_fs_path_direach(from, 0, _cp_r_callback, info);
1010
1016
 
1011
1017
  if (oldmode != 0)
1012
1018
  info->dirmode = oldmode;
@@ -1061,10 +1067,10 @@ int git_futils_cp_r(
1061
1067
  mode_t dirmode)
1062
1068
  {
1063
1069
  int error;
1064
- git_buf path = GIT_BUF_INIT;
1070
+ git_str path = GIT_STR_INIT;
1065
1071
  cp_r_info info;
1066
1072
 
1067
- if (git_buf_joinpath(&path, from, "") < 0) /* ensure trailing slash */
1073
+ if (git_str_joinpath(&path, from, "") < 0) /* ensure trailing slash */
1068
1074
  return -1;
1069
1075
 
1070
1076
  memset(&info, 0, sizeof(info));
@@ -1072,7 +1078,7 @@ int git_futils_cp_r(
1072
1078
  info.flags = flags;
1073
1079
  info.dirmode = dirmode;
1074
1080
  info.from_prefix = path.size;
1075
- git_buf_init(&info.to, 0);
1081
+ git_str_init(&info.to, 0);
1076
1082
 
1077
1083
  /* precalculate mkdir flags */
1078
1084
  if ((flags & GIT_CPDIR_CREATE_EMPTY_DIRS) == 0) {
@@ -1090,8 +1096,8 @@ int git_futils_cp_r(
1090
1096
 
1091
1097
  error = _cp_r_callback(&info, &path);
1092
1098
 
1093
- git_buf_dispose(&path);
1094
- git_buf_dispose(&info.to);
1099
+ git_str_dispose(&path);
1100
+ git_str_dispose(&info.to);
1095
1101
 
1096
1102
  return error;
1097
1103
  }
@@ -1179,7 +1185,7 @@ int git_futils_fsync_parent(const char *path)
1179
1185
  char *parent;
1180
1186
  int error;
1181
1187
 
1182
- if ((parent = git_path_dirname(path)) == NULL)
1188
+ if ((parent = git_fs_path_dirname(path)) == NULL)
1183
1189
  return -1;
1184
1190
 
1185
1191
  error = git_futils_fsync_dir(parent);
@@ -11,20 +11,23 @@
11
11
 
12
12
  #include "map.h"
13
13
  #include "posix.h"
14
- #include "path.h"
14
+ #include "fs_path.h"
15
15
  #include "pool.h"
16
16
  #include "strmap.h"
17
- #include "oid.h"
17
+ #include "hash.h"
18
18
 
19
19
  /**
20
20
  * Filebuffer methods
21
21
  *
22
22
  * Read whole files into an in-memory buffer for processing
23
23
  */
24
- extern int git_futils_readbuffer(git_buf *obj, const char *path);
24
+ extern int git_futils_readbuffer(git_str *obj, const char *path);
25
25
  extern int git_futils_readbuffer_updated(
26
- git_buf *obj, const char *path, git_oid *checksum, int *updated);
27
- extern int git_futils_readbuffer_fd(git_buf *obj, git_file fd, size_t len);
26
+ git_str *obj,
27
+ const char *path,
28
+ unsigned char checksum[GIT_HASH_SHA1_SIZE],
29
+ int *updated);
30
+ extern int git_futils_readbuffer_fd(git_str *obj, git_file fd, size_t len);
28
31
 
29
32
  /* Additional constants for `git_futils_writebuffer`'s `open_flags`. We
30
33
  * support these internally and they will be removed before the `open` call.
@@ -34,7 +37,7 @@ extern int git_futils_readbuffer_fd(git_buf *obj, git_file fd, size_t len);
34
37
  #endif
35
38
 
36
39
  extern int git_futils_writebuffer(
37
- const git_buf *buf, const char *path, int open_flags, mode_t mode);
40
+ const git_str *buf, const char *path, int open_flags, mode_t mode);
38
41
 
39
42
  /**
40
43
  * File utils
@@ -93,7 +96,7 @@ typedef enum {
93
96
  GIT_MKDIR_SKIP_LAST2 = 32,
94
97
  GIT_MKDIR_VERIFY_DIR = 64,
95
98
  GIT_MKDIR_REMOVE_FILES = 128,
96
- GIT_MKDIR_REMOVE_SYMLINKS = 256,
99
+ GIT_MKDIR_REMOVE_SYMLINKS = 256
97
100
  } git_futils_mkdir_flags;
98
101
 
99
102
  struct git_futils_mkdir_perfdata
@@ -156,7 +159,7 @@ typedef enum {
156
159
  GIT_RMDIR_SKIP_NONEMPTY = (1 << 1),
157
160
  GIT_RMDIR_EMPTY_PARENTS = (1 << 2),
158
161
  GIT_RMDIR_REMOVE_BLOCKERS = (1 << 3),
159
- GIT_RMDIR_SKIP_ROOT = (1 << 4),
162
+ GIT_RMDIR_SKIP_ROOT = (1 << 4)
160
163
  } git_futils_rmdir_flags;
161
164
 
162
165
  /**
@@ -170,11 +173,20 @@ typedef enum {
170
173
  extern int git_futils_rmdir_r(const char *path, const char *base, uint32_t flags);
171
174
 
172
175
  /**
173
- * Create and open a temporary file with a `_git2_` suffix.
174
- * Writes the filename into path_out.
176
+ * Create and open a temporary file with a `_git2_` suffix in a
177
+ * protected directory; the file created will created will honor
178
+ * the current `umask`. Writes the filename into path_out.
179
+ *
180
+ * This function uses a high-quality PRNG seeded by the system's
181
+ * entropy pool _where available_ and falls back to a simple seed
182
+ * (time plus system information) when not. This is suitable for
183
+ * writing within a protected directory, but the system's safe
184
+ * temporary file creation functions should be preferred where
185
+ * available when writing into world-writable (temp) directories.
186
+ *
175
187
  * @return On success, an open file descriptor, else an error code < 0.
176
188
  */
177
- extern int git_futils_mktmp(git_buf *path_out, const char *filename, mode_t mode);
189
+ extern int git_futils_mktmp(git_str *path_out, const char *filename, mode_t mode);
178
190
 
179
191
  /**
180
192
  * Move a file on the filesystem, create the
@@ -221,17 +233,17 @@ typedef enum {
221
233
  GIT_CPDIR_OVERWRITE = (1u << 3),
222
234
  GIT_CPDIR_CHMOD_DIRS = (1u << 4),
223
235
  GIT_CPDIR_SIMPLE_TO_MODE = (1u << 5),
224
- GIT_CPDIR_LINK_FILES = (1u << 6),
236
+ GIT_CPDIR_LINK_FILES = (1u << 6)
225
237
  } git_futils_cpdir_flags;
226
238
 
227
239
  /**
228
240
  * Copy a directory tree.
229
241
  *
230
242
  * This copies directories and files from one root to another. You can
231
- * pass a combinationof GIT_CPDIR flags as defined above.
243
+ * pass a combination of GIT_CPDIR flags as defined above.
232
244
  *
233
245
  * If you pass the CHMOD flag, then the dirmode will be applied to all
234
- * directories that are created during the copy, overiding the natural
246
+ * directories that are created during the copy, overriding the natural
235
247
  * permissions. If you do not pass the CHMOD flag, then the dirmode
236
248
  * will actually be copied from the source files and the `dirmode` arg
237
249
  * will be ignored.
@@ -36,10 +36,10 @@ int git_hash_sha1_update(git_hash_sha1_ctx *ctx, const void *data, size_t len)
36
36
  return 0;
37
37
  }
38
38
 
39
- int git_hash_sha1_final(git_oid *out, git_hash_sha1_ctx *ctx)
39
+ int git_hash_sha1_final(unsigned char *out, git_hash_sha1_ctx *ctx)
40
40
  {
41
41
  GIT_ASSERT_ARG(ctx);
42
- if (SHA1DCFinal(out->id, &ctx->c)) {
42
+ if (SHA1DCFinal(out, &ctx->c)) {
43
43
  git_error_set(GIT_ERROR_SHA1, "SHA1 collision attack detected");
44
44
  return -1;
45
45
  }
@@ -49,9 +49,9 @@ int git_hash_sha1_update(git_hash_sha1_ctx *ctx, const void *_data, size_t len)
49
49
  return 0;
50
50
  }
51
51
 
52
- int git_hash_sha1_final(git_oid *out, git_hash_sha1_ctx *ctx)
52
+ int git_hash_sha1_final(unsigned char *out, git_hash_sha1_ctx *ctx)
53
53
  {
54
54
  GIT_ASSERT_ARG(ctx);
55
- CC_SHA1_Final(out->id, &ctx->c);
55
+ CC_SHA1_Final(out, &ctx->c);
56
56
  return 0;
57
57
  }