Fix actions notify bug (#31866)

Try to fix
https://github.com/go-gitea/gitea/issues/31757#issuecomment-2295131062

(cherry picked from commit 4f5c96627b4622d64593db2d436b1f3befa5f3c3)
This commit is contained in:
Lunny Xiao 2024-08-20 00:25:41 +08:00 committed by Gergely Nagy
parent d34d8ec2cf
commit bdf477f6ef
No known key found for this signature in database
3 changed files with 18 additions and 13 deletions

View file

@ -396,7 +396,7 @@ func (n *actionsNotifier) ForkRepository(ctx context.Context, doer *user_model.U
// Add to hook queue for created repo after session commit. // Add to hook queue for created repo after session commit.
if u.IsOrganization() { if u.IsOrganization() {
newNotifyInput(repo, doer, webhook_module.HookEventRepository). newNotifyInput(repo, doer, webhook_module.HookEventRepository).
WithRef(oldRepo.DefaultBranch). WithRef(git.RefNameFromBranch(oldRepo.DefaultBranch).String()).
WithPayload(&api.RepositoryPayload{ WithPayload(&api.RepositoryPayload{
Action: api.HookRepoCreated, Action: api.HookRepoCreated,
Repository: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}), Repository: convert.ToRepo(ctx, repo, access_model.Permission{AccessMode: perm_model.AccessModeOwner}),

View file

@ -69,7 +69,7 @@ type notifyInput struct {
Event webhook_module.HookEventType Event webhook_module.HookEventType
// optional // optional
Ref string Ref git.RefName
Payload api.Payloader Payload api.Payloader
PullRequest *issues_model.PullRequest PullRequest *issues_model.PullRequest
} }
@ -93,7 +93,7 @@ func (input *notifyInput) WithDoer(doer *user_model.User) *notifyInput {
} }
func (input *notifyInput) WithRef(ref string) *notifyInput { func (input *notifyInput) WithRef(ref string) *notifyInput {
input.Ref = ref input.Ref = git.RefName(ref)
return input return input
} }
@ -105,7 +105,7 @@ func (input *notifyInput) WithPayload(payload api.Payloader) *notifyInput {
func (input *notifyInput) WithPullRequest(pr *issues_model.PullRequest) *notifyInput { func (input *notifyInput) WithPullRequest(pr *issues_model.PullRequest) *notifyInput {
input.PullRequest = pr input.PullRequest = pr
if input.Ref == "" { if input.Ref == "" {
input.Ref = pr.GetGitRefName() input.Ref = git.RefName(pr.GetGitRefName())
} }
return input return input
} }
@ -148,20 +148,25 @@ func notify(ctx context.Context, input *notifyInput) error {
defer gitRepo.Close() defer gitRepo.Close()
ref := input.Ref ref := input.Ref
if ref != input.Repo.DefaultBranch && actions_module.IsDefaultBranchWorkflow(input.Event) { if ref.BranchName() != input.Repo.DefaultBranch && actions_module.IsDefaultBranchWorkflow(input.Event) {
if ref != "" { if ref != "" {
log.Warn("Event %q should only trigger workflows on the default branch, but its ref is %q. Will fall back to the default branch", log.Warn("Event %q should only trigger workflows on the default branch, but its ref is %q. Will fall back to the default branch",
input.Event, ref) input.Event, ref)
} }
ref = input.Repo.DefaultBranch ref = git.RefNameFromBranch(input.Repo.DefaultBranch)
} }
if ref == "" { if ref == "" {
log.Warn("Ref of event %q is empty, will fall back to the default branch", input.Event) log.Warn("Ref of event %q is empty, will fall back to the default branch", input.Event)
ref = input.Repo.DefaultBranch ref = git.RefNameFromBranch(input.Repo.DefaultBranch)
}
commitID, err := gitRepo.GetRefCommitID(ref.String())
if err != nil {
return fmt.Errorf("gitRepo.GetRefCommitID: %w", err)
} }
// Get the commit object for the ref // Get the commit object for the ref
commit, err := gitRepo.GetCommit(ref) commit, err := gitRepo.GetCommit(commitID)
if err != nil { if err != nil {
return fmt.Errorf("gitRepo.GetCommit: %w", err) return fmt.Errorf("gitRepo.GetCommit: %w", err)
} }
@ -177,7 +182,7 @@ func notify(ctx context.Context, input *notifyInput) error {
var detectedWorkflows []*actions_module.DetectedWorkflow var detectedWorkflows []*actions_module.DetectedWorkflow
actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig() actionsConfig := input.Repo.MustGetUnit(ctx, unit_model.TypeActions).ActionsConfig()
shouldDetectSchedules := input.Event == webhook_module.HookEventPush && git.RefName(input.Ref).BranchName() == input.Repo.DefaultBranch shouldDetectSchedules := input.Event == webhook_module.HookEventPush && input.Ref.BranchName() == input.Repo.DefaultBranch
workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit, workflows, schedules, err := actions_module.DetectWorkflows(gitRepo, commit,
input.Event, input.Event,
input.Payload, input.Payload,
@ -235,12 +240,12 @@ func notify(ctx context.Context, input *notifyInput) error {
} }
if shouldDetectSchedules { if shouldDetectSchedules {
if err := handleSchedules(ctx, schedules, commit, input, ref); err != nil { if err := handleSchedules(ctx, schedules, commit, input, ref.String()); err != nil {
return err return err
} }
} }
return handleWorkflows(ctx, detectedWorkflows, commit, input, ref) return handleWorkflows(ctx, detectedWorkflows, commit, input, ref.String())
} }
func SkipPullRequestEvent(ctx context.Context, event webhook_module.HookEventType, repoID int64, commitSHA string) bool { func SkipPullRequestEvent(ctx context.Context, event webhook_module.HookEventType, repoID int64, commitSHA string) bool {

View file

@ -375,7 +375,7 @@ func TestCreateDeleteRefEvent(t *testing.T) {
Title: "add workflow", Title: "add workflow",
RepoID: repo.ID, RepoID: repo.ID,
Event: "delete", Event: "delete",
Ref: "main", Ref: "refs/heads/main",
WorkflowID: "createdelete.yml", WorkflowID: "createdelete.yml",
CommitSHA: branch.CommitID, CommitSHA: branch.CommitID,
}) })
@ -390,7 +390,7 @@ func TestCreateDeleteRefEvent(t *testing.T) {
Title: "add workflow", Title: "add workflow",
RepoID: repo.ID, RepoID: repo.ID,
Event: "delete", Event: "delete",
Ref: "main", Ref: "refs/heads/main",
WorkflowID: "createdelete.yml", WorkflowID: "createdelete.yml",
CommitSHA: branch.CommitID, CommitSHA: branch.CommitID,
}) })