diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 0000000..73687f6 --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail + +badge_file="badges/tests.json" + +write_badge() { + local status="$1" color="$2" + mkdir -p badges + cat > "$badge_file" <&1); then + echo "$output" + count=$(sed -n 's/.*\([0-9]\+\) tests: \([0-9]\+\) passed.*/\2 passed/p' <<< "$output") + write_badge "${count:-passing}" "brightgreen" +else + echo "$output" + write_badge "failing" "red" + echo "Tests failed — commit blocked." + exit 1 +fi diff --git a/CLAUDE.md b/CLAUDE.md index 7d6f092..70ae933 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,7 +37,9 @@ Key functions: `parse_time` (time spec → OnCalendar), `_write_unit_files` (sha Runs 58 tests against real systemd user timers covering job creation, job names, status, logs, disable/enable, notifications, time format parsing, error cases, and cleanup. All test jobs are cleaned up automatically via trap. -Tests require a real systemd user session (`systemctl --user`) and cannot run in containers. CI runs ShellCheck only; tests must be run locally before submitting changes. +Tests require a real systemd user session (`systemctl --user`) and cannot run in containers. CI runs ShellCheck only; tests are enforced locally via a pre-commit hook that also updates `badges/tests.json`. + +After cloning, enable the hooks: `git config core.hooksPath .githooks` ## Notes diff --git a/README.md b/README.md index f5c615f..cf7f062 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # systab [![ShellCheck](https://code.opennomad.com/opennomad/systab/actions/workflows/ci.yml/badge.svg)](https://code.opennomad.com/opennomad/systab/actions?workflow=ci.yml) +[![Tests](https://img.shields.io/endpoint?url=https://code.opennomad.com/opennomad/systab/raw/branch/main/badges/tests.json)](badges/tests.json) [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg)](LICENSE) A cron/at-like interface for systemd user timers. Create, manage, and monitor scheduled jobs without writing unit files by hand. @@ -186,6 +187,12 @@ The primary repository is hosted on [Forgejo](https://code.opennomad.com/opennom Contributions (issues and pull requests) are welcome on GitHub. +After cloning, enable the pre-commit hook (runs ShellCheck + tests): + +```bash +git config core.hooksPath .githooks +``` + ## FAQ **What's the difference between `-c` and `-f`?** diff --git a/badges/tests.json b/badges/tests.json new file mode 100644 index 0000000..a337e7d --- /dev/null +++ b/badges/tests.json @@ -0,0 +1,6 @@ +{ + "schemaVersion": 1, + "label": "tests", + "message": "58 passed", + "color": "brightgreen" +}