golang git pre-commit钩子

.git/hooks/pre-commit

#!/bin/bash

STAGED_GO_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".go$")

if [ "$STAGED_GO_FILES" = "" ]; then
    exit 0
fi

PASS=true

for FILE in $STAGED_GO_FILES
do
    # 跳过vendor目录下的文件
    if [ "$FILE" = "vendor"* ];then
        continue
    fi

    # goimports 检查并调整导入语句
    goimports -w -v $FILE
    if [ $? != 0 ]; then
        PASS=false
    fi

    # golint 检查代码风格,给出提示
    golint -set_exit_status $FILE
    if [ $? == 11 ]; then
        PASS=false
    fi

    # go tool vet 检查代码中的静态错误
    go vet $FILE
    if [ $? != 0 ]; then
        PASS=false
    fi
    # 检测shadow
    # 需要安装:go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow
    go vet -vettool=$(which shadow) $FILE
    if [ $? != 0 ]; then
        PASS=false
    fi


  # 如果当前文件没有被格式化,就格式化它
    UNFORMATTED=$(gofmt -l $FILE)
    if [ "$UNFORMATTED" != "" ];then
        gofmt -w $PWD/$UNFORMATTED
        if [ $? != 0 ]; then
            PASS=false
        fi
    fi

    # 上述 goimports, gofmt可能会对文件作出改动,
    # 所以此处将更改提交至暂存区
    git add $FILE

done

if ! $PASS; then
    printf "\033[31m COMMIT FAILED \033[0m\n"
    exit 1
else
    printf "\033[32m COMMIT SUCCEEDED \033[0m\n"
fi

exit 0

你可能感兴趣的:(go)