rugged 1.3.2 → 1.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (547) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +34 -2
  3. data/ext/rugged/extconf.rb +7 -4
  4. data/ext/rugged/rugged.c +16 -0
  5. data/ext/rugged/rugged.h +4 -0
  6. data/ext/rugged/rugged_blame.c +2 -0
  7. data/ext/rugged/rugged_blob.c +3 -0
  8. data/ext/rugged/rugged_commit.c +1 -0
  9. data/ext/rugged/rugged_config.c +9 -2
  10. data/ext/rugged/rugged_diff.c +1 -0
  11. data/ext/rugged/rugged_index.c +2 -0
  12. data/ext/rugged/rugged_patch.c +1 -0
  13. data/ext/rugged/rugged_rebase.c +1 -0
  14. data/ext/rugged/rugged_reference.c +1 -0
  15. data/ext/rugged/rugged_remote.c +28 -10
  16. data/ext/rugged/rugged_repo.c +7 -9
  17. data/ext/rugged/rugged_revwalk.c +5 -1
  18. data/ext/rugged/rugged_settings.c +5 -0
  19. data/ext/rugged/rugged_submodule.c +1 -0
  20. data/ext/rugged/rugged_tag.c +1 -0
  21. data/ext/rugged/rugged_tree.c +4 -0
  22. data/lib/rugged/index.rb +1 -1
  23. data/lib/rugged/tree.rb +5 -1
  24. data/lib/rugged/version.rb +1 -1
  25. data/vendor/libgit2/CMakeLists.txt +132 -288
  26. data/vendor/libgit2/COPYING +106 -19
  27. data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
  28. data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
  29. data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
  30. data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
  31. data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
  32. data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
  33. data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
  34. data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
  35. data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
  36. data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
  37. data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
  38. data/vendor/libgit2/cmake/FindPCRE.cmake +12 -13
  39. data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
  40. data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
  41. data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
  42. data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
  43. data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
  44. data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
  45. data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
  46. data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
  47. data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
  48. data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
  49. data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
  50. data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
  51. data/vendor/libgit2/cmake/SelectHashes.cmake +91 -53
  52. data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
  53. data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
  54. data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
  55. data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
  56. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
  57. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +33 -31
  58. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
  59. data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
  60. data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
  61. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
  62. data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
  63. data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
  64. data/vendor/libgit2/deps/zlib/adler32.c +7 -0
  65. data/vendor/libgit2/deps/zlib/crc32.c +975 -288
  66. data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
  67. data/vendor/libgit2/deps/zlib/deflate.c +83 -31
  68. data/vendor/libgit2/deps/zlib/deflate.h +12 -15
  69. data/vendor/libgit2/deps/zlib/gzguts.h +3 -2
  70. data/vendor/libgit2/deps/zlib/infback.c +2 -1
  71. data/vendor/libgit2/deps/zlib/inffast.c +14 -14
  72. data/vendor/libgit2/deps/zlib/inflate.c +39 -8
  73. data/vendor/libgit2/deps/zlib/inflate.h +3 -2
  74. data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
  75. data/vendor/libgit2/deps/zlib/trees.c +27 -48
  76. data/vendor/libgit2/deps/zlib/zlib.h +126 -100
  77. data/vendor/libgit2/deps/zlib/zutil.c +2 -2
  78. data/vendor/libgit2/deps/zlib/zutil.h +12 -9
  79. data/vendor/libgit2/include/git2/apply.h +16 -2
  80. data/vendor/libgit2/include/git2/attr.h +11 -2
  81. data/vendor/libgit2/include/git2/blame.h +4 -1
  82. data/vendor/libgit2/include/git2/blob.h +14 -1
  83. data/vendor/libgit2/include/git2/branch.h +4 -2
  84. data/vendor/libgit2/include/git2/buffer.h +18 -78
  85. data/vendor/libgit2/include/git2/cert.h +2 -2
  86. data/vendor/libgit2/include/git2/checkout.h +5 -2
  87. data/vendor/libgit2/include/git2/clone.h +3 -3
  88. data/vendor/libgit2/include/git2/commit.h +2 -0
  89. data/vendor/libgit2/include/git2/common.h +28 -7
  90. data/vendor/libgit2/include/git2/config.h +25 -9
  91. data/vendor/libgit2/include/git2/credential.h +2 -1
  92. data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
  93. data/vendor/libgit2/include/git2/deprecated.h +9 -1
  94. data/vendor/libgit2/include/git2/describe.h +7 -2
  95. data/vendor/libgit2/include/git2/diff.h +18 -10
  96. data/vendor/libgit2/include/git2/email.h +1 -1
  97. data/vendor/libgit2/include/git2/errors.h +17 -3
  98. data/vendor/libgit2/include/git2/experimental.h +20 -0
  99. data/vendor/libgit2/include/git2/filter.h +7 -2
  100. data/vendor/libgit2/include/git2/graph.h +1 -0
  101. data/vendor/libgit2/include/git2/ignore.h +1 -1
  102. data/vendor/libgit2/include/git2/index.h +11 -5
  103. data/vendor/libgit2/include/git2/indexer.h +48 -0
  104. data/vendor/libgit2/include/git2/merge.h +24 -4
  105. data/vendor/libgit2/include/git2/message.h +2 -0
  106. data/vendor/libgit2/include/git2/object.h +49 -0
  107. data/vendor/libgit2/include/git2/odb.h +94 -13
  108. data/vendor/libgit2/include/git2/odb_backend.h +107 -19
  109. data/vendor/libgit2/include/git2/oid.h +115 -15
  110. data/vendor/libgit2/include/git2/pack.h +24 -8
  111. data/vendor/libgit2/include/git2/patch.h +8 -0
  112. data/vendor/libgit2/include/git2/pathspec.h +1 -1
  113. data/vendor/libgit2/include/git2/proxy.h +1 -1
  114. data/vendor/libgit2/include/git2/rebase.h +9 -1
  115. data/vendor/libgit2/include/git2/refdb.h +3 -0
  116. data/vendor/libgit2/include/git2/reflog.h +1 -1
  117. data/vendor/libgit2/include/git2/refs.h +2 -2
  118. data/vendor/libgit2/include/git2/remote.h +184 -37
  119. data/vendor/libgit2/include/git2/repository.h +34 -10
  120. data/vendor/libgit2/include/git2/reset.h +2 -2
  121. data/vendor/libgit2/include/git2/revparse.h +1 -1
  122. data/vendor/libgit2/include/git2/revwalk.h +4 -1
  123. data/vendor/libgit2/include/git2/signature.h +1 -1
  124. data/vendor/libgit2/include/git2/stash.h +61 -7
  125. data/vendor/libgit2/include/git2/status.h +14 -5
  126. data/vendor/libgit2/include/git2/strarray.h +0 -13
  127. data/vendor/libgit2/include/git2/submodule.h +7 -2
  128. data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
  129. data/vendor/libgit2/include/git2/sys/odb_backend.h +3 -6
  130. data/vendor/libgit2/include/git2/sys/remote.h +46 -0
  131. data/vendor/libgit2/include/git2/sys/stream.h +1 -1
  132. data/vendor/libgit2/include/git2/sys/transport.h +46 -39
  133. data/vendor/libgit2/include/git2/tag.h +1 -0
  134. data/vendor/libgit2/include/git2/tree.h +4 -3
  135. data/vendor/libgit2/include/git2/types.h +7 -7
  136. data/vendor/libgit2/include/git2/version.h +27 -6
  137. data/vendor/libgit2/include/git2/worktree.h +12 -2
  138. data/vendor/libgit2/include/git2.h +1 -0
  139. data/vendor/libgit2/src/CMakeLists.txt +177 -419
  140. data/vendor/libgit2/src/README.md +12 -0
  141. data/vendor/libgit2/src/cli/CMakeLists.txt +57 -0
  142. data/vendor/libgit2/src/cli/README.md +26 -0
  143. data/vendor/libgit2/src/cli/cli.h +20 -0
  144. data/vendor/libgit2/src/cli/cmd.c +21 -0
  145. data/vendor/libgit2/src/cli/cmd.h +33 -0
  146. data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
  147. data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
  148. data/vendor/libgit2/src/cli/cmd_hash_object.c +154 -0
  149. data/vendor/libgit2/src/cli/cmd_help.c +86 -0
  150. data/vendor/libgit2/src/cli/error.h +51 -0
  151. data/vendor/libgit2/src/cli/main.c +106 -0
  152. data/vendor/libgit2/src/cli/opt.c +669 -0
  153. data/vendor/libgit2/src/cli/opt.h +349 -0
  154. data/vendor/libgit2/src/cli/opt_usage.c +194 -0
  155. data/vendor/libgit2/src/cli/opt_usage.h +35 -0
  156. data/vendor/libgit2/src/cli/progress.c +345 -0
  157. data/vendor/libgit2/src/cli/progress.h +117 -0
  158. data/vendor/libgit2/src/cli/sighandler.h +20 -0
  159. data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
  160. data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
  161. data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
  162. data/vendor/libgit2/src/libgit2/CMakeLists.txt +141 -0
  163. data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +1 -1
  164. data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +2 -2
  165. data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +18 -18
  166. data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +2 -2
  167. data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +18 -18
  168. data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +18 -18
  169. data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +4 -4
  170. data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +18 -13
  171. data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +2 -0
  172. data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +1 -1
  173. data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +38 -29
  174. data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +3 -3
  175. data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +164 -118
  176. data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +15 -3
  177. data/vendor/libgit2/src/libgit2/buf.c +126 -0
  178. data/vendor/libgit2/src/libgit2/buf.h +50 -0
  179. data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +74 -68
  180. data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +13 -13
  181. data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +96 -67
  182. data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +178 -73
  183. data/vendor/libgit2/src/libgit2/commit.h +87 -0
  184. data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +122 -89
  185. data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +14 -4
  186. data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +7 -4
  187. data/vendor/libgit2/src/libgit2/common.h +55 -0
  188. data/vendor/libgit2/src/{config.c → libgit2/config.c} +101 -69
  189. data/vendor/libgit2/src/{config.h → libgit2/config.h} +15 -2
  190. data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +105 -93
  191. data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +9 -9
  192. data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +27 -23
  193. data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +24 -21
  194. data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +35 -27
  195. data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +30 -9
  196. data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +2 -4
  197. data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +34 -36
  198. data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +3 -3
  199. data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +44 -26
  200. data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +47 -18
  201. data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +5 -3
  202. data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +112 -100
  203. data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +40 -29
  204. data/vendor/libgit2/src/libgit2/diff_stats.h +18 -0
  205. data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +13 -8
  206. data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +4 -8
  207. data/vendor/libgit2/src/{email.c → libgit2/email.c} +55 -39
  208. data/vendor/libgit2/src/{email.h → libgit2/email.h} +1 -1
  209. data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +18 -18
  210. data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
  211. data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
  212. data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +72 -27
  213. data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +1 -1
  214. data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +23 -23
  215. data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +127 -53
  216. data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +26 -5
  217. data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +20 -20
  218. data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +35 -34
  219. data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +2 -2
  220. data/vendor/libgit2/src/{index.c → libgit2/index.c} +91 -90
  221. data/vendor/libgit2/src/{index.h → libgit2/index.h} +6 -3
  222. data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +173 -92
  223. data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +71 -61
  224. data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +5 -5
  225. data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +46 -11
  226. data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +38 -36
  227. data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +30 -30
  228. data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +1 -14
  229. data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +2 -2
  230. data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +13 -3
  231. data/vendor/libgit2/src/{message.c → libgit2/message.c} +21 -10
  232. data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +112 -92
  233. data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +5 -4
  234. data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +15 -12
  235. data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +5 -2
  236. data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +1 -2
  237. data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +1 -1
  238. data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +25 -34
  239. data/vendor/libgit2/src/{object.c → libgit2/object.c} +135 -30
  240. data/vendor/libgit2/src/{object.h → libgit2/object.h} +12 -3
  241. data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +228 -81
  242. data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +44 -5
  243. data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +192 -134
  244. data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +18 -5
  245. data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +137 -85
  246. data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +136 -90
  247. data/vendor/libgit2/src/libgit2/oid.h +273 -0
  248. data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
  249. data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +56 -30
  250. data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +11 -6
  251. data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +114 -84
  252. data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +31 -16
  253. data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +4 -3
  254. data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +3 -3
  255. data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +1 -0
  256. data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +27 -11
  257. data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +5 -5
  258. data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +29 -29
  259. data/vendor/libgit2/src/libgit2/path.c +375 -0
  260. data/vendor/libgit2/src/libgit2/path.h +68 -0
  261. data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +6 -6
  262. data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +2 -2
  263. data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +4 -1
  264. data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +1 -1
  265. data/vendor/libgit2/src/{push.c → libgit2/push.c} +43 -38
  266. data/vendor/libgit2/src/{push.h → libgit2/push.h} +4 -16
  267. data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +9 -9
  268. data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +2 -2
  269. data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +119 -107
  270. data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +506 -197
  271. data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +7 -5
  272. data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +1 -2
  273. data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +34 -32
  274. data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +2 -2
  275. data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +32 -37
  276. data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +5 -2
  277. data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +718 -420
  278. data/vendor/libgit2/src/libgit2/remote.h +100 -0
  279. data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +629 -386
  280. data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +20 -9
  281. data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +8 -5
  282. data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +14 -14
  283. data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +71 -42
  284. data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +12 -8
  285. data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +12 -6
  286. data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +1 -1
  287. data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +235 -61
  288. data/vendor/libgit2/src/{status.c → libgit2/status.c} +4 -1
  289. data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +1 -0
  290. data/vendor/libgit2/src/libgit2/strarray.h +25 -0
  291. data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +8 -6
  292. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +1 -1
  293. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +7 -3
  294. data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +3 -3
  295. data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +4 -1
  296. data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +177 -161
  297. data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +1 -1
  298. data/vendor/libgit2/src/libgit2/sysdir.c +650 -0
  299. data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +53 -18
  300. data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +73 -42
  301. data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +2 -2
  302. data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +3 -3
  303. data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +2 -2
  304. data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +1 -14
  305. data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +5 -22
  306. data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +1 -1
  307. data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +1 -1
  308. data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +10 -10
  309. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +7 -9
  310. data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +2 -3
  311. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +12 -13
  312. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +10 -10
  313. data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -1
  314. data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +9 -11
  315. data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +41 -20
  316. data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +2 -3
  317. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +75 -66
  318. data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +10 -0
  319. data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +138 -116
  320. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +92 -133
  321. data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +35 -32
  322. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +177 -65
  323. data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +97 -49
  324. data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +365 -198
  325. data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +58 -59
  326. data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +8 -8
  327. data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +2 -2
  328. data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +93 -83
  329. data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +4 -4
  330. data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +121 -94
  331. data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +1 -1
  332. data/vendor/libgit2/src/libgit2/xdiff/git-xdiff.h +53 -0
  333. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +15 -15
  334. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +134 -108
  335. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +23 -7
  336. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +87 -78
  337. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +1 -12
  338. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +104 -117
  339. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +6 -17
  340. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +15 -20
  341. data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +18 -7
  342. data/vendor/libgit2/src/util/CMakeLists.txt +80 -0
  343. data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
  344. data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
  345. data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
  346. data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
  347. data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
  348. data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +1 -1
  349. data/vendor/libgit2/src/{date.c → util/date.c} +14 -20
  350. data/vendor/libgit2/src/util/date.h +33 -0
  351. data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +29 -29
  352. data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +2 -2
  353. data/vendor/libgit2/src/{path.c → util/fs_path.c} +453 -647
  354. data/vendor/libgit2/src/{path.h → util/fs_path.h} +221 -188
  355. data/vendor/libgit2/src/{futils.c → util/futils.c} +135 -90
  356. data/vendor/libgit2/src/{futils.h → util/futils.h} +28 -15
  357. data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +15 -1
  358. data/vendor/libgit2/src/{common.h → util/git2_util.h} +20 -59
  359. data/vendor/libgit2/src/util/hash/builtin.c +53 -0
  360. data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
  361. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +3 -3
  362. data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
  363. data/vendor/libgit2/src/util/hash/common_crypto.c +112 -0
  364. data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
  365. data/vendor/libgit2/src/util/hash/mbedtls.c +92 -0
  366. data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
  367. data/vendor/libgit2/src/util/hash/openssl.c +195 -0
  368. data/vendor/libgit2/src/util/hash/openssl.h +45 -0
  369. data/vendor/libgit2/src/util/hash/rfc6234/sha.h +243 -0
  370. data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
  371. data/vendor/libgit2/src/util/hash/sha.h +70 -0
  372. data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +1 -1
  373. data/vendor/libgit2/src/util/hash/win32.c +549 -0
  374. data/vendor/libgit2/src/util/hash/win32.h +60 -0
  375. data/vendor/libgit2/src/util/hash.c +158 -0
  376. data/vendor/libgit2/src/util/hash.h +61 -0
  377. data/vendor/libgit2/src/{khash.h → util/khash.h} +1 -1
  378. data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
  379. data/vendor/libgit2/src/util/net.c +1003 -0
  380. data/vendor/libgit2/src/{net.h → util/net.h} +18 -4
  381. data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
  382. data/vendor/libgit2/src/{posix.c → util/posix.c} +3 -3
  383. data/vendor/libgit2/src/{posix.h → util/posix.h} +4 -1
  384. data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +2 -2
  385. data/vendor/libgit2/src/util/rand.c +234 -0
  386. data/vendor/libgit2/src/util/rand.h +37 -0
  387. data/vendor/libgit2/src/{regexp.c → util/regexp.c} +4 -4
  388. data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
  389. data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
  390. data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
  391. data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +1 -1
  392. data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +2 -2
  393. data/vendor/libgit2/src/{buffer.c → util/str.c} +157 -151
  394. data/vendor/libgit2/src/util/str.h +357 -0
  395. data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
  396. data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
  397. data/vendor/libgit2/src/{thread.h → util/thread.h} +23 -22
  398. data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
  399. data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -3
  400. data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -4
  401. data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -3
  402. data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
  403. data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
  404. data/vendor/libgit2/src/{util.c → util/util.c} +15 -15
  405. data/vendor/libgit2/src/{util.h → util/util.h} +4 -29
  406. data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
  407. data/vendor/libgit2/src/{vector.h → util/vector.h} +2 -2
  408. data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
  409. data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
  410. data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
  411. data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
  412. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +140 -9
  413. data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +3 -1
  414. data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -2
  415. data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +12 -28
  416. data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
  417. data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
  418. data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
  419. data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
  420. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +2 -3
  421. data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +3 -4
  422. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +1 -1
  423. data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
  424. data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
  425. data/vendor/libgit2/src/{zstream.c → util/zstream.c} +5 -5
  426. data/vendor/libgit2/src/{zstream.h → util/zstream.h} +5 -5
  427. metadata +402 -356
  428. data/vendor/libgit2/src/buffer.h +0 -374
  429. data/vendor/libgit2/src/commit.h +0 -46
  430. data/vendor/libgit2/src/hash/sha1/common_crypto.c +0 -57
  431. data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
  432. data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
  433. data/vendor/libgit2/src/hash/sha1/mbedtls.c +0 -46
  434. data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
  435. data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
  436. data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
  437. data/vendor/libgit2/src/hash/sha1.h +0 -38
  438. data/vendor/libgit2/src/hash.c +0 -110
  439. data/vendor/libgit2/src/hash.h +0 -46
  440. data/vendor/libgit2/src/message.h +0 -17
  441. data/vendor/libgit2/src/net.c +0 -540
  442. data/vendor/libgit2/src/oid.h +0 -51
  443. data/vendor/libgit2/src/remote.h +0 -55
  444. data/vendor/libgit2/src/sysdir.c +0 -347
  445. data/vendor/libgit2/src/win32/findfile.c +0 -230
  446. data/vendor/libgit2/src/win32/findfile.h +0 -19
  447. /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
  448. /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
  449. /data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
  450. /data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
  451. /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
  452. /data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
  453. /data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
  454. /data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
  455. /data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
  456. /data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
  457. /data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
  458. /data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
  459. /data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
  460. /data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
  461. /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
  462. /data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
  463. /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
  464. /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
  465. /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
  466. /data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
  467. /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
  468. /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
  469. /data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
  470. /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
  471. /data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
  472. /data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
  473. /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
  474. /data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
  475. /data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
  476. /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
  477. /data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
  478. /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
  479. /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
  480. /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
  481. /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
  482. /data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
  483. /data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
  484. /data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
  485. /data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
  486. /data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
  487. /data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
  488. /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
  489. /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
  490. /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
  491. /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
  492. /data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
  493. /data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
  494. /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
  495. /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
  496. /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
  497. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
  498. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
  499. /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
  500. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
  501. /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
  502. /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
  503. /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
  504. /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
  505. /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
  506. /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
  507. /data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
  508. /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
  509. /data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
  510. /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
  511. /data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
  512. /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
  513. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
  514. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
  515. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
  516. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
  517. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
  518. /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
  519. /data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
  520. /data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
  521. /data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
  522. /data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
  523. /data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
  524. /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
  525. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
  526. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
  527. /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
  528. /data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
  529. /data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
  530. /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
  531. /data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
  532. /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
  533. /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
  534. /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
  535. /data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
  536. /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
  537. /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
  538. /data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
  539. /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
  540. /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
  541. /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
  542. /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
  543. /data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
  544. /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
  545. /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
  546. /data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
  547. /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
@@ -46,10 +46,8 @@ typedef struct {
46
46
  typedef struct loose_backend {
47
47
  git_odb_backend parent;
48
48
 
49
- int object_zlib_level; /** loose object zlib compression level. */
50
- int fsync_object_files; /** loose object file fsync flag. */
51
- mode_t object_file_mode;
52
- mode_t object_dir_mode;
49
+ git_odb_backend_loose_options options;
50
+ size_t oid_hexsize;
53
51
 
54
52
  size_t objects_dirlen;
55
53
  char objects_dir[GIT_FLEX_ARRAY];
@@ -59,13 +57,19 @@ typedef struct loose_backend {
59
57
  * in order to locate objects matching a short oid.
60
58
  */
61
59
  typedef struct {
60
+ loose_backend *backend;
61
+
62
62
  size_t dir_len;
63
- unsigned char short_oid[GIT_OID_HEXSZ]; /* hex formatted oid to match */
63
+
64
+ /* Hex formatted oid to match (and its length) */
65
+ unsigned char short_oid[GIT_OID_MAX_HEXSIZE];
64
66
  size_t short_oid_len;
65
- int found; /* number of matching
66
- * objects already found */
67
- unsigned char res_oid[GIT_OID_HEXSZ]; /* hex formatted oid of
68
- * the object found */
67
+
68
+ /* Number of matching objects found so far */
69
+ int found;
70
+
71
+ /* Hex formatted oid of the object found */
72
+ unsigned char res_oid[GIT_OID_MAX_HEXSIZE];
69
73
  } loose_locate_object_state;
70
74
 
71
75
 
@@ -76,31 +80,30 @@ typedef struct {
76
80
  ***********************************************************/
77
81
 
78
82
  static int object_file_name(
79
- git_buf *name, const loose_backend *be, const git_oid *id)
83
+ git_str *name, const loose_backend *be, const git_oid *id)
80
84
  {
81
- size_t alloclen;
85
+ /* append loose object filename: aa/aaa... (41 bytes plus NUL) */
86
+ size_t path_size = be->oid_hexsize + 1;
82
87
 
83
- /* expand length for object root + 40 hex sha1 chars + 2 * '/' + '\0' */
84
- GIT_ERROR_CHECK_ALLOC_ADD(&alloclen, be->objects_dirlen, GIT_OID_HEXSZ);
85
- GIT_ERROR_CHECK_ALLOC_ADD(&alloclen, alloclen, 3);
86
- if (git_buf_grow(name, alloclen) < 0)
87
- return -1;
88
+ git_str_set(name, be->objects_dir, be->objects_dirlen);
89
+ git_fs_path_to_dir(name);
88
90
 
89
- git_buf_set(name, be->objects_dir, be->objects_dirlen);
90
- git_path_to_dir(name);
91
+ if (git_str_grow_by(name, path_size + 1) < 0)
92
+ return -1;
91
93
 
92
- /* loose object filename: aa/aaa... (41 bytes) */
93
94
  git_oid_pathfmt(name->ptr + name->size, id);
94
- name->size += GIT_OID_HEXSZ + 1;
95
+ name->size += path_size;
95
96
  name->ptr[name->size] = '\0';
96
97
 
97
98
  return 0;
98
99
  }
99
100
 
100
- static int object_mkdir(const git_buf *name, const loose_backend *be)
101
+ static int object_mkdir(const git_str *name, const loose_backend *be)
101
102
  {
102
103
  return git_futils_mkdir_relative(
103
- name->ptr + be->objects_dirlen, be->objects_dir, be->object_dir_mode,
104
+ name->ptr + be->objects_dirlen,
105
+ be->objects_dir,
106
+ be->options.dir_mode,
104
107
  GIT_MKDIR_PATH | GIT_MKDIR_SKIP_LAST | GIT_MKDIR_VERIFY_DIR, NULL);
105
108
  }
106
109
 
@@ -222,9 +225,9 @@ static int is_zlib_compressed_data(unsigned char *data, size_t data_len)
222
225
  * of loose object data into packs. This format is no longer used, but
223
226
  * we must still read it.
224
227
  */
225
- static int read_loose_packlike(git_rawobj *out, git_buf *obj)
228
+ static int read_loose_packlike(git_rawobj *out, git_str *obj)
226
229
  {
227
- git_buf body = GIT_BUF_INIT;
230
+ git_str body = GIT_STR_INIT;
228
231
  const unsigned char *obj_data;
229
232
  obj_hdr hdr;
230
233
  size_t obj_len, head_len, alloc_size;
@@ -253,7 +256,7 @@ static int read_loose_packlike(git_rawobj *out, git_buf *obj)
253
256
  * allocate a buffer and inflate the data into it
254
257
  */
255
258
  if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, hdr.size, 1) ||
256
- git_buf_init(&body, alloc_size) < 0) {
259
+ git_str_init(&body, alloc_size) < 0) {
257
260
  error = -1;
258
261
  goto done;
259
262
  }
@@ -263,14 +266,14 @@ static int read_loose_packlike(git_rawobj *out, git_buf *obj)
263
266
 
264
267
  out->len = hdr.size;
265
268
  out->type = hdr.type;
266
- out->data = git_buf_detach(&body);
269
+ out->data = git_str_detach(&body);
267
270
 
268
271
  done:
269
- git_buf_dispose(&body);
272
+ git_str_dispose(&body);
270
273
  return error;
271
274
  }
272
275
 
273
- static int read_loose_standard(git_rawobj *out, git_buf *obj)
276
+ static int read_loose_standard(git_rawobj *out, git_str *obj)
274
277
  {
275
278
  git_zstream zstream = GIT_ZSTREAM_INIT;
276
279
  unsigned char head[MAX_HEADER_LEN], *body = NULL;
@@ -279,7 +282,7 @@ static int read_loose_standard(git_rawobj *out, git_buf *obj)
279
282
  int error;
280
283
 
281
284
  if ((error = git_zstream_init(&zstream, GIT_ZSTREAM_INFLATE)) < 0 ||
282
- (error = git_zstream_set_input(&zstream, git_buf_cstr(obj), git_buf_len(obj))) < 0)
285
+ (error = git_zstream_set_input(&zstream, git_str_cstr(obj), git_str_len(obj))) < 0)
283
286
  goto done;
284
287
 
285
288
  decompressed = sizeof(head);
@@ -339,15 +342,15 @@ done:
339
342
  return error;
340
343
  }
341
344
 
342
- static int read_loose(git_rawobj *out, git_buf *loc)
345
+ static int read_loose(git_rawobj *out, git_str *loc)
343
346
  {
344
347
  int error;
345
- git_buf obj = GIT_BUF_INIT;
348
+ git_str obj = GIT_STR_INIT;
346
349
 
347
350
  GIT_ASSERT_ARG(out);
348
351
  GIT_ASSERT_ARG(loc);
349
352
 
350
- if (git_buf_oom(loc))
353
+ if (git_str_oom(loc))
351
354
  return -1;
352
355
 
353
356
  out->data = NULL;
@@ -363,7 +366,7 @@ static int read_loose(git_rawobj *out, git_buf *loc)
363
366
  error = read_loose_standard(out, &obj);
364
367
 
365
368
  done:
366
- git_buf_dispose(&obj);
369
+ git_str_dispose(&obj);
367
370
  return error;
368
371
  }
369
372
 
@@ -406,7 +409,7 @@ done:
406
409
  return error;
407
410
  }
408
411
 
409
- static int read_header_loose(git_rawobj *out, git_buf *loc)
412
+ static int read_header_loose(git_rawobj *out, git_str *loc)
410
413
  {
411
414
  unsigned char obj[1024];
412
415
  ssize_t obj_len;
@@ -415,7 +418,7 @@ static int read_header_loose(git_rawobj *out, git_buf *loc)
415
418
  GIT_ASSERT_ARG(out);
416
419
  GIT_ASSERT_ARG(loc);
417
420
 
418
- if (git_buf_oom(loc))
421
+ if (git_str_oom(loc))
419
422
  return -1;
420
423
 
421
424
  out->data = NULL;
@@ -446,28 +449,29 @@ done:
446
449
  }
447
450
 
448
451
  static int locate_object(
449
- git_buf *object_location,
452
+ git_str *object_location,
450
453
  loose_backend *backend,
451
454
  const git_oid *oid)
452
455
  {
453
456
  int error = object_file_name(object_location, backend, oid);
454
457
 
455
- if (!error && !git_path_exists(object_location->ptr))
458
+ if (!error && !git_fs_path_exists(object_location->ptr))
456
459
  return GIT_ENOTFOUND;
457
460
 
458
461
  return error;
459
462
  }
460
463
 
461
464
  /* Explore an entry of a directory and see if it matches a short oid */
462
- static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) {
465
+ static int fn_locate_object_short_oid(void *state, git_str *pathbuf) {
463
466
  loose_locate_object_state *sstate = (loose_locate_object_state *)state;
467
+ size_t hex_size = sstate->backend->oid_hexsize;
464
468
 
465
- if (git_buf_len(pathbuf) - sstate->dir_len != GIT_OID_HEXSZ - 2) {
469
+ if (git_str_len(pathbuf) - sstate->dir_len != hex_size - 2) {
466
470
  /* Entry cannot be an object. Continue to next entry */
467
471
  return 0;
468
472
  }
469
473
 
470
- if (git_path_isdir(pathbuf->ptr) == false) {
474
+ if (git_fs_path_isdir(pathbuf->ptr) == false) {
471
475
  /* We are already in the directory matching the 2 first hex characters,
472
476
  * compare the first ncmp characters of the oids */
473
477
  if (!memcmp(sstate->short_oid + 2,
@@ -477,7 +481,9 @@ static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) {
477
481
  if (!sstate->found) {
478
482
  sstate->res_oid[0] = sstate->short_oid[0];
479
483
  sstate->res_oid[1] = sstate->short_oid[1];
480
- memcpy(sstate->res_oid+2, pathbuf->ptr+sstate->dir_len, GIT_OID_HEXSZ-2);
484
+ memcpy(sstate->res_oid + 2,
485
+ pathbuf->ptr+sstate->dir_len,
486
+ hex_size - 2);
481
487
  }
482
488
  sstate->found++;
483
489
  }
@@ -491,7 +497,7 @@ static int fn_locate_object_short_oid(void *state, git_buf *pathbuf) {
491
497
 
492
498
  /* Locate an object matching a given short oid */
493
499
  static int locate_object_short_oid(
494
- git_buf *object_location,
500
+ git_str *object_location,
495
501
  git_oid *res_oid,
496
502
  loose_backend *backend,
497
503
  const git_oid *short_oid,
@@ -503,36 +509,37 @@ static int locate_object_short_oid(
503
509
  int error;
504
510
 
505
511
  /* prealloc memory for OBJ_DIR/xx/xx..38x..xx */
506
- GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, dir_len, GIT_OID_HEXSZ);
512
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, dir_len, backend->oid_hexsize);
507
513
  GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 3);
508
- if (git_buf_grow(object_location, alloc_len) < 0)
514
+ if (git_str_grow(object_location, alloc_len) < 0)
509
515
  return -1;
510
516
 
511
- git_buf_set(object_location, objects_dir, dir_len);
512
- git_path_to_dir(object_location);
517
+ git_str_set(object_location, objects_dir, dir_len);
518
+ git_fs_path_to_dir(object_location);
513
519
 
514
520
  /* save adjusted position at end of dir so it can be restored later */
515
- dir_len = git_buf_len(object_location);
521
+ dir_len = git_str_len(object_location);
516
522
 
517
523
  /* Convert raw oid to hex formatted oid */
518
524
  git_oid_fmt((char *)state.short_oid, short_oid);
519
525
 
520
526
  /* Explore OBJ_DIR/xx/ where xx is the beginning of hex formatted short oid */
521
- if (git_buf_put(object_location, (char *)state.short_oid, 3) < 0)
527
+ if (git_str_put(object_location, (char *)state.short_oid, 3) < 0)
522
528
  return -1;
523
529
  object_location->ptr[object_location->size - 1] = '/';
524
530
 
525
531
  /* Check that directory exists */
526
- if (git_path_isdir(object_location->ptr) == false)
532
+ if (git_fs_path_isdir(object_location->ptr) == false)
527
533
  return git_odb__error_notfound("no matching loose object for prefix",
528
534
  short_oid, len);
529
535
 
530
- state.dir_len = git_buf_len(object_location);
536
+ state.backend = backend;
537
+ state.dir_len = git_str_len(object_location);
531
538
  state.short_oid_len = len;
532
539
  state.found = 0;
533
540
 
534
541
  /* Explore directory to find a unique object matching short_oid */
535
- error = git_path_direach(
542
+ error = git_fs_path_direach(
536
543
  object_location, 0, fn_locate_object_short_oid, &state);
537
544
  if (error < 0 && error != GIT_EAMBIGUOUS)
538
545
  return error;
@@ -545,34 +552,26 @@ static int locate_object_short_oid(
545
552
  return git_odb__error_ambiguous("multiple matches in loose objects");
546
553
 
547
554
  /* Convert obtained hex formatted oid to raw */
548
- error = git_oid_fromstr(res_oid, (char *)state.res_oid);
555
+ error = git_oid__fromstr(res_oid, (char *)state.res_oid, backend->options.oid_type);
549
556
  if (error)
550
557
  return error;
551
558
 
552
559
  /* Update the location according to the oid obtained */
553
- GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, dir_len, GIT_OID_HEXSZ);
560
+ GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, dir_len, backend->oid_hexsize);
554
561
  GIT_ERROR_CHECK_ALLOC_ADD(&alloc_len, alloc_len, 2);
555
562
 
556
- git_buf_truncate(object_location, dir_len);
557
- if (git_buf_grow(object_location, alloc_len) < 0)
563
+ git_str_truncate(object_location, dir_len);
564
+ if (git_str_grow(object_location, alloc_len) < 0)
558
565
  return -1;
559
566
 
560
567
  git_oid_pathfmt(object_location->ptr + dir_len, res_oid);
561
568
 
562
- object_location->size += GIT_OID_HEXSZ + 1;
569
+ object_location->size += backend->oid_hexsize + 1;
563
570
  object_location->ptr[object_location->size] = '\0';
564
571
 
565
572
  return 0;
566
573
  }
567
574
 
568
-
569
-
570
-
571
-
572
-
573
-
574
-
575
-
576
575
  /***********************************************************
577
576
  *
578
577
  * LOOSE BACKEND PUBLIC API
@@ -583,7 +582,7 @@ static int locate_object_short_oid(
583
582
 
584
583
  static int loose_backend__read_header(size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
585
584
  {
586
- git_buf object_path = GIT_BUF_INIT;
585
+ git_str object_path = GIT_STR_INIT;
587
586
  git_rawobj raw;
588
587
  int error;
589
588
 
@@ -595,20 +594,20 @@ static int loose_backend__read_header(size_t *len_p, git_object_t *type_p, git_o
595
594
 
596
595
  if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) {
597
596
  error = git_odb__error_notfound("no matching loose object",
598
- oid, GIT_OID_HEXSZ);
597
+ oid, ((struct loose_backend *)backend)->oid_hexsize);
599
598
  } else if ((error = read_header_loose(&raw, &object_path)) == 0) {
600
599
  *len_p = raw.len;
601
600
  *type_p = raw.type;
602
601
  }
603
602
 
604
- git_buf_dispose(&object_path);
603
+ git_str_dispose(&object_path);
605
604
 
606
605
  return error;
607
606
  }
608
607
 
609
608
  static int loose_backend__read(void **buffer_p, size_t *len_p, git_object_t *type_p, git_odb_backend *backend, const git_oid *oid)
610
609
  {
611
- git_buf object_path = GIT_BUF_INIT;
610
+ git_str object_path = GIT_STR_INIT;
612
611
  git_rawobj raw;
613
612
  int error = 0;
614
613
 
@@ -617,14 +616,14 @@ static int loose_backend__read(void **buffer_p, size_t *len_p, git_object_t *typ
617
616
 
618
617
  if (locate_object(&object_path, (loose_backend *)backend, oid) < 0) {
619
618
  error = git_odb__error_notfound("no matching loose object",
620
- oid, GIT_OID_HEXSZ);
619
+ oid, ((struct loose_backend *)backend)->oid_hexsize);
621
620
  } else if ((error = read_loose(&raw, &object_path)) == 0) {
622
621
  *buffer_p = raw.data;
623
622
  *len_p = raw.len;
624
623
  *type_p = raw.type;
625
624
  }
626
625
 
627
- git_buf_dispose(&object_path);
626
+ git_str_dispose(&object_path);
628
627
 
629
628
  return error;
630
629
  }
@@ -634,21 +633,23 @@ static int loose_backend__read_prefix(
634
633
  void **buffer_p,
635
634
  size_t *len_p,
636
635
  git_object_t *type_p,
637
- git_odb_backend *backend,
636
+ git_odb_backend *_backend,
638
637
  const git_oid *short_oid,
639
638
  size_t len)
640
639
  {
640
+ struct loose_backend *backend = (struct loose_backend *)_backend;
641
641
  int error = 0;
642
642
 
643
- GIT_ASSERT_ARG(len >= GIT_OID_MINPREFIXLEN && len <= GIT_OID_HEXSZ);
643
+ GIT_ASSERT_ARG(len >= GIT_OID_MINPREFIXLEN &&
644
+ len <= backend->oid_hexsize);
644
645
 
645
- if (len == GIT_OID_HEXSZ) {
646
+ if (len == backend->oid_hexsize) {
646
647
  /* We can fall back to regular read method */
647
- error = loose_backend__read(buffer_p, len_p, type_p, backend, short_oid);
648
+ error = loose_backend__read(buffer_p, len_p, type_p, _backend, short_oid);
648
649
  if (!error)
649
650
  git_oid_cpy(out_oid, short_oid);
650
651
  } else {
651
- git_buf object_path = GIT_BUF_INIT;
652
+ git_str object_path = GIT_STR_INIT;
652
653
  git_rawobj raw;
653
654
 
654
655
  GIT_ASSERT_ARG(backend && short_oid);
@@ -662,7 +663,7 @@ static int loose_backend__read_prefix(
662
663
  *type_p = raw.type;
663
664
  }
664
665
 
665
- git_buf_dispose(&object_path);
666
+ git_str_dispose(&object_path);
666
667
  }
667
668
 
668
669
  return error;
@@ -670,7 +671,7 @@ static int loose_backend__read_prefix(
670
671
 
671
672
  static int loose_backend__exists(git_odb_backend *backend, const git_oid *oid)
672
673
  {
673
- git_buf object_path = GIT_BUF_INIT;
674
+ git_str object_path = GIT_STR_INIT;
674
675
  int error;
675
676
 
676
677
  GIT_ASSERT_ARG(backend);
@@ -678,7 +679,7 @@ static int loose_backend__exists(git_odb_backend *backend, const git_oid *oid)
678
679
 
679
680
  error = locate_object(&object_path, (loose_backend *)backend, oid);
680
681
 
681
- git_buf_dispose(&object_path);
682
+ git_str_dispose(&object_path);
682
683
 
683
684
  return !error;
684
685
  }
@@ -686,7 +687,7 @@ static int loose_backend__exists(git_odb_backend *backend, const git_oid *oid)
686
687
  static int loose_backend__exists_prefix(
687
688
  git_oid *out, git_odb_backend *backend, const git_oid *short_id, size_t len)
688
689
  {
689
- git_buf object_path = GIT_BUF_INIT;
690
+ git_str object_path = GIT_STR_INIT;
690
691
  int error;
691
692
 
692
693
  GIT_ASSERT_ARG(backend);
@@ -697,21 +698,24 @@ static int loose_backend__exists_prefix(
697
698
  error = locate_object_short_oid(
698
699
  &object_path, out, (loose_backend *)backend, short_id, len);
699
700
 
700
- git_buf_dispose(&object_path);
701
+ git_str_dispose(&object_path);
701
702
 
702
703
  return error;
703
704
  }
704
705
 
705
706
  struct foreach_state {
707
+ struct loose_backend *backend;
706
708
  size_t dir_len;
707
709
  git_odb_foreach_cb cb;
708
710
  void *data;
709
711
  };
710
712
 
711
- GIT_INLINE(int) filename_to_oid(git_oid *oid, const char *ptr)
713
+ GIT_INLINE(int) filename_to_oid(struct loose_backend *backend, git_oid *oid, const char *ptr)
712
714
  {
713
- int v, i = 0;
714
- if (strlen(ptr) != GIT_OID_HEXSZ+1)
715
+ int v;
716
+ size_t i = 0;
717
+
718
+ if (strlen(ptr) != backend->oid_hexsize + 1)
715
719
  return -1;
716
720
 
717
721
  if (ptr[2] != '/') {
@@ -725,7 +729,7 @@ GIT_INLINE(int) filename_to_oid(git_oid *oid, const char *ptr)
725
729
  oid->id[0] = (unsigned char) v;
726
730
 
727
731
  ptr += 3;
728
- for (i = 0; i < 38; i += 2) {
732
+ for (i = 0; i < backend->oid_hexsize - 2; i += 2) {
729
733
  v = (git__fromhex(ptr[i]) << 4) | git__fromhex(ptr[i + 1]);
730
734
  if (v < 0)
731
735
  return -1;
@@ -733,37 +737,41 @@ GIT_INLINE(int) filename_to_oid(git_oid *oid, const char *ptr)
733
737
  oid->id[1 + i/2] = (unsigned char) v;
734
738
  }
735
739
 
740
+ #ifdef GIT_EXPERIMENTAL_SHA256
741
+ oid->type = backend->options.oid_type;
742
+ #endif
743
+
736
744
  return 0;
737
745
  }
738
746
 
739
- static int foreach_object_dir_cb(void *_state, git_buf *path)
747
+ static int foreach_object_dir_cb(void *_state, git_str *path)
740
748
  {
741
749
  git_oid oid;
742
750
  struct foreach_state *state = (struct foreach_state *) _state;
743
751
 
744
- if (filename_to_oid(&oid, path->ptr + state->dir_len) < 0)
752
+ if (filename_to_oid(state->backend, &oid, path->ptr + state->dir_len) < 0)
745
753
  return 0;
746
754
 
747
755
  return git_error_set_after_callback_function(
748
756
  state->cb(&oid, state->data), "git_odb_foreach");
749
757
  }
750
758
 
751
- static int foreach_cb(void *_state, git_buf *path)
759
+ static int foreach_cb(void *_state, git_str *path)
752
760
  {
753
761
  struct foreach_state *state = (struct foreach_state *) _state;
754
762
 
755
763
  /* non-dir is some stray file, ignore it */
756
- if (!git_path_isdir(git_buf_cstr(path)))
764
+ if (!git_fs_path_isdir(git_str_cstr(path)))
757
765
  return 0;
758
766
 
759
- return git_path_direach(path, 0, foreach_object_dir_cb, state);
767
+ return git_fs_path_direach(path, 0, foreach_object_dir_cb, state);
760
768
  }
761
769
 
762
770
  static int loose_backend__foreach(git_odb_backend *_backend, git_odb_foreach_cb cb, void *data)
763
771
  {
764
772
  char *objects_dir;
765
773
  int error;
766
- git_buf buf = GIT_BUF_INIT;
774
+ git_str buf = GIT_STR_INIT;
767
775
  struct foreach_state state;
768
776
  loose_backend *backend = (loose_backend *) _backend;
769
777
 
@@ -772,19 +780,20 @@ static int loose_backend__foreach(git_odb_backend *_backend, git_odb_foreach_cb
772
780
 
773
781
  objects_dir = backend->objects_dir;
774
782
 
775
- git_buf_sets(&buf, objects_dir);
776
- git_path_to_dir(&buf);
777
- if (git_buf_oom(&buf))
783
+ git_str_sets(&buf, objects_dir);
784
+ git_fs_path_to_dir(&buf);
785
+ if (git_str_oom(&buf))
778
786
  return -1;
779
787
 
780
788
  memset(&state, 0, sizeof(state));
789
+ state.backend = backend;
781
790
  state.cb = cb;
782
791
  state.data = data;
783
- state.dir_len = git_buf_len(&buf);
792
+ state.dir_len = git_str_len(&buf);
784
793
 
785
- error = git_path_direach(&buf, 0, foreach_cb, &state);
794
+ error = git_fs_path_direach(&buf, 0, foreach_cb, &state);
786
795
 
787
- git_buf_dispose(&buf);
796
+ git_str_dispose(&buf);
788
797
 
789
798
  return error;
790
799
  }
@@ -793,7 +802,7 @@ static int loose_backend__writestream_finalize(git_odb_stream *_stream, const gi
793
802
  {
794
803
  loose_writestream *stream = (loose_writestream *)_stream;
795
804
  loose_backend *backend = (loose_backend *)_stream->backend;
796
- git_buf final_path = GIT_BUF_INIT;
805
+ git_str final_path = GIT_STR_INIT;
797
806
  int error = 0;
798
807
 
799
808
  if (object_file_name(&final_path, backend, oid) < 0 ||
@@ -803,7 +812,7 @@ static int loose_backend__writestream_finalize(git_odb_stream *_stream, const gi
803
812
  error = git_filebuf_commit_at(
804
813
  &stream->fbuf, final_path.ptr);
805
814
 
806
- git_buf_dispose(&final_path);
815
+ git_str_dispose(&final_path);
807
816
 
808
817
  return error;
809
818
  }
@@ -825,9 +834,10 @@ static void loose_backend__writestream_free(git_odb_stream *_stream)
825
834
  static int filebuf_flags(loose_backend *backend)
826
835
  {
827
836
  int flags = GIT_FILEBUF_TEMPORARY |
828
- (backend->object_zlib_level << GIT_FILEBUF_DEFLATE_SHIFT);
837
+ (backend->options.compression_level << GIT_FILEBUF_DEFLATE_SHIFT);
829
838
 
830
- if (backend->fsync_object_files || git_repository__fsync_gitdir)
839
+ if ((backend->options.flags & GIT_ODB_BACKEND_LOOSE_FSYNC) ||
840
+ git_repository__fsync_gitdir)
831
841
  flags |= GIT_FILEBUF_FSYNC;
832
842
 
833
843
  return flags;
@@ -838,7 +848,7 @@ static int loose_backend__writestream(git_odb_stream **stream_out, git_odb_backe
838
848
  loose_backend *backend;
839
849
  loose_writestream *stream = NULL;
840
850
  char hdr[MAX_HEADER_LEN];
841
- git_buf tmp_path = GIT_BUF_INIT;
851
+ git_str tmp_path = GIT_STR_INIT;
842
852
  size_t hdrlen;
843
853
  int error;
844
854
 
@@ -861,16 +871,16 @@ static int loose_backend__writestream(git_odb_stream **stream_out, git_odb_backe
861
871
  stream->stream.free = &loose_backend__writestream_free;
862
872
  stream->stream.mode = GIT_STREAM_WRONLY;
863
873
 
864
- if (git_buf_joinpath(&tmp_path, backend->objects_dir, "tmp_object") < 0 ||
874
+ if (git_str_joinpath(&tmp_path, backend->objects_dir, "tmp_object") < 0 ||
865
875
  git_filebuf_open(&stream->fbuf, tmp_path.ptr, filebuf_flags(backend),
866
- backend->object_file_mode) < 0 ||
876
+ backend->options.file_mode) < 0 ||
867
877
  stream->stream.write((git_odb_stream *)stream, hdr, hdrlen) < 0)
868
878
  {
869
879
  git_filebuf_cleanup(&stream->fbuf);
870
880
  git__free(stream);
871
881
  stream = NULL;
872
882
  }
873
- git_buf_dispose(&tmp_path);
883
+ git_str_dispose(&tmp_path);
874
884
  *stream_out = (git_odb_stream *)stream;
875
885
 
876
886
  return !stream ? -1 : 0;
@@ -996,7 +1006,8 @@ static int loose_backend__readstream(
996
1006
  loose_backend *backend;
997
1007
  loose_readstream *stream = NULL;
998
1008
  git_hash_ctx *hash_ctx = NULL;
999
- git_buf object_path = GIT_BUF_INIT;
1009
+ git_str object_path = GIT_STR_INIT;
1010
+ git_hash_algorithm_t algorithm;
1000
1011
  obj_hdr hdr;
1001
1012
  int error = 0;
1002
1013
 
@@ -1013,7 +1024,7 @@ static int loose_backend__readstream(
1013
1024
 
1014
1025
  if (locate_object(&object_path, backend, oid) < 0) {
1015
1026
  error = git_odb__error_notfound("no matching loose object",
1016
- oid, GIT_OID_HEXSZ);
1027
+ oid, backend->oid_hexsize);
1017
1028
  goto done;
1018
1029
  }
1019
1030
 
@@ -1023,9 +1034,11 @@ static int loose_backend__readstream(
1023
1034
  hash_ctx = git__malloc(sizeof(git_hash_ctx));
1024
1035
  GIT_ERROR_CHECK_ALLOC(hash_ctx);
1025
1036
 
1026
- if ((error = git_hash_ctx_init(hash_ctx)) < 0 ||
1027
- (error = git_futils_mmap_ro_file(&stream->map, object_path.ptr)) < 0 ||
1028
- (error = git_zstream_init(&stream->zstream, GIT_ZSTREAM_INFLATE)) < 0)
1037
+ algorithm = git_oid_algorithm(backend->options.oid_type);
1038
+
1039
+ if ((error = git_hash_ctx_init(hash_ctx, algorithm)) < 0 ||
1040
+ (error = git_futils_mmap_ro_file(&stream->map, object_path.ptr)) < 0 ||
1041
+ (error = git_zstream_init(&stream->zstream, GIT_ZSTREAM_INFLATE)) < 0)
1029
1042
  goto done;
1030
1043
 
1031
1044
  /* check for a packlike loose object */
@@ -1059,14 +1072,14 @@ done:
1059
1072
  }
1060
1073
  }
1061
1074
 
1062
- git_buf_dispose(&object_path);
1075
+ git_str_dispose(&object_path);
1063
1076
  return error;
1064
1077
  }
1065
1078
 
1066
1079
  static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, const void *data, size_t len, git_object_t type)
1067
1080
  {
1068
1081
  int error = 0;
1069
- git_buf final_path = GIT_BUF_INIT;
1082
+ git_str final_path = GIT_STR_INIT;
1070
1083
  char header[MAX_HEADER_LEN];
1071
1084
  size_t header_len;
1072
1085
  git_filebuf fbuf = GIT_FILEBUF_INIT;
@@ -1079,9 +1092,9 @@ static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, c
1079
1092
  header, sizeof(header), len, type)) < 0)
1080
1093
  goto cleanup;
1081
1094
 
1082
- if (git_buf_joinpath(&final_path, backend->objects_dir, "tmp_object") < 0 ||
1095
+ if (git_str_joinpath(&final_path, backend->objects_dir, "tmp_object") < 0 ||
1083
1096
  git_filebuf_open(&fbuf, final_path.ptr, filebuf_flags(backend),
1084
- backend->object_file_mode) < 0)
1097
+ backend->options.file_mode) < 0)
1085
1098
  {
1086
1099
  error = -1;
1087
1100
  goto cleanup;
@@ -1098,7 +1111,7 @@ static int loose_backend__write(git_odb_backend *_backend, const git_oid *oid, c
1098
1111
  cleanup:
1099
1112
  if (error < 0)
1100
1113
  git_filebuf_cleanup(&fbuf);
1101
- git_buf_dispose(&final_path);
1114
+ git_str_dispose(&final_path);
1102
1115
  return error;
1103
1116
  }
1104
1117
 
@@ -1107,14 +1120,14 @@ static int loose_backend__freshen(
1107
1120
  const git_oid *oid)
1108
1121
  {
1109
1122
  loose_backend *backend = (loose_backend *)_backend;
1110
- git_buf path = GIT_BUF_INIT;
1123
+ git_str path = GIT_STR_INIT;
1111
1124
  int error;
1112
1125
 
1113
1126
  if (object_file_name(&path, backend, oid) < 0)
1114
1127
  return -1;
1115
1128
 
1116
1129
  error = git_futils_touch(path.ptr, NULL);
1117
- git_buf_dispose(&path);
1130
+ git_str_dispose(&path);
1118
1131
 
1119
1132
  return error;
1120
1133
  }
@@ -1124,13 +1137,34 @@ static void loose_backend__free(git_odb_backend *_backend)
1124
1137
  git__free(_backend);
1125
1138
  }
1126
1139
 
1127
- int git_odb_backend_loose(
1140
+ static void normalize_options(
1141
+ git_odb_backend_loose_options *opts,
1142
+ const git_odb_backend_loose_options *given_opts)
1143
+ {
1144
+ git_odb_backend_loose_options init = GIT_ODB_BACKEND_LOOSE_OPTIONS_INIT;
1145
+
1146
+ if (given_opts)
1147
+ memcpy(opts, given_opts, sizeof(git_odb_backend_loose_options));
1148
+ else
1149
+ memcpy(opts, &init, sizeof(git_odb_backend_loose_options));
1150
+
1151
+ if (opts->compression_level < 0)
1152
+ opts->compression_level = Z_BEST_SPEED;
1153
+
1154
+ if (opts->dir_mode == 0)
1155
+ opts->dir_mode = GIT_OBJECT_DIR_MODE;
1156
+
1157
+ if (opts->file_mode == 0)
1158
+ opts->file_mode = GIT_OBJECT_FILE_MODE;
1159
+
1160
+ if (opts->oid_type == 0)
1161
+ opts->oid_type = GIT_OID_DEFAULT;
1162
+ }
1163
+
1164
+ int git_odb__backend_loose(
1128
1165
  git_odb_backend **backend_out,
1129
1166
  const char *objects_dir,
1130
- int compression_level,
1131
- int do_fsync,
1132
- unsigned int dir_mode,
1133
- unsigned int file_mode)
1167
+ git_odb_backend_loose_options *opts)
1134
1168
  {
1135
1169
  loose_backend *backend;
1136
1170
  size_t objects_dirlen, alloclen;
@@ -1148,22 +1182,12 @@ int git_odb_backend_loose(
1148
1182
  backend->parent.version = GIT_ODB_BACKEND_VERSION;
1149
1183
  backend->objects_dirlen = objects_dirlen;
1150
1184
  memcpy(backend->objects_dir, objects_dir, objects_dirlen);
1185
+
1151
1186
  if (backend->objects_dir[backend->objects_dirlen - 1] != '/')
1152
1187
  backend->objects_dir[backend->objects_dirlen++] = '/';
1153
1188
 
1154
- if (compression_level < 0)
1155
- compression_level = Z_BEST_SPEED;
1156
-
1157
- if (dir_mode == 0)
1158
- dir_mode = GIT_OBJECT_DIR_MODE;
1159
-
1160
- if (file_mode == 0)
1161
- file_mode = GIT_OBJECT_FILE_MODE;
1162
-
1163
- backend->object_zlib_level = compression_level;
1164
- backend->fsync_object_files = do_fsync;
1165
- backend->object_dir_mode = dir_mode;
1166
- backend->object_file_mode = file_mode;
1189
+ normalize_options(&backend->options, opts);
1190
+ backend->oid_hexsize = git_oid_hexsize(backend->options.oid_type);
1167
1191
 
1168
1192
  backend->parent.read = &loose_backend__read;
1169
1193
  backend->parent.write = &loose_backend__write;
@@ -1180,3 +1204,37 @@ int git_odb_backend_loose(
1180
1204
  *backend_out = (git_odb_backend *)backend;
1181
1205
  return 0;
1182
1206
  }
1207
+
1208
+
1209
+ #ifdef GIT_EXPERIMENTAL_SHA256
1210
+ int git_odb_backend_loose(
1211
+ git_odb_backend **backend_out,
1212
+ const char *objects_dir,
1213
+ git_odb_backend_loose_options *opts)
1214
+ {
1215
+ return git_odb__backend_loose(backend_out, objects_dir, opts);
1216
+ }
1217
+ #else
1218
+ int git_odb_backend_loose(
1219
+ git_odb_backend **backend_out,
1220
+ const char *objects_dir,
1221
+ int compression_level,
1222
+ int do_fsync,
1223
+ unsigned int dir_mode,
1224
+ unsigned int file_mode)
1225
+ {
1226
+ git_odb_backend_loose_flag_t flags = 0;
1227
+ git_odb_backend_loose_options opts = GIT_ODB_BACKEND_LOOSE_OPTIONS_INIT;
1228
+
1229
+ if (do_fsync)
1230
+ flags |= GIT_ODB_BACKEND_LOOSE_FSYNC;
1231
+
1232
+ opts.flags = flags;
1233
+ opts.compression_level = compression_level;
1234
+ opts.dir_mode = dir_mode;
1235
+ opts.file_mode = file_mode;
1236
+ opts.oid_type = GIT_OID_DEFAULT;
1237
+
1238
+ return git_odb__backend_loose(backend_out, objects_dir, &opts);
1239
+ }
1240
+ #endif