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 = "" ;
2
90
3
91
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 ) ;
6
156
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"
9
163
}
10
164
11
165
autoReviewPullRequest ( ) ;
0 commit comments