rugged 1.3.2 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +34 -2
- data/ext/rugged/extconf.rb +7 -4
- data/ext/rugged/rugged.c +16 -0
- data/ext/rugged/rugged.h +4 -0
- data/ext/rugged/rugged_blame.c +2 -0
- data/ext/rugged/rugged_blob.c +3 -0
- data/ext/rugged/rugged_commit.c +1 -0
- data/ext/rugged/rugged_config.c +9 -2
- data/ext/rugged/rugged_diff.c +1 -0
- data/ext/rugged/rugged_index.c +2 -0
- data/ext/rugged/rugged_patch.c +1 -0
- data/ext/rugged/rugged_rebase.c +1 -0
- data/ext/rugged/rugged_reference.c +1 -0
- data/ext/rugged/rugged_remote.c +28 -10
- data/ext/rugged/rugged_repo.c +7 -9
- data/ext/rugged/rugged_revwalk.c +5 -1
- data/ext/rugged/rugged_settings.c +5 -0
- data/ext/rugged/rugged_submodule.c +1 -0
- data/ext/rugged/rugged_tag.c +1 -0
- data/ext/rugged/rugged_tree.c +4 -0
- data/lib/rugged/index.rb +1 -1
- data/lib/rugged/tree.rb +5 -1
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +132 -288
- data/vendor/libgit2/COPYING +106 -19
- data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
- data/vendor/libgit2/cmake/AddClarTest.cmake +7 -0
- data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
- data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
- data/vendor/libgit2/cmake/ExperimentalFeatures.cmake +23 -0
- data/vendor/libgit2/cmake/FindCoreFoundation.cmake +13 -13
- data/vendor/libgit2/cmake/FindGSSAPI.cmake +171 -287
- data/vendor/libgit2/cmake/FindGSSFramework.cmake +13 -13
- data/vendor/libgit2/cmake/{FindHTTP_Parser.cmake → FindHTTPParser.cmake} +17 -17
- data/vendor/libgit2/cmake/FindIconv.cmake +27 -27
- data/vendor/libgit2/cmake/FindLibSSH2.cmake +5 -5
- data/vendor/libgit2/cmake/FindPCRE.cmake +12 -13
- data/vendor/libgit2/cmake/FindPCRE2.cmake +12 -12
- data/vendor/libgit2/cmake/FindPkgLibraries.cmake +19 -19
- data/vendor/libgit2/cmake/FindSecurity.cmake +14 -14
- data/vendor/libgit2/cmake/FindStatNsec.cmake +12 -18
- data/vendor/libgit2/cmake/Findfutimens.cmake +8 -8
- data/vendor/libgit2/cmake/FindmbedTLS.cmake +63 -70
- data/vendor/libgit2/cmake/IdeSplitSources.cmake +18 -18
- data/vendor/libgit2/cmake/PkgBuildConfig.cmake +60 -60
- data/vendor/libgit2/cmake/SanitizeBool.cmake +20 -20
- data/vendor/libgit2/cmake/SelectGSSAPI.cmake +37 -37
- data/vendor/libgit2/cmake/SelectHTTPParser.cmake +19 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +100 -100
- data/vendor/libgit2/cmake/SelectHashes.cmake +91 -53
- data/vendor/libgit2/cmake/SelectRegex.cmake +51 -0
- data/vendor/libgit2/cmake/SelectSSH.cmake +41 -0
- data/vendor/libgit2/cmake/SelectWinHTTP.cmake +17 -0
- data/vendor/libgit2/cmake/SelectZlib.cmake +34 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +6 -6
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +33 -31
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +3 -1
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +4 -4
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +2 -2
- data/vendor/libgit2/deps/pcre/CMakeLists.txt +88 -88
- data/vendor/libgit2/deps/winhttp/CMakeLists.txt +14 -16
- data/vendor/libgit2/deps/zlib/adler32.c +7 -0
- data/vendor/libgit2/deps/zlib/crc32.c +975 -288
- data/vendor/libgit2/deps/zlib/crc32.h +9441 -436
- data/vendor/libgit2/deps/zlib/deflate.c +83 -31
- data/vendor/libgit2/deps/zlib/deflate.h +12 -15
- data/vendor/libgit2/deps/zlib/gzguts.h +3 -2
- data/vendor/libgit2/deps/zlib/infback.c +2 -1
- data/vendor/libgit2/deps/zlib/inffast.c +14 -14
- data/vendor/libgit2/deps/zlib/inflate.c +39 -8
- data/vendor/libgit2/deps/zlib/inflate.h +3 -2
- data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
- data/vendor/libgit2/deps/zlib/trees.c +27 -48
- data/vendor/libgit2/deps/zlib/zlib.h +126 -100
- data/vendor/libgit2/deps/zlib/zutil.c +2 -2
- data/vendor/libgit2/deps/zlib/zutil.h +12 -9
- data/vendor/libgit2/include/git2/apply.h +16 -2
- data/vendor/libgit2/include/git2/attr.h +11 -2
- data/vendor/libgit2/include/git2/blame.h +4 -1
- data/vendor/libgit2/include/git2/blob.h +14 -1
- data/vendor/libgit2/include/git2/branch.h +4 -2
- data/vendor/libgit2/include/git2/buffer.h +18 -78
- data/vendor/libgit2/include/git2/cert.h +2 -2
- data/vendor/libgit2/include/git2/checkout.h +5 -2
- data/vendor/libgit2/include/git2/clone.h +3 -3
- data/vendor/libgit2/include/git2/commit.h +2 -0
- data/vendor/libgit2/include/git2/common.h +28 -7
- data/vendor/libgit2/include/git2/config.h +25 -9
- data/vendor/libgit2/include/git2/credential.h +2 -1
- data/vendor/libgit2/include/git2/credential_helpers.h +1 -0
- data/vendor/libgit2/include/git2/deprecated.h +9 -1
- data/vendor/libgit2/include/git2/describe.h +7 -2
- data/vendor/libgit2/include/git2/diff.h +18 -10
- data/vendor/libgit2/include/git2/email.h +1 -1
- data/vendor/libgit2/include/git2/errors.h +17 -3
- data/vendor/libgit2/include/git2/experimental.h +20 -0
- data/vendor/libgit2/include/git2/filter.h +7 -2
- data/vendor/libgit2/include/git2/graph.h +1 -0
- data/vendor/libgit2/include/git2/ignore.h +1 -1
- data/vendor/libgit2/include/git2/index.h +11 -5
- data/vendor/libgit2/include/git2/indexer.h +48 -0
- data/vendor/libgit2/include/git2/merge.h +24 -4
- data/vendor/libgit2/include/git2/message.h +2 -0
- data/vendor/libgit2/include/git2/object.h +49 -0
- data/vendor/libgit2/include/git2/odb.h +94 -13
- data/vendor/libgit2/include/git2/odb_backend.h +107 -19
- data/vendor/libgit2/include/git2/oid.h +115 -15
- data/vendor/libgit2/include/git2/pack.h +24 -8
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/pathspec.h +1 -1
- data/vendor/libgit2/include/git2/proxy.h +1 -1
- data/vendor/libgit2/include/git2/rebase.h +9 -1
- data/vendor/libgit2/include/git2/refdb.h +3 -0
- data/vendor/libgit2/include/git2/reflog.h +1 -1
- data/vendor/libgit2/include/git2/refs.h +2 -2
- data/vendor/libgit2/include/git2/remote.h +184 -37
- data/vendor/libgit2/include/git2/repository.h +34 -10
- data/vendor/libgit2/include/git2/reset.h +2 -2
- data/vendor/libgit2/include/git2/revparse.h +1 -1
- data/vendor/libgit2/include/git2/revwalk.h +4 -1
- data/vendor/libgit2/include/git2/signature.h +1 -1
- data/vendor/libgit2/include/git2/stash.h +61 -7
- data/vendor/libgit2/include/git2/status.h +14 -5
- data/vendor/libgit2/include/git2/strarray.h +0 -13
- data/vendor/libgit2/include/git2/submodule.h +7 -2
- data/vendor/libgit2/include/git2/sys/commit_graph.h +1 -1
- data/vendor/libgit2/include/git2/sys/odb_backend.h +3 -6
- data/vendor/libgit2/include/git2/sys/remote.h +46 -0
- data/vendor/libgit2/include/git2/sys/stream.h +1 -1
- data/vendor/libgit2/include/git2/sys/transport.h +46 -39
- data/vendor/libgit2/include/git2/tag.h +1 -0
- data/vendor/libgit2/include/git2/tree.h +4 -3
- data/vendor/libgit2/include/git2/types.h +7 -7
- data/vendor/libgit2/include/git2/version.h +27 -6
- data/vendor/libgit2/include/git2/worktree.h +12 -2
- data/vendor/libgit2/include/git2.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +177 -419
- data/vendor/libgit2/src/README.md +12 -0
- data/vendor/libgit2/src/cli/CMakeLists.txt +57 -0
- data/vendor/libgit2/src/cli/README.md +26 -0
- data/vendor/libgit2/src/cli/cli.h +20 -0
- data/vendor/libgit2/src/cli/cmd.c +21 -0
- data/vendor/libgit2/src/cli/cmd.h +33 -0
- data/vendor/libgit2/src/cli/cmd_cat_file.c +204 -0
- data/vendor/libgit2/src/cli/cmd_clone.c +176 -0
- data/vendor/libgit2/src/cli/cmd_hash_object.c +154 -0
- data/vendor/libgit2/src/cli/cmd_help.c +86 -0
- data/vendor/libgit2/src/cli/error.h +51 -0
- data/vendor/libgit2/src/cli/main.c +106 -0
- data/vendor/libgit2/src/cli/opt.c +669 -0
- data/vendor/libgit2/src/cli/opt.h +349 -0
- data/vendor/libgit2/src/cli/opt_usage.c +194 -0
- data/vendor/libgit2/src/cli/opt_usage.h +35 -0
- data/vendor/libgit2/src/cli/progress.c +345 -0
- data/vendor/libgit2/src/cli/progress.h +117 -0
- data/vendor/libgit2/src/cli/sighandler.h +20 -0
- data/vendor/libgit2/src/cli/unix/sighandler.c +36 -0
- data/vendor/libgit2/src/cli/win32/precompiled.h +3 -0
- data/vendor/libgit2/src/cli/win32/sighandler.c +37 -0
- data/vendor/libgit2/src/libgit2/CMakeLists.txt +141 -0
- data/vendor/libgit2/src/{annotated_commit.c → libgit2/annotated_commit.c} +1 -1
- data/vendor/libgit2/src/{annotated_commit.h → libgit2/annotated_commit.h} +2 -2
- data/vendor/libgit2/src/{apply.c → libgit2/apply.c} +18 -18
- data/vendor/libgit2/src/{apply.h → libgit2/apply.h} +2 -2
- data/vendor/libgit2/src/{attr.c → libgit2/attr.c} +18 -18
- data/vendor/libgit2/src/{attr_file.c → libgit2/attr_file.c} +18 -18
- data/vendor/libgit2/src/{attr_file.h → libgit2/attr_file.h} +4 -4
- data/vendor/libgit2/src/{attrcache.c → libgit2/attrcache.c} +18 -13
- data/vendor/libgit2/src/{blame.c → libgit2/blame.c} +2 -0
- data/vendor/libgit2/src/{blame_git.c → libgit2/blame_git.c} +1 -1
- data/vendor/libgit2/src/{blob.c → libgit2/blob.c} +38 -29
- data/vendor/libgit2/src/{blob.h → libgit2/blob.h} +3 -3
- data/vendor/libgit2/src/{branch.c → libgit2/branch.c} +164 -118
- data/vendor/libgit2/src/{branch.h → libgit2/branch.h} +15 -3
- data/vendor/libgit2/src/libgit2/buf.c +126 -0
- data/vendor/libgit2/src/libgit2/buf.h +50 -0
- data/vendor/libgit2/src/{checkout.c → libgit2/checkout.c} +74 -68
- data/vendor/libgit2/src/{cherrypick.c → libgit2/cherrypick.c} +13 -13
- data/vendor/libgit2/src/{clone.c → libgit2/clone.c} +96 -67
- data/vendor/libgit2/src/{commit.c → libgit2/commit.c} +178 -73
- data/vendor/libgit2/src/libgit2/commit.h +87 -0
- data/vendor/libgit2/src/{commit_graph.c → libgit2/commit_graph.c} +122 -89
- data/vendor/libgit2/src/{commit_graph.h → libgit2/commit_graph.h} +14 -4
- data/vendor/libgit2/src/{commit_list.c → libgit2/commit_list.c} +7 -4
- data/vendor/libgit2/src/libgit2/common.h +55 -0
- data/vendor/libgit2/src/{config.c → libgit2/config.c} +101 -69
- data/vendor/libgit2/src/{config.h → libgit2/config.h} +15 -2
- data/vendor/libgit2/src/{config_file.c → libgit2/config_file.c} +105 -93
- data/vendor/libgit2/src/{config_mem.c → libgit2/config_mem.c} +9 -9
- data/vendor/libgit2/src/{config_parse.c → libgit2/config_parse.c} +27 -23
- data/vendor/libgit2/src/{crlf.c → libgit2/crlf.c} +24 -21
- data/vendor/libgit2/src/{describe.c → libgit2/describe.c} +35 -27
- data/vendor/libgit2/src/{diff.c → libgit2/diff.c} +30 -9
- data/vendor/libgit2/src/{diff.h → libgit2/diff.h} +2 -4
- data/vendor/libgit2/src/{diff_driver.c → libgit2/diff_driver.c} +34 -36
- data/vendor/libgit2/src/{diff_driver.h → libgit2/diff_driver.h} +3 -3
- data/vendor/libgit2/src/{diff_file.c → libgit2/diff_file.c} +44 -26
- data/vendor/libgit2/src/{diff_generate.c → libgit2/diff_generate.c} +47 -18
- data/vendor/libgit2/src/{diff_generate.h → libgit2/diff_generate.h} +5 -3
- data/vendor/libgit2/src/{diff_print.c → libgit2/diff_print.c} +112 -100
- data/vendor/libgit2/src/{diff_stats.c → libgit2/diff_stats.c} +40 -29
- data/vendor/libgit2/src/libgit2/diff_stats.h +18 -0
- data/vendor/libgit2/src/{diff_tform.c → libgit2/diff_tform.c} +13 -8
- data/vendor/libgit2/src/{diff_xdiff.c → libgit2/diff_xdiff.c} +4 -8
- data/vendor/libgit2/src/{email.c → libgit2/email.c} +55 -39
- data/vendor/libgit2/src/{email.h → libgit2/email.h} +1 -1
- data/vendor/libgit2/src/{errors.c → libgit2/errors.c} +18 -18
- data/vendor/libgit2/src/{errors.h → libgit2/errors.h} +1 -2
- data/vendor/libgit2/src/libgit2/experimental.h.in +13 -0
- data/vendor/libgit2/src/{fetch.c → libgit2/fetch.c} +72 -27
- data/vendor/libgit2/src/{fetch.h → libgit2/fetch.h} +1 -1
- data/vendor/libgit2/src/{fetchhead.c → libgit2/fetchhead.c} +23 -23
- data/vendor/libgit2/src/{filter.c → libgit2/filter.c} +127 -53
- data/vendor/libgit2/src/{filter.h → libgit2/filter.h} +26 -5
- data/vendor/libgit2/src/{ident.c → libgit2/ident.c} +20 -20
- data/vendor/libgit2/src/{ignore.c → libgit2/ignore.c} +35 -34
- data/vendor/libgit2/src/{ignore.h → libgit2/ignore.h} +2 -2
- data/vendor/libgit2/src/{index.c → libgit2/index.c} +91 -90
- data/vendor/libgit2/src/{index.h → libgit2/index.h} +6 -3
- data/vendor/libgit2/src/{indexer.c → libgit2/indexer.c} +173 -92
- data/vendor/libgit2/src/{iterator.c → libgit2/iterator.c} +71 -61
- data/vendor/libgit2/src/{iterator.h → libgit2/iterator.h} +5 -5
- data/vendor/libgit2/src/{libgit2.c → libgit2/libgit2.c} +46 -11
- data/vendor/libgit2/src/{mailmap.c → libgit2/mailmap.c} +38 -36
- data/vendor/libgit2/src/{merge.c → libgit2/merge.c} +30 -30
- data/vendor/libgit2/src/{merge.h → libgit2/merge.h} +1 -14
- data/vendor/libgit2/src/{merge_driver.c → libgit2/merge_driver.c} +2 -2
- data/vendor/libgit2/src/{merge_file.c → libgit2/merge_file.c} +13 -3
- data/vendor/libgit2/src/{message.c → libgit2/message.c} +21 -10
- data/vendor/libgit2/src/{midx.c → libgit2/midx.c} +112 -92
- data/vendor/libgit2/src/{midx.h → libgit2/midx.h} +5 -4
- data/vendor/libgit2/src/{mwindow.c → libgit2/mwindow.c} +15 -12
- data/vendor/libgit2/src/{mwindow.h → libgit2/mwindow.h} +5 -2
- data/vendor/libgit2/src/{netops.c → libgit2/netops.c} +1 -2
- data/vendor/libgit2/src/{netops.h → libgit2/netops.h} +1 -1
- data/vendor/libgit2/src/{notes.c → libgit2/notes.c} +25 -34
- data/vendor/libgit2/src/{object.c → libgit2/object.c} +135 -30
- data/vendor/libgit2/src/{object.h → libgit2/object.h} +12 -3
- data/vendor/libgit2/src/{odb.c → libgit2/odb.c} +228 -81
- data/vendor/libgit2/src/{odb.h → libgit2/odb.h} +44 -5
- data/vendor/libgit2/src/{odb_loose.c → libgit2/odb_loose.c} +192 -134
- data/vendor/libgit2/src/{odb_mempack.c → libgit2/odb_mempack.c} +18 -5
- data/vendor/libgit2/src/{odb_pack.c → libgit2/odb_pack.c} +137 -85
- data/vendor/libgit2/src/{oid.c → libgit2/oid.c} +136 -90
- data/vendor/libgit2/src/libgit2/oid.h +273 -0
- data/vendor/libgit2/src/{oidmap.c → libgit2/oidmap.c} +1 -1
- data/vendor/libgit2/src/{pack-objects.c → libgit2/pack-objects.c} +56 -30
- data/vendor/libgit2/src/{pack-objects.h → libgit2/pack-objects.h} +11 -6
- data/vendor/libgit2/src/{pack.c → libgit2/pack.c} +114 -84
- data/vendor/libgit2/src/{pack.h → libgit2/pack.h} +31 -16
- data/vendor/libgit2/src/{parse.c → libgit2/parse.c} +4 -3
- data/vendor/libgit2/src/{patch.c → libgit2/patch.c} +3 -3
- data/vendor/libgit2/src/{patch.h → libgit2/patch.h} +1 -0
- data/vendor/libgit2/src/{patch_generate.c → libgit2/patch_generate.c} +27 -11
- data/vendor/libgit2/src/{patch_generate.h → libgit2/patch_generate.h} +5 -5
- data/vendor/libgit2/src/{patch_parse.c → libgit2/patch_parse.c} +29 -29
- data/vendor/libgit2/src/libgit2/path.c +375 -0
- data/vendor/libgit2/src/libgit2/path.h +68 -0
- data/vendor/libgit2/src/{pathspec.c → libgit2/pathspec.c} +6 -6
- data/vendor/libgit2/src/{pathspec.h → libgit2/pathspec.h} +2 -2
- data/vendor/libgit2/src/{proxy.c → libgit2/proxy.c} +4 -1
- data/vendor/libgit2/src/{proxy.h → libgit2/proxy.h} +1 -1
- data/vendor/libgit2/src/{push.c → libgit2/push.c} +43 -38
- data/vendor/libgit2/src/{push.h → libgit2/push.h} +4 -16
- data/vendor/libgit2/src/{reader.c → libgit2/reader.c} +9 -9
- data/vendor/libgit2/src/{reader.h → libgit2/reader.h} +2 -2
- data/vendor/libgit2/src/{rebase.c → libgit2/rebase.c} +119 -107
- data/vendor/libgit2/src/{refdb_fs.c → libgit2/refdb_fs.c} +506 -197
- data/vendor/libgit2/src/{reflog.c → libgit2/reflog.c} +7 -5
- data/vendor/libgit2/src/{reflog.h → libgit2/reflog.h} +1 -2
- data/vendor/libgit2/src/{refs.c → libgit2/refs.c} +34 -32
- data/vendor/libgit2/src/{refs.h → libgit2/refs.h} +2 -2
- data/vendor/libgit2/src/{refspec.c → libgit2/refspec.c} +32 -37
- data/vendor/libgit2/src/{refspec.h → libgit2/refspec.h} +5 -2
- data/vendor/libgit2/src/{remote.c → libgit2/remote.c} +718 -420
- data/vendor/libgit2/src/libgit2/remote.h +100 -0
- data/vendor/libgit2/src/{repository.c → libgit2/repository.c} +629 -386
- data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +20 -9
- data/vendor/libgit2/src/{reset.c → libgit2/reset.c} +8 -5
- data/vendor/libgit2/src/{revert.c → libgit2/revert.c} +14 -14
- data/vendor/libgit2/src/{revparse.c → libgit2/revparse.c} +71 -42
- data/vendor/libgit2/src/{revwalk.c → libgit2/revwalk.c} +12 -8
- data/vendor/libgit2/src/{signature.c → libgit2/signature.c} +12 -6
- data/vendor/libgit2/src/{signature.h → libgit2/signature.h} +1 -1
- data/vendor/libgit2/src/{stash.c → libgit2/stash.c} +235 -61
- data/vendor/libgit2/src/{status.c → libgit2/status.c} +4 -1
- data/vendor/libgit2/src/{strarray.c → libgit2/strarray.c} +1 -0
- data/vendor/libgit2/src/libgit2/strarray.h +25 -0
- data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.c +8 -6
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.c +1 -1
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.c +7 -3
- data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_dynamic.h +3 -3
- data/vendor/libgit2/src/{streams → libgit2/streams}/socket.c +4 -1
- data/vendor/libgit2/src/{submodule.c → libgit2/submodule.c} +177 -161
- data/vendor/libgit2/src/{submodule.h → libgit2/submodule.h} +1 -1
- data/vendor/libgit2/src/libgit2/sysdir.c +650 -0
- data/vendor/libgit2/src/{sysdir.h → libgit2/sysdir.h} +53 -18
- data/vendor/libgit2/src/{tag.c → libgit2/tag.c} +73 -42
- data/vendor/libgit2/src/{tag.h → libgit2/tag.h} +2 -2
- data/vendor/libgit2/src/{threadstate.c → libgit2/threadstate.c} +3 -3
- data/vendor/libgit2/src/{threadstate.h → libgit2/threadstate.h} +2 -2
- data/vendor/libgit2/src/{trace.c → libgit2/trace.c} +1 -14
- data/vendor/libgit2/src/{trace.h → libgit2/trace.h} +5 -22
- data/vendor/libgit2/src/{trailer.c → libgit2/trailer.c} +1 -1
- data/vendor/libgit2/src/{transaction.c → libgit2/transaction.c} +1 -1
- data/vendor/libgit2/src/{transport.c → libgit2/transport.c} +10 -10
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth.c +7 -9
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth.h +2 -3
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.c +12 -13
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.c +10 -10
- data/vendor/libgit2/src/{transports → libgit2/transports}/auth_ntlm.h +0 -1
- data/vendor/libgit2/src/{transports → libgit2/transports}/git.c +9 -11
- data/vendor/libgit2/src/{transports → libgit2/transports}/http.c +41 -20
- data/vendor/libgit2/src/{transports → libgit2/transports}/http.h +2 -3
- data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.c +75 -66
- data/vendor/libgit2/src/{transports → libgit2/transports}/httpclient.h +10 -0
- data/vendor/libgit2/src/{transports → libgit2/transports}/local.c +138 -116
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart.c +92 -133
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart.h +35 -32
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart_pkt.c +177 -65
- data/vendor/libgit2/src/{transports → libgit2/transports}/smart_protocol.c +97 -49
- data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.c +365 -198
- data/vendor/libgit2/src/{transports → libgit2/transports}/winhttp.c +58 -59
- data/vendor/libgit2/src/{tree-cache.c → libgit2/tree-cache.c} +8 -8
- data/vendor/libgit2/src/{tree-cache.h → libgit2/tree-cache.h} +2 -2
- data/vendor/libgit2/src/{tree.c → libgit2/tree.c} +93 -83
- data/vendor/libgit2/src/{tree.h → libgit2/tree.h} +4 -4
- data/vendor/libgit2/src/{worktree.c → libgit2/worktree.c} +121 -94
- data/vendor/libgit2/src/{worktree.h → libgit2/worktree.h} +1 -1
- data/vendor/libgit2/src/libgit2/xdiff/git-xdiff.h +53 -0
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiff.h +15 -15
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.c +134 -108
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.c +23 -7
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xhistogram.c +87 -78
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xinclude.h +1 -12
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmerge.c +104 -117
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xpatience.c +6 -17
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.c +15 -20
- data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.c +18 -7
- data/vendor/libgit2/src/util/CMakeLists.txt +80 -0
- data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.h +1 -1
- data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{array.h → util/array.h} +1 -1
- data/vendor/libgit2/src/{assert_safe.h → util/assert_safe.h} +16 -0
- data/vendor/libgit2/src/{cc-compat.h → util/cc-compat.h} +1 -1
- data/vendor/libgit2/src/{date.c → util/date.c} +14 -20
- data/vendor/libgit2/src/util/date.h +33 -0
- data/vendor/libgit2/src/{filebuf.c → util/filebuf.c} +29 -29
- data/vendor/libgit2/src/{filebuf.h → util/filebuf.h} +2 -2
- data/vendor/libgit2/src/{path.c → util/fs_path.c} +453 -647
- data/vendor/libgit2/src/{path.h → util/fs_path.h} +221 -188
- data/vendor/libgit2/src/{futils.c → util/futils.c} +135 -90
- data/vendor/libgit2/src/{futils.h → util/futils.h} +28 -15
- data/vendor/libgit2/src/{features.h.in → util/git2_features.h.in} +15 -1
- data/vendor/libgit2/src/{common.h → util/git2_util.h} +20 -59
- data/vendor/libgit2/src/util/hash/builtin.c +53 -0
- data/vendor/libgit2/src/{hash/sha1/openssl.h → util/hash/builtin.h} +6 -6
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.c +3 -3
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/collisiondetect.h +3 -3
- data/vendor/libgit2/src/util/hash/common_crypto.c +112 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/common_crypto.h +11 -3
- data/vendor/libgit2/src/util/hash/mbedtls.c +92 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/mbedtls.h +14 -4
- data/vendor/libgit2/src/util/hash/openssl.c +195 -0
- data/vendor/libgit2/src/util/hash/openssl.h +45 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha.h +243 -0
- data/vendor/libgit2/src/util/hash/rfc6234/sha224-256.c +601 -0
- data/vendor/libgit2/src/util/hash/sha.h +70 -0
- data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.c +1 -1
- data/vendor/libgit2/src/util/hash/win32.c +549 -0
- data/vendor/libgit2/src/util/hash/win32.h +60 -0
- data/vendor/libgit2/src/util/hash.c +158 -0
- data/vendor/libgit2/src/util/hash.h +61 -0
- data/vendor/libgit2/src/{khash.h → util/khash.h} +1 -1
- data/vendor/libgit2/src/{map.h → util/map.h} +1 -1
- data/vendor/libgit2/src/util/net.c +1003 -0
- data/vendor/libgit2/src/{net.h → util/net.h} +18 -4
- data/vendor/libgit2/src/{pool.h → util/pool.h} +1 -1
- data/vendor/libgit2/src/{posix.c → util/posix.c} +3 -3
- data/vendor/libgit2/src/{posix.h → util/posix.h} +4 -1
- data/vendor/libgit2/src/{pqueue.h → util/pqueue.h} +2 -2
- data/vendor/libgit2/src/util/rand.c +234 -0
- data/vendor/libgit2/src/util/rand.h +37 -0
- data/vendor/libgit2/src/{regexp.c → util/regexp.c} +4 -4
- data/vendor/libgit2/src/{regexp.h → util/regexp.h} +1 -1
- data/vendor/libgit2/src/{runtime.c → util/runtime.c} +1 -1
- data/vendor/libgit2/src/{runtime.h → util/runtime.h} +1 -1
- data/vendor/libgit2/src/{sortedcache.c → util/sortedcache.c} +1 -1
- data/vendor/libgit2/src/{sortedcache.h → util/sortedcache.h} +2 -2
- data/vendor/libgit2/src/{buffer.c → util/str.c} +157 -151
- data/vendor/libgit2/src/util/str.h +357 -0
- data/vendor/libgit2/src/{strmap.h → util/strmap.h} +1 -1
- data/vendor/libgit2/src/{thread.c → util/thread.c} +1 -1
- data/vendor/libgit2/src/{thread.h → util/thread.h} +23 -22
- data/vendor/libgit2/src/{tsort.c → util/tsort.c} +1 -1
- data/vendor/libgit2/src/{unix → util/unix}/map.c +1 -3
- data/vendor/libgit2/src/{unix → util/unix}/posix.h +1 -4
- data/vendor/libgit2/src/{unix → util/unix}/realpath.c +1 -3
- data/vendor/libgit2/src/{utf8.c → util/utf8.c} +1 -1
- data/vendor/libgit2/src/{utf8.h → util/utf8.h} +1 -1
- data/vendor/libgit2/src/{util.c → util/util.c} +15 -15
- data/vendor/libgit2/src/{util.h → util/util.h} +4 -29
- data/vendor/libgit2/src/{varint.h → util/varint.h} +1 -1
- data/vendor/libgit2/src/{vector.h → util/vector.h} +2 -2
- data/vendor/libgit2/src/{wildmatch.h → util/wildmatch.h} +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/dir.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/error.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/map.c +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/path_w32.c +140 -9
- data/vendor/libgit2/src/{win32 → util/win32}/path_w32.h +3 -1
- data/vendor/libgit2/src/{win32 → util/win32}/posix.h +1 -2
- data/vendor/libgit2/src/{win32 → util/win32}/posix_w32.c +12 -28
- data/vendor/libgit2/src/util/win32/precompiled.c +1 -0
- data/vendor/libgit2/src/{win32 → util/win32}/precompiled.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/thread.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.c +2 -3
- data/vendor/libgit2/src/{win32 → util/win32}/w32_buffer.h +3 -4
- data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.c +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_leakcheck.h +1 -1
- data/vendor/libgit2/src/{win32 → util/win32}/w32_util.h +1 -1
- data/vendor/libgit2/src/{zstream.c → util/zstream.c} +5 -5
- data/vendor/libgit2/src/{zstream.h → util/zstream.h} +5 -5
- metadata +402 -356
- data/vendor/libgit2/src/buffer.h +0 -374
- data/vendor/libgit2/src/commit.h +0 -46
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +0 -57
- data/vendor/libgit2/src/hash/sha1/generic.c +0 -300
- data/vendor/libgit2/src/hash/sha1/generic.h +0 -19
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +0 -46
- data/vendor/libgit2/src/hash/sha1/openssl.c +0 -59
- data/vendor/libgit2/src/hash/sha1/win32.c +0 -333
- data/vendor/libgit2/src/hash/sha1/win32.h +0 -128
- data/vendor/libgit2/src/hash/sha1.h +0 -38
- data/vendor/libgit2/src/hash.c +0 -110
- data/vendor/libgit2/src/hash.h +0 -46
- data/vendor/libgit2/src/message.h +0 -17
- data/vendor/libgit2/src/net.c +0 -540
- data/vendor/libgit2/src/oid.h +0 -51
- data/vendor/libgit2/src/remote.h +0 -55
- data/vendor/libgit2/src/sysdir.c +0 -347
- data/vendor/libgit2/src/win32/findfile.c +0 -230
- data/vendor/libgit2/src/win32/findfile.h +0 -19
- /data/vendor/libgit2/src/{win32 → cli/win32}/precompiled.c +0 -0
- /data/vendor/libgit2/src/{attr.h → libgit2/attr.h} +0 -0
- /data/vendor/libgit2/src/{attrcache.h → libgit2/attrcache.h} +0 -0
- /data/vendor/libgit2/src/{blame.h → libgit2/blame.h} +0 -0
- /data/vendor/libgit2/src/{blame_git.h → libgit2/blame_git.h} +0 -0
- /data/vendor/libgit2/src/{cache.c → libgit2/cache.c} +0 -0
- /data/vendor/libgit2/src/{cache.h → libgit2/cache.h} +0 -0
- /data/vendor/libgit2/src/{checkout.h → libgit2/checkout.h} +0 -0
- /data/vendor/libgit2/src/{clone.h → libgit2/clone.h} +0 -0
- /data/vendor/libgit2/src/{commit_list.h → libgit2/commit_list.h} +0 -0
- /data/vendor/libgit2/src/{config_backend.h → libgit2/config_backend.h} +0 -0
- /data/vendor/libgit2/src/{config_cache.c → libgit2/config_cache.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.c → libgit2/config_entries.c} +0 -0
- /data/vendor/libgit2/src/{config_entries.h → libgit2/config_entries.h} +0 -0
- /data/vendor/libgit2/src/{config_parse.h → libgit2/config_parse.h} +0 -0
- /data/vendor/libgit2/src/{config_snapshot.c → libgit2/config_snapshot.c} +0 -0
- /data/vendor/libgit2/src/{delta.c → libgit2/delta.c} +0 -0
- /data/vendor/libgit2/src/{delta.h → libgit2/delta.h} +0 -0
- /data/vendor/libgit2/src/{diff_file.h → libgit2/diff_file.h} +0 -0
- /data/vendor/libgit2/src/{diff_parse.c → libgit2/diff_parse.c} +0 -0
- /data/vendor/libgit2/src/{diff_parse.h → libgit2/diff_parse.h} +0 -0
- /data/vendor/libgit2/src/{diff_tform.h → libgit2/diff_tform.h} +0 -0
- /data/vendor/libgit2/src/{diff_xdiff.h → libgit2/diff_xdiff.h} +0 -0
- /data/vendor/libgit2/src/{fetchhead.h → libgit2/fetchhead.h} +0 -0
- /data/vendor/libgit2/src/{win32 → libgit2}/git2.rc +0 -0
- /data/vendor/libgit2/src/{graph.c → libgit2/graph.c} +0 -0
- /data/vendor/libgit2/src/{hashsig.c → libgit2/hashsig.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.c → libgit2/idxmap.c} +0 -0
- /data/vendor/libgit2/src/{idxmap.h → libgit2/idxmap.h} +0 -0
- /data/vendor/libgit2/src/{indexer.h → libgit2/indexer.h} +0 -0
- /data/vendor/libgit2/src/{libgit2.h → libgit2/libgit2.h} +0 -0
- /data/vendor/libgit2/src/{mailmap.h → libgit2/mailmap.h} +0 -0
- /data/vendor/libgit2/src/{merge_driver.h → libgit2/merge_driver.h} +0 -0
- /data/vendor/libgit2/src/{notes.h → libgit2/notes.h} +0 -0
- /data/vendor/libgit2/src/{object_api.c → libgit2/object_api.c} +0 -0
- /data/vendor/libgit2/src/{offmap.c → libgit2/offmap.c} +0 -0
- /data/vendor/libgit2/src/{offmap.h → libgit2/offmap.h} +0 -0
- /data/vendor/libgit2/src/{oidarray.c → libgit2/oidarray.c} +0 -0
- /data/vendor/libgit2/src/{oidarray.h → libgit2/oidarray.h} +0 -0
- /data/vendor/libgit2/src/{oidmap.h → libgit2/oidmap.h} +0 -0
- /data/vendor/libgit2/src/{parse.h → libgit2/parse.h} +0 -0
- /data/vendor/libgit2/src/{patch_parse.h → libgit2/patch_parse.h} +0 -0
- /data/vendor/libgit2/src/{refdb.c → libgit2/refdb.c} +0 -0
- /data/vendor/libgit2/src/{refdb.h → libgit2/refdb.h} +0 -0
- /data/vendor/libgit2/src/{repo_template.h → libgit2/repo_template.h} +0 -0
- /data/vendor/libgit2/src/{revwalk.h → libgit2/revwalk.h} +0 -0
- /data/vendor/libgit2/src/{settings.h → libgit2/settings.h} +0 -0
- /data/vendor/libgit2/src/{status.h → libgit2/status.h} +0 -0
- /data/vendor/libgit2/src/{stream.h → libgit2/stream.h} +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/mbedtls.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/openssl_legacy.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/registry.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/socket.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/stransport.h +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.c +0 -0
- /data/vendor/libgit2/src/{streams → libgit2/streams}/tls.h +0 -0
- /data/vendor/libgit2/src/{transaction.h → libgit2/transaction.h} +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/auth_negotiate.h +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/credential_helpers.c +0 -0
- /data/vendor/libgit2/src/{transports → libgit2/transports}/ssh.h +0 -0
- /data/vendor/libgit2/src/{userdiff.h → libgit2/userdiff.h} +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xdiffi.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xemit.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xmacros.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xprepare.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xtypes.h +0 -0
- /data/vendor/libgit2/src/{xdiff → libgit2/xdiff}/xutils.h +0 -0
- /data/vendor/libgit2/src/{alloc.c → util/alloc.c} +0 -0
- /data/vendor/libgit2/src/{alloc.h → util/alloc.h} +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/failalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/stdalloc.c +0 -0
- /data/vendor/libgit2/src/{allocators → util/allocators}/win32_leakcheck.c +0 -0
- /data/vendor/libgit2/src/{bitvec.h → util/bitvec.h} +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/sha1.h +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.c +0 -0
- /data/vendor/libgit2/src/{hash/sha1 → util/hash}/sha1dc/ubc_check.h +0 -0
- /data/vendor/libgit2/src/{integer.h → util/integer.h} +0 -0
- /data/vendor/libgit2/src/{pool.c → util/pool.c} +0 -0
- /data/vendor/libgit2/src/{pqueue.c → util/pqueue.c} +0 -0
- /data/vendor/libgit2/src/{strmap.c → util/strmap.c} +0 -0
- /data/vendor/libgit2/src/{strnlen.h → util/strnlen.h} +0 -0
- /data/vendor/libgit2/src/{unix → util/unix}/pthread.h +0 -0
- /data/vendor/libgit2/src/{varint.c → util/varint.c} +0 -0
- /data/vendor/libgit2/src/{vector.c → util/vector.c} +0 -0
- /data/vendor/libgit2/src/{wildmatch.c → util/wildmatch.c} +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/dir.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/error.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/mingw-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/msvc-compat.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/reparse.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/thread.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/utf-conv.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/version.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_common.h +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/w32_util.c +0 -0
- /data/vendor/libgit2/src/{win32 → util/win32}/win32-compat.h +0 -0
|
@@ -8,14 +8,15 @@
|
|
|
8
8
|
#include "midx.h"
|
|
9
9
|
|
|
10
10
|
#include "array.h"
|
|
11
|
-
#include "
|
|
11
|
+
#include "buf.h"
|
|
12
12
|
#include "filebuf.h"
|
|
13
13
|
#include "futils.h"
|
|
14
14
|
#include "hash.h"
|
|
15
15
|
#include "odb.h"
|
|
16
16
|
#include "pack.h"
|
|
17
|
-
#include "
|
|
17
|
+
#include "fs_path.h"
|
|
18
18
|
#include "repository.h"
|
|
19
|
+
#include "str.h"
|
|
19
20
|
|
|
20
21
|
#define MIDX_SIGNATURE 0x4d494458 /* "MIDX" */
|
|
21
22
|
#define MIDX_VERSION 1
|
|
@@ -114,19 +115,19 @@ static int midx_parse_oid_lookup(
|
|
|
114
115
|
struct git_midx_chunk *chunk_oid_lookup)
|
|
115
116
|
{
|
|
116
117
|
uint32_t i;
|
|
117
|
-
|
|
118
|
+
unsigned char *oid, *prev_oid, zero_oid[GIT_OID_SHA1_SIZE] = {0};
|
|
118
119
|
|
|
119
120
|
if (chunk_oid_lookup->offset == 0)
|
|
120
121
|
return midx_error("missing OID Lookup chunk");
|
|
121
122
|
if (chunk_oid_lookup->length == 0)
|
|
122
123
|
return midx_error("empty OID Lookup chunk");
|
|
123
|
-
if (chunk_oid_lookup->length != idx->num_objects *
|
|
124
|
+
if (chunk_oid_lookup->length != idx->num_objects * GIT_OID_SHA1_SIZE)
|
|
124
125
|
return midx_error("OID Lookup chunk has wrong length");
|
|
125
126
|
|
|
126
|
-
idx->oid_lookup = oid = (
|
|
127
|
-
prev_oid =
|
|
128
|
-
for (i = 0; i < idx->num_objects; ++i,
|
|
129
|
-
if (
|
|
127
|
+
idx->oid_lookup = oid = (unsigned char *)(data + chunk_oid_lookup->offset);
|
|
128
|
+
prev_oid = zero_oid;
|
|
129
|
+
for (i = 0; i < idx->num_objects; ++i, oid += GIT_OID_SHA1_SIZE) {
|
|
130
|
+
if (git_oid_raw_cmp(prev_oid, oid, GIT_OID_SHA1_SIZE) >= 0)
|
|
130
131
|
return midx_error("OID Lookup index is non-monotonic");
|
|
131
132
|
prev_oid = oid;
|
|
132
133
|
}
|
|
@@ -177,7 +178,7 @@ int git_midx_parse(
|
|
|
177
178
|
struct git_midx_chunk *last_chunk;
|
|
178
179
|
uint32_t i;
|
|
179
180
|
off64_t last_chunk_offset, chunk_offset, trailer_offset;
|
|
180
|
-
|
|
181
|
+
size_t checksum_size;
|
|
181
182
|
int error;
|
|
182
183
|
struct git_midx_chunk chunk_packfile_names = {0},
|
|
183
184
|
chunk_oid_fanout = {0},
|
|
@@ -187,7 +188,7 @@ int git_midx_parse(
|
|
|
187
188
|
|
|
188
189
|
GIT_ASSERT_ARG(idx);
|
|
189
190
|
|
|
190
|
-
if (size < sizeof(struct git_midx_header) +
|
|
191
|
+
if (size < sizeof(struct git_midx_header) + GIT_OID_SHA1_SIZE)
|
|
191
192
|
return midx_error("multi-pack index is too short");
|
|
192
193
|
|
|
193
194
|
hdr = ((struct git_midx_header *)data);
|
|
@@ -207,21 +208,24 @@ int git_midx_parse(
|
|
|
207
208
|
last_chunk_offset =
|
|
208
209
|
sizeof(struct git_midx_header) +
|
|
209
210
|
(1 + hdr->chunks) * 12;
|
|
210
|
-
|
|
211
|
+
|
|
212
|
+
checksum_size = GIT_HASH_SHA1_SIZE;
|
|
213
|
+
trailer_offset = size - checksum_size;
|
|
214
|
+
|
|
211
215
|
if (trailer_offset < last_chunk_offset)
|
|
212
216
|
return midx_error("wrong index size");
|
|
213
|
-
|
|
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");
|
|
217
|
+
memcpy(idx->checksum, data + trailer_offset, checksum_size);
|
|
219
218
|
|
|
220
219
|
chunk_hdr = data + sizeof(struct git_midx_header);
|
|
221
220
|
last_chunk = NULL;
|
|
222
221
|
for (i = 0; i < hdr->chunks; ++i, chunk_hdr += 12) {
|
|
223
|
-
|
|
224
|
-
|
|
222
|
+
uint32_t chunk_id = ntohl(*((uint32_t *)(chunk_hdr + 0)));
|
|
223
|
+
uint64_t high_offset = ((uint64_t)ntohl(*((uint32_t *)(chunk_hdr + 4)))) & 0xffffffffu;
|
|
224
|
+
uint64_t low_offset = ((uint64_t)ntohl(*((uint32_t *)(chunk_hdr + 8)))) & 0xffffffffu;
|
|
225
|
+
|
|
226
|
+
if (high_offset >= INT32_MAX)
|
|
227
|
+
return midx_error("chunk offset out of range");
|
|
228
|
+
chunk_offset = (off64_t)(high_offset << 32 | low_offset);
|
|
225
229
|
if (chunk_offset < last_chunk_offset)
|
|
226
230
|
return midx_error("chunks are non-monotonic");
|
|
227
231
|
if (chunk_offset >= trailer_offset)
|
|
@@ -230,7 +234,7 @@ int git_midx_parse(
|
|
|
230
234
|
last_chunk->length = (size_t)(chunk_offset - last_chunk_offset);
|
|
231
235
|
last_chunk_offset = chunk_offset;
|
|
232
236
|
|
|
233
|
-
switch (
|
|
237
|
+
switch (chunk_id) {
|
|
234
238
|
case MIDX_PACKFILE_NAMES_ID:
|
|
235
239
|
chunk_packfile_names.offset = last_chunk_offset;
|
|
236
240
|
last_chunk = &chunk_packfile_names;
|
|
@@ -313,7 +317,7 @@ int git_midx_open(
|
|
|
313
317
|
idx = git__calloc(1, sizeof(git_midx_file));
|
|
314
318
|
GIT_ERROR_CHECK_ALLOC(idx);
|
|
315
319
|
|
|
316
|
-
error =
|
|
320
|
+
error = git_str_sets(&idx->filename, path);
|
|
317
321
|
if (error < 0)
|
|
318
322
|
return error;
|
|
319
323
|
|
|
@@ -340,7 +344,8 @@ bool git_midx_needs_refresh(
|
|
|
340
344
|
git_file fd = -1;
|
|
341
345
|
struct stat st;
|
|
342
346
|
ssize_t bytes_read;
|
|
343
|
-
|
|
347
|
+
unsigned char checksum[GIT_HASH_SHA1_SIZE];
|
|
348
|
+
size_t checksum_size;
|
|
344
349
|
|
|
345
350
|
/* TODO: properly open the file without access time using O_NOATIME */
|
|
346
351
|
fd = git_futils_open_ro(path);
|
|
@@ -359,13 +364,14 @@ bool git_midx_needs_refresh(
|
|
|
359
364
|
return true;
|
|
360
365
|
}
|
|
361
366
|
|
|
362
|
-
|
|
367
|
+
checksum_size = GIT_HASH_SHA1_SIZE;
|
|
368
|
+
bytes_read = p_pread(fd, checksum, checksum_size, st.st_size - GIT_OID_SHA1_SIZE);
|
|
363
369
|
p_close(fd);
|
|
364
370
|
|
|
365
|
-
if (bytes_read !=
|
|
371
|
+
if (bytes_read != (ssize_t)checksum_size)
|
|
366
372
|
return true;
|
|
367
373
|
|
|
368
|
-
return
|
|
374
|
+
return (memcmp(checksum, idx->checksum, checksum_size) != 0);
|
|
369
375
|
}
|
|
370
376
|
|
|
371
377
|
int git_midx_entry_find(
|
|
@@ -377,7 +383,7 @@ int git_midx_entry_find(
|
|
|
377
383
|
int pos, found = 0;
|
|
378
384
|
size_t pack_index;
|
|
379
385
|
uint32_t hi, lo;
|
|
380
|
-
|
|
386
|
+
unsigned char *current = NULL;
|
|
381
387
|
const unsigned char *object_offset;
|
|
382
388
|
off64_t offset;
|
|
383
389
|
|
|
@@ -386,31 +392,30 @@ int git_midx_entry_find(
|
|
|
386
392
|
hi = ntohl(idx->oid_fanout[(int)short_oid->id[0]]);
|
|
387
393
|
lo = ((short_oid->id[0] == 0x0) ? 0 : ntohl(idx->oid_fanout[(int)short_oid->id[0] - 1]));
|
|
388
394
|
|
|
389
|
-
pos =
|
|
395
|
+
pos = git_pack__lookup_id(idx->oid_lookup, GIT_OID_SHA1_SIZE, lo, hi, short_oid->id, GIT_OID_SHA1);
|
|
390
396
|
|
|
391
397
|
if (pos >= 0) {
|
|
392
398
|
/* An object matching exactly the oid was found */
|
|
393
399
|
found = 1;
|
|
394
|
-
current = idx->oid_lookup + pos;
|
|
400
|
+
current = idx->oid_lookup + (pos * GIT_OID_SHA1_SIZE);
|
|
395
401
|
} else {
|
|
396
402
|
/* No object was found */
|
|
397
403
|
/* pos refers to the object with the "closest" oid to short_oid */
|
|
398
404
|
pos = -1 - pos;
|
|
399
405
|
if (pos < (int)idx->num_objects) {
|
|
400
|
-
current = idx->oid_lookup + pos;
|
|
406
|
+
current = idx->oid_lookup + (pos * GIT_OID_SHA1_SIZE);
|
|
401
407
|
|
|
402
|
-
if (!
|
|
408
|
+
if (!git_oid_raw_ncmp(short_oid->id, current, len))
|
|
403
409
|
found = 1;
|
|
404
410
|
}
|
|
405
411
|
}
|
|
406
412
|
|
|
407
|
-
if (found && len !=
|
|
413
|
+
if (found && len != GIT_OID_SHA1_HEXSIZE && pos + 1 < (int)idx->num_objects) {
|
|
408
414
|
/* Check for ambiguousity */
|
|
409
|
-
const
|
|
415
|
+
const unsigned char *next = current + GIT_OID_SHA1_SIZE;
|
|
410
416
|
|
|
411
|
-
if (!
|
|
417
|
+
if (!git_oid_raw_ncmp(short_oid->id, next, len))
|
|
412
418
|
found = 2;
|
|
413
|
-
}
|
|
414
419
|
}
|
|
415
420
|
|
|
416
421
|
if (!found)
|
|
@@ -420,8 +425,8 @@ int git_midx_entry_find(
|
|
|
420
425
|
|
|
421
426
|
object_offset = idx->object_offsets + pos * 8;
|
|
422
427
|
offset = ntohl(*((uint32_t *)(object_offset + 4)));
|
|
423
|
-
if (offset & 0x80000000) {
|
|
424
|
-
uint32_t object_large_offsets_pos = offset
|
|
428
|
+
if (idx->object_large_offsets && offset & 0x80000000) {
|
|
429
|
+
uint32_t object_large_offsets_pos = (uint32_t) (offset ^ 0x80000000);
|
|
425
430
|
const unsigned char *object_large_offsets_index = idx->object_large_offsets;
|
|
426
431
|
|
|
427
432
|
/* Make sure we're not being sent out of bounds */
|
|
@@ -438,7 +443,7 @@ int git_midx_entry_find(
|
|
|
438
443
|
return midx_error("invalid index into the packfile names table");
|
|
439
444
|
e->pack_index = pack_index;
|
|
440
445
|
e->offset = offset;
|
|
441
|
-
|
|
446
|
+
git_oid__fromraw(&e->sha1, current, GIT_OID_SHA1);
|
|
442
447
|
return 0;
|
|
443
448
|
}
|
|
444
449
|
|
|
@@ -447,13 +452,17 @@ int git_midx_foreach_entry(
|
|
|
447
452
|
git_odb_foreach_cb cb,
|
|
448
453
|
void *data)
|
|
449
454
|
{
|
|
455
|
+
git_oid oid;
|
|
450
456
|
size_t i;
|
|
451
457
|
int error;
|
|
452
458
|
|
|
453
459
|
GIT_ASSERT_ARG(idx);
|
|
454
460
|
|
|
455
461
|
for (i = 0; i < idx->num_objects; ++i) {
|
|
456
|
-
if ((error =
|
|
462
|
+
if ((error = git_oid__fromraw(&oid, &idx->oid_lookup[i * GIT_OID_SHA1_SIZE], GIT_OID_SHA1)) < 0)
|
|
463
|
+
return error;
|
|
464
|
+
|
|
465
|
+
if ((error = cb(&oid, data)) != 0)
|
|
457
466
|
return git_error_set_after_callback(error);
|
|
458
467
|
}
|
|
459
468
|
|
|
@@ -477,7 +486,7 @@ void git_midx_free(git_midx_file *idx)
|
|
|
477
486
|
if (!idx)
|
|
478
487
|
return;
|
|
479
488
|
|
|
480
|
-
|
|
489
|
+
git_str_dispose(&idx->filename);
|
|
481
490
|
git_midx_close(idx);
|
|
482
491
|
git__free(idx);
|
|
483
492
|
}
|
|
@@ -497,14 +506,14 @@ int git_midx_writer_new(
|
|
|
497
506
|
git_midx_writer *w = git__calloc(1, sizeof(git_midx_writer));
|
|
498
507
|
GIT_ERROR_CHECK_ALLOC(w);
|
|
499
508
|
|
|
500
|
-
if (
|
|
509
|
+
if (git_str_sets(&w->pack_dir, pack_dir) < 0) {
|
|
501
510
|
git__free(w);
|
|
502
511
|
return -1;
|
|
503
512
|
}
|
|
504
|
-
|
|
513
|
+
git_fs_path_squash_slashes(&w->pack_dir);
|
|
505
514
|
|
|
506
515
|
if (git_vector_init(&w->packs, 0, packfile__cmp) < 0) {
|
|
507
|
-
|
|
516
|
+
git_str_dispose(&w->pack_dir);
|
|
508
517
|
git__free(w);
|
|
509
518
|
return -1;
|
|
510
519
|
}
|
|
@@ -524,7 +533,7 @@ void git_midx_writer_free(git_midx_writer *w)
|
|
|
524
533
|
git_vector_foreach (&w->packs, i, p)
|
|
525
534
|
git_mwindow_put_pack(p);
|
|
526
535
|
git_vector_free(&w->packs);
|
|
527
|
-
|
|
536
|
+
git_str_dispose(&w->pack_dir);
|
|
528
537
|
git__free(w);
|
|
529
538
|
}
|
|
530
539
|
|
|
@@ -532,16 +541,17 @@ int git_midx_writer_add(
|
|
|
532
541
|
git_midx_writer *w,
|
|
533
542
|
const char *idx_path)
|
|
534
543
|
{
|
|
535
|
-
|
|
544
|
+
git_str idx_path_buf = GIT_STR_INIT;
|
|
536
545
|
int error;
|
|
537
546
|
struct git_pack_file *p;
|
|
538
547
|
|
|
539
|
-
error =
|
|
548
|
+
error = git_fs_path_prettify(&idx_path_buf, idx_path, git_str_cstr(&w->pack_dir));
|
|
540
549
|
if (error < 0)
|
|
541
550
|
return error;
|
|
542
551
|
|
|
543
|
-
|
|
544
|
-
|
|
552
|
+
/* TODO: SHA256 */
|
|
553
|
+
error = git_mwindow_get_pack(&p, git_str_cstr(&idx_path_buf), 0);
|
|
554
|
+
git_str_dispose(&idx_path_buf);
|
|
545
555
|
if (error < 0)
|
|
546
556
|
return error;
|
|
547
557
|
|
|
@@ -613,8 +623,8 @@ static int write_chunk_header(int chunk_id, off64_t offset, midx_write_cb write_
|
|
|
613
623
|
|
|
614
624
|
static int midx_write_buf(const char *buf, size_t size, void *data)
|
|
615
625
|
{
|
|
616
|
-
|
|
617
|
-
return
|
|
626
|
+
git_str *b = (git_str *)data;
|
|
627
|
+
return git_str_put(b, buf, size);
|
|
618
628
|
}
|
|
619
629
|
|
|
620
630
|
struct midx_write_hash_context {
|
|
@@ -648,11 +658,12 @@ static int midx_write(
|
|
|
648
658
|
uint32_t object_large_offsets_count;
|
|
649
659
|
uint32_t oid_fanout[256];
|
|
650
660
|
off64_t offset;
|
|
651
|
-
|
|
652
|
-
oid_lookup =
|
|
653
|
-
object_offsets =
|
|
654
|
-
object_large_offsets =
|
|
655
|
-
|
|
661
|
+
git_str packfile_names = GIT_STR_INIT,
|
|
662
|
+
oid_lookup = GIT_STR_INIT,
|
|
663
|
+
object_offsets = GIT_STR_INIT,
|
|
664
|
+
object_large_offsets = GIT_STR_INIT;
|
|
665
|
+
unsigned char checksum[GIT_HASH_SHA1_SIZE];
|
|
666
|
+
size_t checksum_size;
|
|
656
667
|
git_midx_entry *entry;
|
|
657
668
|
object_entry_array_t object_entries_array = GIT_ARRAY_INIT;
|
|
658
669
|
git_vector object_entries = GIT_VECTOR_INIT;
|
|
@@ -668,7 +679,8 @@ static int midx_write(
|
|
|
668
679
|
hash_cb_data.cb_data = cb_data;
|
|
669
680
|
hash_cb_data.ctx = &ctx;
|
|
670
681
|
|
|
671
|
-
|
|
682
|
+
checksum_size = GIT_HASH_SHA1_SIZE;
|
|
683
|
+
error = git_hash_ctx_init(&ctx, GIT_HASH_ALGORITHM_SHA1);
|
|
672
684
|
if (error < 0)
|
|
673
685
|
return error;
|
|
674
686
|
cb_data = &hash_cb_data;
|
|
@@ -676,34 +688,34 @@ static int midx_write(
|
|
|
676
688
|
|
|
677
689
|
git_vector_sort(&w->packs);
|
|
678
690
|
git_vector_foreach (&w->packs, i, p) {
|
|
679
|
-
|
|
691
|
+
git_str relative_index = GIT_STR_INIT;
|
|
680
692
|
struct object_entry_cb_state state = {0};
|
|
681
693
|
size_t path_len;
|
|
682
694
|
|
|
683
695
|
state.pack_index = (uint32_t)i;
|
|
684
696
|
state.object_entries_array = &object_entries_array;
|
|
685
697
|
|
|
686
|
-
error =
|
|
698
|
+
error = git_str_sets(&relative_index, p->pack_name);
|
|
687
699
|
if (error < 0)
|
|
688
700
|
goto cleanup;
|
|
689
|
-
error =
|
|
701
|
+
error = git_fs_path_make_relative(&relative_index, git_str_cstr(&w->pack_dir));
|
|
690
702
|
if (error < 0) {
|
|
691
|
-
|
|
703
|
+
git_str_dispose(&relative_index);
|
|
692
704
|
goto cleanup;
|
|
693
705
|
}
|
|
694
|
-
path_len =
|
|
695
|
-
if (path_len <= strlen(".pack") || git__suffixcmp(
|
|
696
|
-
|
|
706
|
+
path_len = git_str_len(&relative_index);
|
|
707
|
+
if (path_len <= strlen(".pack") || git__suffixcmp(git_str_cstr(&relative_index), ".pack") != 0) {
|
|
708
|
+
git_str_dispose(&relative_index);
|
|
697
709
|
git_error_set(GIT_ERROR_INVALID, "invalid packfile name: '%s'", p->pack_name);
|
|
698
710
|
error = -1;
|
|
699
711
|
goto cleanup;
|
|
700
712
|
}
|
|
701
713
|
path_len -= strlen(".pack");
|
|
702
714
|
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
715
|
+
git_str_put(&packfile_names, git_str_cstr(&relative_index), path_len);
|
|
716
|
+
git_str_puts(&packfile_names, ".idx");
|
|
717
|
+
git_str_putc(&packfile_names, '\0');
|
|
718
|
+
git_str_dispose(&relative_index);
|
|
707
719
|
|
|
708
720
|
error = git_pack_foreach_entry_offset(p, object_entry__cb, &state);
|
|
709
721
|
if (error < 0)
|
|
@@ -723,8 +735,8 @@ static int midx_write(
|
|
|
723
735
|
git_vector_uniq(&object_entries, NULL);
|
|
724
736
|
|
|
725
737
|
/* Pad the packfile names so it is a multiple of four. */
|
|
726
|
-
while (
|
|
727
|
-
|
|
738
|
+
while (git_str_len(&packfile_names) & 3)
|
|
739
|
+
git_str_putc(&packfile_names, '\0');
|
|
728
740
|
|
|
729
741
|
/* Fill the OID Fanout table. */
|
|
730
742
|
oid_fanout_count = 0;
|
|
@@ -737,7 +749,7 @@ static int midx_write(
|
|
|
737
749
|
|
|
738
750
|
/* Fill the OID Lookup table. */
|
|
739
751
|
git_vector_foreach (&object_entries, i, entry) {
|
|
740
|
-
error =
|
|
752
|
+
error = git_str_put(&oid_lookup, (char *)&entry->sha1.id, GIT_OID_SHA1_SIZE);
|
|
741
753
|
if (error < 0)
|
|
742
754
|
goto cleanup;
|
|
743
755
|
}
|
|
@@ -748,7 +760,7 @@ static int midx_write(
|
|
|
748
760
|
uint32_t word;
|
|
749
761
|
|
|
750
762
|
word = htonl((uint32_t)entry->pack_index);
|
|
751
|
-
error =
|
|
763
|
+
error = git_str_put(&object_offsets, (const char *)&word, sizeof(word));
|
|
752
764
|
if (error < 0)
|
|
753
765
|
goto cleanup;
|
|
754
766
|
if (entry->offset >= 0x80000000l) {
|
|
@@ -759,7 +771,7 @@ static int midx_write(
|
|
|
759
771
|
word = htonl((uint32_t)entry->offset & 0x7fffffffu);
|
|
760
772
|
}
|
|
761
773
|
|
|
762
|
-
error =
|
|
774
|
+
error = git_str_put(&object_offsets, (const char *)&word, sizeof(word));
|
|
763
775
|
if (error < 0)
|
|
764
776
|
goto cleanup;
|
|
765
777
|
}
|
|
@@ -767,7 +779,7 @@ static int midx_write(
|
|
|
767
779
|
/* Write the header. */
|
|
768
780
|
hdr.packfiles = htonl((uint32_t)git_vector_length(&w->packs));
|
|
769
781
|
hdr.chunks = 4;
|
|
770
|
-
if (
|
|
782
|
+
if (git_str_len(&object_large_offsets) > 0)
|
|
771
783
|
hdr.chunks++;
|
|
772
784
|
error = write_cb((const char *)&hdr, sizeof(hdr), cb_data);
|
|
773
785
|
if (error < 0)
|
|
@@ -778,7 +790,7 @@ static int midx_write(
|
|
|
778
790
|
error = write_chunk_header(MIDX_PACKFILE_NAMES_ID, offset, write_cb, cb_data);
|
|
779
791
|
if (error < 0)
|
|
780
792
|
goto cleanup;
|
|
781
|
-
offset +=
|
|
793
|
+
offset += git_str_len(&packfile_names);
|
|
782
794
|
error = write_chunk_header(MIDX_OID_FANOUT_ID, offset, write_cb, cb_data);
|
|
783
795
|
if (error < 0)
|
|
784
796
|
goto cleanup;
|
|
@@ -786,53 +798,53 @@ static int midx_write(
|
|
|
786
798
|
error = write_chunk_header(MIDX_OID_LOOKUP_ID, offset, write_cb, cb_data);
|
|
787
799
|
if (error < 0)
|
|
788
800
|
goto cleanup;
|
|
789
|
-
offset +=
|
|
801
|
+
offset += git_str_len(&oid_lookup);
|
|
790
802
|
error = write_chunk_header(MIDX_OBJECT_OFFSETS_ID, offset, write_cb, cb_data);
|
|
791
803
|
if (error < 0)
|
|
792
804
|
goto cleanup;
|
|
793
|
-
offset +=
|
|
794
|
-
if (
|
|
805
|
+
offset += git_str_len(&object_offsets);
|
|
806
|
+
if (git_str_len(&object_large_offsets) > 0) {
|
|
795
807
|
error = write_chunk_header(MIDX_OBJECT_LARGE_OFFSETS_ID, offset, write_cb, cb_data);
|
|
796
808
|
if (error < 0)
|
|
797
809
|
goto cleanup;
|
|
798
|
-
offset +=
|
|
810
|
+
offset += git_str_len(&object_large_offsets);
|
|
799
811
|
}
|
|
800
812
|
error = write_chunk_header(0, offset, write_cb, cb_data);
|
|
801
813
|
if (error < 0)
|
|
802
814
|
goto cleanup;
|
|
803
815
|
|
|
804
816
|
/* Write all the chunks. */
|
|
805
|
-
error = write_cb(
|
|
817
|
+
error = write_cb(git_str_cstr(&packfile_names), git_str_len(&packfile_names), cb_data);
|
|
806
818
|
if (error < 0)
|
|
807
819
|
goto cleanup;
|
|
808
820
|
error = write_cb((const char *)oid_fanout, sizeof(oid_fanout), cb_data);
|
|
809
821
|
if (error < 0)
|
|
810
822
|
goto cleanup;
|
|
811
|
-
error = write_cb(
|
|
823
|
+
error = write_cb(git_str_cstr(&oid_lookup), git_str_len(&oid_lookup), cb_data);
|
|
812
824
|
if (error < 0)
|
|
813
825
|
goto cleanup;
|
|
814
|
-
error = write_cb(
|
|
826
|
+
error = write_cb(git_str_cstr(&object_offsets), git_str_len(&object_offsets), cb_data);
|
|
815
827
|
if (error < 0)
|
|
816
828
|
goto cleanup;
|
|
817
|
-
error = write_cb(
|
|
829
|
+
error = write_cb(git_str_cstr(&object_large_offsets), git_str_len(&object_large_offsets), cb_data);
|
|
818
830
|
if (error < 0)
|
|
819
831
|
goto cleanup;
|
|
820
832
|
|
|
821
833
|
/* Finalize the checksum and write the trailer. */
|
|
822
|
-
error = git_hash_final(
|
|
834
|
+
error = git_hash_final(checksum, &ctx);
|
|
823
835
|
if (error < 0)
|
|
824
836
|
goto cleanup;
|
|
825
|
-
error = write_cb((
|
|
837
|
+
error = write_cb((char *)checksum, checksum_size, cb_data);
|
|
826
838
|
if (error < 0)
|
|
827
839
|
goto cleanup;
|
|
828
840
|
|
|
829
841
|
cleanup:
|
|
830
842
|
git_array_clear(object_entries_array);
|
|
831
843
|
git_vector_free(&object_entries);
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
844
|
+
git_str_dispose(&packfile_names);
|
|
845
|
+
git_str_dispose(&oid_lookup);
|
|
846
|
+
git_str_dispose(&object_offsets);
|
|
847
|
+
git_str_dispose(&object_large_offsets);
|
|
836
848
|
git_hash_ctx_cleanup(&ctx);
|
|
837
849
|
return error;
|
|
838
850
|
}
|
|
@@ -848,17 +860,17 @@ int git_midx_writer_commit(
|
|
|
848
860
|
{
|
|
849
861
|
int error;
|
|
850
862
|
int filebuf_flags = GIT_FILEBUF_DO_NOT_BUFFER;
|
|
851
|
-
|
|
863
|
+
git_str midx_path = GIT_STR_INIT;
|
|
852
864
|
git_filebuf output = GIT_FILEBUF_INIT;
|
|
853
865
|
|
|
854
|
-
error =
|
|
866
|
+
error = git_str_joinpath(&midx_path, git_str_cstr(&w->pack_dir), "multi-pack-index");
|
|
855
867
|
if (error < 0)
|
|
856
868
|
return error;
|
|
857
869
|
|
|
858
870
|
if (git_repository__fsync_gitdir)
|
|
859
871
|
filebuf_flags |= GIT_FILEBUF_FSYNC;
|
|
860
|
-
error = git_filebuf_open(&output,
|
|
861
|
-
|
|
872
|
+
error = git_filebuf_open(&output, git_str_cstr(&midx_path), filebuf_flags, 0644);
|
|
873
|
+
git_str_dispose(&midx_path);
|
|
862
874
|
if (error < 0)
|
|
863
875
|
return error;
|
|
864
876
|
|
|
@@ -875,5 +887,13 @@ int git_midx_writer_dump(
|
|
|
875
887
|
git_buf *midx,
|
|
876
888
|
git_midx_writer *w)
|
|
877
889
|
{
|
|
878
|
-
|
|
890
|
+
git_str str = GIT_STR_INIT;
|
|
891
|
+
int error;
|
|
892
|
+
|
|
893
|
+
if ((error = git_buf_tostr(&str, midx)) < 0 ||
|
|
894
|
+
(error = midx_write(w, midx_write_buf, &str)) == 0)
|
|
895
|
+
error = git_buf_fromstr(midx, &str);
|
|
896
|
+
|
|
897
|
+
git_str_dispose(&str);
|
|
898
|
+
return error;
|
|
879
899
|
}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
#include "map.h"
|
|
18
18
|
#include "mwindow.h"
|
|
19
19
|
#include "odb.h"
|
|
20
|
+
#include "oid.h"
|
|
20
21
|
|
|
21
22
|
/*
|
|
22
23
|
* A multi-pack-index file.
|
|
@@ -40,7 +41,7 @@ typedef struct git_midx_file {
|
|
|
40
41
|
uint32_t num_objects;
|
|
41
42
|
|
|
42
43
|
/* The OID Lookup table. */
|
|
43
|
-
|
|
44
|
+
unsigned char *oid_lookup;
|
|
44
45
|
|
|
45
46
|
/* The Object Offsets table. Each entry has two 4-byte fields with the pack index and the offset. */
|
|
46
47
|
const unsigned char *object_offsets;
|
|
@@ -51,10 +52,10 @@ typedef struct git_midx_file {
|
|
|
51
52
|
size_t num_object_large_offsets;
|
|
52
53
|
|
|
53
54
|
/* The trailer of the file. Contains the SHA1-checksum of the whole file. */
|
|
54
|
-
|
|
55
|
+
unsigned char checksum[GIT_HASH_SHA1_SIZE];
|
|
55
56
|
|
|
56
57
|
/* something like ".git/objects/pack/multi-pack-index". */
|
|
57
|
-
|
|
58
|
+
git_str filename;
|
|
58
59
|
} git_midx_file;
|
|
59
60
|
|
|
60
61
|
/*
|
|
@@ -77,7 +78,7 @@ struct git_midx_writer {
|
|
|
77
78
|
* The path of the directory where the .pack/.idx files are stored. The
|
|
78
79
|
* `multi-pack-index` file will be written to the same directory.
|
|
79
80
|
*/
|
|
80
|
-
|
|
81
|
+
git_str pack_dir;
|
|
81
82
|
|
|
82
83
|
/* The list of `git_pack_file`s. */
|
|
83
84
|
git_vector packs;
|
|
@@ -61,7 +61,10 @@ int git_mwindow_global_init(void)
|
|
|
61
61
|
return git_runtime_shutdown_register(git_mwindow_global_shutdown);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
int git_mwindow_get_pack(
|
|
64
|
+
int git_mwindow_get_pack(
|
|
65
|
+
struct git_pack_file **out,
|
|
66
|
+
const char *path,
|
|
67
|
+
git_oid_t oid_type)
|
|
65
68
|
{
|
|
66
69
|
struct git_pack_file *pack;
|
|
67
70
|
char *packname;
|
|
@@ -86,7 +89,7 @@ int git_mwindow_get_pack(struct git_pack_file **out, const char *path)
|
|
|
86
89
|
}
|
|
87
90
|
|
|
88
91
|
/* If we didn't find it, we need to create it */
|
|
89
|
-
if ((error = git_packfile_alloc(&pack, path)) < 0) {
|
|
92
|
+
if ((error = git_packfile_alloc(&pack, path, oid_type)) < 0) {
|
|
90
93
|
git_mutex_unlock(&git__mwindow_mutex);
|
|
91
94
|
return error;
|
|
92
95
|
}
|
|
@@ -186,13 +189,16 @@ int git_mwindow_free_all(git_mwindow_file *mwf)
|
|
|
186
189
|
}
|
|
187
190
|
|
|
188
191
|
/*
|
|
189
|
-
* Check if a window 'win' contains the address 'offset'
|
|
192
|
+
* Check if a window 'win' contains both the address 'offset' and 'extra'.
|
|
193
|
+
*
|
|
194
|
+
* 'extra' is the size of the hash we're using as we always want to make sure
|
|
195
|
+
* that it's contained.
|
|
190
196
|
*/
|
|
191
|
-
int git_mwindow_contains(git_mwindow *win, off64_t offset)
|
|
197
|
+
int git_mwindow_contains(git_mwindow *win, off64_t offset, off64_t extra)
|
|
192
198
|
{
|
|
193
199
|
off64_t win_off = win->offset;
|
|
194
200
|
return win_off <= offset
|
|
195
|
-
&& offset <= (off64_t)(win_off + win->window_map.len);
|
|
201
|
+
&& (offset + extra) <= (off64_t)(win_off + win->window_map.len);
|
|
196
202
|
}
|
|
197
203
|
|
|
198
204
|
#define GIT_MWINDOW__LRU -1
|
|
@@ -237,9 +243,7 @@ static bool git_mwindow_scan_recently_used(
|
|
|
237
243
|
* store it in the output parameter. If lru_window is NULL,
|
|
238
244
|
* it's the first loop, so store it as well.
|
|
239
245
|
*/
|
|
240
|
-
if (!lru_window ||
|
|
241
|
-
(comparison_sign == GIT_MWINDOW__LRU && lru_window->last_used > w->last_used) ||
|
|
242
|
-
(comparison_sign == GIT_MWINDOW__MRU && lru_window->last_used < w->last_used)) {
|
|
246
|
+
if (!lru_window || (comparison_sign * w->last_used) > lru_window->last_used) {
|
|
243
247
|
lru_window = w;
|
|
244
248
|
lru_last = w_last;
|
|
245
249
|
found = true;
|
|
@@ -406,14 +410,13 @@ unsigned char *git_mwindow_open(
|
|
|
406
410
|
return NULL;
|
|
407
411
|
}
|
|
408
412
|
|
|
409
|
-
if (!w || !(git_mwindow_contains(w, offset
|
|
413
|
+
if (!w || !(git_mwindow_contains(w, offset, extra))) {
|
|
410
414
|
if (w) {
|
|
411
415
|
w->inuse_cnt--;
|
|
412
416
|
}
|
|
413
417
|
|
|
414
418
|
for (w = mwf->windows; w; w = w->next) {
|
|
415
|
-
if (git_mwindow_contains(w, offset)
|
|
416
|
-
git_mwindow_contains(w, offset + extra))
|
|
419
|
+
if (git_mwindow_contains(w, offset, extra))
|
|
417
420
|
break;
|
|
418
421
|
}
|
|
419
422
|
|
|
@@ -473,7 +476,7 @@ int git_mwindow_file_register(git_mwindow_file *mwf)
|
|
|
473
476
|
git_mwindow_find_lru_file_locked(&lru_file) == 0) {
|
|
474
477
|
if ((error = git_vector_insert(&closed_files, lru_file)) < 0) {
|
|
475
478
|
/*
|
|
476
|
-
* Exceeding the file limit seems
|
|
479
|
+
* Exceeding the file limit seems preferable to being open to
|
|
477
480
|
* data races that can end up corrupting the heap.
|
|
478
481
|
*/
|
|
479
482
|
break;
|
|
@@ -38,7 +38,7 @@ typedef struct git_mwindow_ctl {
|
|
|
38
38
|
git_vector windowfiles;
|
|
39
39
|
} git_mwindow_ctl;
|
|
40
40
|
|
|
41
|
-
int git_mwindow_contains(git_mwindow *win, off64_t offset);
|
|
41
|
+
int git_mwindow_contains(git_mwindow *win, off64_t offset, off64_t extra);
|
|
42
42
|
int git_mwindow_free_all(git_mwindow_file *mwf); /* locks */
|
|
43
43
|
unsigned char *git_mwindow_open(git_mwindow_file *mwf, git_mwindow **cursor, off64_t offset, size_t extra, unsigned int *left);
|
|
44
44
|
int git_mwindow_file_register(git_mwindow_file *mwf);
|
|
@@ -48,7 +48,10 @@ void git_mwindow_close(git_mwindow **w_cursor);
|
|
|
48
48
|
extern int git_mwindow_global_init(void);
|
|
49
49
|
|
|
50
50
|
struct git_pack_file; /* just declaration to avoid cyclical includes */
|
|
51
|
-
int git_mwindow_get_pack(
|
|
51
|
+
int git_mwindow_get_pack(
|
|
52
|
+
struct git_pack_file **out,
|
|
53
|
+
const char *path,
|
|
54
|
+
git_oid_t oid_type);
|
|
52
55
|
int git_mwindow_put_pack(struct git_pack_file *pack);
|
|
53
56
|
|
|
54
57
|
#endif
|