fractal/scripts/checks.sh
2022-01-19 23:33:40 +01:00

256 lines
6.4 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook
# Usage info
show_help() {
cat << EOF
Run conformity checks on the current Rust project.
If a dependency is not found, helps the user to install it.
USAGE: ${0##*/} [OPTIONS]
OPTIONS:
-f, --force-install Install missing dependencies without asking
-v, --verbose Use verbose output
-h, --help Display this help and exit
ERROR CODES:
1 Check failed
2 Missing dependency
EOF
}
# Style helpers
act="\e[1;32m"
err="\e[1;31m"
pos="\e[32m"
neg="\e[31m"
res="\e[0m"
# Common styled strings
Installing="${act}Installing${res}"
Checking=" ${act}Checking${res}"
Failed=" ${err}Failed${res}"
error="${err}error:${res}"
invalid="${neg}Invalid input${res}"
ok="${pos}ok${res}"
fail="${neg}fail${res}"
# Initialize variables
force_install=0
verbose=0
# Check if rustup is available.
# Argument:
# '-i' to install if missing.
check_rustup() {
if ! which rustup &> /dev/null; then
if [[ "$1" == '-i' ]]; then
echo -e "$Installing rustup…"
curl https://sh.rustup.rs -sSf | sh -s -- -y
export PATH=$PATH:$HOME/.cargo/bin
if ! which rustup &> /dev/null; then
echo -e "$Failed to install rustup"
exit 2
fi
else
exit 2
fi
fi
}
# Install cargo via rustup.
install_cargo() {
check_rustup -i
if ! which cargo >/dev/null 2>&1; then
echo -e "$Failed to install cargo"
exit 2
fi
}
# Check if cargo is available. If not, ask to install it.
check_cargo() {
if ! which cargo >/dev/null 2>&1; then
echo "Unable to find cargo for pre-commit checks"
if [[ $force_install -eq 1 ]]; then
install_cargo
elif [ ! -t 1 ]; then
exit 2
elif check_rustup; then
echo -e "$error rustup is installed but the cargo command isn't available"
exit 2
else
echo ""
echo "y: Install cargo via rustup"
echo "N: Don't install cargo and abort checks"
echo ""
while true; do
echo -n "Install cargo? [y/N]: "; read yn < /dev/tty
case $yn in
[Yy]* )
install_cargo
break
;;
[Nn]* | "" )
exit 2
;;
* )
echo $invalid
;;
esac
done
fi
fi
if [[ $verbose -eq 1 ]]; then
echo ""
rustc -Vv && cargo -Vv
fi
}
# Install rustfmt with rustup.
install_rustfmt() {
check_rustup -i
echo -e "$Installing rustfmt…"
rustup component add rustfmt
if ! cargo fmt --version >/dev/null 2>&1; then
echo -e "$Failed to install rustfmt"
exit 2
fi
}
# Run rustfmt to enforce code style.
run_rustfmt() {
if ! cargo fmt --version >/dev/null 2>&1; then
if [[ $force_install -eq 1 ]]; then
install_rustfmt
elif [ ! -t 1 ]; then
echo "Unable to check Fractals code style, because rustfmt could not be run"
exit 2
else
echo "Rustfmt is needed to check Fractals code style, but it isnt available"
echo ""
echo "y: Install rustfmt via rustup"
echo "N: Don't install rustfmt and abort checks"
echo ""
while true; do
echo -n "Install rustfmt? [y/N]: "; read yn < /dev/tty
case $yn in
[Yy]* )
install_rustfmt
break
;;
[Nn]* | "" )
exit 2
;;
* )
echo $invalid
;;
esac
done
fi
fi
echo -e "$Checking code style…"
if [[ $verbose -eq 1 ]]; then
echo ""
cargo fmt --version
echo ""
fi
if ! cargo fmt --all -- --check; then
echo -e " Checking code style result: $fail"
echo "Please fix the above issues, either manually or by running: cargo fmt --all"
exit 1
else
echo -e " Checking code style result: $ok"
fi
}
# Install typos with cargo.
install_typos() {
echo -e "$Installing typos…"
cargo install typos-cli
if ! typos --version >/dev/null 2>&1; then
echo -e "$Failed to install typos"
exit 2
fi
}
# Run typos to check for spelling mistakes.
run_typos() {
if ! typos --version >/dev/null 2>&1; then
if [[ $force_install -eq 1 ]]; then
install_typos
elif [ ! -t 1 ]; then
echo "Unable to check spelling mistakes, because typos could not be run"
exit 2
else
echo "Typos is needed to check spelling mistakes, but it isnt available"
echo ""
echo "y: Install typos via cargo"
echo "N: Don't install typos and abort checks"
echo ""
while true; do
echo -n "Install typos? [y/N]: "; read yn < /dev/tty
case $yn in
[Yy]* )
install_typos
break
;;
[Nn]* | "" )
exit 2
;;
* )
echo $invalid
;;
esac
done
fi
fi
echo -e "$Checking spelling mistakes…"
if [[ $verbose -eq 1 ]]; then
echo ""
typos --version
echo ""
fi
if ! typos --color always; then
echo -e " Checking spelling mistakes result: $fail"
echo "Please fix the above issues, either manually or by running: typos -w"
exit 1
else
echo -e " Checking spelling mistakes result: $ok"
fi
}
# Check arguments
while [[ "$1" ]]; do case $1 in
-f | --force-install )
force_install=1
;;
-v | --verbose )
verbose=1
;;
-h | --help )
show_help
exit 0
;;
*)
show_help >&2
exit 1
esac; shift; done
# Run
check_cargo
echo ""
run_rustfmt
echo ""
run_typos