From 1cfdc6e45d11a92c36172331ceda47e584a47960 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 27 Dec 2024 09:39:04 +0200 Subject: [PATCH 01/30] Do some work to refactor the pipeline model --- server/api/pipeline.go | 11 +++--- server/cron/cron.go | 3 +- server/forge/bitbucket/convert.go | 38 +++++++++++++------ server/forge/bitbucket/convert_test.go | 2 - server/forge/bitbucketdatacenter/convert.go | 14 +++++-- .../forge/bitbucketdatacenter/convert_test.go | 3 -- server/forge/forgejo/helper.go | 2 - server/forge/forgejo/parse_test.go | 1 - server/forge/gitea/gitea.go | 21 +++++----- server/forge/gitea/helper.go | 26 +++++++++---- server/forge/gitea/parse_test.go | 1 - server/forge/gitlab/convert.go | 8 ++-- server/model/commit.go | 12 +++++- server/model/pipeline.go | 11 ++---- server/model/pull_request.go | 2 + server/pipeline/stepbuilder/metadata.go | 4 +- web/src/lib/api/types/pipeline.ts | 3 -- 17 files changed, 95 insertions(+), 67 deletions(-) diff --git a/server/api/pipeline.go b/server/api/pipeline.go index ce3d1396f91..e1a08e777f2 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -86,18 +86,19 @@ func CreatePipeline(c *gin.Context) { func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, user *model.User, opts *model.PipelineOptions) *model.Pipeline { return &model.Pipeline{ Event: event, - Commit: commit.SHA, + Commit: commit, Branch: opts.Branch, - Timestamp: time.Now().UTC().Unix(), - Avatar: user.Avatar, Message: "MANUAL PIPELINE @ " + opts.Branch, Ref: opts.Branch, AdditionalVariables: opts.Variables, - Author: user.Login, - Email: user.Email, + Author: model.Author{ + Author: user.Login, + Avatar: user.Avatar, + Email: user.Email, + }, ForgeURL: commit.ForgeURL, } diff --git a/server/cron/cron.go b/server/cron/cron.go index 3460fbaa432..009509a4738 100644 --- a/server/cron/cron.go +++ b/server/cron/cron.go @@ -138,11 +138,10 @@ func CreatePipeline(ctx context.Context, store store.Store, cron *model.Cron) (* return repo, &model.Pipeline{ Event: model.EventCron, - Commit: commit.SHA, + Commit: commit, Ref: "refs/heads/" + cron.Branch, Branch: cron.Branch, Message: cron.Name, - Timestamp: cron.NextExec, Sender: cron.Name, ForgeURL: commit.ForgeURL, }, nil diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go index 61591976a17..9eee1012016 100644 --- a/server/forge/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -170,7 +170,10 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { pipeline := &model.Pipeline{ Event: event, - Commit: from.PullRequest.Source.Commit.Hash, + Commit: &model.Commit{ + SHA: from.PullRequest.Source.Commit.Hash, + ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, + }, Ref: fmt.Sprintf("refs/pull-requests/%d/from", from.PullRequest.ID), Refspec: fmt.Sprintf("%s:%s", from.PullRequest.Source.Branch.Name, @@ -179,15 +182,18 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { ForgeURL: from.PullRequest.Links.HTML.Href, Branch: from.PullRequest.Source.Branch.Name, Message: from.PullRequest.Title, - Avatar: from.Actor.Links.Avatar.Href, - Author: from.Actor.Login, - Sender: from.Actor.Login, + Author: convertAuthor(from.Actor), + PullRequest: &model.PullRequest{ + FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, + }, Timestamp: from.PullRequest.Updated.UTC().Unix(), - FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, } if from.PullRequest.State == stateClosed { - pipeline.Commit = from.PullRequest.MergeCommit.Hash + pipeline.Commit = &model.Commit{ + SHA: from.PullRequest.MergeCommit.Hash, + ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, + } pipeline.Ref = fmt.Sprintf("refs/heads/%s", from.PullRequest.Dest.Branch.Name) pipeline.Branch = from.PullRequest.Dest.Branch.Name } @@ -199,14 +205,15 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { // hook to the Woodpecker pipeline struct holding commit information. func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pipeline { pipeline := &model.Pipeline{ - Commit: change.New.Target.Hash, + Commit: &model.Commit{ + SHA: change.New.Target.Hash, + ForgeURL: change.New.Target.Links.HTML.Href, + Message: change.New.Target.Message, + }, ForgeURL: change.New.Target.Links.HTML.Href, Branch: change.New.Name, Message: change.New.Target.Message, - Avatar: hook.Actor.Links.Avatar.Href, - Author: hook.Actor.Login, - Sender: hook.Actor.Login, - Timestamp: change.New.Target.Date.UTC().Unix(), + Author: convertAuthor(hook.Actor), } switch change.New.Type { case "tag", "annotated_tag", "bookmark": @@ -217,7 +224,7 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi pipeline.Ref = fmt.Sprintf("refs/heads/%s", change.New.Name) } if len(change.New.Target.Author.Raw) != 0 { - pipeline.Email = extractEmail(change.New.Target.Author.Raw) + pipeline.Author.Email = extractEmail(change.New.Target.Author.Raw) } return pipeline } @@ -233,3 +240,10 @@ func extractEmail(gitAuthor string) (author string) { } return } + +func convertAuthor(a internal.Account) model.Author { + return model.Author{ + Author: a.Login, + Avatar: a.Links.Avatar.Href, + } +} diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go index 8299a51227d..f2e257cd367 100644 --- a/server/forge/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -145,7 +145,6 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Ref).Equal("refs/pull-requests/1/from") g.Assert(pipeline.Refspec).Equal("change:main") g.Assert(pipeline.Message).Equal(hook.PullRequest.Title) - g.Assert(pipeline.Timestamp).Equal(hook.PullRequest.Updated.Unix()) }) g.It("should convert push hook to pipeline", func() { @@ -171,7 +170,6 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.ForgeURL).Equal(change.New.Target.Links.HTML.Href) g.Assert(pipeline.Ref).Equal("refs/heads/main") g.Assert(pipeline.Message).Equal(change.New.Target.Message) - g.Assert(pipeline.Timestamp).Equal(change.New.Target.Date.Unix()) }) g.It("should convert tag hook to pipeline", func() { diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index d6adbac3ab0..7011da80393 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -90,14 +90,17 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod } pipeline := &model.Pipeline{ - Commit: change.ToHash, + Commit: &model.Commit{ + SHA: change.ToHash, + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), + }, Branch: change.Ref.DisplayID, Message: "", Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), Author: authorLabel(ev.Actor.Name), Email: ev.Actor.Email, - Timestamp: time.Time(ev.Date).UTC().Unix(), Ref: ev.Changes[0].RefId, + // TODO this is wrong on tags ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), } @@ -112,15 +115,18 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pipeline { pipeline := &model.Pipeline{ - Commit: ev.PullRequest.Source.Latest, + Commit: &model.Commit{ + SHA: ev.PullRequest.Source.Latest, + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), + } Branch: ev.PullRequest.Source.DisplayID, Title: ev.PullRequest.Title, Message: "", Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), Author: authorLabel(ev.Actor.Name), Email: ev.Actor.Email, - Timestamp: time.Time(ev.Date).UTC().Unix(), Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), + // TODO should link to the Pr ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), Refspec: fmt.Sprintf("%s:%s", ev.PullRequest.Source.DisplayID, ev.PullRequest.Target.DisplayID), FromFork: ev.PullRequest.Source.Repository.ID != ev.PullRequest.Target.Repository.ID, diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index 1ce35fd278c..a9ca13bccc0 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -156,7 +156,6 @@ func TestHelper(t *testing.T) { Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", Author: "John Doe", Email: "john.doe@mail.com", - Timestamp: now.UTC().Unix(), Ref: "refs/head/branch", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Event: model.EventPush, @@ -214,7 +213,6 @@ func TestHelper(t *testing.T) { g.Assert(to.Avatar).Equal("https://base.url/users/john.doe_mail.com/avatar.png") g.Assert(to.Author).Equal("John Doe") g.Assert(to.Email).Equal("john.doe@mail.com") - g.Assert(to.Timestamp).Equal(now.UTC().Unix()) g.Assert(to.Ref).Equal("refs/pull-requests/123/from") g.Assert(to.ForgeURL).Equal("https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef") g.Assert(to.Event).Equal(model.EventPull) @@ -266,7 +264,6 @@ func TestHelper(t *testing.T) { g.Assert(to.Avatar).Equal("https://base.url/users/john.doe_mail.com/avatar.png") g.Assert(to.Author).Equal("John Doe") g.Assert(to.Email).Equal("john.doe@mail.com") - g.Assert(to.Timestamp).Equal(now.UTC().Unix()) g.Assert(to.Ref).Equal("refs/pull-requests/123/from") g.Assert(to.ForgeURL).Equal("https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef") g.Assert(to.Event).Equal(model.EventPullClosed) diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index a36bbc005a6..2728ebb558c 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -98,7 +98,6 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { Avatar: avatar, Author: hook.Sender.UserName, Email: hook.Sender.Email, - Timestamp: time.Now().UTC().Unix(), Sender: hook.Sender.UserName, ChangedFiles: getChangedFilesFromPushHook(hook), } @@ -138,7 +137,6 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { Author: hook.Sender.UserName, Sender: hook.Sender.UserName, Email: hook.Sender.Email, - Timestamp: time.Now().UTC().Unix(), } } diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 4a24eb74d6e..8400bc63dc2 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -384,7 +384,6 @@ func TestForgejoParser(t *testing.T) { assert.ErrorIs(t, err, tc.err) } else if assert.NoError(t, err) { assert.EqualValues(t, tc.repo, r) - p.Timestamp = 0 assert.EqualValues(t, tc.pipe, p) } }) diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index 7b3788d0652..ed767c6a114 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -503,13 +503,16 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model. return nil, nil, err } - if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit == "" { + if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { tagName := strings.Split(pipeline.Ref, "/")[2] sha, err := c.getTagCommitSHA(ctx, repo, tagName) if err != nil { return nil, nil, err } - pipeline.Commit = sha + pipeline.Commit = &model.Commit{ + SHA: sha.SHA, + ForgeURL: sha.URL, + } } if pipeline != nil && (pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed) && len(pipeline.ChangedFiles) == 0 { @@ -657,34 +660,34 @@ func (c *Gitea) getChangedFilesForPR(ctx context.Context, repo *model.Repo, inde }, -1) } -func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (string, error) { +func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*gitea.CommitMeta, error) { _store, ok := store.TryFromContext(ctx) if !ok { log.Error().Msg("could not get store from context") - return "", nil + return nil, nil } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) if err != nil { - return "", err + return nil, err } user, err := _store.GetUser(repo.UserID) if err != nil { - return "", err + return nil, err } client, err := c.newClientToken(ctx, user.AccessToken) if err != nil { - return "", err + return nil, err } tag, _, err := client.GetTag(repo.Owner, repo.Name, tagName) if err != nil { - return "", err + return nil, err } - return tag.Commit.SHA, nil + return tag.Commit, nil } func (c *Gitea) perPage(ctx context.Context) int { diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 67cd6cb205b..0241fe3491b 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -91,7 +91,11 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { return &model.Pipeline{ Event: model.EventPush, - Commit: hook.After, + Commit: &model.Commit{ + SHA: hook.After, + ForgeURL: hook.HeadCommit.URL, + Message: hook.HeadCommit.Message, + }, Ref: hook.Ref, ForgeURL: link, Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), @@ -99,7 +103,6 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { Avatar: avatar, Author: hook.Sender.UserName, Email: hook.Sender.Email, - Timestamp: time.Now().UTC().Unix(), Sender: hook.Sender.UserName, ChangedFiles: getChangedFilesFromPushHook(hook), } @@ -131,7 +134,11 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { return &model.Pipeline{ Event: model.EventTag, - Commit: hook.Sha, + Commit: &model.Commit{ + SHA: hook.Sha, + ForgeURL: hook.HeadCommit.URL, + Message: hook.HeadCommit.Message, + }, Ref: fmt.Sprintf("refs/tags/%s", ref), ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), Message: fmt.Sprintf("created tag %s", ref), @@ -139,7 +146,6 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { Author: hook.Sender.UserName, Sender: hook.Sender.UserName, Email: hook.Sender.Email, - Timestamp: time.Now().UTC().Unix(), } } @@ -157,7 +163,9 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { pipeline := &model.Pipeline{ Event: event, - Commit: hook.PullRequest.Head.Sha, + Commit: &model.Commit{ + SHA: hook.PullRequest.Head.Sha, + }, ForgeURL: hook.PullRequest.HTMLURL, Ref: fmt.Sprintf("refs/pull/%d/head", hook.Number), Branch: hook.PullRequest.Base.Ref, @@ -171,8 +179,12 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, ), - PullRequestLabels: convertLabels(hook.PullRequest.Labels), - FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, + PullRequest: &model.PullRequest{ + Index: model.ForgeRemoteID(hook.Number), + PullRequestLabels: convertLabels(hook.PullRequest.Labels), + FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, + Title: "", + }, } return pipeline diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index 947cb84bb08..8cc8a642916 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -385,7 +385,6 @@ func TestGiteaParser(t *testing.T) { assert.ErrorIs(t, err, tc.err) } else if assert.NoError(t, err) { assert.EqualValues(t, tc.repo, r) - p.Timestamp = 0 assert.EqualValues(t, tc.pipe, p) } }) diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index c8ccdc119ca..8dbe76f45d5 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -137,8 +137,10 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * pipeline.Title = obj.Title pipeline.ForgeURL = obj.URL - pipeline.PullRequestLabels = convertLabels(hook.Labels) - pipeline.FromFork = target.PathWithNamespace != source.PathWithNamespace + pipeline.PullRequest = &model.PullRequest{ + PullRequestLabels: convertLabels(hook.Labels), + FromFork: target.PathWithNamespace != source.PathWithNamespace, + } return obj.IID, repo, pipeline, nil } @@ -181,7 +183,6 @@ func convertPushHook(hook *gitlab.PushEvent) (*model.Repo, *model.Pipeline, erro pipeline.Author = cm.Author.Name pipeline.Email = cm.Author.Email pipeline.Message = cm.Message - pipeline.Timestamp = cm.Timestamp.Unix() if len(pipeline.Email) != 0 { pipeline.Avatar = getUserAvatar(pipeline.Email) } @@ -232,7 +233,6 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) pipeline.Author = cm.Author.Name pipeline.Email = cm.Author.Email pipeline.Message = cm.Message - pipeline.Timestamp = cm.Timestamp.Unix() if len(pipeline.Email) != 0 { pipeline.Avatar = getUserAvatar(pipeline.Email) } diff --git a/server/model/commit.go b/server/model/commit.go index 2de74fc44ba..8f313c3b69b 100644 --- a/server/model/commit.go +++ b/server/model/commit.go @@ -1,6 +1,14 @@ package model type Commit struct { - SHA string - ForgeURL string + SHA string `json:"sha"` + Message string `json:"message"` + ForgeURL string `json:"forge_url"` + Author Author `json:"author"` +} + +type Author struct { + Author string `json:"author"` + Email string `json:"email"` + Avatar string `json:"avatar"` } diff --git a/server/model/pipeline.go b/server/model/pipeline.go index b74e8184ac6..fccb7ff0c7a 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -23,7 +23,6 @@ type Pipeline struct { ID int64 `json:"id" xorm:"pk autoincr 'id'"` RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'repo_id'"` Number int64 `json:"number" xorm:"UNIQUE(s) 'number'"` - Author string `json:"author" xorm:"INDEX 'author'"` Parent int64 `json:"parent" xorm:"parent"` Event WebhookEvent `json:"event" xorm:"event"` Status StatusValue `json:"status" xorm:"INDEX 'status'"` @@ -34,25 +33,21 @@ type Pipeline struct { Finished int64 `json:"finished" xorm:"finished"` DeployTo string `json:"deploy_to" xorm:"deploy"` DeployTask string `json:"deploy_task" xorm:"deploy_task"` - Commit string `json:"commit" xorm:"commit"` + Commit *Commit `json:"commit" xorm:"json 'commit'"` Branch string `json:"branch" xorm:"branch"` Ref string `json:"ref" xorm:"ref"` Refspec string `json:"refspec" xorm:"refspec"` Title string `json:"title" xorm:"title"` Message string `json:"message" xorm:"TEXT 'message'"` - Timestamp int64 `json:"timestamp" xorm:"'timestamp'"` - Sender string `json:"sender" xorm:"sender"` // uses reported user for webhooks and name of cron for cron pipelines - Avatar string `json:"author_avatar" xorm:"varchar(500) avatar"` - Email string `json:"author_email" xorm:"varchar(500) email"` + Author Author `json:"author" xorm:"json 'author"` ForgeURL string `json:"forge_url" xorm:"forge_url"` Reviewer string `json:"reviewed_by" xorm:"reviewer"` Reviewed int64 `json:"reviewed" xorm:"reviewed"` Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"` ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"` - PullRequestLabels []string `json:"pr_labels,omitempty" xorm:"json 'pr_labels'"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` - FromFork bool `json:"from_fork,omitempty" xorm:"from_fork"` + PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` } // @name Pipeline // TableName return database table name for xorm. diff --git a/server/model/pull_request.go b/server/model/pull_request.go index e5ed5971751..8f73d9ded04 100644 --- a/server/model/pull_request.go +++ b/server/model/pull_request.go @@ -17,4 +17,6 @@ package model type PullRequest struct { Index ForgeRemoteID `json:"index"` Title string `json:"title"` + PullRequestLabels []string `json:"pr_labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` } // @name PullRequest diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index 116f661c168..6de04d9db1d 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -123,7 +123,7 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b DeployTo: pipeline.DeployTo, DeployTask: pipeline.DeployTask, Commit: metadata.Commit{ - Sha: pipeline.Commit, + Sha: pipeline.Commit.SHA, Ref: pipeline.Ref, Refspec: pipeline.Refspec, Branch: pipeline.Branch, @@ -134,7 +134,7 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b Avatar: pipeline.Avatar, }, ChangedFiles: pipeline.ChangedFiles, - PullRequestLabels: pipeline.PullRequestLabels, + PullRequestLabels: pipeline.PullRequest.PullRequestLabels, IsPrerelease: pipeline.IsPrerelease, }, Cron: cron, diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index 2ca9ccf0d84..586a18da87c 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -48,9 +48,6 @@ export interface Pipeline { // The commit message. message: string; - // When the commit was created. - timestamp: number; - // The alias for the commit. ref: string; From d34e37ec8c332e1b56ed69ea291c039ac7046053 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 27 Dec 2024 11:47:03 +0200 Subject: [PATCH 02/30] continue - finish pipeline model --- pipeline/frontend/metadata/types.go | 1 + server/api/pipeline.go | 14 +- server/cron/cron.go | 13 +- server/cron/cron_test.go | 10 +- server/forge/bitbucket/convert.go | 33 ++- server/forge/bitbucket/convert_test.go | 2 - server/forge/bitbucket/parse_test.go | 1 - .../bitbucketdatacenter.go | 16 +- server/forge/bitbucketdatacenter/convert.go | 66 +++--- .../forge/bitbucketdatacenter/convert_test.go | 36 +--- server/forge/forgejo/forgejo.go | 6 +- server/forge/forgejo/helper.go | 76 ++++--- server/forge/forgejo/helper_test.go | 10 +- server/forge/forgejo/parse_test.go | 13 -- server/forge/gitea/gitea.go | 8 +- server/forge/gitea/helper.go | 79 ++++--- server/forge/gitea/helper_test.go | 13 +- server/forge/gitea/parse_test.go | 194 +++++++++--------- server/forge/github/convert_test.go | 20 +- server/forge/github/parse.go | 83 ++++---- server/forge/github/parse_test.go | 4 +- server/forge/gitlab/convert.go | 86 ++++---- server/forge/gitlab/gitlab.go | 6 +- server/forge/gitlab/gitlab_test.go | 5 +- server/model/commit.go | 6 +- server/model/pipeline.go | 36 ++-- server/model/pull_request.go | 8 +- server/pipeline/create.go | 8 +- server/pipeline/gated.go | 2 +- server/pipeline/stepbuilder/metadata.go | 20 +- .../pipeline/stepbuilder/stepBuilder_test.go | 17 +- server/store/datastore/pipeline_test.go | 20 +- 32 files changed, 453 insertions(+), 459 deletions(-) diff --git a/pipeline/frontend/metadata/types.go b/pipeline/frontend/metadata/types.go index 5fa56e85e08..b287d3a8c2e 100644 --- a/pipeline/frontend/metadata/types.go +++ b/pipeline/frontend/metadata/types.go @@ -56,6 +56,7 @@ type ( Commit Commit `json:"commit,omitempty"` Parent int64 `json:"parent,omitempty"` Cron string `json:"cron,omitempty"` + Release string `json:"release,omitempty"` } // Commit defines runtime metadata for a commit. diff --git a/server/api/pipeline.go b/server/api/pipeline.go index e1a08e777f2..7a98cf6eeac 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -85,11 +85,9 @@ func CreatePipeline(c *gin.Context) { func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, user *model.User, opts *model.PipelineOptions) *model.Pipeline { return &model.Pipeline{ - Event: event, - Commit: commit, - Branch: opts.Branch, - - Message: "MANUAL PIPELINE @ " + opts.Branch, + Event: event, + Commit: commit, + Branch: opts.Branch, Ref: opts.Branch, AdditionalVariables: opts.Variables, @@ -97,7 +95,7 @@ func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, user *mod Author: model.Author{ Author: user.Login, Avatar: user.Avatar, - Email: user.Email, + Email: user.Email, }, ForgeURL: commit.ForgeURL, @@ -623,7 +621,7 @@ func PostPipeline(c *gin.Context) { // make Deploy overridable // make Deploy task overridable - pl.DeployTask = c.DefaultQuery("deploy_task", pl.DeployTask) + pl.Deployment.Task = c.DefaultQuery("deploy_task", pl.Deployment.Task) // make Event overridable to deploy // TODO: refactor to use own proper API for deploy @@ -639,7 +637,7 @@ func PostPipeline(c *gin.Context) { return } - pl.DeployTo = c.DefaultQuery("deploy_to", pl.DeployTo) + pl.Deployment.Target = c.DefaultQuery("deploy_to", pl.Deployment.Target) } // Read query string parameters into pipelineParams, exclude reserved params diff --git a/server/cron/cron.go b/server/cron/cron.go index 009509a4738..e7880bae9dd 100644 --- a/server/cron/cron.go +++ b/server/cron/cron.go @@ -137,12 +137,11 @@ func CreatePipeline(ctx context.Context, store store.Store, cron *model.Cron) (* } return repo, &model.Pipeline{ - Event: model.EventCron, - Commit: commit, - Ref: "refs/heads/" + cron.Branch, - Branch: cron.Branch, - Message: cron.Name, - Sender: cron.Name, - ForgeURL: commit.ForgeURL, + Event: model.EventCron, + Commit: commit, + Ref: "refs/heads/" + cron.Branch, + Branch: cron.Branch, + Cron: cron.Name, + ForgeURL: commit.ForgeURL, }, nil } diff --git a/server/cron/cron_test.go b/server/cron/cron_test.go index ca39839f136..a19da033707 100644 --- a/server/cron/cron_test.go +++ b/server/cron/cron_test.go @@ -62,13 +62,15 @@ func TestCreatePipeline(t *testing.T) { }) assert.NoError(t, err) assert.EqualValues(t, &model.Pipeline{ - Branch: "default", - Commit: "sha1", + Branch: "default", + Commit: &model.Commit{ + ForgeURL: "https://example.com/sha1", + SHA: "sha1", + }, Event: "cron", ForgeURL: "https://example.com/sha1", - Message: "test", Ref: "refs/heads/default", - Sender: "test", + Cron: "test", }, pipeline) } diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go index 9eee1012016..3b1546af731 100644 --- a/server/forge/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -169,29 +169,29 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { } pipeline := &model.Pipeline{ - Event: event, + Event: event, Commit: &model.Commit{ - SHA: from.PullRequest.Source.Commit.Hash, + SHA: from.PullRequest.Source.Commit.Hash, ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, }, - Ref: fmt.Sprintf("refs/pull-requests/%d/from", from.PullRequest.ID), + Ref: fmt.Sprintf("refs/pull-requests/%d/from", from.PullRequest.ID), Refspec: fmt.Sprintf("%s:%s", from.PullRequest.Source.Branch.Name, from.PullRequest.Dest.Branch.Name, ), - ForgeURL: from.PullRequest.Links.HTML.Href, - Branch: from.PullRequest.Source.Branch.Name, - Message: from.PullRequest.Title, - Author: convertAuthor(from.Actor), + ForgeURL: from.PullRequest.Links.HTML.Href, + Branch: from.PullRequest.Source.Branch.Name, + + Author: convertAuthor(from.Actor), PullRequest: &model.PullRequest{ - FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, + FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, + Title: from.PullRequest.Title, }, - Timestamp: from.PullRequest.Updated.UTC().Unix(), } if from.PullRequest.State == stateClosed { pipeline.Commit = &model.Commit{ - SHA: from.PullRequest.MergeCommit.Hash, + SHA: from.PullRequest.MergeCommit.Hash, ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, } pipeline.Ref = fmt.Sprintf("refs/heads/%s", from.PullRequest.Dest.Branch.Name) @@ -205,15 +205,14 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { // hook to the Woodpecker pipeline struct holding commit information. func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pipeline { pipeline := &model.Pipeline{ - Commit: &model.Commit{ - SHA: change.New.Target.Hash, + Commit: &model.Commit{ + SHA: change.New.Target.Hash, ForgeURL: change.New.Target.Links.HTML.Href, - Message: change.New.Target.Message, + Message: change.New.Target.Message, }, - ForgeURL: change.New.Target.Links.HTML.Href, - Branch: change.New.Name, - Message: change.New.Target.Message, - Author: convertAuthor(hook.Actor), + ForgeURL: change.New.Target.Links.HTML.Href, + Branch: change.New.Name, + Author: convertAuthor(hook.Actor), } switch change.New.Type { case "tag", "annotated_tag", "bookmark": diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go index f2e257cd367..b1fd2c94b6c 100644 --- a/server/forge/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -144,7 +144,6 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.ForgeURL).Equal(hook.PullRequest.Links.HTML.Href) g.Assert(pipeline.Ref).Equal("refs/pull-requests/1/from") g.Assert(pipeline.Refspec).Equal("change:main") - g.Assert(pipeline.Message).Equal(hook.PullRequest.Title) }) g.It("should convert push hook to pipeline", func() { @@ -169,7 +168,6 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Branch).Equal(change.New.Name) g.Assert(pipeline.ForgeURL).Equal(change.New.Target.Links.HTML.Href) g.Assert(pipeline.Ref).Equal("refs/heads/main") - g.Assert(pipeline.Message).Equal(change.New.Target.Message) }) g.It("should convert tag hook to pipeline", func() { diff --git a/server/forge/bitbucket/parse_test.go b/server/forge/bitbucket/parse_test.go index e96a0ae2b0a..c44a2cbc443 100644 --- a/server/forge/bitbucket/parse_test.go +++ b/server/forge/bitbucket/parse_test.go @@ -128,7 +128,6 @@ func Test_parser(t *testing.T) { g.Assert(r.SCMKind).Equal(model.RepoGit) g.Assert(r.Clone).Equal("https://bitbucket.org/martinherren1984/publictestrepo") g.Assert(b.Commit).Equal("c14c1bb05dfb1fdcdf06b31485fff61b0ea44277") - g.Assert(b.Message).Equal("a\n") }) }) diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go index ccb7beb4d68..191eca78511 100644 --- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go +++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go @@ -257,7 +257,7 @@ func (c *client) File(ctx context.Context, u *model.User, r *model.Repo, p *mode return nil, fmt.Errorf("unable to create bitbucket client: %w", err) } - b, resp, err := bc.Projects.GetTextFileContent(ctx, r.Owner, r.Name, f, p.Commit) + b, resp, err := bc.Projects.GetTextFileContent(ctx, r.Owner, r.Name, f, p.Commit.SHA) if err != nil { if resp.StatusCode == http.StatusNotFound { // requested directory might not exist @@ -276,7 +276,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model return nil, fmt.Errorf("unable to create bitbucket client: %w", err) } - opts := &bb.FilesListOptions{At: p.Commit} + opts := &bb.FilesListOptions{At: p.Commit.SHA} all := make([]*forge_types.FileMeta, 0) for { list, resp, err := bc.Projects.ListFiles(ctx, r.Owner, r.Name, path, opts) @@ -316,7 +316,7 @@ func (c *client) Status(ctx context.Context, u *model.User, repo *model.Repo, pi Key: common.GetPipelineStatusContext(repo, pipeline, workflow), Description: common.GetPipelineStatusDescription(pipeline.Status), } - _, err = bc.Projects.CreateBuildStatus(ctx, repo.Owner, repo.Name, pipeline.Commit, status) + _, err = bc.Projects.CreateBuildStatus(ctx, repo.Owner, repo.Name, pipeline.Commit.SHA, status) return err } @@ -546,15 +546,19 @@ func (c *client) updatePipelineFromCommit(ctx context.Context, u *model.User, r return nil, fmt.Errorf("unable to create bitbucket client: %w", err) } - commit, _, err := bc.Projects.GetCommit(ctx, r.Owner, r.Name, p.Commit) + commit, _, err := bc.Projects.GetCommit(ctx, r.Owner, r.Name, p.Commit.SHA) if err != nil { return nil, fmt.Errorf("unable to read commit: %w", err) } - p.Message = commit.Message + p.Commit.Message = commit.Message + p.Commit.Author = model.Author{ + Author: commit.Author.Name, + Email: commit.Author.Email, + } opts := &bb.ListOptions{} for { - changes, resp, err := bc.Projects.ListChanges(ctx, r.Owner, r.Name, p.Commit, opts) + changes, resp, err := bc.Projects.ListChanges(ctx, r.Owner, r.Name, p.Commit.SHA, opts) if err != nil { return nil, fmt.Errorf("unable to list commit changes: %w", err) } diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index 7011da80393..7db7a2a9d08 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -18,7 +18,6 @@ import ( "fmt" "net/url" "strings" - "time" bb "github.com/neticdk/go-bitbucket/bitbucket" "golang.org/x/oauth2" @@ -90,18 +89,20 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod } pipeline := &model.Pipeline{ - Commit: &model.Commit{ - SHA: change.ToHash, + Commit: &model.Commit{ + // message is set later + SHA: change.ToHash, ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), }, - Branch: change.Ref.DisplayID, - Message: "", - Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), - Author: authorLabel(ev.Actor.Name), - Email: ev.Actor.Email, - Ref: ev.Changes[0].RefId, + Branch: change.Ref.DisplayID, + Author: model.Author{ + Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), + Author: ev.Actor.Name, + Email: ev.Actor.Email, + }, + Ref: ev.Changes[0].RefId, // TODO this is wrong on tags - ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), } if strings.HasPrefix(ev.Changes[0].RefId, "refs/tags/") { @@ -115,21 +116,25 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pipeline { pipeline := &model.Pipeline{ - Commit: &model.Commit{ - SHA: ev.PullRequest.Source.Latest, - ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), - } - Branch: ev.PullRequest.Source.DisplayID, - Title: ev.PullRequest.Title, - Message: "", - Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), - Author: authorLabel(ev.Actor.Name), - Email: ev.Actor.Email, - Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), + Commit: &model.Commit{ + // message is set later + SHA: ev.PullRequest.Source.Latest, + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), + }, + Branch: ev.PullRequest.Source.DisplayID, + Author: model.Author{ + Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), + Author: ev.Actor.Name, + Email: ev.Actor.Email, + }, + Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), + PullRequest: &model.PullRequest{ + FromFork: ev.PullRequest.Source.Repository.ID != ev.PullRequest.Target.Repository.ID, + Title: ev.PullRequest.Title, + }, // TODO should link to the Pr - ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), - Refspec: fmt.Sprintf("%s:%s", ev.PullRequest.Source.DisplayID, ev.PullRequest.Target.DisplayID), - FromFork: ev.PullRequest.Source.Repository.ID != ev.PullRequest.Target.Repository.ID, + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), + Refspec: fmt.Sprintf("%s:%s", ev.PullRequest.Source.DisplayID, ev.PullRequest.Target.DisplayID), } if ev.EventKey == bb.EventKeyPullRequestMerged || ev.EventKey == bb.EventKeyPullRequestDeclined || ev.EventKey == bb.EventKeyPullRequestDeleted { @@ -141,19 +146,6 @@ func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pip return pipeline } -func authorLabel(name string) string { - var result string - - const maxNameLength = 40 - - if len(name) > maxNameLength { - result = name[0:37] + "..." - } else { - result = name - } - return result -} - func convertUser(user *bb.User, baseURL string) *model.User { return &model.User{ ForgeRemoteID: model.ForgeRemoteID(fmt.Sprintf("%d", user.ID)), diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index a9ca13bccc0..96d7092d49e 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -150,15 +150,14 @@ func TestHelper(t *testing.T) { }, }, to: &model.Pipeline{ - Commit: "1234567890abcdef", - Branch: "branch", - Message: "", - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - Ref: "refs/head/branch", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPush, + Commit: "1234567890abcdef", + Branch: "branch", + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Email: "john.doe@mail.com", + Ref: "refs/head/branch", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPush, }, }, } @@ -270,25 +269,6 @@ func TestHelper(t *testing.T) { g.Assert(to.Refspec).Equal("branch:main") }) - g.It("should truncate author", func() { - tests := []struct { - from string - to string - }{ - { - from: "Some Short Author", - to: "Some Short Author", - }, - { - from: "Some Very Long Author That May Include Multiple Names Here", - to: "Some Very Long Author That May Includ...", - }, - } - for _, tt := range tests { - g.Assert(authorLabel(tt.from)).Equal(tt.to) - } - }) - g.It("should convert user", func() { from := &bb.User{ Slug: "slug", diff --git a/server/forge/forgejo/forgejo.go b/server/forge/forgejo/forgejo.go index 1e5a0d41870..9a635df5aef 100644 --- a/server/forge/forgejo/forgejo.go +++ b/server/forge/forgejo/forgejo.go @@ -272,7 +272,7 @@ func (c *Forgejo) File(ctx context.Context, u *model.User, r *model.Repo, b *mod return nil, err } - cfg, resp, err := client.GetFile(r.Owner, r.Name, b.Commit, f) + cfg, resp, err := client.GetFile(r.Owner, r.Name, b.Commit.SHA, f) if err != nil && resp != nil && resp.StatusCode == http.StatusNotFound { return nil, errors.Join(err, &forge_types.ErrConfigNotFound{Configs: []string{f}}) } @@ -288,7 +288,7 @@ func (c *Forgejo) Dir(ctx context.Context, u *model.User, r *model.Repo, b *mode } // List files in repository. Path from root - tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit, true) + tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit.SHA, true) if err != nil { return nil, err } @@ -496,7 +496,7 @@ func (c *Forgejo) Hook(ctx context.Context, r *http.Request) (*model.Repo, *mode return nil, nil, err } - if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit == "" { + if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { tagName := strings.Split(pipeline.Ref, "/")[2] sha, err := c.getTagCommitSHA(ctx, repo, tagName) if err != nil { diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index 2728ebb558c..d626839c063 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -20,7 +20,6 @@ import ( "io" "net/url" "strings" - "time" "codeberg.org/mvdkleijn/forgejo-sdk/forgejo" @@ -89,16 +88,20 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { } return &model.Pipeline{ - Event: model.EventPush, - Commit: hook.After, - Ref: hook.Ref, - ForgeURL: link, - Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), - Message: message, - Avatar: avatar, - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Sender: hook.Sender.UserName, + Event: model.EventPush, + Commit: &model.Commit{ + SHA: hook.After, + Message: message, + ForgeURL: link, + }, + Ref: hook.Ref, + ForgeURL: link, + Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, ChangedFiles: getChangedFilesFromPushHook(hook), } } @@ -128,15 +131,17 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { ref := strings.TrimPrefix(hook.Ref, "refs/tags/") return &model.Pipeline{ - Event: model.EventTag, - Commit: hook.Sha, - Ref: fmt.Sprintf("refs/tags/%s", ref), - ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), - Message: fmt.Sprintf("created tag %s", ref), - Avatar: avatar, - Author: hook.Sender.UserName, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, + Event: model.EventTag, + Commit: &model.Commit{ + SHA: hook.Sha, + }, + Ref: fmt.Sprintf("refs/tags/%s", ref), + ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, } } @@ -154,22 +159,24 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { pipeline := &model.Pipeline{ Event: event, - Commit: hook.PullRequest.Head.Sha, + Commit: &model.Commit{SHA: hook.PullRequest.Head.Sha}, ForgeURL: hook.PullRequest.HTMLURL, Ref: fmt.Sprintf("refs/pull/%d/head", hook.Number), Branch: hook.PullRequest.Base.Ref, - Message: hook.PullRequest.Title, - Author: hook.PullRequest.Poster.UserName, - Avatar: avatar, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, - Title: hook.PullRequest.Title, + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, ), - PullRequestLabels: convertLabels(hook.PullRequest.Labels), - FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, + PullRequest: &model.PullRequest{ + PullRequestLabels: convertLabels(hook.PullRequest.Labels), + FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, + Title: hook.PullRequest.Title, + }, } return pipeline @@ -186,11 +193,12 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), ForgeURL: hook.Release.HTMLURL, Branch: hook.Release.Target, - Message: fmt.Sprintf("created release %s", hook.Release.Title), - Avatar: avatar, - Author: hook.Sender.UserName, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, + ReleaseTitle: hook.Release.Title, + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/forgejo/helper_test.go b/server/forge/forgejo/helper_test.go index 8f0ae23161e..1a104854b93 100644 --- a/server/forge/forgejo/helper_test.go +++ b/server/forge/forgejo/helper_test.go @@ -100,7 +100,7 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.Ref).Equal(hook.Ref) g.Assert(pipeline.ForgeURL).Equal(hook.Commits[0].URL) g.Assert(pipeline.Branch).Equal("main") - g.Assert(pipeline.Message).Equal(hook.Commits[0].Message) + g.Assert(pipeline.Commit.Message).Equal(hook.Commits[0].Message) g.Assert(pipeline.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") g.Assert(pipeline.Author).Equal(hook.Sender.UserName) g.Assert(utils.EqualSliceValues(pipeline.ChangedFiles, []string{"CHANGELOG.md", "app/controller/application.rb"})).IsTrue() @@ -125,7 +125,7 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.Ref).Equal("refs/tags/v1.0.0") g.Assert(pipeline.Branch).Equal("") g.Assert(pipeline.ForgeURL).Equal("http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0") - g.Assert(pipeline.Message).Equal("created tag v1.0.0") + g.Assert(pipeline.Commit.Message).Equal("created tag v1.0.0") }) g.It("Should return a Pipeline struct from a pull_request hook", func() { @@ -138,9 +138,9 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.ForgeURL).Equal("http://forgejo.golang.org/gordon/hello-world/pull/1") g.Assert(pipeline.Branch).Equal("main") g.Assert(pipeline.Refspec).Equal("feature/changes:main") - g.Assert(pipeline.Message).Equal(hook.PullRequest.Title) - g.Assert(pipeline.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") - g.Assert(pipeline.Author).Equal(hook.PullRequest.Poster.UserName) + g.Assert(pipeline.PullRequest.Title).Equal(hook.PullRequest.Title) + g.Assert(pipeline.Author.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") + g.Assert(pipeline.Author.Author).Equal(hook.PullRequest.Poster.UserName) }) g.It("Should return a Repo struct from a pull_request hook", func() { diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 8400bc63dc2..d10a37011f5 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -69,7 +69,6 @@ func TestForgejoParser(t *testing.T) { Commit: "28c3613ae62640216bea5e7dc71aa65356e4298b", Branch: "fdsafdsa", Ref: "refs/heads/fdsafdsa", - Message: "Delete '.woodpecker/.check.yml'\n", Sender: "6543", Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", Email: "6543@obermui.de", @@ -104,7 +103,6 @@ func TestForgejoParser(t *testing.T) { Commit: "ef98532add3b2feb7a137426bba1248724367df5", Branch: "main", Ref: "refs/heads/main", - Message: "bump\n", Sender: "gordon", Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", Email: "gordon@golang.org", @@ -139,7 +137,6 @@ func TestForgejoParser(t *testing.T) { Commit: "29be01c073851cf0db0c6a466e396b725a670453", Branch: "main", Ref: "refs/heads/main", - Message: "add some text\n", Sender: "test-user", Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", Email: "test@noreply.localhost", @@ -174,7 +171,6 @@ func TestForgejoParser(t *testing.T) { Event: "tag", Commit: "ef98532add3b2feb7a137426bba1248724367df5", Ref: "refs/tags/v1.0.0", - Message: "created tag v1.0.0", Sender: "gordon", Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", Email: "gordon@golang.org", @@ -210,8 +206,6 @@ func TestForgejoParser(t *testing.T) { Branch: "main", Ref: "refs/pull/1/head", Refspec: "feature/changes:main", - Title: "Update the README with new information", - Message: "Update the README with new information", Sender: "gordon", Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", Email: "gordon@golang.org", @@ -249,8 +243,6 @@ func TestForgejoParser(t *testing.T) { Branch: "main", Ref: "refs/pull/2/head", Refspec: "test-patch-1:main", - Title: "New Pull", - Message: "New Pull", Sender: "test", Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", Email: "test@noreply.localhost", @@ -290,8 +282,6 @@ func TestForgejoParser(t *testing.T) { Branch: "main", Ref: "refs/pull/1/head", Refspec: "anbraten-patch-1:main", - Title: "Adjust file", - Message: "Adjust file", Sender: "anbraten", Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", Email: "anbraten@sender.forgejo.com", @@ -328,8 +318,6 @@ func TestForgejoParser(t *testing.T) { Branch: "main", Ref: "refs/pull/1/head", Refspec: "anbraten-patch-1:main", - Title: "Adjust file", - Message: "Adjust file", Sender: "anbraten", Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", Email: "anbraten@noreply.forgejo.com", @@ -365,7 +353,6 @@ func TestForgejoParser(t *testing.T) { Event: "release", Branch: "main", Ref: "refs/tags/0.0.5", - Message: "created release Version 0.0.5", Sender: "anbraten", Avatar: "https://git.xxx/user/avatar/anbraten/-1", Email: "anbraten@noreply.xxx", diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index ed767c6a114..634ccf2a24d 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -274,7 +274,7 @@ func (c *Gitea) File(ctx context.Context, u *model.User, r *model.Repo, b *model return nil, err } - cfg, resp, err := client.GetFile(r.Owner, r.Name, b.Commit, f) + cfg, resp, err := client.GetFile(r.Owner, r.Name, b.Commit.SHA, f) if err != nil && resp != nil && resp.StatusCode == http.StatusNotFound { return nil, errors.Join(err, &forge_types.ErrConfigNotFound{Configs: []string{f}}) } @@ -290,7 +290,7 @@ func (c *Gitea) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model. } // List files in repository. Path from root - tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit, true) + tree, _, err := client.GetTrees(r.Owner, r.Name, b.Commit.SHA, true) if err != nil { return nil, err } @@ -328,7 +328,7 @@ func (c *Gitea) Status(ctx context.Context, user *model.User, repo *model.Repo, _, _, err = client.CreateStatus( repo.Owner, repo.Name, - pipeline.Commit, + pipeline.Commit.SHA, gitea.CreateStatusOption{ State: getStatus(workflow.State), TargetURL: common.GetPipelineStatusURL(repo, pipeline, workflow), @@ -510,7 +510,7 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model. return nil, nil, err } pipeline.Commit = &model.Commit{ - SHA: sha.SHA, + SHA: sha.SHA, ForgeURL: sha.URL, } } diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 0241fe3491b..dfe01acc86b 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -21,7 +21,6 @@ import ( "io" "net/url" "strings" - "time" "code.gitea.io/sdk/gitea" @@ -90,20 +89,20 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { } return &model.Pipeline{ - Event: model.EventPush, - Commit: &model.Commit{ - SHA: hook.After, - ForgeURL: hook.HeadCommit.URL, - Message: hook.HeadCommit.Message, + Event: model.EventPush, + Commit: &model.Commit{ + SHA: hook.After, + ForgeURL: link, + Message: message, + }, + Ref: hook.Ref, + ForgeURL: link, + Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, }, - Ref: hook.Ref, - ForgeURL: link, - Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), - Message: message, - Avatar: avatar, - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Sender: hook.Sender.UserName, ChangedFiles: getChangedFilesFromPushHook(hook), } } @@ -133,19 +132,19 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { ref := strings.TrimPrefix(hook.Ref, "refs/tags/") return &model.Pipeline{ - Event: model.EventTag, - Commit: &model.Commit{ - SHA: hook.Sha, + Event: model.EventTag, + Commit: &model.Commit{ + SHA: hook.Sha, ForgeURL: hook.HeadCommit.URL, - Message: hook.HeadCommit.Message, + Message: hook.HeadCommit.Message, + }, + Ref: fmt.Sprintf("refs/tags/%s", ref), + ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, }, - Ref: fmt.Sprintf("refs/tags/%s", ref), - ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), - Message: fmt.Sprintf("created tag %s", ref), - Avatar: avatar, - Author: hook.Sender.UserName, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, } } @@ -162,28 +161,27 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { } pipeline := &model.Pipeline{ - Event: event, - Commit: &model.Commit{ + Event: event, + Commit: &model.Commit{ SHA: hook.PullRequest.Head.Sha, }, ForgeURL: hook.PullRequest.HTMLURL, Ref: fmt.Sprintf("refs/pull/%d/head", hook.Number), Branch: hook.PullRequest.Base.Ref, - Message: hook.PullRequest.Title, - Author: hook.PullRequest.Poster.UserName, - Avatar: avatar, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, - Title: hook.PullRequest.Title, + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, ), PullRequest: &model.PullRequest{ - Index: model.ForgeRemoteID(hook.Number), + Index: model.ForgeRemoteID(hook.Number), PullRequestLabels: convertLabels(hook.PullRequest.Labels), FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, - Title: "", + Title: hook.PullRequest.Title, }, } @@ -201,11 +199,12 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), ForgeURL: hook.Release.HTMLURL, Branch: hook.Release.Target, - Message: fmt.Sprintf("created release %s", hook.Release.Title), - Avatar: avatar, - Author: hook.Sender.UserName, - Sender: hook.Sender.UserName, - Email: hook.Sender.Email, + ReleaseTitle: hook.Release.Title, + Author: model.Author{ + Author: hook.Sender.UserName, + Email: hook.Sender.Email, + Avatar: avatar, + }, IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/gitea/helper_test.go b/server/forge/gitea/helper_test.go index 2f1cb94fd14..3323aeac9f5 100644 --- a/server/forge/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -101,9 +101,9 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.Ref).Equal(hook.Ref) g.Assert(pipeline.ForgeURL).Equal(hook.Commits[0].URL) g.Assert(pipeline.Branch).Equal("main") - g.Assert(pipeline.Message).Equal(hook.Commits[0].Message) - g.Assert(pipeline.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") - g.Assert(pipeline.Author).Equal(hook.Sender.UserName) + g.Assert(pipeline.Commit.Message).Equal(hook.Commits[0].Message) + g.Assert(pipeline.Author.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") + g.Assert(pipeline.Author.Author).Equal(hook.Sender.UserName) g.Assert(utils.EqualSliceValues(pipeline.ChangedFiles, []string{"CHANGELOG.md", "app/controller/application.rb"})).IsTrue() }) @@ -126,7 +126,6 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.Ref).Equal("refs/tags/v1.0.0") g.Assert(pipeline.Branch).Equal("") g.Assert(pipeline.ForgeURL).Equal("http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0") - g.Assert(pipeline.Message).Equal("created tag v1.0.0") }) g.It("Should return a Pipeline struct from a pull_request hook", func() { @@ -139,9 +138,9 @@ func Test_parse(t *testing.T) { g.Assert(pipeline.ForgeURL).Equal("http://gitea.golang.org/gordon/hello-world/pull/1") g.Assert(pipeline.Branch).Equal("main") g.Assert(pipeline.Refspec).Equal("feature/changes:main") - g.Assert(pipeline.Message).Equal(hook.PullRequest.Title) - g.Assert(pipeline.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") - g.Assert(pipeline.Author).Equal(hook.PullRequest.Poster.UserName) + g.Assert(pipeline.PullRequest.Title).Equal(hook.PullRequest.Title) + g.Assert(pipeline.Author.Avatar).Equal("http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87") + g.Assert(pipeline.Author.Author).Equal(hook.PullRequest.Poster.UserName) }) g.It("Should return a Repo struct from a pull_request hook", func() { diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index 8cc8a642916..ddf239de67b 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -65,15 +65,16 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "6543", - Event: "push", - Commit: "28c3613ae62640216bea5e7dc71aa65356e4298b", - Branch: "fdsafdsa", - Ref: "refs/heads/fdsafdsa", - Message: "Delete '.woodpecker/.check.yml'\n", - Sender: "6543", - Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", - Email: "6543@obermui.de", + Event: "push", + Commit: &model.Commit{SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b"}, + Branch: "fdsafdsa", + Ref: "refs/heads/fdsafdsa", + Author: model.Author{ + Author: "6543", + Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", + Email: "6543@obermui.de", + }, + ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", ChangedFiles: []string{".woodpecker/.check.yml"}, }, @@ -100,15 +101,15 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "push", - Commit: "ef98532add3b2feb7a137426bba1248724367df5", - Branch: "main", - Ref: "refs/heads/main", - Message: "bump\n", - Sender: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", + Event: "push", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Branch: "main", + Ref: "refs/heads/main", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, ForgeURL: "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", ChangedFiles: []string{"CHANGELOG.md", "app/controller/application.rb"}, }, @@ -135,15 +136,15 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "test-user", - Event: "push", - Commit: "29be01c073851cf0db0c6a466e396b725a670453", - Branch: "main", - Ref: "refs/heads/main", - Message: "add some text\n", - Sender: "test-user", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", + Event: "push", + Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Branch: "main", + Ref: "refs/heads/main", + Author: model.Author{ + Author: "test-user", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", + Email: "test@noreply.localhost", + }, ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/compare/6efcf5b7c98f3e7a491675164b7a2e7acac27941...29be01c073851cf0db0c6a466e396b725a670453", ChangedFiles: []string{"aaa", "aa"}, }, @@ -171,14 +172,14 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "tag", - Commit: "ef98532add3b2feb7a137426bba1248724367df5", - Ref: "refs/tags/v1.0.0", - Message: "created tag v1.0.0", - Sender: "gordon", - Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", + Event: "tag", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Ref: "refs/tags/v1.0.0", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0", }, }, @@ -205,19 +206,20 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "pull_request", - Commit: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "feature/changes:main", - Title: "Update the README with new information", - Message: "Update the README with new information", - Sender: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - ForgeURL: "http://gitea.golang.org/gordon/hello-world/pull/1", - PullRequestLabels: []string{}, + Event: "pull_request", + Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "feature/changes:main", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, + ForgeURL: "http://gitea.golang.org/gordon/hello-world/pull/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -244,22 +246,21 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "test", - Event: "pull_request", - Commit: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25", - Branch: "main", - Ref: "refs/pull/2/head", - Refspec: "test-patch-1:main", - Title: "New Pull", - Message: "New Pull", - Sender: "test", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", + Event: "pull_request", + Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, + Branch: "main", + Ref: "refs/pull/2/head", + Refspec: "test-patch-1:main", + Author: model.Author{ + Author: "test", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", + Email: "test@noreply.localhost", + }, ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", - PullRequestLabels: []string{ + PullRequest: &model.PullRequest{PullRequestLabels: []string{ "Kind/Bug", "Kind/Security", - }, + }}, }, }, { @@ -285,19 +286,20 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "pull_request_closed", - Commit: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Title: "Adjust file", - Message: "Adjust file", - Sender: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@sender.gitea.com", - ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", - PullRequestLabels: []string{}, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: model.Author{ + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", + Email: "anbraten@noreply.gitea.com", + }, + ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -323,19 +325,20 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "pull_request_closed", - Commit: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Title: "Adjust file", - Message: "Adjust file", - Sender: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@noreply.gitea.com", - ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", - PullRequestLabels: []string{}, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: model.Author{ + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", + Email: "anbraten@noreply.gitea.com", + }, + ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -362,14 +365,15 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "release", - Branch: "main", - Ref: "refs/tags/0.0.5", - Message: "created release Version 0.0.5", - Sender: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - Email: "anbraten@noreply.xxx", + Event: "release", + Branch: "main", + Ref: "refs/tags/0.0.5", + ReleaseTitle: "Version 0.0.5", + Author: model.Author{ + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + Email: "anbraten@noreply.xxx", + }, ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", }, }, diff --git a/server/forge/github/convert_test.go b/server/forge/github/convert_test.go index 1e27dda53ac..6a3df58396a 100644 --- a/server/forge/github/convert_test.go +++ b/server/forge/github/convert_test.go @@ -213,11 +213,9 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Ref).Equal("refs/pull/42/merge") g.Assert(pipeline.Refspec).Equal("changes:main") g.Assert(pipeline.Commit).Equal(*from.PullRequest.Head.SHA) - g.Assert(pipeline.Message).Equal(*from.PullRequest.Title) - g.Assert(pipeline.Title).Equal(*from.PullRequest.Title) - g.Assert(pipeline.Author).Equal(*from.PullRequest.User.Login) - g.Assert(pipeline.Avatar).Equal(*from.PullRequest.User.AvatarURL) - g.Assert(pipeline.Sender).Equal(*from.Sender.Login) + g.Assert(pipeline.PullRequest.Title).Equal(*from.PullRequest.Title) + g.Assert(pipeline.Author.Author).Equal(*from.PullRequest.User.Login) + g.Assert(pipeline.Author.Avatar).Equal(*from.PullRequest.User.AvatarURL) }) g.It("should convert a deployment from webhook", func() { @@ -237,10 +235,10 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Branch).Equal("main") g.Assert(pipeline.Ref).Equal("refs/heads/main") g.Assert(pipeline.Commit).Equal(*from.Deployment.SHA) - g.Assert(pipeline.Message).Equal(*from.Deployment.Description) + g.Assert(pipeline.Deployment.Description).Equal(*from.Deployment.Description) g.Assert(pipeline.ForgeURL).Equal(*from.Deployment.URL) - g.Assert(pipeline.Author).Equal(*from.Sender.Login) - g.Assert(pipeline.Avatar).Equal(*from.Sender.AvatarURL) + g.Assert(pipeline.Author.Author).Equal(*from.Sender.Login) + g.Assert(pipeline.Author.Avatar).Equal(*from.Sender.AvatarURL) }) g.It("should convert a push from webhook", func() { @@ -259,11 +257,11 @@ func Test_helper(t *testing.T) { g.Assert(pipeline.Branch).Equal("main") g.Assert(pipeline.Ref).Equal("refs/heads/main") g.Assert(pipeline.Commit).Equal(*from.HeadCommit.ID) - g.Assert(pipeline.Message).Equal(*from.HeadCommit.Message) + g.Assert(pipeline.Commit.Message).Equal(*from.HeadCommit.Message) g.Assert(pipeline.ForgeURL).Equal(*from.HeadCommit.URL) g.Assert(pipeline.Author).Equal(*from.Sender.Login) - g.Assert(pipeline.Avatar).Equal(*from.Sender.AvatarURL) - g.Assert(pipeline.Email).Equal(*from.HeadCommit.Author.Email) + g.Assert(pipeline.Author.Avatar).Equal(*from.Sender.AvatarURL) + g.Assert(pipeline.Author.Email).Equal(*from.HeadCommit.Author.Email) }) g.It("should convert a tag from webhook", func() { diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index e6c68f528c5..c94473f5d7e 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -85,22 +85,19 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { } pipeline := &model.Pipeline{ - Event: model.EventPush, - Commit: hook.GetHeadCommit().GetID(), + Event: model.EventPush, + Commit: &model.Commit{ + SHA: hook.GetHeadCommit().GetID(), + Author: convertCommitAuthor(hook.GetHeadCommit().GetAuthor()), + Message: hook.GetHeadCommit().GetMessage(), + }, Ref: hook.GetRef(), ForgeURL: hook.GetHeadCommit().GetURL(), Branch: strings.ReplaceAll(hook.GetRef(), "refs/heads/", ""), - Message: hook.GetHeadCommit().GetMessage(), - Email: hook.GetHeadCommit().GetAuthor().GetEmail(), - Avatar: hook.GetSender().GetAvatarURL(), - Author: hook.GetSender().GetLogin(), - Sender: hook.GetSender().GetLogin(), + Author: convertAuthor(hook.GetSender()), ChangedFiles: getChangedFilesFromCommits(hook.Commits), } - if len(pipeline.Author) == 0 { - pipeline.Author = hook.GetHeadCommit().GetAuthor().GetLogin() - } if strings.HasPrefix(pipeline.Ref, "refs/tags/") { // just kidding, this is actually a tag event. Why did this come as a push // event we'll never know! @@ -120,20 +117,22 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { // If the commit type is unsupported nil values are returned. func parseDeployHook(hook *github.DeploymentEvent) (*model.Repo, *model.Pipeline) { pipeline := &model.Pipeline{ - Event: model.EventDeploy, - Commit: hook.GetDeployment().GetSHA(), - ForgeURL: hook.GetDeployment().GetURL(), - Message: hook.GetDeployment().GetDescription(), - Ref: hook.GetDeployment().GetRef(), - Branch: hook.GetDeployment().GetRef(), - Avatar: hook.GetSender().GetAvatarURL(), - Author: hook.GetSender().GetLogin(), - Sender: hook.GetSender().GetLogin(), - DeployTo: hook.GetDeployment().GetEnvironment(), - DeployTask: hook.GetDeployment().GetTask(), + Event: model.EventDeploy, + Commit: &model.Commit{ + SHA: hook.GetDeployment().GetSHA(), + }, + ForgeURL: hook.GetDeployment().GetURL(), + Ref: hook.GetDeployment().GetRef(), + Branch: hook.GetDeployment().GetRef(), + Author: convertAuthor(hook.GetSender()), + Deployment: model.Deployment{ + Target: hook.GetDeployment().GetEnvironment(), + Task: hook.GetDeployment().GetTask(), + Description: hook.GetDeployment().GetDescription(), + }, } // if the ref is a sha or short sha we need to manually construct the ref. - if strings.HasPrefix(pipeline.Commit, pipeline.Ref) || pipeline.Commit == pipeline.Ref { + if strings.HasPrefix(pipeline.Commit.SHA, pipeline.Ref) || pipeline.Commit.SHA == pipeline.Ref { pipeline.Branch = hook.GetRepo().GetDefaultBranch() pipeline.Ref = fmt.Sprintf("refs/heads/%s", pipeline.Branch) } @@ -160,22 +159,23 @@ func parsePullHook(hook *github.PullRequestEvent, merge bool) (*github.PullReque fromFork := hook.GetPullRequest().GetHead().GetRepo().GetID() != hook.GetPullRequest().GetBase().GetRepo().GetID() pipeline := &model.Pipeline{ - Event: event, - Commit: hook.GetPullRequest().GetHead().GetSHA(), + Event: event, + Commit: &model.Commit{ + SHA: hook.GetPullRequest().GetHead().GetSHA(), + }, ForgeURL: hook.GetPullRequest().GetHTMLURL(), Ref: fmt.Sprintf(headRefs, hook.GetPullRequest().GetNumber()), Branch: hook.GetPullRequest().GetBase().GetRef(), - Message: hook.GetPullRequest().GetTitle(), - Author: hook.GetPullRequest().GetUser().GetLogin(), - Avatar: hook.GetPullRequest().GetUser().GetAvatarURL(), - Title: hook.GetPullRequest().GetTitle(), - Sender: hook.GetSender().GetLogin(), + Author: convertAuthor(hook.GetPullRequest().GetUser()), Refspec: fmt.Sprintf(refSpec, hook.GetPullRequest().GetHead().GetRef(), hook.GetPullRequest().GetBase().GetRef(), ), - PullRequestLabels: convertLabels(hook.GetPullRequest().Labels), - FromFork: fromFork, + PullRequest: &model.PullRequest{ + Title: hook.GetPullRequest().GetTitle(), + PullRequestLabels: convertLabels(hook.GetPullRequest().Labels), + FromFork: fromFork, + }, } if merge { pipeline.Ref = fmt.Sprintf(mergeRefs, hook.GetPullRequest().GetNumber()) @@ -201,10 +201,8 @@ func parseReleaseHook(hook *github.ReleaseEvent) (*model.Repo, *model.Pipeline) ForgeURL: hook.GetRelease().GetHTMLURL(), Ref: fmt.Sprintf("refs/tags/%s", hook.GetRelease().GetTagName()), Branch: hook.GetRelease().GetTargetCommitish(), // cspell:disable-line - Message: fmt.Sprintf("created release %s", name), - Author: hook.GetRelease().GetAuthor().GetLogin(), - Avatar: hook.GetRelease().GetAuthor().GetAvatarURL(), - Sender: hook.GetSender().GetLogin(), + ReleaseTitle: name, + Author: convertAuthor(hook.GetRelease().GetAuthor()), IsPrerelease: hook.GetRelease().GetPrerelease(), } @@ -221,3 +219,18 @@ func getChangedFilesFromCommits(commits []*github.HeadCommit) []string { } return utils.DeduplicateStrings(files) } + +func convertAuthor(u *github.User) model.Author { + return model.Author{ + Avatar: u.GetAvatarURL(), + Author: u.GetLogin(), + Email: u.GetEmail(), + } +} + +func convertCommitAuthor(u *github.CommitAuthor) model.Author { + return model.Author{ + Author: u.GetName(), + Email: u.GetEmail(), + } +} diff --git a/server/forge/github/parse_test.go b/server/forge/github/parse_test.go index c316dd9ab7f..c7b1546f62d 100644 --- a/server/forge/github/parse_test.go +++ b/server/forge/github/parse_test.go @@ -119,8 +119,8 @@ func Test_parser(t *testing.T) { g.Assert(b).IsNotNil() g.Assert(p).IsNil() g.Assert(b.Event).Equal(model.EventDeploy) - g.Assert(b.DeployTo).Equal("production") - g.Assert(b.DeployTask).Equal("deploy") + g.Assert(b.Deployment.Target).Equal("production") + g.Assert(b.Deployment.Task).Equal("deploy") }) }) diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 8dbe76f45d5..2eb335787b7 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -119,27 +119,28 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * lastCommit := obj.LastCommit - pipeline.Message = lastCommit.Message - pipeline.Commit = lastCommit.ID + pipeline.Commit = &model.Commit{ + Message: lastCommit.Message, + SHA: lastCommit.ID, + Author: model.Author{ + Author: lastCommit.Author.Name, + Email: lastCommit.Author.Email, + }, + } pipeline.Ref = fmt.Sprintf(mergeRefs, obj.IID) pipeline.Branch = obj.SourceBranch pipeline.Refspec = fmt.Sprintf("%s:%s", obj.SourceBranch, obj.TargetBranch) - - author := lastCommit.Author - - pipeline.Author = author.Name - pipeline.Email = author.Email - - if len(pipeline.Email) != 0 { - pipeline.Avatar = getUserAvatar(pipeline.Email) + pipeline.Author = model.Author{ + Author: hook.User.Username, + Email: hook.User.Email, + Avatar: hook.User.AvatarURL, } - - pipeline.Title = obj.Title pipeline.ForgeURL = obj.URL pipeline.PullRequest = &model.PullRequest{ PullRequestLabels: convertLabels(hook.Labels), - FromFork: target.PathWithNamespace != source.PathWithNamespace, + FromFork: target.PathWithNamespace != source.PathWithNamespace, + Title: obj.Title, } return obj.IID, repo, pipeline, nil @@ -172,20 +173,21 @@ func convertPushHook(hook *gitlab.PushEvent) (*model.Repo, *model.Pipeline, erro } pipeline.Event = model.EventPush - pipeline.Commit = hook.After + pipeline.Commit = &model.Commit{SHA: hook.After} pipeline.Branch = strings.TrimPrefix(hook.Ref, "refs/heads/") pipeline.Ref = hook.Ref + pipeline.Author = model.Author{ + Author: hook.UserUsername, + Email: hook.UserEmail, + Avatar: hook.UserAvatar, + } // assume a capacity of 4 changed files per commit files := make([]string, 0, len(hook.Commits)*4) for _, cm := range hook.Commits { if hook.After == cm.ID { - pipeline.Author = cm.Author.Name - pipeline.Email = cm.Author.Email - pipeline.Message = cm.Message - if len(pipeline.Email) != 0 { - pipeline.Avatar = getUserAvatar(pipeline.Email) - } + pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} + pipeline.Commit.Message = cm.Message } files = append(files, cm.Added...) @@ -224,18 +226,21 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) } pipeline.Event = model.EventTag - pipeline.Commit = hook.After + pipeline.Commit = &model.Commit{ + SHA: hook.After, + } pipeline.Branch = strings.TrimPrefix(hook.Ref, "refs/heads/") pipeline.Ref = hook.Ref + pipeline.Author = model.Author{ + Author: hook.UserUsername, + Email: hook.UserEmail, + Avatar: hook.UserAvatar, + } for _, cm := range hook.Commits { if hook.After == cm.ID { - pipeline.Author = cm.Author.Name - pipeline.Email = cm.Author.Email - pipeline.Message = cm.Message - if len(pipeline.Email) != 0 { - pipeline.Avatar = getUserAvatar(pipeline.Email) - } + pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} + pipeline.Commit.Message = cm.Message break } } @@ -264,21 +269,28 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline repo.IsSCMPrivate = hook.Project.VisibilityLevel > VisibilityLevelInternal pipeline := &model.Pipeline{ - Event: model.EventRelease, - Commit: hook.Commit.ID, - ForgeURL: hook.URL, - Message: fmt.Sprintf("created release %s", hook.Name), - Sender: hook.Commit.Author.Name, - Author: hook.Commit.Author.Name, - Email: hook.Commit.Author.Email, + Event: model.EventRelease, + Commit: &model.Commit{ + SHA: hook.Commit.ID, + Author: model.Author{ + Author: hook.Commit.Author.Name, + Email: hook.Commit.Author.Email, + }, + Message: hook.Commit.Message, + }, + ForgeURL: hook.URL, + ReleaseTitle: hook.Name, + Author: model.Author{ + // TODO gitlab actually doesn't have a user associated to the hook/release + Author: hook.Commit.Author.Name, + Email: hook.Commit.Author.Email, + Avatar: getUserAvatar(hook.Commit.Author.Email), + }, // Tag name here is the ref. We should add the refs/tags, so // it is known it's a tag (git-plugin looks for it) Ref: "refs/tags/" + hook.Tag, } - if len(pipeline.Email) != 0 { - pipeline.Avatar = getUserAvatar(pipeline.Email) - } return repo, pipeline, nil } diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index fbe14500237..dbaf57007fb 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -374,7 +374,7 @@ func (g *GitLab) File(ctx context.Context, user *model.User, repo *model.Repo, p if err != nil { return nil, err } - file, resp, err := client.RepositoryFiles.GetRawFile(_repo.ID, fileName, &gitlab.GetRawFileOptions{Ref: &pipeline.Commit}, gitlab.WithContext(ctx)) + file, resp, err := client.RepositoryFiles.GetRawFile(_repo.ID, fileName, &gitlab.GetRawFileOptions{Ref: &pipeline.Commit.SHA}, gitlab.WithContext(ctx)) if resp != nil && resp.StatusCode == http.StatusNotFound { return nil, errors.Join(err, &forge_types.ErrConfigNotFound{Configs: []string{fileName}}) } @@ -397,7 +397,7 @@ func (g *GitLab) Dir(ctx context.Context, user *model.User, repo *model.Repo, pi opts := &gitlab.ListTreeOptions{ ListOptions: gitlab.ListOptions{PerPage: perPage}, Path: &path, - Ref: &pipeline.Commit, + Ref: &pipeline.Commit.SHA, Recursive: gitlab.Ptr(false), } @@ -445,7 +445,7 @@ func (g *GitLab) Status(ctx context.Context, user *model.User, repo *model.Repo, return err } - _, _, err = client.Commits.SetCommitStatus(_repo.ID, pipeline.Commit, &gitlab.SetCommitStatusOptions{ + _, _, err = client.Commits.SetCommitStatus(_repo.ID, pipeline.Commit.SHA, &gitlab.SetCommitStatusOptions{ State: getStatus(workflow.State), Description: gitlab.Ptr(common.GetPipelineStatusDescription(workflow.State)), TargetURL: gitlab.Ptr(common.GetPipelineStatusURL(repo, pipeline, workflow)), diff --git a/server/forge/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go index 04619acaf95..d88c472520f 100644 --- a/server/forge/gitlab/gitlab_test.go +++ b/server/forge/gitlab/gitlab_test.go @@ -201,7 +201,6 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker", hookRepo.Name) - assert.Equal(t, "Update client.go 🎉", pipeline.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPull, pipeline.Event) } @@ -252,7 +251,6 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker-test", hookRepo.Name) - assert.Equal(t, "Add new file", pipeline.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPullClosed, pipeline.Event) } @@ -273,7 +271,6 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker-test", hookRepo.Name) - assert.Equal(t, "Add new file", pipeline.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPullClosed, pipeline.Event) } @@ -292,7 +289,7 @@ func Test_GitLab(t *testing.T) { if assert.NotNil(t, hookRepo) && assert.NotNil(t, pipeline) { assert.Equal(t, "refs/tags/0.0.2", pipeline.Ref) assert.Equal(t, "ci", hookRepo.Name) - assert.Equal(t, "created release Awesome version 0.0.2", pipeline.Message) + assert.Equal(t, "Awesome version 0.0.2", pipeline.ReleaseTitle) assert.Equal(t, model.EventRelease, pipeline.Event) } }) diff --git a/server/model/commit.go b/server/model/commit.go index 8f313c3b69b..706306077ad 100644 --- a/server/model/commit.go +++ b/server/model/commit.go @@ -2,13 +2,13 @@ package model type Commit struct { SHA string `json:"sha"` - Message string `json:"message"` + Message string `json:"message"` ForgeURL string `json:"forge_url"` - Author Author `json:"author"` + Author Author `json:"author"` } type Author struct { Author string `json:"author"` - Email string `json:"email"` + Email string `json:"email"` Avatar string `json:"avatar"` } diff --git a/server/model/pipeline.go b/server/model/pipeline.go index fccb7ff0c7a..f98af803b90 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -24,30 +24,32 @@ type Pipeline struct { RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'repo_id'"` Number int64 `json:"number" xorm:"UNIQUE(s) 'number'"` Parent int64 `json:"parent" xorm:"parent"` - Event WebhookEvent `json:"event" xorm:"event"` Status StatusValue `json:"status" xorm:"INDEX 'status'"` Errors []*types.PipelineError `json:"errors" xorm:"json 'errors'"` Created int64 `json:"created" xorm:"'created' NOT NULL DEFAULT 0 created"` Updated int64 `json:"updated" xorm:"'updated' NOT NULL DEFAULT 0 updated"` Started int64 `json:"started" xorm:"started"` Finished int64 `json:"finished" xorm:"finished"` - DeployTo string `json:"deploy_to" xorm:"deploy"` - DeployTask string `json:"deploy_task" xorm:"deploy_task"` - Commit *Commit `json:"commit" xorm:"json 'commit'"` - Branch string `json:"branch" xorm:"branch"` - Ref string `json:"ref" xorm:"ref"` - Refspec string `json:"refspec" xorm:"refspec"` - Title string `json:"title" xorm:"title"` - Message string `json:"message" xorm:"TEXT 'message'"` - Author Author `json:"author" xorm:"json 'author"` - ForgeURL string `json:"forge_url" xorm:"forge_url"` Reviewer string `json:"reviewed_by" xorm:"reviewer"` Reviewed int64 `json:"reviewed" xorm:"reviewed"` Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"` - ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"` - IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` - PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + + // event related + + Event WebhookEvent `json:"event" xorm:"event"` + Commit *Commit `json:"commit" xorm:"json 'commit'"` + Branch string `json:"branch" xorm:"branch"` + Ref string `json:"ref" xorm:"ref"` + Refspec string `json:"refspec" xorm:"refspec"` + ForgeURL string `json:"forge_url" xorm:"forge_url"` + Author Author `json:"author" xorm:"json 'author"` + ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` + Deployment Deployment `json:"deployment" xorm:"json 'deployment'"` + IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` + PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + Cron string `json:"cron,omitempty" xorm:"cron"` + ReleaseTitle string `json:"release,omitempty" xorm:"release"` } // @name Pipeline // TableName return database table name for xorm. @@ -73,3 +75,9 @@ type PipelineOptions struct { Branch string `json:"branch"` Variables map[string]string `json:"variables"` } // @name PipelineOptions + +type Deployment struct { + Target string `json:"target"` + Task string `json:"task"` + Description string `json:"description"` +} diff --git a/server/model/pull_request.go b/server/model/pull_request.go index 8f73d9ded04..697e9b3035e 100644 --- a/server/model/pull_request.go +++ b/server/model/pull_request.go @@ -15,8 +15,8 @@ package model type PullRequest struct { - Index ForgeRemoteID `json:"index"` - Title string `json:"title"` - PullRequestLabels []string `json:"pr_labels,omitempty"` - FromFork bool `json:"from_fork,omitempty"` + Index ForgeRemoteID `json:"index"` + Title string `json:"title"` + PullRequestLabels []string `json:"pr_labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` } // @name PullRequest diff --git a/server/pipeline/create.go b/server/pipeline/create.go index 2a5ebb6da16..4d40907f29b 100644 --- a/server/pipeline/create.go +++ b/server/pipeline/create.go @@ -42,13 +42,9 @@ func Create(ctx context.Context, _store store.Store, repo *model.Repo, pipeline } if pipeline.Event == model.EventPush || pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed { - skipMatch := skipPipelineRegex.FindString(pipeline.Message) + skipMatch := skipPipelineRegex.FindString(pipeline.Commit.Message) if len(skipMatch) > 0 { - ref := pipeline.Commit - if len(ref) == 0 { - ref = pipeline.Ref - } - log.Debug().Str("repo", repo.FullName).Msgf("ignoring pipeline as skip-ci was found in the commit (%s) message '%s'", ref, pipeline.Message) + log.Debug().Str("repo", repo.FullName).Msgf("ignoring pipeline as skip-ci was found in the commit (%s) message '%s'", pipeline.Commit.SHA, pipeline.Commit.Message) return nil, ErrFiltered } } diff --git a/server/pipeline/gated.go b/server/pipeline/gated.go index 4a4f3dc3600..ee2a7327835 100644 --- a/server/pipeline/gated.go +++ b/server/pipeline/gated.go @@ -38,7 +38,7 @@ func needsApproval(repo *model.Repo, pipeline *model.Pipeline) bool { // repository requires approval for pull requests from forks case model.RequireApprovalForks: - if pipeline.Event == model.EventPull && pipeline.FromFork { + if pipeline.Event == model.EventPull && pipeline.PullRequest.FromFork { return true } diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index 6de04d9db1d..2110de02c18 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -101,11 +101,6 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b return metadata.Pipeline{} } - cron := "" - if pipeline.Event == model.EventCron { - cron = pipeline.Sender - } - parent := int64(0) if includeParent { parent = pipeline.Parent @@ -120,23 +115,24 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b Status: string(pipeline.Status), Event: string(pipeline.Event), ForgeURL: pipeline.ForgeURL, - DeployTo: pipeline.DeployTo, - DeployTask: pipeline.DeployTask, + DeployTo: pipeline.Deployment.Target, + DeployTask: pipeline.Deployment.Task, Commit: metadata.Commit{ Sha: pipeline.Commit.SHA, Ref: pipeline.Ref, Refspec: pipeline.Refspec, Branch: pipeline.Branch, - Message: pipeline.Message, + Message: pipeline.Commit.Message, Author: metadata.Author{ - Name: pipeline.Author, - Email: pipeline.Email, - Avatar: pipeline.Avatar, + Name: pipeline.Commit.Author.Author, + Email: pipeline.Commit.Author.Email, + Avatar: pipeline.Commit.Author.Avatar, }, ChangedFiles: pipeline.ChangedFiles, PullRequestLabels: pipeline.PullRequest.PullRequestLabels, IsPrerelease: pipeline.IsPrerelease, }, - Cron: cron, + Release: pipeline.ReleaseTitle, + Cron: pipeline.Cron, } } diff --git a/server/pipeline/stepbuilder/stepBuilder_test.go b/server/pipeline/stepbuilder/stepBuilder_test.go index bca38e79833..eed78afa7e0 100644 --- a/server/pipeline/stepbuilder/stepBuilder_test.go +++ b/server/pipeline/stepbuilder/stepBuilder_test.go @@ -39,8 +39,10 @@ func TestGlobalEnvsubst(t *testing.T) { }, Repo: &model.Repo{}, Curr: &model.Pipeline{ - Message: "aaa", - Event: model.EventPush, + Commit: &model.Commit{ + Message: "aaa", + }, + Event: model.EventPush, }, Prev: &model.Pipeline{}, Netrc: &model.Netrc{}, @@ -78,8 +80,10 @@ func TestMissingGlobalEnvsubst(t *testing.T) { }, Repo: &model.Repo{}, Curr: &model.Pipeline{ - Message: "aaa", - Event: model.EventPush, + Commit: &model.Commit{ + Message: "aaa", + }, + Event: model.EventPush, }, Prev: &model.Pipeline{}, Netrc: &model.Netrc{}, @@ -113,8 +117,9 @@ func TestMultilineEnvsubst(t *testing.T) { Forge: getMockForge(t), Repo: &model.Repo{}, Curr: &model.Pipeline{ - Message: `aaa -bbb`, + Commit: &model.Commit{ + Message: "aaa\nbbb", + }, }, Prev: &model.Pipeline{}, Netrc: &model.Netrc{}, diff --git a/server/store/datastore/pipeline_test.go b/server/store/datastore/pipeline_test.go index c4a81c63221..84cfe2ef473 100644 --- a/server/store/datastore/pipeline_test.go +++ b/server/store/datastore/pipeline_test.go @@ -77,13 +77,13 @@ func TestPipelines(t *testing.T) { pipeline := model.Pipeline{ RepoID: repo.ID, Status: model.StatusSuccess, - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, } err := store.CreatePipeline(&pipeline) g.Assert(err).IsNil() g.Assert(pipeline.ID != 0).IsTrue() g.Assert(pipeline.Number).Equal(int64(1)) - g.Assert(pipeline.Commit).Equal("85f8c029b902ed9400bc600bac301a0aadb144ac") + g.Assert(pipeline.Commit.SHA).Equal("85f8c029b902ed9400bc600bac301a0aadb144ac") count, err := store.GetPipelineCount() g.Assert(err).IsNil() @@ -96,7 +96,7 @@ func TestPipelines(t *testing.T) { RepoID: repo.ID, Number: 5, Status: model.StatusSuccess, - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, } err := store.CreatePipeline(&pipeline) g.Assert(err).IsNil() @@ -150,14 +150,14 @@ func TestPipelines(t *testing.T) { RepoID: repo.ID, Status: model.StatusFailure, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, Event: model.EventPush, } pipeline2 := &model.Pipeline{ RepoID: repo.ID, Status: model.StatusSuccess, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, Event: model.EventPush, } err1 := store.CreatePipeline(pipeline1, []*model.Step{}...) @@ -171,7 +171,7 @@ func TestPipelines(t *testing.T) { g.Assert(pipeline2.Number).Equal(GetPipeline.Number) g.Assert(pipeline2.Status).Equal(GetPipeline.Status) g.Assert(pipeline2.Branch).Equal(GetPipeline.Branch) - g.Assert(pipeline2.Commit).Equal(GetPipeline.Commit) + g.Assert(pipeline2.Commit.SHA).Equal(GetPipeline.Commit) }) g.It("Should Get the last Pipeline Before Pipeline N", func() { @@ -179,19 +179,19 @@ func TestPipelines(t *testing.T) { RepoID: repo.ID, Status: model.StatusFailure, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, } pipeline2 := &model.Pipeline{ RepoID: repo.ID, Status: model.StatusSuccess, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, } pipeline3 := &model.Pipeline{ RepoID: repo.ID, Status: model.StatusRunning, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144aa"}, } err1 := store.CreatePipeline(pipeline1, []*model.Step{}...) g.Assert(err1).IsNil() @@ -206,7 +206,7 @@ func TestPipelines(t *testing.T) { g.Assert(pipeline2.Number).Equal(GetPipeline.Number) g.Assert(pipeline2.Status).Equal(GetPipeline.Status) g.Assert(pipeline2.Branch).Equal(GetPipeline.Branch) - g.Assert(pipeline2.Commit).Equal(GetPipeline.Commit) + g.Assert(pipeline2.Commit.SHA).Equal(GetPipeline.Commit) }) g.It("Should get recent pipelines", func() { From 9eff47594ec6f57138174ce254a820eb6fdb38f5 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Jan 2025 18:00:51 +0200 Subject: [PATCH 03/30] finish forge loaders --- server/forge/bitbucket/bitbucket.go | 54 ++++- server/forge/bitbucket/bitbucket_test.go | 2 +- server/forge/bitbucket/convert.go | 21 +- server/forge/bitbucket/convert_test.go | 13 +- server/forge/bitbucket/internal/client.go | 8 + server/forge/bitbucket/internal/types.go | 72 +++---- server/forge/bitbucket/parse_test.go | 2 +- .../bitbucketdatacenter.go | 28 ++- .../forge/bitbucketdatacenter/convert_test.go | 97 ++++----- server/forge/forgejo/forgejo.go | 83 ++++++-- server/forge/forgejo/forgejo_test.go | 2 +- server/forge/forgejo/helper.go | 17 +- server/forge/forgejo/helper_test.go | 9 +- server/forge/forgejo/parse_test.go | 198 ++++++++++-------- server/forge/forgejo/types.go | 3 +- server/forge/gitea/gitea.go | 76 +++++-- server/forge/gitea/gitea_test.go | 2 +- server/forge/gitea/helper.go | 23 +- server/forge/gitea/helper_test.go | 9 +- server/forge/gitea/types.go | 3 +- server/forge/github/convert.go | 12 ++ server/forge/github/convert_test.go | 17 +- server/forge/github/github.go | 72 +++++-- server/forge/github/parse.go | 7 +- server/forge/github/parse_test.go | 4 +- server/forge/gitlab/convert.go | 7 +- server/forge/gitlab/gitlab.go | 2 + server/forge/gitlab/gitlab_test.go | 8 +- server/pipeline/gated_test.go | 8 +- server/services/config/combined_test.go | 2 +- server/services/config/forge_test.go | 2 +- server/store/datastore/config_test.go | 2 +- server/store/datastore/pipeline_test.go | 4 +- 33 files changed, 541 insertions(+), 328 deletions(-) diff --git a/server/forge/bitbucket/bitbucket.go b/server/forge/bitbucket/bitbucket.go index bbb5ac43b81..29a9ff82995 100644 --- a/server/forge/bitbucket/bitbucket.go +++ b/server/forge/bitbucket/bitbucket.go @@ -32,6 +32,7 @@ import ( "go.woodpecker-ci.org/woodpecker/v3/server/forge/common" forge_types "go.woodpecker-ci.org/woodpecker/v3/server/forge/types" "go.woodpecker-ci.org/woodpecker/v3/server/model" + "go.woodpecker-ci.org/woodpecker/v3/server/store" shared_utils "go.woodpecker-ci.org/woodpecker/v3/shared/utils" ) @@ -222,7 +223,7 @@ func (c *config) Repos(ctx context.Context, u *model.User) ([]*model.Repo, error // File fetches the file from the Bitbucket repository and returns its contents. func (c *config) File(ctx context.Context, u *model.User, r *model.Repo, p *model.Pipeline, f string) ([]byte, error) { - config, err := c.newClient(ctx, u).FindSource(r.Owner, r.Name, p.Commit, f) + config, err := c.newClient(ctx, u).FindSource(r.Owner, r.Name, p.Commit.SHA, f) if err != nil { var rspErr internal.Error if ok := errors.As(err, &rspErr); ok && rspErr.Status == http.StatusNotFound { @@ -241,7 +242,7 @@ func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model repoPathFiles := []*forge_types.FileMeta{} client := c.newClient(ctx, u) for { - filesResp, err := client.GetRepoFiles(r.Owner, r.Name, p.Commit, f, page) + filesResp, err := client.GetRepoFiles(r.Owner, r.Name, p.Commit.SHA, f, page) if err != nil { var rspErr internal.Error if ok := errors.As(err, &rspErr); ok && rspErr.Status == http.StatusNotFound { @@ -257,7 +258,7 @@ func (c *config) Dir(ctx context.Context, u *model.User, r *model.Repo, p *model Name: filename, } if file.Type == "commit_file" { - fileData, err := c.newClient(ctx, u).FindSource(r.Owner, r.Name, p.Commit, file.Path) + fileData, err := c.newClient(ctx, u).FindSource(r.Owner, r.Name, p.Commit.SHA, file.Path) if err != nil { return nil, err } @@ -297,7 +298,7 @@ func (c *config) Status(ctx context.Context, user *model.User, repo *model.Repo, Key: common.GetPipelineStatusContext(repo, pipeline, workflow), URL: common.GetPipelineStatusURL(repo, pipeline, nil), } - return c.newClient(ctx, user).CreateStatus(repo.Owner, repo.Name, pipeline.Commit, &status) + return c.newClient(ctx, user).CreateStatus(repo.Owner, repo.Name, pipeline.Commit.SHA, &status) } // Activate activates the repository by registering repository push hooks with @@ -375,6 +376,8 @@ func (c *config) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b return &model.Commit{ SHA: commit.Hash, ForgeURL: commit.Links.HTML.Href, + Message: commit.Message, + Author: convertCommitAuthor(commit.Author.Raw), }, nil } @@ -397,8 +400,18 @@ func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, // Hook parses the incoming Bitbucket hook and returns the Repository and // Pipeline details. If the hook is unsupported nil values are returned. -func (c *config) Hook(_ context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { - return parseHook(req) +func (c *config) Hook(ctx context.Context, req *http.Request) (*model.Repo, *model.Pipeline, error) { + repo, pipeline, err := parseHook(req) + + if pipeline != nil && (pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed) { + commit, err := c.getCommit(ctx, repo, pipeline.Commit.SHA) + if err != nil { + return nil, nil, err + } + pipeline.Commit = commit + } + + return repo, pipeline, err } // OrgMembership returns if user is member of organization and if user @@ -458,6 +471,35 @@ func (c *config) newOAuth2Config() *oauth2.Config { } } +func (c *config) getCommit(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { + _store, ok := store.TryFromContext(ctx) + if !ok { + return nil, fmt.Errorf("could not get store from context") + } + + repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) + if err != nil { + return nil, err + } + + user, err := _store.GetUser(repo.UserID) + if err != nil { + return nil, err + } + + commit, err := c.newClient(ctx, user).GetCommit(repo.Owner, repo.Name, sha) + if err != nil { + return nil, err + } + + return &model.Commit{ + SHA: commit.Hash, + ForgeURL: commit.Links.HTML.Href, + Message: commit.Message, + Author: convertCommitAuthor(commit.Author.Raw), + }, nil +} + // helper function to return matching hooks. func matchingHooks(hooks []*internal.Hook, rawURL string) *internal.Hook { link, err := url.Parse(rawURL) diff --git a/server/forge/bitbucket/bitbucket_test.go b/server/forge/bitbucket/bitbucket_test.go index c074cfcf2de..d28dd5e64b3 100644 --- a/server/forge/bitbucket/bitbucket_test.go +++ b/server/forge/bitbucket/bitbucket_test.go @@ -270,7 +270,7 @@ var ( } fakePipeline = &model.Pipeline{ - Commit: "9ecad50", + Commit: &model.Commit{SHA: "9ecad50"}, } fakeWorkflow = &model.Workflow{ diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go index eb694ce5620..a383e4fb3aa 100644 --- a/server/forge/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -167,8 +167,7 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { pipeline := &model.Pipeline{ Event: event, Commit: &model.Commit{ - SHA: from.PullRequest.Source.Commit.Hash, - ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, + SHA: from.PullRequest.Source.Commit.Hash, }, Ref: fmt.Sprintf("refs/pull-requests/%d/from", from.PullRequest.ID), Refspec: fmt.Sprintf("%s:%s", @@ -187,8 +186,7 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { if from.PullRequest.State == stateClosed { pipeline.Commit = &model.Commit{ - SHA: from.PullRequest.MergeCommit.Hash, - ForgeURL: from.PullRequest.Source.Commit.Links.HTML.Href, + SHA: from.PullRequest.MergeCommit.Hash, } pipeline.Ref = fmt.Sprintf("refs/heads/%s", from.PullRequest.Dest.Branch.Name) pipeline.Branch = from.PullRequest.Dest.Branch.Name @@ -205,6 +203,7 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi SHA: change.New.Target.Hash, ForgeURL: change.New.Target.Links.HTML.Href, Message: change.New.Target.Message, + Author: convertCommitAuthor(change.New.Target.Author.Raw), }, ForgeURL: change.New.Target.Links.HTML.Href, Branch: change.New.Name, @@ -218,22 +217,22 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi pipeline.Event = model.EventPush pipeline.Ref = fmt.Sprintf("refs/heads/%s", change.New.Name) } - if len(change.New.Target.Author.Raw) != 0 { - pipeline.Author.Email = extractEmail(change.New.Target.Author.Raw) - } return pipeline } // regex for git author fields (r.g. "name "). -var reGitMail = regexp.MustCompile("<(.*)>") +var reGitMail = regexp.MustCompile("(.*) <(.*)>") // extracts the email from a git commit author string. -func extractEmail(gitAuthor string) (author string) { +func convertCommitAuthor(gitAuthor string) model.Author { matches := reGitMail.FindAllStringSubmatch(gitAuthor, -1) if len(matches) == 1 { - author = matches[0][1] + return model.Author{ + Author: matches[0][1], + Email: matches[0][2], + } } - return + return model.Author{} } func convertAuthor(a internal.Account) model.Author { diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go index 5f450cc03d1..26b9e321e0e 100644 --- a/server/forge/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -121,20 +121,18 @@ func Test_convertPullHook(t *testing.T) { hook.PullRequest.Source.Commit.Hash = "c8411d7" hook.PullRequest.Links.HTML.Href = "https://bitbucket.org/foo/bar/pulls/5" hook.PullRequest.Title = "updated README" - hook.PullRequest.Updated = time.Now() hook.PullRequest.ID = 1 pipeline := convertPullHook(hook) assert.Equal(t, model.EventPull, pipeline.Event) assert.Equal(t, hook.Actor.Login, pipeline.Author) - assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Avatar) + assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author.Author) assert.Equal(t, hook.PullRequest.Source.Commit.Hash, pipeline.Commit) assert.Equal(t, hook.PullRequest.Source.Branch.Name, pipeline.Branch) assert.Equal(t, hook.PullRequest.Links.HTML.Href, pipeline.ForgeURL) assert.Equal(t, "refs/pull-requests/1/from", pipeline.Ref) assert.Equal(t, "change:main", pipeline.Refspec) - assert.Equal(t, hook.PullRequest.Title, pipeline.Message) - assert.Equal(t, hook.PullRequest.Updated.Unix(), pipeline.Timestamp) + assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) } func Test_convertPushHook(t *testing.T) { @@ -152,15 +150,14 @@ func Test_convertPushHook(t *testing.T) { pipeline := convertPushHook(&hook, &change) assert.Equal(t, model.EventPush, pipeline.Event) - assert.Equal(t, "test@domain.tld", pipeline.Email) + assert.Equal(t, "test@domain.tld", pipeline.Commit.Author.Email) assert.Equal(t, hook.Actor.Login, pipeline.Author) - assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Avatar) + assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author.Avatar) assert.Equal(t, change.New.Target.Hash, pipeline.Commit) assert.Equal(t, change.New.Name, pipeline.Branch) assert.Equal(t, change.New.Target.Links.HTML.Href, pipeline.ForgeURL) assert.Equal(t, "refs/heads/main", pipeline.Ref) - assert.Equal(t, change.New.Target.Message, pipeline.Message) - assert.Equal(t, change.New.Target.Date.Unix(), pipeline.Timestamp) + assert.Equal(t, change.New.Target.Message, pipeline.Commit.Message) } func Test_convertPushHookTag(t *testing.T) { diff --git a/server/forge/bitbucket/internal/client.go b/server/forge/bitbucket/internal/client.go index e7a5a74b05e..6e2be9573e8 100644 --- a/server/forge/bitbucket/internal/client.go +++ b/server/forge/bitbucket/internal/client.go @@ -46,6 +46,7 @@ const ( pathOrgPerms = "%s/2.0/workspaces/%s/permissions?%s" pathPullRequests = "%s/2.0/repositories/%s/%s/pullrequests?%s" pathBranchCommits = "%s/2.0/repositories/%s/%s/commits/%s" + pathCommit = "%s/2.0/repositories/%s/%s/commits/%s" pathDir = "%s/2.0/repositories/%s/%s/src/%s/%s" pageSize = 100 ) @@ -206,6 +207,13 @@ func (c *Client) GetBranchHead(owner, name, branch string) (*Commit, error) { return out.Values[0], nil } +func (c *Client) GetCommit(owner, name, sha string) (*Commit, error) { + out := new(Commit) + uri := fmt.Sprintf(pathCommit, c.base, owner, name, sha) + _, err := c.do(uri, http.MethodGet, nil, out) + return out, err +} + func (c *Client) GetUserWorkspaceMembership(workspace, user string) (string, error) { out := new(WorkspaceMembershipResp) opts := &ListOpts{Page: 1, PageLen: pageSize} diff --git a/server/forge/bitbucket/internal/types.go b/server/forge/bitbucket/internal/types.go index bbb03ab1cae..0ae6bb5c257 100644 --- a/server/forge/bitbucket/internal/types.go +++ b/server/forge/bitbucket/internal/types.go @@ -151,45 +151,9 @@ type PushHook struct { } type PullRequestHook struct { - Actor Account `json:"actor"` - Repo Repo `json:"repository"` - PullRequest struct { - ID int `json:"id"` - Type string `json:"type"` - Reason string `json:"reason"` - Desc string `json:"description"` - Title string `json:"title"` - State string `json:"state"` - Links Links `json:"links"` - Created time.Time `json:"created_on"` - Updated time.Time `json:"updated_on"` - - MergeCommit struct { - Hash string `json:"hash"` - } `json:"merge_commit"` - - Source struct { - Repo Repo `json:"repository"` - Commit struct { - Hash string `json:"hash"` - Links Links `json:"links"` - } `json:"commit"` - Branch struct { - Name string `json:"name"` - } `json:"branch"` - } `json:"source"` - - Dest struct { - Repo Repo `json:"repository"` - Commit struct { - Hash string `json:"hash"` - Links Links `json:"links"` - } `json:"commit"` - Branch struct { - Name string `json:"name"` - } `json:"branch"` - } `json:"destination"` - } `json:"pullrequest"` + Actor Account `json:"actor"` + Repo Repo `json:"repository"` + PullRequest PullRequest `json:"pullrequest"` } type WorkspaceMembershipResp struct { @@ -281,6 +245,30 @@ type PullRequestResp struct { type PullRequest struct { ID uint `json:"id"` Title string `json:"title"` + State string `json:"state"` + Links Links `json:"links"` + + MergeCommit PullRequestCommit `json:"merge_commit"` + + Source struct { + Repo Repo `json:"repository"` + Commit PullRequestCommit `json:"commit"` + Branch struct { + Name string `json:"name"` + } `json:"branch"` + } `json:"source"` + + Dest struct { + Repo Repo `json:"repository"` + Commit PullRequestCommit `json:"commit"` + Branch struct { + Name string `json:"name"` + } `json:"branch"` + } `json:"destination"` +} + +type PullRequestCommit struct { + Hash string `json:"hash"` } type CommitsResp struct { @@ -288,7 +276,11 @@ type CommitsResp struct { } type Commit struct { - Hash string `json:"hash"` + Hash string `json:"hash"` + Message string `json:"message"` + Author struct { + Raw string `json:"raw"` + } Links struct { HTML struct { Href string `json:"href"` diff --git a/server/forge/bitbucket/parse_test.go b/server/forge/bitbucket/parse_test.go index f0afb510287..90d20968d7c 100644 --- a/server/forge/bitbucket/parse_test.go +++ b/server/forge/bitbucket/parse_test.go @@ -121,6 +121,6 @@ func Test_parseHook(t *testing.T) { assert.Equal(t, "martinherren1984/publictestrepo", r.FullName) assert.Equal(t, "https://bitbucket.org/martinherren1984/publictestrepo", r.Clone) assert.Equal(t, "c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", b.Commit) - assert.Equal(t, "a\n", b.Message) + assert.Equal(t, "a\n", b.Commit.Message) }) } diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go index 191eca78511..cbc8e473c26 100644 --- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go +++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go @@ -364,22 +364,28 @@ func (c *client) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b if err != nil { return nil, fmt.Errorf("unable to create bitbucket client: %w", err) } - branches, _, err := bc.Projects.SearchBranches(ctx, r.Owner, r.Name, &bb.BranchSearchOptions{Filter: b}) + commits, _, err := bc.Projects.SearchCommits(ctx, r.Owner, r.Name, &bb.CommitSearchOptions{ + Until: b, + ListOptions: bb.ListOptions{Limit: 1}, + }) if err != nil { return nil, err } - if len(branches) == 0 { + if len(commits) == 0 { return nil, fmt.Errorf("no matching branches returned") } - for _, branch := range branches { - if branch.DisplayID == b { - return &model.Commit{ - SHA: branch.LatestCommit, - ForgeURL: fmt.Sprintf("%s/commits/%s", r.ForgeURL, branch.LatestCommit), - }, nil - } - } - return nil, fmt.Errorf("no matching branches found") + + cm := commits[0] + + return &model.Commit{ + SHA: cm.ID, // TODO check id or displayid? + ForgeURL: fmt.Sprintf("%s/commits/%s", r.ForgeURL, cm.ID), + Message: cm.Message, + Author: model.Author{ + Author: cm.Author.Name, + Email: cm.Author.Email, + }, + }, nil } func (c *client) PullRequests(ctx context.Context, u *model.User, r *model.Repo, p *model.ListOptions) ([]*model.PullRequest, error) { diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index 10ba549990c..aa7b656e83b 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -151,16 +151,25 @@ func Test_convertRepositoryPushEvent(t *testing.T) { }, }, to: &model.Pipeline{ - Commit: "1234567890abcdef", - Branch: "branch", - Message: "", - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - Timestamp: now.UTC().Unix(), - Ref: "refs/head/branch", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPush, + Commit: &model.Commit{ + SHA: "1234567890abcdef", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Message: "", + Author: model.Author{ + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Email: "john.doe@mail.com", + }, + }, + Branch: "branch", + Author: model.Author{ + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Email: "john.doe@mail.com", + }, + Ref: "refs/head/branch", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPush, }, }, } @@ -211,17 +220,19 @@ func Test_convertPullRequestEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: "1234567890abcdef", - Branch: "branch", - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - Timestamp: now.UTC().Unix(), - Ref: "refs/pull-requests/123/from", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPull, - Refspec: "branch:main", - Title: "my title", + Commit: &model.Commit{SHA: "1234567890abcdef"}, + Branch: "branch", + Author: model.Author{ + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Email: "john.doe@mail.com", + }, + + Ref: "refs/pull-requests/123/from", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPull, + Refspec: "branch:main", + PullRequest: &model.PullRequest{Title: "my title"}, }, to) } @@ -266,38 +277,20 @@ func Test_convertPullRequestCloseEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: "1234567890abcdef", - Branch: "branch", - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - Timestamp: now.UTC().Unix(), - Ref: "refs/pull-requests/123/from", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPullClosed, - Refspec: "branch:main", - Title: "my title", - }, to) -} - -func Test_authorLabel(t *testing.T) { - tests := []struct { - from string - to string - }{ - { - from: "Some Short Author", - to: "Some Short Author", + Commit: &model.Commit{SHA: "1234567890abcdef"}, + Branch: "branch", + Author: model.Author{ + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Email: "john.doe@mail.com", }, - { - from: "Some Very Long Author That May Include Multiple Names Here", - //nolint:misspell - to: "Some Very Long Author That May Includ...", - }, - } - for _, tt := range tests { - assert.Equal(t, tt.to, authorLabel(tt.from)) - } + + Ref: "refs/pull-requests/123/from", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPullClosed, + Refspec: "branch:main", + PullRequest: &model.PullRequest{Title: "my title"}, + }, to) } func Test_convertUser(t *testing.T) { diff --git a/server/forge/forgejo/forgejo.go b/server/forge/forgejo/forgejo.go index 9a635df5aef..ba354fef596 100644 --- a/server/forge/forgejo/forgejo.go +++ b/server/forge/forgejo/forgejo.go @@ -326,7 +326,7 @@ func (c *Forgejo) Status(ctx context.Context, user *model.User, repo *model.Repo _, _, err = client.CreateStatus( repo.Owner, repo.Name, - pipeline.Commit, + pipeline.Commit.SHA, forgejo.CreateStatusOption{ State: getStatus(workflow.State), TargetURL: common.GetPipelineStatusURL(repo, pipeline, workflow), @@ -460,6 +460,11 @@ func (c *Forgejo) BranchHead(ctx context.Context, u *model.User, r *model.Repo, return &model.Commit{ SHA: b.Commit.ID, ForgeURL: b.Commit.URL, + Message: b.Commit.Message, + Author: model.Author{ + Author: b.Commit.Author.Name, + Email: b.Commit.Author.Email, + }, }, nil } @@ -496,13 +501,21 @@ func (c *Forgejo) Hook(ctx context.Context, r *http.Request) (*model.Repo, *mode return nil, nil, err } - if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { - tagName := strings.Split(pipeline.Ref, "/")[2] - sha, err := c.getTagCommitSHA(ctx, repo, tagName) - if err != nil { - return nil, nil, err + if pipeline != nil { + if pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { + tagName := strings.Split(pipeline.Ref, "/")[2] + sha, err := c.getTagCommitSHA(ctx, repo, tagName) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha + } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed || pipeline.Event == model.EventTag { + sha, err := c.getCommitFromSHAStore(ctx, repo, pipeline.Commit.SHA) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha } - pipeline.Commit = sha } if pipeline != nil && (pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed) && len(pipeline.ChangedFiles) == 0 { @@ -650,34 +663,74 @@ func (c *Forgejo) getChangedFilesForPR(ctx context.Context, repo *model.Repo, in }, -1) } -func (c *Forgejo) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (string, error) { +func (c *Forgejo) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, error) { _store, ok := store.TryFromContext(ctx) if !ok { - log.Error().Msg("could not get store from context") - return "", nil + return nil, fmt.Errorf("could not get store from context") } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) if err != nil { - return "", err + return nil, err } user, err := _store.GetUser(repo.UserID) if err != nil { - return "", err + return nil, err } client, err := c.newClientToken(ctx, user.AccessToken) if err != nil { - return "", err + return nil, err } tag, _, err := client.GetTag(repo.Owner, repo.Name, tagName) if err != nil { - return "", err + return nil, err + } + + return c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) +} + +func (c *Forgejo) getCommitFromSHAStore(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { + _store, ok := store.TryFromContext(ctx) + if !ok { + return nil, fmt.Errorf("could not get store from context") + } + + repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) + if err != nil { + return nil, err + } + + user, err := _store.GetUser(repo.UserID) + if err != nil { + return nil, err } - return tag.Commit.SHA, nil + return c.getCommitFromSHA(ctx, user, repo, sha) +} + +func (c *Forgejo) getCommitFromSHA(ctx context.Context, user *model.User, repo *model.Repo, sha string) (*model.Commit, error) { + client, err := c.newClientToken(ctx, user.AccessToken) + if err != nil { + return nil, err + } + + commit, _, err := client.GetSingleCommit(repo.Owner, repo.Name, sha) + if err != nil { + return nil, err + } + + return &model.Commit{ + Message: commit.RepoCommit.Message, + Author: model.Author{ + Author: commit.RepoCommit.Author.Name, + Email: commit.RepoCommit.Author.Email, + }, + ForgeURL: commit.HTMLURL, + SHA: commit.SHA, + }, nil } func (c *Forgejo) perPage(ctx context.Context) int { diff --git a/server/forge/forgejo/forgejo_test.go b/server/forge/forgejo/forgejo_test.go index 0dcbc49fb62..a909f87e8d0 100644 --- a/server/forge/forgejo/forgejo_test.go +++ b/server/forge/forgejo/forgejo_test.go @@ -161,7 +161,7 @@ var ( } fakePipeline = &model.Pipeline{ - Commit: "9ecad50", + Commit: &model.Commit{SHA: "9ecad50"}, } fakeWorkflow = &model.Workflow{ diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index decdb389c49..5f97a7ad741 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -74,15 +74,8 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { fixMalformedAvatar(hook.Sender.AvatarURL), ) - var message string link := hook.Compare - if len(hook.Commits) > 0 { - message = hook.Commits[0].Message - if len(hook.Commits) == 1 { - link = hook.Commits[0].URL - } - } else { - message = hook.HeadCommit.Message + if hook.TotalCommits <= 1 { link = hook.HeadCommit.URL } @@ -90,8 +83,12 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { Event: model.EventPush, Commit: &model.Commit{ SHA: hook.After, - Message: message, - ForgeURL: link, + Message: hook.HeadCommit.Message, + ForgeURL: hook.HeadCommit.URL, + Author: model.Author{ + Author: hook.HeadCommit.Author.Name, + Email: hook.HeadCommit.Author.Email, + }, }, Ref: hook.Ref, ForgeURL: link, diff --git a/server/forge/forgejo/helper_test.go b/server/forge/forgejo/helper_test.go index b7414a504f7..a3973de9f80 100644 --- a/server/forge/forgejo/helper_test.go +++ b/server/forge/forgejo/helper_test.go @@ -70,8 +70,8 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, hook.Ref, pipeline.Ref) assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) - assert.Equal(t, hook.Commits[0].Message, pipeline.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, hook.Commits[0].Message, pipeline.Commit.Message) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) assert.Equal(t, hook.Sender.UserName, pipeline.Author) assert.Equal(t, []string{"CHANGELOG.md", "app/controller/application.rb"}, pipeline.ChangedFiles) }) @@ -95,7 +95,6 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) assert.Empty(t, pipeline.Branch) assert.Equal(t, "http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0", pipeline.ForgeURL) - assert.Equal(t, "created tag v1.0.0", pipeline.Message) }) } @@ -136,8 +135,8 @@ func Test_parsePullRequest(t *testing.T) { assert.Equal(t, "http://forgejo.golang.org/gordon/hello-world/pull/1", pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) - assert.Equal(t, hook.PullRequest.Title, pipeline.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 38324d3941b..8ac21d39b65 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -63,14 +63,23 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "6543", - Event: "push", - Commit: "28c3613ae62640216bea5e7dc71aa65356e4298b", - Branch: "fdsafdsa", - Ref: "refs/heads/fdsafdsa", - Sender: "6543", - Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", - Email: "6543@obermui.de", + Event: "push", + Commit: &model.Commit{ + SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", + Author: model.Author{ + Author: "6543", + Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", + Email: "6543@obermui.de", + }, + ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", + }, + Branch: "fdsafdsa", + Ref: "refs/heads/fdsafdsa", + Author: model.Author{ + Author: "6543", + Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", + Email: "6543@obermui.de", + }, ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", ChangedFiles: []string{".woodpecker/.check.yml"}, }, @@ -96,14 +105,23 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "push", - Commit: "ef98532add3b2feb7a137426bba1248724367df5", - Branch: "main", - Ref: "refs/heads/main", - Sender: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", + Event: "push", + Commit: &model.Commit{ + SHA: "ef98532add3b2feb7a137426bba1248724367df5", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, + ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + }, + Branch: "main", + Ref: "refs/heads/main", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", ChangedFiles: []string{"CHANGELOG.md", "app/controller/application.rb"}, }, @@ -129,14 +147,15 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "test-user", - Event: "push", - Commit: "29be01c073851cf0db0c6a466e396b725a670453", - Branch: "main", - Ref: "refs/heads/main", - Sender: "test-user", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", + Event: "push", + Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Branch: "main", + Ref: "refs/heads/main", + Author: model.Author{ + Author: "test-user", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", + Email: "test@noreply.localhost", + }, ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/compare/6efcf5b7c98f3e7a491675164b7a2e7acac27941...29be01c073851cf0db0c6a466e396b725a670453", ChangedFiles: []string{"aaa", "aa"}, }, @@ -163,13 +182,14 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "tag", - Commit: "ef98532add3b2feb7a137426bba1248724367df5", - Ref: "refs/tags/v1.0.0", - Sender: "gordon", - Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", + Event: "tag", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Ref: "refs/tags/v1.0.0", + Author: model.Author{ + Author: "gordon", + Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, ForgeURL: "http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0", }, }, @@ -195,17 +215,20 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "gordon", - Event: "pull_request", - Commit: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "feature/changes:main", - Sender: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - ForgeURL: "http://forgejo.golang.org/gordon/hello-world/pull/1", - PullRequestLabels: []string{}, + Event: "pull_request", + Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "feature/changes:main", + Author: model.Author{ + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Email: "gordon@golang.org", + }, + ForgeURL: "http://forgejo.golang.org/gordon/hello-world/pull/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -231,19 +254,22 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "test", - Event: "pull_request", - Commit: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25", - Branch: "main", - Ref: "refs/pull/2/head", - Refspec: "test-patch-1:main", - Sender: "test", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", + Event: "pull_request", + Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, + Branch: "main", + Ref: "refs/pull/2/head", + Refspec: "test-patch-1:main", + Author: model.Author{ + Author: "test", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", + Email: "test@noreply.localhost", + }, ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", - PullRequestLabels: []string{ - "Kind/Bug", - "Kind/Security", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{ + "Kind/Bug", + "Kind/Security", + }, }, }, }, @@ -269,17 +295,20 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "pull_request_closed", - Commit: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Sender: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@sender.forgejo.com", - ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", - PullRequestLabels: []string{}, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: model.Author{ + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", + Email: "anbraten@sender.forgejo.com", + }, + ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -304,17 +333,20 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "pull_request_closed", - Commit: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4", - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Sender: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@noreply.forgejo.com", - ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", - PullRequestLabels: []string{}, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: model.Author{ + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", + Email: "anbraten@noreply.forgejo.com", + }, + ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", + PullRequest: &model.PullRequest{ + PullRequestLabels: []string{}, + }, }, }, { @@ -340,13 +372,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Author: "anbraten", - Event: "release", - Branch: "main", - Ref: "refs/tags/0.0.5", - Sender: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - Email: "anbraten@noreply.xxx", + Event: "release", + Branch: "main", + Ref: "refs/tags/0.0.5", Author: model.Author{ + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + Email: "anbraten@noreply.xxx", + }, ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", }, }, diff --git a/server/forge/forgejo/types.go b/server/forge/forgejo/types.go index 4e19f55d609..f49531faf86 100644 --- a/server/forge/forgejo/types.go +++ b/server/forge/forgejo/types.go @@ -28,7 +28,8 @@ type pushHook struct { Repo *forgejo.Repository `json:"repository"` - Commits []forgejo.PayloadCommit `json:"commits"` + TotalCommits int `json:"total_commits"` + Commits []forgejo.PayloadCommit `json:"commits"` HeadCommit forgejo.PayloadCommit `json:"head_commit"` diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index 634ccf2a24d..c4df9269c8a 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -462,6 +462,11 @@ func (c *Gitea) BranchHead(ctx context.Context, u *model.User, r *model.Repo, br return &model.Commit{ SHA: b.Commit.ID, ForgeURL: b.Commit.URL, + Message: b.Commit.Message, + Author: model.Author{ + Author: b.Commit.Author.Name, + Email: b.Commit.Author.Email, + }, }, nil } @@ -503,15 +508,20 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model. return nil, nil, err } - if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { - tagName := strings.Split(pipeline.Ref, "/")[2] - sha, err := c.getTagCommitSHA(ctx, repo, tagName) - if err != nil { - return nil, nil, err - } - pipeline.Commit = &model.Commit{ - SHA: sha.SHA, - ForgeURL: sha.URL, + if pipeline != nil { + if pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { + tagName := strings.Split(pipeline.Ref, "/")[2] + sha, err := c.getTagCommitSHA(ctx, repo, tagName) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha + } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed || pipeline.Event == model.EventTag { + sha, err := c.getCommitFromSHAStore(ctx, repo, pipeline.Commit.SHA) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha } } @@ -660,11 +670,10 @@ func (c *Gitea) getChangedFilesForPR(ctx context.Context, repo *model.Repo, inde }, -1) } -func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*gitea.CommitMeta, error) { +func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, error) { _store, ok := store.TryFromContext(ctx) if !ok { - log.Error().Msg("could not get store from context") - return nil, nil + return nil, fmt.Errorf("could not get store from context") } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) @@ -687,7 +696,48 @@ func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName s return nil, err } - return tag.Commit, nil + return c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) +} + +func (c *Gitea) getCommitFromSHAStore(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { + _store, ok := store.TryFromContext(ctx) + if !ok { + return nil, fmt.Errorf("could not get store from context") + } + + repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) + if err != nil { + return nil, err + } + + user, err := _store.GetUser(repo.UserID) + if err != nil { + return nil, err + } + + return c.getCommitFromSHA(ctx, user, repo, sha) +} + +func (c *Gitea) getCommitFromSHA(ctx context.Context, user *model.User, repo *model.Repo, sha string) (*model.Commit, error) { + client, err := c.newClientToken(ctx, user.AccessToken) + if err != nil { + return nil, err + } + + commit, _, err := client.GetSingleCommit(repo.Owner, repo.Name, sha) + if err != nil { + return nil, err + } + + return &model.Commit{ + Message: commit.RepoCommit.Message, + Author: model.Author{ + Author: commit.RepoCommit.Author.Name, + Email: commit.RepoCommit.Author.Email, + }, + ForgeURL: commit.HTMLURL, + SHA: commit.SHA, + }, nil } func (c *Gitea) perPage(ctx context.Context) int { diff --git a/server/forge/gitea/gitea_test.go b/server/forge/gitea/gitea_test.go index 1892c5fcc93..8185f58bb9b 100644 --- a/server/forge/gitea/gitea_test.go +++ b/server/forge/gitea/gitea_test.go @@ -162,7 +162,7 @@ var ( } fakePipeline = &model.Pipeline{ - Commit: "9ecad50", + Commit: &model.Commit{SHA: "9ecad50"}, } fakeWorkflow = &model.Workflow{ diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 734322f07c2..bfd5699b6d0 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -75,15 +75,8 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { fixMalformedAvatar(hook.Sender.AvatarURL), ) - var message string link := hook.Compare - if len(hook.Commits) > 0 { - message = hook.Commits[0].Message - if len(hook.Commits) == 1 { - link = hook.Commits[0].URL - } - } else { - message = hook.HeadCommit.Message + if hook.TotalCommits <= 1 { link = hook.HeadCommit.URL } @@ -91,8 +84,12 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { Event: model.EventPush, Commit: &model.Commit{ SHA: hook.After, - ForgeURL: link, - Message: message, + Message: hook.HeadCommit.Message, + ForgeURL: hook.HeadCommit.URL, + Author: model.Author{ + Author: hook.HeadCommit.Author.Name, + Email: hook.HeadCommit.Author.Email, + }, }, Ref: hook.Ref, ForgeURL: link, @@ -133,9 +130,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { return &model.Pipeline{ Event: model.EventTag, Commit: &model.Commit{ - SHA: hook.Sha, - ForgeURL: hook.HeadCommit.URL, - Message: hook.HeadCommit.Message, + SHA: hook.Sha, }, Ref: fmt.Sprintf("refs/tags/%s", ref), ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), @@ -177,7 +172,7 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { hook.PullRequest.Base.Ref, ), PullRequest: &model.PullRequest{ - Index: model.ForgeRemoteID(hook.Number), + Index: model.ForgeRemoteID(fmt.Sprint(hook.Number)), PullRequestLabels: convertLabels(hook.PullRequest.Labels), FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, Title: hook.PullRequest.Title, diff --git a/server/forge/gitea/helper_test.go b/server/forge/gitea/helper_test.go index b728699ae64..4d8b9be7073 100644 --- a/server/forge/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -71,8 +71,8 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, hook.Ref, pipeline.Ref) assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) - assert.Equal(t, hook.Commits[0].Message, pipeline.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, hook.Commits[0].Message, pipeline.Commit.Message) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) assert.Equal(t, hook.Sender.UserName, pipeline.Author) assert.Equal(t, []string{"CHANGELOG.md", "app/controller/application.rb"}, pipeline.ChangedFiles) }) @@ -96,7 +96,6 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) assert.Empty(t, pipeline.Branch) assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0", pipeline.ForgeURL) - assert.Equal(t, "created tag v1.0.0", pipeline.Message) }) } @@ -137,8 +136,8 @@ func Test_parsePullRequest(t *testing.T) { assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/pull/1", pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) - assert.Equal(t, hook.PullRequest.Title, pipeline.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/gitea/types.go b/server/forge/gitea/types.go index 2c27a324b90..4a617c2dc3c 100644 --- a/server/forge/gitea/types.go +++ b/server/forge/gitea/types.go @@ -29,7 +29,8 @@ type pushHook struct { Repo *gitea.Repository `json:"repository"` - Commits []gitea.PayloadCommit `json:"commits"` + TotalCommits int `json:"total_commits"` + Commits []gitea.PayloadCommit `json:"commits"` HeadCommit gitea.PayloadCommit `json:"head_commit"` diff --git a/server/forge/github/convert.go b/server/forge/github/convert.go index d76002ab3d0..4debbbde1a7 100644 --- a/server/forge/github/convert.go +++ b/server/forge/github/convert.go @@ -168,3 +168,15 @@ func convertLabels(from []*github.Label) []string { } return labels } + +func convertCommit(from *github.Commit) *model.Commit { + return &model.Commit{ + SHA: from.GetSHA(), + ForgeURL: from.GetHTMLURL(), + Message: from.GetMessage(), + Author: model.Author{ + Author: from.GetAuthor().GetName(), + Email: from.GetAuthor().GetEmail(), + }, + } +} diff --git a/server/forge/github/convert_test.go b/server/forge/github/convert_test.go index 816cec9d075..5c6e1f8d5bc 100644 --- a/server/forge/github/convert_test.go +++ b/server/forge/github/convert_test.go @@ -193,11 +193,10 @@ func Test_parsePullHook(t *testing.T) { assert.Equal(t, "refs/pull/42/merge", pipeline.Ref) assert.Equal(t, "changes:main", pipeline.Refspec) assert.Equal(t, *from.PullRequest.Head.SHA, pipeline.Commit) - assert.Equal(t, *from.PullRequest.Title, pipeline.Message) - assert.Equal(t, *from.PullRequest.Title, pipeline.Title) + assert.Equal(t, *from.PullRequest.Title, pipeline.PullRequest.Title) assert.Equal(t, *from.PullRequest.User.Login, pipeline.Author) - assert.Equal(t, *from.PullRequest.User.AvatarURL, pipeline.Avatar) - assert.Equal(t, *from.Sender.Login, pipeline.Sender) + assert.Equal(t, *from.PullRequest.User.AvatarURL, pipeline.Author.Avatar) + assert.Equal(t, *from.Sender.Login, pipeline.Author.Author) } func Test_parseDeployHook(t *testing.T) { @@ -217,10 +216,10 @@ func Test_parseDeployHook(t *testing.T) { assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "refs/heads/main", pipeline.Ref) assert.Equal(t, *from.Deployment.SHA, pipeline.Commit) - assert.Equal(t, *from.Deployment.Description, pipeline.Message) + assert.Equal(t, *from.Deployment.Description, pipeline.Deployment.Description) assert.Equal(t, *from.Deployment.URL, pipeline.ForgeURL) assert.Equal(t, *from.Sender.Login, pipeline.Author) - assert.Equal(t, *from.Sender.AvatarURL, pipeline.Avatar) + assert.Equal(t, *from.Sender.AvatarURL, pipeline.Author.Avatar) } func Test_parsePushHook(t *testing.T) { @@ -240,11 +239,11 @@ func Test_parsePushHook(t *testing.T) { assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "refs/heads/main", pipeline.Ref) assert.Equal(t, *from.HeadCommit.ID, pipeline.Commit) - assert.Equal(t, *from.HeadCommit.Message, pipeline.Message) + assert.Equal(t, *from.HeadCommit.Message, pipeline.Commit.Message) assert.Equal(t, *from.HeadCommit.URL, pipeline.ForgeURL) assert.Equal(t, *from.Sender.Login, pipeline.Author) - assert.Equal(t, *from.Sender.AvatarURL, pipeline.Avatar) - assert.Equal(t, *from.HeadCommit.Author.Email, pipeline.Email) + assert.Equal(t, *from.Sender.AvatarURL, pipeline.Author.Avatar) + assert.Equal(t, *from.HeadCommit.Author.Email, pipeline.Commit.Author.Email) }) t.Run("convert tag from webhook", func(t *testing.T) { diff --git a/server/forge/github/github.go b/server/forge/github/github.go index 31ad44c3a34..0c02e2bcbb4 100644 --- a/server/forge/github/github.go +++ b/server/forge/github/github.go @@ -252,7 +252,7 @@ func (c *client) File(ctx context.Context, u *model.User, r *model.Repo, b *mode client := c.newClientToken(ctx, u.AccessToken) opts := new(github.RepositoryContentGetOptions) - opts.Ref = b.Commit + opts.Ref = b.Commit.SHA content, _, resp, err := client.Repositories.GetContents(ctx, r.Owner, r.Name, f, opts) if resp != nil && resp.StatusCode == http.StatusNotFound { return nil, errors.Join(err, &forge_types.ErrConfigNotFound{Configs: []string{f}}) @@ -271,7 +271,7 @@ func (c *client) Dir(ctx context.Context, u *model.User, r *model.Repo, b *model client := c.newClientToken(ctx, u.AccessToken) opts := new(github.RepositoryContentGetOptions) - opts.Ref = b.Commit + opts.Ref = b.Commit.SHA _, data, resp, err := client.Repositories.GetContents(ctx, r.Owner, r.Name, f, opts) if resp != nil && resp.StatusCode == http.StatusNotFound { return nil, errors.Join(err, &forge_types.ErrConfigNotFound{Configs: []string{f}}) @@ -536,7 +536,7 @@ func (c *client) Status(ctx context.Context, user *model.User, repo *model.Repo, return err } - _, _, err := client.Repositories.CreateStatus(ctx, repo.Owner, repo.Name, pipeline.Commit, &github.RepoStatus{ + _, _, err := client.Repositories.CreateStatus(ctx, repo.Owner, repo.Name, pipeline.Commit.SHA, &github.RepoStatus{ Context: github.Ptr(common.GetPipelineStatusContext(repo, pipeline, workflow)), State: github.Ptr(convertStatus(workflow.State)), Description: github.Ptr(common.GetPipelineStatusDescription(workflow.State)), @@ -594,10 +594,7 @@ func (c *client) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b if err != nil { return nil, err } - return &model.Commit{ - SHA: b.GetCommit().GetSHA(), - ForgeURL: b.GetCommit().GetHTMLURL(), - }, nil + return convertCommit(b.GetCommit().GetCommit()), nil } // Hook parses the post-commit hook from the Request body @@ -608,13 +605,21 @@ func (c *client) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model return nil, nil, err } - if pipeline != nil && pipeline.Event == model.EventRelease && pipeline.Commit == "" { - tagName := strings.Split(pipeline.Ref, "/")[2] - sha, err := c.getTagCommitSHA(ctx, repo, tagName) - if err != nil { - return nil, nil, err + if pipeline != nil { + if pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { + tagName := strings.Split(pipeline.Ref, "/")[2] + sha, err := c.getTagCommitSHA(ctx, repo, tagName) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha + } else if pipeline.Event == model.EventDeploy || pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed { + sha, err := c.getCommitFromSHA(ctx, repo, pipeline.Commit.SHA) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha } - pipeline.Commit = sha } if pull != nil && len(pipeline.ChangedFiles) == 0 { @@ -665,21 +670,20 @@ func (c *client) loadChangedFilesFromPullRequest(ctx context.Context, pull *gith return pipeline, err } -func (c *client) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (string, error) { +func (c *client) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, error) { _store, ok := store.TryFromContext(ctx) if !ok { - log.Error().Msg("could not get store from context") - return "", nil + return nil, fmt.Errorf("could not get store from context") } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) if err != nil { - return "", err + return nil, err } user, err := _store.GetUser(repo.UserID) if err != nil { - return "", err + return nil, err } gh := c.newClientToken(ctx, user.AccessToken) @@ -689,7 +693,7 @@ func (c *client) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName for { tags, _, err := gh.Repositories.ListTags(ctx, repo.Owner, repo.Name, &github.ListOptions{Page: page}) if err != nil { - return "", err + return nil, err } for _, t := range tags { @@ -703,7 +707,33 @@ func (c *client) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName } } if tag == nil { - return "", fmt.Errorf("could not find tag %s", tagName) + return nil, fmt.Errorf("could not find tag %s", tagName) + } + return convertCommit(tag.GetCommit()), nil +} + +func (c *client) getCommitFromSHA(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { + _store, ok := store.TryFromContext(ctx) + if !ok { + return nil, fmt.Errorf("could not get store from context") } - return tag.GetCommit().GetSHA(), nil + + repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) + if err != nil { + return nil, err + } + + user, err := _store.GetUser(repo.UserID) + if err != nil { + return nil, err + } + + gh := c.newClientToken(ctx, user.AccessToken) + + commit, _, err := gh.Repositories.GetCommit(ctx, repo.Owner, repo.Name, sha, nil) + if err != nil { + return nil, err + } + + return convertCommit(commit.GetCommit()), nil } diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index f52ee3cb87e..53cf0151d46 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -87,9 +87,10 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { pipeline := &model.Pipeline{ Event: model.EventPush, Commit: &model.Commit{ - SHA: hook.GetHeadCommit().GetID(), - Author: convertCommitAuthor(hook.GetHeadCommit().GetAuthor()), - Message: hook.GetHeadCommit().GetMessage(), + SHA: hook.GetHeadCommit().GetID(), + Author: convertCommitAuthor(hook.GetHeadCommit().GetAuthor()), + Message: hook.GetHeadCommit().GetMessage(), + ForgeURL: hook.GetHeadCommit().GetURL(), }, Ref: hook.GetRef(), ForgeURL: hook.GetHeadCommit().GetURL(), diff --git a/server/forge/github/parse_test.go b/server/forge/github/parse_test.go index a48f0ff5abd..3b3220b8b9b 100644 --- a/server/forge/github/parse_test.go +++ b/server/forge/github/parse_test.go @@ -111,8 +111,8 @@ func Test_parseHook(t *testing.T) { assert.NotNil(t, b) assert.Nil(t, p) assert.Equal(t, model.EventDeploy, b.Event) - assert.Equal(t, "production", b.DeployTo) - assert.Equal(t, "deploy", b.DeployTask) + assert.Equal(t, "production", b.Deployment.Target) + assert.Equal(t, "deploy", b.Deployment.Task) }) t.Run("release hook", func(t *testing.T) { diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 2eb335787b7..ee58d25f541 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -126,6 +126,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * Author: lastCommit.Author.Name, Email: lastCommit.Author.Email, }, + ForgeURL: lastCommit.URL, } pipeline.Ref = fmt.Sprintf(mergeRefs, obj.IID) @@ -188,6 +189,7 @@ func convertPushHook(hook *gitlab.PushEvent) (*model.Repo, *model.Pipeline, erro if hook.After == cm.ID { pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} pipeline.Commit.Message = cm.Message + pipeline.Commit.ForgeURL = cm.URL } files = append(files, cm.Added...) @@ -237,10 +239,12 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) Avatar: hook.UserAvatar, } + // TODO does hook.Commits always contain hook.After? for _, cm := range hook.Commits { if hook.After == cm.ID { pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} pipeline.Commit.Message = cm.Message + pipeline.Commit.ForgeURL = cm.URL break } } @@ -276,7 +280,8 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline Author: hook.Commit.Author.Name, Email: hook.Commit.Author.Email, }, - Message: hook.Commit.Message, + Message: hook.Commit.Message, + ForgeURL: hook.Commit.URL, }, ForgeURL: hook.URL, ReleaseTitle: hook.Name, diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index dbaf57007fb..2f29dafa443 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -621,6 +621,8 @@ func (g *GitLab) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b return &model.Commit{ SHA: b.Commit.ID, ForgeURL: b.Commit.WebURL, + Message: b.Commit.Message, + Author: model.Author{Author: b.Commit.AuthorName, Email: b.Commit.AuthorEmail}, }, nil } diff --git a/server/forge/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go index 876696ca7e4..23238417713 100644 --- a/server/forge/gitlab/gitlab_test.go +++ b/server/forge/gitlab/gitlab_test.go @@ -183,7 +183,7 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker", hookRepo.Name) - assert.Equal(t, "Update client.go 🎉", pipeline.Title) + assert.Equal(t, "Update client.go 🎉", pipeline.PullRequest.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPull, pipeline.Event) } @@ -234,7 +234,7 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker-test", hookRepo.Name) - assert.Equal(t, "Add new file", pipeline.Title) + assert.Equal(t, "Add new file", pipeline.PullRequest.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPullClosed, pipeline.Event) } @@ -255,7 +255,7 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "main", hookRepo.Branch) assert.Equal(t, "anbraten", hookRepo.Owner) assert.Equal(t, "woodpecker-test", hookRepo.Name) - assert.Equal(t, "Add new file", pipeline.Title) + assert.Equal(t, "Add new file", pipeline.PullRequest.Title) assert.Len(t, pipeline.ChangedFiles, 0) // see L217 assert.Equal(t, model.EventPullClosed, pipeline.Event) } @@ -274,7 +274,7 @@ func Test_GitLab(t *testing.T) { if assert.NotNil(t, hookRepo) && assert.NotNil(t, pipeline) { assert.Equal(t, "refs/tags/0.0.2", pipeline.Ref) assert.Equal(t, "ci", hookRepo.Name) - assert.Equal(t, "created release Awesome version 0.0.2", pipeline.Message) + assert.Equal(t, "Awesome version 0.0.2", pipeline.ReleaseTitle) assert.Equal(t, model.EventRelease, pipeline.Event) } }) diff --git a/server/pipeline/gated_test.go b/server/pipeline/gated_test.go index 76004ff3d91..fd70ea71d4b 100644 --- a/server/pipeline/gated_test.go +++ b/server/pipeline/gated_test.go @@ -43,8 +43,8 @@ func TestSetGatedState(t *testing.T) { RequireApproval: model.RequireApprovalForks, }, pipeline: &model.Pipeline{ - Event: model.EventPull, - FromFork: true, + Event: model.EventPull, + PullRequest: &model.PullRequest{FromFork: true}, }, expectBlocked: true, }, @@ -54,8 +54,8 @@ func TestSetGatedState(t *testing.T) { RequireApproval: model.RequireApprovalPullRequests, }, pipeline: &model.Pipeline{ - Event: model.EventPull, - FromFork: false, + Event: model.EventPull, + PullRequest: &model.PullRequest{FromFork: false}, }, expectBlocked: true, }, diff --git a/server/services/config/combined_test.go b/server/services/config/combined_test.go index 6097f980512..a953e5168da 100644 --- a/server/services/config/combined_test.go +++ b/server/services/config/combined_test.go @@ -222,7 +222,7 @@ func TestFetchFromConfigService(t *testing.T) { f, &model.User{AccessToken: "xxx"}, repo, - &model.Pipeline{Commit: "89ab7b2d6bfb347144ac7c557e638ab402848fee"}, + &model.Pipeline{Commit: &model.Commit{SHA: "89ab7b2d6bfb347144ac7c557e638ab402848fee"}}, []*forge_types.FileMeta{}, false, ) diff --git a/server/services/config/forge_test.go b/server/services/config/forge_test.go index 898d511e4e2..4f65a4fba43 100644 --- a/server/services/config/forge_test.go +++ b/server/services/config/forge_test.go @@ -314,7 +314,7 @@ func TestFetch(t *testing.T) { f, &model.User{AccessToken: "xxx"}, repo, - &model.Pipeline{Commit: "89ab7b2d6bfb347144ac7c557e638ab402848fee"}, + &model.Pipeline{Commit: &model.Commit{SHA: "89ab7b2d6bfb347144ac7c557e638ab402848fee"}}, nil, false, ) diff --git a/server/store/datastore/config_test.go b/server/store/datastore/config_test.go index 81a0114d0ef..fbeaa76fac7 100644 --- a/server/store/datastore/config_test.go +++ b/server/store/datastore/config_test.go @@ -53,7 +53,7 @@ func TestConfig(t *testing.T) { pipeline := &model.Pipeline{ RepoID: repo.ID, Status: model.StatusRunning, - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144ac"}, } assert.NoError(t, store.CreatePipeline(pipeline)) diff --git a/server/store/datastore/pipeline_test.go b/server/store/datastore/pipeline_test.go index fed95149b2e..de240054152 100644 --- a/server/store/datastore/pipeline_test.go +++ b/server/store/datastore/pipeline_test.go @@ -54,7 +54,7 @@ func TestPipelines(t *testing.T) { pipeline = model.Pipeline{ RepoID: repo.ID, Status: model.StatusSuccess, - Commit: "85f8c029b902ed9400bc600bac301a0aadb144ac", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144ac"}, Branch: "some-branch", } err = store.CreatePipeline(&pipeline) @@ -109,7 +109,7 @@ func TestPipelines(t *testing.T) { RepoID: repo.ID, Status: model.StatusRunning, Branch: "main", - Commit: "85f8c029b902ed9400bc600bac301a0aadb144aa", + Commit: &model.Commit{SHA: "85f8c029b902ed9400bc600bac301a0aadb144ac"}, } err1 = store.CreatePipeline(pipeline3, []*model.Step{}...) assert.NoError(t, err1) From 8d6611118419a8cddc5d9b1333900c690750ae3b Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 2 Jan 2025 18:16:42 +0200 Subject: [PATCH 04/30] make author a pure commit author --- cli/exec/flags.go | 10 -- cli/exec/metadata.go | 2 - pipeline/frontend/metadata/environment.go | 2 - pipeline/frontend/metadata/types.go | 5 +- server/api/pipeline.go | 7 +- server/forge/bitbucket/convert.go | 19 +-- server/forge/bitbucket/convert_test.go | 4 +- .../bitbucketdatacenter.go | 4 +- server/forge/bitbucketdatacenter/convert.go | 18 +-- .../forge/bitbucketdatacenter/convert_test.go | 31 ++-- server/forge/forgejo/forgejo.go | 4 +- server/forge/forgejo/helper.go | 36 ++--- server/forge/forgejo/helper_test.go | 4 +- server/forge/forgejo/parse_test.go | 133 +++++++----------- server/forge/gitea/gitea.go | 4 +- server/forge/gitea/helper.go | 36 ++--- server/forge/gitea/helper_test.go | 4 +- server/forge/gitea/parse_test.go | 127 +++++++---------- server/forge/github/convert.go | 2 +- server/forge/github/convert_test.go | 8 +- server/forge/github/parse.go | 24 ++-- server/forge/gitlab/convert.go | 38 ++--- server/forge/gitlab/gitlab.go | 2 +- server/model/commit.go | 10 +- server/model/pipeline.go | 11 +- server/pipeline/stepbuilder/metadata.go | 5 +- 26 files changed, 208 insertions(+), 342 deletions(-) diff --git a/cli/exec/flags.go b/cli/exec/flags.go index 10518d32b85..b8e92e9442d 100644 --- a/cli/exec/flags.go +++ b/cli/exec/flags.go @@ -270,11 +270,6 @@ var flags = []cli.Flag{ Name: "commit-author-name", Usage: "Set the metadata environment variable \"CI_COMMIT_AUTHOR\".", }, - &cli.StringFlag{ - Sources: cli.EnvVars("CI_COMMIT_AUTHOR_AVATAR"), - Name: "commit-author-avatar", - Usage: "Set the metadata environment variable \"CI_COMMIT_AUTHOR_AVATAR\".", - }, &cli.StringFlag{ Sources: cli.EnvVars("CI_COMMIT_AUTHOR_EMAIL"), Name: "commit-author-email", @@ -365,11 +360,6 @@ var flags = []cli.Flag{ Name: "prev-commit-author-name", Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_AUTHOR\".", }, - &cli.StringFlag{ - Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_AVATAR"), - Name: "prev-commit-author-avatar", - Usage: "Set the metadata environment variable \"CI_PREV_COMMIT_AUTHOR_AVATAR\".", - }, &cli.StringFlag{ Sources: cli.EnvVars("CI_PREV_COMMIT_AUTHOR_EMAIL"), Name: "prev-commit-author-email", diff --git a/cli/exec/metadata.go b/cli/exec/metadata.go index 8664ec2c4f4..4ee188d8175 100644 --- a/cli/exec/metadata.go +++ b/cli/exec/metadata.go @@ -106,7 +106,6 @@ func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis, w metadataFileAndOverrideOrDefault(c, "commit-message", func(s string) { m.Curr.Commit.Message = s }, c.String) metadataFileAndOverrideOrDefault(c, "commit-author-name", func(s string) { m.Curr.Commit.Author.Name = s }, c.String) metadataFileAndOverrideOrDefault(c, "commit-author-email", func(s string) { m.Curr.Commit.Author.Email = s }, c.String) - metadataFileAndOverrideOrDefault(c, "commit-author-avatar", func(s string) { m.Curr.Commit.Author.Avatar = s }, c.String) metadataFileAndOverrideOrDefault(c, "commit-pull-labels", func(sl []string) { m.Curr.Commit.PullRequestLabels = sl }, c.StringSlice) metadataFileAndOverrideOrDefault(c, "commit-release-is-pre", func(b bool) { m.Curr.Commit.IsPrerelease = b }, c.Bool) @@ -128,7 +127,6 @@ func metadataFromContext(_ context.Context, c *cli.Command, axis matrix.Axis, w metadataFileAndOverrideOrDefault(c, "prev-commit-message", func(s string) { m.Prev.Commit.Message = s }, c.String) metadataFileAndOverrideOrDefault(c, "prev-commit-author-name", func(s string) { m.Prev.Commit.Author.Name = s }, c.String) metadataFileAndOverrideOrDefault(c, "prev-commit-author-email", func(s string) { m.Prev.Commit.Author.Email = s }, c.String) - metadataFileAndOverrideOrDefault(c, "prev-commit-author-avatar", func(s string) { m.Prev.Commit.Author.Avatar = s }, c.String) // Workflow metadataFileAndOverrideOrDefault(c, "workflow-name", func(s string) { m.Workflow.Name = s }, c.String) diff --git a/pipeline/frontend/metadata/environment.go b/pipeline/frontend/metadata/environment.go index d95ac8762b3..71f87ce77d5 100644 --- a/pipeline/frontend/metadata/environment.go +++ b/pipeline/frontend/metadata/environment.go @@ -93,7 +93,6 @@ func (m *Metadata) Environ() map[string]string { setNonEmptyEnvVar(params, "CI_COMMIT_BRANCH", commit.Branch) setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR", commit.Author.Name) setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR_EMAIL", commit.Author.Email) - setNonEmptyEnvVar(params, "CI_COMMIT_AUTHOR_AVATAR", commit.Author.Avatar) if pipeline.Event == EventTag || pipeline.Event == EventRelease || strings.HasPrefix(pipeline.Commit.Ref, "refs/tags/") { setNonEmptyEnvVar(params, "CI_COMMIT_TAG", strings.TrimPrefix(pipeline.Commit.Ref, "refs/tags/")) } @@ -143,7 +142,6 @@ func (m *Metadata) Environ() map[string]string { setNonEmptyEnvVar(params, "CI_PREV_COMMIT_BRANCH", prevCommit.Branch) setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR", prevCommit.Author.Name) setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR_EMAIL", prevCommit.Author.Email) - setNonEmptyEnvVar(params, "CI_PREV_COMMIT_AUTHOR_AVATAR", prevCommit.Author.Avatar) if prevPipeline.Event == EventPull || prevPipeline.Event == EventPullClosed { prevSourceBranch, prevTargetBranch := getSourceTargetBranches(prevCommit.Refspec) setNonEmptyEnvVar(params, "CI_PREV_COMMIT_SOURCE_BRANCH", prevSourceBranch) diff --git a/pipeline/frontend/metadata/types.go b/pipeline/frontend/metadata/types.go index af415e8bce1..9985fe21ea2 100644 --- a/pipeline/frontend/metadata/types.go +++ b/pipeline/frontend/metadata/types.go @@ -73,9 +73,8 @@ type ( // Author defines runtime metadata for a commit author. Author struct { - Name string `json:"name,omitempty"` - Email string `json:"email,omitempty"` - Avatar string `json:"avatar,omitempty"` + Name string `json:"name,omitempty"` + Email string `json:"email,omitempty"` } // Workflow defines runtime metadata for a workflow. diff --git a/server/api/pipeline.go b/server/api/pipeline.go index 7a98cf6eeac..d4b9370b00b 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -92,11 +92,8 @@ func createTmpPipeline(event model.WebhookEvent, commit *model.Commit, user *mod Ref: opts.Branch, AdditionalVariables: opts.Variables, - Author: model.Author{ - Author: user.Login, - Avatar: user.Avatar, - Email: user.Email, - }, + Author: user.Login, + Avatar: user.Avatar, ForgeURL: commit.ForgeURL, } diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go index a383e4fb3aa..a5d26256ad0 100644 --- a/server/forge/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -177,7 +177,8 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { ForgeURL: from.PullRequest.Links.HTML.Href, Branch: from.PullRequest.Source.Branch.Name, - Author: convertAuthor(from.Actor), + Author: from.Actor.Login, + Avatar: from.Actor.Links.Avatar.Href, PullRequest: &model.PullRequest{ FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, Title: from.PullRequest.Title, @@ -207,7 +208,8 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi }, ForgeURL: change.New.Target.Links.HTML.Href, Branch: change.New.Name, - Author: convertAuthor(hook.Actor), + Author: hook.Actor.Login, + Avatar: hook.Actor.Links.Avatar.Href, } switch change.New.Type { case "tag", "annotated_tag", "bookmark": @@ -224,20 +226,13 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi var reGitMail = regexp.MustCompile("(.*) <(.*)>") // extracts the email from a git commit author string. -func convertCommitAuthor(gitAuthor string) model.Author { +func convertCommitAuthor(gitAuthor string) model.CommitAuthor { matches := reGitMail.FindAllStringSubmatch(gitAuthor, -1) if len(matches) == 1 { - return model.Author{ + return model.CommitAuthor{ Author: matches[0][1], Email: matches[0][2], } } - return model.Author{} -} - -func convertAuthor(a internal.Account) model.Author { - return model.Author{ - Author: a.Login, - Avatar: a.Links.Avatar.Href, - } + return model.CommitAuthor{} } diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go index 26b9e321e0e..463f8d7f314 100644 --- a/server/forge/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -126,7 +126,7 @@ func Test_convertPullHook(t *testing.T) { pipeline := convertPullHook(hook) assert.Equal(t, model.EventPull, pipeline.Event) assert.Equal(t, hook.Actor.Login, pipeline.Author) - assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author.Author) + assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author) assert.Equal(t, hook.PullRequest.Source.Commit.Hash, pipeline.Commit) assert.Equal(t, hook.PullRequest.Source.Branch.Name, pipeline.Branch) assert.Equal(t, hook.PullRequest.Links.HTML.Href, pipeline.ForgeURL) @@ -152,7 +152,7 @@ func Test_convertPushHook(t *testing.T) { assert.Equal(t, model.EventPush, pipeline.Event) assert.Equal(t, "test@domain.tld", pipeline.Commit.Author.Email) assert.Equal(t, hook.Actor.Login, pipeline.Author) - assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author.Avatar) + assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Avatar) assert.Equal(t, change.New.Target.Hash, pipeline.Commit) assert.Equal(t, change.New.Name, pipeline.Branch) assert.Equal(t, change.New.Target.Links.HTML.Href, pipeline.ForgeURL) diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go index cbc8e473c26..c56f0a5a627 100644 --- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go +++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go @@ -381,7 +381,7 @@ func (c *client) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b SHA: cm.ID, // TODO check id or displayid? ForgeURL: fmt.Sprintf("%s/commits/%s", r.ForgeURL, cm.ID), Message: cm.Message, - Author: model.Author{ + Author: model.CommitAuthor{ Author: cm.Author.Name, Email: cm.Author.Email, }, @@ -557,7 +557,7 @@ func (c *client) updatePipelineFromCommit(ctx context.Context, u *model.User, r return nil, fmt.Errorf("unable to read commit: %w", err) } p.Commit.Message = commit.Message - p.Commit.Author = model.Author{ + p.Commit.Author = model.CommitAuthor{ Author: commit.Author.Name, Email: commit.Author.Email, } diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index 28191e28f29..5d3666b4d51 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -94,12 +94,9 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), }, Branch: change.Ref.DisplayID, - Author: model.Author{ - Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), - Author: ev.Actor.Name, - Email: ev.Actor.Email, - }, - Ref: ev.Changes[0].RefId, + Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), + Author: ev.Actor.Name, + Ref: ev.Changes[0].RefId, // TODO this is wrong on tags ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), } @@ -121,12 +118,9 @@ func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pip ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), }, Branch: ev.PullRequest.Source.DisplayID, - Author: model.Author{ - Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), - Author: ev.Actor.Name, - Email: ev.Actor.Email, - }, - Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), + Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), + Author: ev.Actor.Name, + Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), PullRequest: &model.PullRequest{ FromFork: ev.PullRequest.Source.Repository.ID != ev.PullRequest.Target.Repository.ID, Title: ev.PullRequest.Title, diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index aa7b656e83b..444a306c300 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -155,18 +155,14 @@ func Test_convertRepositoryPushEvent(t *testing.T) { SHA: "1234567890abcdef", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Message: "", - Author: model.Author{ - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: model.CommitAuthor{ Author: "John Doe", Email: "john.doe@mail.com", }, }, - Branch: "branch", - Author: model.Author{ - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - }, + Branch: "branch", + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", Ref: "refs/head/branch", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Event: model.EventPush, @@ -220,14 +216,10 @@ func Test_convertPullRequestEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: &model.Commit{SHA: "1234567890abcdef"}, - Branch: "branch", - Author: model.Author{ - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - }, - + Commit: &model.Commit{SHA: "1234567890abcdef"}, + Branch: "branch", + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", Ref: "refs/pull-requests/123/from", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Event: model.EventPull, @@ -279,11 +271,8 @@ func Test_convertPullRequestCloseEvent(t *testing.T) { assert.Equal(t, &model.Pipeline{ Commit: &model.Commit{SHA: "1234567890abcdef"}, Branch: "branch", - Author: model.Author{ - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Email: "john.doe@mail.com", - }, + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", Ref: "refs/pull-requests/123/from", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", diff --git a/server/forge/forgejo/forgejo.go b/server/forge/forgejo/forgejo.go index ba354fef596..18b0de1086a 100644 --- a/server/forge/forgejo/forgejo.go +++ b/server/forge/forgejo/forgejo.go @@ -461,7 +461,7 @@ func (c *Forgejo) BranchHead(ctx context.Context, u *model.User, r *model.Repo, SHA: b.Commit.ID, ForgeURL: b.Commit.URL, Message: b.Commit.Message, - Author: model.Author{ + Author: model.CommitAuthor{ Author: b.Commit.Author.Name, Email: b.Commit.Author.Email, }, @@ -724,7 +724,7 @@ func (c *Forgejo) getCommitFromSHA(ctx context.Context, user *model.User, repo * return &model.Commit{ Message: commit.RepoCommit.Message, - Author: model.Author{ + Author: model.CommitAuthor{ Author: commit.RepoCommit.Author.Name, Email: commit.RepoCommit.Author.Email, }, diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index 5f97a7ad741..d0cbd27e348 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -85,19 +85,16 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { SHA: hook.After, Message: hook.HeadCommit.Message, ForgeURL: hook.HeadCommit.URL, - Author: model.Author{ + Author: model.CommitAuthor{ Author: hook.HeadCommit.Author.Name, Email: hook.HeadCommit.Author.Email, }, }, - Ref: hook.Ref, - ForgeURL: link, - Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Ref: hook.Ref, + ForgeURL: link, + Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), + Author: hook.Sender.UserName, + Avatar: avatar, ChangedFiles: getChangedFilesFromPushHook(hook), } } @@ -133,11 +130,8 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { }, Ref: fmt.Sprintf("refs/tags/%s", ref), ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, } } @@ -159,11 +153,8 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { ForgeURL: hook.PullRequest.HTMLURL, Ref: fmt.Sprintf("refs/pull/%d/head", hook.Number), Branch: hook.PullRequest.Base.Ref, - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, @@ -190,11 +181,8 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { ForgeURL: hook.Release.HTMLURL, Branch: hook.Release.Target, ReleaseTitle: hook.Release.Title, - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/forgejo/helper_test.go b/server/forge/forgejo/helper_test.go index a3973de9f80..2d4511918e0 100644 --- a/server/forge/forgejo/helper_test.go +++ b/server/forge/forgejo/helper_test.go @@ -71,7 +71,7 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, hook.Commits[0].Message, pipeline.Commit.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.Sender.UserName, pipeline.Author) assert.Equal(t, []string{"CHANGELOG.md", "app/controller/application.rb"}, pipeline.ChangedFiles) }) @@ -136,7 +136,7 @@ func Test_parsePullRequest(t *testing.T) { assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 8ac21d39b65..5f737d59207 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -66,20 +66,16 @@ func TestForgejoParser(t *testing.T) { Event: "push", Commit: &model.Commit{ SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", - Author: model.Author{ + Author: model.CommitAuthor{ Author: "6543", - Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", Email: "6543@obermui.de", }, ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", }, - Branch: "fdsafdsa", - Ref: "refs/heads/fdsafdsa", - Author: model.Author{ - Author: "6543", - Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", - Email: "6543@obermui.de", - }, + Branch: "fdsafdsa", + Ref: "refs/heads/fdsafdsa", + Author: "6543", + Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", ChangedFiles: []string{".woodpecker/.check.yml"}, }, @@ -108,20 +104,16 @@ func TestForgejoParser(t *testing.T) { Event: "push", Commit: &model.Commit{ SHA: "ef98532add3b2feb7a137426bba1248724367df5", - Author: model.Author{ + Author: model.CommitAuthor{ Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", Email: "gordon@golang.org", }, ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", }, - Branch: "main", - Ref: "refs/heads/main", - Author: model.Author{ - Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Branch: "main", + Ref: "refs/heads/main", + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", ChangedFiles: []string{"CHANGELOG.md", "app/controller/application.rb"}, }, @@ -147,15 +139,12 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, - Branch: "main", - Ref: "refs/heads/main", - Author: model.Author{ - Author: "test-user", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", - }, + Event: "push", + Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Branch: "main", + Ref: "refs/heads/main", + Author: "test-user", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/compare/6efcf5b7c98f3e7a491675164b7a2e7acac27941...29be01c073851cf0db0c6a466e396b725a670453", ChangedFiles: []string{"aaa", "aa"}, }, @@ -182,14 +171,11 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "tag", - Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, - Ref: "refs/tags/v1.0.0", - Author: model.Author{ - Author: "gordon", - Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Event: "tag", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Ref: "refs/tags/v1.0.0", + Author: "gordon", + Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0", }, }, @@ -215,16 +201,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request", - Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "feature/changes:main", - Author: model.Author{ - Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Event: "pull_request", + Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "feature/changes:main", + Author: "gordon", + Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://forgejo.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -254,16 +237,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request", - Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, - Branch: "main", - Ref: "refs/pull/2/head", - Refspec: "test-patch-1:main", - Author: model.Author{ - Author: "test", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", - }, + Event: "pull_request", + Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, + Branch: "main", + Ref: "refs/pull/2/head", + Refspec: "test-patch-1:main", + Author: "test", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", PullRequest: &model.PullRequest{ PullRequestLabels: []string{ @@ -295,16 +275,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request_closed", - Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Author: model.Author{ - Author: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@sender.forgejo.com", - }, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -333,16 +310,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request_closed", - Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Author: model.Author{ - Author: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@noreply.forgejo.com", - }, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -374,11 +348,10 @@ func TestForgejoParser(t *testing.T) { pipe: &model.Pipeline{ Event: "release", Branch: "main", - Ref: "refs/tags/0.0.5", Author: model.Author{ - Author: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - Email: "anbraten@noreply.xxx", - }, + Ref: "refs/tags/0.0.5", + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", }, }, diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index c4df9269c8a..697a95a2661 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -463,7 +463,7 @@ func (c *Gitea) BranchHead(ctx context.Context, u *model.User, r *model.Repo, br SHA: b.Commit.ID, ForgeURL: b.Commit.URL, Message: b.Commit.Message, - Author: model.Author{ + Author: model.CommitAuthor{ Author: b.Commit.Author.Name, Email: b.Commit.Author.Email, }, @@ -731,7 +731,7 @@ func (c *Gitea) getCommitFromSHA(ctx context.Context, user *model.User, repo *mo return &model.Commit{ Message: commit.RepoCommit.Message, - Author: model.Author{ + Author: model.CommitAuthor{ Author: commit.RepoCommit.Author.Name, Email: commit.RepoCommit.Author.Email, }, diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index bfd5699b6d0..eae47092756 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -86,19 +86,16 @@ func pipelineFromPush(hook *pushHook) *model.Pipeline { SHA: hook.After, Message: hook.HeadCommit.Message, ForgeURL: hook.HeadCommit.URL, - Author: model.Author{ + Author: model.CommitAuthor{ Author: hook.HeadCommit.Author.Name, Email: hook.HeadCommit.Author.Email, }, }, - Ref: hook.Ref, - ForgeURL: link, - Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Ref: hook.Ref, + ForgeURL: link, + Branch: strings.TrimPrefix(hook.Ref, "refs/heads/"), + Author: hook.Sender.UserName, + Avatar: avatar, ChangedFiles: getChangedFilesFromPushHook(hook), } } @@ -134,11 +131,8 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { }, Ref: fmt.Sprintf("refs/tags/%s", ref), ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, } } @@ -162,11 +156,8 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { ForgeURL: hook.PullRequest.HTMLURL, Ref: fmt.Sprintf("refs/pull/%d/head", hook.Number), Branch: hook.PullRequest.Base.Ref, - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, Refspec: fmt.Sprintf("%s:%s", hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, @@ -194,11 +185,8 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { ForgeURL: hook.Release.HTMLURL, Branch: hook.Release.Target, ReleaseTitle: hook.Release.Title, - Author: model.Author{ - Author: hook.Sender.UserName, - Email: hook.Sender.Email, - Avatar: avatar, - }, + Author: hook.Sender.UserName, + Avatar: avatar, IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/gitea/helper_test.go b/server/forge/gitea/helper_test.go index 4d8b9be7073..0837fc5b07f 100644 --- a/server/forge/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -72,7 +72,7 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, hook.Commits[0].Message, pipeline.Commit.Message) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.Sender.UserName, pipeline.Author) assert.Equal(t, []string{"CHANGELOG.md", "app/controller/application.rb"}, pipeline.ChangedFiles) }) @@ -137,7 +137,7 @@ func Test_parsePullRequest(t *testing.T) { assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Author.Avatar) + assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index fa595dd8629..3a90f9b9199 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -68,11 +68,8 @@ func TestGiteaParser(t *testing.T) { Commit: &model.Commit{SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b"}, Branch: "fdsafdsa", Ref: "refs/heads/fdsafdsa", - Author: model.Author{ - Author: "6543", - Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", - Email: "6543@obermui.de", - }, + Author: "6543", + Avatar: "https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173", ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", ChangedFiles: []string{".woodpecker/.check.yml"}, @@ -99,15 +96,12 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, - Branch: "main", - Ref: "refs/heads/main", - Author: model.Author{ - Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Event: "push", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Branch: "main", + Ref: "refs/heads/main", + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", ChangedFiles: []string{"CHANGELOG.md", "app/controller/application.rb"}, }, @@ -133,15 +127,12 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, - Branch: "main", - Ref: "refs/heads/main", - Author: model.Author{ - Author: "test-user", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", - }, + Event: "push", + Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Branch: "main", + Ref: "refs/heads/main", + Author: "test-user", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/compare/6efcf5b7c98f3e7a491675164b7a2e7acac27941...29be01c073851cf0db0c6a466e396b725a670453", ChangedFiles: []string{"aaa", "aa"}, }, @@ -168,14 +159,11 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "tag", - Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, - Ref: "refs/tags/v1.0.0", - Author: model.Author{ - Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Event: "tag", + Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Ref: "refs/tags/v1.0.0", + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0", }, }, @@ -201,16 +189,13 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request", - Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "feature/changes:main", - Author: model.Author{ - Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - Email: "gordon@golang.org", - }, + Event: "pull_request", + Commit: &model.Commit{SHA: "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "feature/changes:main", + Author: "gordon", + Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://gitea.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -240,16 +225,13 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request", - Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, - Branch: "main", - Ref: "refs/pull/2/head", - Refspec: "test-patch-1:main", - Author: model.Author{ - Author: "test", - Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", - Email: "test@noreply.localhost", - }, + Event: "pull_request", + Commit: &model.Commit{SHA: "788ed8d02d3b7fcfcf6386dbcbca696aa1d4dc25"}, + Branch: "main", + Ref: "refs/pull/2/head", + Refspec: "test-patch-1:main", + Author: "test", + Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", PullRequest: &model.PullRequest{PullRequestLabels: []string{ "Kind/Bug", @@ -279,16 +261,13 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request_closed", - Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Author: model.Author{ - Author: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@noreply.gitea.com", - }, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -317,16 +296,13 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "pull_request_closed", - Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, - Branch: "main", - Ref: "refs/pull/1/head", - Refspec: "anbraten-patch-1:main", - Author: model.Author{ - Author: "anbraten", - Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", - Email: "anbraten@noreply.gitea.com", - }, + Event: "pull_request_closed", + Commit: &model.Commit{SHA: "d555a5dd07f4d0148a58d4686ec381502ae6a2d4"}, + Branch: "main", + Ref: "refs/pull/1/head", + Refspec: "anbraten-patch-1:main", + Author: "anbraten", + Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ PullRequestLabels: []string{}, @@ -360,12 +336,9 @@ func TestGiteaParser(t *testing.T) { Branch: "main", Ref: "refs/tags/0.0.5", ReleaseTitle: "Version 0.0.5", - Author: model.Author{ - Author: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - Email: "anbraten@noreply.xxx", - }, - ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", }, }, } diff --git a/server/forge/github/convert.go b/server/forge/github/convert.go index 4debbbde1a7..8c986f19e83 100644 --- a/server/forge/github/convert.go +++ b/server/forge/github/convert.go @@ -174,7 +174,7 @@ func convertCommit(from *github.Commit) *model.Commit { SHA: from.GetSHA(), ForgeURL: from.GetHTMLURL(), Message: from.GetMessage(), - Author: model.Author{ + Author: model.CommitAuthor{ Author: from.GetAuthor().GetName(), Email: from.GetAuthor().GetEmail(), }, diff --git a/server/forge/github/convert_test.go b/server/forge/github/convert_test.go index 5c6e1f8d5bc..b8e5a639873 100644 --- a/server/forge/github/convert_test.go +++ b/server/forge/github/convert_test.go @@ -195,8 +195,8 @@ func Test_parsePullHook(t *testing.T) { assert.Equal(t, *from.PullRequest.Head.SHA, pipeline.Commit) assert.Equal(t, *from.PullRequest.Title, pipeline.PullRequest.Title) assert.Equal(t, *from.PullRequest.User.Login, pipeline.Author) - assert.Equal(t, *from.PullRequest.User.AvatarURL, pipeline.Author.Avatar) - assert.Equal(t, *from.Sender.Login, pipeline.Author.Author) + assert.Equal(t, *from.PullRequest.User.AvatarURL, pipeline.Avatar) + assert.Equal(t, *from.Sender.Login, pipeline.Author) } func Test_parseDeployHook(t *testing.T) { @@ -219,7 +219,7 @@ func Test_parseDeployHook(t *testing.T) { assert.Equal(t, *from.Deployment.Description, pipeline.Deployment.Description) assert.Equal(t, *from.Deployment.URL, pipeline.ForgeURL) assert.Equal(t, *from.Sender.Login, pipeline.Author) - assert.Equal(t, *from.Sender.AvatarURL, pipeline.Author.Avatar) + assert.Equal(t, *from.Sender.AvatarURL, pipeline.Avatar) } func Test_parsePushHook(t *testing.T) { @@ -242,7 +242,7 @@ func Test_parsePushHook(t *testing.T) { assert.Equal(t, *from.HeadCommit.Message, pipeline.Commit.Message) assert.Equal(t, *from.HeadCommit.URL, pipeline.ForgeURL) assert.Equal(t, *from.Sender.Login, pipeline.Author) - assert.Equal(t, *from.Sender.AvatarURL, pipeline.Author.Avatar) + assert.Equal(t, *from.Sender.AvatarURL, pipeline.Avatar) assert.Equal(t, *from.HeadCommit.Author.Email, pipeline.Commit.Author.Email) }) diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index 53cf0151d46..b5fb4742650 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -95,7 +95,8 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { Ref: hook.GetRef(), ForgeURL: hook.GetHeadCommit().GetURL(), Branch: strings.ReplaceAll(hook.GetRef(), "refs/heads/", ""), - Author: convertAuthor(hook.GetSender()), + Avatar: hook.GetSender().GetAvatarURL(), + Author: hook.GetSender().GetLogin(), ChangedFiles: getChangedFilesFromCommits(hook.Commits), } @@ -125,7 +126,8 @@ func parseDeployHook(hook *github.DeploymentEvent) (*model.Repo, *model.Pipeline ForgeURL: hook.GetDeployment().GetURL(), Ref: hook.GetDeployment().GetRef(), Branch: hook.GetDeployment().GetRef(), - Author: convertAuthor(hook.GetSender()), + Avatar: hook.GetSender().GetAvatarURL(), + Author: hook.GetSender().GetLogin(), Deployment: model.Deployment{ Target: hook.GetDeployment().GetEnvironment(), Task: hook.GetDeployment().GetTask(), @@ -167,7 +169,8 @@ func parsePullHook(hook *github.PullRequestEvent, merge bool) (*github.PullReque ForgeURL: hook.GetPullRequest().GetHTMLURL(), Ref: fmt.Sprintf(headRefs, hook.GetPullRequest().GetNumber()), Branch: hook.GetPullRequest().GetBase().GetRef(), - Author: convertAuthor(hook.GetPullRequest().GetUser()), + Avatar: hook.GetSender().GetAvatarURL(), + Author: hook.GetSender().GetLogin(), Refspec: fmt.Sprintf(refSpec, hook.GetPullRequest().GetHead().GetRef(), hook.GetPullRequest().GetBase().GetRef(), @@ -203,7 +206,8 @@ func parseReleaseHook(hook *github.ReleaseEvent) (*model.Repo, *model.Pipeline) Ref: fmt.Sprintf("refs/tags/%s", hook.GetRelease().GetTagName()), Branch: hook.GetRelease().GetTargetCommitish(), // cspell:disable-line ReleaseTitle: name, - Author: convertAuthor(hook.GetRelease().GetAuthor()), + Avatar: hook.GetSender().GetAvatarURL(), + Author: hook.GetSender().GetLogin(), IsPrerelease: hook.GetRelease().GetPrerelease(), } @@ -221,16 +225,8 @@ func getChangedFilesFromCommits(commits []*github.HeadCommit) []string { return utils.DeduplicateStrings(files) } -func convertAuthor(u *github.User) model.Author { - return model.Author{ - Avatar: u.GetAvatarURL(), - Author: u.GetLogin(), - Email: u.GetEmail(), - } -} - -func convertCommitAuthor(u *github.CommitAuthor) model.Author { - return model.Author{ +func convertCommitAuthor(u *github.CommitAuthor) model.CommitAuthor { + return model.CommitAuthor{ Author: u.GetName(), Email: u.GetEmail(), } diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index ee58d25f541..5e267066841 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -122,7 +122,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * pipeline.Commit = &model.Commit{ Message: lastCommit.Message, SHA: lastCommit.ID, - Author: model.Author{ + Author: model.CommitAuthor{ Author: lastCommit.Author.Name, Email: lastCommit.Author.Email, }, @@ -132,11 +132,8 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * pipeline.Ref = fmt.Sprintf(mergeRefs, obj.IID) pipeline.Branch = obj.SourceBranch pipeline.Refspec = fmt.Sprintf("%s:%s", obj.SourceBranch, obj.TargetBranch) - pipeline.Author = model.Author{ - Author: hook.User.Username, - Email: hook.User.Email, - Avatar: hook.User.AvatarURL, - } + pipeline.Author = hook.User.Username + pipeline.Avatar = hook.User.AvatarURL pipeline.ForgeURL = obj.URL pipeline.PullRequest = &model.PullRequest{ PullRequestLabels: convertLabels(hook.Labels), @@ -177,17 +174,14 @@ func convertPushHook(hook *gitlab.PushEvent) (*model.Repo, *model.Pipeline, erro pipeline.Commit = &model.Commit{SHA: hook.After} pipeline.Branch = strings.TrimPrefix(hook.Ref, "refs/heads/") pipeline.Ref = hook.Ref - pipeline.Author = model.Author{ - Author: hook.UserUsername, - Email: hook.UserEmail, - Avatar: hook.UserAvatar, - } + pipeline.Author = hook.UserUsername + pipeline.Avatar = hook.UserAvatar // assume a capacity of 4 changed files per commit files := make([]string, 0, len(hook.Commits)*4) for _, cm := range hook.Commits { if hook.After == cm.ID { - pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} + pipeline.Commit.Author = model.CommitAuthor{Author: cm.Author.Name, Email: cm.Author.Email} pipeline.Commit.Message = cm.Message pipeline.Commit.ForgeURL = cm.URL } @@ -233,16 +227,13 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) } pipeline.Branch = strings.TrimPrefix(hook.Ref, "refs/heads/") pipeline.Ref = hook.Ref - pipeline.Author = model.Author{ - Author: hook.UserUsername, - Email: hook.UserEmail, - Avatar: hook.UserAvatar, - } + pipeline.Author = hook.UserUsername + pipeline.Avatar = hook.UserAvatar // TODO does hook.Commits always contain hook.After? for _, cm := range hook.Commits { if hook.After == cm.ID { - pipeline.Commit.Author = model.Author{Author: cm.Author.Name, Email: cm.Author.Email} + pipeline.Commit.Author = model.CommitAuthor{Author: cm.Author.Name, Email: cm.Author.Email} pipeline.Commit.Message = cm.Message pipeline.Commit.ForgeURL = cm.URL break @@ -276,7 +267,7 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline Event: model.EventRelease, Commit: &model.Commit{ SHA: hook.Commit.ID, - Author: model.Author{ + Author: model.CommitAuthor{ Author: hook.Commit.Author.Name, Email: hook.Commit.Author.Email, }, @@ -285,12 +276,9 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline }, ForgeURL: hook.URL, ReleaseTitle: hook.Name, - Author: model.Author{ - // TODO gitlab actually doesn't have a user associated to the hook/release - Author: hook.Commit.Author.Name, - Email: hook.Commit.Author.Email, - Avatar: getUserAvatar(hook.Commit.Author.Email), - }, + // TODO gitlab actually doesn't have a user associated to the hook/release + Author: hook.Commit.Author.Name, + Avatar: getUserAvatar(hook.Commit.Author.Email), // Tag name here is the ref. We should add the refs/tags, so // it is known it's a tag (git-plugin looks for it) diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index 2f29dafa443..f6ff55798c1 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -622,7 +622,7 @@ func (g *GitLab) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b SHA: b.Commit.ID, ForgeURL: b.Commit.WebURL, Message: b.Commit.Message, - Author: model.Author{Author: b.Commit.AuthorName, Email: b.Commit.AuthorEmail}, + Author: model.CommitAuthor{Author: b.Commit.AuthorName, Email: b.Commit.AuthorEmail}, }, nil } diff --git a/server/model/commit.go b/server/model/commit.go index 706306077ad..f7eab26b3e8 100644 --- a/server/model/commit.go +++ b/server/model/commit.go @@ -1,13 +1,13 @@ package model type Commit struct { - SHA string `json:"sha"` - Message string `json:"message"` - ForgeURL string `json:"forge_url"` - Author Author `json:"author"` + SHA string `json:"sha"` + Message string `json:"message"` + ForgeURL string `json:"forge_url"` + Author CommitAuthor `json:"author"` } -type Author struct { +type CommitAuthor struct { Author string `json:"author"` Email string `json:"email"` Avatar string `json:"avatar"` diff --git a/server/model/pipeline.go b/server/model/pipeline.go index f98af803b90..fceaf0386dc 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -43,13 +43,14 @@ type Pipeline struct { Ref string `json:"ref" xorm:"ref"` Refspec string `json:"refspec" xorm:"refspec"` ForgeURL string `json:"forge_url" xorm:"forge_url"` - Author Author `json:"author" xorm:"json 'author"` + Author string `json:"author" xorm:"author"` + Avatar string `json:"avatar" xorm:"avatar"` ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` - Deployment Deployment `json:"deployment" xorm:"json 'deployment'"` + Deployment Deployment `json:"deployment" xorm:"json 'deployment'"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` - PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` - Cron string `json:"cron,omitempty" xorm:"cron"` - ReleaseTitle string `json:"release,omitempty" xorm:"release"` + PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + Cron string `json:"cron,omitempty" xorm:"cron"` + ReleaseTitle string `json:"release,omitempty" xorm:"release"` } // @name Pipeline // TableName return database table name for xorm. diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index e9e8ee0f3e2..6f41995ac4a 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -123,9 +123,8 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b Branch: pipeline.Branch, Message: pipeline.Commit.Message, Author: metadata.Author{ - Name: pipeline.Commit.Author.Author, - Email: pipeline.Commit.Author.Email, - Avatar: pipeline.Commit.Author.Avatar, + Name: pipeline.Commit.Author.Author, + Email: pipeline.Commit.Author.Email, }, ChangedFiles: pipeline.ChangedFiles, PullRequestLabels: pipeline.PullRequest.PullRequestLabels, From fce415f04e83f60a221ea2b8c1be38e98547891d Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 3 Jan 2025 13:55:27 +0200 Subject: [PATCH 05/30] migrate cli & web, add migration --- cli/pipeline/pipeline.go | 1 + cli/pipeline/pipeline_test.go | 14 +- server/api/pipeline.go | 3 + server/forge/bitbucket/bitbucket.go | 6 +- server/forge/bitbucket/convert.go | 18 +- .../bitbucketdatacenter.go | 2 +- server/forge/bitbucketdatacenter/convert.go | 21 ++- server/forge/forgejo/helper.go | 18 +- server/forge/gitea/gitea.go | 5 +- server/forge/gitea/helper.go | 19 ++- server/forge/github/convert.go | 10 ++ server/forge/github/github.go | 5 +- server/forge/github/parse.go | 17 +- server/forge/gitlab/convert.go | 3 + server/forge/gitlab/gitlab.go | 6 +- server/model/commit.go | 1 - server/model/pipeline.go | 4 +- .../migration/024_update_pipeline_messages.go | 154 ++++++++++++++++++ server/store/datastore/migration/migration.go | 1 + .../components/repo/pipeline/PipelineItem.vue | 2 +- .../repo/pipeline/PipelineStepList.vue | 21 +-- web/src/compositions/usePipeline.ts | 36 ++-- web/src/lib/api/types/pipeline.ts | 43 +++-- woodpecker-go/woodpecker/types.go | 74 ++++++--- 24 files changed, 341 insertions(+), 143 deletions(-) create mode 100644 server/store/datastore/migration/024_update_pipeline_messages.go diff --git a/cli/pipeline/pipeline.go b/cli/pipeline/pipeline.go index efcae855311..81d4347e5f6 100644 --- a/cli/pipeline/pipeline.go +++ b/cli/pipeline/pipeline.go @@ -90,6 +90,7 @@ func pipelineOutput(c *cli.Command, pipelines []*woodpecker.Pipeline, fd ...io.W table.WriteHeader(cols) } for _, resource := range pipelines { + // TODO get message from commit if err := table.Write(cols, resource); err != nil { return err } diff --git a/cli/pipeline/pipeline_test.go b/cli/pipeline/pipeline_test.go index 5238a19fe91..50ce80bbff4 100644 --- a/cli/pipeline/pipeline_test.go +++ b/cli/pipeline/pipeline_test.go @@ -49,12 +49,14 @@ func TestPipelineOutput(t *testing.T) { pipelines := []*woodpecker.Pipeline{ { - Number: 1, - Status: "success", - Event: "push", - Branch: "main", - Message: "message\nmultiline", - Author: "John Doe\n", + Number: 1, + Status: "success", + Event: "push", + Branch: "main", + Commit: &woodpecker.Commit{ + Message: "message\nmultiline", + }, + Author: "John Doe\n", }, } diff --git a/server/api/pipeline.go b/server/api/pipeline.go index d4b9370b00b..86d46195cca 100644 --- a/server/api/pipeline.go +++ b/server/api/pipeline.go @@ -618,6 +618,9 @@ func PostPipeline(c *gin.Context) { // make Deploy overridable // make Deploy task overridable + if pl.Deployment == nil { + pl.Deployment = new(model.Deployment) + } pl.Deployment.Task = c.DefaultQuery("deploy_task", pl.Deployment.Task) // make Event overridable to deploy diff --git a/server/forge/bitbucket/bitbucket.go b/server/forge/bitbucket/bitbucket.go index 29a9ff82995..5c771a365e0 100644 --- a/server/forge/bitbucket/bitbucket.go +++ b/server/forge/bitbucket/bitbucket.go @@ -22,7 +22,6 @@ import ( "net/http" "net/url" "path/filepath" - "strconv" "golang.org/x/oauth2" @@ -390,10 +389,7 @@ func (c *config) PullRequests(ctx context.Context, u *model.User, r *model.Repo, } var result []*model.PullRequest for _, pullRequest := range pullRequests { - result = append(result, &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(int(pullRequest.ID))), - Title: pullRequest.Title, - }) + result = append(result, convertPullRequest(pullRequest)) } return result, nil } diff --git a/server/forge/bitbucket/convert.go b/server/forge/bitbucket/convert.go index a5d26256ad0..1ff40d05493 100644 --- a/server/forge/bitbucket/convert.go +++ b/server/forge/bitbucket/convert.go @@ -177,12 +177,9 @@ func convertPullHook(from *internal.PullRequestHook) *model.Pipeline { ForgeURL: from.PullRequest.Links.HTML.Href, Branch: from.PullRequest.Source.Branch.Name, - Author: from.Actor.Login, - Avatar: from.Actor.Links.Avatar.Href, - PullRequest: &model.PullRequest{ - FromFork: from.PullRequest.Source.Repo.UUID != from.PullRequest.Dest.Repo.UUID, - Title: from.PullRequest.Title, - }, + Author: from.Actor.Login, + Avatar: from.Actor.Links.Avatar.Href, + PullRequest: convertPullRequest(&from.PullRequest), } if from.PullRequest.State == stateClosed { @@ -215,6 +212,7 @@ func convertPushHook(hook *internal.PushHook, change *internal.Change) *model.Pi case "tag", "annotated_tag", "bookmark": pipeline.Event = model.EventTag pipeline.Ref = fmt.Sprintf("refs/tags/%s", change.New.Name) + // TODO is the forge url correct on tags? default: pipeline.Event = model.EventPush pipeline.Ref = fmt.Sprintf("refs/heads/%s", change.New.Name) @@ -236,3 +234,11 @@ func convertCommitAuthor(gitAuthor string) model.CommitAuthor { } return model.CommitAuthor{} } + +func convertPullRequest(from *internal.PullRequest) *model.PullRequest { + return &model.PullRequest{ + FromFork: from.Source.Repo.UUID != from.Dest.Repo.UUID, + Index: model.ForgeRemoteID(fmt.Sprint(from.ID)), + Title: from.Title, + } +} diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go index c56f0a5a627..d1f82482f9d 100644 --- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go +++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go @@ -402,7 +402,7 @@ func (c *client) PullRequests(ctx context.Context, u *model.User, r *model.Repo, return nil, fmt.Errorf("unable to list pull-requests: %w", err) } for _, pr := range prs { - all = append(all, &model.PullRequest{Index: convertID(pr.ID), Title: pr.Title}) + all = append(all, convertPullRequest(pr)) } if !p.All || resp.LastPage { break diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index 5d3666b4d51..02d2a01e9b9 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -117,14 +117,11 @@ func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pip SHA: ev.PullRequest.Source.Latest, ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), }, - Branch: ev.PullRequest.Source.DisplayID, - Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), - Author: ev.Actor.Name, - Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), - PullRequest: &model.PullRequest{ - FromFork: ev.PullRequest.Source.Repository.ID != ev.PullRequest.Target.Repository.ID, - Title: ev.PullRequest.Title, - }, + Branch: ev.PullRequest.Source.DisplayID, + Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), + Author: ev.Actor.Name, + Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), + PullRequest: convertPullRequest(&ev.PullRequest), // TODO should link to the Pr ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), Refspec: fmt.Sprintf("%s:%s", ev.PullRequest.Source.DisplayID, ev.PullRequest.Target.DisplayID), @@ -164,3 +161,11 @@ func updateUserCredentials(u *model.User, t *oauth2.Token) { u.RefreshToken = t.RefreshToken u.Expiry = t.Expiry.UTC().Unix() } + +func convertPullRequest(pr *bb.PullRequest) *model.PullRequest { + return &model.PullRequest{ + FromFork: pr.Source.Repository.ID != pr.Target.Repository.ID, + Title: pr.Title, + Index: model.ForgeRemoteID(fmt.Sprint(pr.ID)), + } +} diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index d0cbd27e348..33e4396a4bd 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -19,6 +19,7 @@ import ( "fmt" "io" "net/url" + "strconv" "strings" "codeberg.org/mvdkleijn/forgejo-sdk/forgejo" @@ -129,7 +130,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { SHA: hook.Sha, }, Ref: fmt.Sprintf("refs/tags/%s", ref), - ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), + ForgeURL: fmt.Sprintf("%s/releases/tag/%s", hook.Repo.HTMLURL, ref), Author: hook.Sender.UserName, Avatar: avatar, } @@ -159,11 +160,7 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, ), - PullRequest: &model.PullRequest{ - PullRequestLabels: convertLabels(hook.PullRequest.Labels), - FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, - Title: hook.PullRequest.Title, - }, + PullRequest: convertPullRequests(hook.PullRequest), } return pipeline @@ -259,6 +256,15 @@ func matchingHooks(hooks []*forgejo.Hook, rawURL string) *forgejo.Hook { return nil } +func convertPullRequests(from *forgejo.PullRequest) *model.PullRequest { + return &model.PullRequest{ + Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), + Title: from.Title, + PullRequestLabels: convertLabels(from.Labels), + FromFork: from.Head.RepoID != from.Base.RepoID, + } +} + func convertLabels(from []*forgejo.Label) []string { labels := make([]string, len(from)) for i, label := range from { diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index 697a95a2661..43b491ed813 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -492,10 +492,7 @@ func (c *Gitea) PullRequests(ctx context.Context, u *model.User, r *model.Repo, result := make([]*model.PullRequest, len(pullRequests)) for i := range pullRequests { - result[i] = &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(int(pullRequests[i].Index))), - Title: pullRequests[i].Title, - } + result[i] = convertPullRequests(pullRequests[i]) } return result, err } diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index eae47092756..213eba5e5b2 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "net/url" + "strconv" "strings" "code.gitea.io/sdk/gitea" @@ -130,7 +131,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { SHA: hook.Sha, }, Ref: fmt.Sprintf("refs/tags/%s", ref), - ForgeURL: fmt.Sprintf("%s/src/tag/%s", hook.Repo.HTMLURL, ref), + ForgeURL: fmt.Sprintf("%s/src/releases/%s", hook.Repo.HTMLURL, ref), Author: hook.Sender.UserName, Avatar: avatar, } @@ -162,12 +163,7 @@ func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { hook.PullRequest.Head.Ref, hook.PullRequest.Base.Ref, ), - PullRequest: &model.PullRequest{ - Index: model.ForgeRemoteID(fmt.Sprint(hook.Number)), - PullRequestLabels: convertLabels(hook.PullRequest.Labels), - FromFork: hook.PullRequest.Head.RepoID != hook.PullRequest.Base.RepoID, - Title: hook.PullRequest.Title, - }, + PullRequest: convertPullRequests(hook.PullRequest), } return pipeline @@ -261,6 +257,15 @@ func matchingHooks(hooks []*gitea.Hook, rawURL string) *gitea.Hook { return nil } +func convertPullRequests(from *gitea.PullRequest) *model.PullRequest { + return &model.PullRequest{ + Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), + Title: from.Title, + PullRequestLabels: convertLabels(from.Labels), + FromFork: from.Head.RepoID != from.Base.RepoID, + } +} + func convertLabels(from []*gitea.Label) []string { labels := make([]string, len(from)) for i, label := range from { diff --git a/server/forge/github/convert.go b/server/forge/github/convert.go index 8c986f19e83..006275c03ef 100644 --- a/server/forge/github/convert.go +++ b/server/forge/github/convert.go @@ -17,6 +17,7 @@ package github import ( "fmt" + "strconv" "github.com/google/go-github/v68/github" @@ -159,6 +160,15 @@ func convertRepoHook(eventRepo *github.PushEventRepository) *model.Repo { return repo } +func convertPullRequest(pr *github.PullRequest) *model.PullRequest { + return &model.PullRequest{ + Index: model.ForgeRemoteID(strconv.Itoa(pr.GetNumber())), + Title: pr.GetTitle(), + PullRequestLabels: convertLabels(pr.Labels), + FromFork: pr.GetHead().GetRepo().GetID() != pr.GetBase().GetRepo().GetID(), + } +} + // convertLabels is a helper function used to convert a GitHub label list to // the common Woodpecker label structure. func convertLabels(from []*github.Label) []string { diff --git a/server/forge/github/github.go b/server/forge/github/github.go index 0c02e2bcbb4..f130a4cfaca 100644 --- a/server/forge/github/github.go +++ b/server/forge/github/github.go @@ -331,10 +331,7 @@ func (c *client) PullRequests(ctx context.Context, u *model.User, r *model.Repo, result := make([]*model.PullRequest, len(pullRequests)) for i := range pullRequests { - result[i] = &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(pullRequests[i].GetNumber())), - Title: pullRequests[i].GetTitle(), - } + result[i] = convertPullRequest(pullRequests[i]) } return result, err } diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index b5fb4742650..4701fe5e427 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -105,11 +105,8 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { // event we'll never know! pipeline.Event = model.EventTag pipeline.ChangedFiles = nil - // For tags, if the base_ref (tag's base branch) is set, we're using it - // as pipeline's branch so that we can filter events base on it - if strings.HasPrefix(hook.GetBaseRef(), "refs/heads/") { - pipeline.Branch = strings.ReplaceAll(hook.GetBaseRef(), "refs/heads/", "") - } + pipeline.Branch = "" + pipeline.ForgeURL = "// TODO" } return convertRepoHook(hook.GetRepo()), pipeline @@ -128,7 +125,7 @@ func parseDeployHook(hook *github.DeploymentEvent) (*model.Repo, *model.Pipeline Branch: hook.GetDeployment().GetRef(), Avatar: hook.GetSender().GetAvatarURL(), Author: hook.GetSender().GetLogin(), - Deployment: model.Deployment{ + Deployment: &model.Deployment{ Target: hook.GetDeployment().GetEnvironment(), Task: hook.GetDeployment().GetTask(), Description: hook.GetDeployment().GetDescription(), @@ -159,8 +156,6 @@ func parsePullHook(hook *github.PullRequestEvent, merge bool) (*github.PullReque event = model.EventPullClosed } - fromFork := hook.GetPullRequest().GetHead().GetRepo().GetID() != hook.GetPullRequest().GetBase().GetRepo().GetID() - pipeline := &model.Pipeline{ Event: event, Commit: &model.Commit{ @@ -175,11 +170,7 @@ func parsePullHook(hook *github.PullRequestEvent, merge bool) (*github.PullReque hook.GetPullRequest().GetHead().GetRef(), hook.GetPullRequest().GetBase().GetRef(), ), - PullRequest: &model.PullRequest{ - Title: hook.GetPullRequest().GetTitle(), - PullRequestLabels: convertLabels(hook.GetPullRequest().Labels), - FromFork: fromFork, - }, + PullRequest: convertPullRequest(hook.GetPullRequest()), } if merge { pipeline.Ref = fmt.Sprintf(mergeRefs, hook.GetPullRequest().GetNumber()) diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 5e267066841..ac33f3e4259 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -19,6 +19,7 @@ import ( "encoding/hex" "fmt" "net/http" + "strconv" "strings" "gitlab.com/gitlab-org/api/client-go" @@ -139,6 +140,7 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * PullRequestLabels: convertLabels(hook.Labels), FromFork: target.PathWithNamespace != source.PathWithNamespace, Title: obj.Title, + Index: model.ForgeRemoteID(strconv.Itoa(obj.IID)), } return obj.IID, repo, pipeline, nil @@ -229,6 +231,7 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) pipeline.Ref = hook.Ref pipeline.Author = hook.UserUsername pipeline.Avatar = hook.UserAvatar + pipeline.ForgeURL = "// TODO" // TODO does hook.Commits always contain hook.After? for _, cm := range hook.Commits { diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index f6ff55798c1..2da01fc9c31 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -357,8 +357,10 @@ func (g *GitLab) PullRequests(ctx context.Context, u *model.User, r *model.Repo, result := make([]*model.PullRequest, len(pullRequests)) for i := range pullRequests { result[i] = &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(pullRequests[i].ID)), - Title: pullRequests[i].Title, + Index: model.ForgeRemoteID(strconv.Itoa(pullRequests[i].ID)), + Title: pullRequests[i].Title, + PullRequestLabels: pullRequests[i].Labels, + FromFork: pullRequests[i].TargetProjectID != pullRequests[i].SourceProjectID, } } return result, err diff --git a/server/model/commit.go b/server/model/commit.go index f7eab26b3e8..dee6812485b 100644 --- a/server/model/commit.go +++ b/server/model/commit.go @@ -10,5 +10,4 @@ type Commit struct { type CommitAuthor struct { Author string `json:"author"` Email string `json:"email"` - Avatar string `json:"avatar"` } diff --git a/server/model/pipeline.go b/server/model/pipeline.go index fceaf0386dc..15b3331317a 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -44,9 +44,9 @@ type Pipeline struct { Refspec string `json:"refspec" xorm:"refspec"` ForgeURL string `json:"forge_url" xorm:"forge_url"` Author string `json:"author" xorm:"author"` - Avatar string `json:"avatar" xorm:"avatar"` + Avatar string `json:"author_avatar" xorm:"varchar(500) 'avatar'"` ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` - Deployment Deployment `json:"deployment" xorm:"json 'deployment'"` + Deployment *Deployment `json:"deployment" xorm:"json 'deployment'"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` Cron string `json:"cron,omitempty" xorm:"cron"` diff --git a/server/store/datastore/migration/024_update_pipeline_messages.go b/server/store/datastore/migration/024_update_pipeline_messages.go new file mode 100644 index 00000000000..07ce5048449 --- /dev/null +++ b/server/store/datastore/migration/024_update_pipeline_messages.go @@ -0,0 +1,154 @@ +// Copyright 2024 Woodpecker Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package migration + +import ( + "strings" + + "src.techknowlogick.com/xormigrate" + "xorm.io/xorm" + + "go.woodpecker-ci.org/woodpecker/v3/server/model" +) + +// perPage024 set the size of the slice to read per page. +var perPage024 = 100 + +var updatePipelineMessages = xormigrate.Migration{ + ID: "update-pipeline-messages", + MigrateSession: func(sess *xorm.Session) error { + type commitAuthor struct { + Author string `json:"author"` + Email string `json:"email"` + } + type commit struct { + SHA string `json:"sha"` + Message string `json:"message"` + ForgeURL string `json:"forge_url"` + Author commitAuthor `json:"author"` + } + type pullRequest struct { + Index model.ForgeRemoteID `json:"index"` + Title string `json:"title"` + PullRequestLabels []string `json:"pr_labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` + } + + type deployment struct { + Target string `json:"target"` + Task string `json:"task"` + Description string `json:"description"` + } + + type pipelines struct { + ID int64 `xorm:"pk autoincr 'id'"` + Event model.WebhookEvent `xorm:"event"` + Author string `xorm:"INDEX 'author'"` + ForgeURL string `xorm:"forge_url"` + Ref string `xorm:"ref"` + + Commit string `xorm:"commit"` + Title string `xorm:"title"` + Message string `xorm:"TEXT 'message'"` + Sender string `xorm:"sender"` // uses reported user for webhooks and name of cron for cron pipelines + DeployTo string `xorm:"deploy"` + DeployTask string `xorm:"deploy_task"` + PullRequestLabels []string `xorm:"json 'pr_labels'"` + FromFork bool `xorm:"from_fork"` + + // new fields + CommitNew *commit `xorm:"json 'commit_new'"` + Deployment *deployment `xorm:"json 'deployment'"` + PullRequest *pullRequest `xorm:"json 'pr'"` + Cron string `xorm:"cron"` + ReleaseTitle string `xorm:"release"` + + // removed without replacement + Timestamp int64 `xorm:"'timestamp'"` + Email string `xorm:"varchar(500) email"` + } + + if err := sess.Sync(new(pipelines)); err != nil { + return err + } + + page := 0 + oldPipelines := make([]*pipelines, 0, perPage024) + + for { + oldPipelines = oldPipelines[:0] + + err := sess.Limit(perPage024, page*perPage024).Cols("id", "event", "author", "forge_url", "commit", "title", "message", "sender", "deploy", "deploy_task", "pr_labels", "from_fork", "email").Find(&oldPipelines) + if err != nil { + return err + } + + for _, oldPipeline := range oldPipelines { + var newPipeline pipelines + newPipeline.ID = oldPipeline.ID + newPipeline.CommitNew = &commit{ + SHA: oldPipeline.Commit, + Message: oldPipeline.Message, + ForgeURL: oldPipeline.ForgeURL, + Author: commitAuthor{ + Author: oldPipeline.Author, + Email: oldPipeline.Email, + }, + } + + switch oldPipeline.Event { + case model.EventRelease: + newPipeline.ReleaseTitle = strings.TrimPrefix(oldPipeline.Message, "created release ") + case model.EventCron: + newPipeline.Cron = oldPipeline.Sender + case model.EventPull, model.EventPullClosed: + newPipeline.PullRequest = &pullRequest{ + Title: oldPipeline.Title, + Index: model.ForgeRemoteID( + strings.ReplaceAll( + strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(oldPipeline.Ref, "refs/pull/", ""), "refs/merge-requests/", ""), "/merge", ""), + "/head", "", + ), + ), + FromFork: oldPipeline.FromFork, + PullRequestLabels: oldPipeline.PullRequestLabels, + } + case model.EventDeploy: + newPipeline.Deployment = &deployment{ + Description: oldPipeline.Message, + Target: oldPipeline.DeployTo, + Task: oldPipeline.DeployTask, + } + } + + if _, err := sess.ID(oldPipeline.ID).Cols("commit_new", "deployment", "pr", "cron", "release").Update(newPipeline); err != nil { + return err + } + } + + if len(oldPipelines) < perPage024 { + break + } + + page++ + } + + if err := dropTableColumns(sess, "pipelines", "email", "timestamp", "sender", "commit", "title", "message", "deploy", "deploy_task", "pr_labels", "from_fork"); err != nil { + return err + } + + return renameColumn(sess, "pipelines", "commit_new", "commit") + }, +} diff --git a/server/store/datastore/migration/migration.go b/server/store/datastore/migration/migration.go index d056aad56fa..1e9732b6500 100644 --- a/server/store/datastore/migration/migration.go +++ b/server/store/datastore/migration/migration.go @@ -52,6 +52,7 @@ var migrationTasks = []*xormigrate.Migration{ &renameTokenFields, &setNewDefaultsForRequireApproval, &removeRepoScm, + &updatePipelineMessages, } var allBeans = []any{ diff --git a/web/src/components/repo/pipeline/PipelineItem.vue b/web/src/components/repo/pipeline/PipelineItem.vue index 2151f0d753f..261406583f5 100644 --- a/web/src/components/repo/pipeline/PipelineItem.vue +++ b/web/src/components/repo/pipeline/PipelineItem.vue @@ -54,7 +54,7 @@
- {{ pipeline.commit.slice(0, 10) }} + {{ pipeline.commit.sha.slice(0, 10) }}
diff --git a/web/src/components/repo/pipeline/PipelineStepList.vue b/web/src/components/repo/pipeline/PipelineStepList.vue index 1949042cbf2..2b34e879687 100644 --- a/web/src/components/repo/pipeline/PipelineStepList.vue +++ b/web/src/components/repo/pipeline/PipelineStepList.vue @@ -8,14 +8,15 @@
- {{ pipeline.author }} + {{ pipeline.event === 'cron' ? pipeline.cron : pipeline.author }} - + + {{ prettyRef }} {{ prettyRef }} -
- - - {{ prettyRef }} -
diff --git a/web/src/compositions/usePipeline.ts b/web/src/compositions/usePipeline.ts index ec288657b01..d7c35497d7a 100644 --- a/web/src/compositions/usePipeline.ts +++ b/web/src/compositions/usePipeline.ts @@ -74,34 +74,32 @@ export default (pipeline: Ref) => { return prettyDuration(durationElapsed.value); }); - const message = computed(() => emojify(pipeline.value?.message ?? '')); + const message = computed(() => emojify(pipeline.value?.commit.message ?? '')); const shortMessage = computed(() => message.value.split('\n')[0]); - const prTitleWithDescription = computed(() => emojify(pipeline.value?.title ?? '')); - const prTitle = computed(() => prTitleWithDescription.value.split('\n')[0]); - - const prettyRef = computed(() => { - if (pipeline.value?.event === 'push' || pipeline.value?.event === 'deployment') { - return pipeline.value.branch; - } - - if (pipeline.value?.event === 'cron') { - return pipeline.value.ref.replaceAll('refs/heads/', ''); + const context = computed(() => { + let context = "" + if (pipeline.value?.event === 'pull_request' || pipeline.value?.event === 'pull_request_closed') { + context = pipeline.value.pull_request!.title + } else if (pipeline.value?.event === 'deployment') { + context = pipeline.value.deployment!.description + } else if (pipeline.value?.event === 'release') { + context = pipeline.value.release_title! } + return emojify(context) + }); + const shortContext = computed(() => context.value.split('\n')[0]); - if (pipeline.value?.event === 'tag') { + const prettyRef = computed(() => { + if (pipeline.value?.event === 'tag' || pipeline.value?.event === 'release') { return pipeline.value.ref.replaceAll('refs/tags/', ''); } if (pipeline.value?.event === 'pull_request' || pipeline.value?.event === 'pull_request_closed') { - return `#${pipeline.value.ref - .replaceAll('refs/pull/', '') - .replaceAll('refs/merge-requests/', '') - .replaceAll('/merge', '') - .replaceAll('/head', '')}`; + return `#${pipeline.value.pull_request!.index}`; } - return pipeline.value?.ref; + return pipeline.value?.branch || pipeline.value?.ref; }); const created = computed(() => { @@ -114,5 +112,5 @@ export default (pipeline: Ref) => { return toLocaleString(new Date(start * 1000)); }); - return { since, duration, message, shortMessage, prTitle, prTitleWithDescription, prettyRef, created }; + return { since, duration, message, shortMessage, shortContext, context, prettyRef, created }; }; diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index 586a18da87c..4a0014f4860 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -1,3 +1,4 @@ +import { PullRequest } from './pull_request'; import type { WebhookEvents } from './webhook'; export interface PipelineError { @@ -36,40 +37,24 @@ export interface Pipeline { // When the pipeline was finished. finished: number; - // Where the deployment should go. - deploy_to: string; - // The commit for the pipeline. - commit: string; + commit: PipelineCommit; // The branch the commit was pushed to. branch: string; - // The commit message. - message: string; - // The alias for the commit. ref: string; // The mapping from the local repository to a branch in the forge. refspec: string; - // The clone URL of the forge repository. - clone_url: string; - - title: string; - - sender: string; - // The login for the author of the commit. author: string; // The avatar for the author of the commit. author_avatar: string; - // email for the author of the commit. - author_email: string; - // This url will point to the repository state associated with the pipeline's commit. forge_url: string; @@ -77,6 +62,14 @@ export interface Pipeline { reviewed: number; + pull_request?: PullRequest; + + deployment?: PipelineDeployment; + + release_title?: string; + + cron: string; + // The steps associated with this pipeline. // A pipeline will have multiple steps if a matrix pipeline was used or if a rebuild was requested. workflows?: PipelineWorkflow[]; @@ -125,6 +118,22 @@ export interface PipelineStep { type?: StepType; } +export interface PipelineCommit { + sha: string; + message: string; + forge_url: string; + author: PipelineCommitAuthor; +} + +export interface PipelineCommitAuthor { + author: string; + email: string; +} + +export interface PipelineDeployment { + description: string; +} + export interface PipelineLog { id: number; step_id: number; diff --git a/woodpecker-go/woodpecker/types.go b/woodpecker-go/woodpecker/types.go index 3e36b1dfc25..6e7b74f79e1 100644 --- a/woodpecker-go/woodpecker/types.go +++ b/woodpecker-go/woodpecker/types.go @@ -96,32 +96,54 @@ type ( // Pipeline defines a pipeline object. Pipeline struct { - ID int64 `json:"id"` - Number int64 `json:"number"` - Parent int64 `json:"parent"` - Event string `json:"event"` - Status string `json:"status"` - Errors []*PipelineError `json:"errors"` - Created int64 `json:"created_at"` - Updated int64 `json:"updated_at"` - Started int64 `json:"started_at"` - Finished int64 `json:"finished_at"` - Deploy string `json:"deploy_to"` - Commit string `json:"commit"` - Branch string `json:"branch"` - Ref string `json:"ref"` - Refspec string `json:"refspec"` - Title string `json:"title"` - Message string `json:"message"` - Timestamp int64 `json:"timestamp"` - Sender string `json:"sender"` - Author string `json:"author"` - Avatar string `json:"author_avatar"` - Email string `json:"author_email"` - ForgeURL string `json:"forge_url"` - Reviewer string `json:"reviewed_by"` - Reviewed int64 `json:"reviewed_at"` - Workflows []*Workflow `json:"workflows,omitempty"` + ID int64 `json:"id"` + Number int64 `json:"number"` + Parent int64 `json:"parent"` + Event string `json:"event"` + Status string `json:"status"` + Errors []*PipelineError `json:"errors"` + Created int64 `json:"created_at"` + Updated int64 `json:"updated_at"` + Started int64 `json:"started_at"` + Finished int64 `json:"finished_at"` + Deployment *Deployment `json:"deployment"` + Commit *Commit `json:"commit"` + Branch string `json:"branch"` + Ref string `json:"ref"` + Refspec string `json:"refspec"` + PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + Author string `json:"author"` + Avatar string `json:"author_avatar"` + ForgeURL string `json:"forge_url"` + Reviewer string `json:"reviewed_by"` + Reviewed int64 `json:"reviewed_at"` + Workflows []*Workflow `json:"workflows,omitempty"` + } + + Commit struct { + SHA string `json:"sha"` + Message string `json:"message"` + ForgeURL string `json:"forge_url"` + Author *CommitAuthor `json:"author"` + } + + CommitAuthor struct { + Author string `json:"author"` + Email string `json:"email"` + Avatar string `json:"avatar"` + } + + Deployment struct { + Target string `json:"target"` + Task string `json:"task"` + Description string `json:"description"` + } + + PullRequest struct { + Index string `json:"index"` + Title string `json:"title"` + PullRequestLabels []string `json:"pr_labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` } // Workflow represents a workflow in the pipeline. From 50daca06a17204058ee5dbeb05191ae44fbcedab Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 3 Jan 2025 13:56:37 +0200 Subject: [PATCH 06/30] rename to "Labels" only --- cmd/server/openapi/docs.go | 94 +++++++++++++------ server/forge/forgejo/helper.go | 8 +- server/forge/forgejo/parse_test.go | 8 +- server/forge/gitea/helper.go | 8 +- server/forge/gitea/parse_test.go | 8 +- server/forge/github/convert.go | 8 +- server/forge/gitlab/convert.go | 8 +- server/forge/gitlab/gitlab.go | 8 +- server/model/pull_request.go | 8 +- server/pipeline/stepbuilder/metadata.go | 2 +- .../migration/024_update_pipeline_messages.go | 12 +-- 11 files changed, 102 insertions(+), 70 deletions(-) diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index 5452b974715..2165c17624c 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -4883,9 +4883,6 @@ const docTemplate = `{ "author_avatar": { "type": "string" }, - "author_email": { - "type": "string" - }, "branch": { "type": "string" }, @@ -4896,16 +4893,16 @@ const docTemplate = `{ } }, "commit": { - "type": "string" + "$ref": "#/definitions/model.Commit" }, "created": { "type": "integer" }, - "deploy_task": { + "cron": { "type": "string" }, - "deploy_to": { - "type": "string" + "deployment": { + "$ref": "#/definitions/model.Deployment" }, "errors": { "type": "array", @@ -4922,29 +4919,20 @@ const docTemplate = `{ "forge_url": { "type": "string" }, - "from_fork": { - "type": "boolean" - }, "id": { "type": "integer" }, "is_prerelease": { "type": "boolean" }, - "message": { - "type": "string" - }, "number": { "type": "integer" }, "parent": { "type": "integer" }, - "pr_labels": { - "type": "array", - "items": { - "type": "string" - } + "pr": { + "$ref": "#/definitions/PullRequest" }, "ref": { "type": "string" @@ -4952,28 +4940,21 @@ const docTemplate = `{ "refspec": { "type": "string" }, + "release": { + "type": "string" + }, "reviewed": { "type": "integer" }, "reviewed_by": { "type": "string" }, - "sender": { - "description": "uses reported user for webhooks and name of cron for cron pipelines", - "type": "string" - }, "started": { "type": "integer" }, "status": { "$ref": "#/definitions/StatusValue" }, - "timestamp": { - "type": "integer" - }, - "title": { - "type": "string" - }, "updated": { "type": "integer" }, @@ -5008,9 +4989,18 @@ const docTemplate = `{ "PullRequest": { "type": "object", "properties": { + "from_fork": { + "type": "boolean" + }, "index": { "type": "string" }, + "labels": { + "type": "array", + "items": { + "type": "string" + } + }, "title": { "type": "string" } @@ -5403,9 +5393,6 @@ const docTemplate = `{ "metadata.Author": { "type": "object", "properties": { - "avatar": { - "type": "string" - }, "email": { "type": "string" }, @@ -5519,6 +5506,9 @@ const docTemplate = `{ "parent": { "type": "integer" }, + "release": { + "type": "string" + }, "started": { "type": "integer" }, @@ -5651,6 +5641,48 @@ const docTemplate = `{ "RequireApprovalAllEvents" ] }, + "model.Commit": { + "type": "object", + "properties": { + "author": { + "$ref": "#/definitions/model.CommitAuthor" + }, + "forge_url": { + "type": "string" + }, + "message": { + "type": "string" + }, + "sha": { + "type": "string" + } + } + }, + "model.CommitAuthor": { + "type": "object", + "properties": { + "author": { + "type": "string" + }, + "email": { + "type": "string" + } + } + }, + "model.Deployment": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "target": { + "type": "string" + }, + "task": { + "type": "string" + } + } + }, "model.ForgeType": { "type": "string", "enum": [ diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index 33e4396a4bd..b942179f407 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -258,10 +258,10 @@ func matchingHooks(hooks []*forgejo.Hook, rawURL string) *forgejo.Hook { func convertPullRequests(from *forgejo.PullRequest) *model.PullRequest { return &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), - Title: from.Title, - PullRequestLabels: convertLabels(from.Labels), - FromFork: from.Head.RepoID != from.Base.RepoID, + Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), + Title: from.Title, + Labels: convertLabels(from.Labels), + FromFork: from.Head.RepoID != from.Base.RepoID, } } diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 5f737d59207..cc85c543a43 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -210,7 +210,7 @@ func TestForgejoParser(t *testing.T) { Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://forgejo.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, @@ -246,7 +246,7 @@ func TestForgejoParser(t *testing.T) { Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{ + Labels: []string{ "Kind/Bug", "Kind/Security", }, @@ -284,7 +284,7 @@ func TestForgejoParser(t *testing.T) { Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, @@ -319,7 +319,7 @@ func TestForgejoParser(t *testing.T) { Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 213eba5e5b2..d91a1d8f216 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -259,10 +259,10 @@ func matchingHooks(hooks []*gitea.Hook, rawURL string) *gitea.Hook { func convertPullRequests(from *gitea.PullRequest) *model.PullRequest { return &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), - Title: from.Title, - PullRequestLabels: convertLabels(from.Labels), - FromFork: from.Head.RepoID != from.Base.RepoID, + Index: model.ForgeRemoteID(strconv.Itoa(int(from.Index))), + Title: from.Title, + Labels: convertLabels(from.Labels), + FromFork: from.Head.RepoID != from.Base.RepoID, } } diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index 3a90f9b9199..9baf8899345 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -198,7 +198,7 @@ func TestGiteaParser(t *testing.T) { Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://gitea.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, @@ -233,7 +233,7 @@ func TestGiteaParser(t *testing.T) { Author: "test", Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", - PullRequest: &model.PullRequest{PullRequestLabels: []string{ + PullRequest: &model.PullRequest{Labels: []string{ "Kind/Bug", "Kind/Security", }}, @@ -270,7 +270,7 @@ func TestGiteaParser(t *testing.T) { Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, @@ -305,7 +305,7 @@ func TestGiteaParser(t *testing.T) { Avatar: "https://seccdn.libravatar.org/avatar/fc9b6fe77c6b732a02925a62a81f05a0?d=identicon", ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ - PullRequestLabels: []string{}, + Labels: []string{}, }, }, }, diff --git a/server/forge/github/convert.go b/server/forge/github/convert.go index 006275c03ef..c2ee943c90f 100644 --- a/server/forge/github/convert.go +++ b/server/forge/github/convert.go @@ -162,10 +162,10 @@ func convertRepoHook(eventRepo *github.PushEventRepository) *model.Repo { func convertPullRequest(pr *github.PullRequest) *model.PullRequest { return &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(pr.GetNumber())), - Title: pr.GetTitle(), - PullRequestLabels: convertLabels(pr.Labels), - FromFork: pr.GetHead().GetRepo().GetID() != pr.GetBase().GetRepo().GetID(), + Index: model.ForgeRemoteID(strconv.Itoa(pr.GetNumber())), + Title: pr.GetTitle(), + Labels: convertLabels(pr.Labels), + FromFork: pr.GetHead().GetRepo().GetID() != pr.GetBase().GetRepo().GetID(), } } diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index ac33f3e4259..65ca2ab6c8f 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -137,10 +137,10 @@ func convertMergeRequestHook(hook *gitlab.MergeEvent, req *http.Request) (int, * pipeline.Avatar = hook.User.AvatarURL pipeline.ForgeURL = obj.URL pipeline.PullRequest = &model.PullRequest{ - PullRequestLabels: convertLabels(hook.Labels), - FromFork: target.PathWithNamespace != source.PathWithNamespace, - Title: obj.Title, - Index: model.ForgeRemoteID(strconv.Itoa(obj.IID)), + Labels: convertLabels(hook.Labels), + FromFork: target.PathWithNamespace != source.PathWithNamespace, + Title: obj.Title, + Index: model.ForgeRemoteID(strconv.Itoa(obj.IID)), } return obj.IID, repo, pipeline, nil diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index 2da01fc9c31..ff59146ba0e 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -357,10 +357,10 @@ func (g *GitLab) PullRequests(ctx context.Context, u *model.User, r *model.Repo, result := make([]*model.PullRequest, len(pullRequests)) for i := range pullRequests { result[i] = &model.PullRequest{ - Index: model.ForgeRemoteID(strconv.Itoa(pullRequests[i].ID)), - Title: pullRequests[i].Title, - PullRequestLabels: pullRequests[i].Labels, - FromFork: pullRequests[i].TargetProjectID != pullRequests[i].SourceProjectID, + Index: model.ForgeRemoteID(strconv.Itoa(pullRequests[i].ID)), + Title: pullRequests[i].Title, + Labels: pullRequests[i].Labels, + FromFork: pullRequests[i].TargetProjectID != pullRequests[i].SourceProjectID, } } return result, err diff --git a/server/model/pull_request.go b/server/model/pull_request.go index 697e9b3035e..512c3e8c36a 100644 --- a/server/model/pull_request.go +++ b/server/model/pull_request.go @@ -15,8 +15,8 @@ package model type PullRequest struct { - Index ForgeRemoteID `json:"index"` - Title string `json:"title"` - PullRequestLabels []string `json:"pr_labels,omitempty"` - FromFork bool `json:"from_fork,omitempty"` + Index ForgeRemoteID `json:"index"` + Title string `json:"title"` + Labels []string `json:"labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` } // @name PullRequest diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index 6f41995ac4a..916c168177d 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -127,7 +127,7 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b Email: pipeline.Commit.Author.Email, }, ChangedFiles: pipeline.ChangedFiles, - PullRequestLabels: pipeline.PullRequest.PullRequestLabels, + PullRequestLabels: pipeline.PullRequest.Labels, IsPrerelease: pipeline.IsPrerelease, }, Release: pipeline.ReleaseTitle, diff --git a/server/store/datastore/migration/024_update_pipeline_messages.go b/server/store/datastore/migration/024_update_pipeline_messages.go index 07ce5048449..778b53da87e 100644 --- a/server/store/datastore/migration/024_update_pipeline_messages.go +++ b/server/store/datastore/migration/024_update_pipeline_messages.go @@ -40,10 +40,10 @@ var updatePipelineMessages = xormigrate.Migration{ Author commitAuthor `json:"author"` } type pullRequest struct { - Index model.ForgeRemoteID `json:"index"` - Title string `json:"title"` - PullRequestLabels []string `json:"pr_labels,omitempty"` - FromFork bool `json:"from_fork,omitempty"` + Index model.ForgeRemoteID `json:"index"` + Title string `json:"title"` + Labels []string `json:"labels,omitempty"` + FromFork bool `json:"from_fork,omitempty"` } type deployment struct { @@ -122,8 +122,8 @@ var updatePipelineMessages = xormigrate.Migration{ "/head", "", ), ), - FromFork: oldPipeline.FromFork, - PullRequestLabels: oldPipeline.PullRequestLabels, + FromFork: oldPipeline.FromFork, + Labels: oldPipeline.PullRequestLabels, } case model.EventDeploy: newPipeline.Deployment = &deployment{ From c709a1d7b0a87d780e7788510243556853a7af44 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 12:28:45 +0200 Subject: [PATCH 07/30] fix feed --- cmd/server/openapi/docs.go | 22 ++++++------ server/model/feed.go | 34 +++++++++---------- server/model/pipeline.go | 2 +- server/store/datastore/feed.go | 8 ++--- .../migration/024_update_pipeline_messages.go | 7 +++- .../repo/pipeline/PipelineStepList.vue | 3 +- woodpecker-go/woodpecker/types.go | 2 +- 7 files changed, 42 insertions(+), 36 deletions(-) diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index 2165c17624c..cedae5bb5a6 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -4705,18 +4705,18 @@ const docTemplate = `{ "author_avatar": { "type": "string" }, - "author_email": { - "type": "string" - }, "branch": { "type": "string" }, "commit": { - "type": "string" + "$ref": "#/definitions/model.Commit" }, "created": { "type": "integer" }, + "deployment": { + "$ref": "#/definitions/model.Deployment" + }, "event": { "type": "string" }, @@ -4726,18 +4726,21 @@ const docTemplate = `{ "id": { "type": "integer" }, - "message": { - "type": "string" - }, "number": { "type": "integer" }, + "pull_request": { + "$ref": "#/definitions/PullRequest" + }, "ref": { "type": "string" }, "refspec": { "type": "string" }, + "release": { + "type": "string" + }, "repo_id": { "type": "integer" }, @@ -4746,9 +4749,6 @@ const docTemplate = `{ }, "status": { "type": "string" - }, - "title": { - "type": "string" } } }, @@ -4931,7 +4931,7 @@ const docTemplate = `{ "parent": { "type": "integer" }, - "pr": { + "pull_request": { "$ref": "#/definitions/PullRequest" }, "ref": { diff --git a/server/model/feed.go b/server/model/feed.go index 04357fc4ec2..ccbba1c52f5 100644 --- a/server/model/feed.go +++ b/server/model/feed.go @@ -17,21 +17,21 @@ package model // Feed represents an item in the user's feed or timeline. type Feed struct { - RepoID int64 `json:"repo_id" xorm:"repo_id"` - ID int64 `json:"id,omitempty" xorm:"pipeline_id"` - Number int64 `json:"number,omitempty" xorm:"pipeline_number"` - Event string `json:"event,omitempty" xorm:"pipeline_event"` - Status string `json:"status,omitempty" xorm:"pipeline_status"` - Created int64 `json:"created,omitempty" xorm:"pipeline_created"` - Started int64 `json:"started,omitempty" xorm:"pipeline_started"` - Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"` - Commit string `json:"commit,omitempty" xorm:"pipeline_commit"` - Branch string `json:"branch,omitempty" xorm:"pipeline_branch"` - Ref string `json:"ref,omitempty" xorm:"pipeline_ref"` - Refspec string `json:"refspec,omitempty" xorm:"pipeline_refspec"` - Title string `json:"title,omitempty" xorm:"pipeline_title"` - Message string `json:"message,omitempty" xorm:"pipeline_message"` - Author string `json:"author,omitempty" xorm:"pipeline_author"` - Avatar string `json:"author_avatar,omitempty" xorm:"pipeline_avatar"` - Email string `json:"author_email,omitempty" xorm:"pipeline_email"` + RepoID int64 `json:"repo_id" xorm:"repo_id"` + ID int64 `json:"id,omitempty" xorm:"pipeline_id"` + Number int64 `json:"number,omitempty" xorm:"pipeline_number"` + Event string `json:"event,omitempty" xorm:"pipeline_event"` + Status string `json:"status,omitempty" xorm:"pipeline_status"` + Created int64 `json:"created,omitempty" xorm:"pipeline_created"` + Started int64 `json:"started,omitempty" xorm:"pipeline_started"` + Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"` + Branch string `json:"branch,omitempty" xorm:"pipeline_branch"` + Ref string `json:"ref,omitempty" xorm:"pipeline_ref"` + Refspec string `json:"refspec,omitempty" xorm:"pipeline_refspec"` + Deployment *Deployment `json:"deployment" xorm:"json 'pipeline_deployment'"` + PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pipeline_pr'"` + ReleaseTitle string `json:"release,omitempty" xorm:"pipeline_release"` + Commit *Commit `json:"commit,omitempty" xorm:"json 'pipeline_commit'"` + Author string `json:"author,omitempty" xorm:"pipeline_author"` + Avatar string `json:"author_avatar,omitempty" xorm:"pipeline_avatar"` } // @name Feed diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 15b3331317a..0a17926977a 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -48,7 +48,7 @@ type Pipeline struct { ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` Deployment *Deployment `json:"deployment" xorm:"json 'deployment'"` IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` - PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pr'"` Cron string `json:"cron,omitempty" xorm:"cron"` ReleaseTitle string `json:"release,omitempty" xorm:"release"` } // @name Pipeline diff --git a/server/store/datastore/feed.go b/server/store/datastore/feed.go index 8be597f057f..d41e6f99254 100644 --- a/server/store/datastore/feed.go +++ b/server/store/datastore/feed.go @@ -28,14 +28,14 @@ pipelines.status as pipeline_status, pipelines.created as pipeline_created, pipelines.started as pipeline_started, pipelines.finished as pipeline_finished, -'pipelines.commit' as pipeline_commit, +pipelines.'commit' as pipeline_commit, pipelines.branch as pipeline_branch, pipelines.ref as pipeline_ref, pipelines.refspec as pipeline_refspec, -pipelines.title as pipeline_title, -pipelines.message as pipeline_message, +pipelines.deployment as pipeline_deployment, +pipelines.pr as pipeline_pr, +pipelines.release as pipeline_release, pipelines.author as pipeline_author, -pipelines.email as pipeline_email, pipelines.avatar as pipeline_avatar` func (s storage) GetPipelineQueue() ([]*model.Feed, error) { diff --git a/server/store/datastore/migration/024_update_pipeline_messages.go b/server/store/datastore/migration/024_update_pipeline_messages.go index 778b53da87e..b257d9d513b 100644 --- a/server/store/datastore/migration/024_update_pipeline_messages.go +++ b/server/store/datastore/migration/024_update_pipeline_messages.go @@ -118,7 +118,12 @@ var updatePipelineMessages = xormigrate.Migration{ Title: oldPipeline.Title, Index: model.ForgeRemoteID( strings.ReplaceAll( - strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(oldPipeline.Ref, "refs/pull/", ""), "refs/merge-requests/", ""), "/merge", ""), + strings.ReplaceAll( + strings.ReplaceAll( + strings.ReplaceAll(oldPipeline.Ref, "refs/pull/", ""), + "refs/merge-requests/", "", + ), + "/merge", ""), "/head", "", ), ), diff --git a/web/src/components/repo/pipeline/PipelineStepList.vue b/web/src/components/repo/pipeline/PipelineStepList.vue index 2b34e879687..afb38e8460e 100644 --- a/web/src/components/repo/pipeline/PipelineStepList.vue +++ b/web/src/components/repo/pipeline/PipelineStepList.vue @@ -20,13 +20,14 @@ {{ prettyRef }} + {{ prettyRef }}
diff --git a/woodpecker-go/woodpecker/types.go b/woodpecker-go/woodpecker/types.go index 6e7b74f79e1..a069e3e5e39 100644 --- a/woodpecker-go/woodpecker/types.go +++ b/woodpecker-go/woodpecker/types.go @@ -111,7 +111,7 @@ type ( Branch string `json:"branch"` Ref string `json:"ref"` Refspec string `json:"refspec"` - PullRequest *PullRequest `json:"pr,omitempty" xorm:"json 'pr'"` + PullRequest *PullRequest `json:"pull_request,omitempty"` Author string `json:"author"` Avatar string `json:"author_avatar"` ForgeURL string `json:"forge_url"` From ab6b34ccb53dfcf7cb0b950bc74cac0dde105ee6 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 12:32:41 +0200 Subject: [PATCH 08/30] fix metadata panic --- server/pipeline/stepbuilder/metadata.go | 36 +++++++++++++++---------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index 916c168177d..5495b889366 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -105,17 +105,15 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b parent = pipeline.Parent } - return metadata.Pipeline{ - Number: pipeline.Number, - Parent: parent, - Created: pipeline.Created, - Started: pipeline.Started, - Finished: pipeline.Finished, - Status: string(pipeline.Status), - Event: string(pipeline.Event), - ForgeURL: pipeline.ForgeURL, - DeployTo: pipeline.Deployment.Target, - DeployTask: pipeline.Deployment.Task, + metadata := metadata.Pipeline{ + Number: pipeline.Number, + Parent: parent, + Created: pipeline.Created, + Started: pipeline.Started, + Finished: pipeline.Finished, + Status: string(pipeline.Status), + Event: string(pipeline.Event), + ForgeURL: pipeline.ForgeURL, Commit: metadata.Commit{ Sha: pipeline.Commit.SHA, Ref: pipeline.Ref, @@ -126,11 +124,21 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b Name: pipeline.Commit.Author.Author, Email: pipeline.Commit.Author.Email, }, - ChangedFiles: pipeline.ChangedFiles, - PullRequestLabels: pipeline.PullRequest.Labels, - IsPrerelease: pipeline.IsPrerelease, + ChangedFiles: pipeline.ChangedFiles, + + IsPrerelease: pipeline.IsPrerelease, }, Release: pipeline.ReleaseTitle, Cron: pipeline.Cron, } + + if pipeline.PullRequest != nil { + metadata.Commit.PullRequestLabels = pipeline.PullRequest.Labels + } + if pipeline.Deployment != nil { + metadata.DeployTo = pipeline.Deployment.Target + metadata.DeployTask = pipeline.Deployment.Task + } + + return metadata } From fefaddc715e9c794877ff266ed68a67c13b6dfd8 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 12:49:44 +0200 Subject: [PATCH 09/30] fix test panics --- server/forge/bitbucket/bitbucket_test.go | 10 +++++- server/forge/bitbucket/convert_test.go | 6 ++-- server/forge/bitbucket/parse_test.go | 8 ++--- server/pipeline/stepbuilder/metadata_test.go | 6 ++-- .../pipeline/stepbuilder/stepBuilder_test.go | 34 ++++++++++++------- 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/server/forge/bitbucket/bitbucket_test.go b/server/forge/bitbucket/bitbucket_test.go index d28dd5e64b3..98d08d5726b 100644 --- a/server/forge/bitbucket/bitbucket_test.go +++ b/server/forge/bitbucket/bitbucket_test.go @@ -206,7 +206,15 @@ func TestBitbucket(t *testing.T) { r, b, err := c.Hook(ctx, req) assert.NoError(t, err) assert.Equal(t, "martinherren1984/publictestrepo", r.FullName) - assert.Equal(t, "c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", b.Commit) + assert.Equal(t, &model.Commit{ + SHA:"c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", + Message:"a\n", + ForgeURL:"https://bitbucket.org/martinherren1984/publictestrepo/commits/c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", + Author: model.CommitAuthor{ + Author: "Martin Herren", + Email: "martin.herren@yyy.com", + }, + }, b.Commit) } var ( diff --git a/server/forge/bitbucket/convert_test.go b/server/forge/bitbucket/convert_test.go index 463f8d7f314..9b1eb81b3fd 100644 --- a/server/forge/bitbucket/convert_test.go +++ b/server/forge/bitbucket/convert_test.go @@ -126,8 +126,8 @@ func Test_convertPullHook(t *testing.T) { pipeline := convertPullHook(hook) assert.Equal(t, model.EventPull, pipeline.Event) assert.Equal(t, hook.Actor.Login, pipeline.Author) - assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Author) - assert.Equal(t, hook.PullRequest.Source.Commit.Hash, pipeline.Commit) + assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Avatar) + assert.Equal(t, hook.PullRequest.Source.Commit.Hash, pipeline.Commit.SHA) assert.Equal(t, hook.PullRequest.Source.Branch.Name, pipeline.Branch) assert.Equal(t, hook.PullRequest.Links.HTML.Href, pipeline.ForgeURL) assert.Equal(t, "refs/pull-requests/1/from", pipeline.Ref) @@ -153,7 +153,7 @@ func Test_convertPushHook(t *testing.T) { assert.Equal(t, "test@domain.tld", pipeline.Commit.Author.Email) assert.Equal(t, hook.Actor.Login, pipeline.Author) assert.Equal(t, hook.Actor.Links.Avatar.Href, pipeline.Avatar) - assert.Equal(t, change.New.Target.Hash, pipeline.Commit) + assert.Equal(t, change.New.Target.Hash, pipeline.Commit.SHA) assert.Equal(t, change.New.Name, pipeline.Branch) assert.Equal(t, change.New.Target.Links.HTML.Href, pipeline.ForgeURL) assert.Equal(t, "refs/heads/main", pipeline.Ref) diff --git a/server/forge/bitbucket/parse_test.go b/server/forge/bitbucket/parse_test.go index 90d20968d7c..bf5e7d087ef 100644 --- a/server/forge/bitbucket/parse_test.go +++ b/server/forge/bitbucket/parse_test.go @@ -59,7 +59,7 @@ func Test_parseHook(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "user_name/repo_name", r.FullName) assert.Equal(t, model.EventPull, b.Event) - assert.Equal(t, "d3022fc0ca3d", b.Commit) + assert.Equal(t, "d3022fc0ca3d", b.Commit.SHA) }) t.Run("pull-request merged", func(t *testing.T) { @@ -72,7 +72,7 @@ func Test_parseHook(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "anbraten/test-2", r.FullName) assert.Equal(t, model.EventPullClosed, b.Event) - assert.Equal(t, "006704dbeab2", b.Commit) + assert.Equal(t, "006704dbeab2", b.Commit.SHA) }) t.Run("pull-request closed", func(t *testing.T) { @@ -85,7 +85,7 @@ func Test_parseHook(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "anbraten/test-2", r.FullName) assert.Equal(t, model.EventPullClosed, b.Event) - assert.Equal(t, "f90e18fc9d45", b.Commit) + assert.Equal(t, "f90e18fc9d45", b.Commit.SHA) }) t.Run("malformed push", func(t *testing.T) { @@ -120,7 +120,7 @@ func Test_parseHook(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "martinherren1984/publictestrepo", r.FullName) assert.Equal(t, "https://bitbucket.org/martinherren1984/publictestrepo", r.Clone) - assert.Equal(t, "c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", b.Commit) + assert.Equal(t, "c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", b.Commit.SHA) assert.Equal(t, "a\n", b.Commit.Message) }) } diff --git a/server/pipeline/stepbuilder/metadata_test.go b/server/pipeline/stepbuilder/metadata_test.go index c63680d9495..954f413342b 100644 --- a/server/pipeline/stepbuilder/metadata_test.go +++ b/server/pipeline/stepbuilder/metadata_test.go @@ -41,6 +41,8 @@ func TestMetadataFromStruct(t *testing.T) { }{ { name: "Test with empty info", + pipeline: &model.Pipeline{Commit: &model.Commit{}}, + prev: &model.Pipeline{Commit: &model.Commit{}}, expectedMetadata: metadata.Metadata{Sys: metadata.System{Name: "woodpecker"}}, expectedEnviron: map[string]string{ "CI": "woodpecker", @@ -58,8 +60,8 @@ func TestMetadataFromStruct(t *testing.T) { name: "Test with forge", forge: forge, repo: &model.Repo{FullName: "testUser/testRepo", ForgeURL: "https://gitea.com/testUser/testRepo", Clone: "https://gitea.com/testUser/testRepo.git", CloneSSH: "git@gitea.com:testUser/testRepo.git", Branch: "main", IsSCMPrivate: true}, - pipeline: &model.Pipeline{Number: 3, ChangedFiles: []string{"test.go", "markdown file.md"}}, - prev: &model.Pipeline{Number: 2}, + pipeline: &model.Pipeline{Number: 3, ChangedFiles: []string{"test.go", "markdown file.md"}, Commit: &model.Commit{}}, + prev: &model.Pipeline{Number: 2, Commit: &model.Commit{}}, workflow: &model.Workflow{Name: "hello"}, sysURL: "https://example.com", expectedMetadata: metadata.Metadata{ diff --git a/server/pipeline/stepbuilder/stepBuilder_test.go b/server/pipeline/stepbuilder/stepBuilder_test.go index eed78afa7e0..ce62b3a1af4 100644 --- a/server/pipeline/stepbuilder/stepBuilder_test.go +++ b/server/pipeline/stepbuilder/stepBuilder_test.go @@ -44,7 +44,7 @@ func TestGlobalEnvsubst(t *testing.T) { }, Event: model.EventPush, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -85,7 +85,7 @@ func TestMissingGlobalEnvsubst(t *testing.T) { }, Event: model.EventPush, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -121,7 +121,7 @@ func TestMultilineEnvsubst(t *testing.T) { Message: "aaa\nbbb", }, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -163,8 +163,9 @@ func TestMultiPipeline(t *testing.T) { Repo: &model.Repo{}, Curr: &model.Pipeline{ Event: model.EventPush, + Commit: &model.Commit{}, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -204,8 +205,9 @@ func TestDependsOn(t *testing.T) { Repo: &model.Repo{}, Curr: &model.Pipeline{ Event: model.EventPush, + Commit: &model.Commit{}, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -259,8 +261,9 @@ func TestRunsOn(t *testing.T) { Repo: &model.Repo{}, Curr: &model.Pipeline{ Event: model.EventPush, + Commit: &model.Commit{}, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -300,8 +303,9 @@ func TestPipelineName(t *testing.T) { Repo: &model.Repo{Config: ".woodpecker"}, Curr: &model.Pipeline{ Event: model.EventPush, + Commit: &model.Commit{}, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -343,8 +347,9 @@ func TestBranchFilter(t *testing.T) { Curr: &model.Pipeline{ Branch: "dev", Event: model.EventPush, + Commit: &model.Commit{}, }, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -386,8 +391,8 @@ func TestRootWhenFilter(t *testing.T) { b := StepBuilder{ Forge: getMockForge(t), Repo: &model.Repo{}, - Curr: &model.Pipeline{Event: "tag"}, - Prev: &model.Pipeline{}, + Curr: &model.Pipeline{Event: "tag", Commit: &model.Commit{}}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -431,13 +436,14 @@ func TestZeroSteps(t *testing.T) { pipeline := &model.Pipeline{ Branch: "dev", Event: model.EventPush, + Commit: &model.Commit{}, } b := StepBuilder{ Forge: getMockForge(t), Repo: &model.Repo{}, Curr: pipeline, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -471,13 +477,14 @@ func TestZeroStepsAsMultiPipelineDeps(t *testing.T) { pipeline := &model.Pipeline{ Branch: "dev", Event: model.EventPush, + Commit: &model.Commit{}, } b := StepBuilder{ Forge: getMockForge(t), Repo: &model.Repo{}, Curr: pipeline, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, @@ -529,13 +536,14 @@ func TestZeroStepsAsMultiPipelineTransitiveDeps(t *testing.T) { pipeline := &model.Pipeline{ Branch: "dev", Event: model.EventPush, + Commit: &model.Commit{}, } b := StepBuilder{ Forge: getMockForge(t), Repo: &model.Repo{}, Curr: pipeline, - Prev: &model.Pipeline{}, + Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, Secs: []*model.Secret{}, Regs: []*model.Registry{}, From 60bc4ca3d9465dce4f7c10ffb95da7946073afbe Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 13:41:33 +0200 Subject: [PATCH 10/30] fix tests --- cli/pipeline/pipeline.go | 5 +- server/api/hook_test.go | 1 + server/api/pipeline_test.go | 2 + server/forge/bitbucket/bitbucket_test.go | 8 +- .../forge/bitbucketdatacenter/convert_test.go | 26 +++--- server/forge/forgejo/fixtures/handler.go | 81 +++++++++++++++++++ server/forge/forgejo/fixtures/hooks.go | 14 ++++ server/forge/forgejo/helper.go | 2 +- server/forge/forgejo/helper_test.go | 18 +++-- server/forge/forgejo/parse_test.go | 32 ++++++-- server/forge/gitea/fixtures/handler.go | 81 +++++++++++++++++++ server/forge/gitea/fixtures/hooks.go | 14 ++++ server/forge/gitea/helper.go | 2 +- server/forge/gitea/helper_test.go | 18 +++-- server/forge/gitea/parse_test.go | 60 +++++++++++--- server/forge/github/convert_test.go | 41 +++------- server/pipeline/stepbuilder/metadata_test.go | 4 +- .../pipeline/stepbuilder/stepBuilder_test.go | 12 +-- server/store/datastore/pipeline_test.go | 2 +- 19 files changed, 339 insertions(+), 84 deletions(-) diff --git a/cli/pipeline/pipeline.go b/cli/pipeline/pipeline.go index 81d4347e5f6..a867650ef2f 100644 --- a/cli/pipeline/pipeline.go +++ b/cli/pipeline/pipeline.go @@ -89,8 +89,11 @@ func pipelineOutput(c *cli.Command, pipelines []*woodpecker.Pipeline, fd ...io.W if !noHeader { table.WriteHeader(cols) } + table.AddFieldFn("message", func(obj any) string { + pl := obj.(*woodpecker.Pipeline) + return pl.Commit.Message + }) for _, resource := range pipelines { - // TODO get message from commit if err := table.Write(cols, resource); err != nil { return err } diff --git a/server/api/hook_test.go b/server/api/hook_test.go index 6620440f30e..60a3a640326 100644 --- a/server/api/hook_test.go +++ b/server/api/hook_test.go @@ -56,6 +56,7 @@ func TestHook(t *testing.T) { ID: 123, RepoID: repo.ID, Event: model.EventPush, + Commit: &model.Commit{}, } repoToken := token.New(token.HookToken) diff --git a/server/api/pipeline_test.go b/server/api/pipeline_test.go index 04c1ba52c7d..f73815b5d41 100644 --- a/server/api/pipeline_test.go +++ b/server/api/pipeline_test.go @@ -37,6 +37,7 @@ var fakePipeline = &model.Pipeline{ ID: 2, Number: 2, Status: model.StatusSuccess, + Commit: &model.Commit{}, } func TestGetPipelines(t *testing.T) { @@ -169,6 +170,7 @@ func TestGetPipelineMetadata(t *testing.T) { ID: 1, Number: 1, Status: model.StatusFailure, + Commit: &model.Commit{}, } fakeRepo := &model.Repo{ID: 1} diff --git a/server/forge/bitbucket/bitbucket_test.go b/server/forge/bitbucket/bitbucket_test.go index 98d08d5726b..ef8f4ec417e 100644 --- a/server/forge/bitbucket/bitbucket_test.go +++ b/server/forge/bitbucket/bitbucket_test.go @@ -207,12 +207,12 @@ func TestBitbucket(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "martinherren1984/publictestrepo", r.FullName) assert.Equal(t, &model.Commit{ - SHA:"c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", - Message:"a\n", - ForgeURL:"https://bitbucket.org/martinherren1984/publictestrepo/commits/c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", + SHA: "c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", + Message: "a\n", + ForgeURL: "https://bitbucket.org/martinherren1984/publictestrepo/commits/c14c1bb05dfb1fdcdf06b31485fff61b0ea44277", Author: model.CommitAuthor{ Author: "Martin Herren", - Email: "martin.herren@yyy.com", + Email: "martin.herren@yyy.com", }, }, b.Commit) } diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index 444a306c300..9a7dd60c199 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -154,11 +154,6 @@ func Test_convertRepositoryPushEvent(t *testing.T) { Commit: &model.Commit{ SHA: "1234567890abcdef", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Message: "", - Author: model.CommitAuthor{ - Author: "John Doe", - Email: "john.doe@mail.com", - }, }, Branch: "branch", Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", @@ -216,7 +211,10 @@ func Test_convertPullRequestEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: &model.Commit{SHA: "1234567890abcdef"}, + Commit: &model.Commit{ + SHA: "1234567890abcdef", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + }, Branch: "branch", Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", Author: "John Doe", @@ -224,7 +222,11 @@ func Test_convertPullRequestEvent(t *testing.T) { ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Event: model.EventPull, Refspec: "branch:main", - PullRequest: &model.PullRequest{Title: "my title"}, + PullRequest: &model.PullRequest{ + Index: "123", + Title: "my title", + + }, }, to) } @@ -269,7 +271,10 @@ func Test_convertPullRequestCloseEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: &model.Commit{SHA: "1234567890abcdef"}, + Commit: &model.Commit{ + SHA: "1234567890abcdef", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + }, Branch: "branch", Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", Author: "John Doe", @@ -278,7 +283,10 @@ func Test_convertPullRequestCloseEvent(t *testing.T) { ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", Event: model.EventPullClosed, Refspec: "branch:main", - PullRequest: &model.PullRequest{Title: "my title"}, + PullRequest: &model.PullRequest{ + Title: "my title", + Index: "123", + }, }, to) } diff --git a/server/forge/forgejo/fixtures/handler.go b/server/forge/forgejo/fixtures/handler.go index 73c3a9eb7c9..0372d8af08b 100644 --- a/server/forge/forgejo/fixtures/handler.go +++ b/server/forge/forgejo/fixtures/handler.go @@ -36,6 +36,7 @@ func Handler() http.Handler { e.GET("/api/v1/repos/:owner/:name/pulls/:index/files", getPRFiles) e.GET("/api/v1/user/repos", getUserRepos) e.GET("/api/v1/version", getVersion) + e.GET("/api/v1/repos/:owner/:name/git/commits/:sha", getCommit) return e } @@ -137,6 +138,15 @@ func getPRFiles(c *gin.Context) { } } +func getCommit(c *gin.Context) { + switch c.Param("sha") { + case "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c": + c.String(http.StatusOK, commitPayload) + default: + c.String(http.StatusNotFound, "") + } +} + const listRepoHookPayloads = ` [ { @@ -208,3 +218,74 @@ const prFilesPayload = ` } ] ` + +const commitPayload = ` +{ + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": "2025-01-05T12:31:42+02:00", + "html_url": "http://localhost:3000/qwerty287/woodpecker/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "commit": { + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "qwerty287", + "email": "qwerty287@noreply.localhost", + "date": "2025-01-05T12:31:42+02:00" + }, + "committer": { + "name": "qwerty287", + "email": "qwerty287@noreply.localhost", + "date": "2025-01-05T12:31:42+02:00" + }, + "message": "README.md aktualisiert\n", + "tree": { + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/trees/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": "2025-01-05T12:31:42+02:00" + }, + "verification": { + "verified": false, + "reason": "gpg.error.not_signed_commit", + "signature": "", + "signer": null, + "payload": "" + } + }, + "author": { + "id": 1, + "login": "qwerty287", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "qwerty287@noreply.localhost", + "avatar_url": "http://localhost:3000/avatars/25a4ce9e2945c8583f82ce7b2ee8bc3c", + "html_url": "http://localhost:3000/qwerty287", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2023-04-12T18:52:45+03:00", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "qwerty287" + }, + "files": [ + { + "filename": "README.md", + "status": "modified" + } + ], + "stats": { + "total": 2, + "additions": 1, + "deletions": 1 + } +} +` diff --git a/server/forge/forgejo/fixtures/hooks.go b/server/forge/forgejo/fixtures/hooks.go index 9caf1a3d287..c1f27974b76 100644 --- a/server/forge/forgejo/fixtures/hooks.go +++ b/server/forge/forgejo/fixtures/hooks.go @@ -36,6 +36,19 @@ const HookPush = ` "modified": ["app/controller/application.rb"] } ], + "head_commit": { + "id": "ef98532add3b2feb7a137426bba1248724367df5", + "message": "bump\n", + "url": "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + "author": { + "name": "Gordon the Gopher", + "email": "gordon@golang.org", + "username": "gordon" + }, + "added": ["CHANGELOG.md"], + "removed": [], + "modified": ["app/controller/application.rb"] + }, "repository": { "id": 1, "name": "hello-world", @@ -475,6 +488,7 @@ const HookPullRequest = `{ "pull_request": { "html_url": "http://forgejo.golang.org/gordon/hello-world/pull/1", "state": "open", + "number": 1, "title": "Update the README with new information", "body": "please merge", "user": { diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index b942179f407..5d117a6f96b 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -140,7 +140,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { avatar := expandAvatar( hook.Repo.HTMLURL, - fixMalformedAvatar(hook.PullRequest.Poster.AvatarURL), + fixMalformedAvatar(hook.Sender.AvatarURL), ) event := model.EventPull diff --git a/server/forge/forgejo/helper_test.go b/server/forge/forgejo/helper_test.go index 2d4511918e0..b0ed2e3ba38 100644 --- a/server/forge/forgejo/helper_test.go +++ b/server/forge/forgejo/helper_test.go @@ -66,7 +66,15 @@ func Test_parsePush(t *testing.T) { hook, _ := parsePush(buf) pipeline := pipelineFromPush(hook) assert.Equal(t, model.EventPush, pipeline.Event) - assert.Equal(t, hook.After, pipeline.Commit) + assert.Equal(t, &model.Commit{ + SHA:"ef98532add3b2feb7a137426bba1248724367df5", + Message:"bump\n", + ForgeURL:"http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + Author:model.CommitAuthor{ + Author:"Gordon the Gopher", + Email:"gordon@golang.org", + }, + }, pipeline.Commit) assert.Equal(t, hook.Ref, pipeline.Ref) assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) @@ -91,10 +99,10 @@ func Test_parsePush(t *testing.T) { hook, _ := parsePush(buf) pipeline := pipelineFromTag(hook) assert.Equal(t, model.EventTag, pipeline.Event) - assert.Equal(t, hook.Sha, pipeline.Commit) + assert.Equal(t, hook.Sha, pipeline.Commit.SHA) assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) assert.Empty(t, pipeline.Branch) - assert.Equal(t, "http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0", pipeline.ForgeURL) + assert.Equal(t, "http://forgejo.golang.org/gordon/hello-world/releases/tag/v1.0.0", pipeline.ForgeURL) }) } @@ -130,13 +138,13 @@ func Test_parsePullRequest(t *testing.T) { hook, _ := parsePullRequest(buf) pipeline := pipelineFromPullRequest(hook) assert.Equal(t, model.EventPull, pipeline.Event) - assert.Equal(t, hook.PullRequest.Head.Sha, pipeline.Commit) + assert.Equal(t, hook.PullRequest.Head.Sha, pipeline.Commit.SHA) assert.Equal(t, "refs/pull/1/head", pipeline.Ref) assert.Equal(t, "http://forgejo.golang.org/gordon/hello-world/pull/1", pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index cc85c543a43..f62c16276e6 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -66,9 +66,10 @@ func TestForgejoParser(t *testing.T) { Event: "push", Commit: &model.Commit{ SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", + Message: "Delete '.woodpecker/.check.yml'\n", Author: model.CommitAuthor{ - Author: "6543", - Email: "6543@obermui.de", + Author: "meisam", + Email: "meisam@noreply.codeberg.org", }, ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", }, @@ -105,10 +106,11 @@ func TestForgejoParser(t *testing.T) { Commit: &model.Commit{ SHA: "ef98532add3b2feb7a137426bba1248724367df5", Author: model.CommitAuthor{ - Author: "gordon", + Author: "Gordon the Gopher", Email: "gordon@golang.org", }, ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + Message: "bump\n", }, Branch: "main", Ref: "refs/heads/main", @@ -139,8 +141,16 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Event: "push", + Commit: &model.Commit{ + SHA: "29be01c073851cf0db0c6a466e396b725a670453", + Message: "add some text\n", + ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/commit/29be01c073851cf0db0c6a466e396b725a670453", + Author: model.CommitAuthor{ + Author: "6543", + Email: "6543@obermui.de", + }, + }, Branch: "main", Ref: "refs/heads/main", Author: "test-user", @@ -176,7 +186,7 @@ func TestForgejoParser(t *testing.T) { Ref: "refs/tags/v1.0.0", Author: "gordon", Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - ForgeURL: "http://forgejo.golang.org/gordon/hello-world/src/tag/v1.0.0", + ForgeURL: "http://forgejo.golang.org/gordon/hello-world/releases/tag/v1.0.0", }, }, { @@ -211,6 +221,8 @@ func TestForgejoParser(t *testing.T) { ForgeURL: "http://forgejo.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Update the README with new information", }, }, }, @@ -250,6 +262,8 @@ func TestForgejoParser(t *testing.T) { "Kind/Bug", "Kind/Security", }, + Index: "2", + Title: "New Pull", }, }, }, @@ -285,6 +299,8 @@ func TestForgejoParser(t *testing.T) { ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Adjust file", }, }, }, @@ -320,6 +336,8 @@ func TestForgejoParser(t *testing.T) { ForgeURL: "https://forgejo.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Adjust file", }, }, }, @@ -351,8 +369,8 @@ func TestForgejoParser(t *testing.T) { Ref: "refs/tags/0.0.5", Author: "anbraten", Avatar: "https://git.xxx/user/avatar/anbraten/-1", - ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", + ReleaseTitle: "Version 0.0.5", }, }, } diff --git a/server/forge/gitea/fixtures/handler.go b/server/forge/gitea/fixtures/handler.go index 7bc2bbb42ad..6d15d4670bb 100644 --- a/server/forge/gitea/fixtures/handler.go +++ b/server/forge/gitea/fixtures/handler.go @@ -36,6 +36,7 @@ func Handler() http.Handler { e.GET("/api/v1/repos/:owner/:name/pulls/:index/files", getPRFiles) e.GET("/api/v1/user/repos", getUserRepos) e.GET("/api/v1/version", getVersion) + e.GET("/api/v1/repos/:owner/:name/git/commits/:sha", getCommit) return e } @@ -137,6 +138,15 @@ func getPRFiles(c *gin.Context) { } } +func getCommit(c *gin.Context) { + switch c.Param("sha") { + case "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c": + c.String(http.StatusOK, commitPayload) + default: + c.String(http.StatusNotFound, "") + } +} + const listRepoHookPayloads = ` [ { @@ -208,3 +218,74 @@ const prFilesPayload = ` } ] ` + +const commitPayload = ` +{ + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": "2025-01-05T12:31:42+02:00", + "html_url": "http://localhost:3000/qwerty287/woodpecker/commit/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "commit": { + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/commits/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "author": { + "name": "qwerty287", + "email": "qwerty287@noreply.localhost", + "date": "2025-01-05T12:31:42+02:00" + }, + "committer": { + "name": "qwerty287", + "email": "qwerty287@noreply.localhost", + "date": "2025-01-05T12:31:42+02:00" + }, + "message": "README.md aktualisiert\n", + "tree": { + "url": "http://localhost:3000/api/v1/repos/qwerty287/woodpecker/git/trees/0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "sha": "0d1a26e67d8f5eaf1f6ba5c57fc3c7d91ac0fd1c", + "created": "2025-01-05T12:31:42+02:00" + }, + "verification": { + "verified": false, + "reason": "gpg.error.not_signed_commit", + "signature": "", + "signer": null, + "payload": "" + } + }, + "author": { + "id": 1, + "login": "qwerty287", + "login_name": "", + "source_id": 0, + "full_name": "", + "email": "qwerty287@noreply.localhost", + "avatar_url": "http://localhost:3000/avatars/25a4ce9e2945c8583f82ce7b2ee8bc3c", + "html_url": "http://localhost:3000/qwerty287", + "language": "", + "is_admin": false, + "last_login": "0001-01-01T00:00:00Z", + "created": "2023-04-12T18:52:45+03:00", + "restricted": false, + "active": false, + "prohibit_login": false, + "location": "", + "website": "", + "description": "", + "visibility": "public", + "followers_count": 0, + "following_count": 0, + "starred_repos_count": 0, + "username": "qwerty287" + }, + "files": [ + { + "filename": "README.md", + "status": "modified" + } + ], + "stats": { + "total": 2, + "additions": 1, + "deletions": 1 + } +} +` diff --git a/server/forge/gitea/fixtures/hooks.go b/server/forge/gitea/fixtures/hooks.go index 2b151a62ce3..92f055d3995 100644 --- a/server/forge/gitea/fixtures/hooks.go +++ b/server/forge/gitea/fixtures/hooks.go @@ -36,6 +36,19 @@ const HookPush = ` "modified": ["app/controller/application.rb"] } ], + "head_commit": { + "id": "ef98532add3b2feb7a137426bba1248724367df5", + "message": "bump\n", + "url": "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + "author": { + "name": "Gordon the Gopher", + "email": "gordon@golang.org", + "username": "gordon" + }, + "added": ["CHANGELOG.md"], + "removed": [], + "modified": ["app/controller/application.rb"] + }, "repository": { "id": 1, "name": "hello-world", @@ -475,6 +488,7 @@ const HookPullRequest = `{ "pull_request": { "html_url": "http://gitea.golang.org/gordon/hello-world/pull/1", "state": "open", + "number": 1, "title": "Update the README with new information", "body": "please merge", "user": { diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index d91a1d8f216..196c579f9b3 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -141,7 +141,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { func pipelineFromPullRequest(hook *pullRequestHook) *model.Pipeline { avatar := expandAvatar( hook.Repo.HTMLURL, - fixMalformedAvatar(hook.PullRequest.Poster.AvatarURL), + fixMalformedAvatar(hook.Sender.AvatarURL), ) event := model.EventPull diff --git a/server/forge/gitea/helper_test.go b/server/forge/gitea/helper_test.go index 0837fc5b07f..1a6bf95841f 100644 --- a/server/forge/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -67,7 +67,15 @@ func Test_parsePush(t *testing.T) { hook, _ := parsePush(buf) pipeline := pipelineFromPush(hook) assert.Equal(t, model.EventPush, pipeline.Event) - assert.Equal(t, hook.After, pipeline.Commit) + assert.Equal(t, &model.Commit{ + SHA: "ef98532add3b2feb7a137426bba1248724367df5", + Message: "bump\n", + ForgeURL: "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + Author: model.CommitAuthor{ + Author: "Gordon the Gopher", + Email: "gordon@golang.org", + }, + }, pipeline.Commit) assert.Equal(t, hook.Ref, pipeline.Ref) assert.Equal(t, hook.Commits[0].URL, pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) @@ -92,10 +100,10 @@ func Test_parsePush(t *testing.T) { hook, _ := parsePush(buf) pipeline := pipelineFromTag(hook) assert.Equal(t, model.EventTag, pipeline.Event) - assert.Equal(t, hook.Sha, pipeline.Commit) + assert.Equal(t, hook.Sha, pipeline.Commit.SHA) assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) assert.Empty(t, pipeline.Branch) - assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0", pipeline.ForgeURL) + assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/src/releases/v1.0.0", pipeline.ForgeURL) }) } @@ -131,13 +139,13 @@ func Test_parsePullRequest(t *testing.T) { hook, _ := parsePullRequest(buf) pipeline := pipelineFromPullRequest(hook) assert.Equal(t, model.EventPull, pipeline.Event) - assert.Equal(t, hook.PullRequest.Head.Sha, pipeline.Commit) + assert.Equal(t, hook.PullRequest.Head.Sha, pipeline.Commit.SHA) assert.Equal(t, "refs/pull/1/head", pipeline.Ref) assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/pull/1", pipeline.ForgeURL) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "feature/changes:main", pipeline.Refspec) assert.Equal(t, hook.PullRequest.Title, pipeline.PullRequest.Title) - assert.Equal(t, "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) + assert.Equal(t, "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", pipeline.Avatar) assert.Equal(t, hook.PullRequest.Poster.UserName, pipeline.Author) }) diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index 9baf8899345..514f8baa5cd 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -64,8 +64,16 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b"}, + Event: "push", + Commit: &model.Commit{ + SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", + Message: "Delete '.woodpecker/.check.yml'\n", + ForgeURL: "https://codeberg.org/meisam/woodpecktester/commit/28c3613ae62640216bea5e7dc71aa65356e4298b", + Author: model.CommitAuthor{ + Author: "meisam", + Email: "meisam@noreply.codeberg.org", + }, + }, Branch: "fdsafdsa", Ref: "refs/heads/fdsafdsa", Author: "6543", @@ -96,8 +104,16 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, + Event: "push", + Commit: &model.Commit{ + SHA: "ef98532add3b2feb7a137426bba1248724367df5", + Message: "bump\n", + ForgeURL: "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + Author: model.CommitAuthor{ + Author: "Gordon the Gopher", + Email: "gordon@golang.org", + }, + }, Branch: "main", Ref: "refs/heads/main", Author: "gordon", @@ -127,8 +143,16 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "push", - Commit: &model.Commit{SHA: "29be01c073851cf0db0c6a466e396b725a670453"}, + Event: "push", + Commit: &model.Commit{ + SHA: "29be01c073851cf0db0c6a466e396b725a670453", + Message: "add some text\n", + ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/commit/29be01c073851cf0db0c6a466e396b725a670453", + Author: model.CommitAuthor{ + Author: "6543", + Email: "6543@obermui.de", + }, + }, Branch: "main", Ref: "refs/heads/main", Author: "test-user", @@ -163,8 +187,8 @@ func TestGiteaParser(t *testing.T) { Commit: &model.Commit{SHA: "ef98532add3b2feb7a137426bba1248724367df5"}, Ref: "refs/tags/v1.0.0", Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/tag/v1.0.0", + Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/releases/v1.0.0", }, }, { @@ -195,10 +219,12 @@ func TestGiteaParser(t *testing.T) { Ref: "refs/pull/1/head", Refspec: "feature/changes:main", Author: "gordon", - Avatar: "http://1.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", + Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", ForgeURL: "http://gitea.golang.org/gordon/hello-world/pull/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Update the README with new information", }, }, }, @@ -233,10 +259,14 @@ func TestGiteaParser(t *testing.T) { Author: "test", Avatar: "http://127.0.0.1:3000/avatars/dd46a756faad4727fb679320751f6dea", ForgeURL: "http://127.0.0.1:3000/Test-CI/multi-line-secrets/pulls/2", - PullRequest: &model.PullRequest{Labels: []string{ - "Kind/Bug", - "Kind/Security", - }}, + PullRequest: &model.PullRequest{ + Labels: []string{ + "Kind/Bug", + "Kind/Security", + }, + Index: "2", + Title: "New Pull", + }, }, }, { @@ -271,6 +301,8 @@ func TestGiteaParser(t *testing.T) { ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Adjust file", }, }, }, @@ -306,6 +338,8 @@ func TestGiteaParser(t *testing.T) { ForgeURL: "https://gitea.com/anbraten/test-repo/pulls/1", PullRequest: &model.PullRequest{ Labels: []string{}, + Index: "1", + Title: "Adjust file", }, }, }, diff --git a/server/forge/github/convert_test.go b/server/forge/github/convert_test.go index b8e5a639873..2ce3e562f17 100644 --- a/server/forge/github/convert_test.go +++ b/server/forge/github/convert_test.go @@ -182,7 +182,8 @@ func Test_parsePullHook(t *testing.T) { AvatarURL: github.Ptr("https://avatars1.githubusercontent.com/u/583231"), }, }, Sender: &github.User{ - Login: github.Ptr("octocat"), + Login: github.Ptr("octocat"), + AvatarURL: github.Ptr("https://avatars1.githubusercontent.com/u/583231"), }, } pull, _, pipeline, err := parsePullHook(from, true) @@ -192,7 +193,7 @@ func Test_parsePullHook(t *testing.T) { assert.Equal(t, *from.PullRequest.Base.Ref, pipeline.Branch) assert.Equal(t, "refs/pull/42/merge", pipeline.Ref) assert.Equal(t, "changes:main", pipeline.Refspec) - assert.Equal(t, *from.PullRequest.Head.SHA, pipeline.Commit) + assert.Equal(t, *from.PullRequest.Head.SHA, pipeline.Commit.SHA) assert.Equal(t, *from.PullRequest.Title, pipeline.PullRequest.Title) assert.Equal(t, *from.PullRequest.User.Login, pipeline.Author) assert.Equal(t, *from.PullRequest.User.AvatarURL, pipeline.Avatar) @@ -215,7 +216,7 @@ func Test_parseDeployHook(t *testing.T) { assert.Equal(t, model.EventDeploy, pipeline.Event) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "refs/heads/main", pipeline.Ref) - assert.Equal(t, *from.Deployment.SHA, pipeline.Commit) + assert.Equal(t, *from.Deployment.SHA, pipeline.Commit.SHA) assert.Equal(t, *from.Deployment.Description, pipeline.Deployment.Description) assert.Equal(t, *from.Deployment.URL, pipeline.ForgeURL) assert.Equal(t, *from.Sender.Login, pipeline.Author) @@ -238,40 +239,22 @@ func Test_parsePushHook(t *testing.T) { assert.Equal(t, model.EventPush, pipeline.Event) assert.Equal(t, "main", pipeline.Branch) assert.Equal(t, "refs/heads/main", pipeline.Ref) - assert.Equal(t, *from.HeadCommit.ID, pipeline.Commit) - assert.Equal(t, *from.HeadCommit.Message, pipeline.Commit.Message) - assert.Equal(t, *from.HeadCommit.URL, pipeline.ForgeURL) - assert.Equal(t, *from.Sender.Login, pipeline.Author) - assert.Equal(t, *from.Sender.AvatarURL, pipeline.Avatar) - assert.Equal(t, *from.HeadCommit.Author.Email, pipeline.Commit.Author.Email) + assert.Equal(t, &model.Commit{SHA: "f72fc19", Message: "updated README.md", ForgeURL: "https://github.com/octocat/hello-world", Author: model.CommitAuthor{Author: "", Email: "github.Ptr(octocat@github.com"}}, pipeline.Commit) + assert.Equal(t, from.GetHeadCommit().GetMessage(), pipeline.Commit.Message) + assert.Equal(t, from.GetHeadCommit().GetURL(), pipeline.ForgeURL) + assert.Equal(t, from.GetSender().GetLogin(), pipeline.Author) + assert.Equal(t, from.GetSender().GetAvatarURL(), pipeline.Avatar) + assert.Equal(t, from.GetHeadCommit().GetAuthor().GetEmail(), pipeline.Commit.Author.Email) }) t.Run("convert tag from webhook", func(t *testing.T) { from := &github.PushEvent{} from.Ref = github.Ptr("refs/tags/v1.0.0") - - _, pipeline := parsePushHook(from) - assert.Equal(t, model.EventTag, pipeline.Event) - assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) - }) - - t.Run("convert tag's base branch to pipeline's branch ", func(t *testing.T) { - from := &github.PushEvent{} - from.Ref = github.Ptr("refs/tags/v1.0.0") from.BaseRef = github.Ptr("refs/heads/main") _, pipeline := parsePushHook(from) assert.Equal(t, model.EventTag, pipeline.Event) - assert.Equal(t, "main", pipeline.Branch) - }) - - t.Run("not convert tag's base_ref from webhook if not prefixed with 'ref/heads/'", func(t *testing.T) { - from := &github.PushEvent{} - from.Ref = github.Ptr("refs/tags/v1.0.0") - from.BaseRef = github.Ptr("refs/refs/main") - - _, pipeline := parsePushHook(from) - assert.Equal(t, model.EventTag, pipeline.Event) - assert.Equal(t, "refs/tags/v1.0.0", pipeline.Branch) + assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) + assert.Empty(t, pipeline.Branch) }) } diff --git a/server/pipeline/stepbuilder/metadata_test.go b/server/pipeline/stepbuilder/metadata_test.go index 954f413342b..c91b2e64dcf 100644 --- a/server/pipeline/stepbuilder/metadata_test.go +++ b/server/pipeline/stepbuilder/metadata_test.go @@ -41,8 +41,8 @@ func TestMetadataFromStruct(t *testing.T) { }{ { name: "Test with empty info", - pipeline: &model.Pipeline{Commit: &model.Commit{}}, - prev: &model.Pipeline{Commit: &model.Commit{}}, + pipeline: &model.Pipeline{Commit: &model.Commit{}}, + prev: &model.Pipeline{Commit: &model.Commit{}}, expectedMetadata: metadata.Metadata{Sys: metadata.System{Name: "woodpecker"}}, expectedEnviron: map[string]string{ "CI": "woodpecker", diff --git a/server/pipeline/stepbuilder/stepBuilder_test.go b/server/pipeline/stepbuilder/stepBuilder_test.go index ce62b3a1af4..547bf8a2cd9 100644 --- a/server/pipeline/stepbuilder/stepBuilder_test.go +++ b/server/pipeline/stepbuilder/stepBuilder_test.go @@ -162,7 +162,7 @@ func TestMultiPipeline(t *testing.T) { Forge: getMockForge(t), Repo: &model.Repo{}, Curr: &model.Pipeline{ - Event: model.EventPush, + Event: model.EventPush, Commit: &model.Commit{}, }, Prev: &model.Pipeline{Commit: &model.Commit{}}, @@ -204,8 +204,8 @@ func TestDependsOn(t *testing.T) { Forge: getMockForge(t), Repo: &model.Repo{}, Curr: &model.Pipeline{ - Event: model.EventPush, - Commit: &model.Commit{}, + Event: model.EventPush, + Commit: &model.Commit{}, }, Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, @@ -260,7 +260,7 @@ func TestRunsOn(t *testing.T) { Forge: getMockForge(t), Repo: &model.Repo{}, Curr: &model.Pipeline{ - Event: model.EventPush, + Event: model.EventPush, Commit: &model.Commit{}, }, Prev: &model.Pipeline{Commit: &model.Commit{}}, @@ -302,7 +302,7 @@ func TestPipelineName(t *testing.T) { Forge: getMockForge(t), Repo: &model.Repo{Config: ".woodpecker"}, Curr: &model.Pipeline{ - Event: model.EventPush, + Event: model.EventPush, Commit: &model.Commit{}, }, Prev: &model.Pipeline{Commit: &model.Commit{}}, @@ -347,7 +347,7 @@ func TestBranchFilter(t *testing.T) { Curr: &model.Pipeline{ Branch: "dev", Event: model.EventPush, - Commit: &model.Commit{}, + Commit: &model.Commit{}, }, Prev: &model.Pipeline{Commit: &model.Commit{}}, Netrc: &model.Netrc{}, diff --git a/server/store/datastore/pipeline_test.go b/server/store/datastore/pipeline_test.go index de240054152..a47fc57ff68 100644 --- a/server/store/datastore/pipeline_test.go +++ b/server/store/datastore/pipeline_test.go @@ -61,7 +61,7 @@ func TestPipelines(t *testing.T) { assert.NoError(t, err) assert.NotZero(t, pipeline.ID) assert.EqualValues(t, 1, pipeline.Number) - assert.Equal(t, "85f8c029b902ed9400bc600bac301a0aadb144ac", pipeline.Commit) + assert.Equal(t, "85f8c029b902ed9400bc600bac301a0aadb144ac", pipeline.Commit.SHA) count, err = store.GetPipelineCount() assert.NoError(t, err) From d8c458907627fd01c3dd09587dd2d8d6845d2c22 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 13:43:55 +0200 Subject: [PATCH 11/30] fix gitea tag url --- .../forge/bitbucketdatacenter/convert_test.go | 29 +++++++++---------- server/forge/forgejo/helper_test.go | 12 ++++---- server/forge/forgejo/parse_test.go | 16 +++++----- server/forge/gitea/helper.go | 2 +- server/forge/gitea/helper_test.go | 8 ++--- server/forge/gitea/parse_test.go | 2 +- 6 files changed, 34 insertions(+), 35 deletions(-) diff --git a/server/forge/bitbucketdatacenter/convert_test.go b/server/forge/bitbucketdatacenter/convert_test.go index 9a7dd60c199..a5fe771b12c 100644 --- a/server/forge/bitbucketdatacenter/convert_test.go +++ b/server/forge/bitbucketdatacenter/convert_test.go @@ -211,21 +211,20 @@ func Test_convertPullRequestEvent(t *testing.T) { } to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ - Commit: &model.Commit{ - SHA: "1234567890abcdef", + Commit: &model.Commit{ + SHA: "1234567890abcdef", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", }, - Branch: "branch", - Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", - Author: "John Doe", - Ref: "refs/pull-requests/123/from", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPull, - Refspec: "branch:main", + Branch: "branch", + Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", + Author: "John Doe", + Ref: "refs/pull-requests/123/from", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPull, + Refspec: "branch:main", PullRequest: &model.PullRequest{ Index: "123", Title: "my title", - }, }, to) } @@ -272,17 +271,17 @@ func Test_convertPullRequestCloseEvent(t *testing.T) { to := convertPullRequestEvent(from, "https://base.url") assert.Equal(t, &model.Pipeline{ Commit: &model.Commit{ - SHA: "1234567890abcdef", + SHA: "1234567890abcdef", ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", }, Branch: "branch", Avatar: "https://base.url/users/john.doe_mail.com/avatar.png", Author: "John Doe", - Ref: "refs/pull-requests/123/from", - ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", - Event: model.EventPullClosed, - Refspec: "branch:main", + Ref: "refs/pull-requests/123/from", + ForgeURL: "https://base.url/projects/PRJ/repos/REPO/commits/1234567890abcdef", + Event: model.EventPullClosed, + Refspec: "branch:main", PullRequest: &model.PullRequest{ Title: "my title", Index: "123", diff --git a/server/forge/forgejo/helper_test.go b/server/forge/forgejo/helper_test.go index b0ed2e3ba38..702a23519b6 100644 --- a/server/forge/forgejo/helper_test.go +++ b/server/forge/forgejo/helper_test.go @@ -67,12 +67,12 @@ func Test_parsePush(t *testing.T) { pipeline := pipelineFromPush(hook) assert.Equal(t, model.EventPush, pipeline.Event) assert.Equal(t, &model.Commit{ - SHA:"ef98532add3b2feb7a137426bba1248724367df5", - Message:"bump\n", - ForgeURL:"http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", - Author:model.CommitAuthor{ - Author:"Gordon the Gopher", - Email:"gordon@golang.org", + SHA: "ef98532add3b2feb7a137426bba1248724367df5", + Message: "bump\n", + ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", + Author: model.CommitAuthor{ + Author: "Gordon the Gopher", + Email: "gordon@golang.org", }, }, pipeline.Commit) assert.Equal(t, hook.Ref, pipeline.Ref) diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index f62c16276e6..8c1b91b9eb9 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -65,7 +65,7 @@ func TestForgejoParser(t *testing.T) { pipe: &model.Pipeline{ Event: "push", Commit: &model.Commit{ - SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", + SHA: "28c3613ae62640216bea5e7dc71aa65356e4298b", Message: "Delete '.woodpecker/.check.yml'\n", Author: model.CommitAuthor{ Author: "meisam", @@ -110,7 +110,7 @@ func TestForgejoParser(t *testing.T) { Email: "gordon@golang.org", }, ForgeURL: "http://forgejo.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", - Message: "bump\n", + Message: "bump\n", }, Branch: "main", Ref: "refs/heads/main", @@ -364,12 +364,12 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "release", - Branch: "main", - Ref: "refs/tags/0.0.5", - Author: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", + Event: "release", + Branch: "main", + Ref: "refs/tags/0.0.5", + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", ReleaseTitle: "Version 0.0.5", }, }, diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 196c579f9b3..0f40a542f89 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -131,7 +131,7 @@ func pipelineFromTag(hook *pushHook) *model.Pipeline { SHA: hook.Sha, }, Ref: fmt.Sprintf("refs/tags/%s", ref), - ForgeURL: fmt.Sprintf("%s/src/releases/%s", hook.Repo.HTMLURL, ref), + ForgeURL: fmt.Sprintf("%s/src/releases/tag/%s", hook.Repo.HTMLURL, ref), Author: hook.Sender.UserName, Avatar: avatar, } diff --git a/server/forge/gitea/helper_test.go b/server/forge/gitea/helper_test.go index 1a6bf95841f..1ddd79c041a 100644 --- a/server/forge/gitea/helper_test.go +++ b/server/forge/gitea/helper_test.go @@ -68,12 +68,12 @@ func Test_parsePush(t *testing.T) { pipeline := pipelineFromPush(hook) assert.Equal(t, model.EventPush, pipeline.Event) assert.Equal(t, &model.Commit{ - SHA: "ef98532add3b2feb7a137426bba1248724367df5", - Message: "bump\n", + SHA: "ef98532add3b2feb7a137426bba1248724367df5", + Message: "bump\n", ForgeURL: "http://gitea.golang.org/gordon/hello-world/commit/ef98532add3b2feb7a137426bba1248724367df5", Author: model.CommitAuthor{ Author: "Gordon the Gopher", - Email: "gordon@golang.org", + Email: "gordon@golang.org", }, }, pipeline.Commit) assert.Equal(t, hook.Ref, pipeline.Ref) @@ -103,7 +103,7 @@ func Test_parsePush(t *testing.T) { assert.Equal(t, hook.Sha, pipeline.Commit.SHA) assert.Equal(t, "refs/tags/v1.0.0", pipeline.Ref) assert.Empty(t, pipeline.Branch) - assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/src/releases/v1.0.0", pipeline.ForgeURL) + assert.Equal(t, "http://gitea.golang.org/gordon/hello-world/src/releases/tag/v1.0.0", pipeline.ForgeURL) }) } diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index 514f8baa5cd..e145cebfe34 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -188,7 +188,7 @@ func TestGiteaParser(t *testing.T) { Ref: "refs/tags/v1.0.0", Author: "gordon", Avatar: "https://secure.gravatar.com/avatar/8c58a0be77ee441bb8f8595b7f1b4e87", - ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/releases/v1.0.0", + ForgeURL: "http://gitea.golang.org/gordon/hello-world/src/releases/tag/v1.0.0", }, }, { From 63d3daecebd26432a3028dc9643c785afa4dc4d0 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 5 Jan 2025 13:44:43 +0200 Subject: [PATCH 12/30] fix lint --- cli/pipeline/pipeline.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/pipeline/pipeline.go b/cli/pipeline/pipeline.go index a867650ef2f..ab42a239dec 100644 --- a/cli/pipeline/pipeline.go +++ b/cli/pipeline/pipeline.go @@ -90,7 +90,7 @@ func pipelineOutput(c *cli.Command, pipelines []*woodpecker.Pipeline, fd ...io.W table.WriteHeader(cols) } table.AddFieldFn("message", func(obj any) string { - pl := obj.(*woodpecker.Pipeline) + pl, _ := obj.(*woodpecker.Pipeline) return pl.Commit.Message }) for _, resource := range pipelines { From aaf2e785bf9ba07568a84baf4defc4a5a2b78a3d Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 6 Jan 2025 08:58:50 +0200 Subject: [PATCH 13/30] Add migration docs and basic UI --- docs/docs/20-usage/50-environment.md | 2 - docs/src/pages/migrations.md | 2 + .../frontend/metadata/drone_compatibility.go | 1 - .../metadata/drone_compatibility_test.go | 6 --- .../components/repo/pipeline/PipelineItem.vue | 38 +++++++++++++------ 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/docs/docs/20-usage/50-environment.md b/docs/docs/20-usage/50-environment.md index 746cb7634dd..47f784ca4f1 100644 --- a/docs/docs/20-usage/50-environment.md +++ b/docs/docs/20-usage/50-environment.md @@ -77,7 +77,6 @@ This is the reference list of all environment variables available to your pipeli | `CI_COMMIT_MESSAGE` | commit message | `Initial commit` | | `CI_COMMIT_AUTHOR` | commit author username | `john-doe` | | `CI_COMMIT_AUTHOR_EMAIL` | commit author email address | `john-doe@example.com` | -| `CI_COMMIT_AUTHOR_AVATAR` | commit author avatar | `https://git.example.com/avatars/5dcbcadbce6f87f8abef` | | `CI_COMMIT_PRERELEASE` | release is a pre-release (empty if event is not `release`) | `false` | | | **Current pipeline** | | | `CI_PIPELINE_NUMBER` | pipeline number | `8` | @@ -108,7 +107,6 @@ This is the reference list of all environment variables available to your pipeli | `CI_PREV_COMMIT_MESSAGE` | previous commit message | `test` | | `CI_PREV_COMMIT_AUTHOR` | previous commit author username | `john-doe` | | `CI_PREV_COMMIT_AUTHOR_EMAIL` | previous commit author email address | `john-doe@example.com` | -| `CI_PREV_COMMIT_AUTHOR_AVATAR` | previous commit author avatar | `https://git.example.com/avatars/12` | | | **Previous pipeline** | | | `CI_PREV_PIPELINE_NUMBER` | previous pipeline number | `7` | | `CI_PREV_PIPELINE_PARENT` | previous pipeline number of parent pipeline | `0` | diff --git a/docs/src/pages/migrations.md b/docs/src/pages/migrations.md index bd8be044cb9..318d12d13e1 100644 --- a/docs/src/pages/migrations.md +++ b/docs/src/pages/migrations.md @@ -39,6 +39,7 @@ The following built-in environment variables have been removed/replaced: - `CI_PIPELINE_FINISHED` as it was empty during execution - `CI_PIPELINE_STATUS` due to always being set to `success` - `CI_STEP_STATUS` due to always being set to `success` +- `CI_COMMIT_AUTHOR_AVATAR` and `CI_PREV_COMMIT_AUTHOR_AVATAR` as commit authors don't have an avatar - `WOODPECKER_WEBHOOK_HOST` in favor of `WOODPECKER_EXPERT_WEBHOOK_HOST` Environment variables which are empty after workflow parsing are not being injected into the build but filtered out beforehand ([#4193](https://github.com/woodpecker-ci/woodpecker/pull/4193)) @@ -82,6 +83,7 @@ The following syntax deprecations will now result in an error: #### API changes - Removed deprecated `registry/` endpoint. Use `registries`, `/authorize/token` +- Changed the pipeline model to have different objects for different event metadata (e.g. pull request title) #### CLI changes diff --git a/pipeline/frontend/metadata/drone_compatibility.go b/pipeline/frontend/metadata/drone_compatibility.go index d93d14d90ba..07519333032 100644 --- a/pipeline/frontend/metadata/drone_compatibility.go +++ b/pipeline/frontend/metadata/drone_compatibility.go @@ -42,7 +42,6 @@ func SetDroneEnviron(env map[string]string) { copyEnv("CI_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR", env) copyEnv("CI_COMMIT_AUTHOR", "DRONE_COMMIT_AUTHOR_NAME", env) copyEnv("CI_COMMIT_AUTHOR_EMAIL", "DRONE_COMMIT_AUTHOR_EMAIL", env) - copyEnv("CI_COMMIT_AUTHOR_AVATAR", "DRONE_COMMIT_AUTHOR_AVATAR", env) // repo copyEnv("CI_REPO", "DRONE_REPO", env) copyEnv("CI_REPO_OWNER", "DRONE_REPO_OWNER", env) diff --git a/pipeline/frontend/metadata/drone_compatibility_test.go b/pipeline/frontend/metadata/drone_compatibility_test.go index e31d0a7ac1a..084b21ee8f4 100644 --- a/pipeline/frontend/metadata/drone_compatibility_test.go +++ b/pipeline/frontend/metadata/drone_compatibility_test.go @@ -26,7 +26,6 @@ import ( func TestSetDroneEnvironOnPull(t *testing.T) { woodpeckerVars := `CI=woodpecker CI_COMMIT_AUTHOR=6543 -CI_COMMIT_AUTHOR_AVATAR=https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173 CI_COMMIT_BRANCH=main CI_COMMIT_MESSAGE=fix testscript CI_COMMIT_PULL_REQUEST=9 @@ -42,7 +41,6 @@ CI_PIPELINE_EVENT=pull_request CI_PIPELINE_NUMBER=41 CI_PIPELINE_STARTED=1685749339 CI_PREV_COMMIT_AUTHOR=6543 -CI_PREV_COMMIT_AUTHOR_AVATAR=https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173 CI_PREV_COMMIT_BRANCH=main CI_PREV_COMMIT_MESSAGE=Print filename and linenuber on fail CI_PREV_COMMIT_REF=refs/pull/13/head @@ -77,7 +75,6 @@ DRONE_BUILD_STARTED=1685749339 DRONE_BUILD_STATUS=success DRONE_COMMIT=a778b069d9f5992786d2db9be493b43868cfce76 DRONE_COMMIT_AUTHOR=6543 -DRONE_COMMIT_AUTHOR_AVATAR=https://codeberg.org/avatars/09a234c768cb9bca78f6b2f82d6af173 DRONE_COMMIT_AUTHOR_NAME=6543 DRONE_COMMIT_BEFORE=e246aff5a9466df2e522efc9007823a7496d9d41 DRONE_COMMIT_BRANCH=main @@ -108,7 +105,6 @@ PULLREQUEST_DRONE_PULL_REQUEST=9` func TestSetDroneEnvironOnPush(t *testing.T) { woodpeckerVars := `CI_COMMIT_AUTHOR=test -CI_COMMIT_AUTHOR_AVATAR=http://1.2.3.4:3000/avatars/dd46a756faad4727fb679320751f6dea CI_COMMIT_AUTHOR_EMAIL=test@noreply.localhost CI_COMMIT_BRANCH=main CI_COMMIT_MESSAGE=revert 9b2aed1392fc097ef7b027712977722fb004d463 @@ -134,7 +130,6 @@ CI_PIPELINE_PARENT=23 CI_PIPELINE_STARTED=1721328737 CI_PIPELINE_URL=http://1.2.3.4:8000/repos/2/pipeline/24 CI_PREV_COMMIT_AUTHOR=test -CI_PREV_COMMIT_AUTHOR_AVATAR=http://1.2.3.4:3000/avatars/dd46a756faad4727fb679320751f6dea CI_PREV_COMMIT_AUTHOR_EMAIL=test@noreply.localhost CI_PREV_COMMIT_BRANCH=main CI_PREV_COMMIT_MESSAGE=revert 9b2aed1392fc097ef7b027712977722fb004d463 @@ -191,7 +186,6 @@ DRONE_BUILD_STARTED=1721328737 DRONE_BUILD_STATUS=success DRONE_COMMIT=8826c98181353075bbeee8f99b400496488e3523 DRONE_COMMIT_AUTHOR=test -DRONE_COMMIT_AUTHOR_AVATAR=http://1.2.3.4:3000/avatars/dd46a756faad4727fb679320751f6dea DRONE_COMMIT_AUTHOR_EMAIL=test@noreply.localhost DRONE_COMMIT_AUTHOR_NAME=test DRONE_COMMIT_BEFORE=8826c98181353075bbeee8f99b400496488e3523 diff --git a/web/src/components/repo/pipeline/PipelineItem.vue b/web/src/components/repo/pipeline/PipelineItem.vue index 261406583f5..abbe94ea048 100644 --- a/web/src/components/repo/pipeline/PipelineItem.vue +++ b/web/src/components/repo/pipeline/PipelineItem.vue @@ -17,23 +17,39 @@
+
-
- - #{{ pipeline.number }} - - - - +
+ + #{{ pipeline.number }} + + - + + {{ shortMessage }} + +
+ +
- {{ shortMessage }} - + + + + + + {{ shortContext }} +
{ switch (pipeline.value.event) { From d1883988bf700485afc2119c9bb37e0954b944ac Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:07:15 +0200 Subject: [PATCH 14/30] resolve gitlab tag url --- server/forge/gitlab/convert.go | 2 +- server/forge/gitlab/gitlab_test.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 65ca2ab6c8f..548e3956b63 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -231,7 +231,7 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) pipeline.Ref = hook.Ref pipeline.Author = hook.UserUsername pipeline.Avatar = hook.UserAvatar - pipeline.ForgeURL = "// TODO" + pipeline.ForgeURL = repo.ForgeURL + "/-/tags/" + strings.TrimPrefix(hook.Ref, "refs/tags/") // TODO does hook.Commits always contain hook.After? for _, cm := range hook.Commits { diff --git a/server/forge/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go index 23238417713..37191d7eabe 100644 --- a/server/forge/gitlab/gitlab_test.go +++ b/server/forge/gitlab/gitlab_test.go @@ -162,6 +162,7 @@ func Test_GitLab(t *testing.T) { assert.Equal(t, "http://example.com/uploads/project/avatar/555/Outh-20-Logo.jpg", hookRepo.Avatar) assert.Equal(t, "develop", hookRepo.Branch) assert.Equal(t, "refs/tags/v22", pipeline.Ref) + assert.Equal(t, "http://10.40.8.5:3200/test/woodpecker/-/tags/v22", pipeline.ForgeURL) assert.Len(t, pipeline.ChangedFiles, 0) assert.Equal(t, model.EventTag, pipeline.Event) } From 1b2c4ab7b11a0016f8f8a7aa06bac1bbce51d0b7 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:10:17 +0200 Subject: [PATCH 15/30] fix github tag url --- server/forge/github/parse.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index 4701fe5e427..e6cc9e3a514 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -106,7 +106,7 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { pipeline.Event = model.EventTag pipeline.ChangedFiles = nil pipeline.Branch = "" - pipeline.ForgeURL = "// TODO" + pipeline.ForgeURL = hook.GetRepo().GetURL() + "/releases/tag/" + strings.TrimPrefix(pipeline.Ref, "refs/tags/") } return convertRepoHook(hook.GetRepo()), pipeline From a3aba6eadcf1a709a4469b20fabe6a53aec14381 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:12:05 +0200 Subject: [PATCH 16/30] sprintf --- server/forge/github/parse.go | 2 +- server/forge/gitlab/convert.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index e6cc9e3a514..b3f0e67ba8b 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -106,7 +106,7 @@ func parsePushHook(hook *github.PushEvent) (*model.Repo, *model.Pipeline) { pipeline.Event = model.EventTag pipeline.ChangedFiles = nil pipeline.Branch = "" - pipeline.ForgeURL = hook.GetRepo().GetURL() + "/releases/tag/" + strings.TrimPrefix(pipeline.Ref, "refs/tags/") + pipeline.ForgeURL = fmt.Sprintf("%s/releases/tag/%s", hook.GetRepo().GetURL(), strings.TrimPrefix(pipeline.Ref, "refs/tags/")) } return convertRepoHook(hook.GetRepo()), pipeline diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 548e3956b63..6aaf8fa569f 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -231,7 +231,7 @@ func convertTagHook(hook *gitlab.TagEvent) (*model.Repo, *model.Pipeline, error) pipeline.Ref = hook.Ref pipeline.Author = hook.UserUsername pipeline.Avatar = hook.UserAvatar - pipeline.ForgeURL = repo.ForgeURL + "/-/tags/" + strings.TrimPrefix(hook.Ref, "refs/tags/") + pipeline.ForgeURL = fmt.Sprintf("%s/-/tags/%s", repo.ForgeURL, strings.TrimPrefix(hook.Ref, "refs/tags/")) // TODO does hook.Commits always contain hook.After? for _, cm := range hook.Commits { From 210d8d20728e40e52c979105c963e27248d26e05 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:19:25 +0200 Subject: [PATCH 17/30] gitlab: load correct release author --- server/forge/gitlab/convert.go | 4 --- server/forge/gitlab/gitlab.go | 49 +++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index 6aaf8fa569f..bed57ce6aab 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -279,10 +279,6 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline }, ForgeURL: hook.URL, ReleaseTitle: hook.Name, - // TODO gitlab actually doesn't have a user associated to the hook/release - Author: hook.Commit.Author.Name, - Avatar: getUserAvatar(hook.Commit.Author.Email), - // Tag name here is the ref. We should add the refs/tags, so // it is known it's a tag (git-plugin looks for it) Ref: "refs/tags/" + hook.Tag, diff --git a/server/forge/gitlab/gitlab.go b/server/forge/gitlab/gitlab.go index ff59146ba0e..a38ba29592c 100644 --- a/server/forge/gitlab/gitlab.go +++ b/server/forge/gitlab/gitlab.go @@ -667,7 +667,16 @@ func (g *GitLab) Hook(ctx context.Context, req *http.Request) (*model.Repo, *mod case *gitlab.TagEvent: return convertTagHook(event) case *gitlab.ReleaseEvent: - return convertReleaseHook(event) + repo, pipeline, err := convertReleaseHook(event) + if err != nil { + return nil, nil, err + } + + if pipeline, err = g.loadReleaseAuthor(ctx, repo, pipeline); err != nil { + return nil, nil, err + } + + return repo, pipeline, nil default: return nil, nil, &forge_types.ErrIgnoreEvent{Event: string(eventType)} } @@ -819,3 +828,41 @@ func (g *GitLab) loadChangedFilesFromMergeRequest(ctx context.Context, tmpRepo * return pipeline, nil } + +func (g *GitLab) loadReleaseAuthor(ctx context.Context, tmpRepo *model.Repo, pipeline *model.Pipeline) (*model.Pipeline, error) { + _store, ok := store.TryFromContext(ctx) + if !ok { + log.Error().Msg("could not get store from context") + return pipeline, nil + } + + repo, err := _store.GetRepoNameFallback(tmpRepo.ForgeRemoteID, tmpRepo.FullName) + if err != nil { + return nil, err + } + + user, err := _store.GetUser(repo.UserID) + if err != nil { + return nil, err + } + + client, err := newClient(g.url, user.AccessToken, g.SkipVerify) + if err != nil { + return nil, err + } + + _repo, err := g.getProject(ctx, client, repo.ForgeRemoteID, repo.Owner, repo.Name) + if err != nil { + return nil, err + } + + release, _, err := client.Releases.GetRelease(_repo.ID, strings.TrimPrefix(pipeline.Ref, "refs/tags/"), gitlab.WithContext(ctx)) + if err != nil { + return nil, err + } + + pipeline.Author = release.Author.Username + pipeline.Avatar = release.Author.AvatarURL + + return pipeline, nil +} From 76fb86ec0a62a5163a3f2243b2679b7b18361feb Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:36:18 +0200 Subject: [PATCH 18/30] fix web lint --- web/eslint.config.js | 3 ++- web/src/compositions/usePipeline.ts | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/web/eslint.config.js b/web/eslint.config.js index ac3bf082785..b6fb3dafed1 100644 --- a/web/eslint.config.js +++ b/web/eslint.config.js @@ -92,7 +92,8 @@ export default antfu( order: ['template', 'script', 'style'], }, ], - 'vue/singleline-html-element-content-newline': ['off'], + 'vue/singleline-html-element-content-newline': 'off', + 'vue/html-indent': 'off', }, }, diff --git a/web/src/compositions/usePipeline.ts b/web/src/compositions/usePipeline.ts index 73d7c1c68a7..4c97eef351c 100644 --- a/web/src/compositions/usePipeline.ts +++ b/web/src/compositions/usePipeline.ts @@ -99,7 +99,11 @@ export default (pipeline: Ref) => { return `#${pipeline.value.pull_request!.index}`; } - return pipeline.value?.branch || pipeline.value?.ref; + if (!pipeline.value) { + return ''; + } + + return pipeline.value.branch || pipeline.value.ref; }); const created = computed(() => { From 02ef540553cc605b02229ac1fdb232216bf1eafd Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 11 Jan 2025 10:38:12 +0200 Subject: [PATCH 19/30] try to fix mysql/postgres --- server/store/datastore/feed.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/store/datastore/feed.go b/server/store/datastore/feed.go index d41e6f99254..1cbf5de3140 100644 --- a/server/store/datastore/feed.go +++ b/server/store/datastore/feed.go @@ -28,7 +28,7 @@ pipelines.status as pipeline_status, pipelines.created as pipeline_created, pipelines.started as pipeline_started, pipelines.finished as pipeline_finished, -pipelines.'commit' as pipeline_commit, +'pipelines.commit' as pipeline_commit, pipelines.branch as pipeline_branch, pipelines.ref as pipeline_ref, pipelines.refspec as pipeline_refspec, From 3b3f86f17d541f7e9b7ea28f2805ce98a2e2d68b Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 17 Jan 2025 11:33:56 +0200 Subject: [PATCH 20/30] use tag messages --- server/forge/forgejo/forgejo.go | 29 +++++++++++++------ server/forge/gitea/gitea.go | 29 +++++++++++++------ .../components/repo/pipeline/PipelineItem.vue | 2 +- web/src/compositions/usePipeline.ts | 4 +-- web/src/lib/api/types/pipeline.ts | 2 +- 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/server/forge/forgejo/forgejo.go b/server/forge/forgejo/forgejo.go index 18b0de1086a..2dd4c2f3270 100644 --- a/server/forge/forgejo/forgejo.go +++ b/server/forge/forgejo/forgejo.go @@ -504,17 +504,27 @@ func (c *Forgejo) Hook(ctx context.Context, r *http.Request) (*model.Repo, *mode if pipeline != nil { if pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { tagName := strings.Split(pipeline.Ref, "/")[2] - sha, err := c.getTagCommitSHA(ctx, repo, tagName) + sha, _, err := c.getTagMessage(ctx, repo, tagName) if err != nil { return nil, nil, err } pipeline.Commit = sha - } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed || pipeline.Event == model.EventTag { + } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed { sha, err := c.getCommitFromSHAStore(ctx, repo, pipeline.Commit.SHA) if err != nil { return nil, nil, err } pipeline.Commit = sha + } else if pipeline.Event == model.EventTag { + tagName := strings.Split(pipeline.Ref, "/")[2] + sha, msg, err := c.getTagMessage(ctx, repo, tagName) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha + if pipeline.Commit.Message != msg { + pipeline.ReleaseTitle = msg + } } } @@ -663,33 +673,34 @@ func (c *Forgejo) getChangedFilesForPR(ctx context.Context, repo *model.Repo, in }, -1) } -func (c *Forgejo) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, error) { +func (c *Forgejo) getTagMessage(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, string, error) { _store, ok := store.TryFromContext(ctx) if !ok { - return nil, fmt.Errorf("could not get store from context") + return nil, "", fmt.Errorf("could not get store from context") } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) if err != nil { - return nil, err + return nil, "", err } user, err := _store.GetUser(repo.UserID) if err != nil { - return nil, err + return nil, "", err } client, err := c.newClientToken(ctx, user.AccessToken) if err != nil { - return nil, err + return nil, "", err } tag, _, err := client.GetTag(repo.Owner, repo.Name, tagName) if err != nil { - return nil, err + return nil, "", err } - return c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) + commit, err := c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) + return commit, tag.Message, err } func (c *Forgejo) getCommitFromSHAStore(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index 43b491ed813..87ece4ea444 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -508,17 +508,27 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model. if pipeline != nil { if pipeline.Event == model.EventRelease && pipeline.Commit.SHA == "" { tagName := strings.Split(pipeline.Ref, "/")[2] - sha, err := c.getTagCommitSHA(ctx, repo, tagName) + sha, _, err := c.getTagMessages(ctx, repo, tagName) if err != nil { return nil, nil, err } pipeline.Commit = sha - } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed || pipeline.Event == model.EventTag { + } else if pipeline.Event == model.EventPull || pipeline.Event == model.EventPullClosed { sha, err := c.getCommitFromSHAStore(ctx, repo, pipeline.Commit.SHA) if err != nil { return nil, nil, err } pipeline.Commit = sha + } else if pipeline.Event == model.EventTag { + tagName := strings.Split(pipeline.Ref, "/")[2] + sha, msg, err := c.getTagMessages(ctx, repo, tagName) + if err != nil { + return nil, nil, err + } + pipeline.Commit = sha + if pipeline.Commit.Message != msg { + pipeline.ReleaseTitle = msg + } } } @@ -667,33 +677,34 @@ func (c *Gitea) getChangedFilesForPR(ctx context.Context, repo *model.Repo, inde }, -1) } -func (c *Gitea) getTagCommitSHA(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, error) { +func (c *Gitea) getTagMessages(ctx context.Context, repo *model.Repo, tagName string) (*model.Commit, string, error) { _store, ok := store.TryFromContext(ctx) if !ok { - return nil, fmt.Errorf("could not get store from context") + return nil, "", fmt.Errorf("could not get store from context") } repo, err := _store.GetRepoNameFallback(repo.ForgeRemoteID, repo.FullName) if err != nil { - return nil, err + return nil, "", err } user, err := _store.GetUser(repo.UserID) if err != nil { - return nil, err + return nil, "", err } client, err := c.newClientToken(ctx, user.AccessToken) if err != nil { - return nil, err + return nil, "", err } tag, _, err := client.GetTag(repo.Owner, repo.Name, tagName) if err != nil { - return nil, err + return nil, "", err } - return c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) + commit, err := c.getCommitFromSHA(ctx, user, repo, tag.Commit.SHA) + return commit, tag.Message, err } func (c *Gitea) getCommitFromSHAStore(ctx context.Context, repo *model.Repo, sha string) (*model.Commit, error) { diff --git a/web/src/components/repo/pipeline/PipelineItem.vue b/web/src/components/repo/pipeline/PipelineItem.vue index 3b3b45b6473..3ce5e4622f1 100644 --- a/web/src/components/repo/pipeline/PipelineItem.vue +++ b/web/src/components/repo/pipeline/PipelineItem.vue @@ -45,7 +45,7 @@ - + {{ shortContext }}
diff --git a/web/src/compositions/usePipeline.ts b/web/src/compositions/usePipeline.ts index 4c97eef351c..38b09c570dd 100644 --- a/web/src/compositions/usePipeline.ts +++ b/web/src/compositions/usePipeline.ts @@ -83,8 +83,8 @@ export default (pipeline: Ref) => { context = pipeline.value.pull_request!.title; } else if (pipeline.value?.event === 'deployment') { context = pipeline.value.deployment!.description; - } else if (pipeline.value?.event === 'release') { - context = pipeline.value.release_title!; + } else if (pipeline.value?.event === 'release' || pipeline.value?.event === 'tag') { + context = pipeline.value.release || ''; } return emojify(context); }); diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index b6743a1986d..c33e985d036 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -66,7 +66,7 @@ export interface Pipeline { deployment?: PipelineDeployment; - release_title?: string; + release?: string; cron: string; From f1ad9bb9210b861e3f2e345002ce881a463174fc Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 17 Jan 2025 11:40:35 +0200 Subject: [PATCH 21/30] rename release title --- server/forge/forgejo/forgejo.go | 2 +- server/forge/forgejo/helper.go | 16 +++--- server/forge/forgejo/parse_test.go | 14 ++--- server/forge/gitea/gitea.go | 2 +- server/forge/gitea/helper.go | 16 +++--- server/forge/gitea/parse_test.go | 14 ++--- server/forge/github/parse.go | 16 +++--- server/forge/gitlab/convert.go | 4 +- server/forge/gitlab/gitlab_test.go | 2 +- server/model/pipeline.go | 56 +++++++++---------- server/pipeline/stepbuilder/metadata.go | 2 +- .../migration/024_update_pipeline_messages.go | 14 ++--- web/src/compositions/usePipeline.ts | 2 +- web/src/lib/api/types/pipeline.ts | 2 +- 14 files changed, 81 insertions(+), 81 deletions(-) diff --git a/server/forge/forgejo/forgejo.go b/server/forge/forgejo/forgejo.go index 2dd4c2f3270..a7c28dc6576 100644 --- a/server/forge/forgejo/forgejo.go +++ b/server/forge/forgejo/forgejo.go @@ -523,7 +523,7 @@ func (c *Forgejo) Hook(ctx context.Context, r *http.Request) (*model.Repo, *mode } pipeline.Commit = sha if pipeline.Commit.Message != msg { - pipeline.ReleaseTitle = msg + pipeline.ReleaseTagTitle = msg } } } diff --git a/server/forge/forgejo/helper.go b/server/forge/forgejo/helper.go index 5d117a6f96b..8f3f5bd240a 100644 --- a/server/forge/forgejo/helper.go +++ b/server/forge/forgejo/helper.go @@ -173,14 +173,14 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { ) return &model.Pipeline{ - Event: model.EventRelease, - Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), - ForgeURL: hook.Release.HTMLURL, - Branch: hook.Release.Target, - ReleaseTitle: hook.Release.Title, - Author: hook.Sender.UserName, - Avatar: avatar, - IsPrerelease: hook.Release.IsPrerelease, + Event: model.EventRelease, + Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), + ForgeURL: hook.Release.HTMLURL, + Branch: hook.Release.Target, + ReleaseTagTitle: hook.Release.Title, + Author: hook.Sender.UserName, + Avatar: avatar, + IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/forgejo/parse_test.go b/server/forge/forgejo/parse_test.go index 8c1b91b9eb9..9a8ff1094e1 100644 --- a/server/forge/forgejo/parse_test.go +++ b/server/forge/forgejo/parse_test.go @@ -364,13 +364,13 @@ func TestForgejoParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "release", - Branch: "main", - Ref: "refs/tags/0.0.5", - Author: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", - ReleaseTitle: "Version 0.0.5", + Event: "release", + Branch: "main", + Ref: "refs/tags/0.0.5", + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", + ReleaseTagTitle: "Version 0.0.5", }, }, } diff --git a/server/forge/gitea/gitea.go b/server/forge/gitea/gitea.go index 87ece4ea444..afc28aec87c 100644 --- a/server/forge/gitea/gitea.go +++ b/server/forge/gitea/gitea.go @@ -527,7 +527,7 @@ func (c *Gitea) Hook(ctx context.Context, r *http.Request) (*model.Repo, *model. } pipeline.Commit = sha if pipeline.Commit.Message != msg { - pipeline.ReleaseTitle = msg + pipeline.ReleaseTagTitle = msg } } } diff --git a/server/forge/gitea/helper.go b/server/forge/gitea/helper.go index 0f40a542f89..e6776726bb5 100644 --- a/server/forge/gitea/helper.go +++ b/server/forge/gitea/helper.go @@ -176,14 +176,14 @@ func pipelineFromRelease(hook *releaseHook) *model.Pipeline { ) return &model.Pipeline{ - Event: model.EventRelease, - Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), - ForgeURL: hook.Release.HTMLURL, - Branch: hook.Release.Target, - ReleaseTitle: hook.Release.Title, - Author: hook.Sender.UserName, - Avatar: avatar, - IsPrerelease: hook.Release.IsPrerelease, + Event: model.EventRelease, + Ref: fmt.Sprintf("refs/tags/%s", hook.Release.TagName), + ForgeURL: hook.Release.HTMLURL, + Branch: hook.Release.Target, + ReleaseTagTitle: hook.Release.Title, + Author: hook.Sender.UserName, + Avatar: avatar, + IsPrerelease: hook.Release.IsPrerelease, } } diff --git a/server/forge/gitea/parse_test.go b/server/forge/gitea/parse_test.go index e145cebfe34..18e59235074 100644 --- a/server/forge/gitea/parse_test.go +++ b/server/forge/gitea/parse_test.go @@ -366,13 +366,13 @@ func TestGiteaParser(t *testing.T) { }, }, pipe: &model.Pipeline{ - Event: "release", - Branch: "main", - Ref: "refs/tags/0.0.5", - ReleaseTitle: "Version 0.0.5", - Author: "anbraten", - Avatar: "https://git.xxx/user/avatar/anbraten/-1", - ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", + Event: "release", + Branch: "main", + Ref: "refs/tags/0.0.5", + ReleaseTagTitle: "Version 0.0.5", + Author: "anbraten", + Avatar: "https://git.xxx/user/avatar/anbraten/-1", + ForgeURL: "https://git.xxx/anbraten/demo/releases/tag/0.0.5", }, }, } diff --git a/server/forge/github/parse.go b/server/forge/github/parse.go index b3f0e67ba8b..9f78cddf89c 100644 --- a/server/forge/github/parse.go +++ b/server/forge/github/parse.go @@ -192,14 +192,14 @@ func parseReleaseHook(hook *github.ReleaseEvent) (*model.Repo, *model.Pipeline) } pipeline := &model.Pipeline{ - Event: model.EventRelease, - ForgeURL: hook.GetRelease().GetHTMLURL(), - Ref: fmt.Sprintf("refs/tags/%s", hook.GetRelease().GetTagName()), - Branch: hook.GetRelease().GetTargetCommitish(), // cspell:disable-line - ReleaseTitle: name, - Avatar: hook.GetSender().GetAvatarURL(), - Author: hook.GetSender().GetLogin(), - IsPrerelease: hook.GetRelease().GetPrerelease(), + Event: model.EventRelease, + ForgeURL: hook.GetRelease().GetHTMLURL(), + Ref: fmt.Sprintf("refs/tags/%s", hook.GetRelease().GetTagName()), + Branch: hook.GetRelease().GetTargetCommitish(), // cspell:disable-line + ReleaseTagTitle: name, + Avatar: hook.GetSender().GetAvatarURL(), + Author: hook.GetSender().GetLogin(), + IsPrerelease: hook.GetRelease().GetPrerelease(), } return convertRepo(hook.GetRepo()), pipeline diff --git a/server/forge/gitlab/convert.go b/server/forge/gitlab/convert.go index bed57ce6aab..472b01513ca 100644 --- a/server/forge/gitlab/convert.go +++ b/server/forge/gitlab/convert.go @@ -277,8 +277,8 @@ func convertReleaseHook(hook *gitlab.ReleaseEvent) (*model.Repo, *model.Pipeline Message: hook.Commit.Message, ForgeURL: hook.Commit.URL, }, - ForgeURL: hook.URL, - ReleaseTitle: hook.Name, + ForgeURL: hook.URL, + ReleaseTagTitle: hook.Name, // Tag name here is the ref. We should add the refs/tags, so // it is known it's a tag (git-plugin looks for it) Ref: "refs/tags/" + hook.Tag, diff --git a/server/forge/gitlab/gitlab_test.go b/server/forge/gitlab/gitlab_test.go index 37191d7eabe..445d9a658c2 100644 --- a/server/forge/gitlab/gitlab_test.go +++ b/server/forge/gitlab/gitlab_test.go @@ -275,7 +275,7 @@ func Test_GitLab(t *testing.T) { if assert.NotNil(t, hookRepo) && assert.NotNil(t, pipeline) { assert.Equal(t, "refs/tags/0.0.2", pipeline.Ref) assert.Equal(t, "ci", hookRepo.Name) - assert.Equal(t, "Awesome version 0.0.2", pipeline.ReleaseTitle) + assert.Equal(t, "Awesome version 0.0.2", pipeline.ReleaseTagTitle) assert.Equal(t, model.EventRelease, pipeline.Event) } }) diff --git a/server/model/pipeline.go b/server/model/pipeline.go index 0a17926977a..dd2c7b7dae1 100644 --- a/server/model/pipeline.go +++ b/server/model/pipeline.go @@ -20,37 +20,37 @@ import ( ) type Pipeline struct { - ID int64 `json:"id" xorm:"pk autoincr 'id'"` - RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'repo_id'"` - Number int64 `json:"number" xorm:"UNIQUE(s) 'number'"` - Parent int64 `json:"parent" xorm:"parent"` - Status StatusValue `json:"status" xorm:"INDEX 'status'"` - Errors []*types.PipelineError `json:"errors" xorm:"json 'errors'"` - Created int64 `json:"created" xorm:"'created' NOT NULL DEFAULT 0 created"` - Updated int64 `json:"updated" xorm:"'updated' NOT NULL DEFAULT 0 updated"` - Started int64 `json:"started" xorm:"started"` - Finished int64 `json:"finished" xorm:"finished"` - Reviewer string `json:"reviewed_by" xorm:"reviewer"` - Reviewed int64 `json:"reviewed" xorm:"reviewed"` - Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"` - AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"` + ID int64 `json:"id" xorm:"pk autoincr 'id'"` + RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX 'repo_id'"` + Number int64 `json:"number" xorm:"UNIQUE(s) 'number'"` + Parent int64 `json:"parent" xorm:"parent"` + Status StatusValue `json:"status" xorm:"INDEX 'status'"` + Errors []*types.PipelineError `json:"errors" xorm:"json 'errors'"` + Created int64 `json:"created" xorm:"'created' NOT NULL DEFAULT 0 created"` + Updated int64 `json:"updated" xorm:"'updated' NOT NULL DEFAULT 0 updated"` + Started int64 `json:"started" xorm:"started"` + Finished int64 `json:"finished" xorm:"finished"` + Reviewer string `json:"reviewed_by" xorm:"reviewer"` + Reviewed int64 `json:"reviewed" xorm:"reviewed"` + Workflows []*Workflow `json:"workflows,omitempty" xorm:"-"` + AdditionalVariables map[string]string `json:"variables,omitempty" xorm:"json 'additional_variables'"` // event related - Event WebhookEvent `json:"event" xorm:"event"` - Commit *Commit `json:"commit" xorm:"json 'commit'"` - Branch string `json:"branch" xorm:"branch"` - Ref string `json:"ref" xorm:"ref"` - Refspec string `json:"refspec" xorm:"refspec"` - ForgeURL string `json:"forge_url" xorm:"forge_url"` - Author string `json:"author" xorm:"author"` - Avatar string `json:"author_avatar" xorm:"varchar(500) 'avatar'"` - ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` - Deployment *Deployment `json:"deployment" xorm:"json 'deployment'"` - IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` - PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pr'"` - Cron string `json:"cron,omitempty" xorm:"cron"` - ReleaseTitle string `json:"release,omitempty" xorm:"release"` + Event WebhookEvent `json:"event" xorm:"event"` + Commit *Commit `json:"commit" xorm:"json 'commit'"` + Branch string `json:"branch" xorm:"branch"` + Ref string `json:"ref" xorm:"ref"` + Refspec string `json:"refspec" xorm:"refspec"` + ForgeURL string `json:"forge_url" xorm:"forge_url"` + Author string `json:"author" xorm:"author"` + Avatar string `json:"author_avatar" xorm:"varchar(500) 'avatar'"` + ChangedFiles []string `json:"changed_files,omitempty" xorm:"LONGTEXT 'changed_files'"` + Deployment *Deployment `json:"deployment,omitempty" xorm:"json 'deployment'"` + IsPrerelease bool `json:"is_prerelease,omitempty" xorm:"is_prerelease"` + PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pr'"` + Cron string `json:"cron,omitempty" xorm:"cron"` + ReleaseTagTitle string `json:"release_tag_title,omitempty" xorm:"release_tag_title"` } // @name Pipeline // TableName return database table name for xorm. diff --git a/server/pipeline/stepbuilder/metadata.go b/server/pipeline/stepbuilder/metadata.go index 5495b889366..cbbd3c275d6 100644 --- a/server/pipeline/stepbuilder/metadata.go +++ b/server/pipeline/stepbuilder/metadata.go @@ -128,7 +128,7 @@ func metadataPipelineFromModelPipeline(pipeline *model.Pipeline, includeParent b IsPrerelease: pipeline.IsPrerelease, }, - Release: pipeline.ReleaseTitle, + Release: pipeline.ReleaseTagTitle, Cron: pipeline.Cron, } diff --git a/server/store/datastore/migration/024_update_pipeline_messages.go b/server/store/datastore/migration/024_update_pipeline_messages.go index b257d9d513b..078e76b5fb0 100644 --- a/server/store/datastore/migration/024_update_pipeline_messages.go +++ b/server/store/datastore/migration/024_update_pipeline_messages.go @@ -69,11 +69,11 @@ var updatePipelineMessages = xormigrate.Migration{ FromFork bool `xorm:"from_fork"` // new fields - CommitNew *commit `xorm:"json 'commit_new'"` - Deployment *deployment `xorm:"json 'deployment'"` - PullRequest *pullRequest `xorm:"json 'pr'"` - Cron string `xorm:"cron"` - ReleaseTitle string `xorm:"release"` + CommitNew *commit `xorm:"json 'commit_new'"` + Deployment *deployment `xorm:"json 'deployment'"` + PullRequest *pullRequest `xorm:"json 'pr'"` + Cron string `xorm:"cron"` + ReleaseTagTitle string `xorm:"release_tag_title"` // removed without replacement Timestamp int64 `xorm:"'timestamp'"` @@ -110,7 +110,7 @@ var updatePipelineMessages = xormigrate.Migration{ switch oldPipeline.Event { case model.EventRelease: - newPipeline.ReleaseTitle = strings.TrimPrefix(oldPipeline.Message, "created release ") + newPipeline.ReleaseTagTitle = strings.TrimPrefix(oldPipeline.Message, "created release ") case model.EventCron: newPipeline.Cron = oldPipeline.Sender case model.EventPull, model.EventPullClosed: @@ -138,7 +138,7 @@ var updatePipelineMessages = xormigrate.Migration{ } } - if _, err := sess.ID(oldPipeline.ID).Cols("commit_new", "deployment", "pr", "cron", "release").Update(newPipeline); err != nil { + if _, err := sess.ID(oldPipeline.ID).Cols("commit_new", "deployment", "pr", "cron", "release_tag_title").Update(newPipeline); err != nil { return err } } diff --git a/web/src/compositions/usePipeline.ts b/web/src/compositions/usePipeline.ts index 38b09c570dd..8e4ebcd2dcc 100644 --- a/web/src/compositions/usePipeline.ts +++ b/web/src/compositions/usePipeline.ts @@ -84,7 +84,7 @@ export default (pipeline: Ref) => { } else if (pipeline.value?.event === 'deployment') { context = pipeline.value.deployment!.description; } else if (pipeline.value?.event === 'release' || pipeline.value?.event === 'tag') { - context = pipeline.value.release || ''; + context = pipeline.value.release_tag_title || ''; } return emojify(context); }); diff --git a/web/src/lib/api/types/pipeline.ts b/web/src/lib/api/types/pipeline.ts index c33e985d036..fc0c95f6830 100644 --- a/web/src/lib/api/types/pipeline.ts +++ b/web/src/lib/api/types/pipeline.ts @@ -66,7 +66,7 @@ export interface Pipeline { deployment?: PipelineDeployment; - release?: string; + release_tag_title?: string; cron: string; From 3256be30818e43d470eded8ee5916365d73eb2f2 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 19 Jan 2025 08:46:03 +0200 Subject: [PATCH 22/30] fix feed --- server/model/feed.go | 34 +++++++++++++++++----------------- server/store/datastore/feed.go | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/server/model/feed.go b/server/model/feed.go index ccbba1c52f5..44b30ee623a 100644 --- a/server/model/feed.go +++ b/server/model/feed.go @@ -17,21 +17,21 @@ package model // Feed represents an item in the user's feed or timeline. type Feed struct { - RepoID int64 `json:"repo_id" xorm:"repo_id"` - ID int64 `json:"id,omitempty" xorm:"pipeline_id"` - Number int64 `json:"number,omitempty" xorm:"pipeline_number"` - Event string `json:"event,omitempty" xorm:"pipeline_event"` - Status string `json:"status,omitempty" xorm:"pipeline_status"` - Created int64 `json:"created,omitempty" xorm:"pipeline_created"` - Started int64 `json:"started,omitempty" xorm:"pipeline_started"` - Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"` - Branch string `json:"branch,omitempty" xorm:"pipeline_branch"` - Ref string `json:"ref,omitempty" xorm:"pipeline_ref"` - Refspec string `json:"refspec,omitempty" xorm:"pipeline_refspec"` - Deployment *Deployment `json:"deployment" xorm:"json 'pipeline_deployment'"` - PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pipeline_pr'"` - ReleaseTitle string `json:"release,omitempty" xorm:"pipeline_release"` - Commit *Commit `json:"commit,omitempty" xorm:"json 'pipeline_commit'"` - Author string `json:"author,omitempty" xorm:"pipeline_author"` - Avatar string `json:"author_avatar,omitempty" xorm:"pipeline_avatar"` + RepoID int64 `json:"repo_id" xorm:"repo_id"` + ID int64 `json:"id,omitempty" xorm:"pipeline_id"` + Number int64 `json:"number,omitempty" xorm:"pipeline_number"` + Event string `json:"event,omitempty" xorm:"pipeline_event"` + Status string `json:"status,omitempty" xorm:"pipeline_status"` + Created int64 `json:"created,omitempty" xorm:"pipeline_created"` + Started int64 `json:"started,omitempty" xorm:"pipeline_started"` + Finished int64 `json:"finished,omitempty" xorm:"pipeline_finished"` + Branch string `json:"branch,omitempty" xorm:"pipeline_branch"` + Ref string `json:"ref,omitempty" xorm:"pipeline_ref"` + Refspec string `json:"refspec,omitempty" xorm:"pipeline_refspec"` + Deployment *Deployment `json:"deployment" xorm:"json 'pipeline_deployment'"` + PullRequest *PullRequest `json:"pull_request,omitempty" xorm:"json 'pipeline_pr'"` + ReleaseTagTitle string `json:"release_tag_title,omitempty" xorm:"pipeline_release_tag_title"` + Commit *Commit `json:"commit,omitempty" xorm:"json 'pipeline_commit'"` + Author string `json:"author,omitempty" xorm:"pipeline_author"` + Avatar string `json:"author_avatar,omitempty" xorm:"pipeline_avatar"` } // @name Feed diff --git a/server/store/datastore/feed.go b/server/store/datastore/feed.go index 1cbf5de3140..d7638765384 100644 --- a/server/store/datastore/feed.go +++ b/server/store/datastore/feed.go @@ -34,7 +34,7 @@ pipelines.ref as pipeline_ref, pipelines.refspec as pipeline_refspec, pipelines.deployment as pipeline_deployment, pipelines.pr as pipeline_pr, -pipelines.release as pipeline_release, +pipelines.release_tag_title as pipeline_release_tag_title, pipelines.author as pipeline_author, pipelines.avatar as pipeline_avatar` From 1968c7351ef6c210857eb4bc584dd226c4430158 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 19 Jan 2025 08:55:32 +0200 Subject: [PATCH 23/30] use flex --- web/src/components/repo/pipeline/PipelineItem.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/src/components/repo/pipeline/PipelineItem.vue b/web/src/components/repo/pipeline/PipelineItem.vue index 3ce5e4622f1..9207b6273a1 100644 --- a/web/src/components/repo/pipeline/PipelineItem.vue +++ b/web/src/components/repo/pipeline/PipelineItem.vue @@ -23,7 +23,7 @@
-
+
From 11866b4b26773d6dd64f014dfa6f7341affc2638 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sun, 19 Jan 2025 09:01:50 +0200 Subject: [PATCH 24/30] use trim --- .../migration/024_update_pipeline_messages.go | 14 +++++++------- web/src/components/repo/pipeline/PipelineItem.vue | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/store/datastore/migration/024_update_pipeline_messages.go b/server/store/datastore/migration/024_update_pipeline_messages.go index 078e76b5fb0..5ea22a004c7 100644 --- a/server/store/datastore/migration/024_update_pipeline_messages.go +++ b/server/store/datastore/migration/024_update_pipeline_messages.go @@ -117,14 +117,14 @@ var updatePipelineMessages = xormigrate.Migration{ newPipeline.PullRequest = &pullRequest{ Title: oldPipeline.Title, Index: model.ForgeRemoteID( - strings.ReplaceAll( - strings.ReplaceAll( - strings.ReplaceAll( - strings.ReplaceAll(oldPipeline.Ref, "refs/pull/", ""), - "refs/merge-requests/", "", + strings.TrimSuffix( + strings.TrimSuffix( + strings.TrimPrefix( + strings.TrimPrefix(oldPipeline.Ref, "refs/pull/"), + "refs/merge-requests/", ), - "/merge", ""), - "/head", "", + "/merge"), + "/head", ), ), FromFork: oldPipeline.FromFork, diff --git a/web/src/components/repo/pipeline/PipelineItem.vue b/web/src/components/repo/pipeline/PipelineItem.vue index 9207b6273a1..f1d0d53c83d 100644 --- a/web/src/components/repo/pipeline/PipelineItem.vue +++ b/web/src/components/repo/pipeline/PipelineItem.vue @@ -23,7 +23,7 @@
-
+
From d66f735062a762352f85c09a354901d5c5e0bc42 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Mon, 20 Jan 2025 17:00:29 +0200 Subject: [PATCH 25/30] Fix test --- server/store/datastore/feed_test.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/server/store/datastore/feed_test.go b/server/store/datastore/feed_test.go index 9f26b228905..65aeb1d42fc 100644 --- a/server/store/datastore/feed_test.go +++ b/server/store/datastore/feed_test.go @@ -51,14 +51,18 @@ func TestGetPipelineQueue(t *testing.T) { RepoID: repo1.ID, Status: model.StatusPending, Number: 1, - Event: "push", - Commit: "abc123", + Event: model.EventPush, + Commit: &model.Commit{ + SHA: "abc123", + Message: "Initial commit", + Author: model.CommitAuthor{ + Author: "joe", + Email: "joe@example.com", + }, + }, Branch: "main", Ref: "refs/heads/main", - Message: "Initial commit", Author: "joe", - Email: "foo@bar.com", - Title: "First pipeline", } assert.NoError(t, store.CreatePipeline(pipeline1)) @@ -75,10 +79,11 @@ func TestGetPipelineQueue(t *testing.T) { assert.Equal(t, pipeline1.Commit, feedItem.Commit) assert.Equal(t, pipeline1.Branch, feedItem.Branch) assert.Equal(t, pipeline1.Ref, feedItem.Ref) - assert.Equal(t, pipeline1.Title, feedItem.Title) - assert.Equal(t, pipeline1.Message, feedItem.Message) + assert.Equal(t, pipeline1.Commit.Message, feedItem.Commit.Message) + assert.Equal(t, pipeline1.Commit.SHA, feedItem.Commit.SHA) + assert.Equal(t, pipeline1.Commit.Author.Email, feedItem.Commit.Author.Email) + assert.Equal(t, pipeline1.Commit.Author.Author, feedItem.Commit.Author.Author) assert.Equal(t, pipeline1.Author, feedItem.Author) - assert.Equal(t, pipeline1.Email, feedItem.Email) } func TestUserFeed(t *testing.T) { From 2d182530d3e3a5038c13709b3a32edda7fb50c96 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Wed, 22 Jan 2025 17:27:15 +0200 Subject: [PATCH 26/30] disable header linting --- docs/src/pages/migrations.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/pages/migrations.md b/docs/src/pages/migrations.md index 7b129dfddb3..4db112ff12f 100644 --- a/docs/src/pages/migrations.md +++ b/docs/src/pages/migrations.md @@ -1,3 +1,5 @@ + + # Migrations To enhance the usability of Woodpecker and meet evolving security standards, occasional migrations are necessary. While we aim to minimize these changes, some are unavoidable. If you experience significant issues during a migration to a new version, please let us know so maintainers can reassess the updates. From f3784a6f7d3379f78da19c19d073a765a01217b1 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 23 Jan 2025 15:03:38 +0200 Subject: [PATCH 27/30] pr url --- server/forge/bitbucketdatacenter/convert.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index ea654907c9b..19174b234f5 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -122,8 +122,7 @@ func convertPullRequestEvent(ev *bb.PullRequestEvent, baseURL string) *model.Pip Author: ev.Actor.Name, Ref: fmt.Sprintf("refs/pull-requests/%d/from", ev.PullRequest.ID), PullRequest: convertPullRequest(&ev.PullRequest), - // TODO should link to the Pr - ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.Source.Latest), + ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/pull-requests/%d", baseURL, ev.PullRequest.Source.Repository.Project.Key, ev.PullRequest.Source.Repository.Slug, ev.PullRequest.ID), Refspec: fmt.Sprintf("%s:%s", ev.PullRequest.Source.DisplayID, ev.PullRequest.Target.DisplayID), } From 7803d4852ed6c5bb5b909c1a3e109052dafa2c42 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Thu, 23 Jan 2025 15:03:59 +0200 Subject: [PATCH 28/30] solve comment --- server/forge/bitbucketdatacenter/bitbucketdatacenter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go index 27906608e14..9c9b8a71d54 100644 --- a/server/forge/bitbucketdatacenter/bitbucketdatacenter.go +++ b/server/forge/bitbucketdatacenter/bitbucketdatacenter.go @@ -378,7 +378,7 @@ func (c *client) BranchHead(ctx context.Context, u *model.User, r *model.Repo, b cm := commits[0] return &model.Commit{ - SHA: cm.ID, // TODO check id or displayid? + SHA: cm.ID, ForgeURL: fmt.Sprintf("%s/commits/%s", r.ForgeURL, cm.ID), Message: cm.Message, Author: model.CommitAuthor{ From 76af65e63f9523bcd39d8f52a05fef3d76023774 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 7 Feb 2025 13:38:15 +0200 Subject: [PATCH 29/30] fix todo on bb url --- server/forge/bitbucketdatacenter/convert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index 19174b234f5..cbabe9057c4 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -97,12 +97,12 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod Avatar: bitbucketAvatarURL(baseURL, ev.Actor.Slug), Author: ev.Actor.Name, Ref: ev.Changes[0].RefId, - // TODO this is wrong on tags ForgeURL: fmt.Sprintf("%s/projects/%s/repos/%s/commits/%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, change.ToHash), } if strings.HasPrefix(ev.Changes[0].RefId, "refs/tags/") { pipeline.Event = model.EventTag + pipeline.ForgeURL = fmt.Sprintf("%s/projects/%s/repos/%s/browse?at=%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, pipeline.Ref) } else { pipeline.Event = model.EventPush } From 6c2e706b9be8afea8ef66df1d1f206b05a470b95 Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Fri, 7 Feb 2025 13:40:13 +0200 Subject: [PATCH 30/30] escape ref --- server/forge/bitbucketdatacenter/convert.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/forge/bitbucketdatacenter/convert.go b/server/forge/bitbucketdatacenter/convert.go index cbabe9057c4..0dcc4094a1e 100644 --- a/server/forge/bitbucketdatacenter/convert.go +++ b/server/forge/bitbucketdatacenter/convert.go @@ -102,7 +102,7 @@ func convertRepositoryPushEvent(ev *bb.RepositoryPushEvent, baseURL string) *mod if strings.HasPrefix(ev.Changes[0].RefId, "refs/tags/") { pipeline.Event = model.EventTag - pipeline.ForgeURL = fmt.Sprintf("%s/projects/%s/repos/%s/browse?at=%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, pipeline.Ref) + pipeline.ForgeURL = fmt.Sprintf("%s/projects/%s/repos/%s/browse?at=%s", baseURL, ev.Repository.Project.Key, ev.Repository.Slug, url.QueryEscape(pipeline.Ref)) } else { pipeline.Event = model.EventPush }