Skip to content

Commit 0538b84

Browse files
committed
Merge branch 'jk/alt-odb-cleanup'
Fix a corner-case regression in a topic that graduated during the v2.11 cycle. * jk/alt-odb-cleanup: alternates: re-allow relative paths from environment
2 parents 7b2c338 + 37a9586 commit 0538b84

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

sha1_file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base,
296296
}
297297
strbuf_addstr(&pathbuf, entry);
298298

299-
if (strbuf_normalize_path(&pathbuf) < 0) {
299+
if (strbuf_normalize_path(&pathbuf) < 0 && relative_base) {
300300
error("unable to normalize alternate object path: %s",
301301
pathbuf.buf);
302302
strbuf_release(&pathbuf);

t/t5615-alternate-env.sh

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/bin/sh
2+
3+
test_description='handling of alternates in environment variables'
4+
. ./test-lib.sh
5+
6+
check_obj () {
7+
alt=$1; shift
8+
while read obj expect
9+
do
10+
echo "$obj" >&3 &&
11+
echo "$obj $expect" >&4
12+
done 3>input 4>expect &&
13+
GIT_ALTERNATE_OBJECT_DIRECTORIES=$alt \
14+
git "$@" cat-file --batch-check='%(objectname) %(objecttype)' \
15+
<input >actual &&
16+
test_cmp expect actual
17+
}
18+
19+
test_expect_success 'create alternate repositories' '
20+
git init --bare one.git &&
21+
one=$(echo one | git -C one.git hash-object -w --stdin) &&
22+
git init --bare two.git &&
23+
two=$(echo two | git -C two.git hash-object -w --stdin)
24+
'
25+
26+
test_expect_success 'objects inaccessible without alternates' '
27+
check_obj "" <<-EOF
28+
$one missing
29+
$two missing
30+
EOF
31+
'
32+
33+
test_expect_success 'access alternate via absolute path' '
34+
check_obj "$(pwd)/one.git/objects" <<-EOF
35+
$one blob
36+
$two missing
37+
EOF
38+
'
39+
40+
test_expect_success 'access multiple alternates' '
41+
check_obj "$(pwd)/one.git/objects:$(pwd)/two.git/objects" <<-EOF
42+
$one blob
43+
$two blob
44+
EOF
45+
'
46+
47+
# bare paths are relative from $GIT_DIR
48+
test_expect_success 'access alternate via relative path (bare)' '
49+
git init --bare bare.git &&
50+
check_obj "../one.git/objects" -C bare.git <<-EOF
51+
$one blob
52+
EOF
53+
'
54+
55+
# non-bare paths are relative to top of worktree
56+
test_expect_success 'access alternate via relative path (worktree)' '
57+
git init worktree &&
58+
check_obj "../one.git/objects" -C worktree <<-EOF
59+
$one blob
60+
EOF
61+
'
62+
63+
# path is computed after moving to top-level of worktree
64+
test_expect_success 'access alternate via relative path (subdir)' '
65+
mkdir subdir &&
66+
check_obj "one.git/objects" -C subdir <<-EOF
67+
$one blob
68+
EOF
69+
'
70+
71+
test_done

0 commit comments

Comments
 (0)