rugged 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE +1 -0
- data/README.md +3 -3
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_commit.c +1 -1
- data/ext/rugged/rugged_config.c +1 -1
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_remote.c +32 -2
- data/ext/rugged/rugged_repo.c +13 -3
- data/lib/rugged/commit.rb +17 -4
- data/lib/rugged/repository.rb +7 -8
- data/lib/rugged/submodule_collection.rb +4 -4
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +41 -74
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/{Modules/AddCFlagIfSupported.cmake → AddCFlagIfSupported.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/EnableWarnings.cmake → EnableWarnings.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindCoreFoundation.cmake → FindCoreFoundation.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSAPI.cmake → FindGSSAPI.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindGSSFramework.cmake → FindGSSFramework.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindHTTP_Parser.cmake → FindHTTP_Parser.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindIconv.cmake → FindIconv.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE.cmake → FindPCRE.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPCRE2.cmake → FindPCRE2.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindPkgLibraries.cmake → FindPkgLibraries.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindSecurity.cmake → FindSecurity.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/FindStatNsec.cmake → FindStatNsec.cmake} +0 -0
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/{Modules/FindmbedTLS.cmake → FindmbedTLS.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/IdeSplitSources.cmake → IdeSplitSources.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/PkgBuildConfig.cmake → PkgBuildConfig.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SanitizeBool.cmake → SanitizeBool.cmake} +0 -0
- data/vendor/libgit2/cmake/{Modules/SelectGSSAPI.cmake → SelectGSSAPI.cmake} +18 -26
- data/vendor/libgit2/cmake/{Modules/SelectHTTPSBackend.cmake → SelectHTTPSBackend.cmake} +29 -32
- data/vendor/libgit2/cmake/{Modules/SelectHashes.cmake → SelectHashes.cmake} +21 -28
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/http-parser/CMakeLists.txt +4 -3
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +24 -10
- data/vendor/libgit2/deps/ntlmclient/compat.h +0 -27
- data/vendor/libgit2/deps/ntlmclient/crypt.h +14 -9
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.c +20 -20
- data/vendor/libgit2/deps/ntlmclient/crypt_commoncrypto.h +3 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.c +37 -36
- data/vendor/libgit2/deps/ntlmclient/crypt_mbedtls.h +4 -3
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.c +178 -51
- data/vendor/libgit2/deps/ntlmclient/crypt_openssl.h +74 -5
- data/vendor/libgit2/deps/ntlmclient/ntlm.c +164 -135
- data/vendor/libgit2/deps/ntlmclient/ntlm.h +13 -9
- data/vendor/libgit2/deps/ntlmclient/ntlmclient.h +16 -3
- data/vendor/libgit2/deps/ntlmclient/unicode.h +10 -4
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.c +16 -27
- data/vendor/libgit2/deps/ntlmclient/unicode_builtin.h +20 -0
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.c +28 -52
- data/vendor/libgit2/deps/ntlmclient/unicode_iconv.h +22 -0
- data/vendor/libgit2/deps/ntlmclient/util.c +15 -1
- data/vendor/libgit2/deps/ntlmclient/util.h +2 -1
- data/vendor/libgit2/deps/pcre/LICENCE +93 -0
- data/vendor/libgit2/deps/pcre/pcre.h +2 -2
- data/vendor/libgit2/deps/pcre/pcre_compile.c +29 -17
- data/vendor/libgit2/deps/pcre/pcre_jit_compile.c +4 -4
- data/vendor/libgit2/deps/pcre/pcreposix.c +2 -3
- data/vendor/libgit2/deps/zlib/CMakeLists.txt +6 -5
- data/vendor/libgit2/deps/zlib/deflate.c +1 -0
- data/vendor/libgit2/include/git2/annotated_commit.h +1 -1
- data/vendor/libgit2/include/git2/apply.h +2 -0
- data/vendor/libgit2/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +95 -42
- data/vendor/libgit2/include/git2/blob.h +31 -3
- data/vendor/libgit2/include/git2/branch.h +25 -0
- data/vendor/libgit2/include/git2/cert.h +42 -5
- data/vendor/libgit2/include/git2/checkout.h +28 -12
- data/vendor/libgit2/include/git2/commit.h +35 -19
- data/vendor/libgit2/include/git2/common.h +33 -6
- data/vendor/libgit2/include/git2/config.h +1 -1
- data/vendor/libgit2/include/git2/deprecated.h +248 -8
- data/vendor/libgit2/include/git2/diff.h +35 -20
- data/vendor/libgit2/include/git2/errors.h +8 -7
- data/vendor/libgit2/include/git2/filter.h +57 -17
- data/vendor/libgit2/include/git2/graph.h +20 -2
- data/vendor/libgit2/include/git2/index.h +4 -5
- data/vendor/libgit2/include/git2/indexer.h +2 -1
- data/vendor/libgit2/include/git2/odb.h +44 -20
- data/vendor/libgit2/include/git2/pack.h +1 -1
- data/vendor/libgit2/include/git2/patch.h +8 -0
- data/vendor/libgit2/include/git2/rebase.h +25 -1
- data/vendor/libgit2/include/git2/refs.h +9 -5
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/repository.h +95 -52
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- data/vendor/libgit2/include/git2/strarray.h +6 -10
- data/vendor/libgit2/include/git2/submodule.h +9 -0
- data/vendor/libgit2/include/git2/sys/commit_graph.h +174 -0
- data/vendor/libgit2/include/git2/sys/filter.h +49 -28
- data/vendor/libgit2/include/git2/sys/midx.h +74 -0
- data/vendor/libgit2/include/git2/sys/odb_backend.h +7 -0
- data/vendor/libgit2/include/git2/sys/transport.h +1 -0
- data/vendor/libgit2/include/git2/tag.h +12 -0
- data/vendor/libgit2/include/git2/transport.h +1 -1
- data/vendor/libgit2/include/git2/tree.h +2 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +3 -3
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +77 -44
- data/vendor/libgit2/src/alloc.c +21 -8
- data/vendor/libgit2/src/allocators/failalloc.c +92 -0
- data/vendor/libgit2/src/allocators/failalloc.h +23 -0
- data/vendor/libgit2/src/allocators/stdalloc.c +41 -10
- data/vendor/libgit2/src/allocators/win32_leakcheck.c +118 -0
- data/vendor/libgit2/src/allocators/{win32_crtdbg.h → win32_leakcheck.h} +3 -3
- data/vendor/libgit2/src/annotated_commit.c +21 -9
- data/vendor/libgit2/src/apply.c +21 -8
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/assert_safe.h +58 -0
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +92 -42
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +44 -40
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +28 -15
- data/vendor/libgit2/src/blame_git.c +6 -3
- data/vendor/libgit2/src/blob.c +46 -24
- data/vendor/libgit2/src/branch.c +87 -37
- data/vendor/libgit2/src/buffer.c +339 -27
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +3 -24
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +97 -98
- data/vendor/libgit2/src/cherrypick.c +8 -2
- data/vendor/libgit2/src/clone.c +104 -29
- data/vendor/libgit2/src/commit.c +41 -28
- data/vendor/libgit2/src/commit_graph.c +1209 -0
- data/vendor/libgit2/src/commit_graph.h +162 -0
- data/vendor/libgit2/src/commit_list.c +46 -0
- data/vendor/libgit2/src/commit_list.h +2 -0
- data/vendor/libgit2/src/common.h +26 -2
- data/vendor/libgit2/src/config.c +40 -22
- data/vendor/libgit2/src/config_cache.c +9 -4
- data/vendor/libgit2/src/config_entries.c +35 -27
- data/vendor/libgit2/src/config_file.c +25 -8
- data/vendor/libgit2/src/config_parse.c +5 -7
- data/vendor/libgit2/src/config_snapshot.c +2 -1
- data/vendor/libgit2/src/crlf.c +16 -6
- data/vendor/libgit2/src/date.c +4 -3
- data/vendor/libgit2/src/delta.c +1 -1
- data/vendor/libgit2/src/describe.c +11 -4
- data/vendor/libgit2/src/diff.c +23 -19
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +5 -7
- data/vendor/libgit2/src/diff_generate.c +56 -28
- data/vendor/libgit2/src/diff_parse.c +2 -3
- data/vendor/libgit2/src/diff_print.c +81 -65
- data/vendor/libgit2/src/diff_stats.c +19 -16
- data/vendor/libgit2/src/diff_tform.c +13 -13
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +26 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +7 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +209 -113
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +8 -8
- data/vendor/libgit2/src/futils.h +4 -4
- data/vendor/libgit2/src/graph.c +64 -9
- data/vendor/libgit2/src/hash/sha1/collisiondetect.c +3 -3
- data/vendor/libgit2/src/hash/sha1/common_crypto.c +3 -3
- data/vendor/libgit2/src/hash/sha1/generic.h +1 -1
- data/vendor/libgit2/src/hash/sha1/mbedtls.c +12 -12
- data/vendor/libgit2/src/hash/sha1/openssl.c +3 -3
- data/vendor/libgit2/src/hash/sha1/sha1dc/sha1.c +0 -2
- data/vendor/libgit2/src/hash/sha1/win32.c +15 -11
- data/vendor/libgit2/src/hash.c +16 -13
- data/vendor/libgit2/src/hash.h +1 -1
- data/vendor/libgit2/src/hashsig.c +23 -10
- data/vendor/libgit2/src/ident.c +13 -3
- data/vendor/libgit2/src/idxmap.c +0 -22
- data/vendor/libgit2/src/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +126 -84
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +60 -36
- data/vendor/libgit2/src/integer.h +79 -2
- data/vendor/libgit2/src/iterator.c +40 -28
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +125 -49
- data/vendor/libgit2/src/libgit2.h +15 -0
- data/vendor/libgit2/src/mailmap.c +23 -10
- data/vendor/libgit2/src/map.h +3 -3
- data/vendor/libgit2/src/merge.c +108 -46
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +15 -9
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +879 -0
- data/vendor/libgit2/src/midx.h +110 -0
- data/vendor/libgit2/src/mwindow.c +214 -95
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +133 -4
- data/vendor/libgit2/src/net.h +16 -2
- data/vendor/libgit2/src/netops.c +6 -4
- data/vendor/libgit2/src/netops.h +2 -2
- data/vendor/libgit2/src/notes.c +10 -10
- data/vendor/libgit2/src/object.c +24 -15
- data/vendor/libgit2/src/odb.c +298 -57
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +31 -21
- data/vendor/libgit2/src/odb_mempack.c +3 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +7 -4
- data/vendor/libgit2/src/pack-objects.c +83 -69
- data/vendor/libgit2/src/pack.c +383 -150
- data/vendor/libgit2/src/pack.h +44 -9
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +3 -5
- data/vendor/libgit2/src/patch_parse.c +6 -3
- data/vendor/libgit2/src/path.c +102 -57
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +12 -11
- data/vendor/libgit2/src/pool.c +34 -22
- data/vendor/libgit2/src/pool.h +9 -1
- data/vendor/libgit2/src/posix.c +43 -12
- data/vendor/libgit2/src/posix.h +9 -0
- data/vendor/libgit2/src/proxy.c +2 -0
- data/vendor/libgit2/src/push.c +2 -0
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +95 -49
- data/vendor/libgit2/src/refdb.c +165 -13
- data/vendor/libgit2/src/refdb.h +69 -0
- data/vendor/libgit2/src/refdb_fs.c +144 -152
- data/vendor/libgit2/src/reflog.c +21 -20
- data/vendor/libgit2/src/refs.c +151 -231
- data/vendor/libgit2/src/refs.h +2 -20
- data/vendor/libgit2/src/refspec.c +80 -44
- data/vendor/libgit2/src/regexp.c +2 -2
- data/vendor/libgit2/src/remote.c +312 -121
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +351 -189
- data/vendor/libgit2/src/repository.h +23 -29
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +8 -2
- data/vendor/libgit2/src/revparse.c +19 -13
- data/vendor/libgit2/src/revwalk.c +35 -20
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/{refdb_fs.h → settings.h} +3 -11
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.c +2 -3
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +7 -3
- data/vendor/libgit2/src/status.c +9 -4
- data/vendor/libgit2/src/strarray.c +64 -0
- data/vendor/libgit2/src/streams/mbedtls.c +14 -17
- data/vendor/libgit2/src/streams/mbedtls.h +1 -1
- data/vendor/libgit2/src/streams/openssl.c +113 -207
- data/vendor/libgit2/src/streams/openssl.h +9 -1
- data/vendor/libgit2/src/streams/openssl_dynamic.c +309 -0
- data/vendor/libgit2/src/streams/openssl_dynamic.h +348 -0
- data/vendor/libgit2/src/streams/openssl_legacy.c +203 -0
- data/vendor/libgit2/src/streams/openssl_legacy.h +63 -0
- data/vendor/libgit2/src/streams/registry.c +10 -9
- data/vendor/libgit2/src/streams/socket.c +6 -2
- data/vendor/libgit2/src/streams/stransport.c +6 -3
- data/vendor/libgit2/src/streams/tls.c +5 -3
- data/vendor/libgit2/src/submodule.c +134 -66
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +8 -26
- data/vendor/libgit2/src/sysdir.h +0 -11
- data/vendor/libgit2/src/tag.c +49 -11
- data/vendor/libgit2/src/thread.c +140 -0
- data/vendor/libgit2/src/thread.h +479 -0
- data/vendor/libgit2/src/threadstate.c +83 -0
- data/vendor/libgit2/src/threadstate.h +24 -0
- data/vendor/libgit2/src/trace.c +2 -2
- data/vendor/libgit2/src/trace.h +17 -13
- data/vendor/libgit2/src/transaction.c +21 -9
- data/vendor/libgit2/src/transport.c +3 -3
- data/vendor/libgit2/src/transports/auth.c +1 -1
- data/vendor/libgit2/src/transports/auth_negotiate.c +11 -4
- data/vendor/libgit2/src/transports/auth_ntlm.c +10 -6
- data/vendor/libgit2/src/transports/credential.c +17 -7
- data/vendor/libgit2/src/transports/credential_helpers.c +2 -0
- data/vendor/libgit2/src/transports/git.c +1 -3
- data/vendor/libgit2/src/transports/http.c +19 -17
- data/vendor/libgit2/src/transports/http.h +1 -0
- data/vendor/libgit2/src/transports/httpclient.c +84 -42
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +5 -5
- data/vendor/libgit2/src/transports/smart.c +14 -9
- data/vendor/libgit2/src/transports/smart.h +1 -1
- data/vendor/libgit2/src/transports/smart_protocol.c +11 -5
- data/vendor/libgit2/src/transports/ssh.c +51 -17
- data/vendor/libgit2/src/transports/winhttp.c +156 -88
- data/vendor/libgit2/src/tree.c +100 -77
- data/vendor/libgit2/src/tree.h +1 -0
- data/vendor/libgit2/src/tsort.c +0 -2
- data/vendor/libgit2/src/unix/map.c +3 -1
- data/vendor/libgit2/src/unix/posix.h +16 -1
- data/vendor/libgit2/src/unix/pthread.h +2 -1
- data/vendor/libgit2/src/utf8.c +150 -0
- data/vendor/libgit2/src/utf8.h +52 -0
- data/vendor/libgit2/src/util.c +74 -183
- data/vendor/libgit2/src/util.h +33 -39
- data/vendor/libgit2/src/vector.c +23 -19
- data/vendor/libgit2/src/vector.h +4 -2
- data/vendor/libgit2/src/win32/findfile.c +4 -2
- data/vendor/libgit2/src/win32/git2.rc +18 -3
- data/vendor/libgit2/src/win32/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +23 -25
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +77 -1
- data/vendor/libgit2/src/win32/precompiled.h +0 -1
- data/vendor/libgit2/src/win32/reparse.h +4 -4
- data/vendor/libgit2/src/win32/thread.c +24 -15
- data/vendor/libgit2/src/win32/thread.h +1 -1
- data/vendor/libgit2/src/win32/w32_buffer.c +3 -3
- data/vendor/libgit2/src/win32/w32_common.h +18 -9
- data/vendor/libgit2/src/win32/{w32_crtdbg_stacktrace.c → w32_leakcheck.c} +269 -33
- data/vendor/libgit2/src/win32/w32_leakcheck.h +222 -0
- data/vendor/libgit2/src/win32/w32_util.h +6 -6
- data/vendor/libgit2/src/worktree.c +37 -15
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +56 -38
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.c.in +0 -29
- data/vendor/libgit2/cmake/Modules/CheckPrototypeDefinition.cmake +0 -96
- data/vendor/libgit2/src/allocators/win32_crtdbg.c +0 -118
- data/vendor/libgit2/src/buf_text.c +0 -316
- data/vendor/libgit2/src/buf_text.h +0 -122
- data/vendor/libgit2/src/global.c +0 -361
- data/vendor/libgit2/src/global.h +0 -41
- data/vendor/libgit2/src/thread-utils.c +0 -58
- data/vendor/libgit2/src/thread-utils.h +0 -246
- data/vendor/libgit2/src/win32/w32_crtdbg_stacktrace.h +0 -127
- data/vendor/libgit2/src/win32/w32_stack.c +0 -188
- data/vendor/libgit2/src/win32/w32_stack.h +0 -140
|
@@ -10,7 +10,6 @@
|
|
|
10
10
|
#include "repository.h"
|
|
11
11
|
#include "filebuf.h"
|
|
12
12
|
#include "attrcache.h"
|
|
13
|
-
#include "buf_text.h"
|
|
14
13
|
#include "git2/blob.h"
|
|
15
14
|
#include "git2/tree.h"
|
|
16
15
|
#include "blob.h"
|
|
@@ -34,23 +33,28 @@ static void attr_file_free(git_attr_file *file)
|
|
|
34
33
|
int git_attr_file__new(
|
|
35
34
|
git_attr_file **out,
|
|
36
35
|
git_attr_file_entry *entry,
|
|
37
|
-
git_attr_file_source source)
|
|
36
|
+
git_attr_file_source *source)
|
|
38
37
|
{
|
|
39
38
|
git_attr_file *attrs = git__calloc(1, sizeof(git_attr_file));
|
|
40
39
|
GIT_ERROR_CHECK_ALLOC(attrs);
|
|
41
40
|
|
|
42
41
|
if (git_mutex_init(&attrs->lock) < 0) {
|
|
43
42
|
git_error_set(GIT_ERROR_OS, "failed to initialize lock");
|
|
44
|
-
|
|
45
|
-
return -1;
|
|
43
|
+
goto on_error;
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
git_pool_init(&attrs->pool, 1)
|
|
46
|
+
if (git_pool_init(&attrs->pool, 1) < 0)
|
|
47
|
+
goto on_error;
|
|
48
|
+
|
|
49
49
|
GIT_REFCOUNT_INC(attrs);
|
|
50
|
-
attrs->entry
|
|
51
|
-
attrs->source
|
|
50
|
+
attrs->entry = entry;
|
|
51
|
+
memcpy(&attrs->source, source, sizeof(git_attr_file_source));
|
|
52
52
|
*out = attrs;
|
|
53
53
|
return 0;
|
|
54
|
+
|
|
55
|
+
on_error:
|
|
56
|
+
git__free(attrs);
|
|
57
|
+
return -1;
|
|
54
58
|
}
|
|
55
59
|
|
|
56
60
|
int git_attr_file__clear_rules(git_attr_file *file, bool need_lock)
|
|
@@ -104,11 +108,12 @@ int git_attr_file__load(
|
|
|
104
108
|
git_repository *repo,
|
|
105
109
|
git_attr_session *attr_session,
|
|
106
110
|
git_attr_file_entry *entry,
|
|
107
|
-
git_attr_file_source source,
|
|
111
|
+
git_attr_file_source *source,
|
|
108
112
|
git_attr_file_parser parser,
|
|
109
113
|
bool allow_macros)
|
|
110
114
|
{
|
|
111
115
|
int error = 0;
|
|
116
|
+
git_commit *commit = NULL;
|
|
112
117
|
git_tree *tree = NULL;
|
|
113
118
|
git_tree_entry *tree_entry = NULL;
|
|
114
119
|
git_blob *blob = NULL;
|
|
@@ -118,17 +123,17 @@ int git_attr_file__load(
|
|
|
118
123
|
struct stat st;
|
|
119
124
|
bool nonexistent = false;
|
|
120
125
|
int bom_offset;
|
|
121
|
-
|
|
126
|
+
git_buf_bom_t bom;
|
|
122
127
|
git_oid id;
|
|
123
128
|
git_object_size_t blobsize;
|
|
124
129
|
|
|
125
130
|
*out = NULL;
|
|
126
131
|
|
|
127
|
-
switch (source) {
|
|
128
|
-
case
|
|
132
|
+
switch (source->type) {
|
|
133
|
+
case GIT_ATTR_FILE_SOURCE_MEMORY:
|
|
129
134
|
/* in-memory attribute file doesn't need data */
|
|
130
135
|
break;
|
|
131
|
-
case
|
|
136
|
+
case GIT_ATTR_FILE_SOURCE_INDEX: {
|
|
132
137
|
if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
|
|
133
138
|
(error = git_blob_lookup(&blob, repo, &id)) < 0)
|
|
134
139
|
return error;
|
|
@@ -141,7 +146,7 @@ int git_attr_file__load(
|
|
|
141
146
|
git_buf_put(&content, git_blob_rawcontent(blob), (size_t)blobsize);
|
|
142
147
|
break;
|
|
143
148
|
}
|
|
144
|
-
case
|
|
149
|
+
case GIT_ATTR_FILE_SOURCE_FILE: {
|
|
145
150
|
int fd = -1;
|
|
146
151
|
|
|
147
152
|
/* For open or read errors, pretend that we got ENOTFOUND. */
|
|
@@ -158,10 +163,31 @@ int git_attr_file__load(
|
|
|
158
163
|
|
|
159
164
|
break;
|
|
160
165
|
}
|
|
161
|
-
case
|
|
162
|
-
if (
|
|
163
|
-
|
|
164
|
-
|
|
166
|
+
case GIT_ATTR_FILE_SOURCE_COMMIT: {
|
|
167
|
+
if (source->commit_id) {
|
|
168
|
+
if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0 ||
|
|
169
|
+
(error = git_commit_tree(&tree, commit)) < 0)
|
|
170
|
+
goto cleanup;
|
|
171
|
+
} else {
|
|
172
|
+
if ((error = git_repository_head_tree(&tree, repo)) < 0)
|
|
173
|
+
goto cleanup;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if ((error = git_tree_entry_bypath(&tree_entry, tree, entry->path)) < 0) {
|
|
177
|
+
/*
|
|
178
|
+
* If the attributes file does not exist, we can
|
|
179
|
+
* cache an empty file for this commit to prevent
|
|
180
|
+
* needless future lookups.
|
|
181
|
+
*/
|
|
182
|
+
if (error == GIT_ENOTFOUND) {
|
|
183
|
+
error = 0;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
goto cleanup;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if ((error = git_blob_lookup(&blob, repo, git_tree_entry_id(tree_entry))) < 0)
|
|
165
191
|
goto cleanup;
|
|
166
192
|
|
|
167
193
|
/*
|
|
@@ -178,7 +204,7 @@ int git_attr_file__load(
|
|
|
178
204
|
break;
|
|
179
205
|
}
|
|
180
206
|
default:
|
|
181
|
-
git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source);
|
|
207
|
+
git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source->type);
|
|
182
208
|
return -1;
|
|
183
209
|
}
|
|
184
210
|
|
|
@@ -187,9 +213,9 @@ int git_attr_file__load(
|
|
|
187
213
|
|
|
188
214
|
/* advance over a UTF8 BOM */
|
|
189
215
|
content_str = git_buf_cstr(&content);
|
|
190
|
-
bom_offset =
|
|
216
|
+
bom_offset = git_buf_detect_bom(&bom, &content);
|
|
191
217
|
|
|
192
|
-
if (bom ==
|
|
218
|
+
if (bom == GIT_BUF_BOM_UTF8)
|
|
193
219
|
content_str += bom_offset;
|
|
194
220
|
|
|
195
221
|
/* store the key of the attr_reader; don't bother with cache
|
|
@@ -206,11 +232,11 @@ int git_attr_file__load(
|
|
|
206
232
|
/* write cache breakers */
|
|
207
233
|
if (nonexistent)
|
|
208
234
|
file->nonexistent = 1;
|
|
209
|
-
else if (source ==
|
|
235
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_INDEX)
|
|
210
236
|
git_oid_cpy(&file->cache_data.oid, git_blob_id(blob));
|
|
211
|
-
else if (source ==
|
|
237
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_COMMIT)
|
|
212
238
|
git_oid_cpy(&file->cache_data.oid, git_tree_id(tree));
|
|
213
|
-
else if (source ==
|
|
239
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_FILE)
|
|
214
240
|
git_futils_filestamp_set_from_stat(&file->cache_data.stamp, &st);
|
|
215
241
|
/* else always cacheable */
|
|
216
242
|
|
|
@@ -220,6 +246,7 @@ cleanup:
|
|
|
220
246
|
git_blob_free(blob);
|
|
221
247
|
git_tree_entry_free(tree_entry);
|
|
222
248
|
git_tree_free(tree);
|
|
249
|
+
git_commit_free(commit);
|
|
223
250
|
git_buf_dispose(&content);
|
|
224
251
|
|
|
225
252
|
return error;
|
|
@@ -228,7 +255,8 @@ cleanup:
|
|
|
228
255
|
int git_attr_file__out_of_date(
|
|
229
256
|
git_repository *repo,
|
|
230
257
|
git_attr_session *attr_session,
|
|
231
|
-
git_attr_file *file
|
|
258
|
+
git_attr_file *file,
|
|
259
|
+
git_attr_file_source *source)
|
|
232
260
|
{
|
|
233
261
|
if (!file)
|
|
234
262
|
return 1;
|
|
@@ -241,15 +269,15 @@ int git_attr_file__out_of_date(
|
|
|
241
269
|
else if (file->nonexistent)
|
|
242
270
|
return 1;
|
|
243
271
|
|
|
244
|
-
switch (file->source) {
|
|
245
|
-
case
|
|
272
|
+
switch (file->source.type) {
|
|
273
|
+
case GIT_ATTR_FILE_SOURCE_MEMORY:
|
|
246
274
|
return 0;
|
|
247
275
|
|
|
248
|
-
case
|
|
276
|
+
case GIT_ATTR_FILE_SOURCE_FILE:
|
|
249
277
|
return git_futils_filestamp_check(
|
|
250
278
|
&file->cache_data.stamp, file->entry->fullpath);
|
|
251
279
|
|
|
252
|
-
case
|
|
280
|
+
case GIT_ATTR_FILE_SOURCE_INDEX: {
|
|
253
281
|
int error;
|
|
254
282
|
git_oid id;
|
|
255
283
|
|
|
@@ -260,21 +288,34 @@ int git_attr_file__out_of_date(
|
|
|
260
288
|
return (git_oid__cmp(&file->cache_data.oid, &id) != 0);
|
|
261
289
|
}
|
|
262
290
|
|
|
263
|
-
case
|
|
264
|
-
git_tree *tree;
|
|
291
|
+
case GIT_ATTR_FILE_SOURCE_COMMIT: {
|
|
292
|
+
git_tree *tree = NULL;
|
|
265
293
|
int error;
|
|
266
294
|
|
|
267
|
-
if (
|
|
295
|
+
if (source->commit_id) {
|
|
296
|
+
git_commit *commit = NULL;
|
|
297
|
+
|
|
298
|
+
if ((error = git_commit_lookup(&commit, repo, source->commit_id)) < 0)
|
|
299
|
+
return error;
|
|
300
|
+
|
|
301
|
+
error = git_commit_tree(&tree, commit);
|
|
302
|
+
|
|
303
|
+
git_commit_free(commit);
|
|
304
|
+
} else {
|
|
305
|
+
error = git_repository_head_tree(&tree, repo);
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (error < 0)
|
|
268
309
|
return error;
|
|
269
310
|
|
|
270
|
-
error = git_oid__cmp(&file->cache_data.oid, git_tree_id(tree));
|
|
311
|
+
error = (git_oid__cmp(&file->cache_data.oid, git_tree_id(tree)) != 0);
|
|
271
312
|
|
|
272
313
|
git_tree_free(tree);
|
|
273
314
|
return error;
|
|
274
315
|
}
|
|
275
316
|
|
|
276
317
|
default:
|
|
277
|
-
git_error_set(GIT_ERROR_INVALID, "invalid file type %d", file->source);
|
|
318
|
+
git_error_set(GIT_ERROR_INVALID, "invalid file type %d", file->source.type);
|
|
278
319
|
return -1;
|
|
279
320
|
}
|
|
280
321
|
}
|
|
@@ -346,7 +387,9 @@ uint32_t git_attr_file__name_hash(const char *name)
|
|
|
346
387
|
{
|
|
347
388
|
uint32_t h = 5381;
|
|
348
389
|
int c;
|
|
349
|
-
|
|
390
|
+
|
|
391
|
+
GIT_ASSERT_ARG(name);
|
|
392
|
+
|
|
350
393
|
while ((c = (int)*name++) != 0)
|
|
351
394
|
h = ((h << 5) + h) + c;
|
|
352
395
|
return h;
|
|
@@ -383,6 +426,7 @@ int git_attr_file__lookup_one(
|
|
|
383
426
|
int git_attr_file__load_standalone(git_attr_file **out, const char *path)
|
|
384
427
|
{
|
|
385
428
|
git_buf content = GIT_BUF_INIT;
|
|
429
|
+
git_attr_file_source source = { GIT_ATTR_FILE_SOURCE_FILE };
|
|
386
430
|
git_attr_file *file = NULL;
|
|
387
431
|
int error;
|
|
388
432
|
|
|
@@ -394,9 +438,9 @@ int git_attr_file__load_standalone(git_attr_file **out, const char *path)
|
|
|
394
438
|
* don't have to free it - freeing file+pool will free cache entry, too.
|
|
395
439
|
*/
|
|
396
440
|
|
|
397
|
-
if ((error = git_attr_file__new(&file, NULL,
|
|
441
|
+
if ((error = git_attr_file__new(&file, NULL, &source)) < 0 ||
|
|
398
442
|
(error = git_attr_file__parse_buffer(NULL, file, content.ptr, true)) < 0 ||
|
|
399
|
-
(error = git_attr_cache__alloc_file_entry(&file->entry, NULL, path, &file->pool)) < 0)
|
|
443
|
+
(error = git_attr_cache__alloc_file_entry(&file->entry, NULL, NULL, path, &file->pool)) < 0)
|
|
400
444
|
goto out;
|
|
401
445
|
|
|
402
446
|
*out = file;
|
|
@@ -496,14 +540,19 @@ git_attr_assignment *git_attr_rule__lookup_assignment(
|
|
|
496
540
|
}
|
|
497
541
|
|
|
498
542
|
int git_attr_path__init(
|
|
499
|
-
git_attr_path *info,
|
|
543
|
+
git_attr_path *info,
|
|
544
|
+
git_repository *repo,
|
|
545
|
+
const char *path,
|
|
546
|
+
const char *base,
|
|
547
|
+
git_dir_flag dir_flag)
|
|
500
548
|
{
|
|
501
549
|
ssize_t root;
|
|
502
550
|
|
|
503
551
|
/* build full path as best we can */
|
|
504
552
|
git_buf_init(&info->full, 0);
|
|
505
553
|
|
|
506
|
-
if (git_path_join_unrooted(&info->full, path, base, &root) < 0
|
|
554
|
+
if (git_path_join_unrooted(&info->full, path, base, &root) < 0 ||
|
|
555
|
+
git_path_validate_workdir_buf(repo, &info->full) < 0)
|
|
507
556
|
return -1;
|
|
508
557
|
|
|
509
558
|
info->path = info->full.ptr + root;
|
|
@@ -655,7 +704,8 @@ int git_attr_fnmatch__parse(
|
|
|
655
704
|
int slash_count, allow_space;
|
|
656
705
|
bool escaped;
|
|
657
706
|
|
|
658
|
-
|
|
707
|
+
GIT_ASSERT_ARG(spec);
|
|
708
|
+
GIT_ASSERT_ARG(base && *base);
|
|
659
709
|
|
|
660
710
|
if (parse_optimized_patterns(spec, pool, *base))
|
|
661
711
|
return 0;
|
|
@@ -823,7 +873,7 @@ int git_attr_assignment__parse(
|
|
|
823
873
|
const char *scan = *base;
|
|
824
874
|
git_attr_assignment *assign = NULL;
|
|
825
875
|
|
|
826
|
-
|
|
876
|
+
GIT_ASSERT_ARG(assigns && !assigns->length);
|
|
827
877
|
|
|
828
878
|
git_vector_set_cmp(assigns, sort_by_hash_and_name);
|
|
829
879
|
|
|
@@ -949,10 +999,10 @@ void git_attr_rule__free(git_attr_rule *rule)
|
|
|
949
999
|
|
|
950
1000
|
int git_attr_session__init(git_attr_session *session, git_repository *repo)
|
|
951
1001
|
{
|
|
952
|
-
|
|
1002
|
+
GIT_ASSERT_ARG(repo);
|
|
953
1003
|
|
|
954
1004
|
memset(session, 0, sizeof(*session));
|
|
955
|
-
session->key =
|
|
1005
|
+
session->key = git_atomic32_inc(&repo->attr_session_key);
|
|
956
1006
|
|
|
957
1007
|
return 0;
|
|
958
1008
|
}
|
|
@@ -37,12 +37,30 @@
|
|
|
37
37
|
(GIT_ATTR_FNMATCH_ALLOWSPACE | GIT_ATTR_FNMATCH_ALLOWNEG | GIT_ATTR_FNMATCH_ALLOWMACRO)
|
|
38
38
|
|
|
39
39
|
typedef enum {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
GIT_ATTR_FILE_SOURCE_MEMORY = 0,
|
|
41
|
+
GIT_ATTR_FILE_SOURCE_FILE = 1,
|
|
42
|
+
GIT_ATTR_FILE_SOURCE_INDEX = 2,
|
|
43
|
+
GIT_ATTR_FILE_SOURCE_COMMIT = 3,
|
|
44
44
|
|
|
45
|
-
GIT_ATTR_FILE_NUM_SOURCES
|
|
45
|
+
GIT_ATTR_FILE_NUM_SOURCES = 4
|
|
46
|
+
} git_attr_file_source_t;
|
|
47
|
+
|
|
48
|
+
typedef struct {
|
|
49
|
+
/* The source location for the attribute file. */
|
|
50
|
+
git_attr_file_source_t type;
|
|
51
|
+
|
|
52
|
+
/*
|
|
53
|
+
* The filename of the attribute file to read (relative to the
|
|
54
|
+
* given base path).
|
|
55
|
+
*/
|
|
56
|
+
const char *base;
|
|
57
|
+
const char *filename;
|
|
58
|
+
|
|
59
|
+
/*
|
|
60
|
+
* The commit ID when the given source type is a commit (or NULL
|
|
61
|
+
* for the repository's HEAD commit.)
|
|
62
|
+
*/
|
|
63
|
+
git_oid *commit_id;
|
|
46
64
|
} git_attr_file_source;
|
|
47
65
|
|
|
48
66
|
extern const char *git_attr__true;
|
|
@@ -124,7 +142,7 @@ extern int git_attr_get_many_with_session(
|
|
|
124
142
|
const char **values_out,
|
|
125
143
|
git_repository *repo,
|
|
126
144
|
git_attr_session *attr_session,
|
|
127
|
-
|
|
145
|
+
git_attr_options *opts,
|
|
128
146
|
const char *path,
|
|
129
147
|
size_t num_attr,
|
|
130
148
|
const char **names);
|
|
@@ -142,7 +160,7 @@ typedef int (*git_attr_file_parser)(
|
|
|
142
160
|
int git_attr_file__new(
|
|
143
161
|
git_attr_file **out,
|
|
144
162
|
git_attr_file_entry *entry,
|
|
145
|
-
git_attr_file_source source);
|
|
163
|
+
git_attr_file_source *source);
|
|
146
164
|
|
|
147
165
|
void git_attr_file__free(git_attr_file *file);
|
|
148
166
|
|
|
@@ -151,7 +169,7 @@ int git_attr_file__load(
|
|
|
151
169
|
git_repository *repo,
|
|
152
170
|
git_attr_session *attr_session,
|
|
153
171
|
git_attr_file_entry *ce,
|
|
154
|
-
git_attr_file_source source,
|
|
172
|
+
git_attr_file_source *source,
|
|
155
173
|
git_attr_file_parser parser,
|
|
156
174
|
bool allow_macros);
|
|
157
175
|
|
|
@@ -159,7 +177,7 @@ int git_attr_file__load_standalone(
|
|
|
159
177
|
git_attr_file **out, const char *path);
|
|
160
178
|
|
|
161
179
|
int git_attr_file__out_of_date(
|
|
162
|
-
git_repository *repo, git_attr_session *session, git_attr_file *file);
|
|
180
|
+
git_repository *repo, git_attr_session *session, git_attr_file *file, git_attr_file_source *source);
|
|
163
181
|
|
|
164
182
|
int git_attr_file__parse_buffer(
|
|
165
183
|
git_repository *repo, git_attr_file *attrs, const char *data, bool allow_macros);
|
|
@@ -207,8 +225,11 @@ extern git_attr_assignment *git_attr_rule__lookup_assignment(
|
|
|
207
225
|
typedef enum { GIT_DIR_FLAG_TRUE = 1, GIT_DIR_FLAG_FALSE = 0, GIT_DIR_FLAG_UNKNOWN = -1 } git_dir_flag;
|
|
208
226
|
|
|
209
227
|
extern int git_attr_path__init(
|
|
210
|
-
git_attr_path *
|
|
211
|
-
|
|
228
|
+
git_attr_path *out,
|
|
229
|
+
git_repository *repo,
|
|
230
|
+
const char *path,
|
|
231
|
+
const char *base,
|
|
232
|
+
git_dir_flag is_dir);
|
|
212
233
|
extern void git_attr_path__free(git_attr_path *info);
|
|
213
234
|
|
|
214
235
|
extern int git_attr_assignment__parse(
|
|
@@ -38,6 +38,7 @@ GIT_INLINE(git_attr_file_entry *) attr_cache_lookup_entry(
|
|
|
38
38
|
|
|
39
39
|
int git_attr_cache__alloc_file_entry(
|
|
40
40
|
git_attr_file_entry **out,
|
|
41
|
+
git_repository *repo,
|
|
41
42
|
const char *base,
|
|
42
43
|
const char *path,
|
|
43
44
|
git_pool *pool)
|
|
@@ -65,6 +66,9 @@ int git_attr_cache__alloc_file_entry(
|
|
|
65
66
|
}
|
|
66
67
|
memcpy(&ce->fullpath[baselen], path, pathlen);
|
|
67
68
|
|
|
69
|
+
if (git_path_validate_workdir_with_len(repo, ce->fullpath, pathlen + baselen) < 0)
|
|
70
|
+
return -1;
|
|
71
|
+
|
|
68
72
|
ce->path = &ce->fullpath[baselen];
|
|
69
73
|
*out = ce;
|
|
70
74
|
|
|
@@ -79,8 +83,8 @@ static int attr_cache_make_entry(
|
|
|
79
83
|
git_attr_file_entry *entry = NULL;
|
|
80
84
|
int error;
|
|
81
85
|
|
|
82
|
-
if ((error = git_attr_cache__alloc_file_entry(&entry,
|
|
83
|
-
|
|
86
|
+
if ((error = git_attr_cache__alloc_file_entry(&entry, repo,
|
|
87
|
+
git_repository_workdir(repo), path, &cache->pool)) < 0)
|
|
84
88
|
return error;
|
|
85
89
|
|
|
86
90
|
if ((error = git_strmap_set(cache->files, entry->path, entry)) < 0)
|
|
@@ -108,7 +112,7 @@ static int attr_cache_upsert(git_attr_cache *cache, git_attr_file *file)
|
|
|
108
112
|
* Replace the existing value if another thread has
|
|
109
113
|
* created it in the meantime.
|
|
110
114
|
*/
|
|
111
|
-
old =
|
|
115
|
+
old = git_atomic_swap(entry->file[file->source.type], file);
|
|
112
116
|
|
|
113
117
|
if (old) {
|
|
114
118
|
GIT_REFCOUNT_OWN(old, NULL);
|
|
@@ -123,7 +127,7 @@ static int attr_cache_remove(git_attr_cache *cache, git_attr_file *file)
|
|
|
123
127
|
{
|
|
124
128
|
int error = 0;
|
|
125
129
|
git_attr_file_entry *entry;
|
|
126
|
-
git_attr_file *
|
|
130
|
+
git_attr_file *oldfile = NULL;
|
|
127
131
|
|
|
128
132
|
if (!file)
|
|
129
133
|
return 0;
|
|
@@ -132,13 +136,13 @@ static int attr_cache_remove(git_attr_cache *cache, git_attr_file *file)
|
|
|
132
136
|
return error;
|
|
133
137
|
|
|
134
138
|
if ((entry = attr_cache_lookup_entry(cache, file->entry->path)) != NULL)
|
|
135
|
-
|
|
139
|
+
oldfile = git_atomic_compare_and_swap(&entry->file[file->source.type], file, NULL);
|
|
136
140
|
|
|
137
141
|
attr_cache_unlock(cache);
|
|
138
142
|
|
|
139
|
-
if (
|
|
140
|
-
GIT_REFCOUNT_OWN(
|
|
141
|
-
git_attr_file__free(
|
|
143
|
+
if (oldfile == file) {
|
|
144
|
+
GIT_REFCOUNT_OWN(file, NULL);
|
|
145
|
+
git_attr_file__free(file);
|
|
142
146
|
}
|
|
143
147
|
|
|
144
148
|
return error;
|
|
@@ -154,40 +158,42 @@ static int attr_cache_lookup(
|
|
|
154
158
|
git_attr_file_entry **out_entry,
|
|
155
159
|
git_repository *repo,
|
|
156
160
|
git_attr_session *attr_session,
|
|
157
|
-
git_attr_file_source source
|
|
158
|
-
const char *base,
|
|
159
|
-
const char *filename)
|
|
161
|
+
git_attr_file_source *source)
|
|
160
162
|
{
|
|
161
163
|
int error = 0;
|
|
162
164
|
git_buf path = GIT_BUF_INIT;
|
|
163
|
-
const char *wd = git_repository_workdir(repo)
|
|
165
|
+
const char *wd = git_repository_workdir(repo);
|
|
166
|
+
const char *filename;
|
|
164
167
|
git_attr_cache *cache = git_repository_attr_cache(repo);
|
|
165
168
|
git_attr_file_entry *entry = NULL;
|
|
166
169
|
git_attr_file *file = NULL;
|
|
167
170
|
|
|
168
171
|
/* join base and path as needed */
|
|
169
|
-
if (base != NULL && git_path_root(filename) < 0) {
|
|
172
|
+
if (source->base != NULL && git_path_root(source->filename) < 0) {
|
|
170
173
|
git_buf *p = attr_session ? &attr_session->tmp : &path;
|
|
171
174
|
|
|
172
|
-
if (git_buf_joinpath(p, base, filename) < 0
|
|
175
|
+
if (git_buf_joinpath(p, source->base, source->filename) < 0 ||
|
|
176
|
+
git_path_validate_workdir_buf(repo, p) < 0)
|
|
173
177
|
return -1;
|
|
174
178
|
|
|
175
179
|
filename = p->ptr;
|
|
180
|
+
} else {
|
|
181
|
+
filename = source->filename;
|
|
176
182
|
}
|
|
177
183
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
relfile += strlen(wd);
|
|
184
|
+
if (wd && !git__prefixcmp(filename, wd))
|
|
185
|
+
filename += strlen(wd);
|
|
181
186
|
|
|
182
187
|
/* check cache for existing entry */
|
|
183
188
|
if ((error = attr_cache_lock(cache)) < 0)
|
|
184
189
|
goto cleanup;
|
|
185
190
|
|
|
186
|
-
entry = attr_cache_lookup_entry(cache,
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
+
entry = attr_cache_lookup_entry(cache, filename);
|
|
192
|
+
|
|
193
|
+
if (!entry) {
|
|
194
|
+
error = attr_cache_make_entry(&entry, repo, filename);
|
|
195
|
+
} else if (entry->file[source->type] != NULL) {
|
|
196
|
+
file = entry->file[source->type];
|
|
191
197
|
GIT_REFCOUNT_INC(file);
|
|
192
198
|
}
|
|
193
199
|
|
|
@@ -205,9 +211,7 @@ int git_attr_cache__get(
|
|
|
205
211
|
git_attr_file **out,
|
|
206
212
|
git_repository *repo,
|
|
207
213
|
git_attr_session *attr_session,
|
|
208
|
-
git_attr_file_source source,
|
|
209
|
-
const char *base,
|
|
210
|
-
const char *filename,
|
|
214
|
+
git_attr_file_source *source,
|
|
211
215
|
git_attr_file_parser parser,
|
|
212
216
|
bool allow_macros)
|
|
213
217
|
{
|
|
@@ -216,19 +220,21 @@ int git_attr_cache__get(
|
|
|
216
220
|
git_attr_file_entry *entry = NULL;
|
|
217
221
|
git_attr_file *file = NULL, *updated = NULL;
|
|
218
222
|
|
|
219
|
-
if ((error = attr_cache_lookup(
|
|
220
|
-
&file, &entry, repo, attr_session, source, base, filename)) < 0)
|
|
223
|
+
if ((error = attr_cache_lookup(&file, &entry, repo, attr_session, source)) < 0)
|
|
221
224
|
return error;
|
|
222
225
|
|
|
223
226
|
/* load file if we don't have one or if existing one is out of date */
|
|
224
|
-
if (!file ||
|
|
225
|
-
|
|
227
|
+
if (!file ||
|
|
228
|
+
(error = git_attr_file__out_of_date(repo, attr_session, file, source)) > 0)
|
|
229
|
+
error = git_attr_file__load(&updated, repo, attr_session,
|
|
230
|
+
entry, source, parser,
|
|
231
|
+
allow_macros);
|
|
226
232
|
|
|
227
233
|
/* if we loaded the file, insert into and/or update cache */
|
|
228
234
|
if (updated) {
|
|
229
|
-
if ((error = attr_cache_upsert(cache, updated)) < 0)
|
|
235
|
+
if ((error = attr_cache_upsert(cache, updated)) < 0) {
|
|
230
236
|
git_attr_file__free(updated);
|
|
231
|
-
else {
|
|
237
|
+
} else {
|
|
232
238
|
git_attr_file__free(file); /* offset incref from lookup */
|
|
233
239
|
file = updated;
|
|
234
240
|
}
|
|
@@ -255,7 +261,7 @@ int git_attr_cache__get(
|
|
|
255
261
|
|
|
256
262
|
bool git_attr_cache__is_cached(
|
|
257
263
|
git_repository *repo,
|
|
258
|
-
|
|
264
|
+
git_attr_file_source_t source_type,
|
|
259
265
|
const char *filename)
|
|
260
266
|
{
|
|
261
267
|
git_attr_cache *cache = git_repository_attr_cache(repo);
|
|
@@ -268,7 +274,7 @@ bool git_attr_cache__is_cached(
|
|
|
268
274
|
if ((entry = git_strmap_get(files, filename)) == NULL)
|
|
269
275
|
return false;
|
|
270
276
|
|
|
271
|
-
return entry && (entry->file[
|
|
277
|
+
return entry && (entry->file[source_type] != NULL);
|
|
272
278
|
}
|
|
273
279
|
|
|
274
280
|
|
|
@@ -321,7 +327,7 @@ static void attr_cache__free(git_attr_cache *cache)
|
|
|
321
327
|
|
|
322
328
|
git_strmap_foreach_value(cache->files, entry, {
|
|
323
329
|
for (i = 0; i < GIT_ATTR_FILE_NUM_SOURCES; ++i) {
|
|
324
|
-
if ((file =
|
|
330
|
+
if ((file = git_atomic_swap(entry->file[i], NULL)) != NULL) {
|
|
325
331
|
GIT_REFCOUNT_OWN(file, NULL);
|
|
326
332
|
git_attr_file__free(file);
|
|
327
333
|
}
|
|
@@ -391,13 +397,11 @@ int git_attr_cache__init(git_repository *repo)
|
|
|
391
397
|
* hashtable for attribute macros, and string pool
|
|
392
398
|
*/
|
|
393
399
|
if ((ret = git_strmap_new(&cache->files)) < 0 ||
|
|
394
|
-
(ret = git_strmap_new(&cache->macros)) < 0
|
|
400
|
+
(ret = git_strmap_new(&cache->macros)) < 0 ||
|
|
401
|
+
(ret = git_pool_init(&cache->pool, 1)) < 0)
|
|
395
402
|
goto cancel;
|
|
396
403
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
cache = git__compare_and_swap(&repo->attrcache, NULL, cache);
|
|
400
|
-
if (cache)
|
|
404
|
+
if (git_atomic_compare_and_swap(&repo->attrcache, NULL, cache) != NULL)
|
|
401
405
|
goto cancel; /* raced with another thread, free this but no error */
|
|
402
406
|
|
|
403
407
|
git_config_free(cfg);
|
|
@@ -418,7 +422,7 @@ int git_attr_cache_flush(git_repository *repo)
|
|
|
418
422
|
/* this could be done less expensively, but for now, we'll just free
|
|
419
423
|
* the entire attrcache and let the next use reinitialize it...
|
|
420
424
|
*/
|
|
421
|
-
if (repo && (cache =
|
|
425
|
+
if (repo && (cache = git_atomic_swap(repo->attrcache, NULL)) != NULL)
|
|
422
426
|
attr_cache__free(cache);
|
|
423
427
|
|
|
424
428
|
return 0;
|