[ci] add CI

This commit is contained in:
olemorud
2023-03-14 15:29:07 +01:00
parent fb9ac95d1a
commit 6bc12485dd
7 changed files with 108 additions and 32 deletions

33
.github/workflows/CI.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: CI
on: [push, pull_request, workflow_dispatch]
jobs:
run-tests:
if: github.repository_owner == 'olemorud'
permissions:
contents: read
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: npm install
run: npm ci
- name: Run unit tests
run: npm run test
- name: Apply problem matcher
uses: ./
with:
build-directory: build/
- name: Test problem matcher
run: |
ls
cat dist/gcc_matcher.json
cp -r test build
gcc -Wall -Wextra -O0 build/generate_warnings.c

View File

@@ -9,10 +9,9 @@ branding:
color: yellow color: yellow
inputs: inputs:
root: build-directory:
description: 'base directory for build, e.g. /workdir/build' description: 'base directory for build, e.g. /workdir/build'
required: false required: true
default: ''
runs: runs:
using: 'node16' using: 'node16'

View File

@@ -4,7 +4,7 @@
"owner": "gcc-problem-matcher", "owner": "gcc-problem-matcher",
"pattern": [ "pattern": [
{ {
"regexp": "^${{ BASE }}\/?(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", "regexp": "^.*?${{ BASE }}\/?(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1, "file": 1,
"line": 2, "line": 2,
"column": 3, "column": 3,

48
dist/index.js vendored
View File

@@ -2845,32 +2845,50 @@ const path = __nccwpck_require__(17);
const fs = __nccwpck_require__(561); const fs = __nccwpck_require__(561);
const core = __nccwpck_require__(127); const core = __nccwpck_require__(127);
// C:\Users\ => C\:\\Users\\ // escapeRegExp :: string => string
// escape all characters with special meanings in regexp
const escapeRegExp = (s) => const escapeRegExp = (s) =>
s.replace(/[:.*+?^${}()|\/[\]\\]/g, "\\$&"); s.replace(/[/\-^$*+?.()|[\]{}]/g, "\\$&");
// variable :: string => RegExp
// ${{ key }}, ${{var}}, ${{ aggqq43g3qg4 }} // create regex to match ${{ key }}
const variable = (key) => const variable = (key) =>
new RegExp("\\${{\\s*?" + key + "\\s*?}}", "g"); new RegExp("\\${{\\s*?" + key + "\\s*?}}", "g");
// templatePath :: string
// default value set in /action.yml
const root = core.getInput('root', { required: false });
const templatePath = __nccwpck_require__.ab + "gcc_matcher.jsontemplate"; const templatePath = __nccwpck_require__.ab + "gcc_matcher.jsontemplate";
const parsed = // matcherPath :: string
fs.readFileSync(__nccwpck_require__.ab + "gcc_matcher.jsontemplate", "ascii")
.replace(variable("BASE"), escapeRegExp(root));
const matcherPath = __nccwpck_require__.ab + "gcc_matcher.json"; const matcherPath = __nccwpck_require__.ab + "gcc_matcher.json";
fs.writeFileSync(__nccwpck_require__.ab + "gcc_matcher.json", parsed); // rootdir :: string
const rootdir = () =>
core.getInput('build-directory', {required: false}) || "/build";
console.log('::add-matcher::' + matcherPath); // parse :: IO() => IO() => Error | null
const parse = (templatePath) => (matcherPath) => {
const r = rootdir();
/* for testing */ console.log(r);
const content = fs.readFileSync(templatePath, 'utf-8');
const parsed = content.replace(variable("BASE"), escapeRegExp(rootdir()));
fs.writeFileSync(matcherPath, parsed);
console.log('::add-matcher::' + matcherPath);
}
// main:
try {
parse(__nccwpck_require__.ab + "gcc_matcher.jsontemplate")(__nccwpck_require__.ab + "gcc_matcher.json");
} catch (err) {
core.setFailed(`Action failed with error ${err}`)
}
// for testing
exports.escapeRegExp = escapeRegExp exports.escapeRegExp = escapeRegExp
exports.variable = variable; exports.variable = variable;
})(); })();

View File

@@ -4,7 +4,7 @@
"owner": "gcc-problem-matcher", "owner": "gcc-problem-matcher",
"pattern": [ "pattern": [
{ {
"regexp": "^${{ BASE }}\/?(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$", "regexp": "^.*?${{ BASE }}\/?(.*?):(\\d+):(\\d*):?\\s+(?:fatal\\s+)?(warning|error):\\s+(.*)$",
"file": 1, "file": 1,
"line": 2, "line": 2,
"column": 3, "column": 3,

View File

@@ -5,7 +5,7 @@ const core = require('@actions/core');
// escapeRegExp :: string => string // escapeRegExp :: string => string
// escape all characters with special meanings in regexp // escape all characters with special meanings in regexp
const escapeRegExp = (s) => const escapeRegExp = (s) =>
s.replace(/[:.*+?^${}()|\/[\]\\]/g, "\\$&"); s.replace(/[/\-^$*+?.()|[\]{}]/g, "\\$&");
// variable :: string => RegExp // variable :: string => RegExp
// create regex to match ${{ key }} // create regex to match ${{ key }}
@@ -18,25 +18,31 @@ const templatePath = path.join(__dirname, "gcc_matcher.jsontemplate");
// matcherPath :: string // matcherPath :: string
const matcherPath = path.join(__dirname, "gcc_matcher.json"); const matcherPath = path.join(__dirname, "gcc_matcher.json");
// parse :: IO => IO => Error | null // rootdir :: string
const rootdir = () =>
core.getInput('build-directory', {required: false});
// parse :: IO() => IO() => Error | null
const parse = (templatePath) => (matcherPath) => { const parse = (templatePath) => (matcherPath) => {
fs.readFile(templatePath, 'utf-8', (err, content) => { const r = rootdir();
if (err) throw err;
const root = core.getInput('root', { required: false }); console.log(r);
const parsed = content.replace(variable("BASE"), escapeRegExp(root)); const content = fs.readFileSync(templatePath, 'utf-8');
fs.writeFile(matcherPath, parsed, (err) => { const parsed = content.replace(variable("BASE"), escapeRegExp(rootdir()));
if (err) throw err;
console.log('::add-matcher::' + matcherPath); fs.writeFileSync(matcherPath, parsed);
});
}); console.log('::add-matcher::' + matcherPath);
} }
// main: // main:
parse(templatePath)(matcherPath); try {
parse(templatePath)(matcherPath);
} catch (err) {
core.setFailed(`Action failed with error ${err}`)
}
// for testing // for testing

20
test/generate_warnings.c Normal file
View File

@@ -0,0 +1,20 @@
#include <limits.h>
int bad_code(float n) {
int small[3];
char index = 10;
int x = small[index];
double promoted = 3.14159 * n * n;
return bad_code(x);
}
int main() {
printf("%s %s", bad_code(1.0f));
}