diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c02f49ef71f..5d9ccac1a6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,15 +39,9 @@ jobs: python -m tools.ci.check_icon_conflicts python -m tools.ci.check_icon_dupenames python -m tools.maplint.source --github - DREAMCHECKER_EXIT_CODE=0 - ~/dreamchecker > ${GITHUB_WORKSPACE}/output-annotations.txt 2>&1 || DREAMCHECKER_EXIT_CODE=$? - echo 'DREAMCHECKER_ANNOTATED=1' >> "$GITHUB_ENV" - exit $DREAMCHECKER_EXIT_CODE - - name: Annotate Lints - uses: yogstation13/DreamAnnotate@v2 - if: ${{ always() && env.DREAMCHECKER_ANNOTATED == '1' }} - with: - outputFile: output-annotations.txt + - name: Run DreamChecker + shell: bash + run: ~/dreamchecker 2>&1 | bash tools/ci/annotate_dm.sh odlint: name: Lint with OpenDream diff --git a/_build_dependencies.sh b/_build_dependencies.sh index 058f897b55b..5f1927b74e8 100644 --- a/_build_dependencies.sh +++ b/_build_dependencies.sh @@ -1,6 +1,6 @@ # This file has all the information on what versions of libraries are thrown into the code # For dreamchecker -export SPACEMANDMM_TAG=suite-1.7.1 +export SPACEMANDMM_TAG=suite-1.8 # For TGUI export NODE_VERSION=20 # Stable Byond Major diff --git a/tools/ci/annotate_dm.py b/tools/ci/annotate_dm.py new file mode 100644 index 00000000000..2fbe7375d9d --- /dev/null +++ b/tools/ci/annotate_dm.py @@ -0,0 +1,51 @@ +import sys +import re +import os.path as path + +# Usage: python3 annotate_dm.py [filename] +# If filename is not provided, stdin is checked instead + +def red(text): + return "\033[31m" + str(text) + "\033[0m" + +def green(text): + return "\033[32m" + str(text) + "\033[0m" + +def yellow(text): + return "\033[33m" + str(text) + "\033[0m" + +def annotate(raw_output): + # Remove ANSI escape codes + raw_output = re.sub(r'(\x9B|\x1B\[)[0-?]*[ -\/]*[@-~]', '', raw_output) + + print("::group::DreamChecker Output") + print(raw_output) + print("::endgroup::") + + annotation_regex = r'(?P.*?), line (?P\d+), column (?P\d+):\s{1,2}(?Perror|warning): (?P.*)' + has_issues = False + + print("DM Code Annotations:") + for annotation in re.finditer(annotation_regex, raw_output): + print(f"::{annotation['type']} file={annotation['filename']},line={annotation['line']},col={annotation['column']}::{annotation['message']}") + has_issues = True + + if not has_issues: + print(green("No DM issues found")) + +def main(): + if len(sys.argv) > 1: + if not path.exists(sys.argv[1]): + print(red(f"Error: Annotations file '{sys.argv[1]}' does not exist")) + sys.exit(1) + with open(sys.argv[1], 'r') as f: + annotate(f.read()) + elif not sys.stdin.isatty(): + annotate(sys.stdin.read()) + else: + print(red("Error: No input provided")) + print("Usage: tools/ci/annotate_dm.sh [filename]") + sys.exit(1) + +if __name__ == '__main__': + main() diff --git a/tools/ci/annotate_dm.sh b/tools/ci/annotate_dm.sh new file mode 100644 index 00000000000..1c4107aed45 --- /dev/null +++ b/tools/ci/annotate_dm.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +set -euo pipefail +python tools/ci/annotate_dm.py "$@"