@@ -63,141 +63,131 @@ func MustEnableActions(ctx *context.Context) {
6363}
6464
6565func 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
6978func 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.
0 commit comments