From 3c3abec2380b1e9f8a96242e29027b6c4cf49450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20B=C3=A4dorf?= Date: Thu, 13 Jul 2023 16:59:22 +0200 Subject: [PATCH] fix: move pre-commit treefmt hook into CI The logic inside the hook was rather broken, causing confusing merges, stashes, and aborts. Unfortunately `treefmt` does not provide a pure lint option that checks without writing the changes. So instead, we do this in CI. --- .drone.yml | 4 +++- .editorconfig | 3 +++ CONTRIBUTING.md | 13 +++++++---- shell/hooks/pre-commit.sh | 49 ++++----------------------------------- 4 files changed, 20 insertions(+), 49 deletions(-) diff --git a/.drone.yml b/.drone.yml index 35f2e30d..f83a5264 100644 --- a/.drone.yml +++ b/.drone.yml @@ -15,6 +15,8 @@ steps: commands: - 'echo DEBUG: Using NIX_FLAGS: $NIX_FLAGS' - nix $$NIX_FLAGS develop --command nix flake show + - nix $$NIX_FLAGS develop --command treefmt --fail-on-change + - nix $$NIX_FLAGS develop --command editorconfig-checker - nix $$NIX_FLAGS build ".#nixosConfigurations.PubSolarOS.config.system.build.toplevel" --- @@ -147,6 +149,6 @@ volumes: --- kind: signature -hmac: 6aee0ffe22111bb629c0a79940bfbc3fa75f68c5ed5c4bba68abf6797b87a7ab +hmac: a116f78a0b22188052893bdb46aa40f8de66438826c10ced362ea183d7644d67 ... diff --git a/.editorconfig b/.editorconfig index 96e5188b..91e0b45f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,6 +15,9 @@ end_of_line = unset insert_final_newline = unset trim_trailing_whitespace = unset indent_size = unset +charset = unset +indent_style = unset +indent_size = unset [{.*,secrets}/**] end_of_line = unset diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8283019b..07957e7c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,28 +1,33 @@ # Quick branch overview + We work with several branches in this repo. This document aims to explain how to contribute changes to the existing branches. ### `main` branch + - Changes to `modules` and `profiles` should go [the main branch](https://git.pub.solar/pub-solar/os/src/branch/main) - Changes can get accepted via: Pull Request - Branch protected from direct `git push` ### `infra` branch + - Changes to the [pub.solar](https://pub.solar) infrastructure should be merged [into this branch](https://git.pub.solar/pub-solar/os/src/branch/infra) - Changes can get accepted via: Pull Request - Branch protected from direct `git push` ### `momo/main` branch + - Changes to the [Momo](https://momo.koeln) infrastructure should be merged [into this branch](https://git.pub.solar/pub-solar/os/src/branch/momo/main) - Changes can get accepted via: Pull Request - Deployment of changes is [automatic via CI pipeline](https://git.pub.solar/pub-solar/os/src/commit/43bd7421509f7cc9ba06d7c740f3f536a4a2af76/.drone.yml#L20-L38) - Branch protected from direct `git push` ### `$USER` branches + - User's custom hosts and changes can be worked on in these branches - Direct `git push` possible - Examples: - - [hensoko](https://git.pub.solar/pub-solar/os/src/branch/hensoko) - - [b12f](https://git.pub.solar/pub-solar/os/src/branch/b12f) - - [axeman](https://git.pub.solar/pub-solar/os/src/branch/axeman) - - [teutat3s](https://git.pub.solar/pub-solar/os/src/branch/teutat3s) + - [hensoko](https://git.pub.solar/pub-solar/os/src/branch/hensoko) + - [b12f](https://git.pub.solar/pub-solar/os/src/branch/b12f) + - [axeman](https://git.pub.solar/pub-solar/os/src/branch/axeman) + - [teutat3s](https://git.pub.solar/pub-solar/os/src/branch/teutat3s) diff --git a/shell/hooks/pre-commit.sh b/shell/hooks/pre-commit.sh index 558167eb..27fff872 100755 --- a/shell/hooks/pre-commit.sh +++ b/shell/hooks/pre-commit.sh @@ -1,48 +1,9 @@ #!/usr/bin/env bash -if git rev-parse --verify HEAD >/dev/null 2>&1; then - against=HEAD -else - # Initial commit: diff against an empty tree object - against=$(${git}/bin/git hash-object -t tree /dev/null) -fi - -# Stash only unstaged changes, keeping staged changes -# We have to stash two times, because: -# --keep-index also stashes the staged changes. -# The staged changes end up in both the stage AND the stash. -# https://overflow.hostux.net/questions/7650797/how-to-stash-only-unstaged-changes-in-git#60875082 -old_stash=$(git rev-parse --quiet --verify refs/stash) -git stash push --quiet --staged --message "Staged changes before pre-commit hook" -git stash push --quiet --message "Unstaged changes before pre-commit hook" -if git stash show "stash@{1}" 2>/dev/null; then - git stash pop --quiet --index "stash@{1}" -else - git stash pop --quiet --index "stash@{0}" -fi -new_stash=$(git rev-parse --quiet --verify refs/stash) - -diff="git diff-index --name-only --cached $against --diff-filter d" - -mapfile -t all_files < <($diff) - -# Format staged files -if ((${#all_files[@]} != 0)); then - treefmt "${all_files[@]}" && - git add "${all_files[@]}" -fi - -# If unstaged changes were stashed re-apply to working tree -if [ "$old_stash" != "$new_stash" ]; then - git stash pop --quiet -fi - # Check editorconfig -if ((${#all_files[@]} != 0)); then - if ! editorconfig-checker -- "${all_files[@]}"; then - printf "%b\n" \ - "\nCode is not aligned with .editorconfig" \ - "Review the output and commit your fixes" >&2 - exit 1 - fi +if ! editorconfig-checker; then + printf "%b\n" \ + "\nCode is not aligned with .editorconfig" \ + "Review the output and commit your fixes" >&2 + exit 1 fi