aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNorthRealm <155140859+NorthRealm@users.noreply.github.com>2025-05-28 20:30:00 +0800
committerGitHub <noreply@github.com>2025-05-28 20:30:00 +0800
commit4cb0c641ce856224bb53245b6946d9da0f2c38dd (patch)
tree6b32f916780cfd1b2598243a95b82bfa7d174f04
parentb0936f4f4120169fab31f21610e9fcd915e36fb4 (diff)
downloadgitea-4cb0c641ce856224bb53245b6946d9da0f2c38dd.tar.gz
gitea-4cb0c641ce856224bb53245b6946d9da0f2c38dd.zip
Add "View workflow file" to Actions list page (#34538)
This PR adds "View workflow file" to Actions list page, and replaces the redundant link. Related #34530 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
-rw-r--r--modules/actions/workflows.go20
-rw-r--r--options/locale/locale_en-US.ini1
-rw-r--r--routers/web/repo/actions/actions.go2
-rw-r--r--routers/web/repo/actions/view.go30
-rw-r--r--routers/web/web.go1
-rw-r--r--services/actions/workflow.go16
-rw-r--r--templates/repo/actions/runs_list.tmpl5
7 files changed, 47 insertions, 28 deletions
diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go
index a538b6e290..31f859953e 100644
--- a/modules/actions/workflows.go
+++ b/modules/actions/workflows.go
@@ -43,21 +43,23 @@ func IsWorkflow(path string) bool {
return strings.HasPrefix(path, ".gitea/workflows") || strings.HasPrefix(path, ".github/workflows")
}
-func ListWorkflows(commit *git.Commit) (git.Entries, error) {
- tree, err := commit.SubTree(".gitea/workflows")
+func ListWorkflows(commit *git.Commit) (string, git.Entries, error) {
+ rpath := ".gitea/workflows"
+ tree, err := commit.SubTree(rpath)
if _, ok := err.(git.ErrNotExist); ok {
- tree, err = commit.SubTree(".github/workflows")
+ rpath = ".github/workflows"
+ tree, err = commit.SubTree(rpath)
}
if _, ok := err.(git.ErrNotExist); ok {
- return nil, nil
+ return "", nil, nil
}
if err != nil {
- return nil, err
+ return "", nil, err
}
entries, err := tree.ListEntriesRecursiveFast()
if err != nil {
- return nil, err
+ return "", nil, err
}
ret := make(git.Entries, 0, len(entries))
@@ -66,7 +68,7 @@ func ListWorkflows(commit *git.Commit) (git.Entries, error) {
ret = append(ret, entry)
}
}
- return ret, nil
+ return rpath, ret, nil
}
func GetContentFromEntry(entry *git.TreeEntry) ([]byte, error) {
@@ -102,7 +104,7 @@ func DetectWorkflows(
payload api.Payloader,
detectSchedule bool,
) ([]*DetectedWorkflow, []*DetectedWorkflow, error) {
- entries, err := ListWorkflows(commit)
+ _, entries, err := ListWorkflows(commit)
if err != nil {
return nil, nil, err
}
@@ -147,7 +149,7 @@ func DetectWorkflows(
}
func DetectScheduledWorkflows(gitRepo *git.Repository, commit *git.Commit) ([]*DetectedWorkflow, error) {
- entries, err := ListWorkflows(commit)
+ _, entries, err := ListWorkflows(commit)
if err != nil {
return nil, err
}
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 4384ebc3d7..f7c2e5049b 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -3815,6 +3815,7 @@ runs.expire_log_message = Logs have been purged because they were too old.
runs.delete = Delete workflow run
runs.delete.description = Are you sure you want to permanently delete this workflow run? This action cannot be undone.
runs.not_done = This workflow run is not done.
+runs.view_workflow_file = View workflow file
workflow.disable = Disable Workflow
workflow.disable_success = Workflow '%s' disabled successfully.
diff --git a/routers/web/repo/actions/actions.go b/routers/web/repo/actions/actions.go
index f466a184c3..b01d57084a 100644
--- a/routers/web/repo/actions/actions.go
+++ b/routers/web/repo/actions/actions.go
@@ -126,7 +126,7 @@ func prepareWorkflowDispatchTemplate(ctx *context.Context, commit *git.Commit) (
var curWorkflow *model.Workflow
- entries, err := actions.ListWorkflows(commit)
+ _, entries, err := actions.ListWorkflows(commit)
if err != nil {
ctx.ServerError("ListWorkflows", err)
return nil
diff --git a/routers/web/repo/actions/view.go b/routers/web/repo/actions/view.go
index 13b19862ff..1c991937b1 100644
--- a/routers/web/repo/actions/view.go
+++ b/routers/web/repo/actions/view.go
@@ -64,6 +64,36 @@ func View(ctx *context_module.Context) {
ctx.HTML(http.StatusOK, tplViewActions)
}
+func ViewWorkflowFile(ctx *context_module.Context) {
+ runIndex := getRunIndex(ctx)
+ run, err := actions_model.GetRunByIndex(ctx, ctx.Repo.Repository.ID, runIndex)
+ if err != nil {
+ ctx.NotFoundOrServerError("GetRunByIndex", func(err error) bool {
+ return errors.Is(err, util.ErrNotExist)
+ }, err)
+ return
+ }
+ commit, err := ctx.Repo.GitRepo.GetCommit(run.CommitSHA)
+ if err != nil {
+ ctx.NotFoundOrServerError("GetCommit", func(err error) bool {
+ return errors.Is(err, util.ErrNotExist)
+ }, err)
+ return
+ }
+ rpath, entries, err := actions.ListWorkflows(commit)
+ if err != nil {
+ ctx.ServerError("ListWorkflows", err)
+ return
+ }
+ for _, entry := range entries {
+ if entry.Name() == run.WorkflowID {
+ ctx.Redirect(fmt.Sprintf("%s/src/commit/%s/%s/%s", ctx.Repo.RepoLink, url.PathEscape(run.CommitSHA), util.PathEscapeSegments(rpath), util.PathEscapeSegments(run.WorkflowID)))
+ return
+ }
+ }
+ ctx.NotFound(nil)
+}
+
type LogCursor struct {
Step int `json:"step"`
Cursor int64 `json:"cursor"`
diff --git a/routers/web/web.go b/routers/web/web.go
index 866401252d..5eba29c601 100644
--- a/routers/web/web.go
+++ b/routers/web/web.go
@@ -1445,6 +1445,7 @@ func registerWebRoutes(m *web.Router) {
m.Post("/rerun", reqRepoActionsWriter, actions.Rerun)
m.Get("/logs", actions.Logs)
})
+ m.Get("/workflow", actions.ViewWorkflowFile)
m.Post("/cancel", reqRepoActionsWriter, actions.Cancel)
m.Post("/approve", reqRepoActionsWriter, actions.Approve)
m.Post("/delete", reqRepoActionsWriter, actions.Delete)
diff --git a/services/actions/workflow.go b/services/actions/workflow.go
index 15cebf6847..fbd590d65e 100644
--- a/services/actions/workflow.go
+++ b/services/actions/workflow.go
@@ -31,16 +31,6 @@ import (
"github.com/nektos/act/pkg/model"
)
-func getActionWorkflowPath(commit *git.Commit) string {
- paths := []string{".gitea/workflows", ".github/workflows"}
- for _, treePath := range paths {
- if _, err := commit.SubTree(treePath); err == nil {
- return treePath
- }
- }
- return ""
-}
-
func getActionWorkflowEntry(ctx *context.APIContext, commit *git.Commit, folder string, entry *git.TreeEntry) *api.ActionWorkflow {
cfgUnit := ctx.Repo.Repository.MustGetUnit(ctx, unit.TypeActions)
cfg := cfgUnit.ActionsConfig()
@@ -109,14 +99,12 @@ func ListActionWorkflows(ctx *context.APIContext) ([]*api.ActionWorkflow, error)
return nil, err
}
- entries, err := actions.ListWorkflows(defaultBranchCommit)
+ folder, entries, err := actions.ListWorkflows(defaultBranchCommit)
if err != nil {
ctx.APIError(http.StatusNotFound, err.Error())
return nil, err
}
- folder := getActionWorkflowPath(defaultBranchCommit)
-
workflows := make([]*api.ActionWorkflow, len(entries))
for i, entry := range entries {
workflows[i] = getActionWorkflowEntry(ctx, defaultBranchCommit, folder, entry)
@@ -185,7 +173,7 @@ func DispatchActionWorkflow(ctx reqctx.RequestContext, doer *user_model.User, re
}
// get workflow entry from runTargetCommit
- entries, err := actions.ListWorkflows(runTargetCommit)
+ _, entries, err := actions.ListWorkflows(runTargetCommit)
if err != nil {
return err
}
diff --git a/templates/repo/actions/runs_list.tmpl b/templates/repo/actions/runs_list.tmpl
index a37731cffb..fdb631f0ee 100644
--- a/templates/repo/actions/runs_list.tmpl
+++ b/templates/repo/actions/runs_list.tmpl
@@ -39,10 +39,7 @@
<div class="ui dropdown jump tw-p-2">
{{svg "octicon-kebab-horizontal"}}
<div class="menu flex-items-menu">
- <!-- TODO: This redundant link should be replaced by something else in future,
- because have not figured out how to add "View Workflow" or anything similar to GitHub.
- Related: https://github.com/go-gitea/gitea/pull/34530 -->
- <a class="item" href="{{$run.Link}}">{{svg "octicon-play"}}{{ctx.Locale.Tr "view"}}</a>
+ <a class="item" href="{{$run.Link}}/workflow">{{svg "octicon-play"}}{{ctx.Locale.Tr "actions.runs.view_workflow_file"}}</a>
{{if and $.AllowDeleteWorkflowRuns $run.Status.IsDone}}
<a class="item link-action"
data-url="{{$run.Link}}/delete"