diff --git a/.forgejo/workflows/check-commit-message.yml b/.forgejo/workflows/check-commit-message.yml new file mode 100644 index 0000000..5c056ac --- /dev/null +++ b/.forgejo/workflows/check-commit-message.yml @@ -0,0 +1,68 @@ +name: Check Commit Messages + +on: + pull_request: + push: + branches: + - '!master' + +jobs: + check-commit-message: + runs-on: node:16-bullseye + + steps: + - name: Checkout Code + uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch the entire history to analyze commit messages + + - name: Check Subject Beginning + run: | + echo "Checking if the subject starts correctly..." + commit_message=$(git log -1 --pretty=%B) + if ! [[ "$commit_message" =~ ^([A-Z]|\S+:|git\ subrepo\ (clone|pull)) ]]; then + echo "Error: The subject does not start with a capital letter, a tag, or a valid 'git subrepo' command." + exit 1 + fi + echo "Subject start check passed." + + - name: Check Commit Message Type and Format + run: | + echo "Checking commit message type and format..." + commit_message=$(git log -1 --pretty=%B) + if ! [[ "$commit_message" =~ ^(feat|fix|chore|docs|style|refactor|test|perf): ]]; then + echo "Error: Commit message does not follow the required format: : " + exit 1 + fi + echo "Commit message type and format check passed." + + - name: Check Subject Length + run: | + echo "Checking subject length..." + commit_subject=$(git log -1 --pretty=%B | head -n 1) + if [[ ${#commit_subject} -gt 72 ]]; then + echo "Error: Commit message subject exceeds 72 characters." + exit 1 + fi + echo "Subject length check passed." + + - name: Check Subject Ending + run: | + echo "Checking subject ending..." + commit_subject=$(git log -1 --pretty=%B | head -n 1) + if [[ "$commit_subject" =~ \.$ ]]; then + echo "Error: Commit message subject should not end with a dot." + exit 1 + fi + echo "Subject ending check passed." + + - name: Check Empty Line After Title + run: | + echo "Checking for an empty line after the title..." + commit_body=$(git log -1 --pretty=%B | tail -n +2) + if [[ -n "$commit_body" && ! "$commit_body" =~ ^$ ]]; then + echo "Error: There must be an empty line between the title and description." + exit 1 + fi + echo "Empty line check passed." + diff --git a/.forgejo/workflows/lint-bash.yml b/.forgejo/workflows/lint-bash.yml new file mode 100644 index 0000000..2798744 --- /dev/null +++ b/.forgejo/workflows/lint-bash.yml @@ -0,0 +1,31 @@ +name: Lint Bash Scripts + +on: + push: + paths: + - '**/*.sh' + pull_request: + paths: + - '**/*.sh' + +jobs: + lint-bash: + runs-on: docker + container: + image: node:16-bullseye # Node.js pre-installed, based on Debian + + steps: + - name: Checkout Code + uses: https://code.forgejo.org/actions/checkout@v4 + with: + fetch-depth: 0 # Fetch the entire history to avoid REST API reliance + + - name: Install ShellCheck + run: | + apt-get update && apt-get install -y shellcheck + + - name: Lint Bash Scripts + run: | + echo "Linting Bash scripts..." + find . -name '*.sh' -print0 | xargs -0 shellcheck +