rugged 1.3.1 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +34 -2
- data/ext/rugged/extconf.rb +6 -3
- 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 +38 -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 +18 -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} +107 -71
- 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} +54 -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} +690 -366
- data/vendor/libgit2/src/{repository.h → libgit2/repository.h} +21 -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} +580 -615
- data/vendor/libgit2/src/{path.h → util/fs_path.h} +234 -181
- 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
@@ -12,6 +12,7 @@
|
|
12
12
|
#include "git2/object.h"
|
13
13
|
#include "git2/sys/repository.h"
|
14
14
|
|
15
|
+
#include "buf.h"
|
15
16
|
#include "common.h"
|
16
17
|
#include "commit.h"
|
17
18
|
#include "tag.h"
|
@@ -31,13 +32,14 @@
|
|
31
32
|
#include "annotated_commit.h"
|
32
33
|
#include "submodule.h"
|
33
34
|
#include "worktree.h"
|
34
|
-
|
35
|
+
#include "path.h"
|
35
36
|
#include "strmap.h"
|
36
37
|
|
37
38
|
#ifdef GIT_WIN32
|
38
39
|
# include "win32/w32_util.h"
|
39
40
|
#endif
|
40
41
|
|
42
|
+
bool git_repository__validate_ownership = true;
|
41
43
|
bool git_repository__fsync_gitdir = false;
|
42
44
|
|
43
45
|
static const struct {
|
@@ -64,6 +66,8 @@ static const struct {
|
|
64
66
|
|
65
67
|
static int check_repositoryformatversion(int *version, git_config *config);
|
66
68
|
static int check_extensions(git_config *config, int version);
|
69
|
+
static int load_global_config(git_config **config);
|
70
|
+
static int load_objectformat(git_repository *repo, git_config *config);
|
67
71
|
|
68
72
|
#define GIT_COMMONDIR_FILE "commondir"
|
69
73
|
#define GIT_GITDIR_FILE "gitdir"
|
@@ -72,16 +76,16 @@ static int check_extensions(git_config *config, int version);
|
|
72
76
|
|
73
77
|
#define GIT_BRANCH_DEFAULT "master"
|
74
78
|
|
75
|
-
#define
|
76
|
-
#define
|
79
|
+
#define GIT_REPO_VERSION_DEFAULT 0
|
80
|
+
#define GIT_REPO_VERSION_MAX 1
|
77
81
|
|
78
|
-
|
82
|
+
git_str git_repository__reserved_names_win32[] = {
|
79
83
|
{ DOT_GIT, 0, CONST_STRLEN(DOT_GIT) },
|
80
84
|
{ GIT_DIR_SHORTNAME, 0, CONST_STRLEN(GIT_DIR_SHORTNAME) }
|
81
85
|
};
|
82
86
|
size_t git_repository__reserved_names_win32_len = 2;
|
83
87
|
|
84
|
-
|
88
|
+
git_str git_repository__reserved_names_posix[] = {
|
85
89
|
{ DOT_GIT, 0, CONST_STRLEN(DOT_GIT) },
|
86
90
|
};
|
87
91
|
size_t git_repository__reserved_names_posix_len = 1;
|
@@ -171,7 +175,7 @@ void git_repository_free(git_repository *repo)
|
|
171
175
|
repo->diff_drivers = NULL;
|
172
176
|
|
173
177
|
for (i = 0; i < repo->reserved_names.size; i++)
|
174
|
-
|
178
|
+
git_str_dispose(git_array_get(repo->reserved_names, i));
|
175
179
|
git_array_clear(repo->reserved_names);
|
176
180
|
|
177
181
|
git__free(repo->gitlink);
|
@@ -187,18 +191,18 @@ void git_repository_free(git_repository *repo)
|
|
187
191
|
}
|
188
192
|
|
189
193
|
/* Check if we have a separate commondir (e.g. we have a worktree) */
|
190
|
-
static int lookup_commondir(bool *separate,
|
194
|
+
static int lookup_commondir(bool *separate, git_str *commondir, git_str *repository_path)
|
191
195
|
{
|
192
|
-
|
196
|
+
git_str common_link = GIT_STR_INIT;
|
193
197
|
int error;
|
194
198
|
|
195
199
|
/*
|
196
200
|
* If there's no commondir file, the repository path is the
|
197
201
|
* common path, but it needs a trailing slash.
|
198
202
|
*/
|
199
|
-
if (!
|
200
|
-
if ((error =
|
201
|
-
error =
|
203
|
+
if (!git_fs_path_contains_file(repository_path, GIT_COMMONDIR_FILE)) {
|
204
|
+
if ((error = git_str_set(commondir, repository_path->ptr, repository_path->size)) == 0)
|
205
|
+
error = git_fs_path_to_dir(commondir);
|
202
206
|
|
203
207
|
*separate = false;
|
204
208
|
goto done;
|
@@ -206,28 +210,28 @@ static int lookup_commondir(bool *separate, git_buf *commondir, git_buf *reposit
|
|
206
210
|
|
207
211
|
*separate = true;
|
208
212
|
|
209
|
-
if ((error =
|
213
|
+
if ((error = git_str_joinpath(&common_link, repository_path->ptr, GIT_COMMONDIR_FILE)) < 0 ||
|
210
214
|
(error = git_futils_readbuffer(&common_link, common_link.ptr)) < 0)
|
211
215
|
goto done;
|
212
216
|
|
213
|
-
|
214
|
-
if (
|
215
|
-
if ((error =
|
217
|
+
git_str_rtrim(&common_link);
|
218
|
+
if (git_fs_path_is_relative(common_link.ptr)) {
|
219
|
+
if ((error = git_str_joinpath(commondir, repository_path->ptr, common_link.ptr)) < 0)
|
216
220
|
goto done;
|
217
221
|
} else {
|
218
|
-
|
222
|
+
git_str_swap(commondir, &common_link);
|
219
223
|
}
|
220
224
|
|
221
|
-
|
225
|
+
git_str_dispose(&common_link);
|
222
226
|
|
223
227
|
/* Make sure the commondir path always has a trailing slash */
|
224
|
-
error =
|
228
|
+
error = git_fs_path_prettify_dir(commondir, commondir->ptr, NULL);
|
225
229
|
|
226
230
|
done:
|
227
231
|
return error;
|
228
232
|
}
|
229
233
|
|
230
|
-
GIT_INLINE(int) validate_repo_path(
|
234
|
+
GIT_INLINE(int) validate_repo_path(git_str *path)
|
231
235
|
{
|
232
236
|
/*
|
233
237
|
* The longest static path in a repository (or commondir) is the
|
@@ -237,10 +241,10 @@ GIT_INLINE(int) validate_repo_path(git_buf *path)
|
|
237
241
|
*/
|
238
242
|
static size_t suffix_len =
|
239
243
|
CONST_STRLEN("objects/pack/pack-.pack.lock") +
|
240
|
-
|
244
|
+
GIT_OID_MAX_HEXSIZE;
|
241
245
|
|
242
|
-
return
|
243
|
-
path
|
246
|
+
return git_fs_path_validate_str_length_with_suffix(
|
247
|
+
path, suffix_len);
|
244
248
|
}
|
245
249
|
|
246
250
|
/*
|
@@ -248,7 +252,7 @@ GIT_INLINE(int) validate_repo_path(git_buf *path)
|
|
248
252
|
*
|
249
253
|
* Open a repository object from its path
|
250
254
|
*/
|
251
|
-
static int is_valid_repository_path(bool *out,
|
255
|
+
static int is_valid_repository_path(bool *out, git_str *repository_path, git_str *common_path)
|
252
256
|
{
|
253
257
|
bool separate_commondir = false;
|
254
258
|
int error;
|
@@ -259,13 +263,13 @@ static int is_valid_repository_path(bool *out, git_buf *repository_path, git_buf
|
|
259
263
|
return error;
|
260
264
|
|
261
265
|
/* Ensure HEAD file exists */
|
262
|
-
if (
|
266
|
+
if (git_fs_path_contains_file(repository_path, GIT_HEAD_FILE) == false)
|
263
267
|
return 0;
|
264
268
|
|
265
269
|
/* Check files in common dir */
|
266
|
-
if (
|
270
|
+
if (git_fs_path_contains_dir(common_path, GIT_OBJECTS_DIR) == false)
|
267
271
|
return 0;
|
268
|
-
if (
|
272
|
+
if (git_fs_path_contains_dir(common_path, GIT_REFS_DIR) == false)
|
269
273
|
return 0;
|
270
274
|
|
271
275
|
/* Ensure the repo (and commondir) are valid paths */
|
@@ -333,12 +337,12 @@ static int load_config_data(git_repository *repo, const git_config *config)
|
|
333
337
|
return 0;
|
334
338
|
}
|
335
339
|
|
336
|
-
static int load_workdir(git_repository *repo, git_config *config,
|
340
|
+
static int load_workdir(git_repository *repo, git_config *config, git_str *parent_path)
|
337
341
|
{
|
338
342
|
int error;
|
339
343
|
git_config_entry *ce;
|
340
|
-
|
341
|
-
|
344
|
+
git_str worktree = GIT_STR_INIT;
|
345
|
+
git_str path = GIT_STR_INIT;
|
342
346
|
|
343
347
|
if (repo->is_bare)
|
344
348
|
return 0;
|
@@ -354,38 +358,38 @@ static int load_workdir(git_repository *repo, git_config *config, git_buf *paren
|
|
354
358
|
goto cleanup;
|
355
359
|
}
|
356
360
|
|
357
|
-
|
361
|
+
git_str_attach(&worktree, gitlink, 0);
|
358
362
|
|
359
|
-
if ((
|
360
|
-
|
363
|
+
if ((git_fs_path_dirname_r(&worktree, worktree.ptr)) < 0 ||
|
364
|
+
git_fs_path_to_dir(&worktree) < 0) {
|
361
365
|
error = -1;
|
362
366
|
goto cleanup;
|
363
367
|
}
|
364
368
|
|
365
|
-
repo->workdir =
|
369
|
+
repo->workdir = git_str_detach(&worktree);
|
366
370
|
}
|
367
371
|
else if (ce && ce->value) {
|
368
|
-
if ((error =
|
372
|
+
if ((error = git_fs_path_prettify_dir(
|
369
373
|
&worktree, ce->value, repo->gitdir)) < 0)
|
370
374
|
goto cleanup;
|
371
375
|
|
372
|
-
repo->workdir =
|
376
|
+
repo->workdir = git_str_detach(&worktree);
|
373
377
|
}
|
374
|
-
else if (parent_path &&
|
375
|
-
repo->workdir =
|
378
|
+
else if (parent_path && git_fs_path_isdir(parent_path->ptr))
|
379
|
+
repo->workdir = git_str_detach(parent_path);
|
376
380
|
else {
|
377
|
-
if (
|
378
|
-
|
381
|
+
if (git_fs_path_dirname_r(&worktree, repo->gitdir) < 0 ||
|
382
|
+
git_fs_path_to_dir(&worktree) < 0) {
|
379
383
|
error = -1;
|
380
384
|
goto cleanup;
|
381
385
|
}
|
382
386
|
|
383
|
-
repo->workdir =
|
387
|
+
repo->workdir = git_str_detach(&worktree);
|
384
388
|
}
|
385
389
|
|
386
390
|
GIT_ERROR_CHECK_ALLOC(repo->workdir);
|
387
391
|
cleanup:
|
388
|
-
|
392
|
+
git_str_dispose(&path);
|
389
393
|
git_config_entry_free(ce);
|
390
394
|
return error;
|
391
395
|
}
|
@@ -394,7 +398,7 @@ cleanup:
|
|
394
398
|
* This function returns furthest offset into path where a ceiling dir
|
395
399
|
* is found, so we can stop processing the path at that point.
|
396
400
|
*
|
397
|
-
* Note: converting this to use
|
401
|
+
* Note: converting this to use git_strs instead of GIT_PATH_MAX buffers on
|
398
402
|
* the stack could remove directories name limits, but at the cost of doing
|
399
403
|
* repeated malloc/frees inside the loop below, so let's not do it now.
|
400
404
|
*/
|
@@ -409,7 +413,7 @@ static size_t find_ceiling_dir_offset(
|
|
409
413
|
|
410
414
|
GIT_ASSERT_ARG(path);
|
411
415
|
|
412
|
-
min_len = (size_t)(
|
416
|
+
min_len = (size_t)(git_fs_path_root(path) + 1);
|
413
417
|
|
414
418
|
if (ceiling_directories == NULL || min_len == 0)
|
415
419
|
return min_len;
|
@@ -418,7 +422,7 @@ static size_t find_ceiling_dir_offset(
|
|
418
422
|
for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++);
|
419
423
|
len = sep - ceil;
|
420
424
|
|
421
|
-
if (len == 0 || len >= sizeof(buf) ||
|
425
|
+
if (len == 0 || len >= sizeof(buf) || git_fs_path_root(ceil) == -1)
|
422
426
|
continue;
|
423
427
|
|
424
428
|
strncpy(buf, ceil, len);
|
@@ -447,10 +451,10 @@ static size_t find_ceiling_dir_offset(
|
|
447
451
|
* it points to. Before calling, set `path_out` to the base directory that
|
448
452
|
* should be used if the contents of `file_path` are a relative path.
|
449
453
|
*/
|
450
|
-
static int read_gitfile(
|
454
|
+
static int read_gitfile(git_str *path_out, const char *file_path)
|
451
455
|
{
|
452
456
|
int error = 0;
|
453
|
-
|
457
|
+
git_str file = GIT_STR_INIT;
|
454
458
|
size_t prefix_len = strlen(GIT_FILE_CONTENT_PREFIX);
|
455
459
|
|
456
460
|
GIT_ASSERT_ARG(path_out);
|
@@ -459,41 +463,192 @@ static int read_gitfile(git_buf *path_out, const char *file_path)
|
|
459
463
|
if (git_futils_readbuffer(&file, file_path) < 0)
|
460
464
|
return -1;
|
461
465
|
|
462
|
-
|
466
|
+
git_str_rtrim(&file);
|
463
467
|
/* apparently on Windows, some people use backslashes in paths */
|
464
|
-
|
468
|
+
git_fs_path_mkposix(file.ptr);
|
465
469
|
|
466
|
-
if (
|
467
|
-
memcmp(
|
470
|
+
if (git_str_len(&file) <= prefix_len ||
|
471
|
+
memcmp(git_str_cstr(&file), GIT_FILE_CONTENT_PREFIX, prefix_len) != 0)
|
468
472
|
{
|
469
473
|
git_error_set(GIT_ERROR_REPOSITORY,
|
470
474
|
"the `.git` file at '%s' is malformed", file_path);
|
471
475
|
error = -1;
|
472
476
|
}
|
473
|
-
else if ((error =
|
474
|
-
const char *gitlink =
|
477
|
+
else if ((error = git_fs_path_dirname_r(path_out, file_path)) >= 0) {
|
478
|
+
const char *gitlink = git_str_cstr(&file) + prefix_len;
|
475
479
|
while (*gitlink && git__isspace(*gitlink)) gitlink++;
|
476
480
|
|
477
|
-
error =
|
478
|
-
path_out, gitlink,
|
481
|
+
error = git_fs_path_prettify_dir(
|
482
|
+
path_out, gitlink, git_str_cstr(path_out));
|
483
|
+
}
|
484
|
+
|
485
|
+
git_str_dispose(&file);
|
486
|
+
return error;
|
487
|
+
}
|
488
|
+
|
489
|
+
typedef struct {
|
490
|
+
const char *repo_path;
|
491
|
+
git_str tmp;
|
492
|
+
bool *is_safe;
|
493
|
+
} validate_ownership_data;
|
494
|
+
|
495
|
+
static int validate_ownership_cb(const git_config_entry *entry, void *payload)
|
496
|
+
{
|
497
|
+
validate_ownership_data *data = payload;
|
498
|
+
|
499
|
+
if (strcmp(entry->value, "") == 0) {
|
500
|
+
*data->is_safe = false;
|
501
|
+
} else if (strcmp(entry->value, "*") == 0) {
|
502
|
+
*data->is_safe = true;
|
503
|
+
} else {
|
504
|
+
const char *test_path = entry->value;
|
505
|
+
|
506
|
+
#ifdef GIT_WIN32
|
507
|
+
/*
|
508
|
+
* Git for Windows does some truly bizarre things with
|
509
|
+
* paths that start with a forward slash; and expects you
|
510
|
+
* to escape that with `%(prefix)`. This syntax generally
|
511
|
+
* means to add the prefix that Git was installed to -- eg
|
512
|
+
* `/usr/local` -- unless it's an absolute path, in which
|
513
|
+
* case the leading `%(prefix)/` is just removed. And Git
|
514
|
+
* for Windows expects you to use this syntax for absolute
|
515
|
+
* Unix-style paths (in "Git Bash" or Windows Subsystem for
|
516
|
+
* Linux).
|
517
|
+
*
|
518
|
+
* Worse, the behavior used to be that a leading `/` was
|
519
|
+
* not absolute. It would indicate that Git for Windows
|
520
|
+
* should add the prefix. So `//` is required for absolute
|
521
|
+
* Unix-style paths. Yes, this is truly horrifying.
|
522
|
+
*
|
523
|
+
* Emulate that behavior, I guess, but only for absolute
|
524
|
+
* paths. We won't deal with the Git install prefix. Also,
|
525
|
+
* give WSL users an escape hatch where they don't have to
|
526
|
+
* think about this and can use the literal path that the
|
527
|
+
* filesystem APIs provide (`//wsl.localhost/...`).
|
528
|
+
*/
|
529
|
+
if (strncmp(test_path, "%(prefix)//", strlen("%(prefix)//")) == 0)
|
530
|
+
test_path += strlen("%(prefix)/");
|
531
|
+
else if (strncmp(test_path, "//", 2) == 0 &&
|
532
|
+
strncmp(test_path, "//wsl.localhost/", strlen("//wsl.localhost/")) != 0)
|
533
|
+
test_path++;
|
534
|
+
#endif
|
535
|
+
|
536
|
+
if (git_fs_path_prettify_dir(&data->tmp, test_path, NULL) == 0 &&
|
537
|
+
strcmp(data->tmp.ptr, data->repo_path) == 0)
|
538
|
+
*data->is_safe = true;
|
539
|
+
}
|
540
|
+
|
541
|
+
return 0;
|
542
|
+
}
|
543
|
+
|
544
|
+
static int validate_ownership_config(bool *is_safe, const char *path)
|
545
|
+
{
|
546
|
+
validate_ownership_data ownership_data = {
|
547
|
+
path, GIT_STR_INIT, is_safe
|
548
|
+
};
|
549
|
+
git_config *config;
|
550
|
+
int error;
|
551
|
+
|
552
|
+
if (load_global_config(&config) != 0)
|
553
|
+
return 0;
|
554
|
+
|
555
|
+
error = git_config_get_multivar_foreach(config,
|
556
|
+
"safe.directory", NULL,
|
557
|
+
validate_ownership_cb,
|
558
|
+
&ownership_data);
|
559
|
+
|
560
|
+
if (error == GIT_ENOTFOUND)
|
561
|
+
error = 0;
|
562
|
+
|
563
|
+
git_config_free(config);
|
564
|
+
git_str_dispose(&ownership_data.tmp);
|
565
|
+
|
566
|
+
return error;
|
567
|
+
}
|
568
|
+
|
569
|
+
static int validate_ownership_path(bool *is_safe, const char *path)
|
570
|
+
{
|
571
|
+
git_fs_path_owner_t owner_level =
|
572
|
+
GIT_FS_PATH_OWNER_CURRENT_USER |
|
573
|
+
GIT_FS_PATH_USER_IS_ADMINISTRATOR |
|
574
|
+
GIT_FS_PATH_OWNER_RUNNING_SUDO;
|
575
|
+
int error = 0;
|
576
|
+
|
577
|
+
if (path)
|
578
|
+
error = git_fs_path_owner_is(is_safe, path, owner_level);
|
579
|
+
|
580
|
+
if (error == GIT_ENOTFOUND) {
|
581
|
+
*is_safe = true;
|
582
|
+
error = 0;
|
583
|
+
} else if (error == GIT_EINVALID) {
|
584
|
+
*is_safe = false;
|
585
|
+
error = 0;
|
586
|
+
}
|
587
|
+
|
588
|
+
return error;
|
589
|
+
}
|
590
|
+
|
591
|
+
static int validate_ownership(git_repository *repo)
|
592
|
+
{
|
593
|
+
const char *validation_paths[3] = { NULL }, *path;
|
594
|
+
size_t validation_len = 0, i;
|
595
|
+
bool is_safe = false;
|
596
|
+
int error = 0;
|
597
|
+
|
598
|
+
/*
|
599
|
+
* If there's a worktree, validate the permissions to it *and*
|
600
|
+
* the git directory, and use the worktree as the configuration
|
601
|
+
* key for allowlisting the directory. In a bare setup, only
|
602
|
+
* look at the gitdir and use that as the allowlist. So we
|
603
|
+
* examine all `validation_paths` but use only the first as
|
604
|
+
* the configuration lookup.
|
605
|
+
*/
|
606
|
+
|
607
|
+
if (repo->workdir)
|
608
|
+
validation_paths[validation_len++] = repo->workdir;
|
609
|
+
|
610
|
+
if (repo->gitlink)
|
611
|
+
validation_paths[validation_len++] = repo->gitlink;
|
612
|
+
|
613
|
+
validation_paths[validation_len++] = repo->gitdir;
|
614
|
+
|
615
|
+
for (i = 0; i < validation_len; i++) {
|
616
|
+
path = validation_paths[i];
|
617
|
+
|
618
|
+
if ((error = validate_ownership_path(&is_safe, path)) < 0)
|
619
|
+
goto done;
|
620
|
+
|
621
|
+
if (!is_safe)
|
622
|
+
break;
|
623
|
+
}
|
624
|
+
|
625
|
+
if (is_safe ||
|
626
|
+
(error = validate_ownership_config(&is_safe, validation_paths[0])) < 0)
|
627
|
+
goto done;
|
628
|
+
|
629
|
+
if (!is_safe) {
|
630
|
+
git_error_set(GIT_ERROR_CONFIG,
|
631
|
+
"repository path '%s' is not owned by current user",
|
632
|
+
path);
|
633
|
+
error = GIT_EOWNER;
|
479
634
|
}
|
480
635
|
|
481
|
-
|
636
|
+
done:
|
482
637
|
return error;
|
483
638
|
}
|
484
639
|
|
485
640
|
static int find_repo(
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
641
|
+
git_str *gitdir_path,
|
642
|
+
git_str *workdir_path,
|
643
|
+
git_str *gitlink_path,
|
644
|
+
git_str *commondir_path,
|
490
645
|
const char *start_path,
|
491
646
|
uint32_t flags,
|
492
647
|
const char *ceiling_dirs)
|
493
648
|
{
|
494
|
-
|
495
|
-
|
496
|
-
|
649
|
+
git_str path = GIT_STR_INIT;
|
650
|
+
git_str repo_link = GIT_STR_INIT;
|
651
|
+
git_str common_link = GIT_STR_INIT;
|
497
652
|
struct stat st;
|
498
653
|
dev_t initial_device = 0;
|
499
654
|
int min_iterations;
|
@@ -501,9 +656,9 @@ static int find_repo(
|
|
501
656
|
size_t ceiling_offset = 0;
|
502
657
|
int error;
|
503
658
|
|
504
|
-
|
659
|
+
git_str_clear(gitdir_path);
|
505
660
|
|
506
|
-
error =
|
661
|
+
error = git_fs_path_prettify(&path, start_path, NULL);
|
507
662
|
if (error < 0)
|
508
663
|
return error;
|
509
664
|
|
@@ -525,7 +680,7 @@ static int find_repo(
|
|
525
680
|
for (;;) {
|
526
681
|
if (!(flags & GIT_REPOSITORY_OPEN_NO_DOTGIT)) {
|
527
682
|
if (!in_dot_git) {
|
528
|
-
if ((error =
|
683
|
+
if ((error = git_str_joinpath(&path, path.ptr, DOT_GIT)) < 0)
|
529
684
|
goto out;
|
530
685
|
}
|
531
686
|
in_dot_git = !in_dot_git;
|
@@ -544,15 +699,15 @@ static int find_repo(
|
|
544
699
|
goto out;
|
545
700
|
|
546
701
|
if (is_valid) {
|
547
|
-
if ((error =
|
548
|
-
(error =
|
702
|
+
if ((error = git_fs_path_to_dir(&path)) < 0 ||
|
703
|
+
(error = git_str_set(gitdir_path, path.ptr, path.size)) < 0)
|
549
704
|
goto out;
|
550
705
|
|
551
706
|
if (gitlink_path)
|
552
|
-
if ((error =
|
707
|
+
if ((error = git_str_attach(gitlink_path, git_worktree__read_link(path.ptr, GIT_GITDIR_FILE), 0)) < 0)
|
553
708
|
goto out;
|
554
709
|
if (commondir_path)
|
555
|
-
|
710
|
+
git_str_swap(&common_link, commondir_path);
|
556
711
|
|
557
712
|
break;
|
558
713
|
}
|
@@ -562,13 +717,13 @@ static int find_repo(
|
|
562
717
|
goto out;
|
563
718
|
|
564
719
|
if (is_valid) {
|
565
|
-
|
720
|
+
git_str_swap(gitdir_path, &repo_link);
|
566
721
|
|
567
722
|
if (gitlink_path)
|
568
|
-
if ((error =
|
723
|
+
if ((error = git_str_put(gitlink_path, path.ptr, path.size)) < 0)
|
569
724
|
goto out;
|
570
725
|
if (commondir_path)
|
571
|
-
|
726
|
+
git_str_swap(&common_link, commondir_path);
|
572
727
|
}
|
573
728
|
break;
|
574
729
|
}
|
@@ -577,7 +732,7 @@ static int find_repo(
|
|
577
732
|
/* Move up one directory. If we're in_dot_git, we'll search the
|
578
733
|
* parent itself next. If we're !in_dot_git, we'll search .git
|
579
734
|
* in the parent directory next (added at the top of the loop). */
|
580
|
-
if ((error =
|
735
|
+
if ((error = git_fs_path_dirname_r(&path, path.ptr)) < 0)
|
581
736
|
goto out;
|
582
737
|
|
583
738
|
/* Once we've checked the directory (and .git if applicable),
|
@@ -592,25 +747,62 @@ static int find_repo(
|
|
592
747
|
}
|
593
748
|
|
594
749
|
if (workdir_path && !(flags & GIT_REPOSITORY_OPEN_BARE)) {
|
595
|
-
if (!
|
596
|
-
|
597
|
-
else if ((error =
|
598
|
-
(error =
|
750
|
+
if (!git_str_len(gitdir_path))
|
751
|
+
git_str_clear(workdir_path);
|
752
|
+
else if ((error = git_fs_path_dirname_r(workdir_path, path.ptr)) < 0 ||
|
753
|
+
(error = git_fs_path_to_dir(workdir_path)) < 0)
|
599
754
|
goto out;
|
600
755
|
}
|
601
756
|
|
602
757
|
/* If we didn't find the repository, and we don't have any other error
|
603
758
|
* to report, report that. */
|
604
|
-
if (!
|
759
|
+
if (!git_str_len(gitdir_path)) {
|
605
760
|
git_error_set(GIT_ERROR_REPOSITORY, "could not find repository from '%s'", start_path);
|
606
761
|
error = GIT_ENOTFOUND;
|
607
762
|
goto out;
|
608
763
|
}
|
609
764
|
|
610
765
|
out:
|
611
|
-
|
612
|
-
|
613
|
-
|
766
|
+
git_str_dispose(&path);
|
767
|
+
git_str_dispose(&repo_link);
|
768
|
+
git_str_dispose(&common_link);
|
769
|
+
return error;
|
770
|
+
}
|
771
|
+
|
772
|
+
static int obtain_config_and_set_oid_type(
|
773
|
+
git_config **config_ptr,
|
774
|
+
git_repository *repo)
|
775
|
+
{
|
776
|
+
int error;
|
777
|
+
git_config *config = NULL;
|
778
|
+
int version = 0;
|
779
|
+
|
780
|
+
/*
|
781
|
+
* We'd like to have the config, but git doesn't particularly
|
782
|
+
* care if it's not there, so we need to deal with that.
|
783
|
+
*/
|
784
|
+
|
785
|
+
error = git_repository_config_snapshot(&config, repo);
|
786
|
+
if (error < 0 && error != GIT_ENOTFOUND)
|
787
|
+
goto out;
|
788
|
+
|
789
|
+
if (config &&
|
790
|
+
(error = check_repositoryformatversion(&version, config)) < 0)
|
791
|
+
goto out;
|
792
|
+
|
793
|
+
if ((error = check_extensions(config, version)) < 0)
|
794
|
+
goto out;
|
795
|
+
|
796
|
+
if (version > 0) {
|
797
|
+
if ((error = load_objectformat(repo, config)) < 0)
|
798
|
+
goto out;
|
799
|
+
} else {
|
800
|
+
repo->oid_type = GIT_OID_SHA1;
|
801
|
+
}
|
802
|
+
|
803
|
+
out:
|
804
|
+
*config_ptr = config;
|
805
|
+
|
614
806
|
return error;
|
615
807
|
}
|
616
808
|
|
@@ -618,18 +810,19 @@ int git_repository_open_bare(
|
|
618
810
|
git_repository **repo_ptr,
|
619
811
|
const char *bare_path)
|
620
812
|
{
|
621
|
-
|
813
|
+
git_str path = GIT_STR_INIT, common_path = GIT_STR_INIT;
|
622
814
|
git_repository *repo = NULL;
|
623
815
|
bool is_valid;
|
624
816
|
int error;
|
817
|
+
git_config *config;
|
625
818
|
|
626
|
-
if ((error =
|
819
|
+
if ((error = git_fs_path_prettify_dir(&path, bare_path, NULL)) < 0 ||
|
627
820
|
(error = is_valid_repository_path(&is_valid, &path, &common_path)) < 0)
|
628
821
|
return error;
|
629
822
|
|
630
823
|
if (!is_valid) {
|
631
|
-
|
632
|
-
|
824
|
+
git_str_dispose(&path);
|
825
|
+
git_str_dispose(&common_path);
|
633
826
|
git_error_set(GIT_ERROR_REPOSITORY, "path is not a repository: %s", bare_path);
|
634
827
|
return GIT_ENOTFOUND;
|
635
828
|
}
|
@@ -637,9 +830,9 @@ int git_repository_open_bare(
|
|
637
830
|
repo = repository_alloc();
|
638
831
|
GIT_ERROR_CHECK_ALLOC(repo);
|
639
832
|
|
640
|
-
repo->gitdir =
|
833
|
+
repo->gitdir = git_str_detach(&path);
|
641
834
|
GIT_ERROR_CHECK_ALLOC(repo->gitdir);
|
642
|
-
repo->commondir =
|
835
|
+
repo->commondir = git_str_detach(&common_path);
|
643
836
|
GIT_ERROR_CHECK_ALLOC(repo->commondir);
|
644
837
|
|
645
838
|
/* of course we're bare! */
|
@@ -647,8 +840,15 @@ int git_repository_open_bare(
|
|
647
840
|
repo->is_worktree = 0;
|
648
841
|
repo->workdir = NULL;
|
649
842
|
|
843
|
+
if ((error = obtain_config_and_set_oid_type(&config, repo)) < 0)
|
844
|
+
goto cleanup;
|
845
|
+
|
650
846
|
*repo_ptr = repo;
|
651
|
-
|
847
|
+
|
848
|
+
cleanup:
|
849
|
+
git_config_free(config);
|
850
|
+
|
851
|
+
return error;
|
652
852
|
}
|
653
853
|
|
654
854
|
static int _git_repository_open_ext_from_env(
|
@@ -658,15 +858,15 @@ static int _git_repository_open_ext_from_env(
|
|
658
858
|
git_repository *repo = NULL;
|
659
859
|
git_index *index = NULL;
|
660
860
|
git_odb *odb = NULL;
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
861
|
+
git_str dir_buf = GIT_STR_INIT;
|
862
|
+
git_str ceiling_dirs_buf = GIT_STR_INIT;
|
863
|
+
git_str across_fs_buf = GIT_STR_INIT;
|
864
|
+
git_str index_file_buf = GIT_STR_INIT;
|
865
|
+
git_str namespace_buf = GIT_STR_INIT;
|
866
|
+
git_str object_dir_buf = GIT_STR_INIT;
|
867
|
+
git_str alts_buf = GIT_STR_INIT;
|
868
|
+
git_str work_tree_buf = GIT_STR_INIT;
|
869
|
+
git_str common_dir_buf = GIT_STR_INIT;
|
670
870
|
const char *ceiling_dirs = NULL;
|
671
871
|
unsigned flags = 0;
|
672
872
|
int error;
|
@@ -679,7 +879,7 @@ static int _git_repository_open_ext_from_env(
|
|
679
879
|
} else if (error < 0)
|
680
880
|
goto error;
|
681
881
|
else {
|
682
|
-
start_path =
|
882
|
+
start_path = git_str_cstr(&dir_buf);
|
683
883
|
flags |= GIT_REPOSITORY_OPEN_NO_SEARCH;
|
684
884
|
flags |= GIT_REPOSITORY_OPEN_NO_DOTGIT;
|
685
885
|
}
|
@@ -691,7 +891,7 @@ static int _git_repository_open_ext_from_env(
|
|
691
891
|
else if (error < 0)
|
692
892
|
goto error;
|
693
893
|
else
|
694
|
-
ceiling_dirs =
|
894
|
+
ceiling_dirs = git_str_cstr(&ceiling_dirs_buf);
|
695
895
|
|
696
896
|
error = git__getenv(&across_fs_buf, "GIT_DISCOVERY_ACROSS_FILESYSTEM");
|
697
897
|
if (error == GIT_ENOTFOUND)
|
@@ -700,7 +900,7 @@ static int _git_repository_open_ext_from_env(
|
|
700
900
|
goto error;
|
701
901
|
else {
|
702
902
|
int across_fs = 0;
|
703
|
-
error = git_config_parse_bool(&across_fs,
|
903
|
+
error = git_config_parse_bool(&across_fs, git_str_cstr(&across_fs_buf));
|
704
904
|
if (error < 0)
|
705
905
|
goto error;
|
706
906
|
if (across_fs)
|
@@ -713,7 +913,7 @@ static int _git_repository_open_ext_from_env(
|
|
713
913
|
else if (error < 0)
|
714
914
|
goto error;
|
715
915
|
else {
|
716
|
-
error = git_index_open(&index,
|
916
|
+
error = git_index_open(&index, git_str_cstr(&index_file_buf));
|
717
917
|
if (error < 0)
|
718
918
|
goto error;
|
719
919
|
}
|
@@ -730,7 +930,7 @@ static int _git_repository_open_ext_from_env(
|
|
730
930
|
else if (error < 0)
|
731
931
|
goto error;
|
732
932
|
else {
|
733
|
-
error =
|
933
|
+
error = git_odb__open(&odb, git_str_cstr(&object_dir_buf), NULL);
|
734
934
|
if (error < 0)
|
735
935
|
goto error;
|
736
936
|
}
|
@@ -779,7 +979,7 @@ static int _git_repository_open_ext_from_env(
|
|
779
979
|
goto error;
|
780
980
|
}
|
781
981
|
|
782
|
-
end =
|
982
|
+
end = git_str_cstr(&alts_buf) + git_str_len(&alts_buf);
|
783
983
|
for (sep = alt = alts_buf.ptr; sep != end; alt = sep+1) {
|
784
984
|
for (sep = alt; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++)
|
785
985
|
;
|
@@ -791,8 +991,8 @@ static int _git_repository_open_ext_from_env(
|
|
791
991
|
}
|
792
992
|
}
|
793
993
|
|
794
|
-
if (
|
795
|
-
error = git_repository_set_namespace(repo,
|
994
|
+
if (git_str_len(&namespace_buf)) {
|
995
|
+
error = git_repository_set_namespace(repo, git_str_cstr(&namespace_buf));
|
796
996
|
if (error < 0)
|
797
997
|
goto error;
|
798
998
|
}
|
@@ -808,21 +1008,21 @@ error:
|
|
808
1008
|
success:
|
809
1009
|
git_odb_free(odb);
|
810
1010
|
git_index_free(index);
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
1011
|
+
git_str_dispose(&common_dir_buf);
|
1012
|
+
git_str_dispose(&work_tree_buf);
|
1013
|
+
git_str_dispose(&alts_buf);
|
1014
|
+
git_str_dispose(&object_dir_buf);
|
1015
|
+
git_str_dispose(&namespace_buf);
|
1016
|
+
git_str_dispose(&index_file_buf);
|
1017
|
+
git_str_dispose(&across_fs_buf);
|
1018
|
+
git_str_dispose(&ceiling_dirs_buf);
|
1019
|
+
git_str_dispose(&dir_buf);
|
820
1020
|
return error;
|
821
1021
|
}
|
822
1022
|
|
823
1023
|
static int repo_is_worktree(unsigned *out, const git_repository *repo)
|
824
1024
|
{
|
825
|
-
|
1025
|
+
git_str gitdir_link = GIT_STR_INIT;
|
826
1026
|
int error;
|
827
1027
|
|
828
1028
|
/* Worktrees cannot have the same commondir and gitdir */
|
@@ -832,14 +1032,14 @@ static int repo_is_worktree(unsigned *out, const git_repository *repo)
|
|
832
1032
|
return 0;
|
833
1033
|
}
|
834
1034
|
|
835
|
-
if ((error =
|
1035
|
+
if ((error = git_str_joinpath(&gitdir_link, repo->gitdir, "gitdir")) < 0)
|
836
1036
|
return -1;
|
837
1037
|
|
838
1038
|
/* A 'gitdir' file inside a git directory is currently
|
839
1039
|
* only used when the repository is a working tree. */
|
840
|
-
*out = !!
|
1040
|
+
*out = !!git_fs_path_exists(gitdir_link.ptr);
|
841
1041
|
|
842
|
-
|
1042
|
+
git_str_dispose(&gitdir_link);
|
843
1043
|
return error;
|
844
1044
|
}
|
845
1045
|
|
@@ -851,11 +1051,10 @@ int git_repository_open_ext(
|
|
851
1051
|
{
|
852
1052
|
int error;
|
853
1053
|
unsigned is_worktree;
|
854
|
-
|
855
|
-
gitlink =
|
1054
|
+
git_str gitdir = GIT_STR_INIT, workdir = GIT_STR_INIT,
|
1055
|
+
gitlink = GIT_STR_INIT, commondir = GIT_STR_INIT;
|
856
1056
|
git_repository *repo = NULL;
|
857
1057
|
git_config *config = NULL;
|
858
|
-
int version = 0;
|
859
1058
|
|
860
1059
|
if (flags & GIT_REPOSITORY_OPEN_FROM_ENV)
|
861
1060
|
return _git_repository_open_ext_from_env(repo_ptr, start_path);
|
@@ -872,15 +1071,15 @@ int git_repository_open_ext(
|
|
872
1071
|
repo = repository_alloc();
|
873
1072
|
GIT_ERROR_CHECK_ALLOC(repo);
|
874
1073
|
|
875
|
-
repo->gitdir =
|
1074
|
+
repo->gitdir = git_str_detach(&gitdir);
|
876
1075
|
GIT_ERROR_CHECK_ALLOC(repo->gitdir);
|
877
1076
|
|
878
1077
|
if (gitlink.size) {
|
879
|
-
repo->gitlink =
|
1078
|
+
repo->gitlink = git_str_detach(&gitlink);
|
880
1079
|
GIT_ERROR_CHECK_ALLOC(repo->gitlink);
|
881
1080
|
}
|
882
1081
|
if (commondir.size) {
|
883
|
-
repo->commondir =
|
1082
|
+
repo->commondir = git_str_detach(&commondir);
|
884
1083
|
GIT_ERROR_CHECK_ALLOC(repo->commondir);
|
885
1084
|
}
|
886
1085
|
|
@@ -888,36 +1087,32 @@ int git_repository_open_ext(
|
|
888
1087
|
goto cleanup;
|
889
1088
|
repo->is_worktree = is_worktree;
|
890
1089
|
|
891
|
-
|
892
|
-
|
893
|
-
* care if it's not there, so we need to deal with that.
|
894
|
-
*/
|
895
|
-
|
896
|
-
error = git_repository_config_snapshot(&config, repo);
|
897
|
-
if (error < 0 && error != GIT_ENOTFOUND)
|
898
|
-
goto cleanup;
|
899
|
-
|
900
|
-
if (config && (error = check_repositoryformatversion(&version, config)) < 0)
|
901
|
-
goto cleanup;
|
902
|
-
|
903
|
-
if ((error = check_extensions(config, version)) < 0)
|
1090
|
+
error = obtain_config_and_set_oid_type(&config, repo);
|
1091
|
+
if (error < 0)
|
904
1092
|
goto cleanup;
|
905
1093
|
|
906
|
-
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0)
|
1094
|
+
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0) {
|
907
1095
|
repo->is_bare = 1;
|
908
|
-
else {
|
909
|
-
|
1096
|
+
} else {
|
910
1097
|
if (config &&
|
911
1098
|
((error = load_config_data(repo, config)) < 0 ||
|
912
1099
|
(error = load_workdir(repo, config, &workdir)) < 0))
|
913
1100
|
goto cleanup;
|
914
1101
|
}
|
915
1102
|
|
1103
|
+
/*
|
1104
|
+
* Ensure that the git directory and worktree are
|
1105
|
+
* owned by the current user.
|
1106
|
+
*/
|
1107
|
+
if (git_repository__validate_ownership &&
|
1108
|
+
(error = validate_ownership(repo)) < 0)
|
1109
|
+
goto cleanup;
|
1110
|
+
|
916
1111
|
cleanup:
|
917
|
-
|
918
|
-
|
919
|
-
|
920
|
-
|
1112
|
+
git_str_dispose(&gitdir);
|
1113
|
+
git_str_dispose(&workdir);
|
1114
|
+
git_str_dispose(&gitlink);
|
1115
|
+
git_str_dispose(&commondir);
|
921
1116
|
git_config_free(config);
|
922
1117
|
|
923
1118
|
if (error < 0)
|
@@ -936,7 +1131,7 @@ int git_repository_open(git_repository **repo_out, const char *path)
|
|
936
1131
|
|
937
1132
|
int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *wt)
|
938
1133
|
{
|
939
|
-
|
1134
|
+
git_str path = GIT_STR_INIT;
|
940
1135
|
git_repository *repo = NULL;
|
941
1136
|
size_t len;
|
942
1137
|
int err;
|
@@ -952,7 +1147,7 @@ int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *w
|
|
952
1147
|
goto out;
|
953
1148
|
}
|
954
1149
|
|
955
|
-
if ((err =
|
1150
|
+
if ((err = git_str_set(&path, wt->gitlink_path, len - 4)) < 0)
|
956
1151
|
goto out;
|
957
1152
|
|
958
1153
|
if ((err = git_repository_open(&repo, path.ptr)) < 0)
|
@@ -961,7 +1156,7 @@ int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *w
|
|
961
1156
|
*repo_out = repo;
|
962
1157
|
|
963
1158
|
out:
|
964
|
-
|
1159
|
+
git_str_dispose(&path);
|
965
1160
|
|
966
1161
|
return err;
|
967
1162
|
}
|
@@ -986,14 +1181,10 @@ int git_repository_discover(
|
|
986
1181
|
const char *ceiling_dirs)
|
987
1182
|
{
|
988
1183
|
uint32_t flags = across_fs ? GIT_REPOSITORY_OPEN_CROSS_FS : 0;
|
989
|
-
int error;
|
990
1184
|
|
991
1185
|
GIT_ASSERT_ARG(start_path);
|
992
1186
|
|
993
|
-
|
994
|
-
return error;
|
995
|
-
|
996
|
-
return find_repo(out, NULL, NULL, NULL, start_path, flags, ceiling_dirs);
|
1187
|
+
GIT_BUF_WRAP_PRIVATE(out, find_repo, NULL, NULL, NULL, start_path, flags, ceiling_dirs);
|
997
1188
|
}
|
998
1189
|
|
999
1190
|
static int load_config(
|
@@ -1005,7 +1196,7 @@ static int load_config(
|
|
1005
1196
|
const char *programdata_path)
|
1006
1197
|
{
|
1007
1198
|
int error;
|
1008
|
-
|
1199
|
+
git_str config_path = GIT_STR_INIT;
|
1009
1200
|
git_config *cfg = NULL;
|
1010
1201
|
|
1011
1202
|
GIT_ASSERT_ARG(out);
|
@@ -1014,13 +1205,13 @@ static int load_config(
|
|
1014
1205
|
return error;
|
1015
1206
|
|
1016
1207
|
if (repo) {
|
1017
|
-
if ((error =
|
1208
|
+
if ((error = git_repository__item_path(&config_path, repo, GIT_REPOSITORY_ITEM_CONFIG)) == 0)
|
1018
1209
|
error = git_config_add_file_ondisk(cfg, config_path.ptr, GIT_CONFIG_LEVEL_LOCAL, repo, 0);
|
1019
1210
|
|
1020
1211
|
if (error && error != GIT_ENOTFOUND)
|
1021
1212
|
goto on_error;
|
1022
1213
|
|
1023
|
-
|
1214
|
+
git_str_dispose(&config_path);
|
1024
1215
|
}
|
1025
1216
|
|
1026
1217
|
if (global_config_path != NULL &&
|
@@ -1053,15 +1244,15 @@ static int load_config(
|
|
1053
1244
|
return 0;
|
1054
1245
|
|
1055
1246
|
on_error:
|
1056
|
-
|
1247
|
+
git_str_dispose(&config_path);
|
1057
1248
|
git_config_free(cfg);
|
1058
1249
|
*out = NULL;
|
1059
1250
|
return error;
|
1060
1251
|
}
|
1061
1252
|
|
1062
|
-
static const char *path_unless_empty(
|
1253
|
+
static const char *path_unless_empty(git_str *buf)
|
1063
1254
|
{
|
1064
|
-
return
|
1255
|
+
return git_str_len(buf) > 0 ? git_str_cstr(buf) : NULL;
|
1065
1256
|
}
|
1066
1257
|
|
1067
1258
|
int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
@@ -1069,19 +1260,19 @@ int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
|
1069
1260
|
int error = 0;
|
1070
1261
|
|
1071
1262
|
if (repo->_config == NULL) {
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1263
|
+
git_str global_buf = GIT_STR_INIT;
|
1264
|
+
git_str xdg_buf = GIT_STR_INIT;
|
1265
|
+
git_str system_buf = GIT_STR_INIT;
|
1266
|
+
git_str programdata_buf = GIT_STR_INIT;
|
1076
1267
|
git_config *config;
|
1077
1268
|
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1269
|
+
git_config__find_global(&global_buf);
|
1270
|
+
git_config__find_xdg(&xdg_buf);
|
1271
|
+
git_config__find_system(&system_buf);
|
1272
|
+
git_config__find_programdata(&programdata_buf);
|
1082
1273
|
|
1083
1274
|
/* If there is no global file, open a backend for it anyway */
|
1084
|
-
if (
|
1275
|
+
if (git_str_len(&global_buf) == 0)
|
1085
1276
|
git_config__global_location(&global_buf);
|
1086
1277
|
|
1087
1278
|
error = load_config(
|
@@ -1099,10 +1290,10 @@ int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
|
1099
1290
|
}
|
1100
1291
|
}
|
1101
1292
|
|
1102
|
-
|
1103
|
-
|
1104
|
-
|
1105
|
-
|
1293
|
+
git_str_dispose(&global_buf);
|
1294
|
+
git_str_dispose(&xdg_buf);
|
1295
|
+
git_str_dispose(&system_buf);
|
1296
|
+
git_str_dispose(&programdata_buf);
|
1106
1297
|
}
|
1107
1298
|
|
1108
1299
|
*out = repo->_config;
|
@@ -1147,12 +1338,15 @@ int git_repository_odb__weakptr(git_odb **out, git_repository *repo)
|
|
1147
1338
|
|
1148
1339
|
*out = git_atomic_load(repo->_odb);
|
1149
1340
|
if (*out == NULL) {
|
1150
|
-
|
1341
|
+
git_str odb_path = GIT_STR_INIT;
|
1342
|
+
git_odb_options odb_opts = GIT_ODB_OPTIONS_INIT;
|
1151
1343
|
git_odb *odb;
|
1152
1344
|
|
1153
|
-
|
1345
|
+
odb_opts.oid_type = repo->oid_type;
|
1346
|
+
|
1347
|
+
if ((error = git_repository__item_path(&odb_path, repo,
|
1154
1348
|
GIT_REPOSITORY_ITEM_OBJECTS)) < 0 ||
|
1155
|
-
(error =
|
1349
|
+
(error = git_odb__new(&odb, &odb_opts)) < 0)
|
1156
1350
|
return error;
|
1157
1351
|
|
1158
1352
|
GIT_REFCOUNT_OWN(odb, repo);
|
@@ -1168,7 +1362,7 @@ int git_repository_odb__weakptr(git_odb **out, git_repository *repo)
|
|
1168
1362
|
git_odb_free(odb);
|
1169
1363
|
}
|
1170
1364
|
|
1171
|
-
|
1365
|
+
git_str_dispose(&odb_path);
|
1172
1366
|
*out = git_atomic_load(repo->_odb);
|
1173
1367
|
}
|
1174
1368
|
|
@@ -1244,10 +1438,10 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
|
1244
1438
|
GIT_ASSERT_ARG(repo);
|
1245
1439
|
|
1246
1440
|
if (repo->_index == NULL) {
|
1247
|
-
|
1441
|
+
git_str index_path = GIT_STR_INIT;
|
1248
1442
|
git_index *index;
|
1249
1443
|
|
1250
|
-
if ((error =
|
1444
|
+
if ((error = git_str_joinpath(&index_path, repo->gitdir, GIT_INDEX_FILE)) < 0)
|
1251
1445
|
return error;
|
1252
1446
|
|
1253
1447
|
error = git_index_open(&index, index_path.ptr);
|
@@ -1263,7 +1457,7 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
|
1263
1457
|
GIT_INDEX_CAPABILITY_FROM_OWNER);
|
1264
1458
|
}
|
1265
1459
|
|
1266
|
-
|
1460
|
+
git_str_dispose(&index_path);
|
1267
1461
|
}
|
1268
1462
|
|
1269
1463
|
*out = repo->_index;
|
@@ -1311,7 +1505,7 @@ static int reserved_names_add8dot3(git_repository *repo, const char *path)
|
|
1311
1505
|
const char *def_dot_git = DOT_GIT;
|
1312
1506
|
size_t name_len, def_len = CONST_STRLEN(GIT_DIR_SHORTNAME);
|
1313
1507
|
size_t def_dot_git_len = CONST_STRLEN(DOT_GIT);
|
1314
|
-
|
1508
|
+
git_str *buf;
|
1315
1509
|
|
1316
1510
|
if (!name)
|
1317
1511
|
return 0;
|
@@ -1327,17 +1521,17 @@ static int reserved_names_add8dot3(git_repository *repo, const char *path)
|
|
1327
1521
|
if ((buf = git_array_alloc(repo->reserved_names)) == NULL)
|
1328
1522
|
return -1;
|
1329
1523
|
|
1330
|
-
|
1524
|
+
git_str_attach(buf, name, name_len);
|
1331
1525
|
return true;
|
1332
1526
|
}
|
1333
1527
|
|
1334
1528
|
bool git_repository__reserved_names(
|
1335
|
-
|
1529
|
+
git_str **out, size_t *outlen, git_repository *repo, bool include_ntfs)
|
1336
1530
|
{
|
1337
1531
|
GIT_UNUSED(include_ntfs);
|
1338
1532
|
|
1339
1533
|
if (repo->reserved_names.size == 0) {
|
1340
|
-
|
1534
|
+
git_str *buf;
|
1341
1535
|
size_t i;
|
1342
1536
|
|
1343
1537
|
/* Add the static defaults */
|
@@ -1389,7 +1583,7 @@ on_error:
|
|
1389
1583
|
}
|
1390
1584
|
#else
|
1391
1585
|
bool git_repository__reserved_names(
|
1392
|
-
|
1586
|
+
git_str **out, size_t *outlen, git_repository *repo, bool include_ntfs)
|
1393
1587
|
{
|
1394
1588
|
GIT_UNUSED(repo);
|
1395
1589
|
|
@@ -1410,6 +1604,7 @@ static int check_repositoryformatversion(int *version, git_config *config)
|
|
1410
1604
|
int error;
|
1411
1605
|
|
1412
1606
|
error = git_config_get_int32(version, config, "core.repositoryformatversion");
|
1607
|
+
|
1413
1608
|
/* git ignores this if the config variable isn't there */
|
1414
1609
|
if (error == GIT_ENOTFOUND)
|
1415
1610
|
return 0;
|
@@ -1417,10 +1612,15 @@ static int check_repositoryformatversion(int *version, git_config *config)
|
|
1417
1612
|
if (error < 0)
|
1418
1613
|
return -1;
|
1419
1614
|
|
1420
|
-
if (
|
1615
|
+
if (*version < 0) {
|
1616
|
+
git_error_set(GIT_ERROR_REPOSITORY,
|
1617
|
+
"invalid repository version %d", *version);
|
1618
|
+
}
|
1619
|
+
|
1620
|
+
if (GIT_REPO_VERSION_MAX < *version) {
|
1421
1621
|
git_error_set(GIT_ERROR_REPOSITORY,
|
1422
1622
|
"unsupported repository version %d; only versions up to %d are supported",
|
1423
|
-
*version,
|
1623
|
+
*version, GIT_REPO_VERSION_MAX);
|
1424
1624
|
return -1;
|
1425
1625
|
}
|
1426
1626
|
|
@@ -1428,14 +1628,15 @@ static int check_repositoryformatversion(int *version, git_config *config)
|
|
1428
1628
|
}
|
1429
1629
|
|
1430
1630
|
static const char *builtin_extensions[] = {
|
1431
|
-
"noop"
|
1631
|
+
"noop",
|
1632
|
+
"objectformat"
|
1432
1633
|
};
|
1433
1634
|
|
1434
1635
|
static git_vector user_extensions = GIT_VECTOR_INIT;
|
1435
1636
|
|
1436
1637
|
static int check_valid_extension(const git_config_entry *entry, void *payload)
|
1437
1638
|
{
|
1438
|
-
|
1639
|
+
git_str cfg = GIT_STR_INIT;
|
1439
1640
|
bool reject;
|
1440
1641
|
const char *extension;
|
1441
1642
|
size_t i;
|
@@ -1444,7 +1645,7 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
1444
1645
|
GIT_UNUSED(payload);
|
1445
1646
|
|
1446
1647
|
git_vector_foreach (&user_extensions, i, extension) {
|
1447
|
-
|
1648
|
+
git_str_clear(&cfg);
|
1448
1649
|
|
1449
1650
|
/*
|
1450
1651
|
* Users can specify that they don't want to support an
|
@@ -1453,7 +1654,7 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
1453
1654
|
if ((reject = (extension[0] == '!')) == true)
|
1454
1655
|
extension = &extension[1];
|
1455
1656
|
|
1456
|
-
if ((error =
|
1657
|
+
if ((error = git_str_printf(&cfg, "extensions.%s", extension)) < 0)
|
1457
1658
|
goto done;
|
1458
1659
|
|
1459
1660
|
if (strcmp(entry->name, cfg.ptr) == 0) {
|
@@ -1465,9 +1666,10 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
1465
1666
|
}
|
1466
1667
|
|
1467
1668
|
for (i = 0; i < ARRAY_SIZE(builtin_extensions); i++) {
|
1669
|
+
git_str_clear(&cfg);
|
1468
1670
|
extension = builtin_extensions[i];
|
1469
1671
|
|
1470
|
-
if ((error =
|
1672
|
+
if ((error = git_str_printf(&cfg, "extensions.%s", extension)) < 0)
|
1471
1673
|
goto done;
|
1472
1674
|
|
1473
1675
|
if (strcmp(entry->name, cfg.ptr) == 0)
|
@@ -1479,7 +1681,7 @@ fail:
|
|
1479
1681
|
error = -1;
|
1480
1682
|
|
1481
1683
|
done:
|
1482
|
-
|
1684
|
+
git_str_dispose(&cfg);
|
1483
1685
|
return error;
|
1484
1686
|
}
|
1485
1687
|
|
@@ -1491,6 +1693,79 @@ static int check_extensions(git_config *config, int version)
|
|
1491
1693
|
return git_config_foreach_match(config, "^extensions\\.", check_valid_extension, NULL);
|
1492
1694
|
}
|
1493
1695
|
|
1696
|
+
static int load_objectformat(git_repository *repo, git_config *config)
|
1697
|
+
{
|
1698
|
+
git_config_entry *entry = NULL;
|
1699
|
+
int error;
|
1700
|
+
|
1701
|
+
if ((error = git_config_get_entry(&entry, config, "extensions.objectformat")) < 0) {
|
1702
|
+
if (error == GIT_ENOTFOUND) {
|
1703
|
+
repo->oid_type = GIT_OID_SHA1;
|
1704
|
+
git_error_clear();
|
1705
|
+
error = 0;
|
1706
|
+
}
|
1707
|
+
|
1708
|
+
goto done;
|
1709
|
+
}
|
1710
|
+
|
1711
|
+
if ((repo->oid_type = git_oid_type_fromstr(entry->value)) == 0) {
|
1712
|
+
git_error_set(GIT_ERROR_REPOSITORY,
|
1713
|
+
"unknown object format '%s'", entry->value);
|
1714
|
+
error = GIT_EINVALID;
|
1715
|
+
}
|
1716
|
+
|
1717
|
+
done:
|
1718
|
+
git_config_entry_free(entry);
|
1719
|
+
return error;
|
1720
|
+
}
|
1721
|
+
|
1722
|
+
int git_repository__set_objectformat(
|
1723
|
+
git_repository *repo,
|
1724
|
+
git_oid_t oid_type)
|
1725
|
+
{
|
1726
|
+
git_config *cfg;
|
1727
|
+
|
1728
|
+
/*
|
1729
|
+
* Older clients do not necessarily understand the
|
1730
|
+
* `objectformat` extension, even when it's set to an
|
1731
|
+
* object format that they understand (SHA1). Do not set
|
1732
|
+
* the objectformat extension unless we're not using the
|
1733
|
+
* default object format.
|
1734
|
+
*/
|
1735
|
+
if (oid_type == GIT_OID_DEFAULT)
|
1736
|
+
return 0;
|
1737
|
+
|
1738
|
+
if (!git_repository_is_empty(repo) && repo->oid_type != oid_type) {
|
1739
|
+
git_error_set(GIT_ERROR_REPOSITORY,
|
1740
|
+
"cannot change object id type of existing repository");
|
1741
|
+
return -1;
|
1742
|
+
}
|
1743
|
+
|
1744
|
+
if (git_repository_config__weakptr(&cfg, repo) < 0)
|
1745
|
+
return -1;
|
1746
|
+
|
1747
|
+
if (git_config_set_int32(cfg,
|
1748
|
+
"core.repositoryformatversion", 1) < 0 ||
|
1749
|
+
git_config_set_string(cfg, "extensions.objectformat",
|
1750
|
+
git_oid_type_name(oid_type)) < 0)
|
1751
|
+
return -1;
|
1752
|
+
|
1753
|
+
/*
|
1754
|
+
* During repo init, we may create some backends with the
|
1755
|
+
* default oid type. Clear them so that we create them with
|
1756
|
+
* the proper oid type.
|
1757
|
+
*/
|
1758
|
+
if (repo->oid_type != oid_type) {
|
1759
|
+
set_index(repo, NULL);
|
1760
|
+
set_odb(repo, NULL);
|
1761
|
+
set_refdb(repo, NULL);
|
1762
|
+
|
1763
|
+
repo->oid_type = oid_type;
|
1764
|
+
}
|
1765
|
+
|
1766
|
+
return 0;
|
1767
|
+
}
|
1768
|
+
|
1494
1769
|
int git_repository__extensions(char ***out, size_t *out_len)
|
1495
1770
|
{
|
1496
1771
|
git_vector extensions;
|
@@ -1557,12 +1832,12 @@ void git_repository__free_extensions(void)
|
|
1557
1832
|
|
1558
1833
|
int git_repository_create_head(const char *git_dir, const char *ref_name)
|
1559
1834
|
{
|
1560
|
-
|
1835
|
+
git_str ref_path = GIT_STR_INIT;
|
1561
1836
|
git_filebuf ref = GIT_FILEBUF_INIT;
|
1562
1837
|
const char *fmt;
|
1563
1838
|
int error;
|
1564
1839
|
|
1565
|
-
if ((error =
|
1840
|
+
if ((error = git_str_joinpath(&ref_path, git_dir, GIT_HEAD_FILE)) < 0 ||
|
1566
1841
|
(error = git_filebuf_open(&ref, ref_path.ptr, 0, GIT_REFS_FILE_MODE)) < 0)
|
1567
1842
|
goto out;
|
1568
1843
|
|
@@ -1576,7 +1851,7 @@ int git_repository_create_head(const char *git_dir, const char *ref_name)
|
|
1576
1851
|
goto out;
|
1577
1852
|
|
1578
1853
|
out:
|
1579
|
-
|
1854
|
+
git_str_dispose(&ref_path);
|
1580
1855
|
git_filebuf_cleanup(&ref);
|
1581
1856
|
return error;
|
1582
1857
|
}
|
@@ -1599,23 +1874,50 @@ static bool is_chmod_supported(const char *file_path)
|
|
1599
1874
|
|
1600
1875
|
static bool is_filesystem_case_insensitive(const char *gitdir_path)
|
1601
1876
|
{
|
1602
|
-
|
1877
|
+
git_str path = GIT_STR_INIT;
|
1603
1878
|
int is_insensitive = -1;
|
1604
1879
|
|
1605
|
-
if (!
|
1606
|
-
is_insensitive =
|
1880
|
+
if (!git_str_joinpath(&path, gitdir_path, "CoNfIg"))
|
1881
|
+
is_insensitive = git_fs_path_exists(git_str_cstr(&path));
|
1607
1882
|
|
1608
|
-
|
1883
|
+
git_str_dispose(&path);
|
1609
1884
|
return is_insensitive;
|
1610
1885
|
}
|
1611
1886
|
|
1887
|
+
/*
|
1888
|
+
* Return a configuration object with only the global and system
|
1889
|
+
* configurations; no repository-level configuration.
|
1890
|
+
*/
|
1891
|
+
static int load_global_config(git_config **config)
|
1892
|
+
{
|
1893
|
+
git_str global_buf = GIT_STR_INIT;
|
1894
|
+
git_str xdg_buf = GIT_STR_INIT;
|
1895
|
+
git_str system_buf = GIT_STR_INIT;
|
1896
|
+
git_str programdata_buf = GIT_STR_INIT;
|
1897
|
+
int error;
|
1898
|
+
|
1899
|
+
git_config__find_global(&global_buf);
|
1900
|
+
git_config__find_xdg(&xdg_buf);
|
1901
|
+
git_config__find_system(&system_buf);
|
1902
|
+
git_config__find_programdata(&programdata_buf);
|
1903
|
+
|
1904
|
+
error = load_config(config, NULL,
|
1905
|
+
path_unless_empty(&global_buf),
|
1906
|
+
path_unless_empty(&xdg_buf),
|
1907
|
+
path_unless_empty(&system_buf),
|
1908
|
+
path_unless_empty(&programdata_buf));
|
1909
|
+
|
1910
|
+
git_str_dispose(&global_buf);
|
1911
|
+
git_str_dispose(&xdg_buf);
|
1912
|
+
git_str_dispose(&system_buf);
|
1913
|
+
git_str_dispose(&programdata_buf);
|
1914
|
+
|
1915
|
+
return error;
|
1916
|
+
}
|
1917
|
+
|
1612
1918
|
static bool are_symlinks_supported(const char *wd_path)
|
1613
1919
|
{
|
1614
1920
|
git_config *config = NULL;
|
1615
|
-
git_buf global_buf = GIT_BUF_INIT;
|
1616
|
-
git_buf xdg_buf = GIT_BUF_INIT;
|
1617
|
-
git_buf system_buf = GIT_BUF_INIT;
|
1618
|
-
git_buf programdata_buf = GIT_BUF_INIT;
|
1619
1921
|
int symlinks = 0;
|
1620
1922
|
|
1621
1923
|
/*
|
@@ -1626,30 +1928,16 @@ static bool are_symlinks_supported(const char *wd_path)
|
|
1626
1928
|
* _not_ set, then we do not test or enable symlink support.
|
1627
1929
|
*/
|
1628
1930
|
#ifdef GIT_WIN32
|
1629
|
-
|
1630
|
-
|
1631
|
-
|
1632
|
-
git_config_find_programdata(&programdata_buf);
|
1633
|
-
|
1634
|
-
if (load_config(&config, NULL,
|
1635
|
-
path_unless_empty(&global_buf),
|
1636
|
-
path_unless_empty(&xdg_buf),
|
1637
|
-
path_unless_empty(&system_buf),
|
1638
|
-
path_unless_empty(&programdata_buf)) < 0)
|
1639
|
-
goto done;
|
1640
|
-
|
1641
|
-
if (git_config_get_bool(&symlinks, config, "core.symlinks") < 0 || !symlinks)
|
1931
|
+
if (load_global_config(&config) < 0 ||
|
1932
|
+
git_config_get_bool(&symlinks, config, "core.symlinks") < 0 ||
|
1933
|
+
!symlinks)
|
1642
1934
|
goto done;
|
1643
1935
|
#endif
|
1644
1936
|
|
1645
|
-
if (!(symlinks =
|
1937
|
+
if (!(symlinks = git_fs_path_supports_symlinks(wd_path)))
|
1646
1938
|
goto done;
|
1647
1939
|
|
1648
1940
|
done:
|
1649
|
-
git_buf_dispose(&global_buf);
|
1650
|
-
git_buf_dispose(&xdg_buf);
|
1651
|
-
git_buf_dispose(&system_buf);
|
1652
|
-
git_buf_dispose(&programdata_buf);
|
1653
1941
|
git_config_free(config);
|
1654
1942
|
return symlinks != 0;
|
1655
1943
|
}
|
@@ -1673,7 +1961,7 @@ static int create_empty_file(const char *path, mode_t mode)
|
|
1673
1961
|
|
1674
1962
|
static int repo_local_config(
|
1675
1963
|
git_config **out,
|
1676
|
-
|
1964
|
+
git_str *config_dir,
|
1677
1965
|
git_repository *repo,
|
1678
1966
|
const char *repo_dir)
|
1679
1967
|
{
|
@@ -1681,12 +1969,12 @@ static int repo_local_config(
|
|
1681
1969
|
git_config *parent;
|
1682
1970
|
const char *cfg_path;
|
1683
1971
|
|
1684
|
-
if (
|
1972
|
+
if (git_str_joinpath(config_dir, repo_dir, GIT_CONFIG_FILENAME_INREPO) < 0)
|
1685
1973
|
return -1;
|
1686
|
-
cfg_path =
|
1974
|
+
cfg_path = git_str_cstr(config_dir);
|
1687
1975
|
|
1688
1976
|
/* make LOCAL config if missing */
|
1689
|
-
if (!
|
1977
|
+
if (!git_fs_path_isfile(cfg_path) &&
|
1690
1978
|
(error = create_empty_file(cfg_path, GIT_CONFIG_FILE_MODE)) < 0)
|
1691
1979
|
return error;
|
1692
1980
|
|
@@ -1744,7 +2032,7 @@ static int repo_init_fs_configs(
|
|
1744
2032
|
#ifdef GIT_USE_ICONV
|
1745
2033
|
if ((error = git_config_set_bool(
|
1746
2034
|
cfg, "core.precomposeunicode",
|
1747
|
-
|
2035
|
+
git_fs_path_does_decompose_unicode(work_dir))) < 0)
|
1748
2036
|
return error;
|
1749
2037
|
/* on non-iconv platforms, don't even set core.precomposeunicode */
|
1750
2038
|
#endif
|
@@ -1756,19 +2044,21 @@ static int repo_init_config(
|
|
1756
2044
|
const char *repo_dir,
|
1757
2045
|
const char *work_dir,
|
1758
2046
|
uint32_t flags,
|
1759
|
-
uint32_t mode
|
2047
|
+
uint32_t mode,
|
2048
|
+
git_oid_t oid_type)
|
1760
2049
|
{
|
1761
2050
|
int error = 0;
|
1762
|
-
|
2051
|
+
git_str cfg_path = GIT_STR_INIT, worktree_path = GIT_STR_INIT;
|
1763
2052
|
git_config *config = NULL;
|
1764
2053
|
bool is_bare = ((flags & GIT_REPOSITORY_INIT_BARE) != 0);
|
1765
2054
|
bool is_reinit = ((flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0);
|
1766
|
-
int version =
|
2055
|
+
int version = GIT_REPO_VERSION_DEFAULT;
|
1767
2056
|
|
1768
2057
|
if ((error = repo_local_config(&config, &cfg_path, NULL, repo_dir)) < 0)
|
1769
2058
|
goto cleanup;
|
1770
2059
|
|
1771
|
-
if (is_reinit &&
|
2060
|
+
if (is_reinit &&
|
2061
|
+
(error = check_repositoryformatversion(&version, config)) < 0)
|
1772
2062
|
goto cleanup;
|
1773
2063
|
|
1774
2064
|
if ((error = check_extensions(config, version)) < 0)
|
@@ -1779,7 +2069,7 @@ static int repo_init_config(
|
|
1779
2069
|
goto cleanup; } while (0)
|
1780
2070
|
|
1781
2071
|
SET_REPO_CONFIG(bool, "core.bare", is_bare);
|
1782
|
-
SET_REPO_CONFIG(int32, "core.repositoryformatversion",
|
2072
|
+
SET_REPO_CONFIG(int32, "core.repositoryformatversion", version);
|
1783
2073
|
|
1784
2074
|
if ((error = repo_init_fs_configs(
|
1785
2075
|
config, cfg_path.ptr, repo_dir, work_dir, !is_reinit)) < 0)
|
@@ -1789,11 +2079,11 @@ static int repo_init_config(
|
|
1789
2079
|
SET_REPO_CONFIG(bool, "core.logallrefupdates", true);
|
1790
2080
|
|
1791
2081
|
if (!(flags & GIT_REPOSITORY_INIT__NATURAL_WD)) {
|
1792
|
-
if ((error =
|
2082
|
+
if ((error = git_str_sets(&worktree_path, work_dir)) < 0)
|
1793
2083
|
goto cleanup;
|
1794
2084
|
|
1795
2085
|
if ((flags & GIT_REPOSITORY_INIT_RELATIVE_GITLINK))
|
1796
|
-
if ((error =
|
2086
|
+
if ((error = git_fs_path_make_relative(&worktree_path, repo_dir)) < 0)
|
1797
2087
|
goto cleanup;
|
1798
2088
|
|
1799
2089
|
SET_REPO_CONFIG(string, "core.worktree", worktree_path.ptr);
|
@@ -1812,9 +2102,14 @@ static int repo_init_config(
|
|
1812
2102
|
SET_REPO_CONFIG(bool, "receive.denyNonFastforwards", true);
|
1813
2103
|
}
|
1814
2104
|
|
2105
|
+
if (oid_type != GIT_OID_SHA1) {
|
2106
|
+
SET_REPO_CONFIG(int32, "core.repositoryformatversion", 1);
|
2107
|
+
SET_REPO_CONFIG(string, "extensions.objectformat", git_oid_type_name(oid_type));
|
2108
|
+
}
|
2109
|
+
|
1815
2110
|
cleanup:
|
1816
|
-
|
1817
|
-
|
2111
|
+
git_str_dispose(&cfg_path);
|
2112
|
+
git_str_dispose(&worktree_path);
|
1818
2113
|
git_config_free(config);
|
1819
2114
|
|
1820
2115
|
return error;
|
@@ -1836,7 +2131,7 @@ static int repo_reinit_submodule_fs(git_submodule *sm, const char *n, void *p)
|
|
1836
2131
|
int git_repository_reinit_filesystem(git_repository *repo, int recurse)
|
1837
2132
|
{
|
1838
2133
|
int error = 0;
|
1839
|
-
|
2134
|
+
git_str path = GIT_STR_INIT;
|
1840
2135
|
git_config *config = NULL;
|
1841
2136
|
const char *repo_dir = git_repository_path(repo);
|
1842
2137
|
|
@@ -1845,7 +2140,7 @@ int git_repository_reinit_filesystem(git_repository *repo, int recurse)
|
|
1845
2140
|
config, path.ptr, repo_dir, git_repository_workdir(repo), true);
|
1846
2141
|
|
1847
2142
|
git_config_free(config);
|
1848
|
-
|
2143
|
+
git_str_dispose(&path);
|
1849
2144
|
|
1850
2145
|
git_repository__configmap_lookup_cache_clear(repo);
|
1851
2146
|
|
@@ -1863,10 +2158,10 @@ static int repo_write_template(
|
|
1863
2158
|
bool hidden,
|
1864
2159
|
const char *content)
|
1865
2160
|
{
|
1866
|
-
|
2161
|
+
git_str path = GIT_STR_INIT;
|
1867
2162
|
int fd, error = 0, flags;
|
1868
2163
|
|
1869
|
-
if (
|
2164
|
+
if (git_str_joinpath(&path, git_dir, file) < 0)
|
1870
2165
|
return -1;
|
1871
2166
|
|
1872
2167
|
if (allow_overwrite)
|
@@ -1874,7 +2169,7 @@ static int repo_write_template(
|
|
1874
2169
|
else
|
1875
2170
|
flags = O_WRONLY | O_CREAT | O_EXCL;
|
1876
2171
|
|
1877
|
-
fd = p_open(
|
2172
|
+
fd = p_open(git_str_cstr(&path), flags, mode);
|
1878
2173
|
|
1879
2174
|
if (fd >= 0) {
|
1880
2175
|
error = p_write(fd, content, strlen(content));
|
@@ -1893,7 +2188,7 @@ static int repo_write_template(
|
|
1893
2188
|
GIT_UNUSED(hidden);
|
1894
2189
|
#endif
|
1895
2190
|
|
1896
|
-
|
2191
|
+
git_str_dispose(&path);
|
1897
2192
|
|
1898
2193
|
if (error)
|
1899
2194
|
git_error_set(GIT_ERROR_OS,
|
@@ -1906,13 +2201,13 @@ static int repo_write_gitlink(
|
|
1906
2201
|
const char *in_dir, const char *to_repo, bool use_relative_path)
|
1907
2202
|
{
|
1908
2203
|
int error;
|
1909
|
-
|
1910
|
-
|
2204
|
+
git_str buf = GIT_STR_INIT;
|
2205
|
+
git_str path_to_repo = GIT_STR_INIT;
|
1911
2206
|
struct stat st;
|
1912
2207
|
|
1913
|
-
|
1914
|
-
|
1915
|
-
if (
|
2208
|
+
git_fs_path_dirname_r(&buf, to_repo);
|
2209
|
+
git_fs_path_to_dir(&buf);
|
2210
|
+
if (git_str_oom(&buf))
|
1916
2211
|
return -1;
|
1917
2212
|
|
1918
2213
|
/* don't write gitlink to natural workdir */
|
@@ -1923,7 +2218,7 @@ static int repo_write_gitlink(
|
|
1923
2218
|
goto cleanup;
|
1924
2219
|
}
|
1925
2220
|
|
1926
|
-
if ((error =
|
2221
|
+
if ((error = git_str_joinpath(&buf, in_dir, DOT_GIT)) < 0)
|
1927
2222
|
goto cleanup;
|
1928
2223
|
|
1929
2224
|
if (!p_stat(buf.ptr, &st) && !S_ISREG(st.st_mode)) {
|
@@ -1933,22 +2228,22 @@ static int repo_write_gitlink(
|
|
1933
2228
|
goto cleanup;
|
1934
2229
|
}
|
1935
2230
|
|
1936
|
-
|
2231
|
+
git_str_clear(&buf);
|
1937
2232
|
|
1938
|
-
error =
|
2233
|
+
error = git_str_sets(&path_to_repo, to_repo);
|
1939
2234
|
|
1940
2235
|
if (!error && use_relative_path)
|
1941
|
-
error =
|
2236
|
+
error = git_fs_path_make_relative(&path_to_repo, in_dir);
|
1942
2237
|
|
1943
2238
|
if (!error)
|
1944
|
-
error =
|
2239
|
+
error = git_str_join(&buf, ' ', GIT_FILE_CONTENT_PREFIX, path_to_repo.ptr);
|
1945
2240
|
|
1946
2241
|
if (!error)
|
1947
2242
|
error = repo_write_template(in_dir, true, DOT_GIT, 0666, true, buf.ptr);
|
1948
2243
|
|
1949
2244
|
cleanup:
|
1950
|
-
|
1951
|
-
|
2245
|
+
git_str_dispose(&buf);
|
2246
|
+
git_str_dispose(&path_to_repo);
|
1952
2247
|
return error;
|
1953
2248
|
}
|
1954
2249
|
|
@@ -2001,12 +2296,12 @@ static int repo_init_structure(
|
|
2001
2296
|
git_config *cfg = NULL;
|
2002
2297
|
const char *tdir = NULL;
|
2003
2298
|
bool default_template = false;
|
2004
|
-
|
2299
|
+
git_str template_buf = GIT_STR_INIT;
|
2005
2300
|
|
2006
2301
|
if (opts->template_path)
|
2007
2302
|
tdir = opts->template_path;
|
2008
2303
|
else if ((error = git_config_open_default(&cfg)) >= 0) {
|
2009
|
-
if (!
|
2304
|
+
if (!git_config__get_path(&template_buf, cfg, "init.templatedir"))
|
2010
2305
|
tdir = template_buf.ptr;
|
2011
2306
|
git_error_clear();
|
2012
2307
|
}
|
@@ -2032,11 +2327,16 @@ static int repo_init_structure(
|
|
2032
2327
|
error = git_futils_cp_r(tdir, repo_dir, cpflags, dmode);
|
2033
2328
|
}
|
2034
2329
|
|
2035
|
-
|
2330
|
+
git_str_dispose(&template_buf);
|
2036
2331
|
git_config_free(cfg);
|
2037
2332
|
|
2333
|
+
/* If tdir does not exist, then do not error out. This matches the
|
2334
|
+
* behaviour of git(1), which just prints a warning and continues.
|
2335
|
+
* TODO: issue warning when warning API is available.
|
2336
|
+
* `git` prints to stderr: 'warning: templates not found in /path/to/tdir'
|
2337
|
+
*/
|
2038
2338
|
if (error < 0) {
|
2039
|
-
if (!default_template)
|
2339
|
+
if (!default_template && error != GIT_ENOTFOUND)
|
2040
2340
|
return error;
|
2041
2341
|
|
2042
2342
|
/* if template was default, ignore error and use internal */
|
@@ -2073,7 +2373,7 @@ static int repo_init_structure(
|
|
2073
2373
|
return error;
|
2074
2374
|
}
|
2075
2375
|
|
2076
|
-
static int mkdir_parent(
|
2376
|
+
static int mkdir_parent(git_str *buf, uint32_t mode, bool skip2)
|
2077
2377
|
{
|
2078
2378
|
/* When making parent directories during repository initialization
|
2079
2379
|
* don't try to set gid or grant world write access
|
@@ -2085,8 +2385,8 @@ static int mkdir_parent(git_buf *buf, uint32_t mode, bool skip2)
|
|
2085
2385
|
}
|
2086
2386
|
|
2087
2387
|
static int repo_init_directories(
|
2088
|
-
|
2089
|
-
|
2388
|
+
git_str *repo_path,
|
2389
|
+
git_str *wd_path,
|
2090
2390
|
const char *given_repo,
|
2091
2391
|
git_repository_init_options *opts)
|
2092
2392
|
{
|
@@ -2124,7 +2424,7 @@ static int repo_init_directories(
|
|
2124
2424
|
git__suffixcmp(given_repo, "/" DOT_GIT) != 0 &&
|
2125
2425
|
git__suffixcmp(given_repo, "/" GIT_DIR) != 0;
|
2126
2426
|
|
2127
|
-
if (
|
2427
|
+
if (git_str_joinpath(repo_path, given_repo, add_dotgit ? GIT_DIR : "") < 0)
|
2128
2428
|
return -1;
|
2129
2429
|
|
2130
2430
|
has_dotgit = (git__suffixcmp(repo_path->ptr, "/" GIT_DIR) == 0);
|
@@ -2135,11 +2435,11 @@ static int repo_init_directories(
|
|
2135
2435
|
|
2136
2436
|
if (!is_bare) {
|
2137
2437
|
if (opts->workdir_path) {
|
2138
|
-
if (
|
2438
|
+
if (git_fs_path_join_unrooted(
|
2139
2439
|
wd_path, opts->workdir_path, repo_path->ptr, NULL) < 0)
|
2140
2440
|
return -1;
|
2141
2441
|
} else if (has_dotgit) {
|
2142
|
-
if (
|
2442
|
+
if (git_fs_path_dirname_r(wd_path, repo_path->ptr) < 0)
|
2143
2443
|
return -1;
|
2144
2444
|
} else {
|
2145
2445
|
git_error_set(GIT_ERROR_REPOSITORY, "cannot pick working directory"
|
@@ -2147,10 +2447,10 @@ static int repo_init_directories(
|
|
2147
2447
|
return -1;
|
2148
2448
|
}
|
2149
2449
|
|
2150
|
-
if (
|
2450
|
+
if (git_fs_path_to_dir(wd_path) < 0)
|
2151
2451
|
return -1;
|
2152
2452
|
} else {
|
2153
|
-
|
2453
|
+
git_str_clear(wd_path);
|
2154
2454
|
}
|
2155
2455
|
|
2156
2456
|
natural_wd =
|
@@ -2207,10 +2507,10 @@ static int repo_init_directories(
|
|
2207
2507
|
/* prettify both directories now that they are created */
|
2208
2508
|
|
2209
2509
|
if (!error) {
|
2210
|
-
error =
|
2510
|
+
error = git_fs_path_prettify_dir(repo_path, repo_path->ptr, NULL);
|
2211
2511
|
|
2212
2512
|
if (!error && wd_path->size > 0)
|
2213
|
-
error =
|
2513
|
+
error = git_fs_path_prettify_dir(wd_path, wd_path->ptr, NULL);
|
2214
2514
|
}
|
2215
2515
|
|
2216
2516
|
return error;
|
@@ -2219,24 +2519,24 @@ static int repo_init_directories(
|
|
2219
2519
|
static int repo_init_head(const char *repo_dir, const char *given)
|
2220
2520
|
{
|
2221
2521
|
git_config *cfg = NULL;
|
2222
|
-
|
2522
|
+
git_str head_path = GIT_STR_INIT, cfg_branch = GIT_STR_INIT;
|
2223
2523
|
const char *initial_head = NULL;
|
2224
2524
|
int error;
|
2225
2525
|
|
2226
|
-
if ((error =
|
2526
|
+
if ((error = git_str_joinpath(&head_path, repo_dir, GIT_HEAD_FILE)) < 0)
|
2227
2527
|
goto out;
|
2228
2528
|
|
2229
2529
|
/*
|
2230
2530
|
* A template may have set a HEAD; use that unless it's been
|
2231
2531
|
* overridden by the caller's given initial head setting.
|
2232
2532
|
*/
|
2233
|
-
if (
|
2533
|
+
if (git_fs_path_exists(head_path.ptr) && !given)
|
2234
2534
|
goto out;
|
2235
2535
|
|
2236
2536
|
if (given) {
|
2237
2537
|
initial_head = given;
|
2238
2538
|
} else if ((error = git_config_open_default(&cfg)) >= 0 &&
|
2239
|
-
(error =
|
2539
|
+
(error = git_config__get_string_buf(&cfg_branch, cfg, "init.defaultbranch")) >= 0 &&
|
2240
2540
|
*cfg_branch.ptr) {
|
2241
2541
|
initial_head = cfg_branch.ptr;
|
2242
2542
|
}
|
@@ -2248,8 +2548,8 @@ static int repo_init_head(const char *repo_dir, const char *given)
|
|
2248
2548
|
|
2249
2549
|
out:
|
2250
2550
|
git_config_free(cfg);
|
2251
|
-
|
2252
|
-
|
2551
|
+
git_str_dispose(&head_path);
|
2552
|
+
git_str_dispose(&cfg_branch);
|
2253
2553
|
|
2254
2554
|
return error;
|
2255
2555
|
}
|
@@ -2283,10 +2583,11 @@ int git_repository_init_ext(
|
|
2283
2583
|
const char *given_repo,
|
2284
2584
|
git_repository_init_options *opts)
|
2285
2585
|
{
|
2286
|
-
|
2287
|
-
common_path =
|
2586
|
+
git_str repo_path = GIT_STR_INIT, wd_path = GIT_STR_INIT,
|
2587
|
+
common_path = GIT_STR_INIT;
|
2288
2588
|
const char *wd;
|
2289
2589
|
bool is_valid;
|
2590
|
+
git_oid_t oid_type = GIT_OID_DEFAULT;
|
2290
2591
|
int error;
|
2291
2592
|
|
2292
2593
|
GIT_ASSERT_ARG(out);
|
@@ -2295,10 +2596,15 @@ int git_repository_init_ext(
|
|
2295
2596
|
|
2296
2597
|
GIT_ERROR_CHECK_VERSION(opts, GIT_REPOSITORY_INIT_OPTIONS_VERSION, "git_repository_init_options");
|
2297
2598
|
|
2599
|
+
#ifdef GIT_EXPERIMENTAL_SHA256
|
2600
|
+
if (opts->oid_type)
|
2601
|
+
oid_type = opts->oid_type;
|
2602
|
+
#endif
|
2603
|
+
|
2298
2604
|
if ((error = repo_init_directories(&repo_path, &wd_path, given_repo, opts)) < 0)
|
2299
2605
|
goto out;
|
2300
2606
|
|
2301
|
-
wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL :
|
2607
|
+
wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL : git_str_cstr(&wd_path);
|
2302
2608
|
|
2303
2609
|
if ((error = is_valid_repository_path(&is_valid, &repo_path, &common_path)) < 0)
|
2304
2610
|
goto out;
|
@@ -2313,13 +2619,13 @@ int git_repository_init_ext(
|
|
2313
2619
|
|
2314
2620
|
opts->flags |= GIT_REPOSITORY_INIT__IS_REINIT;
|
2315
2621
|
|
2316
|
-
if ((error = repo_init_config(repo_path.ptr, wd, opts->flags, opts->mode)) < 0)
|
2622
|
+
if ((error = repo_init_config(repo_path.ptr, wd, opts->flags, opts->mode, oid_type)) < 0)
|
2317
2623
|
goto out;
|
2318
2624
|
|
2319
2625
|
/* TODO: reinitialize the templates */
|
2320
2626
|
} else {
|
2321
2627
|
if ((error = repo_init_structure(repo_path.ptr, wd, opts)) < 0 ||
|
2322
|
-
(error = repo_init_config(repo_path.ptr, wd, opts->flags, opts->mode)) < 0 ||
|
2628
|
+
(error = repo_init_config(repo_path.ptr, wd, opts->flags, opts->mode, oid_type)) < 0 ||
|
2323
2629
|
(error = repo_init_head(repo_path.ptr, opts->initial_head)) < 0)
|
2324
2630
|
goto out;
|
2325
2631
|
}
|
@@ -2332,9 +2638,9 @@ int git_repository_init_ext(
|
|
2332
2638
|
goto out;
|
2333
2639
|
|
2334
2640
|
out:
|
2335
|
-
|
2336
|
-
|
2337
|
-
|
2641
|
+
git_str_dispose(&common_path);
|
2642
|
+
git_str_dispose(&repo_path);
|
2643
|
+
git_str_dispose(&wd_path);
|
2338
2644
|
|
2339
2645
|
return error;
|
2340
2646
|
}
|
@@ -2522,7 +2828,7 @@ static int repo_contains_no_reference(git_repository *repo)
|
|
2522
2828
|
return error;
|
2523
2829
|
}
|
2524
2830
|
|
2525
|
-
int git_repository_initialbranch(
|
2831
|
+
int git_repository_initialbranch(git_str *out, git_repository *repo)
|
2526
2832
|
{
|
2527
2833
|
git_config *config;
|
2528
2834
|
git_config_entry *entry = NULL;
|
@@ -2543,8 +2849,8 @@ int git_repository_initialbranch(git_buf *out, git_repository *repo)
|
|
2543
2849
|
goto done;
|
2544
2850
|
}
|
2545
2851
|
|
2546
|
-
if ((error =
|
2547
|
-
(error =
|
2852
|
+
if ((error = git_str_puts(out, GIT_REFS_HEADS_DIR)) < 0 ||
|
2853
|
+
(error = git_str_puts(out, branch)) < 0 ||
|
2548
2854
|
(error = git_reference_name_is_valid(&valid, out->ptr)) < 0)
|
2549
2855
|
goto done;
|
2550
2856
|
|
@@ -2561,7 +2867,7 @@ done:
|
|
2561
2867
|
int git_repository_is_empty(git_repository *repo)
|
2562
2868
|
{
|
2563
2869
|
git_reference *head = NULL;
|
2564
|
-
|
2870
|
+
git_str initialbranch = GIT_STR_INIT;
|
2565
2871
|
int result = 0;
|
2566
2872
|
|
2567
2873
|
if ((result = git_reference_lookup(&head, repo, GIT_HEAD_FILE)) < 0 ||
|
@@ -2574,7 +2880,7 @@ int git_repository_is_empty(git_repository *repo)
|
|
2574
2880
|
|
2575
2881
|
done:
|
2576
2882
|
git_reference_free(head);
|
2577
|
-
|
2883
|
+
git_str_dispose(&initialbranch);
|
2578
2884
|
|
2579
2885
|
return result;
|
2580
2886
|
}
|
@@ -2603,7 +2909,18 @@ static const char *resolved_parent_path(const git_repository *repo, git_reposito
|
|
2603
2909
|
return parent;
|
2604
2910
|
}
|
2605
2911
|
|
2606
|
-
int git_repository_item_path(
|
2912
|
+
int git_repository_item_path(
|
2913
|
+
git_buf *out,
|
2914
|
+
const git_repository *repo,
|
2915
|
+
git_repository_item_t item)
|
2916
|
+
{
|
2917
|
+
GIT_BUF_WRAP_PRIVATE(out, git_repository__item_path, repo, item);
|
2918
|
+
}
|
2919
|
+
|
2920
|
+
int git_repository__item_path(
|
2921
|
+
git_str *out,
|
2922
|
+
const git_repository *repo,
|
2923
|
+
git_repository_item_t item)
|
2607
2924
|
{
|
2608
2925
|
const char *parent = resolved_parent_path(repo, items[item].parent, items[item].fallback);
|
2609
2926
|
if (parent == NULL) {
|
@@ -2611,16 +2928,16 @@ int git_repository_item_path(git_buf *out, const git_repository *repo, git_repos
|
|
2611
2928
|
return GIT_ENOTFOUND;
|
2612
2929
|
}
|
2613
2930
|
|
2614
|
-
if (
|
2931
|
+
if (git_str_sets(out, parent) < 0)
|
2615
2932
|
return -1;
|
2616
2933
|
|
2617
2934
|
if (items[item].name) {
|
2618
|
-
if (
|
2935
|
+
if (git_str_joinpath(out, parent, items[item].name) < 0)
|
2619
2936
|
return -1;
|
2620
2937
|
}
|
2621
2938
|
|
2622
2939
|
if (items[item].directory) {
|
2623
|
-
if (
|
2940
|
+
if (git_fs_path_to_dir(out) < 0)
|
2624
2941
|
return -1;
|
2625
2942
|
}
|
2626
2943
|
|
@@ -2644,7 +2961,7 @@ const char *git_repository_workdir(const git_repository *repo)
|
|
2644
2961
|
}
|
2645
2962
|
|
2646
2963
|
int git_repository_workdir_path(
|
2647
|
-
|
2964
|
+
git_str *out, git_repository *repo, const char *path)
|
2648
2965
|
{
|
2649
2966
|
int error;
|
2650
2967
|
|
@@ -2653,8 +2970,8 @@ int git_repository_workdir_path(
|
|
2653
2970
|
return GIT_EBAREREPO;
|
2654
2971
|
}
|
2655
2972
|
|
2656
|
-
if (!(error =
|
2657
|
-
error =
|
2973
|
+
if (!(error = git_str_joinpath(out, repo->workdir, path)))
|
2974
|
+
error = git_path_validate_str_length(repo, out);
|
2658
2975
|
|
2659
2976
|
return error;
|
2660
2977
|
}
|
@@ -2669,12 +2986,12 @@ int git_repository_set_workdir(
|
|
2669
2986
|
git_repository *repo, const char *workdir, int update_gitlink)
|
2670
2987
|
{
|
2671
2988
|
int error = 0;
|
2672
|
-
|
2989
|
+
git_str path = GIT_STR_INIT;
|
2673
2990
|
|
2674
2991
|
GIT_ASSERT_ARG(repo);
|
2675
2992
|
GIT_ASSERT_ARG(workdir);
|
2676
2993
|
|
2677
|
-
if (
|
2994
|
+
if (git_fs_path_prettify_dir(&path, workdir, NULL) < 0)
|
2678
2995
|
return -1;
|
2679
2996
|
|
2680
2997
|
if (repo->workdir && strcmp(repo->workdir, path.ptr) == 0)
|
@@ -2701,7 +3018,7 @@ int git_repository_set_workdir(
|
|
2701
3018
|
if (!error) {
|
2702
3019
|
char *old_workdir = repo->workdir;
|
2703
3020
|
|
2704
|
-
repo->workdir =
|
3021
|
+
repo->workdir = git_str_detach(&path);
|
2705
3022
|
repo->is_bare = 0;
|
2706
3023
|
|
2707
3024
|
git__free(old_workdir);
|
@@ -2770,60 +3087,62 @@ cleanup:
|
|
2770
3087
|
int git_repository__set_orig_head(git_repository *repo, const git_oid *orig_head)
|
2771
3088
|
{
|
2772
3089
|
git_filebuf file = GIT_FILEBUF_INIT;
|
2773
|
-
|
2774
|
-
char orig_head_str[
|
3090
|
+
git_str file_path = GIT_STR_INIT;
|
3091
|
+
char orig_head_str[GIT_OID_MAX_HEXSIZE];
|
2775
3092
|
int error = 0;
|
2776
3093
|
|
2777
3094
|
git_oid_fmt(orig_head_str, orig_head);
|
2778
3095
|
|
2779
|
-
if ((error =
|
3096
|
+
if ((error = git_str_joinpath(&file_path, repo->gitdir, GIT_ORIG_HEAD_FILE)) == 0 &&
|
2780
3097
|
(error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_CREATE_LEADING_DIRS, GIT_MERGE_FILE_MODE)) == 0 &&
|
2781
|
-
(error = git_filebuf_printf(&file, "%.*s\n",
|
3098
|
+
(error = git_filebuf_printf(&file, "%.*s\n", (int)git_oid_hexsize(repo->oid_type), orig_head_str)) == 0)
|
2782
3099
|
error = git_filebuf_commit(&file);
|
2783
3100
|
|
2784
3101
|
if (error < 0)
|
2785
3102
|
git_filebuf_cleanup(&file);
|
2786
3103
|
|
2787
|
-
|
3104
|
+
git_str_dispose(&file_path);
|
2788
3105
|
|
2789
3106
|
return error;
|
2790
3107
|
}
|
2791
3108
|
|
2792
|
-
int
|
3109
|
+
static int git_repository__message(git_str *out, git_repository *repo)
|
2793
3110
|
{
|
2794
|
-
|
3111
|
+
git_str path = GIT_STR_INIT;
|
2795
3112
|
struct stat st;
|
2796
3113
|
int error;
|
2797
3114
|
|
2798
|
-
if ((
|
2799
|
-
return error;
|
2800
|
-
|
2801
|
-
if (git_buf_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
3115
|
+
if (git_str_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
2802
3116
|
return -1;
|
2803
3117
|
|
2804
|
-
if ((error = p_stat(
|
3118
|
+
if ((error = p_stat(git_str_cstr(&path), &st)) < 0) {
|
2805
3119
|
if (errno == ENOENT)
|
2806
3120
|
error = GIT_ENOTFOUND;
|
2807
3121
|
git_error_set(GIT_ERROR_OS, "could not access message file");
|
2808
3122
|
} else {
|
2809
|
-
error = git_futils_readbuffer(out,
|
3123
|
+
error = git_futils_readbuffer(out, git_str_cstr(&path));
|
2810
3124
|
}
|
2811
3125
|
|
2812
|
-
|
3126
|
+
git_str_dispose(&path);
|
2813
3127
|
|
2814
3128
|
return error;
|
2815
3129
|
}
|
2816
3130
|
|
3131
|
+
int git_repository_message(git_buf *out, git_repository *repo)
|
3132
|
+
{
|
3133
|
+
GIT_BUF_WRAP_PRIVATE(out, git_repository__message, repo);
|
3134
|
+
}
|
3135
|
+
|
2817
3136
|
int git_repository_message_remove(git_repository *repo)
|
2818
3137
|
{
|
2819
|
-
|
3138
|
+
git_str path = GIT_STR_INIT;
|
2820
3139
|
int error;
|
2821
3140
|
|
2822
|
-
if (
|
3141
|
+
if (git_str_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
2823
3142
|
return -1;
|
2824
3143
|
|
2825
|
-
error = p_unlink(
|
2826
|
-
|
3144
|
+
error = p_unlink(git_str_cstr(&path));
|
3145
|
+
git_str_dispose(&path);
|
2827
3146
|
|
2828
3147
|
return error;
|
2829
3148
|
}
|
@@ -2839,7 +3158,7 @@ int git_repository_hashfile(
|
|
2839
3158
|
git_filter_list *fl = NULL;
|
2840
3159
|
git_file fd = -1;
|
2841
3160
|
uint64_t len;
|
2842
|
-
|
3161
|
+
git_str full_path = GIT_STR_INIT;
|
2843
3162
|
const char *workdir = git_repository_workdir(repo);
|
2844
3163
|
|
2845
3164
|
/* as_path can be NULL */
|
@@ -2847,8 +3166,8 @@ int git_repository_hashfile(
|
|
2847
3166
|
GIT_ASSERT_ARG(path);
|
2848
3167
|
GIT_ASSERT_ARG(repo);
|
2849
3168
|
|
2850
|
-
if ((error =
|
2851
|
-
(error =
|
3169
|
+
if ((error = git_fs_path_join_unrooted(&full_path, path, workdir, NULL)) < 0 ||
|
3170
|
+
(error = git_path_validate_str_length(repo, &full_path)) < 0)
|
2852
3171
|
return error;
|
2853
3172
|
|
2854
3173
|
/*
|
@@ -2889,36 +3208,36 @@ int git_repository_hashfile(
|
|
2889
3208
|
goto cleanup;
|
2890
3209
|
}
|
2891
3210
|
|
2892
|
-
error = git_odb__hashfd_filtered(out, fd, (size_t)len, type, fl);
|
3211
|
+
error = git_odb__hashfd_filtered(out, fd, (size_t)len, type, repo->oid_type, fl);
|
2893
3212
|
|
2894
3213
|
cleanup:
|
2895
3214
|
if (fd >= 0)
|
2896
3215
|
p_close(fd);
|
2897
3216
|
git_filter_list_free(fl);
|
2898
|
-
|
3217
|
+
git_str_dispose(&full_path);
|
2899
3218
|
|
2900
3219
|
return error;
|
2901
3220
|
}
|
2902
3221
|
|
2903
|
-
static int checkout_message(
|
3222
|
+
static int checkout_message(git_str *out, git_reference *old, const char *new)
|
2904
3223
|
{
|
2905
|
-
|
3224
|
+
git_str_puts(out, "checkout: moving from ");
|
2906
3225
|
|
2907
3226
|
if (git_reference_type(old) == GIT_REFERENCE_SYMBOLIC)
|
2908
|
-
|
3227
|
+
git_str_puts(out, git_reference__shorthand(git_reference_symbolic_target(old)));
|
2909
3228
|
else
|
2910
|
-
|
3229
|
+
git_str_puts(out, git_oid_tostr_s(git_reference_target(old)));
|
2911
3230
|
|
2912
|
-
|
3231
|
+
git_str_puts(out, " to ");
|
2913
3232
|
|
2914
3233
|
if (git_reference__is_branch(new) ||
|
2915
3234
|
git_reference__is_tag(new) ||
|
2916
3235
|
git_reference__is_remote(new))
|
2917
|
-
|
3236
|
+
git_str_puts(out, git_reference__shorthand(new));
|
2918
3237
|
else
|
2919
|
-
|
3238
|
+
git_str_puts(out, new);
|
2920
3239
|
|
2921
|
-
if (
|
3240
|
+
if (git_str_oom(out))
|
2922
3241
|
return -1;
|
2923
3242
|
|
2924
3243
|
return 0;
|
@@ -2927,7 +3246,7 @@ static int checkout_message(git_buf *out, git_reference *old, const char *new)
|
|
2927
3246
|
static int detach(git_repository *repo, const git_oid *id, const char *new)
|
2928
3247
|
{
|
2929
3248
|
int error;
|
2930
|
-
|
3249
|
+
git_str log_message = GIT_STR_INIT;
|
2931
3250
|
git_object *object = NULL, *peeled = NULL;
|
2932
3251
|
git_reference *new_head = NULL, *current = NULL;
|
2933
3252
|
|
@@ -2949,10 +3268,10 @@ static int detach(git_repository *repo, const git_oid *id, const char *new)
|
|
2949
3268
|
if ((error = checkout_message(&log_message, current, new)) < 0)
|
2950
3269
|
goto cleanup;
|
2951
3270
|
|
2952
|
-
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true,
|
3271
|
+
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true, git_str_cstr(&log_message));
|
2953
3272
|
|
2954
3273
|
cleanup:
|
2955
|
-
|
3274
|
+
git_str_dispose(&log_message);
|
2956
3275
|
git_object_free(object);
|
2957
3276
|
git_object_free(peeled);
|
2958
3277
|
git_reference_free(current);
|
@@ -2965,7 +3284,7 @@ int git_repository_set_head(
|
|
2965
3284
|
const char *refname)
|
2966
3285
|
{
|
2967
3286
|
git_reference *ref = NULL, *current = NULL, *new_head = NULL;
|
2968
|
-
|
3287
|
+
git_str log_message = GIT_STR_INIT;
|
2969
3288
|
int error;
|
2970
3289
|
|
2971
3290
|
GIT_ASSERT_ARG(repo);
|
@@ -2992,18 +3311,18 @@ int git_repository_set_head(
|
|
2992
3311
|
if (!error) {
|
2993
3312
|
if (git_reference_is_branch(ref)) {
|
2994
3313
|
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE,
|
2995
|
-
git_reference_name(ref), true,
|
3314
|
+
git_reference_name(ref), true, git_str_cstr(&log_message));
|
2996
3315
|
} else {
|
2997
3316
|
error = detach(repo, git_reference_target(ref),
|
2998
3317
|
git_reference_is_tag(ref) || git_reference_is_remote(ref) ? refname : NULL);
|
2999
3318
|
}
|
3000
3319
|
} else if (git_reference__is_branch(refname)) {
|
3001
3320
|
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, refname,
|
3002
|
-
true,
|
3321
|
+
true, git_str_cstr(&log_message));
|
3003
3322
|
}
|
3004
3323
|
|
3005
3324
|
cleanup:
|
3006
|
-
|
3325
|
+
git_str_dispose(&log_message);
|
3007
3326
|
git_reference_free(current);
|
3008
3327
|
git_reference_free(ref);
|
3009
3328
|
git_reference_free(new_head);
|
@@ -3012,26 +3331,26 @@ cleanup:
|
|
3012
3331
|
|
3013
3332
|
int git_repository_set_head_detached(
|
3014
3333
|
git_repository *repo,
|
3015
|
-
const git_oid *
|
3334
|
+
const git_oid *committish)
|
3016
3335
|
{
|
3017
|
-
return detach(repo,
|
3336
|
+
return detach(repo, committish, NULL);
|
3018
3337
|
}
|
3019
3338
|
|
3020
3339
|
int git_repository_set_head_detached_from_annotated(
|
3021
3340
|
git_repository *repo,
|
3022
|
-
const git_annotated_commit *
|
3341
|
+
const git_annotated_commit *committish)
|
3023
3342
|
{
|
3024
3343
|
GIT_ASSERT_ARG(repo);
|
3025
|
-
GIT_ASSERT_ARG(
|
3344
|
+
GIT_ASSERT_ARG(committish);
|
3026
3345
|
|
3027
|
-
return detach(repo, git_annotated_commit_id(
|
3346
|
+
return detach(repo, git_annotated_commit_id(committish), committish->description);
|
3028
3347
|
}
|
3029
3348
|
|
3030
3349
|
int git_repository_detach_head(git_repository *repo)
|
3031
3350
|
{
|
3032
3351
|
git_reference *old_head = NULL, *new_head = NULL, *current = NULL;
|
3033
3352
|
git_object *object = NULL;
|
3034
|
-
|
3353
|
+
git_str log_message = GIT_STR_INIT;
|
3035
3354
|
int error;
|
3036
3355
|
|
3037
3356
|
GIT_ASSERT_ARG(repo);
|
@@ -3049,10 +3368,10 @@ int git_repository_detach_head(git_repository *repo)
|
|
3049
3368
|
goto cleanup;
|
3050
3369
|
|
3051
3370
|
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_reference_target(old_head),
|
3052
|
-
1,
|
3371
|
+
1, git_str_cstr(&log_message));
|
3053
3372
|
|
3054
3373
|
cleanup:
|
3055
|
-
|
3374
|
+
git_str_dispose(&log_message);
|
3056
3375
|
git_object_free(object);
|
3057
3376
|
git_reference_free(old_head);
|
3058
3377
|
git_reference_free(new_head);
|
@@ -3066,69 +3385,69 @@ cleanup:
|
|
3066
3385
|
*/
|
3067
3386
|
int git_repository_state(git_repository *repo)
|
3068
3387
|
{
|
3069
|
-
|
3388
|
+
git_str repo_path = GIT_STR_INIT;
|
3070
3389
|
int state = GIT_REPOSITORY_STATE_NONE;
|
3071
3390
|
|
3072
3391
|
GIT_ASSERT_ARG(repo);
|
3073
3392
|
|
3074
|
-
if (
|
3393
|
+
if (git_str_puts(&repo_path, repo->gitdir) < 0)
|
3075
3394
|
return -1;
|
3076
3395
|
|
3077
|
-
if (
|
3396
|
+
if (git_fs_path_contains_file(&repo_path, GIT_REBASE_MERGE_INTERACTIVE_FILE))
|
3078
3397
|
state = GIT_REPOSITORY_STATE_REBASE_INTERACTIVE;
|
3079
|
-
else if (
|
3398
|
+
else if (git_fs_path_contains_dir(&repo_path, GIT_REBASE_MERGE_DIR))
|
3080
3399
|
state = GIT_REPOSITORY_STATE_REBASE_MERGE;
|
3081
|
-
else if (
|
3400
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REBASE_APPLY_REBASING_FILE))
|
3082
3401
|
state = GIT_REPOSITORY_STATE_REBASE;
|
3083
|
-
else if (
|
3402
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REBASE_APPLY_APPLYING_FILE))
|
3084
3403
|
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX;
|
3085
|
-
else if (
|
3404
|
+
else if (git_fs_path_contains_dir(&repo_path, GIT_REBASE_APPLY_DIR))
|
3086
3405
|
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE;
|
3087
|
-
else if (
|
3406
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_MERGE_HEAD_FILE))
|
3088
3407
|
state = GIT_REPOSITORY_STATE_MERGE;
|
3089
|
-
else if (
|
3408
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REVERT_HEAD_FILE)) {
|
3090
3409
|
state = GIT_REPOSITORY_STATE_REVERT;
|
3091
|
-
if (
|
3410
|
+
if (git_fs_path_contains_file(&repo_path, GIT_SEQUENCER_TODO_FILE)) {
|
3092
3411
|
state = GIT_REPOSITORY_STATE_REVERT_SEQUENCE;
|
3093
3412
|
}
|
3094
|
-
} else if (
|
3413
|
+
} else if (git_fs_path_contains_file(&repo_path, GIT_CHERRYPICK_HEAD_FILE)) {
|
3095
3414
|
state = GIT_REPOSITORY_STATE_CHERRYPICK;
|
3096
|
-
if (
|
3415
|
+
if (git_fs_path_contains_file(&repo_path, GIT_SEQUENCER_TODO_FILE)) {
|
3097
3416
|
state = GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE;
|
3098
3417
|
}
|
3099
|
-
} else if (
|
3418
|
+
} else if (git_fs_path_contains_file(&repo_path, GIT_BISECT_LOG_FILE))
|
3100
3419
|
state = GIT_REPOSITORY_STATE_BISECT;
|
3101
3420
|
|
3102
|
-
|
3421
|
+
git_str_dispose(&repo_path);
|
3103
3422
|
return state;
|
3104
3423
|
}
|
3105
3424
|
|
3106
3425
|
int git_repository__cleanup_files(
|
3107
3426
|
git_repository *repo, const char *files[], size_t files_len)
|
3108
3427
|
{
|
3109
|
-
|
3428
|
+
git_str buf = GIT_STR_INIT;
|
3110
3429
|
size_t i;
|
3111
3430
|
int error;
|
3112
3431
|
|
3113
3432
|
for (error = 0, i = 0; !error && i < files_len; ++i) {
|
3114
3433
|
const char *path;
|
3115
3434
|
|
3116
|
-
if (
|
3435
|
+
if (git_str_joinpath(&buf, repo->gitdir, files[i]) < 0)
|
3117
3436
|
return -1;
|
3118
3437
|
|
3119
|
-
path =
|
3438
|
+
path = git_str_cstr(&buf);
|
3120
3439
|
|
3121
|
-
if (
|
3440
|
+
if (git_fs_path_isfile(path)) {
|
3122
3441
|
error = p_unlink(path);
|
3123
|
-
} else if (
|
3442
|
+
} else if (git_fs_path_isdir(path)) {
|
3124
3443
|
error = git_futils_rmdir_r(path, NULL,
|
3125
3444
|
GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS);
|
3126
3445
|
}
|
3127
3446
|
|
3128
|
-
|
3447
|
+
git_str_clear(&buf);
|
3129
3448
|
}
|
3130
3449
|
|
3131
|
-
|
3450
|
+
git_str_dispose(&buf);
|
3132
3451
|
return error;
|
3133
3452
|
}
|
3134
3453
|
|
@@ -3153,15 +3472,15 @@ int git_repository_state_cleanup(git_repository *repo)
|
|
3153
3472
|
|
3154
3473
|
int git_repository_is_shallow(git_repository *repo)
|
3155
3474
|
{
|
3156
|
-
|
3475
|
+
git_str path = GIT_STR_INIT;
|
3157
3476
|
struct stat st;
|
3158
3477
|
int error;
|
3159
3478
|
|
3160
|
-
if ((error =
|
3479
|
+
if ((error = git_str_joinpath(&path, repo->gitdir, "shallow")) < 0)
|
3161
3480
|
return error;
|
3162
3481
|
|
3163
|
-
error =
|
3164
|
-
|
3482
|
+
error = git_fs_path_lstat(path.ptr, &st);
|
3483
|
+
git_str_dispose(&path);
|
3165
3484
|
|
3166
3485
|
if (error == GIT_ENOTFOUND) {
|
3167
3486
|
git_error_clear();
|
@@ -3236,3 +3555,8 @@ int git_repository_submodule_cache_clear(git_repository *repo)
|
|
3236
3555
|
repo->submodule_cache = NULL;
|
3237
3556
|
return error;
|
3238
3557
|
}
|
3558
|
+
|
3559
|
+
git_oid_t git_repository_oid_type(git_repository *repo)
|
3560
|
+
{
|
3561
|
+
return repo ? repo->oid_type : 0;
|
3562
|
+
}
|