diff options
Diffstat (limited to '')
| -rwxr-xr-x | git-precheck | 74 |
1 files changed, 41 insertions, 33 deletions
diff --git a/git-precheck b/git-precheck index 2547563..0602ecd 100755 --- a/git-precheck +++ b/git-precheck @@ -5,8 +5,8 @@ usage() { echo "" echo "If the current working directory is inside a git repository, examine" echo "the repo for any abnormal state and return an exit code indicating" - echo "the status. If unclean, print a line of text describing the" - echo "condition." + echo "the status. If unclean, print a line of text describing each" + echo "condition found." echo "" echo " --quiet" echo " Don't actually print anything." @@ -32,14 +32,14 @@ usage() { } quiet="" -ignore_dirty="" -ignore_untracked="" +opt_dirty="true" +opt_untracked="true" while true; do case "$1" in --quiet) quiet="true" ;; - --ignore-dirty) ignore_dirty="true" ;; - --ignore-untracked) ignore_untracked="true" ;; + --ignore-dirty) opt_dirty="" ;; + --ignore-untracked) opt_untracked="" ;; --help) usage ;; -h) usage ;; *) break @@ -52,47 +52,55 @@ if [ $# -ne 0 ]; then exit 128 fi -check() { - if git rev-parse --verify "$1" >/dev/null 2>&1; then - [ -z "$quiet" ] && printf '\e[0;31m%s in progress\e[0m\n' "$2" - exit 3 - 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 '\e[0;31mNot inside a git work tree\e[0m\n' + [ -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_EXPECTED_REV bisect -if [ -e "$(git rev-parse --git-path rebase-merge 2>/dev/null)" ]; then - [ -z "$quiet" ] && printf '\e[0;31mrebase in progress\e[0m\n' - exit 3 -fi - -if [ -e "$(git rev-parse --git-path rebase-apply 2>/dev/null)" ]; then - [ -z "$quiet" ] && printf '\e[0;31mrebase/am in progress\e[0m\n' - exit 3 -fi +if [ -n "$opt_dirty" ] || [ -n "$opt_untracked" ]; then + git_status="$(git status --porcelain 2>/dev/null)" -if [ -z "$ignore_dirty" ]; then - if git status --porcelain 2>/dev/null \ - | grep --quiet --invert-match '^??'; then - [ -z "$quiet" ] && printf '\e[0;31mModified files detected\e[0m\n' - exit 2 + 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 -fi -if [ -z "$ignore_untracked" ]; then - if git status --porcelain 2>/dev/null \ - | grep --quiet '^??'; then - [ -z "$quiet" ] && printf '\e[0;31mUntracked files detected\e[0m\n' - exit 1 + 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 |
