From ec4217ae2e07aef9bfcb10e153d86978825d9a5f Mon Sep 17 00:00:00 2001 From: Ziad Mostafa Date: Mon, 13 Feb 2023 15:23:07 +0100 Subject: [PATCH] iox-#921 Add markdownlint hook and ci script Signed-off-by: Ziad Mostafa --- .markdownlint.yaml | 245 ++++++++++++++++++++++++++++++++++ tools/docker/Dockerfile | 6 + tools/git-hooks/pre-commit | 6 + tools/scripts/markdownlint.sh | 68 ++++++++++ 4 files changed, 325 insertions(+) create mode 100644 .markdownlint.yaml create mode 100755 tools/scripts/markdownlint.sh diff --git a/.markdownlint.yaml b/.markdownlint.yaml new file mode 100644 index 00000000000..6e15478816f --- /dev/null +++ b/.markdownlint.yaml @@ -0,0 +1,245 @@ +# Default state for all rules +default: true + +# Path to configuration file to extend +extends: null + +# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time +MD001: true + +# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading +MD002: + # Heading level + level: 1 + +# MD003/heading-style/header-style - Heading style +MD003: + # Heading style + style: "consistent" + +# MD004/ul-style - Unordered list style +MD004: + # List style + style: "consistent" + +# MD005/list-indent - Inconsistent indentation for list items at the same level +MD005: true + +# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line +MD006: true + +# MD007/ul-indent - Unordered list indentation +MD007: + # Spaces for indent + indent: 4 + # Whether to indent the first level of the list + start_indented: false + +# MD009/no-trailing-spaces - Trailing spaces +MD009: + # Spaces for line break + br_spaces: 2 + # Allow spaces for empty lines in list items + list_item_empty_lines: false + # Include unnecessary breaks + strict: false + +# MD010/no-hard-tabs - Hard tabs +MD010: + # Include code blocks + code_blocks: true + +# MD011/no-reversed-links - Reversed link syntax +MD011: true + +# MD012/no-multiple-blanks - Multiple consecutive blank lines +MD012: + # Consecutive blank lines + maximum: 1 + +# MD013/line-length - Line length +MD013: + # Number of characters + line_length: 100 + # Number of characters for headings + heading_line_length: 100 + # Number of characters for code blocks + code_block_line_length: 100 # Ignored due to next option + # Include code blocks + code_blocks: false + # Include tables + tables: false + # Include headings + headings: true + # Include headings + headers: true + # Strict length checking + strict: false + # Stern length checking + stern: false + +# MD014/commands-show-output - Dollar signs used before commands without showing output +MD014: false + +# MD018/no-missing-space-atx - No space after hash on atx style heading +MD018: true + +# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading +MD019: true + +# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading +MD020: true + +# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading +MD021: true + +# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines +MD022: + # Blank lines above heading + lines_above: 1 + # Blank lines below heading + lines_below: 1 + +# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line +MD023: true + +# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content +MD024: + # Only check sibling headings + allow_different_nesting: false + # Only check sibling headings + siblings_only: true + +# MD025/single-title/single-h1 - Multiple top-level headings in the same document +MD025: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD026/no-trailing-punctuation - Trailing punctuation in heading +MD026: + # Punctuation characters + punctuation: ".,;:!。,;:!" + +# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol +MD027: true + +# MD028/no-blanks-blockquote - Blank line inside blockquote +MD028: true + +# MD029/ol-prefix - Ordered list item prefix +MD029: + # List style + style: "one_or_ordered" + +# MD030/list-marker-space - Spaces after list markers +MD030: + # Spaces for single-line unordered list items + ul_single: 1 + # Spaces for single-line ordered list items + ol_single: 1 + # Spaces for multi-line unordered list items + ul_multi: 1 + # Spaces for multi-line ordered list items + ol_multi: 1 + +# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines +MD031: + # Include list items + list_items: true + +# MD032/blanks-around-lists - Lists should be surrounded by blank lines +MD032: true + +# MD033/no-inline-html - Inline HTML +MD033: + # Allowed elements + allowed_elements: [] + +# MD034/no-bare-urls - Bare URL used +MD034: true + +# MD035/hr-style - Horizontal rule style +MD035: + # Horizontal rule style + style: "consistent" + +# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading +MD036: + # Punctuation characters + punctuation: ".,;:!?。,;:!?" + +# MD037/no-space-in-emphasis - Spaces inside emphasis markers +MD037: true + +# MD038/no-space-in-code - Spaces inside code span elements +MD038: true + +# MD039/no-space-in-links - Spaces inside link text +MD039: true + +# MD040/fenced-code-language - Fenced code blocks should have a language specified +MD040: true + +# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading +MD041: + # Heading level + level: 1 + # RegExp for matching title in front matter + front_matter_title: "^\\s*title\\s*[:=]" + +# MD042/no-empty-links - No empty links +MD042: true + +# MD043/required-headings/required-headers - Required heading structure +MD043: + # List of headings + headings: null + # List of headings + headers: null + +# MD044/proper-names - Proper names should have the correct capitalization +MD044: + # List of proper names + names: [ + 'iceoryx', + 'Cyclone DDS', + 'CPU', + 'CPUs', + 'GUI', + 'LiDAR', + 'LiDARs', + 'MISRA', + 'MacOS X', + 'RADAR', + 'RADARs', + 'ROS 2', + 'RPi', + 'Linux', + 'Ubuntu', + 'QOS', + 'e.g.', + 'i.e.', + 'SOME/IP', + 'UI', + 'Bazel', + ] + # Include code blocks + code_blocks: false + +# MD045/no-alt-text - Images should have alternate text (alt text) +MD045: true + +# MD046/code-block-style - Code block style +MD046: + # Block style + style: "fenced" + +# MD047/single-trailing-newline - Files should end with a single newline character +MD047: true + +# MD048/code-fence-style - Code fence style +MD048: + # Code fence syle + style: "consistent" diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index fded93f553c..c60222ef168 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -36,6 +36,12 @@ RUN apt-get update && apt-get install -y \ g++ \ wget +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - +RUN apt-get install -y \ + nodejs + +RUN npm install -g markdownlint-cli + ADD . /iceoryx WORKDIR /iceoryx diff --git a/tools/git-hooks/pre-commit b/tools/git-hooks/pre-commit index f5ffde34a98..d4e92a028fc 100755 --- a/tools/git-hooks/pre-commit +++ b/tools/git-hooks/pre-commit @@ -56,4 +56,10 @@ if ! tools/scripts/check_test_ids.sh; then exit 1 fi +## check for md files change +if ! tools/scripts/markdownlint.sh hook; then + echo "Error executing markdownlint" + exit 1 +fi + cd "${current_dir}" || exit diff --git a/tools/scripts/markdownlint.sh b/tools/scripts/markdownlint.sh new file mode 100755 index 00000000000..136162e0e72 --- /dev/null +++ b/tools/scripts/markdownlint.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# Copyright (c) 2023 by Apex.AI Inc. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +set -e + +SCOPE=${1:-full} # Can be either `full` for all files or `hook` for formatting with git hooks + + +fail() { + printf "\033[1;31merror: %s: %s\033[0m\n" ${FUNCNAME[1]} "${1:-"Unknown error"}" + exit 1 +} + +hash git || fail "git not found" + +# Check if we have at least a specific markdownlint version installed +MARKDOWNLINT_VERSION=0.33.0 +MARKDOWNLINT_CMD="markdownlint" +if ! command -v $MARKDOWNLINT_CMD &> /dev/null +then + MARKDOWNLINT_MAJOR_VERSION=$(markdownlint --version | sed -rn 's/.*([0-9][0-9])\.[0-9].*/\1/p') + if [[ $MARKDOWNLINT_MAJOR_VERSION -lt "$MARKDOWNLINT_VERSION" ]]; then + echo "Warning: markdownlint version $MARKDOWNLINT_VERSION or higher is not installed." + echo "Code will not be formatted." + exit 0 + else + MARKDOWNLINT_CMD="markdownlint" + fi +fi + +cd "$(git rev-parse --show-toplevel)" + +if [[ "$SCOPE" == "hook"* ]]; then + md_files=$(git diff --cached --name-only --diff-filter=ACMRT | grep -E "\.md"| cat) + if [[ -n ${md_files} ]]; then + + echo "Running markdownlint on the following file(s):" + echo "--------------------------------------------" + echo "${md_files}" | sed 's/^/\ -\ /g' + echo + + for file in $md_files ; do + if [ -f "$file" ]; then + $MARKDOWNLINT_CMD --output ./markdownlint.log --config ./.markdownlint.yaml "${file}" + git add "${file}" + fi + done + fi +elif [[ "$SCOPE" == "full"* ]]; then + git ls-files | grep -E "\.md"| xargs markdownlint --output ./markdownlint.log --config ./.markdownlint.yaml +elif [[ "$SCOPE" == "check"* ]]; then + git ls-files | grep -E "\.md"| xargs markdownlint --output ./markdownlint.log --config ./.markdownlint.yaml +fi