mirror of https://github.com/go-gitea/gitea
Refactor RepoActionView.vue, add `::group::` support (#32713)
1. make it able to "force reload", then the previous pending request won't block the new request 2. make it support `::group::` 3. add some TS types (but there are still many variables untyped, this PR is large enough, the remaining types could be added in the future)pull/32728/head^2
parent
ff14ada965
commit
f7f68e4cc0
@ -0,0 +1,108 @@ |
|||||||
|
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package devtest |
||||||
|
|
||||||
|
import ( |
||||||
|
"fmt" |
||||||
|
mathRand "math/rand/v2" |
||||||
|
"net/http" |
||||||
|
"strings" |
||||||
|
"time" |
||||||
|
|
||||||
|
actions_model "code.gitea.io/gitea/models/actions" |
||||||
|
"code.gitea.io/gitea/modules/util" |
||||||
|
"code.gitea.io/gitea/modules/web" |
||||||
|
"code.gitea.io/gitea/routers/web/repo/actions" |
||||||
|
"code.gitea.io/gitea/services/context" |
||||||
|
) |
||||||
|
|
||||||
|
func generateMockStepsLog(logCur actions.LogCursor) (stepsLog []*actions.ViewStepLog) { |
||||||
|
mockedLogs := []string{ |
||||||
|
"::group::test group for: step={step}, cursor={cursor}", |
||||||
|
"in group msg for: step={step}, cursor={cursor}", |
||||||
|
"in group msg for: step={step}, cursor={cursor}", |
||||||
|
"in group msg for: step={step}, cursor={cursor}", |
||||||
|
"::endgroup::", |
||||||
|
"message for: step={step}, cursor={cursor}", |
||||||
|
"message for: step={step}, cursor={cursor}", |
||||||
|
"message for: step={step}, cursor={cursor}", |
||||||
|
"message for: step={step}, cursor={cursor}", |
||||||
|
"message for: step={step}, cursor={cursor}", |
||||||
|
} |
||||||
|
cur := logCur.Cursor // usually the cursor is the "file offset", but here we abuse it as "line number" to make the mock easier, intentionally
|
||||||
|
for i := 0; i < util.Iif(logCur.Step == 0, 3, 1); i++ { |
||||||
|
logStr := mockedLogs[int(cur)%len(mockedLogs)] |
||||||
|
cur++ |
||||||
|
logStr = strings.ReplaceAll(logStr, "{step}", fmt.Sprintf("%d", logCur.Step)) |
||||||
|
logStr = strings.ReplaceAll(logStr, "{cursor}", fmt.Sprintf("%d", cur)) |
||||||
|
stepsLog = append(stepsLog, &actions.ViewStepLog{ |
||||||
|
Step: logCur.Step, |
||||||
|
Cursor: cur, |
||||||
|
Started: time.Now().Unix() - 1, |
||||||
|
Lines: []*actions.ViewStepLogLine{ |
||||||
|
{Index: cur, Message: logStr, Timestamp: float64(time.Now().UnixNano()) / float64(time.Second)}, |
||||||
|
}, |
||||||
|
}) |
||||||
|
} |
||||||
|
return stepsLog |
||||||
|
} |
||||||
|
|
||||||
|
func MockActionsRunsJobs(ctx *context.Context) { |
||||||
|
req := web.GetForm(ctx).(*actions.ViewRequest) |
||||||
|
|
||||||
|
resp := &actions.ViewResponse{} |
||||||
|
resp.Artifacts = append(resp.Artifacts, &actions.ArtifactsViewItem{ |
||||||
|
Name: "artifact-a", |
||||||
|
Size: 100 * 1024, |
||||||
|
Status: "expired", |
||||||
|
}) |
||||||
|
resp.Artifacts = append(resp.Artifacts, &actions.ArtifactsViewItem{ |
||||||
|
Name: "artifact-b", |
||||||
|
Size: 1024 * 1024, |
||||||
|
Status: "completed", |
||||||
|
}) |
||||||
|
resp.State.CurrentJob.Steps = append(resp.State.CurrentJob.Steps, &actions.ViewJobStep{ |
||||||
|
Summary: "step 0 (mock slow)", |
||||||
|
Duration: time.Hour.String(), |
||||||
|
Status: actions_model.StatusRunning.String(), |
||||||
|
}) |
||||||
|
resp.State.CurrentJob.Steps = append(resp.State.CurrentJob.Steps, &actions.ViewJobStep{ |
||||||
|
Summary: "step 1 (mock fast)", |
||||||
|
Duration: time.Hour.String(), |
||||||
|
Status: actions_model.StatusRunning.String(), |
||||||
|
}) |
||||||
|
resp.State.CurrentJob.Steps = append(resp.State.CurrentJob.Steps, &actions.ViewJobStep{ |
||||||
|
Summary: "step 2 (mock error)", |
||||||
|
Duration: time.Hour.String(), |
||||||
|
Status: actions_model.StatusRunning.String(), |
||||||
|
}) |
||||||
|
if len(req.LogCursors) == 0 { |
||||||
|
ctx.JSON(http.StatusOK, resp) |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
resp.Logs.StepsLog = []*actions.ViewStepLog{} |
||||||
|
doSlowResponse := false |
||||||
|
doErrorResponse := false |
||||||
|
for _, logCur := range req.LogCursors { |
||||||
|
if !logCur.Expanded { |
||||||
|
continue |
||||||
|
} |
||||||
|
doSlowResponse = doSlowResponse || logCur.Step == 0 |
||||||
|
doErrorResponse = doErrorResponse || logCur.Step == 2 |
||||||
|
resp.Logs.StepsLog = append(resp.Logs.StepsLog, generateMockStepsLog(logCur)...) |
||||||
|
} |
||||||
|
if doErrorResponse { |
||||||
|
if mathRand.Float64() > 0.5 { |
||||||
|
ctx.Error(http.StatusInternalServerError, "devtest mock error response") |
||||||
|
return |
||||||
|
} |
||||||
|
} |
||||||
|
if doSlowResponse { |
||||||
|
time.Sleep(time.Duration(3000) * time.Millisecond) |
||||||
|
} else { |
||||||
|
time.Sleep(time.Duration(100) * time.Millisecond) // actually, frontend reload every 1 second, any smaller delay is fine
|
||||||
|
} |
||||||
|
ctx.JSON(http.StatusOK, resp) |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
{{template "base/head" .}} |
||||||
|
<div class="page-content"> |
||||||
|
<div id="repo-action-view" |
||||||
|
data-run-index="1" |
||||||
|
data-job-index="2" |
||||||
|
data-actions-url="{{AppSubUrl}}/devtest/actions-mock" |
||||||
|
data-locale-approve="approve" |
||||||
|
data-locale-cancel="cancel" |
||||||
|
data-locale-rerun="re-run" |
||||||
|
data-locale-rerun-all="re-run all" |
||||||
|
data-locale-runs-scheduled="scheduled" |
||||||
|
data-locale-runs-commit="commit" |
||||||
|
data-locale-runs-pushed-by="pushed by" |
||||||
|
data-locale-status-unknown="unknown" |
||||||
|
data-locale-status-waiting="waiting" |
||||||
|
data-locale-status-running="running" |
||||||
|
data-locale-status-success="success" |
||||||
|
data-locale-status-failure="failure" |
||||||
|
data-locale-status-cancelled="cancelled" |
||||||
|
data-locale-status-skipped="skipped" |
||||||
|
data-locale-status-blocked="blocked" |
||||||
|
data-locale-artifacts-title="artifacts" |
||||||
|
data-locale-confirm-delete-artifact="confirm delete artifact" |
||||||
|
data-locale-show-timestamps="show timestamps" |
||||||
|
data-locale-show-log-seconds="show log seconds" |
||||||
|
data-locale-show-full-screen="show full screen" |
||||||
|
data-locale-download-logs="download logs" |
||||||
|
></div> |
||||||
|
</div> |
||||||
|
{{template "base/footer" .}} |
Loading…
Reference in new issue