Merge pull request #18824 from Ultimaker/CURA-10903-warn-for-deleted-files

Add detection for deleted files in printer linter
This commit is contained in:
HellAholic 2024-04-10 15:01:06 +02:00 committed by GitHub
commit e37434abef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 56 additions and 6 deletions

View file

@ -18,6 +18,7 @@ jobs:
- uses: technote-space/get-diff-action@v6 - uses: technote-space/get-diff-action@v6
with: with:
DIFF_FILTER: AMRCD
PATTERNS: | PATTERNS: |
resources/+(extruders|definitions)/*.def.json resources/+(extruders|definitions)/*.def.json
resources/+(intent|quality|variants)/**/*.inst.cfg resources/+(intent|quality|variants)/**/*.inst.cfg
@ -41,6 +42,10 @@ jobs:
if: env.GIT_DIFF && !env.MATCHED_FILES if: env.GIT_DIFF && !env.MATCHED_FILES
run: python printer-linter/src/terminal.py --diagnose --report printer-linter-result/fixes.yml ${{ env.GIT_DIFF_FILTERED }} run: python printer-linter/src/terminal.py --diagnose --report printer-linter-result/fixes.yml ${{ env.GIT_DIFF_FILTERED }}
- name: Check Deleted Files(s)
if: env.GIT_DIFF
run: python printer-linter/src/terminal.py --deleted --report printer-linter-result/comment.md ${{ env.GIT_DIFF_FILTERED }}
- name: Save PR metadata - name: Save PR metadata
run: | run: |
echo ${{ github.event.number }} > printer-linter-result/pr-id.txt echo ${{ github.event.number }} > printer-linter-result/pr-id.txt

View file

@ -72,6 +72,18 @@ jobs:
mkdir printer-linter-result mkdir printer-linter-result
unzip printer-linter-result.zip -d printer-linter-result unzip printer-linter-result.zip -d printer-linter-result
- name: Get Pull Request Number
id: pr
run: echo "::set-output name=pull_request_number::$(gh pr view --json number -q .number || echo "")"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Run PR Comments
uses: peter-evans/create-or-update-comment@v4
with:
issue-number: ${{ steps.pr.outputs.pull_request_number }}
body-path: 'printer-linter-result/comment.md'
- name: Run clang-tidy-pr-comments action - name: Run clang-tidy-pr-comments action
uses: platisd/clang-tidy-pr-comments@bc0bb7da034a8317d54e7fe1e819159002f4cc40 uses: platisd/clang-tidy-pr-comments@bc0bb7da034a8317d54e7fe1e819159002f4cc40
with: with:

View file

@ -3,6 +3,7 @@ checks:
diagnostic-mesh-file-size: true diagnostic-mesh-file-size: true
diagnostic-definition-redundant-override: true diagnostic-definition-redundant-override: true
diagnostic-resources-macos-app-directory-name: true diagnostic-resources-macos-app-directory-name: true
diagnostic-resource-file-deleted: true
diagnostic-material-temperature-defined: true diagnostic-material-temperature-defined: true
fixes: fixes:
diagnostic-definition-redundant-override: true diagnostic-definition-redundant-override: true

View file

@ -1,7 +1,7 @@
[project] [project]
name = "printerlinter" name = "printerlinter"
description = "Cura UltiMaker printer linting tool" description = "Cura UltiMaker printer linting tool"
version = "0.1.1" version = "0.1.2"
authors = [ authors = [
{ name = "UltiMaker", email = "cura@ultimaker.com" } { name = "UltiMaker", email = "cura@ultimaker.com" }
] ]

View file

@ -32,3 +32,13 @@ class Diagnostic:
}, },
"Level": self.level "Level": self.level
} }
class GitComment:
def __init__(self, comment: str) -> None:
"""
@param comment: The comment text.
"""
self.comment = comment
def toDict(self) -> Dict[str, Any]:
return self.comment

View file

@ -11,7 +11,7 @@ from .linters.directory import Directory
def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]: def getLinter(file: Path, settings: dict) -> Optional[List[Linter]]:
""" Returns a Linter depending on the file format """ """ Returns a Linter depending on the file format """
if not file.exists(): if not file.exists():
return None return [Directory(file, settings)]
if ".inst" in file.suffixes and ".cfg" in file.suffixes: if ".inst" in file.suffixes and ".cfg" in file.suffixes:
return [Directory(file, settings), Profile(file, settings)] return [Directory(file, settings), Profile(file, settings)]

View file

@ -90,7 +90,7 @@ class Definition(Linter):
yield Diagnostic( yield Diagnostic(
file=self._file, file=self._file,
diagnostic_name="diagnostic-definition-redundant-override", diagnostic_name="diagnostic-material-temperature-defined",
message=f"Overriding {key} as it belongs to material temperature catagory and shouldn't be placed in machine definitions", message=f"Overriding {key} as it belongs to material temperature catagory and shouldn't be placed in machine definitions",
level="Warning", level="Warning",
offset=found.span(0)[0], offset=found.span(0)[0],

View file

@ -1,7 +1,7 @@
from pathlib import Path from pathlib import Path
from typing import Iterator from typing import Iterator
from ..diagnostic import Diagnostic from ..diagnostic import Diagnostic, GitComment
from .linter import Linter from .linter import Linter
@ -11,9 +11,12 @@ class Directory(Linter):
super().__init__(file, settings) super().__init__(file, settings)
def check(self) -> Iterator[Diagnostic]: def check(self) -> Iterator[Diagnostic]:
if self._settings["checks"].get("diagnostic-resources-macos-app-directory-name", False): if self._file.exists() and self._settings["checks"].get("diagnostic-resources-macos-app-directory-name", False):
for check in self.checkForDotInDirName(): for check in self.checkForDotInDirName():
yield check yield check
elif self._settings["checks"].get("diagnostic-resource-file-deleted", False):
for check in self.checkFilesDeleted():
yield check
yield yield
@ -29,3 +32,8 @@ class Directory(Linter):
) )
yield yield
def checkFilesDeleted(self) -> Iterator[GitComment]:
if not self._file.exists():
""" Check if there is a file that is deleted, this causes upgrade scripts to not work properly """
yield GitComment( f'File: **{self._file}** must not be deleted as it is not allowed. It will create issues upgrading Cura' )
yield

View file

@ -19,6 +19,7 @@ def main() -> None:
parser.add_argument("--report", required=False, type=Path, help="Path where the diagnostic report should be stored") parser.add_argument("--report", required=False, type=Path, help="Path where the diagnostic report should be stored")
parser.add_argument("--format", action="store_true", help="Format the files") parser.add_argument("--format", action="store_true", help="Format the files")
parser.add_argument("--diagnose", action="store_true", help="Diagnose the files") parser.add_argument("--diagnose", action="store_true", help="Diagnose the files")
parser.add_argument("--deleted", action="store_true", help="Check for deleted files")
parser.add_argument("--fix", action="store_true", help="Attempt to apply the suggested fixes on the files") parser.add_argument("--fix", action="store_true", help="Attempt to apply the suggested fixes on the files")
parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format") parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format")
@ -41,12 +42,26 @@ def main() -> None:
settings = yaml.load(f, yaml.FullLoader) settings = yaml.load(f, yaml.FullLoader)
full_body_check = {"Diagnostics": []} full_body_check = {"Diagnostics": []}
comments_check = {"Error Files": []}
for file in files: for file in files:
if not path.exists(file): if not path.exists(file):
print(f"Can't find the file: {file}") print(f"Can't find the file: {file}")
return return
if args.deleted:
for file in args.Files:
if file not in files:
deletedFiles = diagnoseIssuesWithFile(file, settings)
comments_check["Error Files"].extend([d.toDict() for d in deletedFiles])
results = yaml.dump(comments_check, default_flow_style=False, indent=4, width=240)
if report:
report.write_text(results)
else:
print(results)
if to_fix or to_diagnose: if to_fix or to_diagnose:
for file in files: for file in files:
diagnostics = diagnoseIssuesWithFile(file, settings) diagnostics = diagnoseIssuesWithFile(file, settings)
@ -82,7 +97,6 @@ def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]:
return linter_results return linter_results
def applyFixesToFile(file, settings, full_body_check) -> None: def applyFixesToFile(file, settings, full_body_check) -> None:
if not file.exists(): if not file.exists():
return return