Update SimpleIni to version 4.19
[TortoiseGit.git] / ext / libgit2-0002-Make-refdb_fs-fully-aware-of-per-worktree-refs.patch
blob64f0932e7eee43ea15d3ad4a06a494be24cb0ed5
1 From 4b289c190b6ba434541081d8ca2844c7a03b0384 Mon Sep 17 00:00:00 2001
2 From: Sven Strickroth <email@cs-ware.de>
3 Date: Thu, 18 Aug 2022 15:08:23 +0200
4 Subject: [PATCH 2/2] Make refdb_fs fully aware of per worktree refs
6 Fixes issue isse #5492.
8 Signed-off-by: Sven Strickroth <email@cs-ware.de>
9 ---
10 src/libgit2/refdb_fs.c | 45 ++++++++++++++++++++++
11 tests/libgit2/worktree/refs.c | 70 ++++++++++++++++++++++++++++++++++-
12 2 files changed, 114 insertions(+), 1 deletion(-)
14 diff --git a/src/libgit2/refdb_fs.c b/src/libgit2/refdb_fs.c
15 index 586d2561a..4628e01dc 100644
16 --- a/src/libgit2/refdb_fs.c
17 +++ b/src/libgit2/refdb_fs.c
18 @@ -853,6 +853,8 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
19 git_str_truncate(&path, ref_prefix_len);
20 git_str_puts(&path, entry->path);
21 ref_name = git_str_cstr(&path);
22 + if (git_repository_is_worktree(backend->repo) == 1 && is_per_worktree_ref(ref_name))
23 + continue;
25 if (git__suffixcmp(ref_name, ".lock") == 0 ||
26 (iter->glob && wildmatch(iter->glob, ref_name, 0) != 0))
27 @@ -865,6 +867,49 @@ static int iter_load_loose_paths(refdb_fs_backend *backend, refdb_fs_iter *iter)
28 error = git_vector_insert(&iter->loose, ref_dup);
31 + if (!error && git_repository_is_worktree(backend->repo) == 1) {
32 + git_iterator_free(fsit);
33 + git_str_clear(&path);
34 + if ((error = git_str_puts(&path, backend->gitpath)) < 0 ||
35 + (error = git_str_put(&path, ref_prefix, ref_prefix_len)) < 0 ||
36 + !git_fs_path_exists(git_str_cstr(&path))) {
37 + git_str_dispose(&path);
38 + return error;
39 + }
41 + if ((error = git_iterator_for_filesystem(
42 + &fsit, path.ptr, &fsit_opts)) < 0) {
43 + git_str_dispose(&path);
44 + return (iter->glob && error == GIT_ENOTFOUND) ? 0 : error;
45 + }
47 + error = git_str_sets(&path, ref_prefix);
49 + while (!error && !git_iterator_advance(&entry, fsit)) {
50 + const char *ref_name;
51 + char *ref_dup;
53 + git_str_truncate(&path, ref_prefix_len);
54 + git_str_puts(&path, entry->path);
55 + ref_name = git_str_cstr(&path);
57 + if (!is_per_worktree_ref(ref_name))
58 + continue;
60 + if (git__suffixcmp(ref_name, ".lock") == 0 ||
61 + (iter->glob &&
62 + wildmatch(iter->glob, ref_name, 0) != 0))
63 + continue;
65 + ref_dup = git_pool_strdup(&iter->pool, ref_name);
66 + if (!ref_dup)
67 + error = -1;
68 + else
69 + error = git_vector_insert(
70 + &iter->loose, ref_dup);
71 + }
72 + }
74 git_iterator_free(fsit);
75 git_str_dispose(&path);
77 diff --git a/tests/libgit2/worktree/refs.c b/tests/libgit2/worktree/refs.c
78 index 557726aaf..6bcf7aa9d 100644
79 --- a/tests/libgit2/worktree/refs.c
80 +++ b/tests/libgit2/worktree/refs.c
81 @@ -20,7 +20,7 @@ void test_worktree_refs__cleanup(void)
82 cleanup_fixture_worktree(&fixture);
85 -void test_worktree_refs__list(void)
86 +void test_worktree_refs__list_no_difference_in_worktree(void)
88 git_strarray refs, wtrefs;
89 unsigned i, j;
90 @@ -61,6 +61,74 @@ exit:
91 cl_git_pass(error);
94 +void test_worktree_refs__list_worktree_specific(void)
96 + git_strarray refs, wtrefs;
97 + git_reference *ref, *new_branch;
98 + int error = 0;
99 + git_oid oid;
101 + cl_git_pass(git_reference_name_to_id(&oid, fixture.repo, "refs/heads/dir"));
102 + cl_git_fail(git_reference_lookup(&ref, fixture.repo, "refs/bisect/a-bisect-ref"));
103 + cl_git_pass(git_reference_create(
104 + &new_branch, fixture.worktree, "refs/bisect/a-bisect-ref", &oid,
105 + 0, "test"));
107 + cl_git_fail(git_reference_lookup(&ref, fixture.repo, "refs/bisect/a-bisect-ref"));
108 + cl_git_pass(git_reference_lookup(&ref, fixture.worktree, "refs/bisect/a-bisect-ref"));
110 + cl_git_pass(git_reference_list(&refs, fixture.repo));
111 + cl_git_pass(git_reference_list(&wtrefs, fixture.worktree));
113 + if (refs.count + 1 != wtrefs.count) {
114 + error = GIT_ERROR;
115 + goto exit;
118 +exit:
119 + git_reference_free(ref);
120 + git_reference_free(new_branch);
121 + git_strarray_dispose(&refs);
122 + git_strarray_dispose(&wtrefs);
123 + cl_git_pass(error);
126 +void test_worktree_refs__list_worktree_specific_hidden_in_main_repo(void)
128 + git_strarray refs, wtrefs;
129 + git_reference *ref, *new_branch;
130 + int error = 0;
131 + git_oid oid;
133 + cl_git_pass(
134 + git_reference_name_to_id(&oid, fixture.repo, "refs/heads/dir"));
135 + cl_git_fail(git_reference_lookup(
136 + &ref, fixture.worktree, "refs/bisect/a-bisect-ref"));
137 + cl_git_pass(git_reference_create(
138 + &new_branch, fixture.repo, "refs/bisect/a-bisect-ref", &oid,
139 + 0, "test"));
141 + cl_git_fail(git_reference_lookup(
142 + &ref, fixture.worktree, "refs/bisect/a-bisect-ref"));
143 + cl_git_pass(git_reference_lookup(
144 + &ref, fixture.repo, "refs/bisect/a-bisect-ref"));
146 + cl_git_pass(git_reference_list(&refs, fixture.repo));
147 + cl_git_pass(git_reference_list(&wtrefs, fixture.worktree));
149 + if (refs.count != wtrefs.count + 1) {
150 + error = GIT_ERROR;
151 + goto exit;
154 +exit:
155 + git_reference_free(ref);
156 + git_reference_free(new_branch);
157 + git_strarray_dispose(&refs);
158 + git_strarray_dispose(&wtrefs);
159 + cl_git_pass(error);
162 void test_worktree_refs__read_head(void)
164 git_reference *head;
166 2.37.2.windows.2