9
9
"context"
10
10
"fmt"
11
11
"io"
12
+ "io/ioutil"
12
13
"os"
14
+ "regexp"
13
15
"strconv"
14
16
"strings"
15
17
"sync"
@@ -377,9 +379,29 @@ func (tm *tasksManager) watch(task *task, terminal *terminal.Term) {
377
379
go func () {
378
380
defer stdout .Close ()
379
381
380
- fileName := tm .prebuildLogFileName (task )
381
- // TODO(janx): If the file already exists (from a parent prebuild), extract its "time saved", and log that below
382
- // (instead, or in addition to, the incremental prebuild time).
382
+ var (
383
+ fileName = tm .prebuildLogFileName (task )
384
+ parentLog = ""
385
+ parentElapsed time.Duration = 0
386
+ )
387
+ if _ , err := os .Stat (fileName ); err == nil {
388
+ // If the file already exists (from a parent prebuild), extract its "elapsed time" before overwriting the prebuild logs.
389
+ content , err := ioutil .ReadFile (fileName )
390
+ if err == nil {
391
+ parentLog = string (content )
392
+ reg , err := regexp .Compile (`\n🤙 This task ran as a workspace prebuild\n(🎉 Well done on saving (\d+) minutes?\n)?\n` )
393
+ if err == nil {
394
+ res := reg .FindStringSubmatch (parentLog )
395
+ if res != nil {
396
+ parentLog = reg .ReplaceAllString (parentLog , "\n ♻️ Re-running this task as an incremental workspace prebuild\n " )
397
+ parentElapsedInMinutes , err := strconv .Atoi (res [2 ])
398
+ if err == nil {
399
+ parentElapsed = time .Duration (parentElapsedInMinutes ) * time .Minute
400
+ }
401
+ }
402
+ }
403
+ }
404
+ }
383
405
file , err := os .Create (fileName )
384
406
var fileWriter * bufio.Writer
385
407
if err != nil {
@@ -391,12 +413,15 @@ func (tm *tasksManager) watch(task *task, terminal *terminal.Term) {
391
413
fileWriter = bufio .NewWriter (file )
392
414
defer fileWriter .Flush ()
393
415
}
416
+ if parentLog != "" {
417
+ fileWriter .WriteString (parentLog + "\n " )
418
+ }
394
419
395
420
buf := make ([]byte , 4096 )
396
421
for {
397
422
n , err := stdout .Read (buf )
398
423
if err == io .EOF {
399
- elapsed := time .Since (start )
424
+ elapsed := time .Since (start ) + parentElapsed
400
425
duration := ""
401
426
if elapsed >= 1 * time .Minute {
402
427
elapsedInMinutes := strconv .Itoa (int (elapsed .Minutes ()))
0 commit comments