Files
git/t/t0009-git-dir-validation.sh
Tian Yuchen 1dd27bfbfd setup: improve error diagnosis for invalid .git files
'read_gitfile_gently()' treats any non-regular file as
'READ_GITFILE_ERR_NOT_A_FILE' and fails to discern between 'ENOENT'
and other stat failures. This flawed error reporting is noted by two
'NEEDSWORK' comments.

Address these comments by introducing two new error codes:
'READ_GITFILE_ERR_MISSING'(which groups the "file missing" scenarios
together) and 'READ_GITFILE_ERR_IS_A_DIR':

1. Update 'read_gitfile_error_die()' to treat 'IS_A_DIR', 'MISSING',
'NOT_A_FILE' and 'STAT_FAILED' as non-fatal no-ops. This accommodates
intentional non-repo scenarios (e.g., GIT_DIR=/dev/null).

2. Explicitly catch 'NOT_A_FILE' and 'STAT_FAILED' during
discovery and call 'die()' if 'die_on_error' is set.

3. Unconditionally pass '&error_code' to 'read_gitfile_gently()'.

4. Only invoke 'is_git_directory()' when we explicitly receive
   'READ_GITFILE_ERR_IS_A_DIR', avoiding redundant checks.

Additionally, audit external callers of 'read_gitfile_gently()' in
'submodule.c' and 'worktree.c' to accommodate the refined error codes.

Signed-off-by: Tian Yuchen <a3205153416@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-03-04 09:23:48 -08:00

78 lines
2.0 KiB
Bash
Executable File

#!/bin/sh
test_description='setup: validation of .git file/directory types
Verify that setup_git_directory() correctly handles:
1. Valid .git directories (including symlinks to them).
2. Invalid .git files (FIFOs, sockets) by erroring out.
3. Invalid .git files (garbage) by erroring out.
'
. ./test-lib.sh
test_expect_success 'setup: create parent git repository' '
git init parent &&
test_commit -C parent "root-commit"
'
test_expect_success SYMLINKS 'setup: .git as a symlink to a directory is valid' '
test_when_finished "rm -rf parent/link-to-dir" &&
mkdir -p parent/link-to-dir &&
(
cd parent/link-to-dir &&
git init real-repo &&
ln -s real-repo/.git .git &&
git rev-parse --git-dir >actual &&
echo .git >expect &&
test_cmp expect actual
)
'
test_expect_success PIPE 'setup: .git as a FIFO (named pipe) is rejected' '
test_when_finished "rm -rf parent/fifo-trap" &&
mkdir -p parent/fifo-trap &&
(
cd parent/fifo-trap &&
mkfifo .git &&
test_must_fail git rev-parse --git-dir 2>stderr &&
grep "not a regular file" stderr
)
'
test_expect_success SYMLINKS,PIPE 'setup: .git as a symlink to a FIFO is rejected' '
test_when_finished "rm -rf parent/symlink-fifo-trap" &&
mkdir -p parent/symlink-fifo-trap &&
(
cd parent/symlink-fifo-trap &&
mkfifo target-fifo &&
ln -s target-fifo .git &&
test_must_fail git rev-parse --git-dir 2>stderr &&
grep "not a regular file" stderr
)
'
test_expect_success 'setup: .git with garbage content is rejected' '
test_when_finished "rm -rf parent/garbage-trap" &&
mkdir -p parent/garbage-trap &&
(
cd parent/garbage-trap &&
echo "garbage" >.git &&
test_must_fail git rev-parse --git-dir 2>stderr &&
grep "invalid gitfile format" stderr
)
'
test_expect_success 'setup: .git as an empty directory is ignored' '
test_when_finished "rm -rf parent/empty-dir" &&
mkdir -p parent/empty-dir &&
(
cd parent/empty-dir &&
git rev-parse --git-dir >expect &&
mkdir .git &&
git rev-parse --git-dir >actual &&
test_cmp expect actual
)
'
test_done