rugged 1.3.1 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +34 -2
- data/ext/rugged/extconf.rb +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
|
+
}
|