diff --git a/modules/git/repo_ref.go b/modules/git/repo_ref.go index 8eaa17cb04..b0c602c6a5 100644 --- a/modules/git/repo_ref.go +++ b/modules/git/repo_ref.go @@ -5,6 +5,7 @@ package git import ( "context" + "fmt" "strings" "code.gitea.io/gitea/modules/util" @@ -61,3 +62,19 @@ func parseTags(refs []string) []string { } return results } + +// ExpandRef expands any partial reference to its full form +func (repo *Repository) ExpandRef(ref string) (string, error) { + if strings.HasPrefix(ref, "refs/") { + return ref, nil + } else if strings.HasPrefix(ref, "tags/") || strings.HasPrefix(ref, "heads/") { + return "refs/" + ref, nil + } else if repo.IsTagExist(ref) { + return TagPrefix + ref, nil + } else if repo.IsBranchExist(ref) { + return BranchPrefix + ref, nil + } else if repo.IsCommitExist(ref) { + return ref, nil + } + return "", fmt.Errorf("could not expand reference '%s'", ref) +} diff --git a/services/actions/workflows.go b/services/actions/workflows.go index deff7e7dd6..726b56f464 100644 --- a/services/actions/workflows.go +++ b/services/actions/workflows.go @@ -141,6 +141,11 @@ func (entry *Workflow) Dispatch(ctx context.Context, inputGetter InputValueGette } func GetWorkflowFromCommit(gitRepo *git.Repository, ref, workflowID string) (*Workflow, error) { + ref, err := gitRepo.ExpandRef(ref) + if err != nil { + return nil, err + } + commit, err := gitRepo.GetCommit(ref) if err != nil { return nil, err diff --git a/tests/integration/actions_trigger_test.go b/tests/integration/actions_trigger_test.go index 5309ebef2a..67dd3247b7 100644 --- a/tests/integration/actions_trigger_test.go +++ b/tests/integration/actions_trigger_test.go @@ -426,8 +426,10 @@ func TestWorkflowDispatchEvent(t *testing.T) { assert.NoError(t, err) defer gitRepo.Close() - workflow, err := actions_service.GetWorkflowFromCommit(gitRepo, sha, "dispatch.yml") + workflow, err := actions_service.GetWorkflowFromCommit(gitRepo, "main", "dispatch.yml") assert.NoError(t, err) + assert.Equal(t, "refs/heads/main", workflow.Ref) + assert.Equal(t, sha, workflow.Commit.ID.String()) inputGetter := func(key string) string { return ""