diff --git a/.github/scripts/commit_type.json b/.github/scripts/commit_type.json new file mode 100644 index 0000000..e584b18 --- /dev/null +++ b/.github/scripts/commit_type.json @@ -0,0 +1,48 @@ +{ + "types": { + "feat": { + "description": "A new feature", + "title": "Features" + }, + "fix": { + "description": "A bug fix", + "title": "Bug Fixes" + }, + "docs": { + "description": "Documentation only changes", + "title": "Documentation" + }, + "style": { + "description": "Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)", + "title": "Styles" + }, + "refactor": { + "description": "A code change that neither fixes a bug nor adds a feature", + "title": "Code Refactoring" + }, + "perf": { + "description": "A code change that improves performance", + "title": "Performance Improvements" + }, + "test": { + "description": "Adding missing tests or correcting existing tests", + "title": "Tests" + }, + "build": { + "description": "Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)", + "title": "Builds" + }, + "ci": { + "description": "Changes to our CI configuration files and scripts (example scopes: Travis, Circle, BrowserStack, SauceLabs)", + "title": "Continuous Integrations" + }, + "chore": { + "description": "Other changes that don't modify src or test files", + "title": "Chores" + }, + "revert": { + "description": "Reverts a previous commit", + "title": "Reverts" + } + } +} \ No newline at end of file diff --git a/.github/scripts/validate_commit_msg.py b/.github/scripts/validate_commit_msg.py new file mode 100644 index 0000000..a9e80af --- /dev/null +++ b/.github/scripts/validate_commit_msg.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +""" +This script validates commit messages based on the Conventional Commits specification. +It ensures that commit messages follow a predefined format defined in commit_type.json. +""" + +import sys +import re +import json +import os + +JSON_COMMIT_TYPE = "commit_type.json" + +def load_commit_types(): + """ + Load valid commit types from the commit_type.json file located in the same directory as + the script. + + Returns: + list: A list of valid commit types in lowercase. + """ + # Get the directory where the script is located + script_dir = os.path.dirname(os.path.realpath(__file__)) + json_file_path = os.path.join(script_dir, JSON_COMMIT_TYPE) + + # Read the JSON file and extract commit types + with open(json_file_path, "r", encoding="utf-8") as file: + commit_types = json.load(file) + return [commit_type.lower() for commit_type in commit_types["types"].keys()] + +def validate_commit_message(message, valid_types): + """ + Validate the commit message based on the given valid types and Conventional Commits format. + + Args: + message (str): The commit message to validate. + valid_types (list): A list of valid commit types. + + Returns: + bool: True if the commit message is valid, False otherwise. + """ + # Case insensitive match for commit type + pattern = r'^(' + '|'.join(valid_types) + r')(\(.+\))?: .{1,50}' + if re.match(pattern, message, re.IGNORECASE): + print("Commit message is valid.") + return True + + print(f"Commit message ({message}) is invalid. Valid types are: {', '.join(valid_types)}") + return False + +if __name__ == "__main__": + valid_commit_types = load_commit_types() + commit_message = sys.stdin.read().strip() + + if not validate_commit_message(commit_message, valid_commit_types): + sys.exit(1) diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index a61d48c..12da9f0 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -11,6 +11,23 @@ on: jobs: + lint_commits: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 2 # Fetch at least 2 commits to ensure we get non-merge commits + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.x' + - name: Validate commit messages + run: | + # Get the last non-merge commit and validate the message + git log --pretty=format:"%s" --no-merges -n 1 | python .github/scripts/validate_commit_msg.py + + lint: runs-on: ubuntu-latest steps: diff --git a/AUTHORS.md b/AUTHORS.md index b3ce630..bc4467b 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -10,3 +10,4 @@ - Rami, GOUAL, etudes.ramigoual@gmail.fr - Samy FERGUI, samy.fergui.pro@gmail.com - Marwane, RACHAD, marwanerachad@gmail.com +- Mathis, Beauville, mathis.beauville@etud.univ-evry.fr