Skip to content

Commit c241c6c

Browse files
committed
refactor
1 parent c21ee7b commit c241c6c

File tree

2 files changed

+154
-157
lines changed

2 files changed

+154
-157
lines changed

routers/web/repo/actions/actions.go

Lines changed: 153 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -63,141 +63,131 @@ func MustEnableActions(ctx *context.Context) {
6363
}
6464

6565
func List(ctx *context.Context) {
66-
renderListAndWorkflowDispatchTemplate(ctx, tplListActions, false)
66+
ctx.Data["Title"] = ctx.Tr("actions.actions")
67+
ctx.Data["PageIsActions"] = true
68+
69+
commit, err := ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
70+
if err != nil {
71+
ctx.ServerError("GetBranchCommit", err)
72+
return
73+
}
74+
prepareWorkflowDispatchTemplate(ctx, commit)
75+
ctx.HTML(http.StatusOK, tplListActions)
6776
}
6877

6978
func WorkflowDispatchInputs(ctx *context.Context) {
70-
renderListAndWorkflowDispatchTemplate(ctx, tplDispatchInputsActions, true)
79+
ref := ctx.FormString("ref")
80+
if ref == "" {
81+
ctx.NotFound("WorkflowDispatchInputs: no ref", nil)
82+
return
83+
}
84+
// get target commit of run from specified ref
85+
refName := git.RefName(ref)
86+
var commit *git.Commit
87+
var err error
88+
if refName.IsTag() {
89+
commit, err = ctx.Repo.GitRepo.GetTagCommit(refName.TagName())
90+
} else if refName.IsBranch() {
91+
commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName.BranchName())
92+
} else {
93+
ctx.ServerError("UnsupportedRefType", nil)
94+
return
95+
}
96+
if err != nil {
97+
ctx.ServerError("GetTagCommit/GetBranchCommit", err)
98+
return
99+
}
100+
workflows := prepareWorkflowDispatchTemplate(ctx, commit)
101+
prepareWorkflowList(ctx, workflows)
102+
ctx.HTML(http.StatusOK, tplDispatchInputsActions)
71103
}
72104

73-
func renderListAndWorkflowDispatchTemplate(ctx *context.Context, tplName templates.TplName, inputsOnly bool) {
74-
ctx.Data["Title"] = ctx.Tr("actions.actions")
75-
ctx.Data["PageIsActions"] = true
105+
func prepareWorkflowDispatchTemplate(ctx *context.Context, commit *git.Commit) (workflows []Workflow) {
76106
workflowID := ctx.FormString("workflow")
77-
actorID := ctx.FormInt64("actor")
78-
status := ctx.FormInt("status")
79107
ctx.Data["CurWorkflow"] = workflowID
80108

81-
var workflows []Workflow
82109
var curWorkflow *model.Workflow
83-
if empty, err := ctx.Repo.GitRepo.IsEmpty(); err != nil {
84-
ctx.ServerError("IsEmpty", err)
110+
111+
entries, err := actions.ListWorkflows(commit)
112+
if err != nil {
113+
ctx.ServerError("ListWorkflows", err)
85114
return
86-
} else if !empty {
87-
var commit *git.Commit
88-
if inputsOnly {
89-
ref := ctx.FormString("ref")
90-
if len(ref) == 0 {
91-
ctx.ServerError("ref", nil)
92-
return
93-
}
94-
// get target commit of run from specified ref
95-
refName := git.RefName(ref)
96-
var err error
97-
if refName.IsTag() {
98-
commit, err = ctx.Repo.GitRepo.GetTagCommit(refName.TagName())
99-
} else if refName.IsBranch() {
100-
commit, err = ctx.Repo.GitRepo.GetBranchCommit(refName.BranchName())
101-
} else {
102-
ctx.ServerError("git_ref_name_error", nil)
103-
return
104-
}
105-
if err != nil {
106-
ctx.ServerError("target_ref_not_exist", err)
107-
return
108-
}
109-
} else {
110-
commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
111-
if err != nil {
112-
ctx.ServerError("GetBranchCommit", err)
113-
return
114-
}
115-
}
116-
entries, err := actions.ListWorkflows(commit)
117-
if err != nil {
118-
ctx.ServerError("ListWorkflows", err)
119-
return
120-
}
115+
}
121116

122-
// Get all runner labels
123-
runners, err := db.Find[actions_model.ActionRunner](ctx, actions_model.FindRunnerOptions{
124-
RepoID: ctx.Repo.Repository.ID,
125-
IsOnline: optional.Some(true),
126-
WithAvailable: true,
127-
})
117+
// Get all runner labels
118+
runners, err := db.Find[actions_model.ActionRunner](ctx, actions_model.FindRunnerOptions{
119+
RepoID: ctx.Repo.Repository.ID,
120+
IsOnline: optional.Some(true),
121+
WithAvailable: true,
122+
})
123+
if err != nil {
124+
ctx.ServerError("FindRunners", err)
125+
return
126+
}
127+
allRunnerLabels := make(container.Set[string])
128+
for _, r := range runners {
129+
allRunnerLabels.AddMultiple(r.AgentLabels...)
130+
}
131+
132+
workflows = make([]Workflow, 0, len(entries))
133+
for _, entry := range entries {
134+
workflow := Workflow{Entry: *entry}
135+
content, err := actions.GetContentFromEntry(entry)
128136
if err != nil {
129-
ctx.ServerError("FindRunners", err)
137+
ctx.ServerError("GetContentFromEntry", err)
130138
return
131139
}
132-
allRunnerLabels := make(container.Set[string])
133-
for _, r := range runners {
134-
allRunnerLabels.AddMultiple(r.AgentLabels...)
140+
wf, err := model.ReadWorkflow(bytes.NewReader(content))
141+
if err != nil {
142+
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.invalid_workflow_helper", err.Error())
143+
workflows = append(workflows, workflow)
144+
continue
135145
}
136-
137-
workflows = make([]Workflow, 0, len(entries))
138-
for _, entry := range entries {
139-
workflow := Workflow{Entry: *entry}
140-
content, err := actions.GetContentFromEntry(entry)
141-
if err != nil {
142-
ctx.ServerError("GetContentFromEntry", err)
143-
return
144-
}
145-
wf, err := model.ReadWorkflow(bytes.NewReader(content))
146-
if err != nil {
147-
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.invalid_workflow_helper", err.Error())
148-
workflows = append(workflows, workflow)
146+
// The workflow must contain at least one job without "needs". Otherwise, a deadlock will occur and no jobs will be able to run.
147+
hasJobWithoutNeeds := false
148+
// Check whether you have matching runner and a job without "needs"
149+
emptyJobsNumber := 0
150+
for _, j := range wf.Jobs {
151+
if j == nil {
152+
emptyJobsNumber++
149153
continue
150154
}
151-
// The workflow must contain at least one job without "needs". Otherwise, a deadlock will occur and no jobs will be able to run.
152-
hasJobWithoutNeeds := false
153-
// Check whether have matching runner and a job without "needs"
154-
emptyJobsNumber := 0
155-
for _, j := range wf.Jobs {
156-
if j == nil {
157-
emptyJobsNumber++
155+
if !hasJobWithoutNeeds && len(j.Needs()) == 0 {
156+
hasJobWithoutNeeds = true
157+
}
158+
runsOnList := j.RunsOn()
159+
for _, ro := range runsOnList {
160+
if strings.Contains(ro, "${{") {
161+
// Skip if it contains expressions.
162+
// The expressions could be very complex and could not be evaluated here,
163+
// so just skip it, it's OK since it's just a tooltip message.
158164
continue
159165
}
160-
if !hasJobWithoutNeeds && len(j.Needs()) == 0 {
161-
hasJobWithoutNeeds = true
162-
}
163-
runsOnList := j.RunsOn()
164-
for _, ro := range runsOnList {
165-
if strings.Contains(ro, "${{") {
166-
// Skip if it contains expressions.
167-
// The expressions could be very complex and could not be evaluated here,
168-
// so just skip it, it's OK since it's just a tooltip message.
169-
continue
170-
}
171-
if !allRunnerLabels.Contains(ro) {
172-
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_matching_online_runner_helper", ro)
173-
break
174-
}
175-
}
176-
if workflow.ErrMsg != "" {
166+
if !allRunnerLabels.Contains(ro) {
167+
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_matching_online_runner_helper", ro)
177168
break
178169
}
179170
}
180-
if !hasJobWithoutNeeds {
181-
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_job_without_needs")
182-
}
183-
if emptyJobsNumber == len(wf.Jobs) {
184-
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_job")
171+
if workflow.ErrMsg != "" {
172+
break
185173
}
186-
workflows = append(workflows, workflow)
174+
}
175+
if !hasJobWithoutNeeds {
176+
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_job_without_needs")
177+
}
178+
if emptyJobsNumber == len(wf.Jobs) {
179+
workflow.ErrMsg = ctx.Locale.TrString("actions.runs.no_job")
180+
}
181+
workflows = append(workflows, workflow)
187182

188-
if workflow.Entry.Name() == workflowID {
189-
curWorkflow = wf
190-
}
183+
if workflow.Entry.Name() == workflowID {
184+
curWorkflow = wf
191185
}
192186
}
187+
193188
ctx.Data["workflows"] = workflows
194189
ctx.Data["RepoLink"] = ctx.Repo.Repository.Link()
195190

196-
page := ctx.FormInt("page")
197-
if page <= 0 {
198-
page = 1
199-
}
200-
201191
actionsConfig := ctx.Repo.Repository.MustGetUnit(ctx, unit.TypeActions).ActionsConfig()
202192
ctx.Data["ActionsConfig"] = actionsConfig
203193

@@ -239,68 +229,75 @@ func renderListAndWorkflowDispatchTemplate(ctx *context.Context, tplName templat
239229
}
240230
}
241231
}
232+
return workflows
233+
}
242234

243-
if !inputsOnly {
244-
// if status or actor query param is not given to frontend href, (href="/<repoLink>/actions")
245-
// they will be 0 by default, which indicates get all status or actors
246-
ctx.Data["CurActor"] = actorID
247-
ctx.Data["CurStatus"] = status
248-
if actorID > 0 || status > int(actions_model.StatusUnknown) {
249-
ctx.Data["IsFiltered"] = true
250-
}
251-
252-
opts := actions_model.FindRunOptions{
253-
ListOptions: db.ListOptions{
254-
Page: page,
255-
PageSize: convert.ToCorrectPageSize(ctx.FormInt("limit")),
256-
},
257-
RepoID: ctx.Repo.Repository.ID,
258-
WorkflowID: workflowID,
259-
TriggerUserID: actorID,
260-
}
235+
func prepareWorkflowList(ctx *context.Context, workflows []Workflow) {
236+
actorID := ctx.FormInt64("actor")
237+
status := ctx.FormInt("status")
238+
workflowID := ctx.FormString("workflow")
239+
page := ctx.FormInt("page")
240+
if page <= 0 {
241+
page = 1
242+
}
261243

262-
// if status is not StatusUnknown, it means user has selected a status filter
263-
if actions_model.Status(status) != actions_model.StatusUnknown {
264-
opts.Status = []actions_model.Status{actions_model.Status(status)}
265-
}
244+
// if status or actor query param is not given to frontend href, (href="/<repoLink>/actions")
245+
// they will be 0 by default, which indicates get all status or actors
246+
ctx.Data["CurActor"] = actorID
247+
ctx.Data["CurStatus"] = status
248+
if actorID > 0 || status > int(actions_model.StatusUnknown) {
249+
ctx.Data["IsFiltered"] = true
250+
}
266251

267-
runs, total, err := db.FindAndCount[actions_model.ActionRun](ctx, opts)
268-
if err != nil {
269-
ctx.ServerError("FindAndCount", err)
270-
return
271-
}
252+
opts := actions_model.FindRunOptions{
253+
ListOptions: db.ListOptions{
254+
Page: page,
255+
PageSize: convert.ToCorrectPageSize(ctx.FormInt("limit")),
256+
},
257+
RepoID: ctx.Repo.Repository.ID,
258+
WorkflowID: workflowID,
259+
TriggerUserID: actorID,
260+
}
272261

273-
for _, run := range runs {
274-
run.Repo = ctx.Repo.Repository
275-
}
262+
// if status is not StatusUnknown, it means user has selected a status filter
263+
if actions_model.Status(status) != actions_model.StatusUnknown {
264+
opts.Status = []actions_model.Status{actions_model.Status(status)}
265+
}
276266

277-
if err := actions_model.RunList(runs).LoadTriggerUser(ctx); err != nil {
278-
ctx.ServerError("LoadTriggerUser", err)
279-
return
280-
}
267+
runs, total, err := db.FindAndCount[actions_model.ActionRun](ctx, opts)
268+
if err != nil {
269+
ctx.ServerError("FindAndCount", err)
270+
return
271+
}
281272

282-
if err := loadIsRefDeleted(ctx, ctx.Repo.Repository.ID, runs); err != nil {
283-
log.Error("LoadIsRefDeleted", err)
284-
}
273+
for _, run := range runs {
274+
run.Repo = ctx.Repo.Repository
275+
}
285276

286-
ctx.Data["Runs"] = runs
277+
if err := actions_model.RunList(runs).LoadTriggerUser(ctx); err != nil {
278+
ctx.ServerError("LoadTriggerUser", err)
279+
return
280+
}
287281

288-
actors, err := actions_model.GetActors(ctx, ctx.Repo.Repository.ID)
289-
if err != nil {
290-
ctx.ServerError("GetActors", err)
291-
return
292-
}
293-
ctx.Data["Actors"] = shared_user.MakeSelfOnTop(ctx.Doer, actors)
282+
if err := loadIsRefDeleted(ctx, ctx.Repo.Repository.ID, runs); err != nil {
283+
log.Error("LoadIsRefDeleted", err)
284+
}
294285

295-
ctx.Data["StatusInfoList"] = actions_model.GetStatusInfoList(ctx)
286+
ctx.Data["Runs"] = runs
296287

297-
pager := context.NewPagination(int(total), opts.PageSize, opts.Page, 5)
298-
pager.AddParamFromRequest(ctx.Req)
299-
ctx.Data["Page"] = pager
300-
ctx.Data["HasWorkflowsOrRuns"] = len(workflows) > 0 || len(runs) > 0
288+
actors, err := actions_model.GetActors(ctx, ctx.Repo.Repository.ID)
289+
if err != nil {
290+
ctx.ServerError("GetActors", err)
291+
return
301292
}
293+
ctx.Data["Actors"] = shared_user.MakeSelfOnTop(ctx.Doer, actors)
294+
295+
ctx.Data["StatusInfoList"] = actions_model.GetStatusInfoList(ctx)
302296

303-
ctx.HTML(http.StatusOK, tplName)
297+
pager := context.NewPagination(int(total), opts.PageSize, opts.Page, 5)
298+
pager.AddParamFromRequest(ctx.Req)
299+
ctx.Data["Page"] = pager
300+
ctx.Data["HasWorkflowsOrRuns"] = len(workflows) > 0 || len(runs) > 0
304301
}
305302

306303
// loadIsRefDeleted loads the IsRefDeleted field for each run in the list.

routers/web/web.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1434,7 +1434,7 @@ func registerRoutes(m *web.Router) {
14341434
m.Group("/workflows/{workflow_name}", func() {
14351435
m.Get("/badge.svg", actions.GetWorkflowBadge)
14361436
})
1437-
}, optSignIn, context.RepoAssignment, reqRepoActionsReader, actions.MustEnableActions)
1437+
}, optSignIn, context.RepoAssignment, repo.MustBeNotEmpty, reqRepoActionsReader, actions.MustEnableActions)
14381438
// end "/{username}/{reponame}/actions"
14391439

14401440
m.Group("/{username}/{reponame}/wiki", func() {

0 commit comments

Comments
 (0)