Skip to content

Instantly share code, notes, and snippets.

@mikkpr
Created August 31, 2016 12:07

Revisions

  1. mikkpr revised this gist Aug 31, 2016. No changes.
  2. mikkpr created this gist Aug 31, 2016.
    60 changes: 60 additions & 0 deletions pre-commit
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,60 @@
    #!/bin/bash
    #

    # A git hook script to find and fix trailing whitespace
    # in your commits. Bypass it with the --no-verify option
    # to git-commit
    #
    # usage: make a soft link to this file, e.g., ln -s ~/config/pre-commit.git.sh ~/some_project/.git/hooks/pre-commit

    # detect platform
    platform="win"
    uname_result=`uname`
    if [ "$uname_result" = "Linux" ]; then
    platform="linux"
    elif [ "$uname_result" = "Darwin" ]; then
    platform="mac"
    fi

    # change IFS to ignore filename's space in |for|
    IFS="
    "
    # autoremove trailing whitespace
    for line in `git diff --check --cached | sed '/^[+-]/d'` ; do
    # get file name
    if [ "$platform" = "mac" ]; then
    file="`echo $line | sed -E 's/:[0-9]+: .*//'`"
    else
    file="`echo $line | sed -r 's/:[0-9]+: .*//'`"
    fi
    # display tips
    echo -e "removing trailing whitespace in \033[31m$file\033[0m!"
    # since $file in working directory isn't always equal to $file in index, so we backup it
    mv -f "$file" "${file}.save"
    # discard changes in working directory
    git checkout -- "$file"
    # remove trailing whitespace
    if [ "$platform" = "win" ]; then
    # in windows, `sed -i` adds ready-only attribute to $file(I don't kown why), so we use temp file instead
    sed 's/[[:space:]]*$//' "$file" > "${file}.bak"
    mv -f "${file}.bak" "$file"
    elif [ "$platform" == "mac" ]; then
    sed -i "" 's/[[:space:]]*$//' "$file"
    else
    sed -i 's/[[:space:]]*$//' "$file"
    fi
    git add "$file"
    # restore the $file
    sed 's/[[:space:]]*$//' "${file}.save" > "$file"
    rm "${file}.save"
    done

    if [ "x`git status -s | grep '^[A|D|M]'`" = "x" ]; then
    # empty commit
    echo
    echo -e "\033[31mNO CHANGES ADDED, ABORT COMMIT!\033[0m"
    exit 1
    fi

    # Now we can commit
    exit