rugged 1.1.1 → 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 +1 -1
- data/ext/rugged/rugged.c +7 -4
- data/ext/rugged/rugged_object.c +1 -1
- data/ext/rugged/rugged_repo.c +3 -3
- data/lib/rugged/repository.rb +2 -2
- data/lib/rugged/version.rb +1 -1
- data/vendor/libgit2/CMakeLists.txt +11 -6
- data/vendor/libgit2/COPYING +109 -1
- data/vendor/libgit2/cmake/Findfutimens.cmake +14 -0
- data/vendor/libgit2/cmake/SelectHTTPSBackend.cmake +4 -0
- data/vendor/libgit2/cmake/SelectHashes.cmake +1 -0
- data/vendor/libgit2/deps/chromium-zlib/CMakeLists.txt +101 -0
- data/vendor/libgit2/deps/ntlmclient/CMakeLists.txt +17 -5
- 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 +150 -118
- 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/include/git2/attr.h +89 -0
- data/vendor/libgit2/include/git2/blame.h +93 -42
- data/vendor/libgit2/include/git2/blob.h +14 -2
- 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 +14 -4
- data/vendor/libgit2/include/git2/deprecated.h +206 -6
- data/vendor/libgit2/include/git2/diff.h +34 -19
- data/vendor/libgit2/include/git2/errors.h +6 -6
- 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 +2 -2
- data/vendor/libgit2/include/git2/odb.h +29 -0
- 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 +6 -2
- data/vendor/libgit2/include/git2/remote.h +59 -6
- data/vendor/libgit2/include/git2/revparse.h +5 -5
- data/vendor/libgit2/include/git2/status.h +115 -59
- 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/tree.h +0 -14
- data/vendor/libgit2/include/git2/types.h +9 -0
- data/vendor/libgit2/include/git2/version.h +4 -4
- data/vendor/libgit2/include/git2/worktree.h +1 -0
- data/vendor/libgit2/src/CMakeLists.txt +25 -4
- 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 +16 -7
- data/vendor/libgit2/src/array.h +11 -11
- data/vendor/libgit2/src/attr.c +181 -74
- data/vendor/libgit2/src/attr_file.c +84 -39
- data/vendor/libgit2/src/attr_file.h +32 -11
- data/vendor/libgit2/src/attrcache.c +42 -37
- data/vendor/libgit2/src/attrcache.h +4 -5
- data/vendor/libgit2/src/blame.c +11 -5
- data/vendor/libgit2/src/blob.c +35 -24
- data/vendor/libgit2/src/branch.c +69 -17
- data/vendor/libgit2/src/buffer.c +334 -25
- data/vendor/libgit2/src/buffer.h +153 -2
- data/vendor/libgit2/src/cache.c +2 -2
- data/vendor/libgit2/src/cache.h +7 -7
- data/vendor/libgit2/src/cc-compat.h +10 -2
- data/vendor/libgit2/src/checkout.c +48 -26
- data/vendor/libgit2/src/cherrypick.c +6 -2
- data/vendor/libgit2/src/clone.c +41 -47
- 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 +25 -2
- data/vendor/libgit2/src/config.c +37 -15
- data/vendor/libgit2/src/config_cache.c +5 -3
- data/vendor/libgit2/src/config_file.c +16 -8
- data/vendor/libgit2/src/config_parse.c +4 -6
- 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 +6 -3
- data/vendor/libgit2/src/diff.c +11 -8
- data/vendor/libgit2/src/diff_driver.c +21 -17
- data/vendor/libgit2/src/diff_file.c +2 -6
- data/vendor/libgit2/src/diff_generate.c +46 -17
- data/vendor/libgit2/src/diff_print.c +19 -6
- data/vendor/libgit2/src/diff_stats.c +7 -5
- data/vendor/libgit2/src/diff_tform.c +9 -8
- data/vendor/libgit2/src/diff_xdiff.c +4 -2
- data/vendor/libgit2/src/diff_xdiff.h +1 -1
- data/vendor/libgit2/src/errors.c +24 -19
- data/vendor/libgit2/src/features.h.in +5 -1
- data/vendor/libgit2/src/fetch.c +5 -2
- data/vendor/libgit2/src/fetchhead.c +8 -4
- data/vendor/libgit2/src/filebuf.c +9 -7
- data/vendor/libgit2/src/filter.c +206 -110
- data/vendor/libgit2/src/filter.h +24 -5
- data/vendor/libgit2/src/futils.c +5 -5
- data/vendor/libgit2/src/futils.h +1 -1
- 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/ignore.c +35 -19
- data/vendor/libgit2/src/index.c +106 -70
- data/vendor/libgit2/src/index.h +1 -1
- data/vendor/libgit2/src/indexer.c +31 -29
- data/vendor/libgit2/src/integer.h +64 -2
- data/vendor/libgit2/src/iterator.c +36 -24
- data/vendor/libgit2/src/iterator.h +1 -1
- data/vendor/libgit2/src/khash.h +2 -11
- data/vendor/libgit2/src/{settings.c → libgit2.c} +117 -50
- 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 +70 -30
- data/vendor/libgit2/src/merge.h +2 -1
- data/vendor/libgit2/src/merge_driver.c +19 -13
- data/vendor/libgit2/src/merge_file.c +11 -3
- data/vendor/libgit2/src/message.c +3 -1
- data/vendor/libgit2/src/midx.c +471 -10
- data/vendor/libgit2/src/midx.h +28 -1
- data/vendor/libgit2/src/mwindow.c +103 -59
- data/vendor/libgit2/src/mwindow.h +3 -3
- data/vendor/libgit2/src/net.c +127 -3
- 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 +22 -14
- data/vendor/libgit2/src/odb.c +285 -48
- data/vendor/libgit2/src/odb.h +16 -2
- data/vendor/libgit2/src/odb_loose.c +28 -18
- data/vendor/libgit2/src/odb_mempack.c +1 -1
- data/vendor/libgit2/src/odb_pack.c +391 -114
- data/vendor/libgit2/src/oid.c +5 -4
- data/vendor/libgit2/src/pack-objects.c +54 -48
- data/vendor/libgit2/src/pack.c +329 -119
- data/vendor/libgit2/src/pack.h +25 -7
- data/vendor/libgit2/src/patch.c +14 -7
- data/vendor/libgit2/src/patch_generate.c +2 -2
- data/vendor/libgit2/src/patch_parse.c +2 -1
- data/vendor/libgit2/src/path.c +98 -53
- data/vendor/libgit2/src/path.h +79 -6
- data/vendor/libgit2/src/pathspec.c +8 -8
- data/vendor/libgit2/src/pool.c +13 -7
- data/vendor/libgit2/src/posix.c +11 -3
- data/vendor/libgit2/src/reader.c +10 -6
- data/vendor/libgit2/src/rebase.c +93 -49
- data/vendor/libgit2/src/refdb.c +30 -13
- data/vendor/libgit2/src/refdb_fs.c +121 -69
- data/vendor/libgit2/src/reflog.c +19 -14
- data/vendor/libgit2/src/refs.c +76 -41
- data/vendor/libgit2/src/refspec.c +32 -12
- data/vendor/libgit2/src/remote.c +272 -102
- data/vendor/libgit2/src/remote.h +2 -1
- data/vendor/libgit2/src/repository.c +176 -103
- data/vendor/libgit2/src/repository.h +12 -1
- data/vendor/libgit2/src/reset.c +7 -6
- data/vendor/libgit2/src/revert.c +6 -2
- data/vendor/libgit2/src/revparse.c +14 -9
- data/vendor/libgit2/src/revwalk.c +32 -15
- data/vendor/libgit2/src/runtime.c +162 -0
- data/vendor/libgit2/src/runtime.h +62 -0
- data/vendor/libgit2/src/settings.h +11 -0
- data/vendor/libgit2/src/signature.c +6 -5
- data/vendor/libgit2/src/sortedcache.h +10 -8
- data/vendor/libgit2/src/stash.c +3 -1
- data/vendor/libgit2/src/status.c +7 -4
- data/vendor/libgit2/src/strarray.c +2 -1
- 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 +101 -201
- 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 +5 -6
- 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 +128 -62
- data/vendor/libgit2/src/submodule.h +9 -9
- data/vendor/libgit2/src/sysdir.c +4 -6
- data/vendor/libgit2/src/tag.c +47 -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 +19 -8
- 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 +15 -7
- 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 +53 -26
- data/vendor/libgit2/src/transports/httpclient.h +1 -1
- data/vendor/libgit2/src/transports/local.c +3 -3
- data/vendor/libgit2/src/transports/smart.c +12 -7
- 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 +41 -31
- 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/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 +53 -129
- 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/map.c +1 -1
- data/vendor/libgit2/src/win32/msvc-compat.h +9 -1
- data/vendor/libgit2/src/win32/path_w32.c +22 -24
- data/vendor/libgit2/src/win32/path_w32.h +0 -1
- data/vendor/libgit2/src/win32/posix_w32.c +7 -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 +27 -16
- data/vendor/libgit2/src/zstream.c +1 -1
- metadata +32 -16
- 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 -363
- 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 -369
- 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,7 +33,7 @@ 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);
|
|
@@ -48,8 +47,8 @@ int git_attr_file__new(
|
|
|
48
47
|
goto on_error;
|
|
49
48
|
|
|
50
49
|
GIT_REFCOUNT_INC(attrs);
|
|
51
|
-
attrs->entry
|
|
52
|
-
attrs->source
|
|
50
|
+
attrs->entry = entry;
|
|
51
|
+
memcpy(&attrs->source, source, sizeof(git_attr_file_source));
|
|
53
52
|
*out = attrs;
|
|
54
53
|
return 0;
|
|
55
54
|
|
|
@@ -109,11 +108,12 @@ int git_attr_file__load(
|
|
|
109
108
|
git_repository *repo,
|
|
110
109
|
git_attr_session *attr_session,
|
|
111
110
|
git_attr_file_entry *entry,
|
|
112
|
-
git_attr_file_source source,
|
|
111
|
+
git_attr_file_source *source,
|
|
113
112
|
git_attr_file_parser parser,
|
|
114
113
|
bool allow_macros)
|
|
115
114
|
{
|
|
116
115
|
int error = 0;
|
|
116
|
+
git_commit *commit = NULL;
|
|
117
117
|
git_tree *tree = NULL;
|
|
118
118
|
git_tree_entry *tree_entry = NULL;
|
|
119
119
|
git_blob *blob = NULL;
|
|
@@ -123,17 +123,17 @@ int git_attr_file__load(
|
|
|
123
123
|
struct stat st;
|
|
124
124
|
bool nonexistent = false;
|
|
125
125
|
int bom_offset;
|
|
126
|
-
|
|
126
|
+
git_buf_bom_t bom;
|
|
127
127
|
git_oid id;
|
|
128
128
|
git_object_size_t blobsize;
|
|
129
129
|
|
|
130
130
|
*out = NULL;
|
|
131
131
|
|
|
132
|
-
switch (source) {
|
|
133
|
-
case
|
|
132
|
+
switch (source->type) {
|
|
133
|
+
case GIT_ATTR_FILE_SOURCE_MEMORY:
|
|
134
134
|
/* in-memory attribute file doesn't need data */
|
|
135
135
|
break;
|
|
136
|
-
case
|
|
136
|
+
case GIT_ATTR_FILE_SOURCE_INDEX: {
|
|
137
137
|
if ((error = attr_file_oid_from_index(&id, repo, entry->path)) < 0 ||
|
|
138
138
|
(error = git_blob_lookup(&blob, repo, &id)) < 0)
|
|
139
139
|
return error;
|
|
@@ -146,7 +146,7 @@ int git_attr_file__load(
|
|
|
146
146
|
git_buf_put(&content, git_blob_rawcontent(blob), (size_t)blobsize);
|
|
147
147
|
break;
|
|
148
148
|
}
|
|
149
|
-
case
|
|
149
|
+
case GIT_ATTR_FILE_SOURCE_FILE: {
|
|
150
150
|
int fd = -1;
|
|
151
151
|
|
|
152
152
|
/* For open or read errors, pretend that we got ENOTFOUND. */
|
|
@@ -163,10 +163,31 @@ int git_attr_file__load(
|
|
|
163
163
|
|
|
164
164
|
break;
|
|
165
165
|
}
|
|
166
|
-
case
|
|
167
|
-
if (
|
|
168
|
-
|
|
169
|
-
|
|
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)
|
|
170
191
|
goto cleanup;
|
|
171
192
|
|
|
172
193
|
/*
|
|
@@ -183,7 +204,7 @@ int git_attr_file__load(
|
|
|
183
204
|
break;
|
|
184
205
|
}
|
|
185
206
|
default:
|
|
186
|
-
git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source);
|
|
207
|
+
git_error_set(GIT_ERROR_INVALID, "unknown file source %d", source->type);
|
|
187
208
|
return -1;
|
|
188
209
|
}
|
|
189
210
|
|
|
@@ -192,9 +213,9 @@ int git_attr_file__load(
|
|
|
192
213
|
|
|
193
214
|
/* advance over a UTF8 BOM */
|
|
194
215
|
content_str = git_buf_cstr(&content);
|
|
195
|
-
bom_offset =
|
|
216
|
+
bom_offset = git_buf_detect_bom(&bom, &content);
|
|
196
217
|
|
|
197
|
-
if (bom ==
|
|
218
|
+
if (bom == GIT_BUF_BOM_UTF8)
|
|
198
219
|
content_str += bom_offset;
|
|
199
220
|
|
|
200
221
|
/* store the key of the attr_reader; don't bother with cache
|
|
@@ -211,11 +232,11 @@ int git_attr_file__load(
|
|
|
211
232
|
/* write cache breakers */
|
|
212
233
|
if (nonexistent)
|
|
213
234
|
file->nonexistent = 1;
|
|
214
|
-
else if (source ==
|
|
235
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_INDEX)
|
|
215
236
|
git_oid_cpy(&file->cache_data.oid, git_blob_id(blob));
|
|
216
|
-
else if (source ==
|
|
237
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_COMMIT)
|
|
217
238
|
git_oid_cpy(&file->cache_data.oid, git_tree_id(tree));
|
|
218
|
-
else if (source ==
|
|
239
|
+
else if (source->type == GIT_ATTR_FILE_SOURCE_FILE)
|
|
219
240
|
git_futils_filestamp_set_from_stat(&file->cache_data.stamp, &st);
|
|
220
241
|
/* else always cacheable */
|
|
221
242
|
|
|
@@ -225,6 +246,7 @@ cleanup:
|
|
|
225
246
|
git_blob_free(blob);
|
|
226
247
|
git_tree_entry_free(tree_entry);
|
|
227
248
|
git_tree_free(tree);
|
|
249
|
+
git_commit_free(commit);
|
|
228
250
|
git_buf_dispose(&content);
|
|
229
251
|
|
|
230
252
|
return error;
|
|
@@ -233,7 +255,8 @@ cleanup:
|
|
|
233
255
|
int git_attr_file__out_of_date(
|
|
234
256
|
git_repository *repo,
|
|
235
257
|
git_attr_session *attr_session,
|
|
236
|
-
git_attr_file *file
|
|
258
|
+
git_attr_file *file,
|
|
259
|
+
git_attr_file_source *source)
|
|
237
260
|
{
|
|
238
261
|
if (!file)
|
|
239
262
|
return 1;
|
|
@@ -246,15 +269,15 @@ int git_attr_file__out_of_date(
|
|
|
246
269
|
else if (file->nonexistent)
|
|
247
270
|
return 1;
|
|
248
271
|
|
|
249
|
-
switch (file->source) {
|
|
250
|
-
case
|
|
272
|
+
switch (file->source.type) {
|
|
273
|
+
case GIT_ATTR_FILE_SOURCE_MEMORY:
|
|
251
274
|
return 0;
|
|
252
275
|
|
|
253
|
-
case
|
|
276
|
+
case GIT_ATTR_FILE_SOURCE_FILE:
|
|
254
277
|
return git_futils_filestamp_check(
|
|
255
278
|
&file->cache_data.stamp, file->entry->fullpath);
|
|
256
279
|
|
|
257
|
-
case
|
|
280
|
+
case GIT_ATTR_FILE_SOURCE_INDEX: {
|
|
258
281
|
int error;
|
|
259
282
|
git_oid id;
|
|
260
283
|
|
|
@@ -265,21 +288,34 @@ int git_attr_file__out_of_date(
|
|
|
265
288
|
return (git_oid__cmp(&file->cache_data.oid, &id) != 0);
|
|
266
289
|
}
|
|
267
290
|
|
|
268
|
-
case
|
|
269
|
-
git_tree *tree;
|
|
291
|
+
case GIT_ATTR_FILE_SOURCE_COMMIT: {
|
|
292
|
+
git_tree *tree = NULL;
|
|
270
293
|
int error;
|
|
271
294
|
|
|
272
|
-
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)
|
|
273
309
|
return error;
|
|
274
310
|
|
|
275
|
-
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);
|
|
276
312
|
|
|
277
313
|
git_tree_free(tree);
|
|
278
314
|
return error;
|
|
279
315
|
}
|
|
280
316
|
|
|
281
317
|
default:
|
|
282
|
-
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);
|
|
283
319
|
return -1;
|
|
284
320
|
}
|
|
285
321
|
}
|
|
@@ -351,7 +387,9 @@ uint32_t git_attr_file__name_hash(const char *name)
|
|
|
351
387
|
{
|
|
352
388
|
uint32_t h = 5381;
|
|
353
389
|
int c;
|
|
354
|
-
|
|
390
|
+
|
|
391
|
+
GIT_ASSERT_ARG(name);
|
|
392
|
+
|
|
355
393
|
while ((c = (int)*name++) != 0)
|
|
356
394
|
h = ((h << 5) + h) + c;
|
|
357
395
|
return h;
|
|
@@ -388,6 +426,7 @@ int git_attr_file__lookup_one(
|
|
|
388
426
|
int git_attr_file__load_standalone(git_attr_file **out, const char *path)
|
|
389
427
|
{
|
|
390
428
|
git_buf content = GIT_BUF_INIT;
|
|
429
|
+
git_attr_file_source source = { GIT_ATTR_FILE_SOURCE_FILE };
|
|
391
430
|
git_attr_file *file = NULL;
|
|
392
431
|
int error;
|
|
393
432
|
|
|
@@ -399,9 +438,9 @@ int git_attr_file__load_standalone(git_attr_file **out, const char *path)
|
|
|
399
438
|
* don't have to free it - freeing file+pool will free cache entry, too.
|
|
400
439
|
*/
|
|
401
440
|
|
|
402
|
-
if ((error = git_attr_file__new(&file, NULL,
|
|
441
|
+
if ((error = git_attr_file__new(&file, NULL, &source)) < 0 ||
|
|
403
442
|
(error = git_attr_file__parse_buffer(NULL, file, content.ptr, true)) < 0 ||
|
|
404
|
-
(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)
|
|
405
444
|
goto out;
|
|
406
445
|
|
|
407
446
|
*out = file;
|
|
@@ -501,14 +540,19 @@ git_attr_assignment *git_attr_rule__lookup_assignment(
|
|
|
501
540
|
}
|
|
502
541
|
|
|
503
542
|
int git_attr_path__init(
|
|
504
|
-
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)
|
|
505
548
|
{
|
|
506
549
|
ssize_t root;
|
|
507
550
|
|
|
508
551
|
/* build full path as best we can */
|
|
509
552
|
git_buf_init(&info->full, 0);
|
|
510
553
|
|
|
511
|
-
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)
|
|
512
556
|
return -1;
|
|
513
557
|
|
|
514
558
|
info->path = info->full.ptr + root;
|
|
@@ -660,7 +704,8 @@ int git_attr_fnmatch__parse(
|
|
|
660
704
|
int slash_count, allow_space;
|
|
661
705
|
bool escaped;
|
|
662
706
|
|
|
663
|
-
|
|
707
|
+
GIT_ASSERT_ARG(spec);
|
|
708
|
+
GIT_ASSERT_ARG(base && *base);
|
|
664
709
|
|
|
665
710
|
if (parse_optimized_patterns(spec, pool, *base))
|
|
666
711
|
return 0;
|
|
@@ -828,7 +873,7 @@ int git_attr_assignment__parse(
|
|
|
828
873
|
const char *scan = *base;
|
|
829
874
|
git_attr_assignment *assign = NULL;
|
|
830
875
|
|
|
831
|
-
|
|
876
|
+
GIT_ASSERT_ARG(assigns && !assigns->length);
|
|
832
877
|
|
|
833
878
|
git_vector_set_cmp(assigns, sort_by_hash_and_name);
|
|
834
879
|
|
|
@@ -954,10 +999,10 @@ void git_attr_rule__free(git_attr_rule *rule)
|
|
|
954
999
|
|
|
955
1000
|
int git_attr_session__init(git_attr_session *session, git_repository *repo)
|
|
956
1001
|
{
|
|
957
|
-
|
|
1002
|
+
GIT_ASSERT_ARG(repo);
|
|
958
1003
|
|
|
959
1004
|
memset(session, 0, sizeof(*session));
|
|
960
|
-
session->key =
|
|
1005
|
+
session->key = git_atomic32_inc(&repo->attr_session_key);
|
|
961
1006
|
|
|
962
1007
|
return 0;
|
|
963
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
|
}
|
|
@@ -395,8 +401,7 @@ int git_attr_cache__init(git_repository *repo)
|
|
|
395
401
|
(ret = git_pool_init(&cache->pool, 1)) < 0)
|
|
396
402
|
goto cancel;
|
|
397
403
|
|
|
398
|
-
|
|
399
|
-
if (cache)
|
|
404
|
+
if (git_atomic_compare_and_swap(&repo->attrcache, NULL, cache) != NULL)
|
|
400
405
|
goto cancel; /* raced with another thread, free this but no error */
|
|
401
406
|
|
|
402
407
|
git_config_free(cfg);
|
|
@@ -417,7 +422,7 @@ int git_attr_cache_flush(git_repository *repo)
|
|
|
417
422
|
/* this could be done less expensively, but for now, we'll just free
|
|
418
423
|
* the entire attrcache and let the next use reinitialize it...
|
|
419
424
|
*/
|
|
420
|
-
if (repo && (cache =
|
|
425
|
+
if (repo && (cache = git_atomic_swap(repo->attrcache, NULL)) != NULL)
|
|
421
426
|
attr_cache__free(cache);
|
|
422
427
|
|
|
423
428
|
return 0;
|