Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ARROW-11101: [Rust] rewrite pre-commit hook #9072

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
76 changes: 39 additions & 37 deletions rust/pre-commit.sh
Expand Up @@ -21,9 +21,9 @@
#
# Soft link it as git hook under top dir of apache arrow git repository:
# $ ln -s ../../rust/pre-commit.sh .git/hooks/pre-commit

# NOTE: colorized output may not work as expected.
# I've seen the difference between /bin/sh and GUN bash 5 on macOS.
#
# This file be run directly:
# $ ./pre-commit.sh

function RED() {
echo "\033[0;31m$@\033[0m"
Expand All @@ -37,50 +37,52 @@ function BYELLOW() {
echo "\033[1;33m$@\033[0m"
}

MSG="git pre-commit hook"
RUST_DIR="rust"
CARGO_FMT="cargo +stable fmt --all"
CARGO_CLIPPY="cargo clippy"

NUM_CHANGES=$(git diff --cached --name-only "${RUST_DIR}" |
grep -e ".*/*.rs$" -o -e "^rustfmt.toml$" -o -e "^rust-toolchain$" |
awk '{print $1}' |
wc -l)

if [ ${NUM_CHANGES} -eq 0 ]; then
echo -e "$(GREEN INFO) ${MSG}: no changes in: *rs, rustfmt.toml, rust-toolchain, skip fmt/clippy"
#exit 0
# 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 ${RUST_DIR}
cd ${GIT_DIR}/${RUST_DIR}

# 1. Abort on cargo fmt error.

echo -e "$(GREEN INFO) ${MSG}: cargo fmt checking ..."
NUM_CHANGES=$(git diff --cached --name-only . |
grep -e ".*/*.rs$" |
awk '{print $1}' |
wc -l)

$CARGO_FMT -q -- --check 2>/dev/null
if [ $? -eq 0 ]; then
echo -e "$(GREEN INFO) ${MSG}: $(GREEN cargo fmt check passed)"
else
echo -e "$(GREEN INFO) ${MSG}: cargo fmt formatting ..."
$CARGO_FMT
echo
echo -e "$(BYELLOW WARN) ${MSG}: cargo fmt $(BYELLOW fixed some files)"
if [ ${NUM_CHANGES} -eq 0 ]; then
echo -e "$(GREEN INFO): no staged changes in *.rs, $(GREEN skip cargo fmt/clippy)"
exit 0
fi

# 2. Warn on cargo clippy errors/warnings.
# 1. cargo clippy

echo
echo "===================================================="
echo
echo -e "$(GREEN INFO) ${MSG}: cargo clippy ..."
echo
echo -e "$(GREEN INFO): cargo clippy ..."

# Cargo clippy always return exit code 0, and tee doesnt work.
# Cargo clippy always return exit code 0, and `tee` doesn't work.
# So let's just run cargo clippy.
$CARGO_CLIPPY
echo
echo -e "$(BYELLOW WARN) ${MSG}: please try fix $(BYELLOW clippy issues) if any"
echo
cargo clippy
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