diff --git a/.clang-format b/.clang-format index 82ee19c725..f015d4af8c 100644 --- a/.clang-format +++ b/.clang-format @@ -13,7 +13,7 @@ AllowShortFunctionsOnASingleLine: All AllowShortIfStatementsOnASingleLine: Always AllowShortLambdasOnASingleLine: All AllowShortLoopsOnASingleLine: true -AlwaysBreakAfterReturnType: All +AlwaysBreakAfterReturnType: None AlwaysBreakTemplateDeclarations: MultiLine BreakBeforeBraces: Custom BraceWrapping: @@ -33,7 +33,7 @@ BreakBeforeBinaryOperators: NonAssignment BreakBeforeTernaryOperators: true BreakConstructorInitializers: BeforeColon BreakInheritanceList: BeforeColon -ColumnLimit: 0 +ColumnLimit: 100 CompactNamespaces: false ContinuationIndentWidth: 4 IndentCaseLabels: true @@ -50,7 +50,7 @@ SpaceAfterCStyleCast: false SpaceAfterLogicalNot: false SpaceAfterTemplateKeyword: false SpaceBeforeAssignmentOperators: true -SpaceBeforeCpp11BracedList: false +SpaceBeforeCpp11BracedList: true SpaceBeforeCtorInitializerColon: true SpaceBeforeInheritanceColon: false SpaceBeforeParens: ControlStatements diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 376d452e46..80a781f4c7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,6 +9,6 @@ Thank you for creating a pull request to contribute to FreeCAD! To ease integrat - [ ] Commit messages include `issue #` or `fixes #` where `` is the issue ID number from our [Issues database](https://github.com/FreeCAD/FreeCAD/issues) in case a particular commit solves or is related to an existing issue. Ex: `Draft: fix typos - fixes #4805` And please remember to update the Wiki with the features added or changed once this PR is merged. -**Note**: If you don't have wiki access, then please mention your contribution on the [0.20 Changelog Forum Thread](https://forum.freecadweb.org/viewtopic.php?f=10&t=56135). +**Note**: If you don't have wiki access, then please mention your contribution on the [1.0 Changelog Forum Thread](https://forum.freecad.org/viewtopic.php?f=10&t=69438). --- diff --git a/.github/codespellignore b/.github/codespellignore index fe2b4c6a86..b251cf34ce 100644 --- a/.github/codespellignore +++ b/.github/codespellignore @@ -43,6 +43,7 @@ nin normale normaly numer +oce ontop ot parm @@ -54,6 +55,7 @@ recurrance rougly seh serie +siz som strack substraction @@ -62,6 +64,7 @@ te thist tread ue +upto uptodate usind vas diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 286b46c03e..c302cc5097 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -3,15 +3,26 @@ on: push: branches: ['master', 'development/toponaming', 'releases/FreeCAD-0-20'] pull_request: + workflow_dispatch: permissions: pull-requests: write - + contents: write env: logdir: logs/ fixesdir: fixes/ + # Build and Test + buildFailSilent: false + test: true # run Unit tests + testFailSilent: false # don't fail CI if Unittests fail + + testInstall: true # run CMake install and Unit tests on install + installFailSilent: false # don't fail if CMake install fails + testInstallFailSilent: false # don't fail CI if Unittests fail + + # Linting checkWhitespace: true whitespaceFailSilent: true @@ -22,22 +33,17 @@ env: qtconnectionSyntaxFailSilent: true checkCpplint: true - cpplintFilters: -build/header_guard,-readability/braces,-whitespace + # This option allows you to specify a comma-separated list of rule-filters to apply. For example, the rule names look like whitespace/indent. In that case, the category is whitespace. + # To turn off, specify - as prefix like -whitespace or -whitespace/indent. On the other hand, to turn on, specify + like +whitespace or +whitespace/indent. + # The recommended filters are taken from https://github.com/sider/runners/blob/HEAD/images/cpplint/sider_recommended_CPPLINT.cfg + cpplintFilters: -build/c++11,-build/header_guard,-build/include,-build/include_alpha,-build/include_order,-build/include_subdir,-build/include_what_you_use,-build/namespaces,-legal/copyright,-readability/braces,-readability-braces-around-statements,-readability/casting,-readability/namespace,-readability/todo,-runtime/indentation_namespace,-runtime/int,-runtime/references,-whitespace/blank_line,-whitespace/braces,-whitespace/comma,-whitespace/comments,-whitespace/end_of_line,-whitespace/indent,-whitespace/line_length,-whitespace/newline,-whitespace/operators,-whitespace/parens,-whitespace/semicolon,-whitespace/tab,-whitespace/todo cpplintLineLength: 120 cpplintFailSilent: true checkPylint: true - pylintDisable: E0401,C0301,C0103,R0801,W0125 + # additional disables to the .pylintrc file # for the Message codes see: https://pylint.pycqa.org/en/latest/user_guide/messages/index.html - # E0401: Unable to import '*' (import-error) - # C0103: Function name "*" doesn't conform to snake_case naming style (invalid-name) - # C0301: Line too long (118/100) (line-too-long) - # C0115: Missing class docstring (missing-class-docstring) - # C0116: Missing function or method docstring (missing-function-docstring) - # C0411: standard import "import *" should be placed before "import *" (wrong-import-order) - # R0801: Similar lines in 2 files --> not useful for us because not all files will be checked - # W0125: Using a conditional statement with a constant value (using-constant-test) --> often used for testing/debugging purposes in the Path module - pylintFailSilent: false + pylintDisable: disable=C0302 # too-many-lines checkBlack: true blackFailSilent: true @@ -51,21 +57,26 @@ env: skip: ./.git,*.po,*.ts,*.svg,./ChangeLog.txt,./src/3rdParty,./src/Mod/Assembly/App/opendcm,./src/CXX,./src/zipios++,./src/Base/swig*,./src/Mod/Robot/App/kdl_cp,./src/Mod/Import/App/SCL,./src/WindowsInstaller,./src/Doc/FreeCAD.uml,./build/ codespellFailSilent: false + # Static Analysis checkClangTidy: true - clangTidyChecks: boost-*,bugprone-*,performance-*,readability-*,portability-*,modernize-*,clang-analyzer-*,cppcoreguidelines-*,concurrency-* - clangTidyFailSilent: true + # for the Message codes see: https://clang-tidy.llvm.org/checks/index.html + clangTidyChecks: # empty to use the .clang-tidy file + clangTidyFailSilent: true # if false, the CI will fail if clang-tidy finds errors. Warnings or notes will not fail the CI checkClazy: true - clazyChecks: level1 # https://invent.kde.org/sdk/clazy#list-of-checks - clazyFailSilent: false + # for the Message codes see: https://invent.kde.org/sdk/clazy#list-of-checks + clazyChecks: level1 + clazyFailSilent: true # if false, the CI will fail if clazy finds errors. Warnings or notes will not fail the CI checkClazyQT6: true clazyQT6Checks: qt6-deprecated-api-fixes,qt6-header-fixes,qt6-qhash-signature,qt6-fwd-fixes,missing-qobject-macro # for QT6 Porting https://invent.kde.org/sdk/clazy#list-of-checks QT6Branch: master # branch to check for QT6 Porting - clazyQT6FailSilent: false + clazyQT6FailSilent: true # if false, the CI will fail if clazy finds errors. Warnings or notes will not fail the CI + # Reporting reportStepSummary: true - reportPRComment: false + reportPRComment: false # disabled because of permission hell (and the comments are to big for Github) + reportPushComment: false # disabled because of permission hell (and the comments are to big for Github) jobs: checks: @@ -76,7 +87,7 @@ jobs: with: fetch-depth: 2 - - name: Install dependencies + - name: Install FreeCAD dependencies id: install-dependencies run: | sudo apt-get update -qq @@ -146,21 +157,57 @@ jobs: shiboken2 \ imagemagick - - name: make Log and Fixes directory + - name: Get Date + if: always() + id: get-date + run: | + echo "::set-output name=date::$(/bin/date -u "+%Y%m%d%H%M")" + shell: bash + + - name: Install ccache + if: always() + run: | + sudo apt-get update -qq + sudo apt-get install -y --no-install-recommends ccache + + - name: make directories + if: always() run: | mkdir -p ${{ env.logdir }} mkdir -p ${{ env.fixesdir }} + mkdir -p ~/.ccache + + - name: Restore Compiler Cache + if: always() + uses: pat-s/always-upload-cache@v3 + with: + path: | + ~/.ccache + key: CI-cache-${{ steps.get-date.outputs.date }}-${{ github.run_number }} + restore-keys: | + CI-cache-${{ steps.get-date.outputs.date }}- + CI-cache- + + - name: Configure Cache + if: always() + run: | + ccache -z -M 1G + ccache --show-config + ccache -s + - name: Job summary Header + if: always() id: header run: | echo '# Check Results: :rocket:' >> ${{ env.logdir }}checkReport.md - name: Get changed files + if: always() id: changed-files - uses: tj-actions/changed-files@v12.2 + uses: tj-actions/changed-files@v24 - - name: List all changed Files + - name: Report all changed Files id: list-changed-files run: | echo "
:clipboard: Changed Files:" >> ${{ env.logdir }}checkReport.md @@ -177,6 +224,7 @@ jobs: id: harmonize-line-endings shell: bash run: | + # harmonize line endings in all changed files (Windows -> Unix) for file in ${{ steps.changed-files.outputs.all_changed_files }}; do if [ -f "$file" ]; then echo "Harmonizing line endings in $file" @@ -185,17 +233,250 @@ jobs: done - name: filter files by extensions + if: always() id: files-by-extensions shell: bash run: | changed_files=$( echo ${{ steps.changed-files.outputs.all_changed_files }} ) - py=$(grep -oE '\S*?\.(py|py3)' <<< $changed_files | tr '\n' ' ') || true # grep returns non-zero exit code if no match is found - cpp=$(grep -oE '\S*?\.(c|c++|cc|cpp|cu|cuh|cxx|h|h++|hh|hpp|hxx)' <<< $changed_files | tr '\n' ' ') || true + py=$(grep -oE '\S+\.(py|py3)' <<< $changed_files | tr '\n' ' ') || true # grep returns non-zero exit code if no match is found + cpp=$(grep -oE '\S+\.(c|c\+\+|cc|cpp|cu|cuh|cxx|h|h\+\+|hh|hpp|hxx)' <<< $changed_files | tr '\n' ' ') || true echo "::set-output name=python_files::$py" echo "::set-output name=cpp_files::$cpp" + echo "Python Files: $py" + echo "C++ Files: $cpp" - - name: Tests Header + - name: CMake Configure + id: configure + if: always() + run: | + set +e + + cmake \ + -D CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE \ + -B build/ > ${{ env.logdir }}Cmake.log 2> ${{ env.logdir }}CmakeErrors.log + + exitCode=$? + + # Build Header in Report + echo '### Build:' >> ${{ env.logdir }}checkReport.md + + # Write the configure report + if [ $exitCode -eq 0 ] ; then + echo "
:heavy_check_mark: CMake configure succeeded" >> ${{ env.logdir }}checkReport.md + else + echo "
:fire: CMake configure failed" >> ${{ env.logdir }}checkReport.md + fi + echo "" >> ${{ env.logdir }}checkReport.md + echo "Configure Error Log (stderr output):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}CmakeErrors.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "Configure Log (stdout output):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + tail -n 60 ${{ env.logdir }}Cmake.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + + cat ${{ env.logdir }}CmakeErrors.log + echo "::group::Configure Log" + cat ${{ env.logdir }}Cmake.log + echo "::endgroup::" + + exit $exitCode + + - name: Print ccache statistics before Build + if: always() + run: ccache -s + + - name: CMake Build + id: build + if: always() + run: | + set +e + + cmake --build build/ > ${{ env.logdir }}Build.log 2> ${{ env.logdir }}BuildErrors.log + + exitCode=$? + + # Write the build report + if [ $exitCode -eq 0 ] ; then + echo "
:heavy_check_mark: CMake build succeeded" >> ${{ env.logdir }}checkReport.md + else + echo "
:fire: CMake build failed" >> ${{ env.logdir }}checkReport.md + fi + echo "" >> ${{ env.logdir }}checkReport.md + echo "Build Error Log (stderr output):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}BuildErrors.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "Build Log (stdout output trimmed to the last 100 Lines):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + tail -n 50 ${{ env.logdir }}Build.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + + # Print the Log to the console + cat ${{ env.logdir }}BuildErrors.log + echo "::group::Build Log" + cat ${{ env.logdir }}Build.log + echo "::endgroup::" + + # Exit the step with the exit code of the build + if [ ${{ env.buildFailSilent }} != true ]; then + exit $exitCode + else + echo "Build exited with code $exitCode, but we are ignoring it" + exit 0 + fi + + - name: Print ccache statistics after Build + if: always() + run: ccache -s + + - name: FreeCAD UnitTests + id: test + if: env.test == 'true' && always() + run: | + set +e + + build/bin/FreeCADCmd -t 0 &> ${{ env.logdir }}Test.log + + exitCode=$? + + # Trim the Log file + # remove "(xx %)" + sed -E '/\t+\([[:digit:]]{1,3} %\)\t/d' ${{ env.logdir }}Test.log > ${{ env.logdir }}TestTrimmed.log + + # Write the test report + if [ $exitCode -eq 0 ] ; then + echo "
:heavy_check_mark: Unittests succeeded" >> ${{ env.logdir }}checkReport.md + else + echo "
:fire: CMake test failed" >> ${{ env.logdir }}checkReport.md + fi + echo "" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + tail -n 100 ${{ env.logdir }}TestTrimmed.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + + # Print the Log to the console + cat ${{ env.logdir }}Test.log + + # Exit the step with the exit code of the UnitTests + if [ ${{ env.testFailSilent }} != true ]; then + exit $exitCode + else + echo "Test exited with code $exitCode, but we are ignoring it" + exit 0 + fi + + - name: CMake Install + id: install + if: env.testInstall == 'true' && always() + run: | + set +e + + # Run the CMake Configure step again to update the install path + cmake \ + -D CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE \ + -D CMAKE_INSTALL_PREFIX='/usr/lib/freecad' \ + -D CMAKE_INSTALL_BINDIR='/usr/lib/freecad/bin' \ + -D CMAKE_INSTALL_LIBDIR='/usr/lib/freecad/lib' \ + -D CMAKE_INSTALL_DATADIR='/usr/share/freecad' \ + -D CMAKE_INSTALL_DATAROOTDIR='/usr/share' \ + -D CMAKE_INSTALL_DOCDIR='/usr/share/doc/freecad' \ + -B build/ >> ${{ env.logdir }}Install.log 2>> ${{ env.logdir }}InstallErrors.log + + # Build again to copy the files to the install path + cmake --build build/ >> ${{ env.logdir }}Install.log 2>> ${{ env.logdir }}InstallErrors.log + + # Run CMake Install + sudo cmake --install build/ >> ${{ env.logdir }}Install.log 2>> ${{ env.logdir }}InstallErrors.log + + exitCode=$? + + # links for bin + FILES=/usr/lib/freecad/bin/* + for f in $FILES + do + sudo ln -vs /usr/lib/freecad/bin/$(basename $f) /usr/bin/$(basename $f) + done + + # Write the install report + if [ $exitCode -eq 0 ] ; then + echo "
:heavy_check_mark: CMake install succeeded" >> ${{ env.logdir }}checkReport.md + else + echo "
:fire: CMake install failed" >> ${{ env.logdir }}checkReport.md + fi + echo "" >> ${{ env.logdir }}checkReport.md + echo "Install Error Log (stderr output):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}InstallErrors.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "Install Error Log (stdout output trimmed to the last 100 Lines):" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + tail -n 100 ${{ env.logdir }}Install.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + + # Print the Log to the console + cat ${{ env.logdir }}InstallErrors.log + echo "::group::Install Log" + cat ${{ env.logdir }}Install.log + echo "::endgroup::" + + # Exit the step with the exit code of the Install + if [ ${{ env.cmakeInstallFailSilent }} != true ]; then + exit $exitCode + else + echo "CMake install exited with code $exitCode, but we are ignoring it" + exit 0 + fi + + - name: FreeCAD UnitTests on Install + id: testInstall + if: env.testInstall == 'true' && always() + run: | + set +e + + LD_LIBRARY_PATH=/usr/lib/freecad/lib FreeCADCmd -t 0 &> ${{ env.logdir }}TestInstall.log + + exitCode=$? + + # Trim the Log file + # remove "(xx %)" + sed -E '/\t+\([[:digit:]]{1,3} %\)\t/d' ${{ env.logdir }}TestInstall.log > ${{ env.logdir }}TestInstallTrimmed.log + + # Write the testInstall report + if [ $exitCode -eq 0 ] ; then + echo "
:heavy_check_mark: Unittests on install succeeded" >> ${{ env.logdir }}checkReport.md + else + echo "
:fire: CMake test on install failed" >> ${{ env.logdir }}checkReport.md + fi + echo "" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + tail -n 100 ${{ env.logdir }}TestInstallTrimmed.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + + # Print the Log to the console + cat ${{ env.logdir }}TestInstall.log + + # Exit the step with the exit code of the UnitTests + if [ ${{ env.testInstallFailSilent }} != true ]; then + exit $exitCode + else + echo "Test on install exited with code $exitCode, but we are ignoring it" + exit 0 + fi + + - name: Report Tests header if: always() id: tests-header run: | @@ -213,6 +494,7 @@ jobs: grep -rnIHE --exclude="$exclude" " $" $file | sed 's/$/<-- trailing whitespace/' >> ${{ env.logdir }}whitespace.log || true done + # Write the Log to the console with the Problem Matchers if [ -f ${{ env.logdir }}whitespace.log ]; then echo "::add-matcher::${{ runner.workspace }}/FreeCAD/.github/problemMatcher/grepMatcherWarning.json" cat ${{ env.logdir }}whitespace.log @@ -225,12 +507,12 @@ jobs: echo "whitespaceErrors=$whitespaceErrors" >> $GITHUB_ENV - if [ "$whitespaceErrors" -gt 0 ]; then - # Write the report + # Write the report + if [ $whitespaceErrors -gt 0 ]; then echo "
:information_source: Found $whitespaceErrors trailing whitespace" >> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}whitespace.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}whitespace.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md else @@ -238,7 +520,8 @@ jobs: fi echo "" >> ${{ env.logdir }}checkReport.md - if [ "$whitespaceErrors" -gt 0 ] && [ ${{ env.whitespaceFailSilent }} != true ]; then + # Exit the step with the exit code + if [ $whitespaceErrors -gt 0 ] && [ ${{ env.whitespaceFailSilent }} != true ]; then exit 1 else exit 0 @@ -256,7 +539,7 @@ jobs: grep -rnIHE --exclude="$exclude" $'\t' $file | sed 's/$/ <-- contains tab/' >> ${{ env.logdir }}tab.log || true done - # Parse the log + # Write the Log to the console with the Problem Matchers if [ -f ${{ env.logdir }}tab.log ]; then echo "::add-matcher::${{ runner.workspace }}/FreeCAD/.github/problemMatcher/grepMatcherWarning.json" cat ${{ env.logdir }}tab.log @@ -269,11 +552,12 @@ jobs: echo "tabErrors=$tabErrors" >> $GITHUB_ENV - if [ "$tabErrors" -gt 0 ]; then + # Write the report + if [ $tabErrors -gt 0 ]; then echo "
:information_source: Found $tabErrors tabs, better to use spaces" >> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}tab.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}tab.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md else @@ -281,7 +565,8 @@ jobs: fi echo "" >> ${{ env.logdir }}checkReport.md - if [ "$tabErrors" -gt 0 ] && [ ${{ env.tabsFailSilent }} != true ]; then + # Exit the step with the exit code + if [ $tabErrors -gt 0 ] && [ ${{ env.tabsFailSilent }} != true ]; then exit 1 else exit 0 @@ -314,13 +599,13 @@ jobs: echo "Found $qtconnectionSyntax QT string-based connections" # Step-Report - if [ "$qtconnectionSyntax" -gt 0 ]; then + if [ $qtconnectionSyntax -gt 0 ]; then echo "
:information_source: Found $qtconnectionSyntax QT string-based connections :arrow_right: consider using QT functor-Based Connections" >> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md # documentation link echo "For more information see: https://wiki.qt.io/New_Signal_Slot_Syntax or https://github.com/FreeCAD/FreeCAD/issues/6166" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}stringSyntax.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}stringSyntax.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md else @@ -328,7 +613,8 @@ jobs: fi echo "" >> ${{ env.logdir }}checkReport.md - if [ "$qtconnectionSyntax" -gt 0 ] && [ ${{ env.qtconnectionSyntaxFailSilent }} != true ]; then + # Exit the step with the exit code + if [ $qtconnectionSyntax -gt 0 ] && [ ${{ env.qtconnectionSyntaxFailSilent }} != true ]; then exit 1 else exit 0 @@ -339,8 +625,6 @@ jobs: if: env.checkCpplint == 'true' && steps.files-by-extensions.outputs.cpp_files != '' && always() run: | cpplintErrors="0" - #filters="--filter=-build/header_guard,-readability/braces,-whitespace" - #linelength="--linelength=120" pip install cpplint @@ -364,7 +648,7 @@ jobs: echo "Found $cpplintErrors cpplint errors" # Step-Report - if [ "$cpplintErrors" -gt 0 ]; then + if [ $cpplintErrors -gt 0 ]; then echo "
:warning: CppLint found $cpplintErrors errors / warnings" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: No cpplint errors found " >> ${{ env.logdir }}checkReport.md @@ -372,12 +656,13 @@ jobs: echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}cpplint.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}cpplint.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md - if [ "$cpplintErrors" -gt 0 ] && [ ${{ env.cpplintFailSilent }} != true ]; then + # Exit the step with the exit code + if [ $cpplintErrors -gt 0 ] && [ ${{ env.cpplintFailSilent }} != true ]; then exit 1 else exit 0 @@ -387,6 +672,8 @@ jobs: shell: bash if: env.checkPylint == 'true' && steps.files-by-extensions.outputs.python_files != '' && always() run: | + set +e + pylintErrors="0" pip install pylint @@ -396,8 +683,13 @@ jobs: pylintRefactorings="0" pylintConventions="0" + # List enabled pylint checks + pylint --list-msgs-enabled > ${{ env.logdir }}pylint-enabled-checks.log + # Run pylint on all python files - pylint --exit-zero --reports y --disable=${{ env.pylintDisable }} ${{ steps.files-by-extensions.outputs.python_files }} > ${{ env.logdir }}pylint.log + pylint --disable=${{ env.pylintDisable }} ${{ steps.files-by-extensions.outputs.python_files }} > ${{ env.logdir }}pylint.log + + exitCode=$? # if pylint has run successfully, then parse the output if [ -f ${{ env.logdir }}pylint.log ]; then @@ -422,29 +714,38 @@ jobs: echo "Found $pylintErrors errors, $pylintWarnings warnings, $pylintRefactorings refactorings, $pylintConventions conventions" #Step-summary - if [ "$pylintErrors" -gt 0 ]; then + if [ $pylintErrors -gt 0 ]; then echo "
:fire: Pylint found :fire: $pylintErrors errors, :warning: $pylintWarnings warnings, :construction: $pylintRefactorings refactorings and :pencil2: $pylintConventions conventions" >> ${{ env.logdir }}checkReport.md - elif [ "$pylintWarnings" -gt 0 ]; then + elif [ $pylintWarnings -gt 0 ]; then echo "
:warning: Pylint found :warning: $pylintWarnings warnings, :construction: $pylintRefactorings refactorings and :pencil2: $pylintConventions conventions" >> ${{ env.logdir }}checkReport.md - elif [ "$pylintRefactorings" -gt 0 ]; then + elif [ $pylintRefactorings -gt 0 ]; then echo "
:construction: Pylint found :construction: $pylintRefactorings refactorings and :pencil2: $pylintConventions conventions" >> ${{ env.logdir }}checkReport.md - elif [ "$pylintConventions" -gt 0 ]; then + elif [ $pylintConventions -gt 0 ]; then echo "
:pencil2: Pylint found :pencil2: $pylintConventions conventions" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: No pylint errors found " >> ${{ env.logdir }}checkReport.md fi + echo "" >> ${{ env.logdir }}checkReport.md + # list enabled checks + echo "
:information_source: Enabled checks" >> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}pylint.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}pylint-enabled-checks.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}pylint.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md # Error the step if pylint has found errors - if [ "$pylintErrors" -gt 0 ] && [ ${{ env.pylintFailSilent }} != true ]; then - exit 1 + if [ $pylintErrors -gt 0 ] && [ ${{ env.pylintFailSilent }} != true ]; then + exit $exitCode else + echo "Pylint exited with code $exitCode, but we are ignoring it" exit 0 fi @@ -452,13 +753,16 @@ jobs: shell: bash if: env.checkBlack == 'true' && steps.files-by-extensions.outputs.python_files != '' && always() run: | + set +e pip install black blackReformats="0" blackFails="0" - black --check ${{ steps.files-by-extensions.outputs.python_files }} &> ${{ env.logdir }}black.log || true + black --check ${{ steps.files-by-extensions.outputs.python_files }} &> ${{ env.logdir }}black.log + + exitCode=$? # if black has run successfully, then parse the output if [ -f ${{ env.logdir }}black.log ]; then @@ -477,7 +781,7 @@ jobs: echo "Found $blackReformats files would be reformatted and $blackFails files would fail to reformat" #Step-summary - if [ "$blackReformats" -gt 0 ] || [ "$blackFails" -gt 0 ] ; then + if [ $blackReformats -gt 0 ] || [ $blackFails -gt 0 ] ; then echo "
:pencil2: Black would reformat $blackReformats files" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: Black would reformat no file" >> ${{ env.logdir }}checkReport.md @@ -485,14 +789,15 @@ jobs: echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}black.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}black.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md - if [ "$blackReformats" -gt 0 ] && [ ${{ env.blackFailSilent }} != true ]; then - exit 1 + if [ $exitCode -gt 0 ] && [ ${{ env.blackFailSilent }} != true ]; then + exit $exitCode else + echo "Black exited with code $exitCode, but we are ignoring it" exit 0 fi @@ -521,7 +826,7 @@ jobs: # Report - if [ "$clangFormatErrors" -gt 0 ]; then + if [ $clangFormatErrors -gt 0 ]; then echo "
:pencil2: Clang-format would reformat $clangFormatErrors files" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: Clang-format would reformat no file " >> ${{ env.logdir }}checkReport.md @@ -529,12 +834,12 @@ jobs: echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}clang-format.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}clang-format.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md - if [ "$clangFormatErrors" -gt 0 ] && [ ${{ env.clangFormatFailSilent }} != true ]; then + if [ $clangFormatErrors -gt 0 ] && [ ${{ env.clangFormatFailSilent }} != true ]; then exit 1 else exit 0 @@ -565,7 +870,7 @@ jobs: echo "Found $misspellings misspellings" #Step-summary - if [ "$misspellings" -gt 0 ]; then + if [ $misspellings -gt 0 ]; then echo "
:pencil2: Codespell found $misspellings misspellings" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: Codespell found no misspellings" >> ${{ env.logdir }}checkReport.md @@ -575,35 +880,35 @@ jobs: # documentation link echo "To ignore false positives, append the word to the [.github/codespellignore](https://github.com/FreeCAD/FreeCAD/blob/c38e88c61b8926f725215da88940025c94be1daa/.github/codespellignore) file (lowercase)" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}codespell.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}codespell.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md # Error the step if pylint has found errors - if [ "$misspellings" -gt 0 ] && [ ${{ env.codespellFailSilent }} != true ]; then + if [ $misspellings -gt 0 ] && [ ${{ env.codespellFailSilent }} != true ]; then exit 1 else exit 0 fi - - name: CMake Configure - if: env.checkClangTidy == 'true' && steps.files-by-extensions.outputs.cpp_files != '' && always() - run: | - cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE -B build/ > ${{ env.logdir }}Cmake.log - cat ${{ env.logdir }}Cmake.log - - name: Clang-tidy shell: bash if: env.checkClangTidy == 'true' && steps.files-by-extensions.outputs.cpp_files != '' && always() run: | + set +e + clangTidyErrors="0" clangTidyWarnings="0" clangTidyNotes="0" - sudo apt-get install clang-tidy + sudo apt-get install -y --no-install-recommends clang-tidy - clang-tidy --quiet --format-style=${{ env.clangStyle }} --export-fixes=${{ env.fixesdir }}clang-tidy.yaml -checks=${{ env.clangTidyChecks }} -p build/ ${{ steps.files-by-extensions.outputs.cpp_files }} &>> ${{ env.logdir }}clang-tidy.log || true + clang-tidy --quiet --format-style=${{ env.clangStyle }} --export-fixes=${{ env.fixesdir }}clang-tidy.yaml -checks=${{ env.clangTidyChecks }} -p build/ --explain-config &>> ${{ env.logdir }}clang-tidy-enabled-checks.log + + clang-tidy --quiet --format-style=${{ env.clangStyle }} --export-fixes=${{ env.fixesdir }}clang-tidy.yaml -checks=${{ env.clangTidyChecks }} -p build/ ${{ steps.files-by-extensions.outputs.cpp_files }} &>> ${{ env.logdir }}clang-tidy.log + + exitCode=$? # if clang-tidy has run successfully parse the output if [ -f ${{ env.logdir }}clang-tidy.log ]; then @@ -624,27 +929,36 @@ jobs: echo "Found $clangTidyErrors errors, $clangTidyWarnings warnings, $clangTidyNotes notes" # Step-Report - if [ "$clangTidyErrors" -gt 0 ]; then + if [ $clangTidyErrors -gt 0 ]; then echo "
:fire: Clang-Tidy found :fire: $clangTidyErrors errors, :warning: $clangTidyWarnings warnings and :pencil2: $clangTidyNotes notes" >> ${{ env.logdir }}checkReport.md - elif [ "$clangTidyWarnings" -gt 0 ]; then + elif [ $clangTidyWarnings -gt 0 ]; then echo "
:warning: Clang-Tidy found :warning: $clangTidyWarnings warnings and :pencil2: $clangTidyNotes notes" >> ${{ env.logdir }}checkReport.md - elif [ "$clangTidyNotes" -gt 0 ]; then + elif [ $clangTidyNotes -gt 0 ]; then echo "
:pencil2: Clang-Tidy found :pencil2: $clangTidyNotes notes" >> ${{ env.logdir }}checkReport.md else echo "
:heavy_check_mark: Clang-Tidy found no errors, warnings or notes" >> ${{ env.logdir }}checkReport.md fi + echo "" >> ${{ env.logdir }}checkReport.md + # enabled checks + echo "
:information_source: Enabled checks" >> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}clang-tidy.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}clang-tidy-enabled-checks.log >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + echo "
">> ${{ env.logdir }}checkReport.md + echo "" >> ${{ env.logdir }}checkReport.md + echo '```' >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}clang-tidy.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md # Error the step if pylint has found errors - if [ "$clangTidyErrors" -gt 0 ] && [ ${{ env.clangTidyFailSilent }} != true ]; then + if [ $clangTidyErrors -gt 0 ] && [ ${{ env.clangTidyFailSilent }} != true ]; then exit 1 else + echo "Clang-tidy exited with code $exitCode, but we are ignoring it" exit 0 fi @@ -656,7 +970,7 @@ jobs: clazyWarnings="0" clazyNotes="0" - sudo apt-get install clazy + sudo apt-get install -y --no-install-recommends clazy clazy-standalone --export-fixes=${{ env.fixesdir }}clazy.yaml -checks=${{ env.clazyChecks }} -p build/ ${{ steps.files-by-extensions.outputs.cpp_files }} &>> ${{ env.logdir }}clazy.log || true @@ -688,10 +1002,11 @@ jobs: else echo "
:heavy_check_mark: Clazy found no errors, warnings or notes" >> ${{ env.logdir }}checkReport.md fi - echo "" >> ${{ env.logdir }}checkReport.md + # documentation link + echo "[List of checks](https://github.com/KDE/clazy#list-of-checks), [This explains some of the clazy warnings](https://www.kdab.com/uncovering-32-qt-best-practices-compile-time-clazy/) " >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}clazy.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}clazy.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md @@ -705,7 +1020,7 @@ jobs: - name: Clazy-QT6 shell: bash - if: env.checkClazyQT6 == 'true' && steps.files-by-extensions.outputs.cpp_files != '' && github.base_ref == env.QT6Branch && always() + if: env.checkClazyQT6 == 'true' && steps.files-by-extensions.outputs.cpp_files != '' && github.ref == env.QT6Branch && always() run: | clazyQT6Errors="0" clazyQT6Warnings="0" @@ -748,7 +1063,7 @@ jobs: echo "" >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md - head -n 500 ${{ env.logdir }}clazyQT6.log >> ${{ env.logdir }}checkReport.md + cat ${{ env.logdir }}clazyQT6.log >> ${{ env.logdir }}checkReport.md echo '```' >> ${{ env.logdir }}checkReport.md echo "
">> ${{ env.logdir }}checkReport.md echo "" >> ${{ env.logdir }}checkReport.md @@ -791,8 +1106,24 @@ jobs: cat ${{ env.logdir }}checkReport.md > $GITHUB_STEP_SUMMARY - name: Create Pull request comment - if: env.reportPRComment == 'true' && always() + if: env.reportPRComment == 'true' && github.event_name == 'pull_request' && always() uses: marocchino/sticky-pull-request-comment@v2 with: header: Check results path: ${{ env.logdir }}checkReport.md + + - name: get comment body + id: get-comment-body + if: env.reportPushComment == 'true' && github.event_name == 'push' && always() + run: | + body=$(cat ${{ env.logdir }}checkReport.md) + body="${body//'%'/'%25'}" + body="${body//$'\n'/'%0A'}" + body="${body//$'\r'/'%0D'}" + echo ::set-output name=body::$body + + - name: Create commit comment + if: env.reportPushComment == 'true' && github.event_name == 'push' && always() + uses: peter-evans/commit-comment@v2 + with: + body: ${{ steps.get-comment-body.outputs.body }}