7
7
"html/template"
8
8
"io/ioutil"
9
9
"net/http"
10
+ "os"
10
11
"path/filepath"
12
+ "sort"
11
13
"strings"
12
14
"time"
13
15
@@ -18,6 +20,22 @@ import (
18
20
"github.com/gorilla/mux"
19
21
)
20
22
23
+ // ResultsHistoryStruct is the struct containing references to
24
+ // all validations already performed
25
+ type ResultsHistoryStruct struct {
26
+ Results []Result
27
+ }
28
+
29
+ // Result is the struct containing info about a single
30
+ // validator run
31
+ type Result struct {
32
+ Href string
33
+ Alt string
34
+ Text1 string
35
+ Text2 string
36
+ Badge template.HTML
37
+ }
38
+
21
39
// BidsResultStruct is the struct to parse a full BIDS validation json.
22
40
type BidsResultStruct struct {
23
41
Issues struct {
@@ -111,8 +129,14 @@ func Results(w http.ResponseWriter, r *http.Request) {
111
129
srvcfg := config .Read ()
112
130
resID , ok := vars ["id" ]
113
131
if ! ok {
114
- fmt .Println ("Results ID not specified: Rendering default" )
115
- resID = srvcfg .Label .ResultsFolder
132
+ resHistory := resultsHistory (validator , user , repo )
133
+ if len (resHistory .Results ) < 1 {
134
+ log .ShowWrite ("[Info] Results ID not specified: Rendering the default one" )
135
+ resID = srvcfg .Label .ResultsFolder
136
+ } else {
137
+ log .ShowWrite ("[Info] Results ID not specified: Rendering the last one" )
138
+ resID = resHistory .Results [0 ].Alt
139
+ }
116
140
}
117
141
resdir := filepath .Join (srvcfg .Dir .Result , validator , user , repo , resID )
118
142
@@ -132,7 +156,7 @@ func Results(w http.ResponseWriter, r *http.Request) {
132
156
133
157
if string (content ) == progressmsg {
134
158
// validation in progress
135
- renderInProgress (w , r , badge , strings . ToUpper ( validator ) , user , repo )
159
+ renderInProgress (w , r , badge , validator , user , repo )
136
160
return
137
161
}
138
162
@@ -166,16 +190,18 @@ func renderInProgress(w http.ResponseWriter, r *http.Request, badge []byte, vali
166
190
}
167
191
168
192
// Parse results into html template and serve it
169
- head := fmt .Sprintf ("%s validation for %s/%s" , validator , user , repo )
193
+ head := fmt .Sprintf ("%s validation for %s/%s" , strings . ToUpper ( validator ) , user , repo )
170
194
srvcfg := config .Read ()
195
+ resHistory := resultsHistory (validator , user , repo )
171
196
year , _ , _ := time .Now ().Date ()
172
197
info := struct {
173
198
Badge template.HTML
174
199
Header string
175
200
Content string
176
201
GinURL string
177
202
CurrentYear int
178
- }{template .HTML (badge ), head , string (progressmsg ), srvcfg .GINAddresses .WebURL , year }
203
+ * ResultsHistoryStruct
204
+ }{template .HTML (badge ), head , string (progressmsg ), srvcfg .GINAddresses .WebURL , year , & resHistory }
179
205
180
206
err = tmpl .ExecuteTemplate (w , "layout" , info )
181
207
if err != nil {
@@ -185,6 +211,49 @@ func renderInProgress(w http.ResponseWriter, r *http.Request, badge []byte, vali
185
211
}
186
212
}
187
213
214
+ func myReadDir (dirname string ) ([]os.FileInfo , error ) {
215
+ f , err := os .Open (dirname )
216
+ if err != nil {
217
+ return nil , err
218
+ }
219
+ defer f .Close ()
220
+ list , err := f .Readdir (- 1 )
221
+ if err != nil {
222
+ return nil , err
223
+ }
224
+ sort .Slice (list , func (i , j int ) bool { return list [i ].ModTime ().Unix () > list [j ].ModTime ().Unix () })
225
+ return list , nil
226
+ }
227
+
228
+ func resultsHistory (validator , user , repo string ) ResultsHistoryStruct {
229
+ var ret ResultsHistoryStruct
230
+ srvcfg := config .Read ()
231
+ resdir := filepath .Join (srvcfg .Dir .Result , validator , user , repo )
232
+ fileinfos , err := myReadDir (resdir )
233
+ if err != nil {
234
+ log .ShowWrite ("[Error] cannot retrieve results history '%s/%s' result: %s\n " , user , repo , err .Error ())
235
+ return ret
236
+ }
237
+ for _ , i := range fileinfos {
238
+ pth := filepath .Join ("/results" , strings .Split (resdir , "results/" )[1 ], i .Name ())
239
+ fp := filepath .Join (resdir , i .Name (), srvcfg .Label .ResultsBadge )
240
+ badge , err := ioutil .ReadFile (fp )
241
+ if err != nil {
242
+ badge = []byte ("<svg></svg>" )
243
+ }
244
+ if i .IsDir () && i .Name () != "." {
245
+ var res Result
246
+ res .Href = pth
247
+ res .Alt = i .Name ()
248
+ res .Text1 = i .ModTime ().Format ("2006-01-02" )
249
+ res .Text2 = i .ModTime ().Format ("15:04:05" )
250
+ res .Badge = template .HTML (badge )
251
+ ret .Results = append (ret .Results , res )
252
+ }
253
+ }
254
+ return ret
255
+ }
256
+
188
257
func renderBIDSResults (w http.ResponseWriter , r * http.Request , badge []byte , content []byte , user , repo string ) {
189
258
// Parse results file
190
259
var resBIDS BidsResultStruct
@@ -214,13 +283,15 @@ func renderBIDSResults(w http.ResponseWriter, r *http.Request, badge []byte, con
214
283
head := fmt .Sprintf ("BIDS validation for %s/%s" , user , repo )
215
284
year , _ , _ := time .Now ().Date ()
216
285
srvcfg := config .Read ()
286
+ resHistory := resultsHistory ("bids" , user , repo )
217
287
info := struct {
218
288
Badge template.HTML
219
289
Header string
220
290
* BidsResultStruct
221
291
GinURL string
222
292
CurrentYear int
223
- }{template .HTML (badge ), head , & resBIDS , srvcfg .GINAddresses .WebURL , year }
293
+ * ResultsHistoryStruct
294
+ }{template .HTML (badge ), head , & resBIDS , srvcfg .GINAddresses .WebURL , year , & resHistory }
224
295
225
296
err = tmpl .ExecuteTemplate (w , "layout" , info )
226
297
if err != nil {
@@ -249,6 +320,7 @@ func renderNIXResults(w http.ResponseWriter, r *http.Request, badge []byte, cont
249
320
250
321
// Parse results into html template and serve it
251
322
head := fmt .Sprintf ("NIX validation for %s/%s" , user , repo )
323
+ resHistory := resultsHistory ("nix" , user , repo )
252
324
year , _ , _ := time .Now ().Date ()
253
325
srvcfg := config .Read ()
254
326
info := struct {
@@ -257,7 +329,8 @@ func renderNIXResults(w http.ResponseWriter, r *http.Request, badge []byte, cont
257
329
Content string
258
330
GinURL string
259
331
CurrentYear int
260
- }{template .HTML (badge ), head , string (content ), srvcfg .GINAddresses .WebURL , year }
332
+ * ResultsHistoryStruct
333
+ }{template .HTML (badge ), head , string (content ), srvcfg .GINAddresses .WebURL , year , & resHistory }
261
334
262
335
err = tmpl .ExecuteTemplate (w , "layout" , info )
263
336
if err != nil {
@@ -286,6 +359,7 @@ func renderODMLResults(w http.ResponseWriter, r *http.Request, badge []byte, con
286
359
287
360
// Parse results into html template and serve it
288
361
head := fmt .Sprintf ("odML validation for %s/%s" , user , repo )
362
+ resHistory := resultsHistory ("odml" , user , repo )
289
363
srvcfg := config .Read ()
290
364
year , _ , _ := time .Now ().Date ()
291
365
info := struct {
@@ -294,7 +368,8 @@ func renderODMLResults(w http.ResponseWriter, r *http.Request, badge []byte, con
294
368
Content string
295
369
GinURL string
296
370
CurrentYear int
297
- }{template .HTML (badge ), head , string (content ), srvcfg .GINAddresses .WebURL , year }
371
+ * ResultsHistoryStruct
372
+ }{template .HTML (badge ), head , string (content ), srvcfg .GINAddresses .WebURL , year , & resHistory }
298
373
299
374
err = tmpl .ExecuteTemplate (w , "layout" , info )
300
375
if err != nil {
0 commit comments