Skip to content

Commit def5e32

Browse files
committed
Merge branch 'tb/refs-exclude-fixes'
The refname exclusion logic in the packed-ref backend has been broken for some time, which confused upload-pack to advertise different set of refs. This has been corrected. * tb/refs-exclude-fixes: refs.c: stop matching non-directory prefixes in exclude patterns refs.c: remove empty '--exclude' patterns
2 parents de35b7b + 10e8a93 commit def5e32

File tree

2 files changed

+44
-2
lines changed

2 files changed

+44
-2
lines changed

refs.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,6 +1699,24 @@ struct ref_iterator *refs_ref_iterator_begin(
16991699
enum do_for_each_ref_flags flags)
17001700
{
17011701
struct ref_iterator *iter;
1702+
struct strvec normalized_exclude_patterns = STRVEC_INIT;
1703+
1704+
if (exclude_patterns) {
1705+
for (size_t i = 0; exclude_patterns[i]; i++) {
1706+
const char *pattern = exclude_patterns[i];
1707+
size_t len = strlen(pattern);
1708+
if (!len)
1709+
continue;
1710+
1711+
if (pattern[len - 1] == '/')
1712+
strvec_push(&normalized_exclude_patterns, pattern);
1713+
else
1714+
strvec_pushf(&normalized_exclude_patterns, "%s/",
1715+
pattern);
1716+
}
1717+
1718+
exclude_patterns = normalized_exclude_patterns.v;
1719+
}
17021720

17031721
if (!(flags & DO_FOR_EACH_INCLUDE_BROKEN)) {
17041722
static int ref_paranoia = -1;
@@ -1719,6 +1737,8 @@ struct ref_iterator *refs_ref_iterator_begin(
17191737
if (trim)
17201738
iter = prefix_ref_iterator_begin(iter, "", trim);
17211739

1740+
strvec_clear(&normalized_exclude_patterns);
1741+
17221742
return iter;
17231743
}
17241744

t/t1419-exclude-refs.sh

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ test_expect_success 'setup' '
4646
echo "create refs/heads/$name/$i $base" || return 1
4747
done || return 1
4848
done >in &&
49+
for i in 5 6 7
50+
do
51+
echo "create refs/heads/bar/4/$i $base" || return 1
52+
done >>in &&
4953
echo "delete refs/heads/main" >>in &&
5054
5155
git update-ref --stdin <in &&
@@ -99,9 +103,17 @@ test_expect_success 'adjacent, non-overlapping excluded regions' '
99103
esac
100104
'
101105

102-
test_expect_success 'overlapping excluded regions' '
106+
test_expect_success 'non-directory excluded regions' '
103107
for_each_ref__exclude refs/heads refs/heads/ba refs/heads/baz >actual 2>perf &&
104-
for_each_ref refs/heads/foo refs/heads/quux >expect &&
108+
for_each_ref refs/heads/bar refs/heads/foo refs/heads/quux >expect &&
109+
110+
test_cmp expect actual &&
111+
assert_jumps 1 perf
112+
'
113+
114+
test_expect_success 'overlapping excluded regions' '
115+
for_each_ref__exclude refs/heads refs/heads/bar refs/heads/bar/4 >actual 2>perf &&
116+
for_each_ref refs/heads/baz refs/heads/foo refs/heads/quux >expect &&
105117
106118
test_cmp expect actual &&
107119
assert_jumps 1 perf
@@ -155,4 +167,14 @@ test_expect_success 'meta-characters are discarded' '
155167
assert_no_jumps perf
156168
'
157169

170+
test_expect_success 'empty string exclude pattern is ignored' '
171+
git update-ref refs/heads/loose $(git rev-parse refs/heads/foo/1) &&
172+
173+
for_each_ref__exclude refs/heads "" >actual 2>perf &&
174+
for_each_ref >expect &&
175+
176+
test_cmp expect actual &&
177+
assert_no_jumps perf
178+
'
179+
158180
test_done

0 commit comments

Comments
 (0)