You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
6.4 KiB
256 lines
6.4 KiB
#!/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 Fractal’s code style, because rustfmt could not be run" |
|
exit 2 |
|
else |
|
echo "Rustfmt is needed to check Fractal’s code style, but it isn’t 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 isn’t 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
|
|
|