rugged 1.3.2.3 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -18,6 +18,7 @@
18
18
  #include "sortedcache.h"
19
19
  #include "signature.h"
20
20
  #include "wildmatch.h"
21
+ #include "path.h"
21
22
 
22
23
  #include <git2/tag.h>
23
24
  #include <git2/object.h>
@@ -34,7 +35,7 @@ enum {
34
35
  PACKREF_HAS_PEEL = 1,
35
36
  PACKREF_WAS_LOOSE = 2,
36
37
  PACKREF_CANNOT_PEEL = 4,
37
- PACKREF_SHADOWED = 8,
38
+ PACKREF_SHADOWED = 8
38
39
  };
39
40
 
40
41
  enum {
@@ -64,24 +65,29 @@ typedef struct refdb_fs_backend {
64
65
  git_iterator_flag_t iterator_flags;
65
66
  uint32_t direach_flags;
66
67
  int fsync;
68
+ git_map packed_refs_map;
69
+ git_mutex prlock; /* protect packed_refs_map */
70
+ git_futils_filestamp packed_refs_stamp;
71
+ bool sorted;
67
72
  } refdb_fs_backend;
68
73
 
69
74
  static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name);
75
+ static char *packed_set_peeling_mode(char *data, size_t data_sz, refdb_fs_backend *backend);
70
76
 
71
77
  GIT_INLINE(int) loose_path(
72
- git_buf *out,
78
+ git_str *out,
73
79
  const char *base,
74
80
  const char *refname)
75
81
  {
76
- if (git_buf_joinpath(out, base, refname) < 0)
82
+ if (git_str_joinpath(out, base, refname) < 0)
77
83
  return -1;
78
84
 
79
- return git_path_validate_filesystem_with_suffix(out->ptr, out->size,
85
+ return git_fs_path_validate_str_length_with_suffix(out,
80
86
  CONST_STRLEN(".lock"));
81
87
  }
82
88
 
83
89
  GIT_INLINE(int) reflog_path(
84
- git_buf *out,
90
+ git_str *out,
85
91
  git_repository *repo,
86
92
  const char *refname)
87
93
  {
@@ -91,7 +97,7 @@ GIT_INLINE(int) reflog_path(
91
97
  base = (strcmp(refname, GIT_HEAD_FILE) == 0) ? repo->gitdir :
92
98
  repo->commondir;
93
99
 
94
- if ((error = git_buf_joinpath(out, base, GIT_REFLOG_DIR)) < 0)
100
+ if ((error = git_str_joinpath(out, base, GIT_REFLOG_DIR)) < 0)
95
101
  return error;
96
102
 
97
103
  return loose_path(out, out->ptr, refname);
@@ -106,7 +112,7 @@ static int packref_cmp(const void *a_, const void *b_)
106
112
  static int packed_reload(refdb_fs_backend *backend)
107
113
  {
108
114
  int error;
109
- git_buf packedrefs = GIT_BUF_INIT;
115
+ git_str packedrefs = GIT_STR_INIT;
110
116
  char *scan, *eof, *eol;
111
117
 
112
118
  if (!backend->gitpath)
@@ -133,31 +139,12 @@ static int packed_reload(refdb_fs_backend *backend)
133
139
 
134
140
  GIT_UNUSED(git_sortedcache_clear(backend->refcache, false));
135
141
 
136
- scan = (char *)packedrefs.ptr;
142
+ scan = packedrefs.ptr;
137
143
  eof = scan + packedrefs.size;
138
144
 
139
- backend->peeling_mode = PEELING_NONE;
140
-
141
- if (*scan == '#') {
142
- static const char *traits_header = "# pack-refs with: ";
143
-
144
- if (git__prefixcmp(scan, traits_header) == 0) {
145
- scan += strlen(traits_header);
146
- eol = strchr(scan, '\n');
147
-
148
- if (!eol)
149
- goto parse_failed;
150
- *eol = '\0';
151
-
152
- if (strstr(scan, " fully-peeled ") != NULL) {
153
- backend->peeling_mode = PEELING_FULL;
154
- } else if (strstr(scan, " peeled ") != NULL) {
155
- backend->peeling_mode = PEELING_STANDARD;
156
- }
157
-
158
- scan = eol + 1;
159
- }
160
- }
145
+ scan = packed_set_peeling_mode(scan, packedrefs.size, backend);
146
+ if (!scan)
147
+ goto parse_failed;
161
148
 
162
149
  while (scan < eof && *scan == '#') {
163
150
  if (!(eol = strchr(scan, '\n')))
@@ -212,7 +199,7 @@ static int packed_reload(refdb_fs_backend *backend)
212
199
  }
213
200
 
214
201
  git_sortedcache_wunlock(backend->refcache);
215
- git_buf_dispose(&packedrefs);
202
+ git_str_dispose(&packedrefs);
216
203
 
217
204
  return 0;
218
205
 
@@ -221,17 +208,17 @@ parse_failed:
221
208
 
222
209
  GIT_UNUSED(git_sortedcache_clear(backend->refcache, false));
223
210
  git_sortedcache_wunlock(backend->refcache);
224
- git_buf_dispose(&packedrefs);
211
+ git_str_dispose(&packedrefs);
225
212
 
226
213
  return -1;
227
214
  }
228
215
 
229
216
  static int loose_parse_oid(
230
- git_oid *oid, const char *filename, git_buf *file_content)
217
+ git_oid *oid, const char *filename, git_str *file_content)
231
218
  {
232
- const char *str = git_buf_cstr(file_content);
219
+ const char *str = git_str_cstr(file_content);
233
220
 
234
- if (git_buf_len(file_content) < GIT_OID_HEXSZ)
221
+ if (git_str_len(file_content) < GIT_OID_HEXSZ)
235
222
  goto corrupted;
236
223
 
237
224
  /* we need to get 40 OID characters from the file */
@@ -248,13 +235,13 @@ corrupted:
248
235
  return -1;
249
236
  }
250
237
 
251
- static int loose_readbuffer(git_buf *buf, const char *base, const char *path)
238
+ static int loose_readbuffer(git_str *buf, const char *base, const char *path)
252
239
  {
253
240
  int error;
254
241
 
255
242
  if ((error = loose_path(buf, base, path)) < 0 ||
256
243
  (error = git_futils_readbuffer(buf, buf->ptr)) < 0)
257
- git_buf_dispose(buf);
244
+ git_str_dispose(buf);
258
245
 
259
246
  return error;
260
247
  }
@@ -262,7 +249,7 @@ static int loose_readbuffer(git_buf *buf, const char *base, const char *path)
262
249
  static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name)
263
250
  {
264
251
  int error = 0;
265
- git_buf ref_file = GIT_BUF_INIT;
252
+ git_str ref_file = GIT_STR_INIT;
266
253
  struct packref *ref = NULL;
267
254
  git_oid oid;
268
255
 
@@ -275,7 +262,7 @@ static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name)
275
262
  }
276
263
 
277
264
  /* skip symbolic refs */
278
- if (!git__prefixcmp(git_buf_cstr(&ref_file), GIT_SYMREF))
265
+ if (!git__prefixcmp(git_str_cstr(&ref_file), GIT_SYMREF))
279
266
  goto done;
280
267
 
281
268
  /* parse OID from file */
@@ -295,11 +282,11 @@ static int loose_lookup_to_packfile(refdb_fs_backend *backend, const char *name)
295
282
  git_sortedcache_wunlock(backend->refcache);
296
283
 
297
284
  done:
298
- git_buf_dispose(&ref_file);
285
+ git_str_dispose(&ref_file);
299
286
  return error;
300
287
  }
301
288
 
302
- static int _dirent_loose_load(void *payload, git_buf *full_path)
289
+ static int _dirent_loose_load(void *payload, git_str *full_path)
303
290
  {
304
291
  refdb_fs_backend *backend = payload;
305
292
  const char *file_path;
@@ -307,8 +294,8 @@ static int _dirent_loose_load(void *payload, git_buf *full_path)
307
294
  if (git__suffixcmp(full_path->ptr, ".lock") == 0)
308
295
  return 0;
309
296
 
310
- if (git_path_isdir(full_path->ptr)) {
311
- int error = git_path_direach(
297
+ if (git_fs_path_isdir(full_path->ptr)) {
298
+ int error = git_fs_path_direach(
312
299
  full_path, backend->direach_flags, _dirent_loose_load, backend);
313
300
  /* Race with the filesystem, ignore it */
314
301
  if (error == GIT_ENOTFOUND) {
@@ -333,9 +320,9 @@ static int _dirent_loose_load(void *payload, git_buf *full_path)
333
320
  static int packed_loadloose(refdb_fs_backend *backend)
334
321
  {
335
322
  int error;
336
- git_buf refs_path = GIT_BUF_INIT;
323
+ git_str refs_path = GIT_STR_INIT;
337
324
 
338
- if (git_buf_joinpath(&refs_path, backend->gitpath, GIT_REFS_DIR) < 0)
325
+ if (git_str_joinpath(&refs_path, backend->gitpath, GIT_REFS_DIR) < 0)
339
326
  return -1;
340
327
 
341
328
  /*
@@ -343,10 +330,10 @@ static int packed_loadloose(refdb_fs_backend *backend)
343
330
  * This will overwrite any old packed entries with their
344
331
  * updated loose versions
345
332
  */
346
- error = git_path_direach(
333
+ error = git_fs_path_direach(
347
334
  &refs_path, backend->direach_flags, _dirent_loose_load, backend);
348
335
 
349
- git_buf_dispose(&refs_path);
336
+ git_str_dispose(&refs_path);
350
337
 
351
338
  return error;
352
339
  }
@@ -357,7 +344,7 @@ static int refdb_fs_backend__exists(
357
344
  const char *ref_name)
358
345
  {
359
346
  refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
360
- git_buf ref_path = GIT_BUF_INIT;
347
+ git_str ref_path = GIT_STR_INIT;
361
348
  int error;
362
349
 
363
350
  GIT_ASSERT_ARG(backend);
@@ -367,7 +354,7 @@ static int refdb_fs_backend__exists(
367
354
  if ((error = loose_path(&ref_path, backend->gitpath, ref_name)) < 0)
368
355
  goto out;
369
356
 
370
- if (git_path_isfile(ref_path.ptr)) {
357
+ if (git_fs_path_isfile(ref_path.ptr)) {
371
358
  *exists = 1;
372
359
  goto out;
373
360
  }
@@ -381,18 +368,18 @@ static int refdb_fs_backend__exists(
381
368
  }
382
369
 
383
370
  out:
384
- git_buf_dispose(&ref_path);
371
+ git_str_dispose(&ref_path);
385
372
  return error;
386
373
  }
387
374
 
388
- static const char *loose_parse_symbolic(git_buf *file_content)
375
+ static const char *loose_parse_symbolic(git_str *file_content)
389
376
  {
390
377
  const unsigned int header_len = (unsigned int)strlen(GIT_SYMREF);
391
378
  const char *refname_start;
392
379
 
393
380
  refname_start = (const char *)file_content->ptr;
394
381
 
395
- if (git_buf_len(file_content) < header_len + 1) {
382
+ if (git_str_len(file_content) < header_len + 1) {
396
383
  git_error_set(GIT_ERROR_REFERENCE, "corrupted loose reference file");
397
384
  return NULL;
398
385
  }
@@ -424,7 +411,7 @@ static int loose_lookup(
424
411
  refdb_fs_backend *backend,
425
412
  const char *ref_name)
426
413
  {
427
- git_buf ref_file = GIT_BUF_INIT;
414
+ git_str ref_file = GIT_STR_INIT;
428
415
  int error = 0;
429
416
  const char *ref_dir;
430
417
 
@@ -438,10 +425,10 @@ static int loose_lookup(
438
425
 
439
426
  if ((error = loose_readbuffer(&ref_file, ref_dir, ref_name)) < 0)
440
427
  /* cannot read loose ref file - gah */;
441
- else if (git__prefixcmp(git_buf_cstr(&ref_file), GIT_SYMREF) == 0) {
428
+ else if (git__prefixcmp(git_str_cstr(&ref_file), GIT_SYMREF) == 0) {
442
429
  const char *target;
443
430
 
444
- git_buf_rtrim(&ref_file);
431
+ git_str_rtrim(&ref_file);
445
432
 
446
433
  if (!(target = loose_parse_symbolic(&ref_file)))
447
434
  error = -1;
@@ -455,7 +442,7 @@ static int loose_lookup(
455
442
  *out = git_reference__alloc(ref_name, &oid, NULL);
456
443
  }
457
444
 
458
- git_buf_dispose(&ref_file);
445
+ git_str_dispose(&ref_file);
459
446
  return error;
460
447
  }
461
448
 
@@ -465,10 +452,198 @@ static int ref_error_notfound(const char *name)
465
452
  return GIT_ENOTFOUND;
466
453
  }
467
454
 
468
- static int packed_lookup(
469
- git_reference **out,
470
- refdb_fs_backend *backend,
471
- const char *ref_name)
455
+ static char *packed_set_peeling_mode(
456
+ char *data,
457
+ size_t data_sz,
458
+ refdb_fs_backend *backend)
459
+ {
460
+ static const char *traits_header = "# pack-refs with:";
461
+ char *eol;
462
+ backend->peeling_mode = PEELING_NONE;
463
+
464
+ if (git__prefixncmp(data, data_sz, traits_header) == 0) {
465
+ size_t hdr_sz = strlen(traits_header);
466
+ const char *sorted = " sorted ";
467
+ const char *peeled = " peeled ";
468
+ const char *fully_peeled = " fully-peeled ";
469
+ data += hdr_sz;
470
+ data_sz -= hdr_sz;
471
+
472
+ eol = memchr(data, '\n', data_sz);
473
+
474
+ if (!eol)
475
+ return NULL;
476
+
477
+ if (git__memmem(data, eol - data, fully_peeled, strlen(fully_peeled)))
478
+ backend->peeling_mode = PEELING_FULL;
479
+ else if (git__memmem(data, eol - data, peeled, strlen(peeled)))
480
+ backend->peeling_mode = PEELING_STANDARD;
481
+
482
+ backend->sorted = NULL != git__memmem(data, eol - data, sorted, strlen(sorted));
483
+
484
+ return eol + 1;
485
+ }
486
+ return data;
487
+ }
488
+
489
+ static void packed_map_free(refdb_fs_backend *backend)
490
+ {
491
+ if (backend->packed_refs_map.data) {
492
+ #ifdef GIT_WIN32
493
+ git__free(backend->packed_refs_map.data);
494
+ #else
495
+ git_futils_mmap_free(&backend->packed_refs_map);
496
+ #endif
497
+ backend->packed_refs_map.data = NULL;
498
+ backend->packed_refs_map.len = 0;
499
+ git_futils_filestamp_set(&backend->packed_refs_stamp, NULL);
500
+ }
501
+ }
502
+
503
+ static int packed_map_check(refdb_fs_backend *backend)
504
+ {
505
+ int error = 0;
506
+ git_file fd = -1;
507
+ struct stat st;
508
+
509
+ if ((error = git_mutex_lock(&backend->prlock)) < 0)
510
+ return error;
511
+
512
+ if (backend->packed_refs_map.data &&
513
+ !git_futils_filestamp_check(
514
+ &backend->packed_refs_stamp, backend->refcache->path)) {
515
+ git_mutex_unlock(&backend->prlock);
516
+ return error;
517
+ }
518
+ packed_map_free(backend);
519
+
520
+ fd = git_futils_open_ro(backend->refcache->path);
521
+ if (fd < 0) {
522
+ git_mutex_unlock(&backend->prlock);
523
+ if (fd == GIT_ENOTFOUND) {
524
+ git_error_clear();
525
+ return 0;
526
+ }
527
+ return fd;
528
+ }
529
+
530
+ if (p_fstat(fd, &st) < 0) {
531
+ p_close(fd);
532
+ git_mutex_unlock(&backend->prlock);
533
+ git_error_set(GIT_ERROR_OS, "unable to stat packed-refs '%s'", backend->refcache->path);
534
+ return -1;
535
+ }
536
+
537
+ if (st.st_size == 0) {
538
+ p_close(fd);
539
+ git_mutex_unlock(&backend->prlock);
540
+ return 0;
541
+ }
542
+
543
+ git_futils_filestamp_set_from_stat(&backend->packed_refs_stamp, &st);
544
+
545
+ #ifdef GIT_WIN32
546
+ /* on windows, we copy the entire file into memory rather than using
547
+ * mmap() because using mmap() on windows also locks the file and this
548
+ * map is long-lived. */
549
+ backend->packed_refs_map.len = (size_t)st.st_size;
550
+ backend->packed_refs_map.data =
551
+ git__malloc(backend->packed_refs_map.len);
552
+ GIT_ERROR_CHECK_ALLOC(backend->packed_refs_map.data);
553
+ {
554
+ ssize_t bytesread =
555
+ p_read(fd, backend->packed_refs_map.data,
556
+ backend->packed_refs_map.len);
557
+ error = (bytesread == (ssize_t)backend->packed_refs_map.len) ? 0 : -1;
558
+ }
559
+ #else
560
+ error = git_futils_mmap_ro(&backend->packed_refs_map, fd, 0, (size_t)st.st_size);
561
+ #endif
562
+ p_close(fd);
563
+ if (error < 0) {
564
+ git_mutex_unlock(&backend->prlock);
565
+ return error;
566
+ }
567
+
568
+ packed_set_peeling_mode(
569
+ backend->packed_refs_map.data, backend->packed_refs_map.len,
570
+ backend);
571
+
572
+ git_mutex_unlock(&backend->prlock);
573
+ return error;
574
+ }
575
+
576
+ /*
577
+ * Find beginning of packed-ref record pointed to by p.
578
+ * buf - a lower-bound pointer to some memory buffer
579
+ * p - an upper-bound pointer to the same memory buffer
580
+ */
581
+ static const char *start_of_record(const char *buf, const char *p)
582
+ {
583
+ const char *nl = p;
584
+ while (true) {
585
+ nl = git__memrchr(buf, '\n', nl - buf);
586
+ if (!nl)
587
+ return buf;
588
+
589
+ if (nl[1] == '^' && nl > buf)
590
+ --nl;
591
+ else
592
+ break;
593
+ };
594
+ return nl + 1;
595
+ }
596
+
597
+ /*
598
+ * Find end of packed-ref record pointed to by p.
599
+ * end - an upper-bound pointer to some memory buffer
600
+ * p - a lower-bound pointer to the same memory buffer
601
+ */
602
+ static const char *end_of_record(const char *p, const char *end)
603
+ {
604
+ while (1) {
605
+ size_t sz = end - p;
606
+ p = memchr(p, '\n', sz);
607
+ if (!p)
608
+ return end;
609
+ ++p;
610
+ if (p < end && p[0] == '^')
611
+ ++p;
612
+ else
613
+ break;
614
+ }
615
+ return p;
616
+ }
617
+
618
+ static int
619
+ cmp_record_to_refname(const char *rec, size_t data_end, const char *ref_name)
620
+ {
621
+ const size_t ref_len = strlen(ref_name);
622
+ int cmp_val;
623
+ const char *end;
624
+
625
+ rec += GIT_OID_HEXSZ + 1; /* <oid> + space */
626
+ if (data_end < GIT_OID_HEXSZ + 3) {
627
+ /* an incomplete (corrupt) record is treated as less than ref_name */
628
+ return -1;
629
+ }
630
+ data_end -= GIT_OID_HEXSZ + 1;
631
+
632
+ end = memchr(rec, '\n', data_end);
633
+ if (end)
634
+ data_end = end - rec;
635
+
636
+ cmp_val = memcmp(rec, ref_name, min(ref_len, data_end));
637
+
638
+ if (cmp_val == 0 && data_end != ref_len)
639
+ return (data_end > ref_len) ? 1 : -1;
640
+ return cmp_val;
641
+ }
642
+
643
+ static int packed_unsorted_lookup(
644
+ git_reference **out,
645
+ refdb_fs_backend *backend,
646
+ const char *ref_name)
472
647
  {
473
648
  int error = 0;
474
649
  struct packref *entry;
@@ -493,6 +668,85 @@ static int packed_lookup(
493
668
  return error;
494
669
  }
495
670
 
671
+ static int packed_lookup(
672
+ git_reference **out,
673
+ refdb_fs_backend *backend,
674
+ const char *ref_name)
675
+ {
676
+ int error = 0;
677
+ const char *left, *right, *data_end;
678
+
679
+ if ((error = packed_map_check(backend)) < 0)
680
+ return error;
681
+
682
+ if (!backend->sorted)
683
+ return packed_unsorted_lookup(out, backend, ref_name);
684
+
685
+ left = backend->packed_refs_map.data;
686
+ right = data_end = (const char *) backend->packed_refs_map.data +
687
+ backend->packed_refs_map.len;
688
+
689
+ while (left < right && *left == '#') {
690
+ if (!(left = memchr(left, '\n', data_end - left)))
691
+ goto parse_failed;
692
+ left++;
693
+ }
694
+
695
+ while (left < right) {
696
+ const char *mid, *rec;
697
+ int compare;
698
+
699
+ mid = left + (right - left) / 2;
700
+ rec = start_of_record(left, mid);
701
+ compare = cmp_record_to_refname(rec, data_end - rec, ref_name);
702
+
703
+ if (compare < 0) {
704
+ left = end_of_record(mid, right);
705
+ } else if (compare > 0) {
706
+ right = rec;
707
+ } else {
708
+ const char *eol;
709
+ git_oid oid, peel, *peel_ptr = NULL;
710
+
711
+ if (data_end - rec < GIT_OID_HEXSZ ||
712
+ git_oid_fromstr(&oid, rec) < 0) {
713
+ goto parse_failed;
714
+ }
715
+ rec += GIT_OID_HEXSZ + 1;
716
+ if (!(eol = memchr(rec, '\n', data_end - rec))) {
717
+ goto parse_failed;
718
+ }
719
+
720
+ /* look for optional "^<OID>\n" */
721
+
722
+ if (eol + 1 < data_end) {
723
+ rec = eol + 1;
724
+
725
+ if (*rec == '^') {
726
+ rec++;
727
+ if (data_end - rec < GIT_OID_HEXSZ ||
728
+ git_oid_fromstr(&peel, rec) < 0) {
729
+ goto parse_failed;
730
+ }
731
+ peel_ptr = &peel;
732
+ }
733
+ }
734
+
735
+ *out = git_reference__alloc(ref_name, &oid, peel_ptr);
736
+ if (!*out) {
737
+ return -1;
738
+ }
739
+
740
+ return 0;
741
+ }
742
+ }
743
+ return GIT_ENOTFOUND;
744
+
745
+ parse_failed:
746
+ git_error_set(GIT_ERROR_REFERENCE, "corrupted packed references file");
747
+ return -1;
748
+ }
749
+
496
750
  static int refdb_fs_backend__lookup(
497
751
  git_reference **out,
498
752
  git_refdb_backend *_backend,
@@ -512,7 +766,6 @@ static int refdb_fs_backend__lookup(
512
766
  git_error_clear();
513
767
  error = packed_lookup(out, backend, ref_name);
514
768
  }
515
-
516
769
  return error;
517
770
  }
518
771
 
@@ -542,7 +795,7 @@ static void refdb_fs_backend__iterator_free(git_reference_iterator *_iter)
542
795
  static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
543
796
  {
544
797
  int error = 0;
545
- git_buf path = GIT_BUF_INIT;
798
+ git_str path = GIT_STR_INIT;
546
799
  git_iterator *fsit = NULL;
547
800
  git_iterator_options fsit_opts = GIT_ITERATOR_OPTIONS_INIT;
548
801
  const git_index_entry *entry = NULL;
@@ -578,26 +831,26 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
578
831
  }
579
832
  }
580
833
 
581
- if ((error = git_buf_puts(&path, backend->commonpath)) < 0 ||
582
- (error = git_buf_put(&path, ref_prefix, ref_prefix_len)) < 0) {
583
- git_buf_dispose(&path);
834
+ if ((error = git_str_puts(&path, backend->commonpath)) < 0 ||
835
+ (error = git_str_put(&path, ref_prefix, ref_prefix_len)) < 0) {
836
+ git_str_dispose(&path);
584
837
  return error;
585
838
  }
586
839
 
587
840
  if ((error = git_iterator_for_filesystem(&fsit, path.ptr, &fsit_opts)) < 0) {
588
- git_buf_dispose(&path);
841
+ git_str_dispose(&path);
589
842
  return (iter->glob && error == GIT_ENOTFOUND)? 0 : error;
590
843
  }
591
844
 
592
- error = git_buf_sets(&path, ref_prefix);
845
+ error = git_str_sets(&path, ref_prefix);
593
846
 
594
847
  while (!error && !git_iterator_advance(&entry, fsit)) {
595
848
  const char *ref_name;
596
849
  char *ref_dup;
597
850
 
598
- git_buf_truncate(&path, ref_prefix_len);
599
- git_buf_puts(&path, entry->path);
600
- ref_name = git_buf_cstr(&path);
851
+ git_str_truncate(&path, ref_prefix_len);
852
+ git_str_puts(&path, entry->path);
853
+ ref_name = git_str_cstr(&path);
601
854
 
602
855
  if (git__suffixcmp(ref_name, ".lock") == 0 ||
603
856
  (iter->glob && wildmatch(iter->glob, ref_name, 0) != 0))
@@ -611,7 +864,7 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
611
864
  }
612
865
 
613
866
  git_iterator_free(fsit);
614
- git_buf_dispose(&path);
867
+ git_str_dispose(&path);
615
868
 
616
869
  return error;
617
870
  }
@@ -810,14 +1063,14 @@ static int reference_path_available(
810
1063
  static int loose_lock(git_filebuf *file, refdb_fs_backend *backend, const char *name)
811
1064
  {
812
1065
  int error, filebuf_flags;
813
- git_buf ref_path = GIT_BUF_INIT;
1066
+ git_str ref_path = GIT_STR_INIT;
814
1067
  const char *basedir;
815
1068
 
816
1069
  GIT_ASSERT_ARG(file);
817
1070
  GIT_ASSERT_ARG(backend);
818
1071
  GIT_ASSERT_ARG(name);
819
1072
 
820
- if (!git_path_validate(backend->repo, name, 0, GIT_PATH_REJECT_FILESYSTEM_DEFAULTS)) {
1073
+ if (!git_path_is_valid(backend->repo, name, 0, GIT_FS_PATH_REJECT_FILESYSTEM_DEFAULTS)) {
821
1074
  git_error_set(GIT_ERROR_INVALID, "invalid reference name '%s'", name);
822
1075
  return GIT_EINVALIDSPEC;
823
1076
  }
@@ -845,7 +1098,7 @@ static int loose_lock(git_filebuf *file, refdb_fs_backend *backend, const char *
845
1098
  if (error == GIT_EDIRECTORY)
846
1099
  git_error_set(GIT_ERROR_REFERENCE, "cannot lock ref '%s', there are refs beneath that folder", name);
847
1100
 
848
- git_buf_dispose(&ref_path);
1101
+ git_str_dispose(&ref_path);
849
1102
  return error;
850
1103
  }
851
1104
 
@@ -1013,7 +1266,7 @@ static int packed_remove_loose(refdb_fs_backend *backend)
1013
1266
  {
1014
1267
  size_t i;
1015
1268
  git_filebuf lock = GIT_FILEBUF_INIT;
1016
- git_buf ref_content = GIT_BUF_INIT;
1269
+ git_str ref_content = GIT_STR_INIT;
1017
1270
  int error = 0;
1018
1271
 
1019
1272
  /* backend->refcache is already locked when this is called */
@@ -1034,7 +1287,7 @@ static int packed_remove_loose(refdb_fs_backend *backend)
1034
1287
  continue;
1035
1288
 
1036
1289
  if (error < 0) {
1037
- git_buf_dispose(&ref_content);
1290
+ git_str_dispose(&ref_content);
1038
1291
  git_error_set(GIT_ERROR_REFERENCE, "failed to lock loose reference '%s'", ref->name);
1039
1292
  return error;
1040
1293
  }
@@ -1065,7 +1318,7 @@ static int packed_remove_loose(refdb_fs_backend *backend)
1065
1318
  p_unlink(lock.path_original);
1066
1319
  }
1067
1320
 
1068
- git_buf_dispose(&ref_content);
1321
+ git_str_dispose(&ref_content);
1069
1322
  git_filebuf_cleanup(&lock);
1070
1323
  return 0;
1071
1324
  }
@@ -1080,6 +1333,15 @@ static int packed_write(refdb_fs_backend *backend)
1080
1333
  int error, open_flags = 0;
1081
1334
  size_t i;
1082
1335
 
1336
+ /* take lock and close up packed-refs mmap if open */
1337
+ if ((error = git_mutex_lock(&backend->prlock)) < 0) {
1338
+ return error;
1339
+ }
1340
+
1341
+ packed_map_free(backend);
1342
+
1343
+ git_mutex_unlock(&backend->prlock);
1344
+
1083
1345
  /* lock the cache to updates while we do this */
1084
1346
  if ((error = git_sortedcache_wlock(refcache)) < 0)
1085
1347
  return error;
@@ -1333,41 +1595,41 @@ static int refdb_fs_backend__prune_refs(
1333
1595
  const char *ref_name,
1334
1596
  const char *prefix)
1335
1597
  {
1336
- git_buf relative_path = GIT_BUF_INIT;
1337
- git_buf base_path = GIT_BUF_INIT;
1598
+ git_str relative_path = GIT_STR_INIT;
1599
+ git_str base_path = GIT_STR_INIT;
1338
1600
  size_t commonlen;
1339
1601
  int error;
1340
1602
 
1341
1603
  GIT_ASSERT_ARG(backend);
1342
1604
  GIT_ASSERT_ARG(ref_name);
1343
1605
 
1344
- if ((error = git_buf_sets(&relative_path, ref_name)) < 0)
1606
+ if ((error = git_str_sets(&relative_path, ref_name)) < 0)
1345
1607
  goto cleanup;
1346
1608
 
1347
- git_path_squash_slashes(&relative_path);
1348
- if ((commonlen = git_path_common_dirlen("refs/heads/", git_buf_cstr(&relative_path))) == strlen("refs/heads/") ||
1349
- (commonlen = git_path_common_dirlen("refs/tags/", git_buf_cstr(&relative_path))) == strlen("refs/tags/") ||
1350
- (commonlen = git_path_common_dirlen("refs/remotes/", git_buf_cstr(&relative_path))) == strlen("refs/remotes/")) {
1609
+ git_fs_path_squash_slashes(&relative_path);
1610
+ if ((commonlen = git_fs_path_common_dirlen("refs/heads/", git_str_cstr(&relative_path))) == strlen("refs/heads/") ||
1611
+ (commonlen = git_fs_path_common_dirlen("refs/tags/", git_str_cstr(&relative_path))) == strlen("refs/tags/") ||
1612
+ (commonlen = git_fs_path_common_dirlen("refs/remotes/", git_str_cstr(&relative_path))) == strlen("refs/remotes/")) {
1351
1613
 
1352
- git_buf_truncate(&relative_path, commonlen);
1614
+ git_str_truncate(&relative_path, commonlen);
1353
1615
 
1354
1616
  if (prefix)
1355
- error = git_buf_join3(&base_path, '/',
1617
+ error = git_str_join3(&base_path, '/',
1356
1618
  backend->commonpath, prefix,
1357
- git_buf_cstr(&relative_path));
1619
+ git_str_cstr(&relative_path));
1358
1620
  else
1359
- error = git_buf_joinpath(&base_path,
1621
+ error = git_str_joinpath(&base_path,
1360
1622
  backend->commonpath,
1361
- git_buf_cstr(&relative_path));
1623
+ git_str_cstr(&relative_path));
1362
1624
 
1363
1625
  if (!error)
1364
- error = git_path_validate_filesystem(base_path.ptr, base_path.size);
1626
+ error = git_path_validate_str_length(NULL, &base_path);
1365
1627
 
1366
1628
  if (error < 0)
1367
1629
  goto cleanup;
1368
1630
 
1369
1631
  error = git_futils_rmdir_r(ref_name + commonlen,
1370
- git_buf_cstr(&base_path),
1632
+ git_str_cstr(&base_path),
1371
1633
  GIT_RMDIR_EMPTY_PARENTS | GIT_RMDIR_SKIP_ROOT);
1372
1634
 
1373
1635
  if (error == GIT_ENOTFOUND)
@@ -1375,8 +1637,8 @@ static int refdb_fs_backend__prune_refs(
1375
1637
  }
1376
1638
 
1377
1639
  cleanup:
1378
- git_buf_dispose(&relative_path);
1379
- git_buf_dispose(&base_path);
1640
+ git_str_dispose(&relative_path);
1641
+ git_str_dispose(&base_path);
1380
1642
  return error;
1381
1643
  }
1382
1644
 
@@ -1405,7 +1667,7 @@ static int refdb_fs_backend__delete(
1405
1667
 
1406
1668
  static int loose_delete(refdb_fs_backend *backend, const char *ref_name)
1407
1669
  {
1408
- git_buf path = GIT_BUF_INIT;
1670
+ git_str path = GIT_STR_INIT;
1409
1671
  int error = 0;
1410
1672
 
1411
1673
  if ((error = loose_path(&path, backend->commonpath, ref_name)) < 0)
@@ -1417,7 +1679,7 @@ static int loose_delete(refdb_fs_backend *backend, const char *ref_name)
1417
1679
  else if (error != 0)
1418
1680
  error = -1;
1419
1681
 
1420
- git_buf_dispose(&path);
1682
+ git_str_dispose(&path);
1421
1683
 
1422
1684
  return error;
1423
1685
  }
@@ -1567,6 +1829,12 @@ static void refdb_fs_backend__free(git_refdb_backend *_backend)
1567
1829
  return;
1568
1830
 
1569
1831
  git_sortedcache_free(backend->refcache);
1832
+
1833
+ git_mutex_lock(&backend->prlock);
1834
+ packed_map_free(backend);
1835
+ git_mutex_unlock(&backend->prlock);
1836
+ git_mutex_free(&backend->prlock);
1837
+
1570
1838
  git__free(backend->gitpath);
1571
1839
  git__free(backend->commonpath);
1572
1840
  git__free(backend);
@@ -1574,17 +1842,17 @@ static void refdb_fs_backend__free(git_refdb_backend *_backend)
1574
1842
 
1575
1843
  static char *setup_namespace(git_repository *repo, const char *in)
1576
1844
  {
1577
- git_buf path = GIT_BUF_INIT;
1845
+ git_str path = GIT_STR_INIT;
1578
1846
  char *parts, *start, *end, *out = NULL;
1579
1847
 
1580
1848
  if (!in)
1581
1849
  goto done;
1582
1850
 
1583
- git_buf_puts(&path, in);
1851
+ git_str_puts(&path, in);
1584
1852
 
1585
1853
  /* if the repo is not namespaced, nothing else to do */
1586
1854
  if (repo->namespace == NULL) {
1587
- out = git_buf_detach(&path);
1855
+ out = git_str_detach(&path);
1588
1856
  goto done;
1589
1857
  }
1590
1858
 
@@ -1599,23 +1867,23 @@ static char *setup_namespace(git_repository *repo, const char *in)
1599
1867
  * refs under refs/namespaces/foo/refs/namespaces/bar/
1600
1868
  */
1601
1869
  while ((start = git__strsep(&end, "/")) != NULL)
1602
- git_buf_printf(&path, "refs/namespaces/%s/", start);
1870
+ git_str_printf(&path, "refs/namespaces/%s/", start);
1603
1871
 
1604
- git_buf_printf(&path, "refs/namespaces/%s/refs", end);
1872
+ git_str_printf(&path, "refs/namespaces/%s/refs", end);
1605
1873
  git__free(parts);
1606
1874
 
1607
1875
  /* Make sure that the folder with the namespace exists */
1608
- if (git_futils_mkdir_relative(git_buf_cstr(&path), in, 0777,
1876
+ if (git_futils_mkdir_relative(git_str_cstr(&path), in, 0777,
1609
1877
  GIT_MKDIR_PATH, NULL) < 0)
1610
1878
  goto done;
1611
1879
 
1612
1880
  /* Return root of the namespaced gitpath, i.e. without the trailing 'refs' */
1613
- git_buf_rtruncate_at_char(&path, '/');
1614
- git_buf_putc(&path, '/');
1615
- out = git_buf_detach(&path);
1881
+ git_str_rtruncate_at_char(&path, '/');
1882
+ git_str_putc(&path, '/');
1883
+ out = git_str_detach(&path);
1616
1884
 
1617
1885
  done:
1618
- git_buf_dispose(&path);
1886
+ git_str_dispose(&path);
1619
1887
  return out;
1620
1888
  }
1621
1889
 
@@ -1716,7 +1984,7 @@ static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *
1716
1984
  {
1717
1985
  refdb_fs_backend *backend;
1718
1986
  git_repository *repo;
1719
- git_buf path = GIT_BUF_INIT;
1987
+ git_str path = GIT_STR_INIT;
1720
1988
  int error;
1721
1989
 
1722
1990
  GIT_ASSERT_ARG(_backend && name);
@@ -1727,8 +1995,8 @@ static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *
1727
1995
  if ((error = reflog_path(&path, repo, name)) < 0)
1728
1996
  return error;
1729
1997
 
1730
- error = create_new_reflog_file(git_buf_cstr(&path));
1731
- git_buf_dispose(&path);
1998
+ error = create_new_reflog_file(git_str_cstr(&path));
1999
+ git_str_dispose(&path);
1732
2000
 
1733
2001
  return error;
1734
2002
  }
@@ -1736,15 +2004,15 @@ static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *
1736
2004
  static int has_reflog(git_repository *repo, const char *name)
1737
2005
  {
1738
2006
  int ret = 0;
1739
- git_buf path = GIT_BUF_INIT;
2007
+ git_str path = GIT_STR_INIT;
1740
2008
 
1741
2009
  if (reflog_path(&path, repo, name) < 0)
1742
2010
  goto cleanup;
1743
2011
 
1744
- ret = git_path_isfile(git_buf_cstr(&path));
2012
+ ret = git_fs_path_isfile(git_str_cstr(&path));
1745
2013
 
1746
2014
  cleanup:
1747
- git_buf_dispose(&path);
2015
+ git_str_dispose(&path);
1748
2016
  return ret;
1749
2017
  }
1750
2018
 
@@ -1763,8 +2031,8 @@ static int refdb_reflog_fs__has_log(git_refdb_backend *_backend, const char *nam
1763
2031
  static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend, const char *name)
1764
2032
  {
1765
2033
  int error = -1;
1766
- git_buf log_path = GIT_BUF_INIT;
1767
- git_buf log_file = GIT_BUF_INIT;
2034
+ git_str log_path = GIT_STR_INIT;
2035
+ git_str log_file = GIT_STR_INIT;
1768
2036
  git_reflog *log = NULL;
1769
2037
  git_repository *repo;
1770
2038
  refdb_fs_backend *backend;
@@ -1782,16 +2050,16 @@ static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend,
1782
2050
  if (reflog_path(&log_path, repo, name) < 0)
1783
2051
  goto cleanup;
1784
2052
 
1785
- error = git_futils_readbuffer(&log_file, git_buf_cstr(&log_path));
2053
+ error = git_futils_readbuffer(&log_file, git_str_cstr(&log_path));
1786
2054
  if (error < 0 && error != GIT_ENOTFOUND)
1787
2055
  goto cleanup;
1788
2056
 
1789
2057
  if ((error == GIT_ENOTFOUND) &&
1790
- ((error = create_new_reflog_file(git_buf_cstr(&log_path))) < 0))
2058
+ ((error = create_new_reflog_file(git_str_cstr(&log_path))) < 0))
1791
2059
  goto cleanup;
1792
2060
 
1793
2061
  if ((error = reflog_parse(log,
1794
- git_buf_cstr(&log_file), git_buf_len(&log_file))) < 0)
2062
+ git_str_cstr(&log_file), git_str_len(&log_file))) < 0)
1795
2063
  goto cleanup;
1796
2064
 
1797
2065
  *out = log;
@@ -1801,14 +2069,14 @@ cleanup:
1801
2069
  git_reflog_free(log);
1802
2070
 
1803
2071
  success:
1804
- git_buf_dispose(&log_file);
1805
- git_buf_dispose(&log_path);
2072
+ git_str_dispose(&log_file);
2073
+ git_str_dispose(&log_path);
1806
2074
 
1807
2075
  return error;
1808
2076
  }
1809
2077
 
1810
2078
  static int serialize_reflog_entry(
1811
- git_buf *buf,
2079
+ git_str *buf,
1812
2080
  const git_oid *oid_old,
1813
2081
  const git_oid *oid_new,
1814
2082
  const git_signature *committer,
@@ -1820,43 +2088,43 @@ static int serialize_reflog_entry(
1820
2088
  git_oid_tostr(raw_old, GIT_OID_HEXSZ+1, oid_old);
1821
2089
  git_oid_tostr(raw_new, GIT_OID_HEXSZ+1, oid_new);
1822
2090
 
1823
- git_buf_clear(buf);
2091
+ git_str_clear(buf);
1824
2092
 
1825
- git_buf_puts(buf, raw_old);
1826
- git_buf_putc(buf, ' ');
1827
- git_buf_puts(buf, raw_new);
2093
+ git_str_puts(buf, raw_old);
2094
+ git_str_putc(buf, ' ');
2095
+ git_str_puts(buf, raw_new);
1828
2096
 
1829
2097
  git_signature__writebuf(buf, " ", committer);
1830
2098
 
1831
2099
  /* drop trailing LF */
1832
- git_buf_rtrim(buf);
2100
+ git_str_rtrim(buf);
1833
2101
 
1834
2102
  if (msg) {
1835
2103
  size_t i;
1836
2104
 
1837
- git_buf_putc(buf, '\t');
1838
- git_buf_puts(buf, msg);
2105
+ git_str_putc(buf, '\t');
2106
+ git_str_puts(buf, msg);
1839
2107
 
1840
2108
  for (i = 0; i < buf->size - 2; i++)
1841
2109
  if (buf->ptr[i] == '\n')
1842
2110
  buf->ptr[i] = ' ';
1843
- git_buf_rtrim(buf);
2111
+ git_str_rtrim(buf);
1844
2112
  }
1845
2113
 
1846
- git_buf_putc(buf, '\n');
2114
+ git_str_putc(buf, '\n');
1847
2115
 
1848
- return git_buf_oom(buf);
2116
+ return git_str_oom(buf);
1849
2117
  }
1850
2118
 
1851
2119
  static int lock_reflog(git_filebuf *file, refdb_fs_backend *backend, const char *refname)
1852
2120
  {
1853
2121
  git_repository *repo;
1854
- git_buf log_path = GIT_BUF_INIT;
2122
+ git_str log_path = GIT_STR_INIT;
1855
2123
  int error;
1856
2124
 
1857
2125
  repo = backend->repo;
1858
2126
 
1859
- if (!git_path_validate(backend->repo, refname, 0, GIT_PATH_REJECT_FILESYSTEM_DEFAULTS)) {
2127
+ if (!git_path_is_valid(backend->repo, refname, 0, GIT_FS_PATH_REJECT_FILESYSTEM_DEFAULTS)) {
1860
2128
  git_error_set(GIT_ERROR_INVALID, "invalid reference name '%s'", refname);
1861
2129
  return GIT_EINVALIDSPEC;
1862
2130
  }
@@ -1864,17 +2132,17 @@ static int lock_reflog(git_filebuf *file, refdb_fs_backend *backend, const char
1864
2132
  if (reflog_path(&log_path, repo, refname) < 0)
1865
2133
  return -1;
1866
2134
 
1867
- if (!git_path_isfile(git_buf_cstr(&log_path))) {
2135
+ if (!git_fs_path_isfile(git_str_cstr(&log_path))) {
1868
2136
  git_error_set(GIT_ERROR_INVALID,
1869
2137
  "log file for reference '%s' doesn't exist", refname);
1870
2138
  error = -1;
1871
2139
  goto cleanup;
1872
2140
  }
1873
2141
 
1874
- error = git_filebuf_open(file, git_buf_cstr(&log_path), 0, GIT_REFLOG_FILE_MODE);
2142
+ error = git_filebuf_open(file, git_str_cstr(&log_path), 0, GIT_REFLOG_FILE_MODE);
1875
2143
 
1876
2144
  cleanup:
1877
- git_buf_dispose(&log_path);
2145
+ git_str_dispose(&log_path);
1878
2146
 
1879
2147
  return error;
1880
2148
  }
@@ -1885,7 +2153,7 @@ static int refdb_reflog_fs__write(git_refdb_backend *_backend, git_reflog *reflo
1885
2153
  unsigned int i;
1886
2154
  git_reflog_entry *entry;
1887
2155
  refdb_fs_backend *backend;
1888
- git_buf log = GIT_BUF_INIT;
2156
+ git_str log = GIT_STR_INIT;
1889
2157
  git_filebuf fbuf = GIT_FILEBUF_INIT;
1890
2158
 
1891
2159
  GIT_ASSERT_ARG(_backend);
@@ -1911,7 +2179,7 @@ cleanup:
1911
2179
  git_filebuf_cleanup(&fbuf);
1912
2180
 
1913
2181
  success:
1914
- git_buf_dispose(&log);
2182
+ git_str_dispose(&log);
1915
2183
 
1916
2184
  return error;
1917
2185
  }
@@ -1921,7 +2189,7 @@ static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, co
1921
2189
  {
1922
2190
  int error, is_symbolic, open_flags;
1923
2191
  git_oid old_id = {{0}}, new_id = {{0}};
1924
- git_buf buf = GIT_BUF_INIT, path = GIT_BUF_INIT;
2192
+ git_str buf = GIT_STR_INIT, path = GIT_STR_INIT;
1925
2193
  git_repository *repo = backend->repo;
1926
2194
 
1927
2195
  is_symbolic = ref->type == GIT_REFERENCE_SYMBOLIC;
@@ -1965,7 +2233,7 @@ static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, co
1965
2233
  if ((error = reflog_path(&path, repo, ref->name)) < 0)
1966
2234
  goto cleanup;
1967
2235
 
1968
- if (((error = git_futils_mkpath2file(git_buf_cstr(&path), 0777)) < 0) &&
2236
+ if (((error = git_futils_mkpath2file(git_str_cstr(&path), 0777)) < 0) &&
1969
2237
  (error != GIT_EEXISTS)) {
1970
2238
  goto cleanup;
1971
2239
  }
@@ -1973,11 +2241,11 @@ static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, co
1973
2241
  /* If the new branch matches part of the namespace of a previously deleted branch,
1974
2242
  * there maybe an obsolete/unused directory (or directory hierarchy) in the way.
1975
2243
  */
1976
- if (git_path_isdir(git_buf_cstr(&path))) {
1977
- if ((error = git_futils_rmdir_r(git_buf_cstr(&path), NULL, GIT_RMDIR_SKIP_NONEMPTY)) < 0) {
2244
+ if (git_fs_path_isdir(git_str_cstr(&path))) {
2245
+ if ((error = git_futils_rmdir_r(git_str_cstr(&path), NULL, GIT_RMDIR_SKIP_NONEMPTY)) < 0) {
1978
2246
  if (error == GIT_ENOTFOUND)
1979
2247
  error = 0;
1980
- } else if (git_path_isdir(git_buf_cstr(&path))) {
2248
+ } else if (git_fs_path_isdir(git_str_cstr(&path))) {
1981
2249
  git_error_set(GIT_ERROR_REFERENCE, "cannot create reflog at '%s', there are reflogs beneath that folder",
1982
2250
  ref->name);
1983
2251
  error = GIT_EDIRECTORY;
@@ -1992,11 +2260,11 @@ static int reflog_append(refdb_fs_backend *backend, const git_reference *ref, co
1992
2260
  if (backend->fsync)
1993
2261
  open_flags |= O_FSYNC;
1994
2262
 
1995
- error = git_futils_writebuffer(&buf, git_buf_cstr(&path), open_flags, GIT_REFLOG_FILE_MODE);
2263
+ error = git_futils_writebuffer(&buf, git_str_cstr(&path), open_flags, GIT_REFLOG_FILE_MODE);
1996
2264
 
1997
2265
  cleanup:
1998
- git_buf_dispose(&buf);
1999
- git_buf_dispose(&path);
2266
+ git_str_dispose(&buf);
2267
+ git_str_dispose(&path);
2000
2268
 
2001
2269
  return error;
2002
2270
  }
@@ -2004,10 +2272,10 @@ cleanup:
2004
2272
  static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_name, const char *new_name)
2005
2273
  {
2006
2274
  int error = 0, fd;
2007
- git_buf old_path = GIT_BUF_INIT;
2008
- git_buf new_path = GIT_BUF_INIT;
2009
- git_buf temp_path = GIT_BUF_INIT;
2010
- git_buf normalized = GIT_BUF_INIT;
2275
+ git_str old_path = GIT_STR_INIT;
2276
+ git_str new_path = GIT_STR_INIT;
2277
+ git_str temp_path = GIT_STR_INIT;
2278
+ git_str normalized = GIT_STR_INIT;
2011
2279
  git_repository *repo;
2012
2280
  refdb_fs_backend *backend;
2013
2281
 
@@ -2022,16 +2290,16 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_
2022
2290
  &normalized, new_name, GIT_REFERENCE_FORMAT_ALLOW_ONELEVEL)) < 0)
2023
2291
  return error;
2024
2292
 
2025
- if (git_buf_joinpath(&temp_path, repo->gitdir, GIT_REFLOG_DIR) < 0)
2293
+ if (git_str_joinpath(&temp_path, repo->gitdir, GIT_REFLOG_DIR) < 0)
2026
2294
  return -1;
2027
2295
 
2028
- if ((error = loose_path(&old_path, git_buf_cstr(&temp_path), old_name)) < 0)
2296
+ if ((error = loose_path(&old_path, git_str_cstr(&temp_path), old_name)) < 0)
2029
2297
  return error;
2030
2298
 
2031
- if ((error = loose_path(&new_path, git_buf_cstr(&temp_path), git_buf_cstr(&normalized))) < 0)
2299
+ if ((error = loose_path(&new_path, git_str_cstr(&temp_path), git_str_cstr(&normalized))) < 0)
2032
2300
  return error;
2033
2301
 
2034
- if (!git_path_exists(git_buf_cstr(&old_path))) {
2302
+ if (!git_fs_path_exists(git_str_cstr(&old_path))) {
2035
2303
  error = GIT_ENOTFOUND;
2036
2304
  goto cleanup;
2037
2305
  }
@@ -2043,43 +2311,43 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_
2043
2311
  * - a/b -> a/b/c
2044
2312
  * - a/b/c/d -> a/b/c
2045
2313
  */
2046
- if ((error = loose_path(&temp_path, git_buf_cstr(&temp_path), "temp_reflog")) < 0)
2314
+ if ((error = loose_path(&temp_path, git_str_cstr(&temp_path), "temp_reflog")) < 0)
2047
2315
  return error;
2048
2316
 
2049
- if ((fd = git_futils_mktmp(&temp_path, git_buf_cstr(&temp_path), GIT_REFLOG_FILE_MODE)) < 0) {
2317
+ if ((fd = git_futils_mktmp(&temp_path, git_str_cstr(&temp_path), GIT_REFLOG_FILE_MODE)) < 0) {
2050
2318
  error = -1;
2051
2319
  goto cleanup;
2052
2320
  }
2053
2321
 
2054
2322
  p_close(fd);
2055
2323
 
2056
- if (p_rename(git_buf_cstr(&old_path), git_buf_cstr(&temp_path)) < 0) {
2324
+ if (p_rename(git_str_cstr(&old_path), git_str_cstr(&temp_path)) < 0) {
2057
2325
  git_error_set(GIT_ERROR_OS, "failed to rename reflog for %s", new_name);
2058
2326
  error = -1;
2059
2327
  goto cleanup;
2060
2328
  }
2061
2329
 
2062
- if (git_path_isdir(git_buf_cstr(&new_path)) &&
2063
- (git_futils_rmdir_r(git_buf_cstr(&new_path), NULL, GIT_RMDIR_SKIP_NONEMPTY) < 0)) {
2330
+ if (git_fs_path_isdir(git_str_cstr(&new_path)) &&
2331
+ (git_futils_rmdir_r(git_str_cstr(&new_path), NULL, GIT_RMDIR_SKIP_NONEMPTY) < 0)) {
2064
2332
  error = -1;
2065
2333
  goto cleanup;
2066
2334
  }
2067
2335
 
2068
- if (git_futils_mkpath2file(git_buf_cstr(&new_path), GIT_REFLOG_DIR_MODE) < 0) {
2336
+ if (git_futils_mkpath2file(git_str_cstr(&new_path), GIT_REFLOG_DIR_MODE) < 0) {
2069
2337
  error = -1;
2070
2338
  goto cleanup;
2071
2339
  }
2072
2340
 
2073
- if (p_rename(git_buf_cstr(&temp_path), git_buf_cstr(&new_path)) < 0) {
2341
+ if (p_rename(git_str_cstr(&temp_path), git_str_cstr(&new_path)) < 0) {
2074
2342
  git_error_set(GIT_ERROR_OS, "failed to rename reflog for %s", new_name);
2075
2343
  error = -1;
2076
2344
  }
2077
2345
 
2078
2346
  cleanup:
2079
- git_buf_dispose(&temp_path);
2080
- git_buf_dispose(&old_path);
2081
- git_buf_dispose(&new_path);
2082
- git_buf_dispose(&normalized);
2347
+ git_str_dispose(&temp_path);
2348
+ git_str_dispose(&old_path);
2349
+ git_str_dispose(&new_path);
2350
+ git_str_dispose(&normalized);
2083
2351
 
2084
2352
  return error;
2085
2353
  }
@@ -2087,7 +2355,7 @@ cleanup:
2087
2355
  static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name)
2088
2356
  {
2089
2357
  refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
2090
- git_buf path = GIT_BUF_INIT;
2358
+ git_str path = GIT_STR_INIT;
2091
2359
  int error;
2092
2360
 
2093
2361
  GIT_ASSERT_ARG(_backend);
@@ -2096,7 +2364,7 @@ static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name
2096
2364
  if ((error = reflog_path(&path, backend->repo, name)) < 0)
2097
2365
  goto out;
2098
2366
 
2099
- if (!git_path_exists(path.ptr))
2367
+ if (!git_fs_path_exists(path.ptr))
2100
2368
  goto out;
2101
2369
 
2102
2370
  if ((error = p_unlink(path.ptr)) < 0)
@@ -2105,7 +2373,7 @@ static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name
2105
2373
  error = refdb_fs_backend__prune_refs(backend, name, GIT_REFLOG_DIR);
2106
2374
 
2107
2375
  out:
2108
- git_buf_dispose(&path);
2376
+ git_str_dispose(&path);
2109
2377
 
2110
2378
  return error;
2111
2379
  }
@@ -2115,11 +2383,16 @@ int git_refdb_backend_fs(
2115
2383
  git_repository *repository)
2116
2384
  {
2117
2385
  int t = 0;
2118
- git_buf gitpath = GIT_BUF_INIT;
2386
+ git_str gitpath = GIT_STR_INIT;
2119
2387
  refdb_fs_backend *backend;
2120
2388
 
2121
2389
  backend = git__calloc(1, sizeof(refdb_fs_backend));
2122
2390
  GIT_ERROR_CHECK_ALLOC(backend);
2391
+ if (git_mutex_init(&backend->prlock) < 0) {
2392
+ git__free(backend);
2393
+ return -1;
2394
+ }
2395
+
2123
2396
 
2124
2397
  if (git_refdb_init_backend(&backend->parent, GIT_REFDB_BACKEND_VERSION) < 0)
2125
2398
  goto fail;
@@ -2140,21 +2413,21 @@ int git_refdb_backend_fs(
2140
2413
  goto fail;
2141
2414
  }
2142
2415
 
2143
- if (git_buf_joinpath(&gitpath, backend->commonpath, GIT_PACKEDREFS_FILE) < 0 ||
2416
+ if (git_str_joinpath(&gitpath, backend->commonpath, GIT_PACKEDREFS_FILE) < 0 ||
2144
2417
  git_sortedcache_new(
2145
2418
  &backend->refcache, offsetof(struct packref, name),
2146
- NULL, NULL, packref_cmp, git_buf_cstr(&gitpath)) < 0)
2419
+ NULL, NULL, packref_cmp, git_str_cstr(&gitpath)) < 0)
2147
2420
  goto fail;
2148
2421
 
2149
- git_buf_dispose(&gitpath);
2422
+ git_str_dispose(&gitpath);
2150
2423
 
2151
2424
  if (!git_repository__configmap_lookup(&t, backend->repo, GIT_CONFIGMAP_IGNORECASE) && t) {
2152
2425
  backend->iterator_flags |= GIT_ITERATOR_IGNORE_CASE;
2153
- backend->direach_flags |= GIT_PATH_DIR_IGNORE_CASE;
2426
+ backend->direach_flags |= GIT_FS_PATH_DIR_IGNORE_CASE;
2154
2427
  }
2155
2428
  if (!git_repository__configmap_lookup(&t, backend->repo, GIT_CONFIGMAP_PRECOMPOSE) && t) {
2156
2429
  backend->iterator_flags |= GIT_ITERATOR_PRECOMPOSE_UNICODE;
2157
- backend->direach_flags |= GIT_PATH_DIR_PRECOMPOSE_UNICODE;
2430
+ backend->direach_flags |= GIT_FS_PATH_DIR_PRECOMPOSE_UNICODE;
2158
2431
  }
2159
2432
  if ((!git_repository__configmap_lookup(&t, backend->repo, GIT_CONFIGMAP_FSYNCOBJECTFILES) && t) ||
2160
2433
  git_repository__fsync_gitdir)
@@ -2182,7 +2455,8 @@ int git_refdb_backend_fs(
2182
2455
  return 0;
2183
2456
 
2184
2457
  fail:
2185
- git_buf_dispose(&gitpath);
2458
+ git_mutex_free(&backend->prlock);
2459
+ git_str_dispose(&gitpath);
2186
2460
  git__free(backend->gitpath);
2187
2461
  git__free(backend->commonpath);
2188
2462
  git__free(backend);