diff --git a/entrypoint.sh b/entrypoint.sh index 50a689f..c310c05 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -31,6 +31,10 @@ _main() { _switch_to_repository + _check_if_is_git_repository + + _check_if_repository_is_in_detached_state + if _git_is_dirty || "$INPUT_SKIP_DIRTY_CHECK"; then _set_github_output "changes_detected" "true" @@ -84,11 +88,26 @@ _git_is_dirty() { gitStatusMessage="$((git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}} >/dev/null ) 2>&1)"; # shellcheck disable=SC2086 gitStatus="$(git status -s $INPUT_STATUS_OPTIONS -- ${INPUT_FILE_PATTERN_EXPANDED:+${INPUT_FILE_PATTERN_EXPANDED[@]}})"; - if [ $? -ne 0 ]; then - _log "error" "git-status failed with:<$gitStatusMessage>"; + [ -n "$gitStatus" ] +} + +_check_if_is_git_repository() { + if [ -d ".git" ]; then + _log "debug" "Repository found."; + else + _log "error" "Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary."; exit 1; fi - [ -n "$gitStatus" ] +} + +_check_if_repository_is_in_detached_state() { + if [ -z "$(git symbolic-ref HEAD)" ] + then + _log "error" "Repository is in detached HEAD state. Please checkout a branch before committing."; + exit 1; + else + _log "debug" "Repository is on a branch."; + fi } _add_files() { diff --git a/tests/git-auto-commit.bats b/tests/git-auto-commit.bats index 9adeb99..2e74075 100644 --- a/tests/git-auto-commit.bats +++ b/tests/git-auto-commit.bats @@ -1088,5 +1088,24 @@ END run git_auto_commit assert_failure; - assert_line "::error::git-status failed with:" + assert_line "::error::Not a git repository. Please make sure to run this action in a git repository. Adjust the `repository` input if necessary." +} + +@test "It detects if the repository is in a detached state and exits with an error" { + touch "${FAKE_LOCAL_REPOSITORY}"/new-file-{1,2,3}.txt + + run git_auto_commit + + assert_success + + # Bring local repository into a detached state + prev_commit=$(git rev-parse HEAD~1); + git checkout "$prev_commit"; + + touch "${FAKE_TEMP_LOCAL_REPOSITORY}"/remote-files{4,5,6}.txt + + run git_auto_commit + + assert_failure; + assert_line "::error::Repository is in detached HEAD state. Please checkout a branch before committing." }