| #!/bin/bash | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| # This file is git pre-commit hook. | |
| # | |
| # Soft link it as git hook under top dir of apache arrow git repository: | |
| # $ ln -s ../../pre-commit.sh .git/hooks/pre-commit | |
| # | |
| # This file be run directly: | |
| # $ ./pre-commit.sh | |
| set -e | |
| function RED() { | |
| echo "\033[0;31m$@\033[0m" | |
| } | |
| function GREEN() { | |
| echo "\033[0;32m$@\033[0m" | |
| } | |
| function BYELLOW() { | |
| echo "\033[1;33m$@\033[0m" | |
| } | |
| # env GIT_DIR is set by git when run a pre-commit hook. | |
| if [ -z "${GIT_DIR}" ]; then | |
| GIT_DIR=$(git rev-parse --show-toplevel) | |
| fi | |
| cd ${GIT_DIR} | |
| NUM_CHANGES=$(git diff --cached --name-only . | | |
| grep -e ".*/*.rs$" | | |
| awk '{print $1}' | | |
| wc -l) | |
| if [ ${NUM_CHANGES} -eq 0 ]; then | |
| echo -e "$(GREEN INFO): no staged changes in *.rs, $(GREEN skip cargo fmt/clippy)" | |
| exit 0 | |
| fi | |
| # 1. cargo clippy | |
| echo -e "$(GREEN INFO): cargo clippy ..." | |
| ./ci/scripts/rust_clippy.sh | |
| echo -e "$(GREEN INFO): cargo clippy done" | |
| # 2. cargo fmt: format with nightly and stable. | |
| CHANGED_BY_CARGO_FMT=false | |
| echo -e "$(GREEN INFO): cargo fmt with nightly and stable ..." | |
| for version in nightly stable; do | |
| CMD="cargo +${version} fmt" | |
| ${CMD} --all -q -- --check 2>/dev/null | |
| if [ $? -ne 0 ]; then | |
| ${CMD} --all | |
| echo -e "$(BYELLOW WARN): ${CMD} changed some files" | |
| CHANGED_BY_CARGO_FMT=true | |
| fi | |
| done | |
| if ${CHANGED_BY_CARGO_FMT}; then | |
| echo -e "$(RED FAIL): git commit $(RED ABORTED), please have a look and run git add/commit again" | |
| exit 1 | |
| fi | |
| exit 0 |