loading up the forgejo repo on tangled to test page performance
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request 'Fix release published actions not triggering for releases created from existing tags' (#3220) from zotan/forgejo:forgejo into forgejo

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/3220
Reviewed-by: oliverpool <oliverpool@noreply.codeberg.org>
Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org>

+131 -15
+2 -2
routers/api/v1/repo/release.go
··· 267 267 rel.Publisher = ctx.Doer 268 268 rel.Target = form.Target 269 269 270 - if err = release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, nil, nil, nil); err != nil { 270 + if err = release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, nil, nil, nil, true); err != nil { 271 271 ctx.Error(http.StatusInternalServerError, "UpdateRelease", err) 272 272 return 273 273 } ··· 341 341 if form.IsPrerelease != nil { 342 342 rel.IsPrerelease = *form.IsPrerelease 343 343 } 344 - if err := release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, nil, nil, nil); err != nil { 344 + if err := release_service.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, nil, nil, nil, false); err != nil { 345 345 ctx.Error(http.StatusInternalServerError, "UpdateRelease", err) 346 346 return 347 347 }
+2 -2
routers/web/repo/release.go
··· 567 567 rel.PublisherID = ctx.Doer.ID 568 568 rel.IsTag = false 569 569 570 - if err = releaseservice.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, attachmentUUIDs, nil, nil); err != nil { 570 + if err = releaseservice.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, rel, attachmentUUIDs, nil, nil, true); err != nil { 571 571 ctx.Data["Err_TagName"] = true 572 572 ctx.ServerError("UpdateRelease", err) 573 573 return ··· 674 674 rel.IsDraft = len(form.Draft) > 0 675 675 rel.IsPrerelease = form.Prerelease 676 676 if err = releaseservice.UpdateRelease(ctx, ctx.Doer, ctx.Repo.GitRepo, 677 - rel, addAttachmentUUIDs, delAttachmentUUIDs, editAttachments); err != nil { 677 + rel, addAttachmentUUIDs, delAttachmentUUIDs, editAttachments, false); err != nil { 678 678 ctx.ServerError("UpdateRelease", err) 679 679 return 680 680 }
+4 -4
services/release/release.go
··· 199 199 // delAttachmentUUIDs accept a slice of attachments' uuids which will be deleted from the release 200 200 // editAttachments accept a map of attachment uuid to new attachment name which will be updated with attachments. 201 201 func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repository, rel *repo_model.Release, 202 - addAttachmentUUIDs, delAttachmentUUIDs []string, editAttachments map[string]string, 202 + addAttachmentUUIDs, delAttachmentUUIDs []string, editAttachments map[string]string, createdFromTag bool, 203 203 ) error { 204 204 if rel.ID == 0 { 205 205 return errors.New("UpdateRelease only accepts an exist release") ··· 292 292 } 293 293 294 294 if !rel.IsDraft { 295 - if !isCreated { 296 - notify_service.UpdateRelease(gitRepo.Ctx, doer, rel) 295 + if createdFromTag || isCreated { 296 + notify_service.NewRelease(gitRepo.Ctx, rel) 297 297 return nil 298 298 } 299 - notify_service.NewRelease(gitRepo.Ctx, rel) 299 + notify_service.UpdateRelease(gitRepo.Ctx, doer, rel) 300 300 } 301 301 return nil 302 302 }
+7 -7
services/release/release_test.go
··· 159 159 releaseCreatedUnix := release.CreatedUnix 160 160 time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp 161 161 release.Note = "Changed note" 162 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil)) 162 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false)) 163 163 release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID) 164 164 assert.NoError(t, err) 165 165 assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) ··· 183 183 releaseCreatedUnix = release.CreatedUnix 184 184 time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp 185 185 release.Title = "Changed title" 186 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil)) 186 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false)) 187 187 release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID) 188 188 assert.NoError(t, err) 189 189 assert.Less(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) ··· 208 208 time.Sleep(2 * time.Second) // sleep 2 seconds to ensure a different timestamp 209 209 release.Title = "Changed title" 210 210 release.Note = "Changed note" 211 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil)) 211 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false)) 212 212 release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID) 213 213 assert.NoError(t, err) 214 214 assert.Equal(t, int64(releaseCreatedUnix), int64(release.CreatedUnix)) ··· 233 233 release.IsDraft = false 234 234 tagName := release.TagName 235 235 236 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil)) 236 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, nil, false)) 237 237 release, err = repo_model.GetReleaseByID(db.DefaultContext, release.ID) 238 238 assert.NoError(t, err) 239 239 assert.Equal(t, tagName, release.TagName) ··· 247 247 }, strings.NewReader(samplePayload), int64(len([]byte(samplePayload)))) 248 248 assert.NoError(t, err) 249 249 250 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, []string{attach.UUID}, nil, nil)) 250 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, []string{attach.UUID}, nil, nil, false)) 251 251 assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release)) 252 252 assert.Len(t, release.Attachments, 1) 253 253 assert.EqualValues(t, attach.UUID, release.Attachments[0].UUID) ··· 257 257 // update the attachment name 258 258 assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, nil, map[string]string{ 259 259 attach.UUID: "test2.txt", 260 - })) 260 + }, false)) 261 261 release.Attachments = nil 262 262 assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release)) 263 263 assert.Len(t, release.Attachments, 1) ··· 266 266 assert.EqualValues(t, "test2.txt", release.Attachments[0].Name) 267 267 268 268 // delete the attachment 269 - assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, []string{attach.UUID}, nil)) 269 + assert.NoError(t, UpdateRelease(db.DefaultContext, user, gitRepo, release, nil, []string{attach.UUID}, nil, false)) 270 270 release.Attachments = nil 271 271 assert.NoError(t, repo_model.GetReleaseAttachments(db.DefaultContext, release)) 272 272 assert.Empty(t, release.Attachments)
+116
tests/integration/webhook_test.go
··· 9 9 "testing" 10 10 11 11 "code.gitea.io/gitea/models/db" 12 + repo_model "code.gitea.io/gitea/models/repo" 12 13 "code.gitea.io/gitea/models/unittest" 14 + user_model "code.gitea.io/gitea/models/user" 13 15 webhook_model "code.gitea.io/gitea/models/webhook" 16 + "code.gitea.io/gitea/modules/git" 17 + "code.gitea.io/gitea/modules/gitrepo" 14 18 "code.gitea.io/gitea/modules/json" 15 19 webhook_module "code.gitea.io/gitea/modules/webhook" 20 + "code.gitea.io/gitea/services/release" 21 + "code.gitea.io/gitea/tests" 16 22 17 23 "github.com/stretchr/testify/assert" 18 24 ) ··· 70 76 assert.Empty(t, expected) 71 77 }) 72 78 } 79 + 80 + func TestWebhookReleaseEvents(t *testing.T) { 81 + defer tests.PrepareTestEnv(t)() 82 + 83 + user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 84 + repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 85 + w := unittest.AssertExistsAndLoadBean(t, &webhook_model.Webhook{ 86 + ID: 1, 87 + RepoID: repo.ID, 88 + }) 89 + w.HookEvent = &webhook_module.HookEvent{ 90 + SendEverything: true, 91 + } 92 + assert.NoError(t, w.UpdateEvent()) 93 + assert.NoError(t, webhook_model.UpdateWebhook(db.DefaultContext, w)) 94 + 95 + hookTasks := retrieveHookTasks(t, w.ID, true) 96 + 97 + gitRepo, err := gitrepo.OpenRepository(git.DefaultContext, repo) 98 + assert.NoError(t, err) 99 + defer gitRepo.Close() 100 + 101 + t.Run("CreateRelease", func(t *testing.T) { 102 + assert.NoError(t, release.CreateRelease(gitRepo, &repo_model.Release{ 103 + RepoID: repo.ID, 104 + Repo: repo, 105 + PublisherID: user.ID, 106 + Publisher: user, 107 + TagName: "v1.1.1", 108 + Target: "master", 109 + Title: "v1.1.1 is released", 110 + Note: "v1.1.1 is released", 111 + IsDraft: false, 112 + IsPrerelease: false, 113 + IsTag: false, 114 + }, nil, "")) 115 + 116 + // check the newly created hooktasks 117 + hookTasksLenBefore := len(hookTasks) 118 + hookTasks = retrieveHookTasks(t, w.ID, false) 119 + 120 + checkHookTasks(t, map[webhook_module.HookEventType]string{ 121 + webhook_module.HookEventRelease: "published", 122 + webhook_module.HookEventCreate: "", // a tag was created as well 123 + webhook_module.HookEventPush: "", // the tag creation also means a push event 124 + }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 125 + 126 + t.Run("UpdateRelease", func(t *testing.T) { 127 + rel := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.1.1"}) 128 + assert.NoError(t, release.UpdateRelease(db.DefaultContext, user, gitRepo, rel, nil, nil, nil, false)) 129 + 130 + // check the newly created hooktasks 131 + hookTasksLenBefore := len(hookTasks) 132 + hookTasks = retrieveHookTasks(t, w.ID, false) 133 + 134 + checkHookTasks(t, map[webhook_module.HookEventType]string{ 135 + webhook_module.HookEventRelease: "updated", 136 + }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 137 + }) 138 + }) 139 + 140 + t.Run("CreateNewTag", func(t *testing.T) { 141 + assert.NoError(t, release.CreateNewTag(db.DefaultContext, 142 + user, 143 + repo, 144 + "master", 145 + "v1.1.2", 146 + "v1.1.2 is tagged", 147 + )) 148 + 149 + // check the newly created hooktasks 150 + hookTasksLenBefore := len(hookTasks) 151 + hookTasks = retrieveHookTasks(t, w.ID, false) 152 + 153 + checkHookTasks(t, map[webhook_module.HookEventType]string{ 154 + webhook_module.HookEventCreate: "", // tag was created as well 155 + webhook_module.HookEventPush: "", // the tag creation also means a push event 156 + }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 157 + 158 + t.Run("UpdateRelease", func(t *testing.T) { 159 + rel := unittest.AssertExistsAndLoadBean(t, &repo_model.Release{RepoID: repo.ID, TagName: "v1.1.2"}) 160 + assert.NoError(t, release.UpdateRelease(db.DefaultContext, user, gitRepo, rel, nil, nil, nil, true)) 161 + 162 + // check the newly created hooktasks 163 + hookTasksLenBefore := len(hookTasks) 164 + hookTasks = retrieveHookTasks(t, w.ID, false) 165 + 166 + checkHookTasks(t, map[webhook_module.HookEventType]string{ 167 + webhook_module.HookEventRelease: "published", 168 + }, hookTasks[:len(hookTasks)-hookTasksLenBefore]) 169 + }) 170 + }) 171 + } 172 + 173 + func checkHookTasks(t *testing.T, expectedActions map[webhook_module.HookEventType]string, hookTasks []*webhook_model.HookTask) { 174 + t.Helper() 175 + for _, hookTask := range hookTasks { 176 + expectedAction, ok := expectedActions[hookTask.EventType] 177 + if !ok { 178 + t.Errorf("unexpected (or duplicated) event %q", hookTask.EventType) 179 + } 180 + var payload struct { 181 + Action string `json:"action"` 182 + } 183 + assert.NoError(t, json.Unmarshal([]byte(hookTask.PayloadContent), &payload)) 184 + assert.Equal(t, expectedAction, payload.Action, "unexpected action for %q event", hookTask.EventType) 185 + delete(expectedActions, hookTask.EventType) 186 + } 187 + assert.Empty(t, expectedActions) 188 + }