rugged 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -0
  3. data/README.md +3 -3
  4. data/ext/rugged/rugged.c +7 -4
  5. data/ext/rugged/rugged_commit.c +1 -1
  6. data/ext/rugged/rugged_config.c +1 -1
  7. data/ext/rugged/rugged_object.c +1 -1
  8. data/ext/rugged/rugged_remote.c +32 -2
  9. data/ext/rugged/rugged_repo.c +13 -3
  10. data/lib/rugged/commit.rb +17 -4
  11. data/lib/rugged/repository.rb +7 -8
  12. data/lib/rugged/submodule_collection.rb +4 -4
  13. data/lib/rugged/version.rb +1 -1
  14. data/vendor/libgit2/CMakeLists.txt +41 -74
  15. data/vendor/libgit2/COPYING +109 -1
  16. data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
  17. data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
  18. data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
  19. data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
  20. data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
  21. data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
  22. data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
  23. data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
  24. data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
  25. data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
  26. data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
  27. data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
  28. data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
  29. data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
  30. data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
  31. data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
  32. data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
  33. data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
  34. data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
  35. data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
  36. data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
  37. data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
  38. data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
  39. data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
  40. data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
  41. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
  42. data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
  43. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
  44. data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
  45. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
  46. data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
  47. data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
  48. data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
  49. data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
  50. data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
  51. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
  52. data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
  53. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
  54. data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
  55. data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
  56. data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
  57. data/vendor/libgit2/deps/pcre/LICENCE +93 -0
  58. data/vendor/libgit2/deps/pcre/pcre.h +2 -2
  59. data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
  60. data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
  61. data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
  62. data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
  63. data/vendor/libgit2/deps/zlib/deflate.c +1 -0
  64. data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
  65. data/vendor/libgit2/include/git2/apply.h +2 -0
  66. data/vendor/libgit2/include/git2/attr.h +89 -0
  67. data/vendor/libgit2/include/git2/blame.h +95 -42
  68. data/vendor/libgit2/include/git2/blob.h +31 -3
  69. data/vendor/libgit2/include/git2/branch.h +25 -0
  70. data/vendor/libgit2/include/git2/cert.h +42 -5
  71. data/vendor/libgit2/include/git2/checkout.h +28 -12
  72. data/vendor/libgit2/include/git2/commit.h +35 -19
  73. data/vendor/libgit2/include/git2/common.h +33 -6
  74. data/vendor/libgit2/include/git2/config.h +1 -1
  75. data/vendor/libgit2/include/git2/deprecated.h +248 -8
  76. data/vendor/libgit2/include/git2/diff.h +35 -20
  77. data/vendor/libgit2/include/git2/errors.h +8 -7
  78. data/vendor/libgit2/include/git2/filter.h +57 -17
  79. data/vendor/libgit2/include/git2/graph.h +20 -2
  80. data/vendor/libgit2/include/git2/index.h +4 -5
  81. data/vendor/libgit2/include/git2/indexer.h +2 -1
  82. data/vendor/libgit2/include/git2/odb.h +44 -20
  83. data/vendor/libgit2/include/git2/pack.h +1 -1
  84. data/vendor/libgit2/include/git2/patch.h +8 -0
  85. data/vendor/libgit2/include/git2/rebase.h +25 -1
  86. data/vendor/libgit2/include/git2/refs.h +9 -5
  87. data/vendor/libgit2/include/git2/remote.h +59 -6
  88. data/vendor/libgit2/include/git2/repository.h +95 -52
  89. data/vendor/libgit2/include/git2/revparse.h +5 -5
  90. data/vendor/libgit2/include/git2/status.h +115 -59
  91. data/vendor/libgit2/include/git2/strarray.h +6 -10
  92. data/vendor/libgit2/include/git2/submodule.h +9 -0
  93. data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
  94. data/vendor/libgit2/include/git2/sys/filter.h +49 -28
  95. data/vendor/libgit2/include/git2/sys/midx.h +74 -0
  96. data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
  97. data/vendor/libgit2/include/git2/sys/transport.h +1 -0
  98. data/vendor/libgit2/include/git2/tag.h +12 -0
  99. data/vendor/libgit2/include/git2/transport.h +1 -1
  100. data/vendor/libgit2/include/git2/tree.h +2 -14
  101. data/vendor/libgit2/include/git2/types.h +9 -0
  102. data/vendor/libgit2/include/git2/version.h +3 -3
  103. data/vendor/libgit2/include/git2/worktree.h +1 -0
  104. data/vendor/libgit2/src/CMakeLists.txt +77 -44
  105. data/vendor/libgit2/src/alloc.c +21 -8
  106. data/vendor/libgit2/src/allocators/failalloc.c +92 -0
  107. data/vendor/libgit2/src/allocators/failalloc.h +23 -0
  108. data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
  109. data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
  110. data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
  111. data/vendor/libgit2/src/annotated_commit.c +21 -9
  112. data/vendor/libgit2/src/apply.c +21 -8
  113. data/vendor/libgit2/src/array.h +11 -11
  114. data/vendor/libgit2/src/assert_safe.h +58 -0
  115. data/vendor/libgit2/src/attr.c +181 -74
  116. data/vendor/libgit2/src/attr_file.c +92 -42
  117. data/vendor/libgit2/src/attr_file.h +32 -11
  118. data/vendor/libgit2/src/attrcache.c +44 -40
  119. data/vendor/libgit2/src/attrcache.h +4 -5
  120. data/vendor/libgit2/src/blame.c +28 -15
  121. data/vendor/libgit2/src/blame_git.c +6 -3
  122. data/vendor/libgit2/src/blob.c +46 -24
  123. data/vendor/libgit2/src/branch.c +87 -37
  124. data/vendor/libgit2/src/buffer.c +339 -27
  125. data/vendor/libgit2/src/buffer.h +153 -2
  126. data/vendor/libgit2/src/cache.c +3 -24
  127. data/vendor/libgit2/src/cache.h +7 -7
  128. data/vendor/libgit2/src/cc-compat.h +10 -2
  129. data/vendor/libgit2/src/checkout.c +97 -98
  130. data/vendor/libgit2/src/cherrypick.c +8 -2
  131. data/vendor/libgit2/src/clone.c +104 -29
  132. data/vendor/libgit2/src/commit.c +41 -28
  133. data/vendor/libgit2/src/commit_graph.c +1209 -0
  134. data/vendor/libgit2/src/commit_graph.h +162 -0
  135. data/vendor/libgit2/src/commit_list.c +46 -0
  136. data/vendor/libgit2/src/commit_list.h +2 -0
  137. data/vendor/libgit2/src/common.h +26 -2
  138. data/vendor/libgit2/src/config.c +40 -22
  139. data/vendor/libgit2/src/config_cache.c +9 -4
  140. data/vendor/libgit2/src/config_entries.c +35 -27
  141. data/vendor/libgit2/src/config_file.c +25 -8
  142. data/vendor/libgit2/src/config_parse.c +5 -7
  143. data/vendor/libgit2/src/config_snapshot.c +2 -1
  144. data/vendor/libgit2/src/crlf.c +16 -6
  145. data/vendor/libgit2/src/date.c +4 -3
  146. data/vendor/libgit2/src/delta.c +1 -1
  147. data/vendor/libgit2/src/describe.c +11 -4
  148. data/vendor/libgit2/src/diff.c +23 -19
  149. data/vendor/libgit2/src/diff_driver.c +21 -17
  150. data/vendor/libgit2/src/diff_file.c +5 -7
  151. data/vendor/libgit2/src/diff_generate.c +56 -28
  152. data/vendor/libgit2/src/diff_parse.c +2 -3
  153. data/vendor/libgit2/src/diff_print.c +81 -65
  154. data/vendor/libgit2/src/diff_stats.c +19 -16
  155. data/vendor/libgit2/src/diff_tform.c +13 -13
  156. data/vendor/libgit2/src/diff_xdiff.c +4 -2
  157. data/vendor/libgit2/src/diff_xdiff.h +1 -1
  158. data/vendor/libgit2/src/errors.c +26 -19
  159. data/vendor/libgit2/src/features.h.in +5 -1
  160. data/vendor/libgit2/src/fetch.c +7 -2
  161. data/vendor/libgit2/src/fetchhead.c +8 -4
  162. data/vendor/libgit2/src/filebuf.c +9 -7
  163. data/vendor/libgit2/src/filter.c +209 -113
  164. data/vendor/libgit2/src/filter.h +24 -5
  165. data/vendor/libgit2/src/futils.c +8 -8
  166. data/vendor/libgit2/src/futils.h +4 -4
  167. data/vendor/libgit2/src/graph.c +64 -9
  168. data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
  169. data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
  170. data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
  171. data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
  172. data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
  173. data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
  174. data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
  175. data/vendor/libgit2/src/hash.c +16 -13
  176. data/vendor/libgit2/src/hash.h +1 -1
  177. data/vendor/libgit2/src/hashsig.c +23 -10
  178. data/vendor/libgit2/src/ident.c +13 -3
  179. data/vendor/libgit2/src/idxmap.c +0 -22
  180. data/vendor/libgit2/src/ignore.c +35 -19
  181. data/vendor/libgit2/src/index.c +126 -84
  182. data/vendor/libgit2/src/index.h +1 -1
  183. data/vendor/libgit2/src/indexer.c +60 -36
  184. data/vendor/libgit2/src/integer.h +79 -2
  185. data/vendor/libgit2/src/iterator.c +40 -28
  186. data/vendor/libgit2/src/iterator.h +1 -1
  187. data/vendor/libgit2/src/khash.h +2 -11
  188. data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
  189. data/vendor/libgit2/src/libgit2.h +15 -0
  190. data/vendor/libgit2/src/mailmap.c +23 -10
  191. data/vendor/libgit2/src/map.h +3 -3
  192. data/vendor/libgit2/src/merge.c +108 -46
  193. data/vendor/libgit2/src/merge.h +2 -1
  194. data/vendor/libgit2/src/merge_driver.c +19 -13
  195. data/vendor/libgit2/src/merge_file.c +15 -9
  196. data/vendor/libgit2/src/message.c +3 -1
  197. data/vendor/libgit2/src/midx.c +879 -0
  198. data/vendor/libgit2/src/midx.h +110 -0
  199. data/vendor/libgit2/src/mwindow.c +214 -95
  200. data/vendor/libgit2/src/mwindow.h +3 -3
  201. data/vendor/libgit2/src/net.c +133 -4
  202. data/vendor/libgit2/src/net.h +16 -2
  203. data/vendor/libgit2/src/netops.c +6 -4
  204. data/vendor/libgit2/src/netops.h +2 -2
  205. data/vendor/libgit2/src/notes.c +10 -10
  206. data/vendor/libgit2/src/object.c +24 -15
  207. data/vendor/libgit2/src/odb.c +298 -57
  208. data/vendor/libgit2/src/odb.h +16 -2
  209. data/vendor/libgit2/src/odb_loose.c +31 -21
  210. data/vendor/libgit2/src/odb_mempack.c +3 -1
  211. data/vendor/libgit2/src/odb_pack.c +391 -114
  212. data/vendor/libgit2/src/oid.c +7 -4
  213. data/vendor/libgit2/src/pack-objects.c +83 -69
  214. data/vendor/libgit2/src/pack.c +383 -150
  215. data/vendor/libgit2/src/pack.h +44 -9
  216. data/vendor/libgit2/src/patch.c +14 -7
  217. data/vendor/libgit2/src/patch_generate.c +3 -5
  218. data/vendor/libgit2/src/patch_parse.c +6 -3
  219. data/vendor/libgit2/src/path.c +102 -57
  220. data/vendor/libgit2/src/path.h +79 -6
  221. data/vendor/libgit2/src/pathspec.c +12 -11
  222. data/vendor/libgit2/src/pool.c +34 -22
  223. data/vendor/libgit2/src/pool.h +9 -1
  224. data/vendor/libgit2/src/posix.c +43 -12
  225. data/vendor/libgit2/src/posix.h +9 -0
  226. data/vendor/libgit2/src/proxy.c +2 -0
  227. data/vendor/libgit2/src/push.c +2 -0
  228. data/vendor/libgit2/src/reader.c +10 -6
  229. data/vendor/libgit2/src/rebase.c +95 -49
  230. data/vendor/libgit2/src/refdb.c +165 -13
  231. data/vendor/libgit2/src/refdb.h +69 -0
  232. data/vendor/libgit2/src/refdb_fs.c +144 -152
  233. data/vendor/libgit2/src/reflog.c +21 -20
  234. data/vendor/libgit2/src/refs.c +151 -231
  235. data/vendor/libgit2/src/refs.h +2 -20
  236. data/vendor/libgit2/src/refspec.c +80 -44
  237. data/vendor/libgit2/src/regexp.c +2 -2
  238. data/vendor/libgit2/src/remote.c +312 -121
  239. data/vendor/libgit2/src/remote.h +2 -1
  240. data/vendor/libgit2/src/repository.c +351 -189
  241. data/vendor/libgit2/src/repository.h +23 -29
  242. data/vendor/libgit2/src/reset.c +7 -6
  243. data/vendor/libgit2/src/revert.c +8 -2
  244. data/vendor/libgit2/src/revparse.c +19 -13
  245. data/vendor/libgit2/src/revwalk.c +35 -20
  246. data/vendor/libgit2/src/runtime.c +162 -0
  247. data/vendor/libgit2/src/runtime.h +62 -0
  248. data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
  249. data/vendor/libgit2/src/signature.c +6 -5
  250. data/vendor/libgit2/src/sortedcache.c +2 -3
  251. data/vendor/libgit2/src/sortedcache.h +10 -8
  252. data/vendor/libgit2/src/stash.c +7 -3
  253. data/vendor/libgit2/src/status.c +9 -4
  254. data/vendor/libgit2/src/strarray.c +64 -0
  255. data/vendor/libgit2/src/streams/mbedtls.c +14 -17
  256. data/vendor/libgit2/src/streams/mbedtls.h +1 -1
  257. data/vendor/libgit2/src/streams/openssl.c +113 -207
  258. data/vendor/libgit2/src/streams/openssl.h +9 -1
  259. data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
  260. data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
  261. data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
  262. data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
  263. data/vendor/libgit2/src/streams/registry.c +10 -9
  264. data/vendor/libgit2/src/streams/socket.c +6 -2
  265. data/vendor/libgit2/src/streams/stransport.c +6 -3
  266. data/vendor/libgit2/src/streams/tls.c +5 -3
  267. data/vendor/libgit2/src/submodule.c +134 -66
  268. data/vendor/libgit2/src/submodule.h +9 -9
  269. data/vendor/libgit2/src/sysdir.c +8 -26
  270. data/vendor/libgit2/src/sysdir.h +0 -11
  271. data/vendor/libgit2/src/tag.c +49 -11
  272. data/vendor/libgit2/src/thread.c +140 -0
  273. data/vendor/libgit2/src/thread.h +479 -0
  274. data/vendor/libgit2/src/threadstate.c +83 -0
  275. data/vendor/libgit2/src/threadstate.h +24 -0
  276. data/vendor/libgit2/src/trace.c +2 -2
  277. data/vendor/libgit2/src/trace.h +17 -13
  278. data/vendor/libgit2/src/transaction.c +21 -9
  279. data/vendor/libgit2/src/transport.c +3 -3
  280. data/vendor/libgit2/src/transports/auth.c +1 -1
  281. data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
  282. data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
  283. data/vendor/libgit2/src/transports/credential.c +17 -7
  284. data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
  285. data/vendor/libgit2/src/transports/git.c +1 -3
  286. data/vendor/libgit2/src/transports/http.c +19 -17
  287. data/vendor/libgit2/src/transports/http.h +1 -0
  288. data/vendor/libgit2/src/transports/httpclient.c +84 -42
  289. data/vendor/libgit2/src/transports/httpclient.h +1 -1
  290. data/vendor/libgit2/src/transports/local.c +5 -5
  291. data/vendor/libgit2/src/transports/smart.c +14 -9
  292. data/vendor/libgit2/src/transports/smart.h +1 -1
  293. data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
  294. data/vendor/libgit2/src/transports/ssh.c +51 -17
  295. data/vendor/libgit2/src/transports/winhttp.c +156 -88
  296. data/vendor/libgit2/src/tree.c +100 -77
  297. data/vendor/libgit2/src/tree.h +1 -0
  298. data/vendor/libgit2/src/tsort.c +0 -2
  299. data/vendor/libgit2/src/unix/map.c +3 -1
  300. data/vendor/libgit2/src/unix/posix.h +16 -1
  301. data/vendor/libgit2/src/unix/pthread.h +2 -1
  302. data/vendor/libgit2/src/utf8.c +150 -0
  303. data/vendor/libgit2/src/utf8.h +52 -0
  304. data/vendor/libgit2/src/util.c +74 -183
  305. data/vendor/libgit2/src/util.h +33 -39
  306. data/vendor/libgit2/src/vector.c +23 -19
  307. data/vendor/libgit2/src/vector.h +4 -2
  308. data/vendor/libgit2/src/win32/findfile.c +4 -2
  309. data/vendor/libgit2/src/win32/git2.rc +18 -3
  310. data/vendor/libgit2/src/win32/map.c +1 -1
  311. data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
  312. data/vendor/libgit2/src/win32/path_w32.c +23 -25
  313. data/vendor/libgit2/src/win32/path_w32.h +0 -1
  314. data/vendor/libgit2/src/win32/posix_w32.c +77 -1
  315. data/vendor/libgit2/src/win32/precompiled.h +0 -1
  316. data/vendor/libgit2/src/win32/reparse.h +4 -4
  317. data/vendor/libgit2/src/win32/thread.c +24 -15
  318. data/vendor/libgit2/src/win32/thread.h +1 -1
  319. data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
  320. data/vendor/libgit2/src/win32/w32_common.h +18 -9
  321. data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
  322. data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
  323. data/vendor/libgit2/src/win32/w32_util.h +6 -6
  324. data/vendor/libgit2/src/worktree.c +37 -15
  325. data/vendor/libgit2/src/zstream.c +1 -1
  326. metadata +56 -38
  327. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
  328. data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
  329. data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
  330. data/vendor/libgit2/src/buf_text.c +0 -316
  331. data/vendor/libgit2/src/buf_text.h +0 -122
  332. data/vendor/libgit2/src/global.c +0 -361
  333. data/vendor/libgit2/src/global.h +0 -41
  334. data/vendor/libgit2/src/thread-utils.c +0 -58
  335. data/vendor/libgit2/src/thread-utils.h +0 -246
  336. data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
  337. data/vendor/libgit2/src/win32/w32_stack.c +0 -188
  338. data/vendor/libgit2/src/win32/w32_stack.h +0 -140
@@ -129,7 +129,8 @@ int git_merge__bases_many(
129
129
  git_commit_list **out,
130
130
  git_revwalk *walk,
131
131
  git_commit_list_node *one,
132
- git_vector *twos);
132
+ git_vector *twos,
133
+ uint32_t minimum_generation);
133
134
 
134
135
  /*
135
136
  * Three-way tree differencing
@@ -8,7 +8,7 @@
8
8
  #include "merge_driver.h"
9
9
 
10
10
  #include "vector.h"
11
- #include "global.h"
11
+ #include "runtime.h"
12
12
  #include "merge.h"
13
13
  #include "git2/merge.h"
14
14
  #include "git2/sys/merge.h"
@@ -32,33 +32,38 @@ static struct merge_driver_registry merge_driver_registry;
32
32
 
33
33
  static void git_merge_driver_global_shutdown(void);
34
34
 
35
- git_repository* git_merge_driver_source_repo(const git_merge_driver_source *src)
35
+ git_repository *git_merge_driver_source_repo(
36
+ const git_merge_driver_source *src)
36
37
  {
37
- assert(src);
38
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
38
39
  return src->repo;
39
40
  }
40
41
 
41
- const git_index_entry* git_merge_driver_source_ancestor(const git_merge_driver_source *src)
42
+ const git_index_entry *git_merge_driver_source_ancestor(
43
+ const git_merge_driver_source *src)
42
44
  {
43
- assert(src);
45
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
44
46
  return src->ancestor;
45
47
  }
46
48
 
47
- const git_index_entry* git_merge_driver_source_ours(const git_merge_driver_source *src)
49
+ const git_index_entry *git_merge_driver_source_ours(
50
+ const git_merge_driver_source *src)
48
51
  {
49
- assert(src);
52
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
50
53
  return src->ours;
51
54
  }
52
55
 
53
- const git_index_entry* git_merge_driver_source_theirs(const git_merge_driver_source *src)
56
+ const git_index_entry *git_merge_driver_source_theirs(
57
+ const git_merge_driver_source *src)
54
58
  {
55
- assert(src);
59
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
56
60
  return src->theirs;
57
61
  }
58
62
 
59
- const git_merge_file_options* git_merge_driver_source_file_options(const git_merge_driver_source *src)
63
+ const git_merge_file_options *git_merge_driver_source_file_options(
64
+ const git_merge_driver_source *src)
60
65
  {
61
- assert(src);
66
+ GIT_ASSERT_ARG_WITH_RETVAL(src, NULL);
62
67
  return src->file_opts;
63
68
  }
64
69
 
@@ -209,7 +214,7 @@ int git_merge_driver_global_init(void)
209
214
  merge_driver_name__binary, &git_merge_driver__binary)) < 0)
210
215
  goto done;
211
216
 
212
- git__on_shutdown(git_merge_driver_global_shutdown);
217
+ error = git_runtime_shutdown_register(git_merge_driver_global_shutdown);
213
218
 
214
219
  done:
215
220
  if (error < 0)
@@ -262,7 +267,8 @@ int git_merge_driver_register(const char *name, git_merge_driver *driver)
262
267
  {
263
268
  int error;
264
269
 
265
- assert(name && driver);
270
+ GIT_ASSERT_ARG(name);
271
+ GIT_ASSERT_ARG(driver);
266
272
 
267
273
  if (git_rwlock_wrlock(&merge_driver_registry.lock) < 0) {
268
274
  git_error_set(GIT_ERROR_OS, "failed to lock merge driver registry");
@@ -28,7 +28,7 @@
28
28
 
29
29
  #define GIT_MERGE_FILE_SIDE_EXISTS(X) ((X)->mode != 0)
30
30
 
31
- int git_merge_file__input_from_index(
31
+ static int merge_file_input_from_index(
32
32
  git_merge_file_input *input_out,
33
33
  git_odb_object **odb_object_out,
34
34
  git_odb *odb,
@@ -36,7 +36,10 @@ int git_merge_file__input_from_index(
36
36
  {
37
37
  int error = 0;
38
38
 
39
- assert(input_out && odb_object_out && odb && entry);
39
+ GIT_ASSERT_ARG(input_out);
40
+ GIT_ASSERT_ARG(odb_object_out);
41
+ GIT_ASSERT_ARG(odb);
42
+ GIT_ASSERT_ARG(entry);
40
43
 
41
44
  if ((error = git_odb_read(odb_object_out, odb, &entry->id)) < 0)
42
45
  goto done;
@@ -241,7 +244,9 @@ int git_merge_file(
241
244
  {
242
245
  git_merge_file_input inputs[3] = { {0} };
243
246
 
244
- assert(out && ours && theirs);
247
+ GIT_ASSERT_ARG(out);
248
+ GIT_ASSERT_ARG(ours);
249
+ GIT_ASSERT_ARG(theirs);
245
250
 
246
251
  memset(out, 0x0, sizeof(git_merge_file_result));
247
252
 
@@ -268,7 +273,10 @@ int git_merge_file_from_index(
268
273
  git_odb_object *odb_object[3] = { 0 };
269
274
  int error = 0;
270
275
 
271
- assert(out && repo && ours && theirs);
276
+ GIT_ASSERT_ARG(out);
277
+ GIT_ASSERT_ARG(repo);
278
+ GIT_ASSERT_ARG(ours);
279
+ GIT_ASSERT_ARG(theirs);
272
280
 
273
281
  memset(out, 0x0, sizeof(git_merge_file_result));
274
282
 
@@ -276,17 +284,15 @@ int git_merge_file_from_index(
276
284
  goto done;
277
285
 
278
286
  if (ancestor) {
279
- if ((error = git_merge_file__input_from_index(
287
+ if ((error = merge_file_input_from_index(
280
288
  &ancestor_input, &odb_object[0], odb, ancestor)) < 0)
281
289
  goto done;
282
290
 
283
291
  ancestor_ptr = &ancestor_input;
284
292
  }
285
293
 
286
- if ((error = git_merge_file__input_from_index(
287
- &our_input, &odb_object[1], odb, ours)) < 0 ||
288
- (error = git_merge_file__input_from_index(
289
- &their_input, &odb_object[2], odb, theirs)) < 0)
294
+ if ((error = merge_file_input_from_index(&our_input, &odb_object[1], odb, ours)) < 0 ||
295
+ (error = merge_file_input_from_index(&their_input, &odb_object[2], odb, theirs)) < 0)
290
296
  goto done;
291
297
 
292
298
  error = merge_file__from_inputs(out,
@@ -28,8 +28,10 @@ int git_message_prettify(git_buf *message_out, const char *message, int strip_co
28
28
  int consecutive_empty_lines = 0;
29
29
  size_t i, line_length, rtrimmed_line_length;
30
30
  char *next_newline;
31
+ int error;
31
32
 
32
- git_buf_sanitize(message_out);
33
+ if ((error = git_buf_sanitize(message_out)) < 0)
34
+ return error;
33
35
 
34
36
  for (i = 0; i < strlen(message); i += line_length) {
35
37
  next_newline = memchr(message + i, '\n', message_len - i);
@@ -0,0 +1,879 @@
1
+ /*
2
+ * Copyright (C) the libgit2 contributors. All rights reserved.
3
+ *
4
+ * This file is part of libgit2, distributed under the GNU GPL v2 with
5
+ * a Linking Exception. For full terms see the included COPYING file.
6
+ */
7
+
8
+ #include "midx.h"
9
+
10
+ #include "array.h"
11
+ #include "buffer.h"
12
+ #include "filebuf.h"
13
+ #include "futils.h"
14
+ #include "hash.h"
15
+ #include "odb.h"
16
+ #include "pack.h"
17
+ #include "path.h"
18
+ #include "repository.h"
19
+
20
+ #define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
21
+ #define MIDX_VERSION 1
22
+ #define MIDX_OBJECT_ID_VERSION 1
23
+ struct git_midx_header {
24
+ uint32_t signature;
25
+ uint8_t version;
26
+ uint8_t object_id_version;
27
+ uint8_t chunks;
28
+ uint8_t base_midx_files;
29
+ uint32_t packfiles;
30
+ };
31
+
32
+ #define MIDX_PACKFILE_NAMES_ID 0x504e414d /* "PNAM" */
33
+ #define MIDX_OID_FANOUT_ID 0x4f494446 /* "OIDF" */
34
+ #define MIDX_OID_LOOKUP_ID 0x4f49444c /* "OIDL" */
35
+ #define MIDX_OBJECT_OFFSETS_ID 0x4f4f4646 /* "OOFF" */
36
+ #define MIDX_OBJECT_LARGE_OFFSETS_ID 0x4c4f4646 /* "LOFF" */
37
+
38
+ struct git_midx_chunk {
39
+ off64_t offset;
40
+ size_t length;
41
+ };
42
+
43
+ typedef int (*midx_write_cb)(const char *buf, size_t size, void *cb_data);
44
+
45
+ static int midx_error(const char *message)
46
+ {
47
+ git_error_set(GIT_ERROR_ODB, "invalid multi-pack-index file - %s", message);
48
+ return -1;
49
+ }
50
+
51
+ static int midx_parse_packfile_names(
52
+ git_midx_file *idx,
53
+ const unsigned char *data,
54
+ uint32_t packfiles,
55
+ struct git_midx_chunk *chunk)
56
+ {
57
+ int error;
58
+ uint32_t i;
59
+ char *packfile_name = (char *)(data + chunk->offset);
60
+ size_t chunk_size = chunk->length, len;
61
+ if (chunk->offset == 0)
62
+ return midx_error("missing Packfile Names chunk");
63
+ if (chunk->length == 0)
64
+ return midx_error("empty Packfile Names chunk");
65
+ if ((error = git_vector_init(&idx->packfile_names, packfiles, git__strcmp_cb)) < 0)
66
+ return error;
67
+ for (i = 0; i < packfiles; ++i) {
68
+ len = p_strnlen(packfile_name, chunk_size);
69
+ if (len == 0)
70
+ return midx_error("empty packfile name");
71
+ if (len + 1 > chunk_size)
72
+ return midx_error("unterminated packfile name");
73
+ git_vector_insert(&idx->packfile_names, packfile_name);
74
+ if (i && strcmp(git_vector_get(&idx->packfile_names, i - 1), packfile_name) >= 0)
75
+ return midx_error("packfile names are not sorted");
76
+ if (strlen(packfile_name) <= strlen(".idx") || git__suffixcmp(packfile_name, ".idx") != 0)
77
+ return midx_error("non-.idx packfile name");
78
+ if (strchr(packfile_name, '/') != NULL || strchr(packfile_name, '\\') != NULL)
79
+ return midx_error("non-local packfile");
80
+ packfile_name += len + 1;
81
+ chunk_size -= len + 1;
82
+ }
83
+ return 0;
84
+ }
85
+
86
+ static int midx_parse_oid_fanout(
87
+ git_midx_file *idx,
88
+ const unsigned char *data,
89
+ struct git_midx_chunk *chunk_oid_fanout)
90
+ {
91
+ uint32_t i, nr;
92
+ if (chunk_oid_fanout->offset == 0)
93
+ return midx_error("missing OID Fanout chunk");
94
+ if (chunk_oid_fanout->length == 0)
95
+ return midx_error("empty OID Fanout chunk");
96
+ if (chunk_oid_fanout->length != 256 * 4)
97
+ return midx_error("OID Fanout chunk has wrong length");
98
+
99
+ idx->oid_fanout = (const uint32_t *)(data + chunk_oid_fanout->offset);
100
+ nr = 0;
101
+ for (i = 0; i < 256; ++i) {
102
+ uint32_t n = ntohl(idx->oid_fanout[i]);
103
+ if (n < nr)
104
+ return midx_error("index is non-monotonic");
105
+ nr = n;
106
+ }
107
+ idx->num_objects = nr;
108
+ return 0;
109
+ }
110
+
111
+ static int midx_parse_oid_lookup(
112
+ git_midx_file *idx,
113
+ const unsigned char *data,
114
+ struct git_midx_chunk *chunk_oid_lookup)
115
+ {
116
+ uint32_t i;
117
+ git_oid *oid, *prev_oid, zero_oid = {{0}};
118
+
119
+ if (chunk_oid_lookup->offset == 0)
120
+ return midx_error("missing OID Lookup chunk");
121
+ if (chunk_oid_lookup->length == 0)
122
+ return midx_error("empty OID Lookup chunk");
123
+ if (chunk_oid_lookup->length != idx->num_objects * GIT_OID_RAWSZ)
124
+ return midx_error("OID Lookup chunk has wrong length");
125
+
126
+ idx->oid_lookup = oid = (git_oid *)(data + chunk_oid_lookup->offset);
127
+ prev_oid = &zero_oid;
128
+ for (i = 0; i < idx->num_objects; ++i, ++oid) {
129
+ if (git_oid_cmp(prev_oid, oid) >= 0)
130
+ return midx_error("OID Lookup index is non-monotonic");
131
+ prev_oid = oid;
132
+ }
133
+
134
+ return 0;
135
+ }
136
+
137
+ static int midx_parse_object_offsets(
138
+ git_midx_file *idx,
139
+ const unsigned char *data,
140
+ struct git_midx_chunk *chunk_object_offsets)
141
+ {
142
+ if (chunk_object_offsets->offset == 0)
143
+ return midx_error("missing Object Offsets chunk");
144
+ if (chunk_object_offsets->length == 0)
145
+ return midx_error("empty Object Offsets chunk");
146
+ if (chunk_object_offsets->length != idx->num_objects * 8)
147
+ return midx_error("Object Offsets chunk has wrong length");
148
+
149
+ idx->object_offsets = data + chunk_object_offsets->offset;
150
+
151
+ return 0;
152
+ }
153
+
154
+ static int midx_parse_object_large_offsets(
155
+ git_midx_file *idx,
156
+ const unsigned char *data,
157
+ struct git_midx_chunk *chunk_object_large_offsets)
158
+ {
159
+ if (chunk_object_large_offsets->length == 0)
160
+ return 0;
161
+ if (chunk_object_large_offsets->length % 8 != 0)
162
+ return midx_error("malformed Object Large Offsets chunk");
163
+
164
+ idx->object_large_offsets = data + chunk_object_large_offsets->offset;
165
+ idx->num_object_large_offsets = chunk_object_large_offsets->length / 8;
166
+
167
+ return 0;
168
+ }
169
+
170
+ int git_midx_parse(
171
+ git_midx_file *idx,
172
+ const unsigned char *data,
173
+ size_t size)
174
+ {
175
+ struct git_midx_header *hdr;
176
+ const unsigned char *chunk_hdr;
177
+ struct git_midx_chunk *last_chunk;
178
+ uint32_t i;
179
+ off64_t last_chunk_offset, chunk_offset, trailer_offset;
180
+ git_oid idx_checksum = {{0}};
181
+ int error;
182
+ struct git_midx_chunk chunk_packfile_names = {0},
183
+ chunk_oid_fanout = {0},
184
+ chunk_oid_lookup = {0},
185
+ chunk_object_offsets = {0},
186
+ chunk_object_large_offsets = {0};
187
+
188
+ GIT_ASSERT_ARG(idx);
189
+
190
+ if (size < sizeof(struct git_midx_header) + GIT_OID_RAWSZ)
191
+ return midx_error("multi-pack index is too short");
192
+
193
+ hdr = ((struct git_midx_header *)data);
194
+
195
+ if (hdr->signature != htonl(MIDX_SIGNATURE) ||
196
+ hdr->version != MIDX_VERSION ||
197
+ hdr->object_id_version != MIDX_OBJECT_ID_VERSION) {
198
+ return midx_error("unsupported multi-pack index version");
199
+ }
200
+ if (hdr->chunks == 0)
201
+ return midx_error("no chunks in multi-pack index");
202
+
203
+ /*
204
+ * The very first chunk's offset should be after the header, all the chunk
205
+ * headers, and a special zero chunk.
206
+ */
207
+ last_chunk_offset =
208
+ sizeof(struct git_midx_header) +
209
+ (1 + hdr->chunks) * 12;
210
+ trailer_offset = size - GIT_OID_RAWSZ;
211
+ if (trailer_offset < last_chunk_offset)
212
+ return midx_error("wrong index size");
213
+ git_oid_cpy(&idx->checksum, (git_oid *)(data + trailer_offset));
214
+
215
+ if (git_hash_buf(&idx_checksum, data, (size_t)trailer_offset) < 0)
216
+ return midx_error("could not calculate signature");
217
+ if (!git_oid_equal(&idx_checksum, &idx->checksum))
218
+ return midx_error("index signature mismatch");
219
+
220
+ chunk_hdr = data + sizeof(struct git_midx_header);
221
+ last_chunk = NULL;
222
+ for (i = 0; i < hdr->chunks; ++i, chunk_hdr += 12) {
223
+ chunk_offset = ((off64_t)ntohl(*((uint32_t *)(chunk_hdr + 4)))) << 32 |
224
+ ((off64_t)ntohl(*((uint32_t *)(chunk_hdr + 8))));
225
+ if (chunk_offset < last_chunk_offset)
226
+ return midx_error("chunks are non-monotonic");
227
+ if (chunk_offset >= trailer_offset)
228
+ return midx_error("chunks extend beyond the trailer");
229
+ if (last_chunk != NULL)
230
+ last_chunk->length = (size_t)(chunk_offset - last_chunk_offset);
231
+ last_chunk_offset = chunk_offset;
232
+
233
+ switch (ntohl(*((uint32_t *)(chunk_hdr + 0)))) {
234
+ case MIDX_PACKFILE_NAMES_ID:
235
+ chunk_packfile_names.offset = last_chunk_offset;
236
+ last_chunk = &chunk_packfile_names;
237
+ break;
238
+
239
+ case MIDX_OID_FANOUT_ID:
240
+ chunk_oid_fanout.offset = last_chunk_offset;
241
+ last_chunk = &chunk_oid_fanout;
242
+ break;
243
+
244
+ case MIDX_OID_LOOKUP_ID:
245
+ chunk_oid_lookup.offset = last_chunk_offset;
246
+ last_chunk = &chunk_oid_lookup;
247
+ break;
248
+
249
+ case MIDX_OBJECT_OFFSETS_ID:
250
+ chunk_object_offsets.offset = last_chunk_offset;
251
+ last_chunk = &chunk_object_offsets;
252
+ break;
253
+
254
+ case MIDX_OBJECT_LARGE_OFFSETS_ID:
255
+ chunk_object_large_offsets.offset = last_chunk_offset;
256
+ last_chunk = &chunk_object_large_offsets;
257
+ break;
258
+
259
+ default:
260
+ return midx_error("unrecognized chunk ID");
261
+ }
262
+ }
263
+ last_chunk->length = (size_t)(trailer_offset - last_chunk_offset);
264
+
265
+ error = midx_parse_packfile_names(
266
+ idx, data, ntohl(hdr->packfiles), &chunk_packfile_names);
267
+ if (error < 0)
268
+ return error;
269
+ error = midx_parse_oid_fanout(idx, data, &chunk_oid_fanout);
270
+ if (error < 0)
271
+ return error;
272
+ error = midx_parse_oid_lookup(idx, data, &chunk_oid_lookup);
273
+ if (error < 0)
274
+ return error;
275
+ error = midx_parse_object_offsets(idx, data, &chunk_object_offsets);
276
+ if (error < 0)
277
+ return error;
278
+ error = midx_parse_object_large_offsets(idx, data, &chunk_object_large_offsets);
279
+ if (error < 0)
280
+ return error;
281
+
282
+ return 0;
283
+ }
284
+
285
+ int git_midx_open(
286
+ git_midx_file **idx_out,
287
+ const char *path)
288
+ {
289
+ git_midx_file *idx;
290
+ git_file fd = -1;
291
+ size_t idx_size;
292
+ struct stat st;
293
+ int error;
294
+
295
+ /* TODO: properly open the file without access time using O_NOATIME */
296
+ fd = git_futils_open_ro(path);
297
+ if (fd < 0)
298
+ return fd;
299
+
300
+ if (p_fstat(fd, &st) < 0) {
301
+ p_close(fd);
302
+ git_error_set(GIT_ERROR_ODB, "multi-pack-index file not found - '%s'", path);
303
+ return -1;
304
+ }
305
+
306
+ if (!S_ISREG(st.st_mode) || !git__is_sizet(st.st_size)) {
307
+ p_close(fd);
308
+ git_error_set(GIT_ERROR_ODB, "invalid pack index '%s'", path);
309
+ return -1;
310
+ }
311
+ idx_size = (size_t)st.st_size;
312
+
313
+ idx = git__calloc(1, sizeof(git_midx_file));
314
+ GIT_ERROR_CHECK_ALLOC(idx);
315
+
316
+ error = git_buf_sets(&idx->filename, path);
317
+ if (error < 0)
318
+ return error;
319
+
320
+ error = git_futils_mmap_ro(&idx->index_map, fd, 0, idx_size);
321
+ p_close(fd);
322
+ if (error < 0) {
323
+ git_midx_free(idx);
324
+ return error;
325
+ }
326
+
327
+ if ((error = git_midx_parse(idx, idx->index_map.data, idx_size)) < 0) {
328
+ git_midx_free(idx);
329
+ return error;
330
+ }
331
+
332
+ *idx_out = idx;
333
+ return 0;
334
+ }
335
+
336
+ bool git_midx_needs_refresh(
337
+ const git_midx_file *idx,
338
+ const char *path)
339
+ {
340
+ git_file fd = -1;
341
+ struct stat st;
342
+ ssize_t bytes_read;
343
+ git_oid idx_checksum = {{0}};
344
+
345
+ /* TODO: properly open the file without access time using O_NOATIME */
346
+ fd = git_futils_open_ro(path);
347
+ if (fd < 0)
348
+ return true;
349
+
350
+ if (p_fstat(fd, &st) < 0) {
351
+ p_close(fd);
352
+ return true;
353
+ }
354
+
355
+ if (!S_ISREG(st.st_mode) ||
356
+ !git__is_sizet(st.st_size) ||
357
+ (size_t)st.st_size != idx->index_map.len) {
358
+ p_close(fd);
359
+ return true;
360
+ }
361
+
362
+ bytes_read = p_pread(fd, &idx_checksum, GIT_OID_RAWSZ, st.st_size - GIT_OID_RAWSZ);
363
+ p_close(fd);
364
+
365
+ if (bytes_read != GIT_OID_RAWSZ)
366
+ return true;
367
+
368
+ return !git_oid_equal(&idx_checksum, &idx->checksum);
369
+ }
370
+
371
+ int git_midx_entry_find(
372
+ git_midx_entry *e,
373
+ git_midx_file *idx,
374
+ const git_oid *short_oid,
375
+ size_t len)
376
+ {
377
+ int pos, found = 0;
378
+ size_t pack_index;
379
+ uint32_t hi, lo;
380
+ const git_oid *current = NULL;
381
+ const unsigned char *object_offset;
382
+ off64_t offset;
383
+
384
+ GIT_ASSERT_ARG(idx);
385
+
386
+ hi = ntohl(idx->oid_fanout[(int)short_oid->id[0]]);
387
+ lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(idx->oid_fanout[(int)short_oid->id[0] - 1]));
388
+
389
+ pos = git_pack__lookup_sha1(idx->oid_lookup, GIT_OID_RAWSZ, lo, hi, short_oid->id);
390
+
391
+ if (pos >= 0) {
392
+ /* An object matching exactly the oid was found */
393
+ found = 1;
394
+ current = idx->oid_lookup + pos;
395
+ } else {
396
+ /* No object was found */
397
+ /* pos refers to the object with the "closest" oid to short_oid */
398
+ pos = -1 - pos;
399
+ if (pos < (int)idx->num_objects) {
400
+ current = idx->oid_lookup + pos;
401
+
402
+ if (!git_oid_ncmp(short_oid, current, len))
403
+ found = 1;
404
+ }
405
+ }
406
+
407
+ if (found && len != GIT_OID_HEXSZ && pos + 1 < (int)idx->num_objects) {
408
+ /* Check for ambiguousity */
409
+ const git_oid *next = current + 1;
410
+
411
+ if (!git_oid_ncmp(short_oid, next, len)) {
412
+ found = 2;
413
+ }
414
+ }
415
+
416
+ if (!found)
417
+ return git_odb__error_notfound("failed to find offset for multi-pack index entry", short_oid, len);
418
+ if (found > 1)
419
+ return git_odb__error_ambiguous("found multiple offsets for multi-pack index entry");
420
+
421
+ object_offset = idx->object_offsets + pos * 8;
422
+ offset = ntohl(*((uint32_t *)(object_offset + 4)));
423
+ if (offset & 0x80000000) {
424
+ uint32_t object_large_offsets_pos = offset & 0x7fffffff;
425
+ const unsigned char *object_large_offsets_index = idx->object_large_offsets;
426
+
427
+ /* Make sure we're not being sent out of bounds */
428
+ if (object_large_offsets_pos >= idx->num_object_large_offsets)
429
+ return git_odb__error_notfound("invalid index into the object large offsets table", short_oid, len);
430
+
431
+ object_large_offsets_index += 8 * object_large_offsets_pos;
432
+
433
+ offset = (((uint64_t)ntohl(*((uint32_t *)(object_large_offsets_index + 0)))) << 32) |
434
+ ntohl(*((uint32_t *)(object_large_offsets_index + 4)));
435
+ }
436
+ pack_index = ntohl(*((uint32_t *)(object_offset + 0)));
437
+ if (pack_index >= git_vector_length(&idx->packfile_names))
438
+ return midx_error("invalid index into the packfile names table");
439
+ e->pack_index = pack_index;
440
+ e->offset = offset;
441
+ git_oid_cpy(&e->sha1, current);
442
+ return 0;
443
+ }
444
+
445
+ int git_midx_foreach_entry(
446
+ git_midx_file *idx,
447
+ git_odb_foreach_cb cb,
448
+ void *data)
449
+ {
450
+ size_t i;
451
+ int error;
452
+
453
+ GIT_ASSERT_ARG(idx);
454
+
455
+ for (i = 0; i < idx->num_objects; ++i) {
456
+ if ((error = cb(&idx->oid_lookup[i], data)) != 0)
457
+ return git_error_set_after_callback(error);
458
+ }
459
+
460
+ return error;
461
+ }
462
+
463
+ int git_midx_close(git_midx_file *idx)
464
+ {
465
+ GIT_ASSERT_ARG(idx);
466
+
467
+ if (idx->index_map.data)
468
+ git_futils_mmap_free(&idx->index_map);
469
+
470
+ git_vector_free(&idx->packfile_names);
471
+
472
+ return 0;
473
+ }
474
+
475
+ void git_midx_free(git_midx_file *idx)
476
+ {
477
+ if (!idx)
478
+ return;
479
+
480
+ git_buf_dispose(&idx->filename);
481
+ git_midx_close(idx);
482
+ git__free(idx);
483
+ }
484
+
485
+ static int packfile__cmp(const void *a_, const void *b_)
486
+ {
487
+ const struct git_pack_file *a = a_;
488
+ const struct git_pack_file *b = b_;
489
+
490
+ return strcmp(a->pack_name, b->pack_name);
491
+ }
492
+
493
+ int git_midx_writer_new(
494
+ git_midx_writer **out,
495
+ const char *pack_dir)
496
+ {
497
+ git_midx_writer *w = git__calloc(1, sizeof(git_midx_writer));
498
+ GIT_ERROR_CHECK_ALLOC(w);
499
+
500
+ if (git_buf_sets(&w->pack_dir, pack_dir) < 0) {
501
+ git__free(w);
502
+ return -1;
503
+ }
504
+ git_path_squash_slashes(&w->pack_dir);
505
+
506
+ if (git_vector_init(&w->packs, 0, packfile__cmp) < 0) {
507
+ git_buf_dispose(&w->pack_dir);
508
+ git__free(w);
509
+ return -1;
510
+ }
511
+
512
+ *out = w;
513
+ return 0;
514
+ }
515
+
516
+ void git_midx_writer_free(git_midx_writer *w)
517
+ {
518
+ struct git_pack_file *p;
519
+ size_t i;
520
+
521
+ if (!w)
522
+ return;
523
+
524
+ git_vector_foreach (&w->packs, i, p)
525
+ git_mwindow_put_pack(p);
526
+ git_vector_free(&w->packs);
527
+ git_buf_dispose(&w->pack_dir);
528
+ git__free(w);
529
+ }
530
+
531
+ int git_midx_writer_add(
532
+ git_midx_writer *w,
533
+ const char *idx_path)
534
+ {
535
+ git_buf idx_path_buf = GIT_BUF_INIT;
536
+ int error;
537
+ struct git_pack_file *p;
538
+
539
+ error = git_path_prettify(&idx_path_buf, idx_path, git_buf_cstr(&w->pack_dir));
540
+ if (error < 0)
541
+ return error;
542
+
543
+ error = git_mwindow_get_pack(&p, git_buf_cstr(&idx_path_buf));
544
+ git_buf_dispose(&idx_path_buf);
545
+ if (error < 0)
546
+ return error;
547
+
548
+ error = git_vector_insert(&w->packs, p);
549
+ if (error < 0) {
550
+ git_mwindow_put_pack(p);
551
+ return error;
552
+ }
553
+
554
+ return 0;
555
+ }
556
+
557
+ typedef git_array_t(git_midx_entry) object_entry_array_t;
558
+
559
+ struct object_entry_cb_state {
560
+ uint32_t pack_index;
561
+ object_entry_array_t *object_entries_array;
562
+ };
563
+
564
+ static int object_entry__cb(const git_oid *oid, off64_t offset, void *data)
565
+ {
566
+ struct object_entry_cb_state *state = (struct object_entry_cb_state *)data;
567
+
568
+ git_midx_entry *entry = git_array_alloc(*state->object_entries_array);
569
+ GIT_ERROR_CHECK_ALLOC(entry);
570
+
571
+ git_oid_cpy(&entry->sha1, oid);
572
+ entry->offset = offset;
573
+ entry->pack_index = state->pack_index;
574
+
575
+ return 0;
576
+ }
577
+
578
+ static int object_entry__cmp(const void *a_, const void *b_)
579
+ {
580
+ const git_midx_entry *a = (const git_midx_entry *)a_;
581
+ const git_midx_entry *b = (const git_midx_entry *)b_;
582
+
583
+ return git_oid_cmp(&a->sha1, &b->sha1);
584
+ }
585
+
586
+ static int write_offset(off64_t offset, midx_write_cb write_cb, void *cb_data)
587
+ {
588
+ int error;
589
+ uint32_t word;
590
+
591
+ word = htonl((uint32_t)((offset >> 32) & 0xffffffffu));
592
+ error = write_cb((const char *)&word, sizeof(word), cb_data);
593
+ if (error < 0)
594
+ return error;
595
+ word = htonl((uint32_t)((offset >> 0) & 0xffffffffu));
596
+ error = write_cb((const char *)&word, sizeof(word), cb_data);
597
+ if (error < 0)
598
+ return error;
599
+
600
+ return 0;
601
+ }
602
+
603
+ static int write_chunk_header(int chunk_id, off64_t offset, midx_write_cb write_cb, void *cb_data)
604
+ {
605
+ uint32_t word = htonl(chunk_id);
606
+ int error = write_cb((const char *)&word, sizeof(word), cb_data);
607
+ if (error < 0)
608
+ return error;
609
+ return write_offset(offset, write_cb, cb_data);
610
+
611
+ return 0;
612
+ }
613
+
614
+ static int midx_write_buf(const char *buf, size_t size, void *data)
615
+ {
616
+ git_buf *b = (git_buf *)data;
617
+ return git_buf_put(b, buf, size);
618
+ }
619
+
620
+ struct midx_write_hash_context {
621
+ midx_write_cb write_cb;
622
+ void *cb_data;
623
+ git_hash_ctx *ctx;
624
+ };
625
+
626
+ static int midx_write_hash(const char *buf, size_t size, void *data)
627
+ {
628
+ struct midx_write_hash_context *ctx = (struct midx_write_hash_context *)data;
629
+ int error;
630
+
631
+ error = git_hash_update(ctx->ctx, buf, size);
632
+ if (error < 0)
633
+ return error;
634
+
635
+ return ctx->write_cb(buf, size, ctx->cb_data);
636
+ }
637
+
638
+ static int midx_write(
639
+ git_midx_writer *w,
640
+ midx_write_cb write_cb,
641
+ void *cb_data)
642
+ {
643
+ int error = 0;
644
+ size_t i;
645
+ struct git_pack_file *p;
646
+ struct git_midx_header hdr = {0};
647
+ uint32_t oid_fanout_count;
648
+ uint32_t object_large_offsets_count;
649
+ uint32_t oid_fanout[256];
650
+ off64_t offset;
651
+ git_buf packfile_names = GIT_BUF_INIT,
652
+ oid_lookup = GIT_BUF_INIT,
653
+ object_offsets = GIT_BUF_INIT,
654
+ object_large_offsets = GIT_BUF_INIT;
655
+ git_oid idx_checksum = {{0}};
656
+ git_midx_entry *entry;
657
+ object_entry_array_t object_entries_array = GIT_ARRAY_INIT;
658
+ git_vector object_entries = GIT_VECTOR_INIT;
659
+ git_hash_ctx ctx;
660
+ struct midx_write_hash_context hash_cb_data = {0};
661
+
662
+ hdr.signature = htonl(MIDX_SIGNATURE);
663
+ hdr.version = MIDX_VERSION;
664
+ hdr.object_id_version = MIDX_OBJECT_ID_VERSION;
665
+ hdr.base_midx_files = 0;
666
+
667
+ hash_cb_data.write_cb = write_cb;
668
+ hash_cb_data.cb_data = cb_data;
669
+ hash_cb_data.ctx = &ctx;
670
+
671
+ error = git_hash_ctx_init(&ctx);
672
+ if (error < 0)
673
+ return error;
674
+ cb_data = &hash_cb_data;
675
+ write_cb = midx_write_hash;
676
+
677
+ git_vector_sort(&w->packs);
678
+ git_vector_foreach (&w->packs, i, p) {
679
+ git_buf relative_index = GIT_BUF_INIT;
680
+ struct object_entry_cb_state state = {0};
681
+ size_t path_len;
682
+
683
+ state.pack_index = (uint32_t)i;
684
+ state.object_entries_array = &object_entries_array;
685
+
686
+ error = git_buf_sets(&relative_index, p->pack_name);
687
+ if (error < 0)
688
+ goto cleanup;
689
+ error = git_path_make_relative(&relative_index, git_buf_cstr(&w->pack_dir));
690
+ if (error < 0) {
691
+ git_buf_dispose(&relative_index);
692
+ goto cleanup;
693
+ }
694
+ path_len = git_buf_len(&relative_index);
695
+ if (path_len <= strlen(".pack") || git__suffixcmp(git_buf_cstr(&relative_index), ".pack") != 0) {
696
+ git_buf_dispose(&relative_index);
697
+ git_error_set(GIT_ERROR_INVALID, "invalid packfile name: '%s'", p->pack_name);
698
+ error = -1;
699
+ goto cleanup;
700
+ }
701
+ path_len -= strlen(".pack");
702
+
703
+ git_buf_put(&packfile_names, git_buf_cstr(&relative_index), path_len);
704
+ git_buf_puts(&packfile_names, ".idx");
705
+ git_buf_putc(&packfile_names, '\0');
706
+ git_buf_dispose(&relative_index);
707
+
708
+ error = git_pack_foreach_entry_offset(p, object_entry__cb, &state);
709
+ if (error < 0)
710
+ goto cleanup;
711
+ }
712
+
713
+ /* Sort the object entries. */
714
+ error = git_vector_init(&object_entries, git_array_size(object_entries_array), object_entry__cmp);
715
+ if (error < 0)
716
+ goto cleanup;
717
+ git_array_foreach (object_entries_array, i, entry) {
718
+ if ((error = git_vector_set(NULL, &object_entries, i, entry)) < 0)
719
+ goto cleanup;
720
+ }
721
+ git_vector_set_sorted(&object_entries, 0);
722
+ git_vector_sort(&object_entries);
723
+ git_vector_uniq(&object_entries, NULL);
724
+
725
+ /* Pad the packfile names so it is a multiple of four. */
726
+ while (git_buf_len(&packfile_names) & 3)
727
+ git_buf_putc(&packfile_names, '\0');
728
+
729
+ /* Fill the OID Fanout table. */
730
+ oid_fanout_count = 0;
731
+ for (i = 0; i < 256; i++) {
732
+ while (oid_fanout_count < git_vector_length(&object_entries) &&
733
+ ((const git_midx_entry *)git_vector_get(&object_entries, oid_fanout_count))->sha1.id[0] <= i)
734
+ ++oid_fanout_count;
735
+ oid_fanout[i] = htonl(oid_fanout_count);
736
+ }
737
+
738
+ /* Fill the OID Lookup table. */
739
+ git_vector_foreach (&object_entries, i, entry) {
740
+ error = git_buf_put(&oid_lookup, (const char *)&entry->sha1, sizeof(entry->sha1));
741
+ if (error < 0)
742
+ goto cleanup;
743
+ }
744
+
745
+ /* Fill the Object Offsets and Object Large Offsets tables. */
746
+ object_large_offsets_count = 0;
747
+ git_vector_foreach (&object_entries, i, entry) {
748
+ uint32_t word;
749
+
750
+ word = htonl((uint32_t)entry->pack_index);
751
+ error = git_buf_put(&object_offsets, (const char *)&word, sizeof(word));
752
+ if (error < 0)
753
+ goto cleanup;
754
+ if (entry->offset >= 0x80000000l) {
755
+ word = htonl(0x80000000u | object_large_offsets_count++);
756
+ if ((error = write_offset(entry->offset, midx_write_buf, &object_large_offsets)) < 0)
757
+ goto cleanup;
758
+ } else {
759
+ word = htonl((uint32_t)entry->offset & 0x7fffffffu);
760
+ }
761
+
762
+ error = git_buf_put(&object_offsets, (const char *)&word, sizeof(word));
763
+ if (error < 0)
764
+ goto cleanup;
765
+ }
766
+
767
+ /* Write the header. */
768
+ hdr.packfiles = htonl((uint32_t)git_vector_length(&w->packs));
769
+ hdr.chunks = 4;
770
+ if (git_buf_len(&object_large_offsets) > 0)
771
+ hdr.chunks++;
772
+ error = write_cb((const char *)&hdr, sizeof(hdr), cb_data);
773
+ if (error < 0)
774
+ goto cleanup;
775
+
776
+ /* Write the chunk headers. */
777
+ offset = sizeof(hdr) + (hdr.chunks + 1) * 12;
778
+ error = write_chunk_header(MIDX_PACKFILE_NAMES_ID, offset, write_cb, cb_data);
779
+ if (error < 0)
780
+ goto cleanup;
781
+ offset += git_buf_len(&packfile_names);
782
+ error = write_chunk_header(MIDX_OID_FANOUT_ID, offset, write_cb, cb_data);
783
+ if (error < 0)
784
+ goto cleanup;
785
+ offset += sizeof(oid_fanout);
786
+ error = write_chunk_header(MIDX_OID_LOOKUP_ID, offset, write_cb, cb_data);
787
+ if (error < 0)
788
+ goto cleanup;
789
+ offset += git_buf_len(&oid_lookup);
790
+ error = write_chunk_header(MIDX_OBJECT_OFFSETS_ID, offset, write_cb, cb_data);
791
+ if (error < 0)
792
+ goto cleanup;
793
+ offset += git_buf_len(&object_offsets);
794
+ if (git_buf_len(&object_large_offsets) > 0) {
795
+ error = write_chunk_header(MIDX_OBJECT_LARGE_OFFSETS_ID, offset, write_cb, cb_data);
796
+ if (error < 0)
797
+ goto cleanup;
798
+ offset += git_buf_len(&object_large_offsets);
799
+ }
800
+ error = write_chunk_header(0, offset, write_cb, cb_data);
801
+ if (error < 0)
802
+ goto cleanup;
803
+
804
+ /* Write all the chunks. */
805
+ error = write_cb(git_buf_cstr(&packfile_names), git_buf_len(&packfile_names), cb_data);
806
+ if (error < 0)
807
+ goto cleanup;
808
+ error = write_cb((const char *)oid_fanout, sizeof(oid_fanout), cb_data);
809
+ if (error < 0)
810
+ goto cleanup;
811
+ error = write_cb(git_buf_cstr(&oid_lookup), git_buf_len(&oid_lookup), cb_data);
812
+ if (error < 0)
813
+ goto cleanup;
814
+ error = write_cb(git_buf_cstr(&object_offsets), git_buf_len(&object_offsets), cb_data);
815
+ if (error < 0)
816
+ goto cleanup;
817
+ error = write_cb(git_buf_cstr(&object_large_offsets), git_buf_len(&object_large_offsets), cb_data);
818
+ if (error < 0)
819
+ goto cleanup;
820
+
821
+ /* Finalize the checksum and write the trailer. */
822
+ error = git_hash_final(&idx_checksum, &ctx);
823
+ if (error < 0)
824
+ goto cleanup;
825
+ error = write_cb((const char *)&idx_checksum, sizeof(idx_checksum), cb_data);
826
+ if (error < 0)
827
+ goto cleanup;
828
+
829
+ cleanup:
830
+ git_array_clear(object_entries_array);
831
+ git_vector_free(&object_entries);
832
+ git_buf_dispose(&packfile_names);
833
+ git_buf_dispose(&oid_lookup);
834
+ git_buf_dispose(&object_offsets);
835
+ git_buf_dispose(&object_large_offsets);
836
+ git_hash_ctx_cleanup(&ctx);
837
+ return error;
838
+ }
839
+
840
+ static int midx_write_filebuf(const char *buf, size_t size, void *data)
841
+ {
842
+ git_filebuf *f = (git_filebuf *)data;
843
+ return git_filebuf_write(f, buf, size);
844
+ }
845
+
846
+ int git_midx_writer_commit(
847
+ git_midx_writer *w)
848
+ {
849
+ int error;
850
+ int filebuf_flags = GIT_FILEBUF_DO_NOT_BUFFER;
851
+ git_buf midx_path = GIT_BUF_INIT;
852
+ git_filebuf output = GIT_FILEBUF_INIT;
853
+
854
+ error = git_buf_joinpath(&midx_path, git_buf_cstr(&w->pack_dir), "multi-pack-index");
855
+ if (error < 0)
856
+ return error;
857
+
858
+ if (git_repository__fsync_gitdir)
859
+ filebuf_flags |= GIT_FILEBUF_FSYNC;
860
+ error = git_filebuf_open(&output, git_buf_cstr(&midx_path), filebuf_flags, 0644);
861
+ git_buf_dispose(&midx_path);
862
+ if (error < 0)
863
+ return error;
864
+
865
+ error = midx_write(w, midx_write_filebuf, &output);
866
+ if (error < 0) {
867
+ git_filebuf_cleanup(&output);
868
+ return error;
869
+ }
870
+
871
+ return git_filebuf_commit(&output);
872
+ }
873
+
874
+ int git_midx_writer_dump(
875
+ git_buf *midx,
876
+ git_midx_writer *w)
877
+ {
878
+ return midx_write(w, midx_write_buf, midx);
879
+ }