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.

Add branch auto deletion for scheduled PRs

+53 -25
+2
models/forgejo_migrations/migrate.go
··· 82 82 NewMigration("Add SSH keypair to `pull_mirror` table", AddSSHKeypairToPushMirror), 83 83 // v22 -> v23 84 84 NewMigration("Add `legacy` to `web_authn_credential` table", AddLegacyToWebAuthnCredential), 85 + // v23 -> v24 86 + NewMigration("Add `delete_branch_after_merge` to `auto_merge` table", AddDeleteBranchAfterMergeToAutoMerge), 85 87 } 86 88 87 89 // GetCurrentDBVersion returns the current Forgejo database version.
+16
models/forgejo_migrations/v23.go
··· 1 + // Copyright 2024 The Forgejo Authors. All rights reserved. 2 + // SPDX-License-Identifier: MIT 3 + 4 + package forgejo_migrations //nolint:revive 5 + 6 + import "xorm.io/xorm" 7 + 8 + // AddDeleteBranchAfterMergeToAutoMerge: add DeleteBranchAfterMerge column, setting existing rows to false 9 + func AddDeleteBranchAfterMergeToAutoMerge(x *xorm.Engine) error { 10 + type AutoMerge struct { 11 + ID int64 `xorm:"pk autoincr"` 12 + DeleteBranchAfterMerge bool `xorm:"NOT NULL DEFAULT false"` 13 + } 14 + 15 + return x.Sync(&AutoMerge{}) 16 + }
+14 -12
models/pull/automerge.go
··· 15 15 16 16 // AutoMerge represents a pull request scheduled for merging when checks succeed 17 17 type AutoMerge struct { 18 - ID int64 `xorm:"pk autoincr"` 19 - PullID int64 `xorm:"UNIQUE"` 20 - DoerID int64 `xorm:"INDEX NOT NULL"` 21 - Doer *user_model.User `xorm:"-"` 22 - MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"` 23 - Message string `xorm:"LONGTEXT"` 24 - CreatedUnix timeutil.TimeStamp `xorm:"created"` 18 + ID int64 `xorm:"pk autoincr"` 19 + PullID int64 `xorm:"UNIQUE"` 20 + DoerID int64 `xorm:"INDEX NOT NULL"` 21 + Doer *user_model.User `xorm:"-"` 22 + MergeStyle repo_model.MergeStyle `xorm:"varchar(30)"` 23 + Message string `xorm:"LONGTEXT"` 24 + DeleteBranchAfterMerge bool `xorm:"NOT NULL DEFAULT false"` 25 + CreatedUnix timeutil.TimeStamp `xorm:"created"` 25 26 } 26 27 27 28 // TableName return database table name for xorm ··· 49 50 } 50 51 51 52 // ScheduleAutoMerge schedules a pull request to be merged when all checks succeed 52 - func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error { 53 + func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string, deleteBranch bool) error { 53 54 // Check if we already have a merge scheduled for that pull request 54 55 if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { 55 56 return err ··· 58 59 } 59 60 60 61 _, err := db.GetEngine(ctx).Insert(&AutoMerge{ 61 - DoerID: doer.ID, 62 - PullID: pullID, 63 - MergeStyle: style, 64 - Message: message, 62 + DoerID: doer.ID, 63 + PullID: pullID, 64 + MergeStyle: style, 65 + Message: message, 66 + DeleteBranchAfterMerge: deleteBranch, 65 67 }) 66 68 return err 67 69 }
+1 -1
routers/api/v1/repo/pull.go
··· 989 989 } 990 990 991 991 if form.MergeWhenChecksSucceed { 992 - scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) 992 + scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) 993 993 if err != nil { 994 994 if pull_model.IsErrAlreadyScheduledToAutoMerge(err) { 995 995 ctx.Error(http.StatusConflict, "ScheduleAutoMerge", err)
+1 -1
routers/private/hook_post_receive_test.go
··· 28 28 29 29 user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) 30 30 31 - err = pull_model.ScheduleAutoMerge(db.DefaultContext, user1, pr.ID, repo_model.MergeStyleSquash, "squash merge a pr") 31 + err = pull_model.ScheduleAutoMerge(db.DefaultContext, user1, pr.ID, repo_model.MergeStyleSquash, "squash merge a pr", false) 32 32 require.NoError(t, err) 33 33 34 34 autoMerge := unittest.AssertExistsAndLoadBean(t, &pull_model.AutoMerge{PullID: pr.ID})
+1 -1
routers/web/repo/pull.go
··· 1302 1302 // delete all scheduled auto merges 1303 1303 _ = pull_model.DeleteScheduledAutoMerge(ctx, pr.ID) 1304 1304 // schedule auto merge 1305 - scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) 1305 + scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) 1306 1306 if err != nil { 1307 1307 ctx.ServerError("ScheduleAutoMerge", err) 1308 1308 return
+10 -2
services/automerge/automerge.go
··· 22 22 "code.gitea.io/gitea/modules/queue" 23 23 notify_service "code.gitea.io/gitea/services/notify" 24 24 pull_service "code.gitea.io/gitea/services/pull" 25 + repo_service "code.gitea.io/gitea/services/repository" 25 26 shared_automerge "code.gitea.io/gitea/services/shared/automerge" 26 27 ) 27 28 ··· 52 53 } 53 54 54 55 // ScheduleAutoMerge if schedule is false and no error, pull can be merged directly 55 - func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string) (scheduled bool, err error) { 56 + func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string, deleteBranch bool) (scheduled bool, err error) { 56 57 err = db.WithTx(ctx, func(ctx context.Context) error { 57 - if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message); err != nil { 58 + if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message, deleteBranch); err != nil { 58 59 return err 59 60 } 60 61 scheduled = true ··· 209 210 // The resolution is add a new column on automerge table named `error_message` to store the error message and displayed 210 211 // on the pull request page. But this should not be finished in a bug fix PR which will be backport to release branch. 211 212 return 213 + } 214 + 215 + if scheduledPRM.DeleteBranchAfterMerge { 216 + err := repo_service.DeleteBranchAfterMerge(ctx, doer, pr, headGitRepo) 217 + if err != nil { 218 + log.Error("%d repo_service.DeleteBranchIfUnused: %v", pr.ID, err) 219 + } 212 220 } 213 221 }
+1 -1
tests/integration/actions_commit_status_test.go
··· 34 34 assert.False(t, pr.HasMerged, "PR should not be merged") 35 35 assert.Equal(t, issues_model.PullRequestStatusMergeable, pr.Status, "PR should be mergeable") 36 36 37 - scheduled, err := automerge.ScheduleAutoMerge(ctx, user, pr, repo_model.MergeStyleMerge, "Dummy") 37 + scheduled, err := automerge.ScheduleAutoMerge(ctx, user, pr, repo_model.MergeStyleMerge, "Dummy", false) 38 38 39 39 require.NoError(t, err, "PR should be scheduled for automerge") 40 40 assert.True(t, scheduled, "PR should be scheduled for automerge")
+6 -6
tests/integration/pull_merge_test.go
··· 881 881 session.MakeRequest(t, req, http.StatusSeeOther) 882 882 883 883 // first time insert automerge record, return true 884 - scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 884 + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 885 885 require.NoError(t, err) 886 886 assert.True(t, scheduled) 887 887 888 888 // second time insert automerge record, return false because it does exist 889 - scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 889 + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 890 890 require.Error(t, err) 891 891 assert.False(t, scheduled) 892 892 ··· 965 965 session.MakeRequest(t, req, http.StatusSeeOther) 966 966 967 967 // first time insert automerge record, return true 968 - scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 968 + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 969 969 require.NoError(t, err) 970 970 assert.True(t, scheduled) 971 971 972 972 // second time insert automerge record, return false because it does exist 973 - scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 973 + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 974 974 require.Error(t, err) 975 975 assert.False(t, scheduled) 976 976 ··· 1094 1094 1095 1095 user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) 1096 1096 // first time insert automerge record, return true 1097 - scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 1097 + scheduled, err := automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 1098 1098 require.NoError(t, err) 1099 1099 assert.True(t, scheduled) 1100 1100 1101 1101 // second time insert automerge record, return false because it does exist 1102 - scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test") 1102 + scheduled, err = automerge.ScheduleAutoMerge(db.DefaultContext, user1, pr, repo_model.MergeStyleMerge, "auto merge test", false) 1103 1103 require.Error(t, err) 1104 1104 assert.False(t, scheduled) 1105 1105
+1 -1
web_src/js/components/PullRequestMergeForm.vue
··· 130 130 {{ mergeForm.textCancel }} 131 131 </button> 132 132 133 - <div class="ui checkbox tw-ml-1" v-if="mergeForm.isPullBranchDeletable && !autoMergeWhenSucceed"> 133 + <div class="ui checkbox tw-ml-1" v-if="mergeForm.isPullBranchDeletable"> 134 134 <input name="delete_branch_after_merge" type="checkbox" v-model="deleteBranchAfterMerge" id="delete-branch-after-merge"> 135 135 <label for="delete-branch-after-merge">{{ mergeForm.textDeleteBranch }}</label> 136 136 </div>