diff --git a/hooks/pre-commit.hook b/hooks/pre-commit.hook index 452a415a..66f888ac 100755 --- a/hooks/pre-commit.hook +++ b/hooks/pre-commit.hook @@ -1,57 +1,37 @@ #!/bin/sh -# Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook - -install_rustfmt() { - if ! which rustup &> /dev/null; then - curl https://sh.rustup.rs -sSf | sh -s -- -y - export PATH=$PATH:$HOME/.cargo/bin - if ! which rustup &> /dev/null; then - echo "Failed to install rustup. Performing the commit without style checking." - exit 0 - fi - fi - - if ! rustup component list|grep rustfmt &> /dev/null; then - echo "Installing rustfmt…" - rustup component add rustfmt - fi -} - -if ! which cargo >/dev/null 2>&1 || ! cargo fmt --help >/dev/null 2>&1; then - echo "Unable to check Fractal’s code style, because rustfmt could not be run." - - if [ ! -t 1 ]; then - # No input is possible - echo "Performing commit." - exit 0 - fi +# Depends on: scripts/checks.sh +echo "-- Pre-commit checks --" +echo "To ignore these checks next time, run: git commit --no-verify" +echo "" +if scripts/checks.sh; then echo "" - echo "y: Install rustfmt via rustup" - echo "n: Don't install rustfmt and perform the commit" - echo "Q: Don't install rustfmt and abort the commit" - + echo "Pre-commit checks result: ok" +elif [[ $? -eq 2 ]]; then + echo "A missing dependency was found" + echo "" + echo "y: Skip checks and proceed with commit" + echo "N: Abort commit" echo "" while true do - echo -n "Install rustfmt via rustup? [y/n/Q]: "; read yn < /dev/tty + echo -n "Skip the pre-commit checks? [y/N]: "; read yn < /dev/tty case $yn in - [Yy]* ) install_rustfmt; break;; - [Nn]* ) echo "Performing commit."; exit 0;; - [Qq]* | "" ) echo "Aborting commit."; exit -1 >/dev/null 2>&1;; - * ) echo "Invalid input";; + [Yy]* ) + echo "Skipping checks…" + exit 0 + ;; + [Nn]* | "" ) + echo "Aborting commit" + exit 1 + ;; + * ) + echo "Invalid input" + ;; esac done - -fi - -echo "--Checking style--" -cargo fmt --all -- --check -if test $? != 0; then - echo "--Checking style fail--" - echo "Please fix the above issues, either manually or by running: cargo fmt --all" - - exit -1 else - echo "--Checking style pass--" -fi + echo "Pre-commit checks result: fail" + echo "Aborting commit" + exit 1 +fi \ No newline at end of file diff --git a/scripts/checks.sh b/scripts/checks.sh new file mode 100755 index 00000000..4996edf8 --- /dev/null +++ b/scripts/checks.sh @@ -0,0 +1,55 @@ +#!/bin/sh +# Source: https://gitlab.gnome.org/GNOME/fractal/blob/master/hooks/pre-commit.hook + +install_rustfmt() { + if ! which rustup &> /dev/null; then + curl https://sh.rustup.rs -sSf | sh -s -- -y + export PATH=$PATH:$HOME/.cargo/bin + if ! which rustup &> /dev/null; then + echo "Failed to install rustup." + exit 2 + fi + fi + + if ! rustup component list|grep rustfmt &> /dev/null; then + echo "Installing rustfmt…" + rustup component add rustfmt + fi +} + +if ! which cargo >/dev/null 2>&1 || ! cargo fmt --help >/dev/null 2>&1; then + echo "Unable to check Fractal’s code style, because rustfmt could not be run." + + if [ ! -t 1 ]; then + # No input is possible + echo "Performing commit." + exit 0 + fi + + echo "" + echo "y: Install rustfmt via rustup" + echo "N: Don't install rustfmt" + + echo "" + while true + do + echo -n "Install rustfmt? [y/N]: "; read yn < /dev/tty + case $yn in + [Yy]* ) install_rustfmt; break;; + [Nn]* | "" ) exit 2 >/dev/null 2>&1;; + * ) echo "Invalid input";; + esac + done + +fi + +echo "--Checking style--" +cargo fmt --all -- --check +if test $? != 0; then + echo "--Checking style fail--" + echo "Please fix the above issues, either manually or by running: cargo fmt --all" + + exit 1 +else + echo "--Checking style pass--" +fi