Preloader
Auf dieser Website werden Daten wie z.B. Cookies gespeichert, um wichtige Funktionen der Website, einschließlich Analysen, Marketingfunktionen und Personalisierung zu ermöglichen. Sie können Ihre Einstellungen jederzeit ändern oder die Standardeinstellungen akzeptieren.
Cookie Hinweise
Datenschutzregelung
22.11.2024

Push Regeln

Um die Regeln für Commit-Nachrichten und Branches strikt einzuhalten, kann ein pre-push-Hook vor einem Push verwendet werden, um sicherzustellen, dass alle Regeln eingehalten werden.

#!/bin/bash

# Fehlerbehandlung aktivieren
set -e

# Funktion zur Prüfung der Commit-Nachrichten
check_commit_message() {
    local commit_message="$1"

    # Überspringe Merge-Commits
    if [[ $commit_message =~ ^Merge\ branch\ '.*'$ ]]; then
        echo "Merge-Commit erkannt, überspringe Commit-Nachricht-Prüfung."
        return 0
    fi

    # Regex für Commit-Nachricht (Scope optional)
    if [[ ! $commit_message =~ ^(feat|fix|docs|style|refactor|perf|test|chore|revert)(\([a-zA-Z0-9_-]+\))?:\  ]]; then
        echo "Commit-Nachricht entspricht nicht den Richtlinien."
        echo "Gültige Formate: <type>(<scope>): <subject> oder <type>: <subject>"
        echo "Beispiele:"
        echo "  feat(auth): add authentication module"
        echo "  fix: resolve alignment issue"
        return 1
    fi
}

# Funktion zur Prüfung des Branch-Namens
check_branch_name() {
    local branch="$1"

    if [[ $branch =~ ^VIS-[0-9]+-[a-z0-9-]+$ ]]; then
        return 0
    elif [[ $branch =~ ^release/v[0-9]+\.[0-9]+(\.[0-9]+)?$ ]]; then
        return 0
    else
        echo "Branch '$branch' entspricht nicht den erlaubten Mustern: 'VIS-[NUMMER]-[Fehler]' oder 'release/vX.X.X'."
        return 1
    fi
}

# Funktion zur Prüfung des Source-Branches
check_source_branch() {
    local branch="$1"
    local merge_base

    # Finde den gemeinsamen Merge-Base mit develop
    merge_base=$(git merge-base "$branch" develop)

    if [[ -z $merge_base ]]; then
        echo "Fehler: Branch '$branch' hat keinen gemeinsamen Commit mit 'develop'."
        return 1
    fi

    # Prüfe, ob der aktuelle Branch direkt von develop erstellt wurde
    if git log --oneline "$merge_base"..HEAD | grep -q .; then
        echo "Branch '$branch' wurde korrekt von 'develop' erstellt."
        return 0
    else
        echo "Fehler: Branch '$branch' scheint nicht von 'develop' abgeleitet zu sein."
        return 1
    fi
}

# Prüfe alle zu pushenden Commits
while read local_ref local_sha remote_ref remote_sha; do
    branch=$(git rev-parse --abbrev-ref "$local_ref")

    echo "Prüfe Branch '$branch'..."

    # 1. Branch-Name prüfen
    if ! check_branch_name "$branch"; then
        exit 1
    fi

    # 2. Ursprung prüfen
    if ! check_source_branch "$branch"; then
        exit 1
    fi

    # 3. Commit-Nachrichten prüfen
    echo "Prüfe Commit-Nachrichten..."
    for commit in $(git rev-list "$remote_sha".."$local_sha"); do
        commit_message=$(git log -1 --pretty=%B "$commit")

        if ! check_commit_message "$commit_message"; then
            echo "Fehler in Commit $commit."
            exit 1
        fi
    done

    echo "Branch '$branch' und Commits sind gültig."
done

exit 0