diff options
author | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-08-12 14:34:00 +0200 |
---|---|---|
committer | Klaus Aehlig <klaus.aehlig@huawei.com> | 2024-08-14 12:27:44 +0200 |
commit | 2ab70dbcfa7f7f5a352c4ff15404227b47242c66 (patch) | |
tree | 524ba7c018bbabac35766182b45053d3a8259002 /lint | |
parent | 8ce1c4589e553f7f79893c712b8f4847a098ce75 (diff) | |
download | rules-cc-2ab70dbcfa7f7f5a352c4ff15404227b47242c66.tar.gz |
new rule ["lint", "targets"]
Diffstat (limited to 'lint')
-rw-r--r-- | lint/RULES | 187 | ||||
-rw-r--r-- | lint/TARGETS | 1 | ||||
-rwxr-xr-x | lint/call_lint | 41 | ||||
-rwxr-xr-x | lint/call_summary | 35 |
4 files changed, 264 insertions, 0 deletions
diff --git a/lint/RULES b/lint/RULES new file mode 100644 index 0000000..d7b2703 --- /dev/null +++ b/lint/RULES @@ -0,0 +1,187 @@ +{ "targets": + { "doc": + [ "Run a given linter on the lint information provided by the given targets." + ] + , "target_fields": ["linter", "config", "summarizer", "targets"] + , "tainted": ["lint"] + , "field_doc": + { "linter": + [ "Single artifact running the lint checks." + , "" + , "This artifact with" + , "- argv[1] the file to lint, and" + , "- argv[2:] the original command line." + , "This invocation happens in an environment with" + , "- CONFIG pointing to the directory with all the artifacts given" + , " by the field \"config\"." + , "- OUT pointing to a directory to which files with the lint result" + , " can be written." + , "The linter is supposed to indicate by the exit code whether the" + , "indicated file complies with the given linting policy, with 0 meaning" + , "compliant." + , "Stdout and stderr, as well as the directory ${OUT} can be used to" + , "provide additional information." + ] + , "config": ["Any configuration or other files needed by the linter."] + , "summarizer": + [ "Single artifact generating a summary of the individual lint results." + , "It will be called in a directory where all subdirectories with names" + , "consisting entirely of digits are the results of the individual lint" + , "actions. Those are given as" + , " - a file result with content PASS if and only if the lint action" + , " exited 0," + , " - files stdout and stderr with stdout and stderr of the lint" + , " action, and" + , " - a directory out with the additional information provided by the" + , " lint action." + , "The summarizer is required to indicate the overall result by the exit" + , "code, produce a human-readable summary on stdout, and optionally" + , "additional information in the directory ${OUT}." + ] + , "call_lint": ["Launcher for the linter"] + , "call_summary": ["Launcher for the summarizer"] + } + , "implicit": {"call_lint": ["call_lint"], "call_summary": ["call_summary"]} + , "config_transitions": + {"targets": [{"type": "singleton_map", "key": "LINT", "value": true}]} + , "anonymous": + {"lint": {"target": "targets", "provider": "lint", "rule_map": {}}} + , "imports": + { "stage": ["", "stage_singleton_field"] + , "artifacts": ["", "field_artifacts"] + } + , "expression": + { "type": "let*" + , "bindings": + [ [ "linter" + , { "type": "let*" + , "bindings": [["fieldname", "linter"], ["location", "linter"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage"} + } + ] + , [ "runner" + , { "type": "let*" + , "bindings": [["fieldname", "call_lint"], ["location", "runner"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage"} + } + ] + , [ "config" + , { "type": "let*" + , "bindings": [["fieldname", "config"]] + , "body": {"type": "CALL_EXPRESSION", "name": "artifacts"} + } + ] + , [ "lint results" + , { "type": "foreach" + , "range": {"type": "FIELD", "name": "lint"} + , "body": + { "type": "let*" + , "bindings": + [ [ "src" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "_"} + , "provider": "src" + } + ] + , [ "cmd" + , { "type": "DEP_PROVIDES" + , "dep": {"type": "var", "name": "_"} + , "provider": "cmd" + } + ] + , [ "src input" + , { "type": "DEP_ARTIFACTS" + , "dep": {"type": "var", "name": "_"} + } + ] + ] + , "body": + { "type": "TREE" + , "$1": + { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "runner"} + , {"type": "var", "name": "linter"} + , { "type": "to_subdir" + , "subdir": "work" + , "$1": {"type": "var", "name": "src input"} + } + , { "type": "to_subdir" + , "subdir": "config" + , "$1": {"type": "var", "name": "config"} + } + ] + } + , "cmd": + { "type": "++" + , "$1": + [ ["./runner", {"type": "var", "name": "src"}] + , {"type": "var", "name": "cmd"} + ] + } + , "outs": ["stdout", "stderr", "result"] + , "out_dirs": ["out"] + , "may_fail": ["lint"] + , "fail_message": + { "type": "join" + , "$1": ["lint failed for ", {"type": "var", "name": "src"}] + } + } + } + } + } + ] + , [ "summary input" + , {"type": "enumerate", "$1": {"type": "var", "name": "lint results"}} + ] + , [ "summarizer" + , { "type": "let*" + , "bindings": + [["fieldname", "summarizer"], ["location", "summarizer"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage"} + } + ] + , [ "runner" + , { "type": "let*" + , "bindings": [["fieldname", "call_summary"], ["location", "runner"]] + , "body": {"type": "CALL_EXPRESSION", "name": "stage"} + } + ] + , [ "summary" + , { "type": "ACTION" + , "inputs": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "runner"} + , {"type": "var", "name": "summarizer"} + , { "type": "to_subdir" + , "subdir": "work" + , "$1": {"type": "var", "name": "summary input"} + } + ] + } + , "cmd": ["./runner"] + , "outs": ["report", "result"] + , "out_dirs": ["out"] + } + ] + ] + , "body": + { "type": "RESULT" + , "artifacts": + { "type": "map_union" + , "$1": + [ {"type": "var", "name": "summary"} + , { "type": "singleton_map" + , "key": "work" + , "value": + {"type": "TREE", "$1": {"type": "var", "name": "summary input"}} + } + ] + } + } + } + } +} diff --git a/lint/TARGETS b/lint/TARGETS new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/lint/TARGETS @@ -0,0 +1 @@ +{} diff --git a/lint/call_lint b/lint/call_lint new file mode 100755 index 0000000..ab9c2b8 --- /dev/null +++ b/lint/call_lint @@ -0,0 +1,41 @@ +#!/bin/sh +# Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +# +# 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. + + +# ensure all required outputs are present +touch stdout +touch stderr +RESULT=UNKNOWN +echo "${RESULT}" > result + +export OUT="$(pwd)/out" +mkdir -p config +export CONFIG="$(pwd)/config" + +cd work + +if ../linter "$@" > ../stdout 2> ../stderr +then + RESULT=PASS +else + RESULT=FAIL +fi + +echo "${RESULT}" > ../result + +if [ "${RESULT}" '!=' PASS ] +then + exit 1; +fi diff --git a/lint/call_summary b/lint/call_summary new file mode 100755 index 0000000..d4aa8cb --- /dev/null +++ b/lint/call_summary @@ -0,0 +1,35 @@ +#!/bin/sh +# Copyright 2024 Huawei Cloud Computing Technology Co., Ltd. +# +# 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. + + +# ensure all required outputs are present +touch report +RESULT=UNKNOWN +echo "${RESULT}" > result + +export OUT="$(pwd)/out" + +cd work + +if ../summarizer > ../report +then + RESULT=PASS +else + RESULT=FAIL +fi + +echo "${RESULT}" > ../result + +exit 0 |