diff --git a/appview/pages/pages.go b/appview/pages/pages.go --- a/appview/pages/pages.go +++ b/appview/pages/pages.go @@ -15,6 +15,7 @@ "path/filepath" "strings" "sync" + "time" "tangled.org/core/api/tangled" "tangled.org/core/appview/commitverify" @@ -1361,10 +1362,21 @@ Name string Command string Collapsed bool + StartTime time.Time } func (p *Pages) LogBlock(w io.Writer, params LogBlockParams) error { return p.executePlain("repo/pipelines/fragments/logBlock", w, params) +} + +type LogBlockEndParams struct { + Id int + StartTime time.Time + EndTime time.Time +} + +func (p *Pages) LogBlockEnd(w io.Writer, params LogBlockEndParams) error { + return p.executePlain("repo/pipelines/fragments/logBlockEnd", w, params) } type LogLineParams struct { diff --git a/appview/pipelines/pipelines.go b/appview/pipelines/pipelines.go --- a/appview/pipelines/pipelines.go +++ b/appview/pipelines/pipelines.go @@ -236,7 +236,7 @@ // start a goroutine to read from spindle go readLogs(spindleConn, evChan) - stepIdx := 0 + stepStartTimes := make(map[int]time.Time) var fragment bytes.Buffer for { select { @@ -268,22 +268,34 @@ switch logLine.Kind { case spindlemodel.LogKindControl: - // control messages create a new step block - stepIdx++ - collapsed := false - if logLine.StepKind == spindlemodel.StepKindSystem { - collapsed = true + switch logLine.StepStatus { + case spindlemodel.StepStatusStart: + stepStartTimes[logLine.StepId] = logLine.Time + collapsed := false + if logLine.StepKind == spindlemodel.StepKindSystem { + collapsed = true + } + err = p.pages.LogBlock(&fragment, pages.LogBlockParams{ + Id: logLine.StepId, + Name: logLine.Content, + Command: logLine.StepCommand, + Collapsed: collapsed, + StartTime: logLine.Time, + }) + case spindlemodel.StepStatusEnd: + startTime := stepStartTimes[logLine.StepId] + endTime := logLine.Time + err = p.pages.LogBlockEnd(&fragment, pages.LogBlockEndParams{ + Id: logLine.StepId, + StartTime: startTime, + EndTime: endTime, + }) } - err = p.pages.LogBlock(&fragment, pages.LogBlockParams{ - Id: stepIdx, - Name: logLine.Content, - Command: logLine.StepCommand, - Collapsed: collapsed, - }) + case spindlemodel.LogKindData: // data messages simply insert new log lines into current step err = p.pages.LogLine(&fragment, pages.LogLineParams{ - Id: stepIdx, + Id: logLine.StepId, Content: logLine.Content, }) } diff --git a/appview/pages/templates/fragments/workflow-timers.html b/appview/pages/templates/fragments/workflow-timers.html new file mode 100644 --- /dev/null +++ b/appview/pages/templates/fragments/workflow-timers.html @@ -0,0 +1,36 @@ +{{ define "fragments/workflow-timers" }} + +{{ end }} diff --git a/appview/pages/templates/repo/pipelines/workflow.html b/appview/pages/templates/repo/pipelines/workflow.html --- a/appview/pages/templates/repo/pipelines/workflow.html +++ b/appview/pages/templates/repo/pipelines/workflow.html @@ -15,6 +15,7 @@ {{ block "logs" . }} {{ end }} +{{ template "fragments/workflow-timers" }} {{ end }} {{ define "sidebar" }} diff --git a/appview/pages/templates/repo/pipelines/fragments/logBlock.html b/appview/pages/templates/repo/pipelines/fragments/logBlock.html --- a/appview/pages/templates/repo/pipelines/fragments/logBlock.html +++ b/appview/pages/templates/repo/pipelines/fragments/logBlock.html @@ -2,14 +2,15 @@