rugged 1.3.2.3 → 1.4.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/ext/rugged/extconf.rb +1 -1
- data/ext/rugged/rugged_config.c +7 -2
- data/ext/rugged/rugged_remote.c +17 -0
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +103 -276
- data/vendor/libgit2/COPYING +36 -19
- data/vendor/libgit2/cmake/AddCFlagIfSupported.cmake +21 -21
- data/vendor/libgit2/cmake/DefaultCFlags.cmake +154 -0
- data/vendor/libgit2/cmake/EnableWarnings.cmake +13 -13
- 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 +13 -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 +39 -49
- 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 +31 -31
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +1 -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 +0 -7
- data/vendor/libgit2/deps/zlib/crc32.c +288 -975
- data/vendor/libgit2/deps/zlib/crc32.h +436 -9441
- data/vendor/libgit2/deps/zlib/deflate.c +31 -83
- data/vendor/libgit2/deps/zlib/deflate.h +15 -12
- data/vendor/libgit2/deps/zlib/gzguts.h +2 -3
- data/vendor/libgit2/deps/zlib/infback.c +1 -2
- data/vendor/libgit2/deps/zlib/inffast.c +14 -14
- data/vendor/libgit2/deps/zlib/inflate.c +8 -39
- data/vendor/libgit2/deps/zlib/inflate.h +2 -3
- data/vendor/libgit2/deps/zlib/inftrees.c +3 -3
- data/vendor/libgit2/deps/zlib/trees.c +48 -27
- data/vendor/libgit2/deps/zlib/zlib.h +100 -126
- data/vendor/libgit2/deps/zlib/zutil.c +2 -2
- data/vendor/libgit2/deps/zlib/zutil.h +9 -12
- 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 +2 -0
- 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 +5 -12
- data/vendor/libgit2/include/git2/config.h +19 -3
- 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 +1 -1
- data/vendor/libgit2/include/git2/describe.h +7 -2
- data/vendor/libgit2/include/git2/diff.h +17 -9
- data/vendor/libgit2/include/git2/email.h +1 -1
- data/vendor/libgit2/include/git2/errors.h +1 -2
- 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 +19 -0
- data/vendor/libgit2/include/git2/merge.h +23 -3
- data/vendor/libgit2/include/git2/message.h +2 -0
- data/vendor/libgit2/include/git2/object.h +23 -0
- data/vendor/libgit2/include/git2/odb.h +37 -7
- data/vendor/libgit2/include/git2/odb_backend.h +1 -1
- 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 +14 -9
- 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 +3 -3
- data/vendor/libgit2/include/git2/status.h +9 -3
- 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 +2 -5
- data/vendor/libgit2/include/git2/sys/remote.h +31 -0
- data/vendor/libgit2/include/git2/sys/stream.h +1 -1
- data/vendor/libgit2/include/git2/sys/transport.h +25 -34
- 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 +3 -3
- data/vendor/libgit2/include/git2/worktree.h +12 -2
- data/vendor/libgit2/src/CMakeLists.txt +189 -315
- data/vendor/libgit2/src/annotated_commit.h +1 -1
- data/vendor/libgit2/src/apply.c +18 -18
- data/vendor/libgit2/src/apply.h +2 -2
- data/vendor/libgit2/src/attr.c +18 -18
- data/vendor/libgit2/src/attr_file.c +17 -17
- data/vendor/libgit2/src/attr_file.h +4 -4
- data/vendor/libgit2/src/attrcache.c +17 -12
- data/vendor/libgit2/src/blame_git.c +1 -1
- data/vendor/libgit2/src/blob.c +33 -26
- data/vendor/libgit2/src/blob.h +1 -1
- data/vendor/libgit2/src/branch.c +150 -109
- data/vendor/libgit2/src/branch.h +15 -3
- data/vendor/libgit2/src/buf.c +126 -0
- data/vendor/libgit2/src/buf.h +50 -0
- data/vendor/libgit2/src/cc-compat.h +1 -1
- data/vendor/libgit2/src/checkout.c +74 -68
- data/vendor/libgit2/src/cherrypick.c +10 -10
- data/vendor/libgit2/src/clone.c +66 -66
- data/vendor/libgit2/src/commit.c +128 -58
- data/vendor/libgit2/src/commit.h +24 -1
- data/vendor/libgit2/src/commit_graph.c +68 -53
- data/vendor/libgit2/src/commit_graph.h +10 -3
- data/vendor/libgit2/src/commit_list.c +2 -3
- data/vendor/libgit2/src/common.h +10 -3
- data/vendor/libgit2/src/config.c +99 -77
- data/vendor/libgit2/src/config.h +15 -2
- data/vendor/libgit2/src/config_file.c +103 -91
- data/vendor/libgit2/src/config_mem.c +9 -9
- data/vendor/libgit2/src/config_parse.c +27 -23
- data/vendor/libgit2/src/crlf.c +24 -21
- data/vendor/libgit2/src/date.c +10 -17
- data/vendor/libgit2/src/date.h +33 -0
- data/vendor/libgit2/src/describe.c +27 -19
- data/vendor/libgit2/src/diff.c +25 -8
- data/vendor/libgit2/src/diff.h +2 -4
- data/vendor/libgit2/src/diff_driver.c +34 -36
- data/vendor/libgit2/src/diff_driver.h +3 -3
- data/vendor/libgit2/src/diff_file.c +29 -20
- data/vendor/libgit2/src/diff_generate.c +30 -6
- data/vendor/libgit2/src/diff_generate.h +5 -3
- data/vendor/libgit2/src/diff_print.c +102 -95
- data/vendor/libgit2/src/diff_stats.c +40 -29
- data/vendor/libgit2/src/{message.h → diff_stats.h} +7 -6
- data/vendor/libgit2/src/diff_tform.c +9 -8
- data/vendor/libgit2/src/diff_xdiff.c +3 -8
- data/vendor/libgit2/src/email.c +54 -38
- data/vendor/libgit2/src/email.h +1 -1
- data/vendor/libgit2/src/errors.c +18 -18
- data/vendor/libgit2/src/features.h.in +6 -1
- data/vendor/libgit2/src/fetch.c +69 -24
- data/vendor/libgit2/src/fetch.h +1 -1
- data/vendor/libgit2/src/fetchhead.c +19 -19
- data/vendor/libgit2/src/filebuf.c +28 -28
- data/vendor/libgit2/src/filebuf.h +1 -1
- data/vendor/libgit2/src/filter.c +96 -52
- data/vendor/libgit2/src/filter.h +26 -5
- data/vendor/libgit2/src/fs_path.c +1912 -0
- data/vendor/libgit2/src/fs_path.h +752 -0
- data/vendor/libgit2/src/futils.c +91 -85
- data/vendor/libgit2/src/futils.h +26 -14
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +2 -2
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +2 -2
- data/vendor/libgit2/src/hash/sha1/generic.c +2 -2
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +2 -2
- data/vendor/libgit2/src/hash/sha1/openssl.c +2 -2
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +1 -1
- data/vendor/libgit2/src/hash/sha1/win32.c +6 -6
- data/vendor/libgit2/src/hash/sha1.h +3 -1
- data/vendor/libgit2/src/hash.c +67 -35
- data/vendor/libgit2/src/hash.h +12 -12
- data/vendor/libgit2/src/ident.c +18 -18
- data/vendor/libgit2/src/ignore.c +35 -34
- data/vendor/libgit2/src/ignore.h +2 -2
- data/vendor/libgit2/src/index.c +79 -80
- data/vendor/libgit2/src/index.h +6 -3
- data/vendor/libgit2/src/indexer.c +75 -57
- data/vendor/libgit2/src/iterator.c +64 -56
- data/vendor/libgit2/src/iterator.h +5 -5
- data/vendor/libgit2/src/khash.h +1 -1
- data/vendor/libgit2/src/libgit2.c +22 -19
- data/vendor/libgit2/src/mailmap.c +38 -36
- data/vendor/libgit2/src/merge.c +27 -27
- data/vendor/libgit2/src/merge.h +1 -14
- data/vendor/libgit2/src/merge_driver.c +2 -2
- data/vendor/libgit2/src/merge_file.c +13 -3
- data/vendor/libgit2/src/message.c +21 -10
- data/vendor/libgit2/src/midx.c +83 -66
- data/vendor/libgit2/src/midx.h +3 -3
- data/vendor/libgit2/src/mwindow.c +1 -1
- data/vendor/libgit2/src/net.c +278 -68
- data/vendor/libgit2/src/net.h +10 -3
- data/vendor/libgit2/src/netops.c +1 -1
- data/vendor/libgit2/src/netops.h +1 -1
- data/vendor/libgit2/src/notes.c +20 -29
- data/vendor/libgit2/src/object.c +49 -9
- data/vendor/libgit2/src/object.h +1 -1
- data/vendor/libgit2/src/odb.c +35 -32
- data/vendor/libgit2/src/odb.h +1 -1
- data/vendor/libgit2/src/odb_loose.c +68 -68
- data/vendor/libgit2/src/odb_mempack.c +18 -5
- data/vendor/libgit2/src/odb_pack.c +43 -43
- data/vendor/libgit2/src/oid.c +11 -4
- data/vendor/libgit2/src/oid.h +15 -0
- data/vendor/libgit2/src/pack-objects.c +41 -26
- data/vendor/libgit2/src/pack-objects.h +11 -6
- data/vendor/libgit2/src/pack.c +10 -10
- data/vendor/libgit2/src/patch.c +3 -3
- data/vendor/libgit2/src/patch.h +1 -0
- data/vendor/libgit2/src/patch_generate.c +27 -11
- data/vendor/libgit2/src/patch_generate.h +5 -5
- data/vendor/libgit2/src/patch_parse.c +24 -24
- data/vendor/libgit2/src/path.c +76 -1951
- data/vendor/libgit2/src/path.h +34 -741
- data/vendor/libgit2/src/pathspec.c +6 -6
- data/vendor/libgit2/src/pathspec.h +2 -2
- data/vendor/libgit2/src/posix.c +3 -3
- data/vendor/libgit2/src/posix.h +1 -0
- data/vendor/libgit2/src/pqueue.h +1 -1
- data/vendor/libgit2/src/proxy.c +4 -1
- data/vendor/libgit2/src/proxy.h +1 -1
- data/vendor/libgit2/src/push.c +30 -35
- data/vendor/libgit2/src/push.h +4 -16
- data/vendor/libgit2/src/rand.c +226 -0
- data/vendor/libgit2/src/rand.h +37 -0
- data/vendor/libgit2/src/reader.c +8 -8
- data/vendor/libgit2/src/reader.h +2 -2
- data/vendor/libgit2/src/rebase.c +89 -88
- data/vendor/libgit2/src/refdb_fs.c +447 -173
- data/vendor/libgit2/src/refs.c +32 -32
- data/vendor/libgit2/src/refs.h +2 -2
- data/vendor/libgit2/src/refspec.c +32 -37
- data/vendor/libgit2/src/refspec.h +5 -2
- data/vendor/libgit2/src/regexp.c +1 -1
- data/vendor/libgit2/src/remote.c +713 -419
- data/vendor/libgit2/src/remote.h +15 -10
- data/vendor/libgit2/src/repository.c +350 -467
- data/vendor/libgit2/src/repository.h +11 -10
- data/vendor/libgit2/src/reset.c +8 -5
- data/vendor/libgit2/src/revert.c +10 -10
- data/vendor/libgit2/src/revparse.c +48 -35
- data/vendor/libgit2/src/revwalk.c +7 -7
- data/vendor/libgit2/src/signature.c +12 -6
- data/vendor/libgit2/src/signature.h +1 -1
- data/vendor/libgit2/src/sortedcache.c +1 -1
- data/vendor/libgit2/src/sortedcache.h +1 -1
- data/vendor/libgit2/src/stash.c +36 -37
- data/vendor/libgit2/src/status.c +4 -1
- data/vendor/libgit2/src/{buffer.c → str.c} +157 -151
- data/vendor/libgit2/src/str.h +357 -0
- data/vendor/libgit2/src/streams/mbedtls.c +8 -6
- data/vendor/libgit2/src/streams/openssl_dynamic.h +3 -3
- data/vendor/libgit2/src/submodule.c +171 -159
- data/vendor/libgit2/src/submodule.h +1 -1
- data/vendor/libgit2/src/sysdir.c +68 -52
- data/vendor/libgit2/src/sysdir.h +15 -10
- data/vendor/libgit2/src/tag.c +29 -27
- data/vendor/libgit2/src/thread.h +3 -3
- data/vendor/libgit2/src/threadstate.c +3 -3
- data/vendor/libgit2/src/threadstate.h +1 -1
- data/vendor/libgit2/src/trace.c +1 -14
- data/vendor/libgit2/src/trace.h +5 -22
- data/vendor/libgit2/src/trailer.c +1 -1
- data/vendor/libgit2/src/transaction.c +1 -1
- data/vendor/libgit2/src/transport.c +10 -10
- data/vendor/libgit2/src/transports/auth.c +7 -9
- data/vendor/libgit2/src/transports/auth.h +2 -3
- data/vendor/libgit2/src/transports/auth_negotiate.c +12 -13
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -10
- data/vendor/libgit2/src/transports/auth_ntlm.h +0 -1
- data/vendor/libgit2/src/transports/git.c +9 -11
- data/vendor/libgit2/src/transports/http.c +37 -17
- data/vendor/libgit2/src/transports/http.h +2 -3
- data/vendor/libgit2/src/transports/httpclient.c +65 -65
- data/vendor/libgit2/src/transports/local.c +124 -116
- data/vendor/libgit2/src/transports/smart.c +51 -139
- data/vendor/libgit2/src/transports/smart.h +25 -31
- data/vendor/libgit2/src/transports/smart_pkt.c +33 -33
- data/vendor/libgit2/src/transports/smart_protocol.c +57 -39
- data/vendor/libgit2/src/transports/ssh.c +47 -112
- data/vendor/libgit2/src/transports/winhttp.c +50 -56
- data/vendor/libgit2/src/tree-cache.c +5 -5
- data/vendor/libgit2/src/tree-cache.h +2 -2
- data/vendor/libgit2/src/tree.c +59 -48
- data/vendor/libgit2/src/tree.h +1 -1
- data/vendor/libgit2/src/unix/map.c +0 -2
- data/vendor/libgit2/src/unix/posix.h +1 -4
- data/vendor/libgit2/src/unix/realpath.c +0 -2
- data/vendor/libgit2/src/util.c +14 -14
- data/vendor/libgit2/src/util.h +2 -28
- data/vendor/libgit2/src/vector.h +1 -1
- data/vendor/libgit2/src/win32/findfile.c +172 -116
- data/vendor/libgit2/src/win32/findfile.h +7 -4
- data/vendor/libgit2/src/win32/path_w32.c +140 -9
- data/vendor/libgit2/src/win32/path_w32.h +2 -0
- data/vendor/libgit2/src/win32/posix.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +11 -27
- data/vendor/libgit2/src/win32/w32_buffer.c +2 -3
- data/vendor/libgit2/src/win32/w32_buffer.h +2 -3
- data/vendor/libgit2/src/win32/w32_leakcheck.c +1 -1
- data/vendor/libgit2/src/worktree.c +116 -94
- data/vendor/libgit2/src/worktree.h +1 -1
- data/vendor/libgit2/src/xdiff/git-xdiff.h +53 -0
- data/vendor/libgit2/src/xdiff/xdiff.h +15 -15
- data/vendor/libgit2/src/xdiff/xdiffi.c +134 -108
- data/vendor/libgit2/src/xdiff/xemit.c +23 -7
- data/vendor/libgit2/src/xdiff/xhistogram.c +87 -78
- data/vendor/libgit2/src/xdiff/xinclude.h +1 -12
- data/vendor/libgit2/src/xdiff/xmerge.c +104 -117
- data/vendor/libgit2/src/xdiff/xpatience.c +6 -17
- data/vendor/libgit2/src/xdiff/xprepare.c +15 -20
- data/vendor/libgit2/src/xdiff/xutils.c +18 -7
- data/vendor/libgit2/src/zstream.c +5 -5
- data/vendor/libgit2/src/zstream.h +4 -4
- metadata +25 -10
- data/vendor/libgit2/src/buffer.h +0 -374
|
@@ -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,14 +32,13 @@
|
|
|
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
|
|
|
41
|
-
bool git_repository__validate_ownership = true;
|
|
42
42
|
bool git_repository__fsync_gitdir = false;
|
|
43
43
|
|
|
44
44
|
static const struct {
|
|
@@ -65,7 +65,6 @@ static const struct {
|
|
|
65
65
|
|
|
66
66
|
static int check_repositoryformatversion(int *version, git_config *config);
|
|
67
67
|
static int check_extensions(git_config *config, int version);
|
|
68
|
-
static int load_global_config(git_config **config);
|
|
69
68
|
|
|
70
69
|
#define GIT_COMMONDIR_FILE "commondir"
|
|
71
70
|
#define GIT_GITDIR_FILE "gitdir"
|
|
@@ -77,13 +76,13 @@ static int load_global_config(git_config **config);
|
|
|
77
76
|
#define GIT_REPO_VERSION 0
|
|
78
77
|
#define GIT_REPO_MAX_VERSION 1
|
|
79
78
|
|
|
80
|
-
|
|
79
|
+
git_str git_repository__reserved_names_win32[] = {
|
|
81
80
|
{ DOT_GIT, 0, CONST_STRLEN(DOT_GIT) },
|
|
82
81
|
{ GIT_DIR_SHORTNAME, 0, CONST_STRLEN(GIT_DIR_SHORTNAME) }
|
|
83
82
|
};
|
|
84
83
|
size_t git_repository__reserved_names_win32_len = 2;
|
|
85
84
|
|
|
86
|
-
|
|
85
|
+
git_str git_repository__reserved_names_posix[] = {
|
|
87
86
|
{ DOT_GIT, 0, CONST_STRLEN(DOT_GIT) },
|
|
88
87
|
};
|
|
89
88
|
size_t git_repository__reserved_names_posix_len = 1;
|
|
@@ -173,7 +172,7 @@ void git_repository_free(git_repository *repo)
|
|
|
173
172
|
repo->diff_drivers = NULL;
|
|
174
173
|
|
|
175
174
|
for (i = 0; i < repo->reserved_names.size; i++)
|
|
176
|
-
|
|
175
|
+
git_str_dispose(git_array_get(repo->reserved_names, i));
|
|
177
176
|
git_array_clear(repo->reserved_names);
|
|
178
177
|
|
|
179
178
|
git__free(repo->gitlink);
|
|
@@ -189,18 +188,18 @@ void git_repository_free(git_repository *repo)
|
|
|
189
188
|
}
|
|
190
189
|
|
|
191
190
|
/* Check if we have a separate commondir (e.g. we have a worktree) */
|
|
192
|
-
static int lookup_commondir(bool *separate,
|
|
191
|
+
static int lookup_commondir(bool *separate, git_str *commondir, git_str *repository_path)
|
|
193
192
|
{
|
|
194
|
-
|
|
193
|
+
git_str common_link = GIT_STR_INIT;
|
|
195
194
|
int error;
|
|
196
195
|
|
|
197
196
|
/*
|
|
198
197
|
* If there's no commondir file, the repository path is the
|
|
199
198
|
* common path, but it needs a trailing slash.
|
|
200
199
|
*/
|
|
201
|
-
if (!
|
|
202
|
-
if ((error =
|
|
203
|
-
error =
|
|
200
|
+
if (!git_fs_path_contains_file(repository_path, GIT_COMMONDIR_FILE)) {
|
|
201
|
+
if ((error = git_str_set(commondir, repository_path->ptr, repository_path->size)) == 0)
|
|
202
|
+
error = git_fs_path_to_dir(commondir);
|
|
204
203
|
|
|
205
204
|
*separate = false;
|
|
206
205
|
goto done;
|
|
@@ -208,28 +207,28 @@ static int lookup_commondir(bool *separate, git_buf *commondir, git_buf *reposit
|
|
|
208
207
|
|
|
209
208
|
*separate = true;
|
|
210
209
|
|
|
211
|
-
if ((error =
|
|
210
|
+
if ((error = git_str_joinpath(&common_link, repository_path->ptr, GIT_COMMONDIR_FILE)) < 0 ||
|
|
212
211
|
(error = git_futils_readbuffer(&common_link, common_link.ptr)) < 0)
|
|
213
212
|
goto done;
|
|
214
213
|
|
|
215
|
-
|
|
216
|
-
if (
|
|
217
|
-
if ((error =
|
|
214
|
+
git_str_rtrim(&common_link);
|
|
215
|
+
if (git_fs_path_is_relative(common_link.ptr)) {
|
|
216
|
+
if ((error = git_str_joinpath(commondir, repository_path->ptr, common_link.ptr)) < 0)
|
|
218
217
|
goto done;
|
|
219
218
|
} else {
|
|
220
|
-
|
|
219
|
+
git_str_swap(commondir, &common_link);
|
|
221
220
|
}
|
|
222
221
|
|
|
223
|
-
|
|
222
|
+
git_str_dispose(&common_link);
|
|
224
223
|
|
|
225
224
|
/* Make sure the commondir path always has a trailing slash */
|
|
226
|
-
error =
|
|
225
|
+
error = git_fs_path_prettify_dir(commondir, commondir->ptr, NULL);
|
|
227
226
|
|
|
228
227
|
done:
|
|
229
228
|
return error;
|
|
230
229
|
}
|
|
231
230
|
|
|
232
|
-
GIT_INLINE(int) validate_repo_path(
|
|
231
|
+
GIT_INLINE(int) validate_repo_path(git_str *path)
|
|
233
232
|
{
|
|
234
233
|
/*
|
|
235
234
|
* The longest static path in a repository (or commondir) is the
|
|
@@ -241,8 +240,8 @@ GIT_INLINE(int) validate_repo_path(git_buf *path)
|
|
|
241
240
|
CONST_STRLEN("objects/pack/pack-.pack.lock") +
|
|
242
241
|
GIT_OID_HEXSZ;
|
|
243
242
|
|
|
244
|
-
return
|
|
245
|
-
path
|
|
243
|
+
return git_fs_path_validate_str_length_with_suffix(
|
|
244
|
+
path, suffix_len);
|
|
246
245
|
}
|
|
247
246
|
|
|
248
247
|
/*
|
|
@@ -250,7 +249,7 @@ GIT_INLINE(int) validate_repo_path(git_buf *path)
|
|
|
250
249
|
*
|
|
251
250
|
* Open a repository object from its path
|
|
252
251
|
*/
|
|
253
|
-
static int is_valid_repository_path(bool *out,
|
|
252
|
+
static int is_valid_repository_path(bool *out, git_str *repository_path, git_str *common_path)
|
|
254
253
|
{
|
|
255
254
|
bool separate_commondir = false;
|
|
256
255
|
int error;
|
|
@@ -261,13 +260,13 @@ static int is_valid_repository_path(bool *out, git_buf *repository_path, git_buf
|
|
|
261
260
|
return error;
|
|
262
261
|
|
|
263
262
|
/* Ensure HEAD file exists */
|
|
264
|
-
if (
|
|
263
|
+
if (git_fs_path_contains_file(repository_path, GIT_HEAD_FILE) == false)
|
|
265
264
|
return 0;
|
|
266
265
|
|
|
267
266
|
/* Check files in common dir */
|
|
268
|
-
if (
|
|
267
|
+
if (git_fs_path_contains_dir(common_path, GIT_OBJECTS_DIR) == false)
|
|
269
268
|
return 0;
|
|
270
|
-
if (
|
|
269
|
+
if (git_fs_path_contains_dir(common_path, GIT_REFS_DIR) == false)
|
|
271
270
|
return 0;
|
|
272
271
|
|
|
273
272
|
/* Ensure the repo (and commondir) are valid paths */
|
|
@@ -335,12 +334,12 @@ static int load_config_data(git_repository *repo, const git_config *config)
|
|
|
335
334
|
return 0;
|
|
336
335
|
}
|
|
337
336
|
|
|
338
|
-
static int load_workdir(git_repository *repo, git_config *config,
|
|
337
|
+
static int load_workdir(git_repository *repo, git_config *config, git_str *parent_path)
|
|
339
338
|
{
|
|
340
339
|
int error;
|
|
341
340
|
git_config_entry *ce;
|
|
342
|
-
|
|
343
|
-
|
|
341
|
+
git_str worktree = GIT_STR_INIT;
|
|
342
|
+
git_str path = GIT_STR_INIT;
|
|
344
343
|
|
|
345
344
|
if (repo->is_bare)
|
|
346
345
|
return 0;
|
|
@@ -356,38 +355,38 @@ static int load_workdir(git_repository *repo, git_config *config, git_buf *paren
|
|
|
356
355
|
goto cleanup;
|
|
357
356
|
}
|
|
358
357
|
|
|
359
|
-
|
|
358
|
+
git_str_attach(&worktree, gitlink, 0);
|
|
360
359
|
|
|
361
|
-
if ((
|
|
362
|
-
|
|
360
|
+
if ((git_fs_path_dirname_r(&worktree, worktree.ptr)) < 0 ||
|
|
361
|
+
git_fs_path_to_dir(&worktree) < 0) {
|
|
363
362
|
error = -1;
|
|
364
363
|
goto cleanup;
|
|
365
364
|
}
|
|
366
365
|
|
|
367
|
-
repo->workdir =
|
|
366
|
+
repo->workdir = git_str_detach(&worktree);
|
|
368
367
|
}
|
|
369
368
|
else if (ce && ce->value) {
|
|
370
|
-
if ((error =
|
|
369
|
+
if ((error = git_fs_path_prettify_dir(
|
|
371
370
|
&worktree, ce->value, repo->gitdir)) < 0)
|
|
372
371
|
goto cleanup;
|
|
373
372
|
|
|
374
|
-
repo->workdir =
|
|
373
|
+
repo->workdir = git_str_detach(&worktree);
|
|
375
374
|
}
|
|
376
|
-
else if (parent_path &&
|
|
377
|
-
repo->workdir =
|
|
375
|
+
else if (parent_path && git_fs_path_isdir(parent_path->ptr))
|
|
376
|
+
repo->workdir = git_str_detach(parent_path);
|
|
378
377
|
else {
|
|
379
|
-
if (
|
|
380
|
-
|
|
378
|
+
if (git_fs_path_dirname_r(&worktree, repo->gitdir) < 0 ||
|
|
379
|
+
git_fs_path_to_dir(&worktree) < 0) {
|
|
381
380
|
error = -1;
|
|
382
381
|
goto cleanup;
|
|
383
382
|
}
|
|
384
383
|
|
|
385
|
-
repo->workdir =
|
|
384
|
+
repo->workdir = git_str_detach(&worktree);
|
|
386
385
|
}
|
|
387
386
|
|
|
388
387
|
GIT_ERROR_CHECK_ALLOC(repo->workdir);
|
|
389
388
|
cleanup:
|
|
390
|
-
|
|
389
|
+
git_str_dispose(&path);
|
|
391
390
|
git_config_entry_free(ce);
|
|
392
391
|
return error;
|
|
393
392
|
}
|
|
@@ -396,7 +395,7 @@ cleanup:
|
|
|
396
395
|
* This function returns furthest offset into path where a ceiling dir
|
|
397
396
|
* is found, so we can stop processing the path at that point.
|
|
398
397
|
*
|
|
399
|
-
* Note: converting this to use
|
|
398
|
+
* Note: converting this to use git_strs instead of GIT_PATH_MAX buffers on
|
|
400
399
|
* the stack could remove directories name limits, but at the cost of doing
|
|
401
400
|
* repeated malloc/frees inside the loop below, so let's not do it now.
|
|
402
401
|
*/
|
|
@@ -411,7 +410,7 @@ static size_t find_ceiling_dir_offset(
|
|
|
411
410
|
|
|
412
411
|
GIT_ASSERT_ARG(path);
|
|
413
412
|
|
|
414
|
-
min_len = (size_t)(
|
|
413
|
+
min_len = (size_t)(git_fs_path_root(path) + 1);
|
|
415
414
|
|
|
416
415
|
if (ceiling_directories == NULL || min_len == 0)
|
|
417
416
|
return min_len;
|
|
@@ -420,7 +419,7 @@ static size_t find_ceiling_dir_offset(
|
|
|
420
419
|
for (sep = ceil; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++);
|
|
421
420
|
len = sep - ceil;
|
|
422
421
|
|
|
423
|
-
if (len == 0 || len >= sizeof(buf) ||
|
|
422
|
+
if (len == 0 || len >= sizeof(buf) || git_fs_path_root(ceil) == -1)
|
|
424
423
|
continue;
|
|
425
424
|
|
|
426
425
|
strncpy(buf, ceil, len);
|
|
@@ -449,10 +448,10 @@ static size_t find_ceiling_dir_offset(
|
|
|
449
448
|
* it points to. Before calling, set `path_out` to the base directory that
|
|
450
449
|
* should be used if the contents of `file_path` are a relative path.
|
|
451
450
|
*/
|
|
452
|
-
static int read_gitfile(
|
|
451
|
+
static int read_gitfile(git_str *path_out, const char *file_path)
|
|
453
452
|
{
|
|
454
453
|
int error = 0;
|
|
455
|
-
|
|
454
|
+
git_str file = GIT_STR_INIT;
|
|
456
455
|
size_t prefix_len = strlen(GIT_FILE_CONTENT_PREFIX);
|
|
457
456
|
|
|
458
457
|
GIT_ASSERT_ARG(path_out);
|
|
@@ -461,151 +460,41 @@ static int read_gitfile(git_buf *path_out, const char *file_path)
|
|
|
461
460
|
if (git_futils_readbuffer(&file, file_path) < 0)
|
|
462
461
|
return -1;
|
|
463
462
|
|
|
464
|
-
|
|
463
|
+
git_str_rtrim(&file);
|
|
465
464
|
/* apparently on Windows, some people use backslashes in paths */
|
|
466
|
-
|
|
465
|
+
git_fs_path_mkposix(file.ptr);
|
|
467
466
|
|
|
468
|
-
if (
|
|
469
|
-
memcmp(
|
|
467
|
+
if (git_str_len(&file) <= prefix_len ||
|
|
468
|
+
memcmp(git_str_cstr(&file), GIT_FILE_CONTENT_PREFIX, prefix_len) != 0)
|
|
470
469
|
{
|
|
471
470
|
git_error_set(GIT_ERROR_REPOSITORY,
|
|
472
471
|
"the `.git` file at '%s' is malformed", file_path);
|
|
473
472
|
error = -1;
|
|
474
473
|
}
|
|
475
|
-
else if ((error =
|
|
476
|
-
const char *gitlink =
|
|
474
|
+
else if ((error = git_fs_path_dirname_r(path_out, file_path)) >= 0) {
|
|
475
|
+
const char *gitlink = git_str_cstr(&file) + prefix_len;
|
|
477
476
|
while (*gitlink && git__isspace(*gitlink)) gitlink++;
|
|
478
477
|
|
|
479
|
-
error =
|
|
480
|
-
path_out, gitlink,
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
git_buf_dispose(&file);
|
|
484
|
-
return error;
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
typedef struct {
|
|
488
|
-
const char *repo_path;
|
|
489
|
-
git_buf tmp;
|
|
490
|
-
bool *is_safe;
|
|
491
|
-
} validate_ownership_data;
|
|
492
|
-
|
|
493
|
-
static int validate_ownership_cb(const git_config_entry *entry, void *payload)
|
|
494
|
-
{
|
|
495
|
-
validate_ownership_data *data = payload;
|
|
496
|
-
|
|
497
|
-
if (strcmp(entry->value, "") == 0)
|
|
498
|
-
*data->is_safe = false;
|
|
499
|
-
|
|
500
|
-
if (git_path_prettify_dir(&data->tmp, entry->value, NULL) == 0 &&
|
|
501
|
-
strcmp(data->tmp.ptr, data->repo_path) == 0)
|
|
502
|
-
*data->is_safe = true;
|
|
503
|
-
|
|
504
|
-
return 0;
|
|
505
|
-
}
|
|
506
|
-
|
|
507
|
-
static int validate_ownership_config(bool *is_safe, const char *path)
|
|
508
|
-
{
|
|
509
|
-
validate_ownership_data ownership_data = {
|
|
510
|
-
path, GIT_BUF_INIT, is_safe
|
|
511
|
-
};
|
|
512
|
-
git_config *config;
|
|
513
|
-
int error;
|
|
514
|
-
|
|
515
|
-
if (load_global_config(&config) != 0)
|
|
516
|
-
return 0;
|
|
517
|
-
|
|
518
|
-
error = git_config_get_multivar_foreach(config,
|
|
519
|
-
"safe.directory", NULL,
|
|
520
|
-
validate_ownership_cb,
|
|
521
|
-
&ownership_data);
|
|
522
|
-
|
|
523
|
-
git_config_free(config);
|
|
524
|
-
git_buf_dispose(&ownership_data.tmp);
|
|
525
|
-
|
|
526
|
-
return error;
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
static int validate_ownership_path(bool *is_safe, const char *path)
|
|
530
|
-
{
|
|
531
|
-
git_path_owner_t owner_level =
|
|
532
|
-
GIT_PATH_OWNER_CURRENT_USER |
|
|
533
|
-
GIT_PATH_USER_IS_ADMINISTRATOR |
|
|
534
|
-
GIT_PATH_OWNER_RUNNING_SUDO;
|
|
535
|
-
int error = 0;
|
|
536
|
-
|
|
537
|
-
if (path)
|
|
538
|
-
error = git_path_owner_is(is_safe, path, owner_level);
|
|
539
|
-
|
|
540
|
-
if (error == GIT_ENOTFOUND) {
|
|
541
|
-
*is_safe = true;
|
|
542
|
-
error = 0;
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
return error;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
static int validate_ownership(git_repository *repo)
|
|
549
|
-
{
|
|
550
|
-
const char *validation_paths[3] = { NULL }, *path;
|
|
551
|
-
size_t validation_len = 0, i;
|
|
552
|
-
bool is_safe = false;
|
|
553
|
-
int error = 0;
|
|
554
|
-
|
|
555
|
-
/*
|
|
556
|
-
* If there's a worktree, validate the permissions to it *and*
|
|
557
|
-
* the git directory, and use the worktree as the configuration
|
|
558
|
-
* key for allowlisting the directory. In a bare setup, only
|
|
559
|
-
* look at the gitdir and use that as the allowlist. So we
|
|
560
|
-
* examine all `validation_paths` but use only the first as
|
|
561
|
-
* the configuration lookup.
|
|
562
|
-
*/
|
|
563
|
-
|
|
564
|
-
if (repo->workdir)
|
|
565
|
-
validation_paths[validation_len++] = repo->workdir;
|
|
566
|
-
|
|
567
|
-
if (repo->gitlink)
|
|
568
|
-
validation_paths[validation_len++] = repo->gitlink;
|
|
569
|
-
|
|
570
|
-
validation_paths[validation_len++] = repo->gitdir;
|
|
571
|
-
|
|
572
|
-
for (i = 0; i < validation_len; i++) {
|
|
573
|
-
path = validation_paths[i];
|
|
574
|
-
|
|
575
|
-
if ((error = validate_ownership_path(&is_safe, path)) < 0)
|
|
576
|
-
goto done;
|
|
577
|
-
|
|
578
|
-
if (!is_safe)
|
|
579
|
-
break;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
if (is_safe ||
|
|
583
|
-
(error = validate_ownership_config(&is_safe, validation_paths[0])) < 0)
|
|
584
|
-
goto done;
|
|
585
|
-
|
|
586
|
-
if (!is_safe) {
|
|
587
|
-
git_error_set(GIT_ERROR_CONFIG,
|
|
588
|
-
"repository path '%s' is not owned by current user",
|
|
589
|
-
path);
|
|
590
|
-
error = GIT_EOWNER;
|
|
478
|
+
error = git_fs_path_prettify_dir(
|
|
479
|
+
path_out, gitlink, git_str_cstr(path_out));
|
|
591
480
|
}
|
|
592
481
|
|
|
593
|
-
|
|
482
|
+
git_str_dispose(&file);
|
|
594
483
|
return error;
|
|
595
484
|
}
|
|
596
485
|
|
|
597
486
|
static int find_repo(
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
487
|
+
git_str *gitdir_path,
|
|
488
|
+
git_str *workdir_path,
|
|
489
|
+
git_str *gitlink_path,
|
|
490
|
+
git_str *commondir_path,
|
|
602
491
|
const char *start_path,
|
|
603
492
|
uint32_t flags,
|
|
604
493
|
const char *ceiling_dirs)
|
|
605
494
|
{
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
495
|
+
git_str path = GIT_STR_INIT;
|
|
496
|
+
git_str repo_link = GIT_STR_INIT;
|
|
497
|
+
git_str common_link = GIT_STR_INIT;
|
|
609
498
|
struct stat st;
|
|
610
499
|
dev_t initial_device = 0;
|
|
611
500
|
int min_iterations;
|
|
@@ -613,9 +502,9 @@ static int find_repo(
|
|
|
613
502
|
size_t ceiling_offset = 0;
|
|
614
503
|
int error;
|
|
615
504
|
|
|
616
|
-
|
|
505
|
+
git_str_clear(gitdir_path);
|
|
617
506
|
|
|
618
|
-
error =
|
|
507
|
+
error = git_fs_path_prettify(&path, start_path, NULL);
|
|
619
508
|
if (error < 0)
|
|
620
509
|
return error;
|
|
621
510
|
|
|
@@ -637,7 +526,7 @@ static int find_repo(
|
|
|
637
526
|
for (;;) {
|
|
638
527
|
if (!(flags & GIT_REPOSITORY_OPEN_NO_DOTGIT)) {
|
|
639
528
|
if (!in_dot_git) {
|
|
640
|
-
if ((error =
|
|
529
|
+
if ((error = git_str_joinpath(&path, path.ptr, DOT_GIT)) < 0)
|
|
641
530
|
goto out;
|
|
642
531
|
}
|
|
643
532
|
in_dot_git = !in_dot_git;
|
|
@@ -656,15 +545,15 @@ static int find_repo(
|
|
|
656
545
|
goto out;
|
|
657
546
|
|
|
658
547
|
if (is_valid) {
|
|
659
|
-
if ((error =
|
|
660
|
-
(error =
|
|
548
|
+
if ((error = git_fs_path_to_dir(&path)) < 0 ||
|
|
549
|
+
(error = git_str_set(gitdir_path, path.ptr, path.size)) < 0)
|
|
661
550
|
goto out;
|
|
662
551
|
|
|
663
552
|
if (gitlink_path)
|
|
664
|
-
if ((error =
|
|
553
|
+
if ((error = git_str_attach(gitlink_path, git_worktree__read_link(path.ptr, GIT_GITDIR_FILE), 0)) < 0)
|
|
665
554
|
goto out;
|
|
666
555
|
if (commondir_path)
|
|
667
|
-
|
|
556
|
+
git_str_swap(&common_link, commondir_path);
|
|
668
557
|
|
|
669
558
|
break;
|
|
670
559
|
}
|
|
@@ -674,13 +563,13 @@ static int find_repo(
|
|
|
674
563
|
goto out;
|
|
675
564
|
|
|
676
565
|
if (is_valid) {
|
|
677
|
-
|
|
566
|
+
git_str_swap(gitdir_path, &repo_link);
|
|
678
567
|
|
|
679
568
|
if (gitlink_path)
|
|
680
|
-
if ((error =
|
|
569
|
+
if ((error = git_str_put(gitlink_path, path.ptr, path.size)) < 0)
|
|
681
570
|
goto out;
|
|
682
571
|
if (commondir_path)
|
|
683
|
-
|
|
572
|
+
git_str_swap(&common_link, commondir_path);
|
|
684
573
|
}
|
|
685
574
|
break;
|
|
686
575
|
}
|
|
@@ -689,7 +578,7 @@ static int find_repo(
|
|
|
689
578
|
/* Move up one directory. If we're in_dot_git, we'll search the
|
|
690
579
|
* parent itself next. If we're !in_dot_git, we'll search .git
|
|
691
580
|
* in the parent directory next (added at the top of the loop). */
|
|
692
|
-
if ((error =
|
|
581
|
+
if ((error = git_fs_path_dirname_r(&path, path.ptr)) < 0)
|
|
693
582
|
goto out;
|
|
694
583
|
|
|
695
584
|
/* Once we've checked the directory (and .git if applicable),
|
|
@@ -704,25 +593,25 @@ static int find_repo(
|
|
|
704
593
|
}
|
|
705
594
|
|
|
706
595
|
if (workdir_path && !(flags & GIT_REPOSITORY_OPEN_BARE)) {
|
|
707
|
-
if (!
|
|
708
|
-
|
|
709
|
-
else if ((error =
|
|
710
|
-
(error =
|
|
596
|
+
if (!git_str_len(gitdir_path))
|
|
597
|
+
git_str_clear(workdir_path);
|
|
598
|
+
else if ((error = git_fs_path_dirname_r(workdir_path, path.ptr)) < 0 ||
|
|
599
|
+
(error = git_fs_path_to_dir(workdir_path)) < 0)
|
|
711
600
|
goto out;
|
|
712
601
|
}
|
|
713
602
|
|
|
714
603
|
/* If we didn't find the repository, and we don't have any other error
|
|
715
604
|
* to report, report that. */
|
|
716
|
-
if (!
|
|
605
|
+
if (!git_str_len(gitdir_path)) {
|
|
717
606
|
git_error_set(GIT_ERROR_REPOSITORY, "could not find repository from '%s'", start_path);
|
|
718
607
|
error = GIT_ENOTFOUND;
|
|
719
608
|
goto out;
|
|
720
609
|
}
|
|
721
610
|
|
|
722
611
|
out:
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
612
|
+
git_str_dispose(&path);
|
|
613
|
+
git_str_dispose(&repo_link);
|
|
614
|
+
git_str_dispose(&common_link);
|
|
726
615
|
return error;
|
|
727
616
|
}
|
|
728
617
|
|
|
@@ -730,18 +619,18 @@ int git_repository_open_bare(
|
|
|
730
619
|
git_repository **repo_ptr,
|
|
731
620
|
const char *bare_path)
|
|
732
621
|
{
|
|
733
|
-
|
|
622
|
+
git_str path = GIT_STR_INIT, common_path = GIT_STR_INIT;
|
|
734
623
|
git_repository *repo = NULL;
|
|
735
624
|
bool is_valid;
|
|
736
625
|
int error;
|
|
737
626
|
|
|
738
|
-
if ((error =
|
|
627
|
+
if ((error = git_fs_path_prettify_dir(&path, bare_path, NULL)) < 0 ||
|
|
739
628
|
(error = is_valid_repository_path(&is_valid, &path, &common_path)) < 0)
|
|
740
629
|
return error;
|
|
741
630
|
|
|
742
631
|
if (!is_valid) {
|
|
743
|
-
|
|
744
|
-
|
|
632
|
+
git_str_dispose(&path);
|
|
633
|
+
git_str_dispose(&common_path);
|
|
745
634
|
git_error_set(GIT_ERROR_REPOSITORY, "path is not a repository: %s", bare_path);
|
|
746
635
|
return GIT_ENOTFOUND;
|
|
747
636
|
}
|
|
@@ -749,9 +638,9 @@ int git_repository_open_bare(
|
|
|
749
638
|
repo = repository_alloc();
|
|
750
639
|
GIT_ERROR_CHECK_ALLOC(repo);
|
|
751
640
|
|
|
752
|
-
repo->gitdir =
|
|
641
|
+
repo->gitdir = git_str_detach(&path);
|
|
753
642
|
GIT_ERROR_CHECK_ALLOC(repo->gitdir);
|
|
754
|
-
repo->commondir =
|
|
643
|
+
repo->commondir = git_str_detach(&common_path);
|
|
755
644
|
GIT_ERROR_CHECK_ALLOC(repo->commondir);
|
|
756
645
|
|
|
757
646
|
/* of course we're bare! */
|
|
@@ -770,15 +659,15 @@ static int _git_repository_open_ext_from_env(
|
|
|
770
659
|
git_repository *repo = NULL;
|
|
771
660
|
git_index *index = NULL;
|
|
772
661
|
git_odb *odb = NULL;
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
662
|
+
git_str dir_buf = GIT_STR_INIT;
|
|
663
|
+
git_str ceiling_dirs_buf = GIT_STR_INIT;
|
|
664
|
+
git_str across_fs_buf = GIT_STR_INIT;
|
|
665
|
+
git_str index_file_buf = GIT_STR_INIT;
|
|
666
|
+
git_str namespace_buf = GIT_STR_INIT;
|
|
667
|
+
git_str object_dir_buf = GIT_STR_INIT;
|
|
668
|
+
git_str alts_buf = GIT_STR_INIT;
|
|
669
|
+
git_str work_tree_buf = GIT_STR_INIT;
|
|
670
|
+
git_str common_dir_buf = GIT_STR_INIT;
|
|
782
671
|
const char *ceiling_dirs = NULL;
|
|
783
672
|
unsigned flags = 0;
|
|
784
673
|
int error;
|
|
@@ -791,7 +680,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
791
680
|
} else if (error < 0)
|
|
792
681
|
goto error;
|
|
793
682
|
else {
|
|
794
|
-
start_path =
|
|
683
|
+
start_path = git_str_cstr(&dir_buf);
|
|
795
684
|
flags |= GIT_REPOSITORY_OPEN_NO_SEARCH;
|
|
796
685
|
flags |= GIT_REPOSITORY_OPEN_NO_DOTGIT;
|
|
797
686
|
}
|
|
@@ -803,7 +692,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
803
692
|
else if (error < 0)
|
|
804
693
|
goto error;
|
|
805
694
|
else
|
|
806
|
-
ceiling_dirs =
|
|
695
|
+
ceiling_dirs = git_str_cstr(&ceiling_dirs_buf);
|
|
807
696
|
|
|
808
697
|
error = git__getenv(&across_fs_buf, "GIT_DISCOVERY_ACROSS_FILESYSTEM");
|
|
809
698
|
if (error == GIT_ENOTFOUND)
|
|
@@ -812,7 +701,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
812
701
|
goto error;
|
|
813
702
|
else {
|
|
814
703
|
int across_fs = 0;
|
|
815
|
-
error = git_config_parse_bool(&across_fs,
|
|
704
|
+
error = git_config_parse_bool(&across_fs, git_str_cstr(&across_fs_buf));
|
|
816
705
|
if (error < 0)
|
|
817
706
|
goto error;
|
|
818
707
|
if (across_fs)
|
|
@@ -825,7 +714,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
825
714
|
else if (error < 0)
|
|
826
715
|
goto error;
|
|
827
716
|
else {
|
|
828
|
-
error = git_index_open(&index,
|
|
717
|
+
error = git_index_open(&index, git_str_cstr(&index_file_buf));
|
|
829
718
|
if (error < 0)
|
|
830
719
|
goto error;
|
|
831
720
|
}
|
|
@@ -842,7 +731,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
842
731
|
else if (error < 0)
|
|
843
732
|
goto error;
|
|
844
733
|
else {
|
|
845
|
-
error = git_odb_open(&odb,
|
|
734
|
+
error = git_odb_open(&odb, git_str_cstr(&object_dir_buf));
|
|
846
735
|
if (error < 0)
|
|
847
736
|
goto error;
|
|
848
737
|
}
|
|
@@ -891,7 +780,7 @@ static int _git_repository_open_ext_from_env(
|
|
|
891
780
|
goto error;
|
|
892
781
|
}
|
|
893
782
|
|
|
894
|
-
end =
|
|
783
|
+
end = git_str_cstr(&alts_buf) + git_str_len(&alts_buf);
|
|
895
784
|
for (sep = alt = alts_buf.ptr; sep != end; alt = sep+1) {
|
|
896
785
|
for (sep = alt; *sep && *sep != GIT_PATH_LIST_SEPARATOR; sep++)
|
|
897
786
|
;
|
|
@@ -903,8 +792,8 @@ static int _git_repository_open_ext_from_env(
|
|
|
903
792
|
}
|
|
904
793
|
}
|
|
905
794
|
|
|
906
|
-
if (
|
|
907
|
-
error = git_repository_set_namespace(repo,
|
|
795
|
+
if (git_str_len(&namespace_buf)) {
|
|
796
|
+
error = git_repository_set_namespace(repo, git_str_cstr(&namespace_buf));
|
|
908
797
|
if (error < 0)
|
|
909
798
|
goto error;
|
|
910
799
|
}
|
|
@@ -920,21 +809,21 @@ error:
|
|
|
920
809
|
success:
|
|
921
810
|
git_odb_free(odb);
|
|
922
811
|
git_index_free(index);
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
812
|
+
git_str_dispose(&common_dir_buf);
|
|
813
|
+
git_str_dispose(&work_tree_buf);
|
|
814
|
+
git_str_dispose(&alts_buf);
|
|
815
|
+
git_str_dispose(&object_dir_buf);
|
|
816
|
+
git_str_dispose(&namespace_buf);
|
|
817
|
+
git_str_dispose(&index_file_buf);
|
|
818
|
+
git_str_dispose(&across_fs_buf);
|
|
819
|
+
git_str_dispose(&ceiling_dirs_buf);
|
|
820
|
+
git_str_dispose(&dir_buf);
|
|
932
821
|
return error;
|
|
933
822
|
}
|
|
934
823
|
|
|
935
824
|
static int repo_is_worktree(unsigned *out, const git_repository *repo)
|
|
936
825
|
{
|
|
937
|
-
|
|
826
|
+
git_str gitdir_link = GIT_STR_INIT;
|
|
938
827
|
int error;
|
|
939
828
|
|
|
940
829
|
/* Worktrees cannot have the same commondir and gitdir */
|
|
@@ -944,14 +833,14 @@ static int repo_is_worktree(unsigned *out, const git_repository *repo)
|
|
|
944
833
|
return 0;
|
|
945
834
|
}
|
|
946
835
|
|
|
947
|
-
if ((error =
|
|
836
|
+
if ((error = git_str_joinpath(&gitdir_link, repo->gitdir, "gitdir")) < 0)
|
|
948
837
|
return -1;
|
|
949
838
|
|
|
950
839
|
/* A 'gitdir' file inside a git directory is currently
|
|
951
840
|
* only used when the repository is a working tree. */
|
|
952
|
-
*out = !!
|
|
841
|
+
*out = !!git_fs_path_exists(gitdir_link.ptr);
|
|
953
842
|
|
|
954
|
-
|
|
843
|
+
git_str_dispose(&gitdir_link);
|
|
955
844
|
return error;
|
|
956
845
|
}
|
|
957
846
|
|
|
@@ -963,8 +852,8 @@ int git_repository_open_ext(
|
|
|
963
852
|
{
|
|
964
853
|
int error;
|
|
965
854
|
unsigned is_worktree;
|
|
966
|
-
|
|
967
|
-
gitlink =
|
|
855
|
+
git_str gitdir = GIT_STR_INIT, workdir = GIT_STR_INIT,
|
|
856
|
+
gitlink = GIT_STR_INIT, commondir = GIT_STR_INIT;
|
|
968
857
|
git_repository *repo = NULL;
|
|
969
858
|
git_config *config = NULL;
|
|
970
859
|
int version = 0;
|
|
@@ -984,15 +873,15 @@ int git_repository_open_ext(
|
|
|
984
873
|
repo = repository_alloc();
|
|
985
874
|
GIT_ERROR_CHECK_ALLOC(repo);
|
|
986
875
|
|
|
987
|
-
repo->gitdir =
|
|
876
|
+
repo->gitdir = git_str_detach(&gitdir);
|
|
988
877
|
GIT_ERROR_CHECK_ALLOC(repo->gitdir);
|
|
989
878
|
|
|
990
879
|
if (gitlink.size) {
|
|
991
|
-
repo->gitlink =
|
|
880
|
+
repo->gitlink = git_str_detach(&gitlink);
|
|
992
881
|
GIT_ERROR_CHECK_ALLOC(repo->gitlink);
|
|
993
882
|
}
|
|
994
883
|
if (commondir.size) {
|
|
995
|
-
repo->commondir =
|
|
884
|
+
repo->commondir = git_str_detach(&commondir);
|
|
996
885
|
GIT_ERROR_CHECK_ALLOC(repo->commondir);
|
|
997
886
|
}
|
|
998
887
|
|
|
@@ -1015,28 +904,21 @@ int git_repository_open_ext(
|
|
|
1015
904
|
if ((error = check_extensions(config, version)) < 0)
|
|
1016
905
|
goto cleanup;
|
|
1017
906
|
|
|
1018
|
-
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0)
|
|
907
|
+
if ((flags & GIT_REPOSITORY_OPEN_BARE) != 0)
|
|
1019
908
|
repo->is_bare = 1;
|
|
1020
|
-
|
|
909
|
+
else {
|
|
910
|
+
|
|
1021
911
|
if (config &&
|
|
1022
912
|
((error = load_config_data(repo, config)) < 0 ||
|
|
1023
913
|
(error = load_workdir(repo, config, &workdir)) < 0))
|
|
1024
914
|
goto cleanup;
|
|
1025
915
|
}
|
|
1026
916
|
|
|
1027
|
-
/*
|
|
1028
|
-
* Ensure that the git directory and worktree are
|
|
1029
|
-
* owned by the current user.
|
|
1030
|
-
*/
|
|
1031
|
-
if (git_repository__validate_ownership &&
|
|
1032
|
-
(error = validate_ownership(repo)) < 0)
|
|
1033
|
-
goto cleanup;
|
|
1034
|
-
|
|
1035
917
|
cleanup:
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
918
|
+
git_str_dispose(&gitdir);
|
|
919
|
+
git_str_dispose(&workdir);
|
|
920
|
+
git_str_dispose(&gitlink);
|
|
921
|
+
git_str_dispose(&commondir);
|
|
1040
922
|
git_config_free(config);
|
|
1041
923
|
|
|
1042
924
|
if (error < 0)
|
|
@@ -1055,7 +937,7 @@ int git_repository_open(git_repository **repo_out, const char *path)
|
|
|
1055
937
|
|
|
1056
938
|
int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *wt)
|
|
1057
939
|
{
|
|
1058
|
-
|
|
940
|
+
git_str path = GIT_STR_INIT;
|
|
1059
941
|
git_repository *repo = NULL;
|
|
1060
942
|
size_t len;
|
|
1061
943
|
int err;
|
|
@@ -1071,7 +953,7 @@ int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *w
|
|
|
1071
953
|
goto out;
|
|
1072
954
|
}
|
|
1073
955
|
|
|
1074
|
-
if ((err =
|
|
956
|
+
if ((err = git_str_set(&path, wt->gitlink_path, len - 4)) < 0)
|
|
1075
957
|
goto out;
|
|
1076
958
|
|
|
1077
959
|
if ((err = git_repository_open(&repo, path.ptr)) < 0)
|
|
@@ -1080,7 +962,7 @@ int git_repository_open_from_worktree(git_repository **repo_out, git_worktree *w
|
|
|
1080
962
|
*repo_out = repo;
|
|
1081
963
|
|
|
1082
964
|
out:
|
|
1083
|
-
|
|
965
|
+
git_str_dispose(&path);
|
|
1084
966
|
|
|
1085
967
|
return err;
|
|
1086
968
|
}
|
|
@@ -1105,14 +987,10 @@ int git_repository_discover(
|
|
|
1105
987
|
const char *ceiling_dirs)
|
|
1106
988
|
{
|
|
1107
989
|
uint32_t flags = across_fs ? GIT_REPOSITORY_OPEN_CROSS_FS : 0;
|
|
1108
|
-
int error;
|
|
1109
990
|
|
|
1110
991
|
GIT_ASSERT_ARG(start_path);
|
|
1111
992
|
|
|
1112
|
-
|
|
1113
|
-
return error;
|
|
1114
|
-
|
|
1115
|
-
return find_repo(out, NULL, NULL, NULL, start_path, flags, ceiling_dirs);
|
|
993
|
+
GIT_BUF_WRAP_PRIVATE(out, find_repo, NULL, NULL, NULL, start_path, flags, ceiling_dirs);
|
|
1116
994
|
}
|
|
1117
995
|
|
|
1118
996
|
static int load_config(
|
|
@@ -1124,7 +1002,7 @@ static int load_config(
|
|
|
1124
1002
|
const char *programdata_path)
|
|
1125
1003
|
{
|
|
1126
1004
|
int error;
|
|
1127
|
-
|
|
1005
|
+
git_str config_path = GIT_STR_INIT;
|
|
1128
1006
|
git_config *cfg = NULL;
|
|
1129
1007
|
|
|
1130
1008
|
GIT_ASSERT_ARG(out);
|
|
@@ -1133,13 +1011,13 @@ static int load_config(
|
|
|
1133
1011
|
return error;
|
|
1134
1012
|
|
|
1135
1013
|
if (repo) {
|
|
1136
|
-
if ((error =
|
|
1014
|
+
if ((error = git_repository__item_path(&config_path, repo, GIT_REPOSITORY_ITEM_CONFIG)) == 0)
|
|
1137
1015
|
error = git_config_add_file_ondisk(cfg, config_path.ptr, GIT_CONFIG_LEVEL_LOCAL, repo, 0);
|
|
1138
1016
|
|
|
1139
1017
|
if (error && error != GIT_ENOTFOUND)
|
|
1140
1018
|
goto on_error;
|
|
1141
1019
|
|
|
1142
|
-
|
|
1020
|
+
git_str_dispose(&config_path);
|
|
1143
1021
|
}
|
|
1144
1022
|
|
|
1145
1023
|
if (global_config_path != NULL &&
|
|
@@ -1172,15 +1050,15 @@ static int load_config(
|
|
|
1172
1050
|
return 0;
|
|
1173
1051
|
|
|
1174
1052
|
on_error:
|
|
1175
|
-
|
|
1053
|
+
git_str_dispose(&config_path);
|
|
1176
1054
|
git_config_free(cfg);
|
|
1177
1055
|
*out = NULL;
|
|
1178
1056
|
return error;
|
|
1179
1057
|
}
|
|
1180
1058
|
|
|
1181
|
-
static const char *path_unless_empty(
|
|
1059
|
+
static const char *path_unless_empty(git_str *buf)
|
|
1182
1060
|
{
|
|
1183
|
-
return
|
|
1061
|
+
return git_str_len(buf) > 0 ? git_str_cstr(buf) : NULL;
|
|
1184
1062
|
}
|
|
1185
1063
|
|
|
1186
1064
|
int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
|
@@ -1188,19 +1066,19 @@ int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
|
|
1188
1066
|
int error = 0;
|
|
1189
1067
|
|
|
1190
1068
|
if (repo->_config == NULL) {
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1069
|
+
git_str global_buf = GIT_STR_INIT;
|
|
1070
|
+
git_str xdg_buf = GIT_STR_INIT;
|
|
1071
|
+
git_str system_buf = GIT_STR_INIT;
|
|
1072
|
+
git_str programdata_buf = GIT_STR_INIT;
|
|
1195
1073
|
git_config *config;
|
|
1196
1074
|
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1075
|
+
git_config__find_global(&global_buf);
|
|
1076
|
+
git_config__find_xdg(&xdg_buf);
|
|
1077
|
+
git_config__find_system(&system_buf);
|
|
1078
|
+
git_config__find_programdata(&programdata_buf);
|
|
1201
1079
|
|
|
1202
1080
|
/* If there is no global file, open a backend for it anyway */
|
|
1203
|
-
if (
|
|
1081
|
+
if (git_str_len(&global_buf) == 0)
|
|
1204
1082
|
git_config__global_location(&global_buf);
|
|
1205
1083
|
|
|
1206
1084
|
error = load_config(
|
|
@@ -1218,10 +1096,10 @@ int git_repository_config__weakptr(git_config **out, git_repository *repo)
|
|
|
1218
1096
|
}
|
|
1219
1097
|
}
|
|
1220
1098
|
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1099
|
+
git_str_dispose(&global_buf);
|
|
1100
|
+
git_str_dispose(&xdg_buf);
|
|
1101
|
+
git_str_dispose(&system_buf);
|
|
1102
|
+
git_str_dispose(&programdata_buf);
|
|
1225
1103
|
}
|
|
1226
1104
|
|
|
1227
1105
|
*out = repo->_config;
|
|
@@ -1266,10 +1144,10 @@ int git_repository_odb__weakptr(git_odb **out, git_repository *repo)
|
|
|
1266
1144
|
|
|
1267
1145
|
*out = git_atomic_load(repo->_odb);
|
|
1268
1146
|
if (*out == NULL) {
|
|
1269
|
-
|
|
1147
|
+
git_str odb_path = GIT_STR_INIT;
|
|
1270
1148
|
git_odb *odb;
|
|
1271
1149
|
|
|
1272
|
-
if ((error =
|
|
1150
|
+
if ((error = git_repository__item_path(&odb_path, repo,
|
|
1273
1151
|
GIT_REPOSITORY_ITEM_OBJECTS)) < 0 ||
|
|
1274
1152
|
(error = git_odb_new(&odb)) < 0)
|
|
1275
1153
|
return error;
|
|
@@ -1287,7 +1165,7 @@ int git_repository_odb__weakptr(git_odb **out, git_repository *repo)
|
|
|
1287
1165
|
git_odb_free(odb);
|
|
1288
1166
|
}
|
|
1289
1167
|
|
|
1290
|
-
|
|
1168
|
+
git_str_dispose(&odb_path);
|
|
1291
1169
|
*out = git_atomic_load(repo->_odb);
|
|
1292
1170
|
}
|
|
1293
1171
|
|
|
@@ -1363,10 +1241,10 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
|
|
1363
1241
|
GIT_ASSERT_ARG(repo);
|
|
1364
1242
|
|
|
1365
1243
|
if (repo->_index == NULL) {
|
|
1366
|
-
|
|
1244
|
+
git_str index_path = GIT_STR_INIT;
|
|
1367
1245
|
git_index *index;
|
|
1368
1246
|
|
|
1369
|
-
if ((error =
|
|
1247
|
+
if ((error = git_str_joinpath(&index_path, repo->gitdir, GIT_INDEX_FILE)) < 0)
|
|
1370
1248
|
return error;
|
|
1371
1249
|
|
|
1372
1250
|
error = git_index_open(&index, index_path.ptr);
|
|
@@ -1382,7 +1260,7 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo)
|
|
|
1382
1260
|
GIT_INDEX_CAPABILITY_FROM_OWNER);
|
|
1383
1261
|
}
|
|
1384
1262
|
|
|
1385
|
-
|
|
1263
|
+
git_str_dispose(&index_path);
|
|
1386
1264
|
}
|
|
1387
1265
|
|
|
1388
1266
|
*out = repo->_index;
|
|
@@ -1430,7 +1308,7 @@ static int reserved_names_add8dot3(git_repository *repo, const char *path)
|
|
|
1430
1308
|
const char *def_dot_git = DOT_GIT;
|
|
1431
1309
|
size_t name_len, def_len = CONST_STRLEN(GIT_DIR_SHORTNAME);
|
|
1432
1310
|
size_t def_dot_git_len = CONST_STRLEN(DOT_GIT);
|
|
1433
|
-
|
|
1311
|
+
git_str *buf;
|
|
1434
1312
|
|
|
1435
1313
|
if (!name)
|
|
1436
1314
|
return 0;
|
|
@@ -1446,17 +1324,17 @@ static int reserved_names_add8dot3(git_repository *repo, const char *path)
|
|
|
1446
1324
|
if ((buf = git_array_alloc(repo->reserved_names)) == NULL)
|
|
1447
1325
|
return -1;
|
|
1448
1326
|
|
|
1449
|
-
|
|
1327
|
+
git_str_attach(buf, name, name_len);
|
|
1450
1328
|
return true;
|
|
1451
1329
|
}
|
|
1452
1330
|
|
|
1453
1331
|
bool git_repository__reserved_names(
|
|
1454
|
-
|
|
1332
|
+
git_str **out, size_t *outlen, git_repository *repo, bool include_ntfs)
|
|
1455
1333
|
{
|
|
1456
1334
|
GIT_UNUSED(include_ntfs);
|
|
1457
1335
|
|
|
1458
1336
|
if (repo->reserved_names.size == 0) {
|
|
1459
|
-
|
|
1337
|
+
git_str *buf;
|
|
1460
1338
|
size_t i;
|
|
1461
1339
|
|
|
1462
1340
|
/* Add the static defaults */
|
|
@@ -1508,7 +1386,7 @@ on_error:
|
|
|
1508
1386
|
}
|
|
1509
1387
|
#else
|
|
1510
1388
|
bool git_repository__reserved_names(
|
|
1511
|
-
|
|
1389
|
+
git_str **out, size_t *outlen, git_repository *repo, bool include_ntfs)
|
|
1512
1390
|
{
|
|
1513
1391
|
GIT_UNUSED(repo);
|
|
1514
1392
|
|
|
@@ -1554,7 +1432,7 @@ static git_vector user_extensions = GIT_VECTOR_INIT;
|
|
|
1554
1432
|
|
|
1555
1433
|
static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
1556
1434
|
{
|
|
1557
|
-
|
|
1435
|
+
git_str cfg = GIT_STR_INIT;
|
|
1558
1436
|
bool reject;
|
|
1559
1437
|
const char *extension;
|
|
1560
1438
|
size_t i;
|
|
@@ -1563,7 +1441,7 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
|
1563
1441
|
GIT_UNUSED(payload);
|
|
1564
1442
|
|
|
1565
1443
|
git_vector_foreach (&user_extensions, i, extension) {
|
|
1566
|
-
|
|
1444
|
+
git_str_clear(&cfg);
|
|
1567
1445
|
|
|
1568
1446
|
/*
|
|
1569
1447
|
* Users can specify that they don't want to support an
|
|
@@ -1572,7 +1450,7 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
|
1572
1450
|
if ((reject = (extension[0] == '!')) == true)
|
|
1573
1451
|
extension = &extension[1];
|
|
1574
1452
|
|
|
1575
|
-
if ((error =
|
|
1453
|
+
if ((error = git_str_printf(&cfg, "extensions.%s", extension)) < 0)
|
|
1576
1454
|
goto done;
|
|
1577
1455
|
|
|
1578
1456
|
if (strcmp(entry->name, cfg.ptr) == 0) {
|
|
@@ -1586,7 +1464,7 @@ static int check_valid_extension(const git_config_entry *entry, void *payload)
|
|
|
1586
1464
|
for (i = 0; i < ARRAY_SIZE(builtin_extensions); i++) {
|
|
1587
1465
|
extension = builtin_extensions[i];
|
|
1588
1466
|
|
|
1589
|
-
if ((error =
|
|
1467
|
+
if ((error = git_str_printf(&cfg, "extensions.%s", extension)) < 0)
|
|
1590
1468
|
goto done;
|
|
1591
1469
|
|
|
1592
1470
|
if (strcmp(entry->name, cfg.ptr) == 0)
|
|
@@ -1598,7 +1476,7 @@ fail:
|
|
|
1598
1476
|
error = -1;
|
|
1599
1477
|
|
|
1600
1478
|
done:
|
|
1601
|
-
|
|
1479
|
+
git_str_dispose(&cfg);
|
|
1602
1480
|
return error;
|
|
1603
1481
|
}
|
|
1604
1482
|
|
|
@@ -1676,12 +1554,12 @@ void git_repository__free_extensions(void)
|
|
|
1676
1554
|
|
|
1677
1555
|
int git_repository_create_head(const char *git_dir, const char *ref_name)
|
|
1678
1556
|
{
|
|
1679
|
-
|
|
1557
|
+
git_str ref_path = GIT_STR_INIT;
|
|
1680
1558
|
git_filebuf ref = GIT_FILEBUF_INIT;
|
|
1681
1559
|
const char *fmt;
|
|
1682
1560
|
int error;
|
|
1683
1561
|
|
|
1684
|
-
if ((error =
|
|
1562
|
+
if ((error = git_str_joinpath(&ref_path, git_dir, GIT_HEAD_FILE)) < 0 ||
|
|
1685
1563
|
(error = git_filebuf_open(&ref, ref_path.ptr, 0, GIT_REFS_FILE_MODE)) < 0)
|
|
1686
1564
|
goto out;
|
|
1687
1565
|
|
|
@@ -1695,7 +1573,7 @@ int git_repository_create_head(const char *git_dir, const char *ref_name)
|
|
|
1695
1573
|
goto out;
|
|
1696
1574
|
|
|
1697
1575
|
out:
|
|
1698
|
-
|
|
1576
|
+
git_str_dispose(&ref_path);
|
|
1699
1577
|
git_filebuf_cleanup(&ref);
|
|
1700
1578
|
return error;
|
|
1701
1579
|
}
|
|
@@ -1718,50 +1596,23 @@ static bool is_chmod_supported(const char *file_path)
|
|
|
1718
1596
|
|
|
1719
1597
|
static bool is_filesystem_case_insensitive(const char *gitdir_path)
|
|
1720
1598
|
{
|
|
1721
|
-
|
|
1599
|
+
git_str path = GIT_STR_INIT;
|
|
1722
1600
|
int is_insensitive = -1;
|
|
1723
1601
|
|
|
1724
|
-
if (!
|
|
1725
|
-
is_insensitive =
|
|
1602
|
+
if (!git_str_joinpath(&path, gitdir_path, "CoNfIg"))
|
|
1603
|
+
is_insensitive = git_fs_path_exists(git_str_cstr(&path));
|
|
1726
1604
|
|
|
1727
|
-
|
|
1605
|
+
git_str_dispose(&path);
|
|
1728
1606
|
return is_insensitive;
|
|
1729
1607
|
}
|
|
1730
1608
|
|
|
1731
|
-
/*
|
|
1732
|
-
* Return a configuration object with only the global and system
|
|
1733
|
-
* configurations; no repository-level configuration.
|
|
1734
|
-
*/
|
|
1735
|
-
static int load_global_config(git_config **config)
|
|
1736
|
-
{
|
|
1737
|
-
git_buf global_buf = GIT_BUF_INIT;
|
|
1738
|
-
git_buf xdg_buf = GIT_BUF_INIT;
|
|
1739
|
-
git_buf system_buf = GIT_BUF_INIT;
|
|
1740
|
-
git_buf programdata_buf = GIT_BUF_INIT;
|
|
1741
|
-
int error;
|
|
1742
|
-
|
|
1743
|
-
git_config_find_global(&global_buf);
|
|
1744
|
-
git_config_find_xdg(&xdg_buf);
|
|
1745
|
-
git_config_find_system(&system_buf);
|
|
1746
|
-
git_config_find_programdata(&programdata_buf);
|
|
1747
|
-
|
|
1748
|
-
error = load_config(config, NULL,
|
|
1749
|
-
path_unless_empty(&global_buf),
|
|
1750
|
-
path_unless_empty(&xdg_buf),
|
|
1751
|
-
path_unless_empty(&system_buf),
|
|
1752
|
-
path_unless_empty(&programdata_buf));
|
|
1753
|
-
|
|
1754
|
-
git_buf_dispose(&global_buf);
|
|
1755
|
-
git_buf_dispose(&xdg_buf);
|
|
1756
|
-
git_buf_dispose(&system_buf);
|
|
1757
|
-
git_buf_dispose(&programdata_buf);
|
|
1758
|
-
|
|
1759
|
-
return error;
|
|
1760
|
-
}
|
|
1761
|
-
|
|
1762
1609
|
static bool are_symlinks_supported(const char *wd_path)
|
|
1763
1610
|
{
|
|
1764
1611
|
git_config *config = NULL;
|
|
1612
|
+
git_str global_buf = GIT_STR_INIT;
|
|
1613
|
+
git_str xdg_buf = GIT_STR_INIT;
|
|
1614
|
+
git_str system_buf = GIT_STR_INIT;
|
|
1615
|
+
git_str programdata_buf = GIT_STR_INIT;
|
|
1765
1616
|
int symlinks = 0;
|
|
1766
1617
|
|
|
1767
1618
|
/*
|
|
@@ -1772,16 +1623,30 @@ static bool are_symlinks_supported(const char *wd_path)
|
|
|
1772
1623
|
* _not_ set, then we do not test or enable symlink support.
|
|
1773
1624
|
*/
|
|
1774
1625
|
#ifdef GIT_WIN32
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1626
|
+
git_config__find_global(&global_buf);
|
|
1627
|
+
git_config__find_xdg(&xdg_buf);
|
|
1628
|
+
git_config__find_system(&system_buf);
|
|
1629
|
+
git_config__find_programdata(&programdata_buf);
|
|
1630
|
+
|
|
1631
|
+
if (load_config(&config, NULL,
|
|
1632
|
+
path_unless_empty(&global_buf),
|
|
1633
|
+
path_unless_empty(&xdg_buf),
|
|
1634
|
+
path_unless_empty(&system_buf),
|
|
1635
|
+
path_unless_empty(&programdata_buf)) < 0)
|
|
1636
|
+
goto done;
|
|
1637
|
+
|
|
1638
|
+
if (git_config_get_bool(&symlinks, config, "core.symlinks") < 0 || !symlinks)
|
|
1778
1639
|
goto done;
|
|
1779
1640
|
#endif
|
|
1780
1641
|
|
|
1781
|
-
if (!(symlinks =
|
|
1642
|
+
if (!(symlinks = git_fs_path_supports_symlinks(wd_path)))
|
|
1782
1643
|
goto done;
|
|
1783
1644
|
|
|
1784
1645
|
done:
|
|
1646
|
+
git_str_dispose(&global_buf);
|
|
1647
|
+
git_str_dispose(&xdg_buf);
|
|
1648
|
+
git_str_dispose(&system_buf);
|
|
1649
|
+
git_str_dispose(&programdata_buf);
|
|
1785
1650
|
git_config_free(config);
|
|
1786
1651
|
return symlinks != 0;
|
|
1787
1652
|
}
|
|
@@ -1805,7 +1670,7 @@ static int create_empty_file(const char *path, mode_t mode)
|
|
|
1805
1670
|
|
|
1806
1671
|
static int repo_local_config(
|
|
1807
1672
|
git_config **out,
|
|
1808
|
-
|
|
1673
|
+
git_str *config_dir,
|
|
1809
1674
|
git_repository *repo,
|
|
1810
1675
|
const char *repo_dir)
|
|
1811
1676
|
{
|
|
@@ -1813,12 +1678,12 @@ static int repo_local_config(
|
|
|
1813
1678
|
git_config *parent;
|
|
1814
1679
|
const char *cfg_path;
|
|
1815
1680
|
|
|
1816
|
-
if (
|
|
1681
|
+
if (git_str_joinpath(config_dir, repo_dir, GIT_CONFIG_FILENAME_INREPO) < 0)
|
|
1817
1682
|
return -1;
|
|
1818
|
-
cfg_path =
|
|
1683
|
+
cfg_path = git_str_cstr(config_dir);
|
|
1819
1684
|
|
|
1820
1685
|
/* make LOCAL config if missing */
|
|
1821
|
-
if (!
|
|
1686
|
+
if (!git_fs_path_isfile(cfg_path) &&
|
|
1822
1687
|
(error = create_empty_file(cfg_path, GIT_CONFIG_FILE_MODE)) < 0)
|
|
1823
1688
|
return error;
|
|
1824
1689
|
|
|
@@ -1876,7 +1741,7 @@ static int repo_init_fs_configs(
|
|
|
1876
1741
|
#ifdef GIT_USE_ICONV
|
|
1877
1742
|
if ((error = git_config_set_bool(
|
|
1878
1743
|
cfg, "core.precomposeunicode",
|
|
1879
|
-
|
|
1744
|
+
git_fs_path_does_decompose_unicode(work_dir))) < 0)
|
|
1880
1745
|
return error;
|
|
1881
1746
|
/* on non-iconv platforms, don't even set core.precomposeunicode */
|
|
1882
1747
|
#endif
|
|
@@ -1891,7 +1756,7 @@ static int repo_init_config(
|
|
|
1891
1756
|
uint32_t mode)
|
|
1892
1757
|
{
|
|
1893
1758
|
int error = 0;
|
|
1894
|
-
|
|
1759
|
+
git_str cfg_path = GIT_STR_INIT, worktree_path = GIT_STR_INIT;
|
|
1895
1760
|
git_config *config = NULL;
|
|
1896
1761
|
bool is_bare = ((flags & GIT_REPOSITORY_INIT_BARE) != 0);
|
|
1897
1762
|
bool is_reinit = ((flags & GIT_REPOSITORY_INIT__IS_REINIT) != 0);
|
|
@@ -1921,11 +1786,11 @@ static int repo_init_config(
|
|
|
1921
1786
|
SET_REPO_CONFIG(bool, "core.logallrefupdates", true);
|
|
1922
1787
|
|
|
1923
1788
|
if (!(flags & GIT_REPOSITORY_INIT__NATURAL_WD)) {
|
|
1924
|
-
if ((error =
|
|
1789
|
+
if ((error = git_str_sets(&worktree_path, work_dir)) < 0)
|
|
1925
1790
|
goto cleanup;
|
|
1926
1791
|
|
|
1927
1792
|
if ((flags & GIT_REPOSITORY_INIT_RELATIVE_GITLINK))
|
|
1928
|
-
if ((error =
|
|
1793
|
+
if ((error = git_fs_path_make_relative(&worktree_path, repo_dir)) < 0)
|
|
1929
1794
|
goto cleanup;
|
|
1930
1795
|
|
|
1931
1796
|
SET_REPO_CONFIG(string, "core.worktree", worktree_path.ptr);
|
|
@@ -1945,8 +1810,8 @@ static int repo_init_config(
|
|
|
1945
1810
|
}
|
|
1946
1811
|
|
|
1947
1812
|
cleanup:
|
|
1948
|
-
|
|
1949
|
-
|
|
1813
|
+
git_str_dispose(&cfg_path);
|
|
1814
|
+
git_str_dispose(&worktree_path);
|
|
1950
1815
|
git_config_free(config);
|
|
1951
1816
|
|
|
1952
1817
|
return error;
|
|
@@ -1968,7 +1833,7 @@ static int repo_reinit_submodule_fs(git_submodule *sm, const char *n, void *p)
|
|
|
1968
1833
|
int git_repository_reinit_filesystem(git_repository *repo, int recurse)
|
|
1969
1834
|
{
|
|
1970
1835
|
int error = 0;
|
|
1971
|
-
|
|
1836
|
+
git_str path = GIT_STR_INIT;
|
|
1972
1837
|
git_config *config = NULL;
|
|
1973
1838
|
const char *repo_dir = git_repository_path(repo);
|
|
1974
1839
|
|
|
@@ -1977,7 +1842,7 @@ int git_repository_reinit_filesystem(git_repository *repo, int recurse)
|
|
|
1977
1842
|
config, path.ptr, repo_dir, git_repository_workdir(repo), true);
|
|
1978
1843
|
|
|
1979
1844
|
git_config_free(config);
|
|
1980
|
-
|
|
1845
|
+
git_str_dispose(&path);
|
|
1981
1846
|
|
|
1982
1847
|
git_repository__configmap_lookup_cache_clear(repo);
|
|
1983
1848
|
|
|
@@ -1995,10 +1860,10 @@ static int repo_write_template(
|
|
|
1995
1860
|
bool hidden,
|
|
1996
1861
|
const char *content)
|
|
1997
1862
|
{
|
|
1998
|
-
|
|
1863
|
+
git_str path = GIT_STR_INIT;
|
|
1999
1864
|
int fd, error = 0, flags;
|
|
2000
1865
|
|
|
2001
|
-
if (
|
|
1866
|
+
if (git_str_joinpath(&path, git_dir, file) < 0)
|
|
2002
1867
|
return -1;
|
|
2003
1868
|
|
|
2004
1869
|
if (allow_overwrite)
|
|
@@ -2006,7 +1871,7 @@ static int repo_write_template(
|
|
|
2006
1871
|
else
|
|
2007
1872
|
flags = O_WRONLY | O_CREAT | O_EXCL;
|
|
2008
1873
|
|
|
2009
|
-
fd = p_open(
|
|
1874
|
+
fd = p_open(git_str_cstr(&path), flags, mode);
|
|
2010
1875
|
|
|
2011
1876
|
if (fd >= 0) {
|
|
2012
1877
|
error = p_write(fd, content, strlen(content));
|
|
@@ -2025,7 +1890,7 @@ static int repo_write_template(
|
|
|
2025
1890
|
GIT_UNUSED(hidden);
|
|
2026
1891
|
#endif
|
|
2027
1892
|
|
|
2028
|
-
|
|
1893
|
+
git_str_dispose(&path);
|
|
2029
1894
|
|
|
2030
1895
|
if (error)
|
|
2031
1896
|
git_error_set(GIT_ERROR_OS,
|
|
@@ -2038,13 +1903,13 @@ static int repo_write_gitlink(
|
|
|
2038
1903
|
const char *in_dir, const char *to_repo, bool use_relative_path)
|
|
2039
1904
|
{
|
|
2040
1905
|
int error;
|
|
2041
|
-
|
|
2042
|
-
|
|
1906
|
+
git_str buf = GIT_STR_INIT;
|
|
1907
|
+
git_str path_to_repo = GIT_STR_INIT;
|
|
2043
1908
|
struct stat st;
|
|
2044
1909
|
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
if (
|
|
1910
|
+
git_fs_path_dirname_r(&buf, to_repo);
|
|
1911
|
+
git_fs_path_to_dir(&buf);
|
|
1912
|
+
if (git_str_oom(&buf))
|
|
2048
1913
|
return -1;
|
|
2049
1914
|
|
|
2050
1915
|
/* don't write gitlink to natural workdir */
|
|
@@ -2055,7 +1920,7 @@ static int repo_write_gitlink(
|
|
|
2055
1920
|
goto cleanup;
|
|
2056
1921
|
}
|
|
2057
1922
|
|
|
2058
|
-
if ((error =
|
|
1923
|
+
if ((error = git_str_joinpath(&buf, in_dir, DOT_GIT)) < 0)
|
|
2059
1924
|
goto cleanup;
|
|
2060
1925
|
|
|
2061
1926
|
if (!p_stat(buf.ptr, &st) && !S_ISREG(st.st_mode)) {
|
|
@@ -2065,22 +1930,22 @@ static int repo_write_gitlink(
|
|
|
2065
1930
|
goto cleanup;
|
|
2066
1931
|
}
|
|
2067
1932
|
|
|
2068
|
-
|
|
1933
|
+
git_str_clear(&buf);
|
|
2069
1934
|
|
|
2070
|
-
error =
|
|
1935
|
+
error = git_str_sets(&path_to_repo, to_repo);
|
|
2071
1936
|
|
|
2072
1937
|
if (!error && use_relative_path)
|
|
2073
|
-
error =
|
|
1938
|
+
error = git_fs_path_make_relative(&path_to_repo, in_dir);
|
|
2074
1939
|
|
|
2075
1940
|
if (!error)
|
|
2076
|
-
error =
|
|
1941
|
+
error = git_str_join(&buf, ' ', GIT_FILE_CONTENT_PREFIX, path_to_repo.ptr);
|
|
2077
1942
|
|
|
2078
1943
|
if (!error)
|
|
2079
1944
|
error = repo_write_template(in_dir, true, DOT_GIT, 0666, true, buf.ptr);
|
|
2080
1945
|
|
|
2081
1946
|
cleanup:
|
|
2082
|
-
|
|
2083
|
-
|
|
1947
|
+
git_str_dispose(&buf);
|
|
1948
|
+
git_str_dispose(&path_to_repo);
|
|
2084
1949
|
return error;
|
|
2085
1950
|
}
|
|
2086
1951
|
|
|
@@ -2133,12 +1998,12 @@ static int repo_init_structure(
|
|
|
2133
1998
|
git_config *cfg = NULL;
|
|
2134
1999
|
const char *tdir = NULL;
|
|
2135
2000
|
bool default_template = false;
|
|
2136
|
-
|
|
2001
|
+
git_str template_buf = GIT_STR_INIT;
|
|
2137
2002
|
|
|
2138
2003
|
if (opts->template_path)
|
|
2139
2004
|
tdir = opts->template_path;
|
|
2140
2005
|
else if ((error = git_config_open_default(&cfg)) >= 0) {
|
|
2141
|
-
if (!
|
|
2006
|
+
if (!git_config__get_path(&template_buf, cfg, "init.templatedir"))
|
|
2142
2007
|
tdir = template_buf.ptr;
|
|
2143
2008
|
git_error_clear();
|
|
2144
2009
|
}
|
|
@@ -2164,11 +2029,16 @@ static int repo_init_structure(
|
|
|
2164
2029
|
error = git_futils_cp_r(tdir, repo_dir, cpflags, dmode);
|
|
2165
2030
|
}
|
|
2166
2031
|
|
|
2167
|
-
|
|
2032
|
+
git_str_dispose(&template_buf);
|
|
2168
2033
|
git_config_free(cfg);
|
|
2169
2034
|
|
|
2035
|
+
/* If tdir does not exist, then do not error out. This matches the
|
|
2036
|
+
* behaviour of git(1), which just prints a warning and continues.
|
|
2037
|
+
* TODO: issue warning when warning API is available.
|
|
2038
|
+
* `git` prints to stderr: 'warning: templates not found in /path/to/tdir'
|
|
2039
|
+
*/
|
|
2170
2040
|
if (error < 0) {
|
|
2171
|
-
if (!default_template)
|
|
2041
|
+
if (!default_template && error != GIT_ENOTFOUND)
|
|
2172
2042
|
return error;
|
|
2173
2043
|
|
|
2174
2044
|
/* if template was default, ignore error and use internal */
|
|
@@ -2205,7 +2075,7 @@ static int repo_init_structure(
|
|
|
2205
2075
|
return error;
|
|
2206
2076
|
}
|
|
2207
2077
|
|
|
2208
|
-
static int mkdir_parent(
|
|
2078
|
+
static int mkdir_parent(git_str *buf, uint32_t mode, bool skip2)
|
|
2209
2079
|
{
|
|
2210
2080
|
/* When making parent directories during repository initialization
|
|
2211
2081
|
* don't try to set gid or grant world write access
|
|
@@ -2217,8 +2087,8 @@ static int mkdir_parent(git_buf *buf, uint32_t mode, bool skip2)
|
|
|
2217
2087
|
}
|
|
2218
2088
|
|
|
2219
2089
|
static int repo_init_directories(
|
|
2220
|
-
|
|
2221
|
-
|
|
2090
|
+
git_str *repo_path,
|
|
2091
|
+
git_str *wd_path,
|
|
2222
2092
|
const char *given_repo,
|
|
2223
2093
|
git_repository_init_options *opts)
|
|
2224
2094
|
{
|
|
@@ -2256,7 +2126,7 @@ static int repo_init_directories(
|
|
|
2256
2126
|
git__suffixcmp(given_repo, "/" DOT_GIT) != 0 &&
|
|
2257
2127
|
git__suffixcmp(given_repo, "/" GIT_DIR) != 0;
|
|
2258
2128
|
|
|
2259
|
-
if (
|
|
2129
|
+
if (git_str_joinpath(repo_path, given_repo, add_dotgit ? GIT_DIR : "") < 0)
|
|
2260
2130
|
return -1;
|
|
2261
2131
|
|
|
2262
2132
|
has_dotgit = (git__suffixcmp(repo_path->ptr, "/" GIT_DIR) == 0);
|
|
@@ -2267,11 +2137,11 @@ static int repo_init_directories(
|
|
|
2267
2137
|
|
|
2268
2138
|
if (!is_bare) {
|
|
2269
2139
|
if (opts->workdir_path) {
|
|
2270
|
-
if (
|
|
2140
|
+
if (git_fs_path_join_unrooted(
|
|
2271
2141
|
wd_path, opts->workdir_path, repo_path->ptr, NULL) < 0)
|
|
2272
2142
|
return -1;
|
|
2273
2143
|
} else if (has_dotgit) {
|
|
2274
|
-
if (
|
|
2144
|
+
if (git_fs_path_dirname_r(wd_path, repo_path->ptr) < 0)
|
|
2275
2145
|
return -1;
|
|
2276
2146
|
} else {
|
|
2277
2147
|
git_error_set(GIT_ERROR_REPOSITORY, "cannot pick working directory"
|
|
@@ -2279,10 +2149,10 @@ static int repo_init_directories(
|
|
|
2279
2149
|
return -1;
|
|
2280
2150
|
}
|
|
2281
2151
|
|
|
2282
|
-
if (
|
|
2152
|
+
if (git_fs_path_to_dir(wd_path) < 0)
|
|
2283
2153
|
return -1;
|
|
2284
2154
|
} else {
|
|
2285
|
-
|
|
2155
|
+
git_str_clear(wd_path);
|
|
2286
2156
|
}
|
|
2287
2157
|
|
|
2288
2158
|
natural_wd =
|
|
@@ -2339,10 +2209,10 @@ static int repo_init_directories(
|
|
|
2339
2209
|
/* prettify both directories now that they are created */
|
|
2340
2210
|
|
|
2341
2211
|
if (!error) {
|
|
2342
|
-
error =
|
|
2212
|
+
error = git_fs_path_prettify_dir(repo_path, repo_path->ptr, NULL);
|
|
2343
2213
|
|
|
2344
2214
|
if (!error && wd_path->size > 0)
|
|
2345
|
-
error =
|
|
2215
|
+
error = git_fs_path_prettify_dir(wd_path, wd_path->ptr, NULL);
|
|
2346
2216
|
}
|
|
2347
2217
|
|
|
2348
2218
|
return error;
|
|
@@ -2351,24 +2221,24 @@ static int repo_init_directories(
|
|
|
2351
2221
|
static int repo_init_head(const char *repo_dir, const char *given)
|
|
2352
2222
|
{
|
|
2353
2223
|
git_config *cfg = NULL;
|
|
2354
|
-
|
|
2224
|
+
git_str head_path = GIT_STR_INIT, cfg_branch = GIT_STR_INIT;
|
|
2355
2225
|
const char *initial_head = NULL;
|
|
2356
2226
|
int error;
|
|
2357
2227
|
|
|
2358
|
-
if ((error =
|
|
2228
|
+
if ((error = git_str_joinpath(&head_path, repo_dir, GIT_HEAD_FILE)) < 0)
|
|
2359
2229
|
goto out;
|
|
2360
2230
|
|
|
2361
2231
|
/*
|
|
2362
2232
|
* A template may have set a HEAD; use that unless it's been
|
|
2363
2233
|
* overridden by the caller's given initial head setting.
|
|
2364
2234
|
*/
|
|
2365
|
-
if (
|
|
2235
|
+
if (git_fs_path_exists(head_path.ptr) && !given)
|
|
2366
2236
|
goto out;
|
|
2367
2237
|
|
|
2368
2238
|
if (given) {
|
|
2369
2239
|
initial_head = given;
|
|
2370
2240
|
} else if ((error = git_config_open_default(&cfg)) >= 0 &&
|
|
2371
|
-
(error =
|
|
2241
|
+
(error = git_config__get_string_buf(&cfg_branch, cfg, "init.defaultbranch")) >= 0 &&
|
|
2372
2242
|
*cfg_branch.ptr) {
|
|
2373
2243
|
initial_head = cfg_branch.ptr;
|
|
2374
2244
|
}
|
|
@@ -2380,8 +2250,8 @@ static int repo_init_head(const char *repo_dir, const char *given)
|
|
|
2380
2250
|
|
|
2381
2251
|
out:
|
|
2382
2252
|
git_config_free(cfg);
|
|
2383
|
-
|
|
2384
|
-
|
|
2253
|
+
git_str_dispose(&head_path);
|
|
2254
|
+
git_str_dispose(&cfg_branch);
|
|
2385
2255
|
|
|
2386
2256
|
return error;
|
|
2387
2257
|
}
|
|
@@ -2415,8 +2285,8 @@ int git_repository_init_ext(
|
|
|
2415
2285
|
const char *given_repo,
|
|
2416
2286
|
git_repository_init_options *opts)
|
|
2417
2287
|
{
|
|
2418
|
-
|
|
2419
|
-
common_path =
|
|
2288
|
+
git_str repo_path = GIT_STR_INIT, wd_path = GIT_STR_INIT,
|
|
2289
|
+
common_path = GIT_STR_INIT;
|
|
2420
2290
|
const char *wd;
|
|
2421
2291
|
bool is_valid;
|
|
2422
2292
|
int error;
|
|
@@ -2430,7 +2300,7 @@ int git_repository_init_ext(
|
|
|
2430
2300
|
if ((error = repo_init_directories(&repo_path, &wd_path, given_repo, opts)) < 0)
|
|
2431
2301
|
goto out;
|
|
2432
2302
|
|
|
2433
|
-
wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL :
|
|
2303
|
+
wd = (opts->flags & GIT_REPOSITORY_INIT_BARE) ? NULL : git_str_cstr(&wd_path);
|
|
2434
2304
|
|
|
2435
2305
|
if ((error = is_valid_repository_path(&is_valid, &repo_path, &common_path)) < 0)
|
|
2436
2306
|
goto out;
|
|
@@ -2464,9 +2334,9 @@ int git_repository_init_ext(
|
|
|
2464
2334
|
goto out;
|
|
2465
2335
|
|
|
2466
2336
|
out:
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2337
|
+
git_str_dispose(&common_path);
|
|
2338
|
+
git_str_dispose(&repo_path);
|
|
2339
|
+
git_str_dispose(&wd_path);
|
|
2470
2340
|
|
|
2471
2341
|
return error;
|
|
2472
2342
|
}
|
|
@@ -2654,7 +2524,7 @@ static int repo_contains_no_reference(git_repository *repo)
|
|
|
2654
2524
|
return error;
|
|
2655
2525
|
}
|
|
2656
2526
|
|
|
2657
|
-
int git_repository_initialbranch(
|
|
2527
|
+
int git_repository_initialbranch(git_str *out, git_repository *repo)
|
|
2658
2528
|
{
|
|
2659
2529
|
git_config *config;
|
|
2660
2530
|
git_config_entry *entry = NULL;
|
|
@@ -2675,8 +2545,8 @@ int git_repository_initialbranch(git_buf *out, git_repository *repo)
|
|
|
2675
2545
|
goto done;
|
|
2676
2546
|
}
|
|
2677
2547
|
|
|
2678
|
-
if ((error =
|
|
2679
|
-
(error =
|
|
2548
|
+
if ((error = git_str_puts(out, GIT_REFS_HEADS_DIR)) < 0 ||
|
|
2549
|
+
(error = git_str_puts(out, branch)) < 0 ||
|
|
2680
2550
|
(error = git_reference_name_is_valid(&valid, out->ptr)) < 0)
|
|
2681
2551
|
goto done;
|
|
2682
2552
|
|
|
@@ -2693,7 +2563,7 @@ done:
|
|
|
2693
2563
|
int git_repository_is_empty(git_repository *repo)
|
|
2694
2564
|
{
|
|
2695
2565
|
git_reference *head = NULL;
|
|
2696
|
-
|
|
2566
|
+
git_str initialbranch = GIT_STR_INIT;
|
|
2697
2567
|
int result = 0;
|
|
2698
2568
|
|
|
2699
2569
|
if ((result = git_reference_lookup(&head, repo, GIT_HEAD_FILE)) < 0 ||
|
|
@@ -2706,7 +2576,7 @@ int git_repository_is_empty(git_repository *repo)
|
|
|
2706
2576
|
|
|
2707
2577
|
done:
|
|
2708
2578
|
git_reference_free(head);
|
|
2709
|
-
|
|
2579
|
+
git_str_dispose(&initialbranch);
|
|
2710
2580
|
|
|
2711
2581
|
return result;
|
|
2712
2582
|
}
|
|
@@ -2735,7 +2605,18 @@ static const char *resolved_parent_path(const git_repository *repo, git_reposito
|
|
|
2735
2605
|
return parent;
|
|
2736
2606
|
}
|
|
2737
2607
|
|
|
2738
|
-
int git_repository_item_path(
|
|
2608
|
+
int git_repository_item_path(
|
|
2609
|
+
git_buf *out,
|
|
2610
|
+
const git_repository *repo,
|
|
2611
|
+
git_repository_item_t item)
|
|
2612
|
+
{
|
|
2613
|
+
GIT_BUF_WRAP_PRIVATE(out, git_repository__item_path, repo, item);
|
|
2614
|
+
}
|
|
2615
|
+
|
|
2616
|
+
int git_repository__item_path(
|
|
2617
|
+
git_str *out,
|
|
2618
|
+
const git_repository *repo,
|
|
2619
|
+
git_repository_item_t item)
|
|
2739
2620
|
{
|
|
2740
2621
|
const char *parent = resolved_parent_path(repo, items[item].parent, items[item].fallback);
|
|
2741
2622
|
if (parent == NULL) {
|
|
@@ -2743,16 +2624,16 @@ int git_repository_item_path(git_buf *out, const git_repository *repo, git_repos
|
|
|
2743
2624
|
return GIT_ENOTFOUND;
|
|
2744
2625
|
}
|
|
2745
2626
|
|
|
2746
|
-
if (
|
|
2627
|
+
if (git_str_sets(out, parent) < 0)
|
|
2747
2628
|
return -1;
|
|
2748
2629
|
|
|
2749
2630
|
if (items[item].name) {
|
|
2750
|
-
if (
|
|
2631
|
+
if (git_str_joinpath(out, parent, items[item].name) < 0)
|
|
2751
2632
|
return -1;
|
|
2752
2633
|
}
|
|
2753
2634
|
|
|
2754
2635
|
if (items[item].directory) {
|
|
2755
|
-
if (
|
|
2636
|
+
if (git_fs_path_to_dir(out) < 0)
|
|
2756
2637
|
return -1;
|
|
2757
2638
|
}
|
|
2758
2639
|
|
|
@@ -2776,7 +2657,7 @@ const char *git_repository_workdir(const git_repository *repo)
|
|
|
2776
2657
|
}
|
|
2777
2658
|
|
|
2778
2659
|
int git_repository_workdir_path(
|
|
2779
|
-
|
|
2660
|
+
git_str *out, git_repository *repo, const char *path)
|
|
2780
2661
|
{
|
|
2781
2662
|
int error;
|
|
2782
2663
|
|
|
@@ -2785,8 +2666,8 @@ int git_repository_workdir_path(
|
|
|
2785
2666
|
return GIT_EBAREREPO;
|
|
2786
2667
|
}
|
|
2787
2668
|
|
|
2788
|
-
if (!(error =
|
|
2789
|
-
error =
|
|
2669
|
+
if (!(error = git_str_joinpath(out, repo->workdir, path)))
|
|
2670
|
+
error = git_path_validate_str_length(repo, out);
|
|
2790
2671
|
|
|
2791
2672
|
return error;
|
|
2792
2673
|
}
|
|
@@ -2801,12 +2682,12 @@ int git_repository_set_workdir(
|
|
|
2801
2682
|
git_repository *repo, const char *workdir, int update_gitlink)
|
|
2802
2683
|
{
|
|
2803
2684
|
int error = 0;
|
|
2804
|
-
|
|
2685
|
+
git_str path = GIT_STR_INIT;
|
|
2805
2686
|
|
|
2806
2687
|
GIT_ASSERT_ARG(repo);
|
|
2807
2688
|
GIT_ASSERT_ARG(workdir);
|
|
2808
2689
|
|
|
2809
|
-
if (
|
|
2690
|
+
if (git_fs_path_prettify_dir(&path, workdir, NULL) < 0)
|
|
2810
2691
|
return -1;
|
|
2811
2692
|
|
|
2812
2693
|
if (repo->workdir && strcmp(repo->workdir, path.ptr) == 0)
|
|
@@ -2833,7 +2714,7 @@ int git_repository_set_workdir(
|
|
|
2833
2714
|
if (!error) {
|
|
2834
2715
|
char *old_workdir = repo->workdir;
|
|
2835
2716
|
|
|
2836
|
-
repo->workdir =
|
|
2717
|
+
repo->workdir = git_str_detach(&path);
|
|
2837
2718
|
repo->is_bare = 0;
|
|
2838
2719
|
|
|
2839
2720
|
git__free(old_workdir);
|
|
@@ -2902,13 +2783,13 @@ cleanup:
|
|
|
2902
2783
|
int git_repository__set_orig_head(git_repository *repo, const git_oid *orig_head)
|
|
2903
2784
|
{
|
|
2904
2785
|
git_filebuf file = GIT_FILEBUF_INIT;
|
|
2905
|
-
|
|
2786
|
+
git_str file_path = GIT_STR_INIT;
|
|
2906
2787
|
char orig_head_str[GIT_OID_HEXSZ];
|
|
2907
2788
|
int error = 0;
|
|
2908
2789
|
|
|
2909
2790
|
git_oid_fmt(orig_head_str, orig_head);
|
|
2910
2791
|
|
|
2911
|
-
if ((error =
|
|
2792
|
+
if ((error = git_str_joinpath(&file_path, repo->gitdir, GIT_ORIG_HEAD_FILE)) == 0 &&
|
|
2912
2793
|
(error = git_filebuf_open(&file, file_path.ptr, GIT_FILEBUF_CREATE_LEADING_DIRS, GIT_MERGE_FILE_MODE)) == 0 &&
|
|
2913
2794
|
(error = git_filebuf_printf(&file, "%.*s\n", GIT_OID_HEXSZ, orig_head_str)) == 0)
|
|
2914
2795
|
error = git_filebuf_commit(&file);
|
|
@@ -2916,46 +2797,48 @@ int git_repository__set_orig_head(git_repository *repo, const git_oid *orig_head
|
|
|
2916
2797
|
if (error < 0)
|
|
2917
2798
|
git_filebuf_cleanup(&file);
|
|
2918
2799
|
|
|
2919
|
-
|
|
2800
|
+
git_str_dispose(&file_path);
|
|
2920
2801
|
|
|
2921
2802
|
return error;
|
|
2922
2803
|
}
|
|
2923
2804
|
|
|
2924
|
-
int
|
|
2805
|
+
static int git_repository__message(git_str *out, git_repository *repo)
|
|
2925
2806
|
{
|
|
2926
|
-
|
|
2807
|
+
git_str path = GIT_STR_INIT;
|
|
2927
2808
|
struct stat st;
|
|
2928
2809
|
int error;
|
|
2929
2810
|
|
|
2930
|
-
if ((
|
|
2931
|
-
return error;
|
|
2932
|
-
|
|
2933
|
-
if (git_buf_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
|
2811
|
+
if (git_str_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
|
2934
2812
|
return -1;
|
|
2935
2813
|
|
|
2936
|
-
if ((error = p_stat(
|
|
2814
|
+
if ((error = p_stat(git_str_cstr(&path), &st)) < 0) {
|
|
2937
2815
|
if (errno == ENOENT)
|
|
2938
2816
|
error = GIT_ENOTFOUND;
|
|
2939
2817
|
git_error_set(GIT_ERROR_OS, "could not access message file");
|
|
2940
2818
|
} else {
|
|
2941
|
-
error = git_futils_readbuffer(out,
|
|
2819
|
+
error = git_futils_readbuffer(out, git_str_cstr(&path));
|
|
2942
2820
|
}
|
|
2943
2821
|
|
|
2944
|
-
|
|
2822
|
+
git_str_dispose(&path);
|
|
2945
2823
|
|
|
2946
2824
|
return error;
|
|
2947
2825
|
}
|
|
2948
2826
|
|
|
2827
|
+
int git_repository_message(git_buf *out, git_repository *repo)
|
|
2828
|
+
{
|
|
2829
|
+
GIT_BUF_WRAP_PRIVATE(out, git_repository__message, repo);
|
|
2830
|
+
}
|
|
2831
|
+
|
|
2949
2832
|
int git_repository_message_remove(git_repository *repo)
|
|
2950
2833
|
{
|
|
2951
|
-
|
|
2834
|
+
git_str path = GIT_STR_INIT;
|
|
2952
2835
|
int error;
|
|
2953
2836
|
|
|
2954
|
-
if (
|
|
2837
|
+
if (git_str_joinpath(&path, repo->gitdir, GIT_MERGE_MSG_FILE) < 0)
|
|
2955
2838
|
return -1;
|
|
2956
2839
|
|
|
2957
|
-
error = p_unlink(
|
|
2958
|
-
|
|
2840
|
+
error = p_unlink(git_str_cstr(&path));
|
|
2841
|
+
git_str_dispose(&path);
|
|
2959
2842
|
|
|
2960
2843
|
return error;
|
|
2961
2844
|
}
|
|
@@ -2971,7 +2854,7 @@ int git_repository_hashfile(
|
|
|
2971
2854
|
git_filter_list *fl = NULL;
|
|
2972
2855
|
git_file fd = -1;
|
|
2973
2856
|
uint64_t len;
|
|
2974
|
-
|
|
2857
|
+
git_str full_path = GIT_STR_INIT;
|
|
2975
2858
|
const char *workdir = git_repository_workdir(repo);
|
|
2976
2859
|
|
|
2977
2860
|
/* as_path can be NULL */
|
|
@@ -2979,8 +2862,8 @@ int git_repository_hashfile(
|
|
|
2979
2862
|
GIT_ASSERT_ARG(path);
|
|
2980
2863
|
GIT_ASSERT_ARG(repo);
|
|
2981
2864
|
|
|
2982
|
-
if ((error =
|
|
2983
|
-
(error =
|
|
2865
|
+
if ((error = git_fs_path_join_unrooted(&full_path, path, workdir, NULL)) < 0 ||
|
|
2866
|
+
(error = git_path_validate_str_length(repo, &full_path)) < 0)
|
|
2984
2867
|
return error;
|
|
2985
2868
|
|
|
2986
2869
|
/*
|
|
@@ -3027,30 +2910,30 @@ cleanup:
|
|
|
3027
2910
|
if (fd >= 0)
|
|
3028
2911
|
p_close(fd);
|
|
3029
2912
|
git_filter_list_free(fl);
|
|
3030
|
-
|
|
2913
|
+
git_str_dispose(&full_path);
|
|
3031
2914
|
|
|
3032
2915
|
return error;
|
|
3033
2916
|
}
|
|
3034
2917
|
|
|
3035
|
-
static int checkout_message(
|
|
2918
|
+
static int checkout_message(git_str *out, git_reference *old, const char *new)
|
|
3036
2919
|
{
|
|
3037
|
-
|
|
2920
|
+
git_str_puts(out, "checkout: moving from ");
|
|
3038
2921
|
|
|
3039
2922
|
if (git_reference_type(old) == GIT_REFERENCE_SYMBOLIC)
|
|
3040
|
-
|
|
2923
|
+
git_str_puts(out, git_reference__shorthand(git_reference_symbolic_target(old)));
|
|
3041
2924
|
else
|
|
3042
|
-
|
|
2925
|
+
git_str_puts(out, git_oid_tostr_s(git_reference_target(old)));
|
|
3043
2926
|
|
|
3044
|
-
|
|
2927
|
+
git_str_puts(out, " to ");
|
|
3045
2928
|
|
|
3046
2929
|
if (git_reference__is_branch(new) ||
|
|
3047
2930
|
git_reference__is_tag(new) ||
|
|
3048
2931
|
git_reference__is_remote(new))
|
|
3049
|
-
|
|
2932
|
+
git_str_puts(out, git_reference__shorthand(new));
|
|
3050
2933
|
else
|
|
3051
|
-
|
|
2934
|
+
git_str_puts(out, new);
|
|
3052
2935
|
|
|
3053
|
-
if (
|
|
2936
|
+
if (git_str_oom(out))
|
|
3054
2937
|
return -1;
|
|
3055
2938
|
|
|
3056
2939
|
return 0;
|
|
@@ -3059,7 +2942,7 @@ static int checkout_message(git_buf *out, git_reference *old, const char *new)
|
|
|
3059
2942
|
static int detach(git_repository *repo, const git_oid *id, const char *new)
|
|
3060
2943
|
{
|
|
3061
2944
|
int error;
|
|
3062
|
-
|
|
2945
|
+
git_str log_message = GIT_STR_INIT;
|
|
3063
2946
|
git_object *object = NULL, *peeled = NULL;
|
|
3064
2947
|
git_reference *new_head = NULL, *current = NULL;
|
|
3065
2948
|
|
|
@@ -3081,10 +2964,10 @@ static int detach(git_repository *repo, const git_oid *id, const char *new)
|
|
|
3081
2964
|
if ((error = checkout_message(&log_message, current, new)) < 0)
|
|
3082
2965
|
goto cleanup;
|
|
3083
2966
|
|
|
3084
|
-
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true,
|
|
2967
|
+
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_object_id(peeled), true, git_str_cstr(&log_message));
|
|
3085
2968
|
|
|
3086
2969
|
cleanup:
|
|
3087
|
-
|
|
2970
|
+
git_str_dispose(&log_message);
|
|
3088
2971
|
git_object_free(object);
|
|
3089
2972
|
git_object_free(peeled);
|
|
3090
2973
|
git_reference_free(current);
|
|
@@ -3097,7 +2980,7 @@ int git_repository_set_head(
|
|
|
3097
2980
|
const char *refname)
|
|
3098
2981
|
{
|
|
3099
2982
|
git_reference *ref = NULL, *current = NULL, *new_head = NULL;
|
|
3100
|
-
|
|
2983
|
+
git_str log_message = GIT_STR_INIT;
|
|
3101
2984
|
int error;
|
|
3102
2985
|
|
|
3103
2986
|
GIT_ASSERT_ARG(repo);
|
|
@@ -3124,18 +3007,18 @@ int git_repository_set_head(
|
|
|
3124
3007
|
if (!error) {
|
|
3125
3008
|
if (git_reference_is_branch(ref)) {
|
|
3126
3009
|
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE,
|
|
3127
|
-
git_reference_name(ref), true,
|
|
3010
|
+
git_reference_name(ref), true, git_str_cstr(&log_message));
|
|
3128
3011
|
} else {
|
|
3129
3012
|
error = detach(repo, git_reference_target(ref),
|
|
3130
3013
|
git_reference_is_tag(ref) || git_reference_is_remote(ref) ? refname : NULL);
|
|
3131
3014
|
}
|
|
3132
3015
|
} else if (git_reference__is_branch(refname)) {
|
|
3133
3016
|
error = git_reference_symbolic_create(&new_head, repo, GIT_HEAD_FILE, refname,
|
|
3134
|
-
true,
|
|
3017
|
+
true, git_str_cstr(&log_message));
|
|
3135
3018
|
}
|
|
3136
3019
|
|
|
3137
3020
|
cleanup:
|
|
3138
|
-
|
|
3021
|
+
git_str_dispose(&log_message);
|
|
3139
3022
|
git_reference_free(current);
|
|
3140
3023
|
git_reference_free(ref);
|
|
3141
3024
|
git_reference_free(new_head);
|
|
@@ -3144,26 +3027,26 @@ cleanup:
|
|
|
3144
3027
|
|
|
3145
3028
|
int git_repository_set_head_detached(
|
|
3146
3029
|
git_repository *repo,
|
|
3147
|
-
const git_oid *
|
|
3030
|
+
const git_oid *committish)
|
|
3148
3031
|
{
|
|
3149
|
-
return detach(repo,
|
|
3032
|
+
return detach(repo, committish, NULL);
|
|
3150
3033
|
}
|
|
3151
3034
|
|
|
3152
3035
|
int git_repository_set_head_detached_from_annotated(
|
|
3153
3036
|
git_repository *repo,
|
|
3154
|
-
const git_annotated_commit *
|
|
3037
|
+
const git_annotated_commit *committish)
|
|
3155
3038
|
{
|
|
3156
3039
|
GIT_ASSERT_ARG(repo);
|
|
3157
|
-
GIT_ASSERT_ARG(
|
|
3040
|
+
GIT_ASSERT_ARG(committish);
|
|
3158
3041
|
|
|
3159
|
-
return detach(repo, git_annotated_commit_id(
|
|
3042
|
+
return detach(repo, git_annotated_commit_id(committish), committish->description);
|
|
3160
3043
|
}
|
|
3161
3044
|
|
|
3162
3045
|
int git_repository_detach_head(git_repository *repo)
|
|
3163
3046
|
{
|
|
3164
3047
|
git_reference *old_head = NULL, *new_head = NULL, *current = NULL;
|
|
3165
3048
|
git_object *object = NULL;
|
|
3166
|
-
|
|
3049
|
+
git_str log_message = GIT_STR_INIT;
|
|
3167
3050
|
int error;
|
|
3168
3051
|
|
|
3169
3052
|
GIT_ASSERT_ARG(repo);
|
|
@@ -3181,10 +3064,10 @@ int git_repository_detach_head(git_repository *repo)
|
|
|
3181
3064
|
goto cleanup;
|
|
3182
3065
|
|
|
3183
3066
|
error = git_reference_create(&new_head, repo, GIT_HEAD_FILE, git_reference_target(old_head),
|
|
3184
|
-
1,
|
|
3067
|
+
1, git_str_cstr(&log_message));
|
|
3185
3068
|
|
|
3186
3069
|
cleanup:
|
|
3187
|
-
|
|
3070
|
+
git_str_dispose(&log_message);
|
|
3188
3071
|
git_object_free(object);
|
|
3189
3072
|
git_reference_free(old_head);
|
|
3190
3073
|
git_reference_free(new_head);
|
|
@@ -3198,69 +3081,69 @@ cleanup:
|
|
|
3198
3081
|
*/
|
|
3199
3082
|
int git_repository_state(git_repository *repo)
|
|
3200
3083
|
{
|
|
3201
|
-
|
|
3084
|
+
git_str repo_path = GIT_STR_INIT;
|
|
3202
3085
|
int state = GIT_REPOSITORY_STATE_NONE;
|
|
3203
3086
|
|
|
3204
3087
|
GIT_ASSERT_ARG(repo);
|
|
3205
3088
|
|
|
3206
|
-
if (
|
|
3089
|
+
if (git_str_puts(&repo_path, repo->gitdir) < 0)
|
|
3207
3090
|
return -1;
|
|
3208
3091
|
|
|
3209
|
-
if (
|
|
3092
|
+
if (git_fs_path_contains_file(&repo_path, GIT_REBASE_MERGE_INTERACTIVE_FILE))
|
|
3210
3093
|
state = GIT_REPOSITORY_STATE_REBASE_INTERACTIVE;
|
|
3211
|
-
else if (
|
|
3094
|
+
else if (git_fs_path_contains_dir(&repo_path, GIT_REBASE_MERGE_DIR))
|
|
3212
3095
|
state = GIT_REPOSITORY_STATE_REBASE_MERGE;
|
|
3213
|
-
else if (
|
|
3096
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REBASE_APPLY_REBASING_FILE))
|
|
3214
3097
|
state = GIT_REPOSITORY_STATE_REBASE;
|
|
3215
|
-
else if (
|
|
3098
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REBASE_APPLY_APPLYING_FILE))
|
|
3216
3099
|
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX;
|
|
3217
|
-
else if (
|
|
3100
|
+
else if (git_fs_path_contains_dir(&repo_path, GIT_REBASE_APPLY_DIR))
|
|
3218
3101
|
state = GIT_REPOSITORY_STATE_APPLY_MAILBOX_OR_REBASE;
|
|
3219
|
-
else if (
|
|
3102
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_MERGE_HEAD_FILE))
|
|
3220
3103
|
state = GIT_REPOSITORY_STATE_MERGE;
|
|
3221
|
-
else if (
|
|
3104
|
+
else if (git_fs_path_contains_file(&repo_path, GIT_REVERT_HEAD_FILE)) {
|
|
3222
3105
|
state = GIT_REPOSITORY_STATE_REVERT;
|
|
3223
|
-
if (
|
|
3106
|
+
if (git_fs_path_contains_file(&repo_path, GIT_SEQUENCER_TODO_FILE)) {
|
|
3224
3107
|
state = GIT_REPOSITORY_STATE_REVERT_SEQUENCE;
|
|
3225
3108
|
}
|
|
3226
|
-
} else if (
|
|
3109
|
+
} else if (git_fs_path_contains_file(&repo_path, GIT_CHERRYPICK_HEAD_FILE)) {
|
|
3227
3110
|
state = GIT_REPOSITORY_STATE_CHERRYPICK;
|
|
3228
|
-
if (
|
|
3111
|
+
if (git_fs_path_contains_file(&repo_path, GIT_SEQUENCER_TODO_FILE)) {
|
|
3229
3112
|
state = GIT_REPOSITORY_STATE_CHERRYPICK_SEQUENCE;
|
|
3230
3113
|
}
|
|
3231
|
-
} else if (
|
|
3114
|
+
} else if (git_fs_path_contains_file(&repo_path, GIT_BISECT_LOG_FILE))
|
|
3232
3115
|
state = GIT_REPOSITORY_STATE_BISECT;
|
|
3233
3116
|
|
|
3234
|
-
|
|
3117
|
+
git_str_dispose(&repo_path);
|
|
3235
3118
|
return state;
|
|
3236
3119
|
}
|
|
3237
3120
|
|
|
3238
3121
|
int git_repository__cleanup_files(
|
|
3239
3122
|
git_repository *repo, const char *files[], size_t files_len)
|
|
3240
3123
|
{
|
|
3241
|
-
|
|
3124
|
+
git_str buf = GIT_STR_INIT;
|
|
3242
3125
|
size_t i;
|
|
3243
3126
|
int error;
|
|
3244
3127
|
|
|
3245
3128
|
for (error = 0, i = 0; !error && i < files_len; ++i) {
|
|
3246
3129
|
const char *path;
|
|
3247
3130
|
|
|
3248
|
-
if (
|
|
3131
|
+
if (git_str_joinpath(&buf, repo->gitdir, files[i]) < 0)
|
|
3249
3132
|
return -1;
|
|
3250
3133
|
|
|
3251
|
-
path =
|
|
3134
|
+
path = git_str_cstr(&buf);
|
|
3252
3135
|
|
|
3253
|
-
if (
|
|
3136
|
+
if (git_fs_path_isfile(path)) {
|
|
3254
3137
|
error = p_unlink(path);
|
|
3255
|
-
} else if (
|
|
3138
|
+
} else if (git_fs_path_isdir(path)) {
|
|
3256
3139
|
error = git_futils_rmdir_r(path, NULL,
|
|
3257
3140
|
GIT_RMDIR_REMOVE_FILES | GIT_RMDIR_REMOVE_BLOCKERS);
|
|
3258
3141
|
}
|
|
3259
3142
|
|
|
3260
|
-
|
|
3143
|
+
git_str_clear(&buf);
|
|
3261
3144
|
}
|
|
3262
3145
|
|
|
3263
|
-
|
|
3146
|
+
git_str_dispose(&buf);
|
|
3264
3147
|
return error;
|
|
3265
3148
|
}
|
|
3266
3149
|
|
|
@@ -3285,15 +3168,15 @@ int git_repository_state_cleanup(git_repository *repo)
|
|
|
3285
3168
|
|
|
3286
3169
|
int git_repository_is_shallow(git_repository *repo)
|
|
3287
3170
|
{
|
|
3288
|
-
|
|
3171
|
+
git_str path = GIT_STR_INIT;
|
|
3289
3172
|
struct stat st;
|
|
3290
3173
|
int error;
|
|
3291
3174
|
|
|
3292
|
-
if ((error =
|
|
3175
|
+
if ((error = git_str_joinpath(&path, repo->gitdir, "shallow")) < 0)
|
|
3293
3176
|
return error;
|
|
3294
3177
|
|
|
3295
|
-
error =
|
|
3296
|
-
|
|
3178
|
+
error = git_fs_path_lstat(path.ptr, &st);
|
|
3179
|
+
git_str_dispose(&path);
|
|
3297
3180
|
|
|
3298
3181
|
if (error == GIT_ENOTFOUND) {
|
|
3299
3182
|
git_error_clear();
|