mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-27 01:18:27 +00:00 
			
		
		
		
	Automerge supports deleting branch automatically after merging
This commit is contained in:
		| @@ -605,6 +605,8 @@ var migrations = []Migration{ | |||||||
| 	NewMigration("Add Repository Licenses", v1_23.AddRepositoryLicenses), | 	NewMigration("Add Repository Licenses", v1_23.AddRepositoryLicenses), | ||||||
| 	// v306 -> v307 | 	// v306 -> v307 | ||||||
| 	NewMigration("Add BlockAdminMergeOverride to ProtectedBranch", v1_23.AddBlockAdminMergeOverrideBranchProtection), | 	NewMigration("Add BlockAdminMergeOverride to ProtectedBranch", v1_23.AddBlockAdminMergeOverrideBranchProtection), | ||||||
|  | 	// v307 -> v308 | ||||||
|  | 	NewMigration("Add DeleteBranchAfterMerge to AutoMerge", v1_23.AddDeleteBranchAfterMergeForAutoMerge), | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetCurrentDBVersion returns the current db version | // GetCurrentDBVersion returns the current db version | ||||||
|   | |||||||
							
								
								
									
										29
									
								
								models/migrations/v1_23/v307.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								models/migrations/v1_23/v307.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | // Copyright 2024 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package v1_23 //nolint | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"code.gitea.io/gitea/modules/timeutil" | ||||||
|  |  | ||||||
|  | 	"xorm.io/xorm" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type pullAutoMerge struct { | ||||||
|  | 	ID                     int64  `xorm:"pk autoincr"` | ||||||
|  | 	PullID                 int64  `xorm:"UNIQUE"` | ||||||
|  | 	DoerID                 int64  `xorm:"INDEX NOT NULL"` | ||||||
|  | 	MergeStyle             string `xorm:"varchar(30)"` | ||||||
|  | 	Message                string `xorm:"LONGTEXT"` | ||||||
|  | 	DeleteBranchAfterMerge bool | ||||||
|  | 	CreatedUnix            timeutil.TimeStamp `xorm:"created"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TableName return database table name for xorm | ||||||
|  | func (pullAutoMerge) TableName() string { | ||||||
|  | 	return "pull_auto_merge" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func AddDeleteBranchAfterMergeForAutoMerge(x *xorm.Engine) error { | ||||||
|  | 	return x.Sync(new(pullAutoMerge)) | ||||||
|  | } | ||||||
| @@ -21,6 +21,7 @@ type AutoMerge struct { | |||||||
| 	Doer                   *user_model.User      `xorm:"-"` | 	Doer                   *user_model.User      `xorm:"-"` | ||||||
| 	MergeStyle             repo_model.MergeStyle `xorm:"varchar(30)"` | 	MergeStyle             repo_model.MergeStyle `xorm:"varchar(30)"` | ||||||
| 	Message                string                `xorm:"LONGTEXT"` | 	Message                string                `xorm:"LONGTEXT"` | ||||||
|  | 	DeleteBranchAfterMerge bool | ||||||
| 	CreatedUnix            timeutil.TimeStamp `xorm:"created"` | 	CreatedUnix            timeutil.TimeStamp `xorm:"created"` | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -49,7 +50,7 @@ func IsErrAlreadyScheduledToAutoMerge(err error) bool { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ScheduleAutoMerge schedules a pull request to be merged when all checks succeed | // ScheduleAutoMerge schedules a pull request to be merged when all checks succeed | ||||||
| func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string) error { | func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, style repo_model.MergeStyle, message string, deleteBranchAfterMerge bool) error { | ||||||
| 	// Check if we already have a merge scheduled for that pull request | 	// Check if we already have a merge scheduled for that pull request | ||||||
| 	if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { | 	if exists, _, err := GetScheduledMergeByPullID(ctx, pullID); err != nil { | ||||||
| 		return err | 		return err | ||||||
| @@ -62,6 +63,7 @@ func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pullID int64, | |||||||
| 		PullID:                 pullID, | 		PullID:                 pullID, | ||||||
| 		MergeStyle:             style, | 		MergeStyle:             style, | ||||||
| 		Message:                message, | 		Message:                message, | ||||||
|  | 		DeleteBranchAfterMerge: deleteBranchAfterMerge, | ||||||
| 	}) | 	}) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1000,7 +1000,7 @@ func MergePullRequest(ctx *context.APIContext) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if form.MergeWhenChecksSucceed { | 	if form.MergeWhenChecksSucceed { | ||||||
| 		scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) | 		scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			if pull_model.IsErrAlreadyScheduledToAutoMerge(err) { | 			if pull_model.IsErrAlreadyScheduledToAutoMerge(err) { | ||||||
| 				ctx.Error(http.StatusConflict, "ScheduleAutoMerge", err) | 				ctx.Error(http.StatusConflict, "ScheduleAutoMerge", err) | ||||||
|   | |||||||
| @@ -1097,7 +1097,7 @@ func MergePullRequest(ctx *context.Context) { | |||||||
| 		// delete all scheduled auto merges | 		// delete all scheduled auto merges | ||||||
| 		_ = pull_model.DeleteScheduledAutoMerge(ctx, pr.ID) | 		_ = pull_model.DeleteScheduledAutoMerge(ctx, pr.ID) | ||||||
| 		// schedule auto merge | 		// schedule auto merge | ||||||
| 		scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message) | 		scheduled, err := automerge.ScheduleAutoMerge(ctx, ctx.Doer, pr, repo_model.MergeStyle(form.Do), message, form.DeleteBranchAfterMerge) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ctx.ServerError("ScheduleAutoMerge", err) | 			ctx.ServerError("ScheduleAutoMerge", err) | ||||||
| 			return | 			return | ||||||
|   | |||||||
| @@ -63,9 +63,9 @@ func addToQueue(pr *issues_model.PullRequest, sha string) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ScheduleAutoMerge if schedule is false and no error, pull can be merged directly | // ScheduleAutoMerge if schedule is false and no error, pull can be merged directly | ||||||
| func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string) (scheduled bool, err error) { | func ScheduleAutoMerge(ctx context.Context, doer *user_model.User, pull *issues_model.PullRequest, style repo_model.MergeStyle, message string, deleteBranchAfterMerge bool) (scheduled bool, err error) { | ||||||
| 	err = db.WithTx(ctx, func(ctx context.Context) error { | 	err = db.WithTx(ctx, func(ctx context.Context) error { | ||||||
| 		if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message); err != nil { | 		if err := pull_model.ScheduleAutoMerge(ctx, doer, pull.ID, style, message, deleteBranchAfterMerge); err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		scheduled = true | 		scheduled = true | ||||||
|   | |||||||
| @@ -130,7 +130,7 @@ export default { | |||||||
|         {{ mergeForm.textCancel }} |         {{ mergeForm.textCancel }} | ||||||
|       </button> |       </button> | ||||||
|  |  | ||||||
|       <div class="ui checkbox tw-ml-1" v-if="mergeForm.isPullBranchDeletable && !autoMergeWhenSucceed"> |       <div class="ui checkbox tw-ml-1" v-if="mergeForm.isPullBranchDeletable"> | ||||||
|         <input name="delete_branch_after_merge" type="checkbox" v-model="deleteBranchAfterMerge" id="delete-branch-after-merge"> |         <input name="delete_branch_after_merge" type="checkbox" v-model="deleteBranchAfterMerge" id="delete-branch-after-merge"> | ||||||
|         <label for="delete-branch-after-merge">{{ mergeForm.textDeleteBranch }}</label> |         <label for="delete-branch-after-merge">{{ mergeForm.textDeleteBranch }}</label> | ||||||
|       </div> |       </div> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user