Skip to content

Commit d1ed5d4

Browse files
script for checking pull request description
1 parent 52f90be commit d1ed5d4

File tree

6 files changed

+377
-7
lines changed

6 files changed

+377
-7
lines changed

.github/workflows/checkTutorialDescription.yml

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
name: Auto review tutorial description
22

33
on:
4-
pull_request:
5-
branches: [ main ]
4+
pull_request_target:
65

76
workflow_dispatch:
87
jobs:
98
auto_review:
109
runs-on: ubuntu-latest
10+
env:
11+
PR_NUMBER: ${{github.event.number}}
1112

1213
steps:
1314
- name: Checkout playbooks
@@ -19,6 +20,17 @@ jobs:
1920
- name: Install node environment
2021
uses: actions/setup-node@v2-beta
2122

23+
- name: npm install
24+
run: npm install
25+
2226
- name: Check tutorial descriptions
2327
run: node repo/autoReviewPullRequest.js
2428

29+
- name: Request changes
30+
if: ${{ REQUEST_CHANGE_MESSAGE != '' }}
31+
uses: andrewmusgrave/automatic-pull-request-review@0.0.2
32+
with:
33+
repo-token: '${{ secrets.GITHUB_TOKEN }}'
34+
event: REQUEST_CHANGES
35+
body: ${{ REQUEST_CHANGE_MESSAGE }}
36+

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/node_modules/*

autoReviewPullRequest.js

+159-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,165 @@
1-
const child_process = require('child_process');
1+
const child_process = require("child_process");
2+
const https = require("https");
3+
const path = require("path");
4+
const fs = require("fs");
5+
const pegjs = require("pegjs");
6+
const rimraf = require("rimraf");
7+
8+
const options = {
9+
port: 443,
10+
method: 'GET',
11+
headers: {
12+
'Accept': 'application/json',
13+
'User-Agent': 'action'
14+
}
15+
}
16+
17+
const parserDefinition =
18+
`
19+
start
20+
= headline
21+
description
22+
step+
23+
24+
headline
25+
= "=" _ string ___
26+
27+
description
28+
= "====" ___
29+
descriptionlines
30+
"====" ___
31+
32+
descriptionlines
33+
= descriptionline+ { return { "descriptionlines": text()}; }
34+
35+
descriptionline
36+
= !"====" string __
37+
38+
step
39+
= (
40+
"====" ___
41+
stepinner
42+
steptextafterlines
43+
"====" __
44+
)
45+
/ stepinner
46+
47+
stepinner
48+
= steptextlines?
49+
"[step]" ___
50+
stepstitle?
51+
"--" ___
52+
steplines
53+
"--" __
54+
55+
stepstitle
56+
= "==" _ string __
57+
58+
steptextlines
59+
= steptextline* { return { "steptextlines": text()}; }
60+
61+
steptextline
62+
= !"[step]" string __
63+
64+
steptextafterlines
65+
= steptextafterline* { return { "steptextafterlines": text()}; }
66+
67+
steptextafterline
68+
= !"====" string __
69+
70+
steplines
71+
= stepline+ { return { "steplines": text()}; }
72+
73+
stepline
74+
= !"--" string __
75+
76+
string "string"
77+
= [^\r\n]+ { return text(); }
78+
79+
_ "whitespace"
80+
= [ \t]*
81+
82+
__ "linebreak"
83+
= [ \t\n\r]*
84+
85+
___ "linebreak"
86+
= [ \t\n\r]+
87+
`
88+
89+
let requestChangeMessage = "";
290

391
async function autoReviewPullRequest() {
4-
let cp = child_process.spawnSync("ls -R", { shell: true, encoding: 'utf-8' });
5-
console.log(cp);
92+
let env = process.env;
93+
let pr = env.PR_NUMBER;
94+
95+
try {
96+
let files = JSON.parse(await getJson("https://api.github.com/repos/devonfw-tutorials/tutorials/pulls/" + pr + "/files"));
97+
console.log(files);
98+
for(let i = 0; i < files.length; i++) {
99+
if(path.basename(files[i].filename) == "index.asciidoc") {
100+
let contents = JSON.parse(await getJson(files[i].contents_url));
101+
console.log(contents);
102+
if(contents.download_url) {
103+
let playbook = downloadFile(contents.download_url);
104+
if(!playbook || playbook == "") {
105+
throw new Error("Unable to download file from " + contents.download_url);
106+
}
107+
108+
parseFile(playbook);
109+
rimraf.sync(playbook);
110+
}
111+
}
112+
}
113+
} catch(e) {
114+
console.error(e);
115+
process.env["REQUEST_CHANGE_MESSAGE"] = requestChangeMessage;
116+
return -1;
117+
}
118+
119+
process.env["REQUEST_CHANGE_MESSAGE"] = requestChangeMessage;
120+
return 0;
121+
}
122+
123+
async function getJson(url) {
124+
return new Promise((resolve, reject) => {
125+
https.get(url, options, function(resp) {
126+
if(resp.statusCode != 200) {
127+
console.log(resp);
128+
}
129+
130+
let json = "";
131+
resp.on("data", (data) => {
132+
json += data;
133+
});
134+
135+
resp.on('end', () => {
136+
resolve(json);
137+
});
138+
});
139+
});
140+
}
141+
142+
function downloadFile(url) {
143+
let cp = child_process.spawnSync(`curl -o index.asciidoc ${url}`, { shell: true, encoding: 'utf-8' });
144+
if(!fs.existsSync(path.join(__dirname, "index.asciidoc"))) {
145+
console.log(cp);
146+
return "";
147+
}
148+
return path.join(__dirname, "index.asciidoc");
149+
}
150+
151+
function parseFile(file) {
152+
let def = fs.readFileSync(path.join(__dirname,"parser.def"), 'utf8');
153+
let parser = pegjs.generate(def);
154+
let input = fs.readFileSync(file, 'utf8');
155+
let parseResult = parser.parse(input);
6156

7-
cp = child_process.spawnSync("env", { shell: true, encoding: 'utf-8' });
8-
console.log(cp);
157+
let description = parseResult[1][2].descriptionlines;
158+
console.log(description);
159+
160+
requestChangeMessage = (requestChangeMessage == "")
161+
? "The tutorial description in file " + file + " does not meet the desired requirements."
162+
: requestChangeMessage += "\n"
9163
}
10164

11165
autoReviewPullRequest();

package-lock.json

+120
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"name": "tutorials",
3+
"version": "1.0.0",
4+
"description": "",
5+
"dependencies": {
6+
"pegjs": "^0.10.0",
7+
"rimraf": "^3.0.2"
8+
},
9+
"devDependencies": {
10+
"@types/jasmine": "^3.6.2",
11+
"jasmine": "^3.6.2"
12+
},
13+
"author": "",
14+
"license": "ISC"
15+
}

0 commit comments

Comments
 (0)