#!/bin/sh docs() { exec man 1 git-precheck; } quiet="" opt_dirty="true" opt_untracked="true" while true; do case "$1" in --quiet) quiet="true" ;; --ignore-dirty) opt_dirty="" ;; --ignore-untracked) opt_untracked="" ;; --help) docs ;; -h) docs ;; *) break esac shift done if [ $# -ne 0 ]; then printf 'git-precheck: Unrecognized option given: %s\n' "$1" exit 128 fi CS="\\033[0;31m" CE="\\033[0m" cond="" dirty="" untracked="" # If outside repo, always exit immediately. if ! [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then [ -z "$quiet" ] && printf '%bnot inside a git work tree%b\n' "$CS" "$CE" exit 4 fi # Otherwise, only exit immediately if --quiet was given. # Keep running to report all potential conditions that apply. check() { if [ -e "$(git rev-parse --git-path "$1" 2>/dev/null)" ]; then [ -n "$quiet" ] && exit 3 printf '%b%s in progress%b\n' "$CS" "$2" "$CE" cond="true" fi } check rebase-merge rebase check rebase-apply rebase/am check MERGE_HEAD merge check REVERT_HEAD revert check CHERRY_PICK_HEAD cherry-pick check BISECT_START bisect if [ -n "$opt_dirty" ] || [ -n "$opt_untracked" ]; then git_status="$(git status --porcelain 2>/dev/null)" if [ -n "$opt_dirty" ] && printf '%s' "$git_status" | grep -qvE '^\?\? '; then [ -n "$quiet" ] && exit 2 printf '%bmodified files detected%b\n' "$CS" "$CE" dirty="true" fi if [ -n "$opt_untracked" ] && printf '%s' "$git_status" | grep -qE '^\?\? '; then [ -n "$quiet" ] && exit 1 printf '%buntracked files detected%b\n' "$CS" "$CE" untracked="true" fi fi # Still here? Return the highest applicable code based on what has been seen. [ -n "$cond" ] && exit 3 [ -n "$dirty" ] && exit 2 [ -n "$untracked" ] && exit 1 exit 0