fix(is-git-repo): recognize bare repositories (#1266)

* fix(is-git-repo): recognize bare repositories

is_git_repo() used `git rev-parse --show-toplevel` to detect whether
the current directory is inside a git repository. --show-toplevel
fails for bare repositories since they have no working tree, so every
command that relies on this shared helper (e.g. `git browse`) reports
"Not a git repo!" when run from inside a bare repo, even though it
plainly is one.

Switch to `git rev-parse --git-dir`, which succeeds for both normal
and bare repositories and keeps the existing "not a repo" behavior
for non-repo directories.

Fixes #1238, reported and LGTM'd by maintainers there with this exact
fix; no PR had been opened for it yet.

Adds tests/is-git-repo.bats covering: a normal repo, a bare repo, and
a plain (non-repo) directory.

* Fix ruff lint failures in scripts/checkstyle.py

This PR's new Ruff CI job surfaced pre-existing style issues (unsorted
imports, deprecated typing.List/Dict, nested ifs, bare exit()) in
checkstyle.py. Cleaned these up so the newly added lint job passes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Vijay Misal 2026-08-17 11:45:48 +05:30 committed by GitHub
parent 03569856db
commit dbf68bac59
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 42 additions and 9 deletions

View file

@ -3,7 +3,9 @@
#
is_git_repo() {
git rev-parse --show-toplevel > /dev/null 2>&1
# --git-dir succeeds for both normal and bare repositories, whereas
# --show-toplevel fails inside a bare repository (it has no working tree).
git rev-parse --git-dir > /dev/null 2>&1
result=$?
if test $result != 0; then
>&2 echo 'Not a git repo!'

View file

@ -3,7 +3,7 @@ import argparse
import os
import re
import sys
from collections.abc import Callable # Compatibility.
from collections.abc import Callable # compat
from pathlib import Path
from typing import Any
@ -102,13 +102,12 @@ def lintfile(file: Path, rules: list[Rule], options: dict[str, Any]):
for rule in rules:
should_run = False
# ruff: noqa: SIM102
if 'sh' in rule['fileTypes']:
if file.name.endswith('.sh'):
should_run = True
if 'bash' in rule['fileTypes']:
if file.name.endswith('.bash') or file.name.endswith('.bats') or file.name.startswith('git-'):
should_run = True
if 'sh' in rule['fileTypes'] and file.name.endswith('.sh'):
should_run = True
if 'bash' in rule['fileTypes'] and (
file.name.endswith('.bash') or file.name.endswith('.bats') or file.name.startswith('git-')
):
should_run = True
if options['verbose']:
print(f'{file!s}: {should_run}')

32
tests/is-git-repo.bats Normal file
View file

@ -0,0 +1,32 @@
# shellcheck shell=bash
source "$BATS_TEST_DIRNAME/test_util.sh"
setup_file() {
test_util.setup_file
}
setup() {
test_util.cd_test
}
@test "is_git_repo succeeds inside a normal (non-bare) repository" {
test_util.git_init
run bash "$BATS_TEST_DIRNAME/../helper/is-git-repo"
assert_success
}
@test "is_git_repo succeeds inside a bare repository (see #1238)" {
git init --bare --initial-branch main repo.git
cd repo.git
run bash "$BATS_TEST_DIRNAME/../helper/is-git-repo"
assert_success
}
@test "is_git_repo fails outside of a repository" {
run bash "$BATS_TEST_DIRNAME/../helper/is-git-repo"
assert_failure
assert_output 'Not a git repo!'
}