Skip to content

Commit 3015674

Browse files
chmouelzakisk
authored andcommitted
fix(gitea): preserve source_url on retest comment reruns
Populate PR source/target fields for Forgejo/Gitea comment payloads (issue_comment and pull_request_comment) so comment-triggered reruns preserve the same source_url semantics as pull_request events. This updates the runtime Gitea parser and keeps the tkn pac CEL parser in sync, then adds regression coverage for provider parsing, CEL parsing, and a Gitea e2e test that validates source_url on the second rerun PipelineRun created from a targeted /retest. Fixes #2496 Jira: https://issues.redhat.com/browse/SRVKP-10575 Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
1 parent 8b14fcd commit 3015674

File tree

7 files changed

+540
-53
lines changed

7 files changed

+540
-53
lines changed

pkg/cmd/tknpac/cel/parser.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -558,6 +558,30 @@ func (p *BitbucketDataCenterParser) PopulateEvent(event *info.Event, parsedEvent
558558

559559
type GiteaParser struct{}
560560

561+
func populateGiteaPullRequestFields(event *info.Event, pr *forgejostructs.PullRequest) {
562+
if pr == nil {
563+
return
564+
}
565+
566+
event.PullRequestTitle = pr.Title
567+
if pr.Head != nil {
568+
event.SHA = pr.Head.Sha
569+
if pr.HTMLURL != "" && pr.Head.Sha != "" {
570+
event.SHAURL = fmt.Sprintf("%s/commit/%s", pr.HTMLURL, pr.Head.Sha)
571+
}
572+
event.HeadBranch = pr.Head.Ref
573+
if pr.Head.Repository != nil {
574+
event.HeadURL = pr.Head.Repository.HTMLURL
575+
}
576+
}
577+
if pr.Base != nil {
578+
event.BaseBranch = pr.Base.Ref
579+
if pr.Base.Repository != nil {
580+
event.BaseURL = pr.Base.Repository.HTMLURL
581+
}
582+
}
583+
}
584+
561585
func (p *GiteaParser) GetEventTypeHeader() string {
562586
return "X-Gitea-Event-Type"
563587
}
@@ -598,24 +622,8 @@ func (p *GiteaParser) PopulateEvent(event *info.Event, parsedEvent any) error {
598622
event.Sender = gitEvent.Sender.UserName
599623
}
600624
if gitEvent.PullRequest != nil {
601-
if gitEvent.PullRequest.Head != nil {
602-
event.SHA = gitEvent.PullRequest.Head.Sha
603-
if gitEvent.PullRequest.HTMLURL != "" && gitEvent.PullRequest.Head.Sha != "" {
604-
event.SHAURL = fmt.Sprintf("%s/commit/%s", gitEvent.PullRequest.HTMLURL, gitEvent.PullRequest.Head.Sha)
605-
}
606-
event.HeadBranch = gitEvent.PullRequest.Head.Ref
607-
if gitEvent.PullRequest.Head.Repository != nil {
608-
event.HeadURL = gitEvent.PullRequest.Head.Repository.HTMLURL
609-
}
610-
}
611-
if gitEvent.PullRequest.Base != nil {
612-
event.BaseBranch = gitEvent.PullRequest.Base.Ref
613-
if gitEvent.PullRequest.Base.Repository != nil {
614-
event.BaseURL = gitEvent.PullRequest.Base.Repository.HTMLURL
615-
}
616-
}
625+
populateGiteaPullRequestFields(event, gitEvent.PullRequest)
617626
event.PullRequestNumber = int(gitEvent.Index)
618-
event.PullRequestTitle = gitEvent.PullRequest.Title
619627
for _, label := range gitEvent.PullRequest.Labels {
620628
if label != nil {
621629
event.PullRequestLabel = append(event.PullRequestLabel, label.Name)
@@ -674,6 +682,10 @@ func (p *GiteaParser) PopulateEvent(event *info.Event, parsedEvent any) error {
674682
event.TriggerComment = gitEvent.Comment.Body
675683
}
676684
event.PullRequestNumber = extractPullRequestNumber(issue.URL)
685+
populateGiteaPullRequestFields(event, gitEvent.PullRequest)
686+
if event.PullRequestNumber == 0 && gitEvent.PullRequest != nil {
687+
event.PullRequestNumber = int(gitEvent.PullRequest.Index)
688+
}
677689
default:
678690
return fmt.Errorf("unsupported Gitea event type: %T", gitEvent)
679691
}

pkg/cmd/tknpac/cel/parser_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,87 @@ func TestGiteaParserWithMissingFields(t *testing.T) {
391391
assert.Equal(t, event.TriggerComment, "")
392392
},
393393
},
394+
{
395+
name: "issue comment with pull request source repository",
396+
payload: `{
397+
"action": "created",
398+
"issue": {
399+
"url": "https://gitea.com/api/v1/repos/test-org/test-repo/issues/42",
400+
"number": 42,
401+
"pull_request": {"html_url": "https://gitea.com/test-org/test-repo/pulls/42"}
402+
},
403+
"pull_request": {
404+
"number": 42,
405+
"title": "Test PR",
406+
"head": {
407+
"ref": "feature",
408+
"sha": "abc123",
409+
"repo": {"html_url": "https://gitea.com/testuser/test-repo-fork"}
410+
},
411+
"base": {
412+
"ref": "main",
413+
"repo": {"html_url": "https://gitea.com/test-org/test-repo"}
414+
},
415+
"html_url": "https://gitea.com/test-org/test-repo/pulls/42"
416+
},
417+
"comment": {"body": "/retest"},
418+
"repository": {
419+
"name": "test-repo",
420+
"owner": {"login": "test-org"},
421+
"html_url": "https://gitea.com/test-org/test-repo",
422+
"default_branch": "main"
423+
},
424+
"sender": {"login": "testuser"}
425+
}`,
426+
wantErr: false,
427+
checks: func(t *testing.T, event *info.Event) {
428+
assert.Equal(t, event.PullRequestNumber, 42)
429+
assert.Equal(t, event.HeadURL, "https://gitea.com/testuser/test-repo-fork")
430+
assert.Equal(t, event.BaseURL, "https://gitea.com/test-org/test-repo")
431+
assert.Equal(t, event.HeadBranch, "feature")
432+
assert.Equal(t, event.BaseBranch, "main")
433+
assert.Equal(t, event.SHA, "abc123")
434+
assert.Equal(t, event.SHAURL, "https://gitea.com/test-org/test-repo/pulls/42/commit/abc123")
435+
},
436+
},
437+
{
438+
name: "pull request comment with pull request source repository",
439+
payload: `{
440+
"action": "created",
441+
"issue": {
442+
"url": "https://gitea.com/api/v1/repos/test-org/test-repo/issues/43",
443+
"number": 43,
444+
"pull_request": {"html_url": "https://gitea.com/test-org/test-repo/pulls/43"}
445+
},
446+
"pull_request": {
447+
"number": 43,
448+
"title": "Another PR",
449+
"head": {
450+
"ref": "bugfix",
451+
"sha": "def456",
452+
"repo": {"html_url": "https://gitea.com/testuser/test-repo-fork"}
453+
},
454+
"base": {
455+
"ref": "main",
456+
"repo": {"html_url": "https://gitea.com/test-org/test-repo"}
457+
},
458+
"html_url": "https://gitea.com/test-org/test-repo/pulls/43"
459+
},
460+
"comment": {"body": "/test"},
461+
"repository": {
462+
"name": "test-repo",
463+
"owner": {"login": "test-org"}
464+
},
465+
"sender": {"login": "testuser"}
466+
}`,
467+
wantErr: false,
468+
checks: func(t *testing.T, event *info.Event) {
469+
assert.Equal(t, event.PullRequestNumber, 43)
470+
assert.Equal(t, event.HeadURL, "https://gitea.com/testuser/test-repo-fork")
471+
assert.Equal(t, event.BaseURL, "https://gitea.com/test-org/test-repo")
472+
assert.Equal(t, event.SHA, "def456")
473+
},
474+
},
394475
{
395476
name: "pull request with missing head repository",
396477
payload: `{
@@ -429,6 +510,8 @@ func TestGiteaParserWithMissingFields(t *testing.T) {
429510
switch {
430511
case strings.Contains(tt.name, "push"):
431512
headers["X-Gitea-Event-Type"] = "push"
513+
case strings.Contains(tt.name, "pull request comment"):
514+
headers["X-Gitea-Event-Type"] = "pull_request_comment"
432515
case strings.Contains(tt.name, "issue comment"):
433516
headers["X-Gitea-Event-Type"] = "issue_comment"
434517
}

pkg/provider/gitea/gitea.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,12 @@ func (v *Provider) GetCommitInfo(_ context.Context, runevent *info.Event) error
475475
runevent.SHA = pr.Head.Sha
476476
runevent.HeadBranch = pr.Head.Ref
477477
runevent.BaseBranch = pr.Base.Ref
478+
if runevent.HeadURL == "" && pr.Head.Repository != nil {
479+
runevent.HeadURL = pr.Head.Repository.HTMLURL
480+
}
481+
if runevent.BaseURL == "" && pr.Base.Repository != nil {
482+
runevent.BaseURL = pr.Base.Repository.HTMLURL
483+
}
478484
sha = pr.Head.Sha
479485
}
480486
commit, _, err := v.Client().GetSingleCommit(runevent.Organization, runevent.Repository, sha)

pkg/provider/gitea/gitea_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,3 +1112,55 @@ func TestGetCommitInfo(t *testing.T) {
11121112
})
11131113
}
11141114
}
1115+
1116+
func TestGetCommitInfoPRLookupPopulatesURLs(t *testing.T) {
1117+
ctx, _ := rtesting.SetupFakeContext(t)
1118+
client, mux, tearDown := tgitea.Setup(t)
1119+
defer tearDown()
1120+
1121+
event := &info.Event{
1122+
Organization: "owner",
1123+
Repository: "repo",
1124+
PullRequestNumber: 42,
1125+
// SHA intentionally empty to trigger PR lookup path
1126+
}
1127+
1128+
// Mock GetPullRequest endpoint
1129+
mux.HandleFunc("/repos/owner/repo/pulls/42", func(rw http.ResponseWriter, _ *http.Request) {
1130+
fmt.Fprint(rw, `{
1131+
"head": {
1132+
"ref": "feature-branch",
1133+
"sha": "abc123",
1134+
"repo": {
1135+
"html_url": "https://gitea.com/fork-owner/repo"
1136+
}
1137+
},
1138+
"base": {
1139+
"ref": "main",
1140+
"repo": {
1141+
"html_url": "https://gitea.com/owner/repo"
1142+
}
1143+
}
1144+
}`)
1145+
})
1146+
1147+
// Mock GetSingleCommit endpoint
1148+
mux.HandleFunc("/repos/owner/repo/git/commits/abc123", func(rw http.ResponseWriter, _ *http.Request) {
1149+
fmt.Fprint(rw, `{
1150+
"sha": "abc123",
1151+
"html_url": "https://gitea.com/owner/repo/commit/abc123",
1152+
"commit": {
1153+
"message": "feat: test commit"
1154+
}
1155+
}`)
1156+
})
1157+
1158+
provider := &Provider{giteaClient: client}
1159+
err := provider.GetCommitInfo(ctx, event)
1160+
assert.NilError(t, err)
1161+
assert.Equal(t, "abc123", event.SHA)
1162+
assert.Equal(t, "feature-branch", event.HeadBranch)
1163+
assert.Equal(t, "main", event.BaseBranch)
1164+
assert.Equal(t, "https://gitea.com/fork-owner/repo", event.HeadURL, "HeadURL should be populated from PR lookup")
1165+
assert.Equal(t, "https://gitea.com/owner/repo", event.BaseURL, "BaseURL should be populated from PR lookup")
1166+
}

0 commit comments

Comments
 (0)