@@ -14,7 +14,9 @@ import (
1414 "code.gitea.io/gitea/models/db"
1515 git_model "code.gitea.io/gitea/models/git"
1616 issues_model "code.gitea.io/gitea/models/issues"
17+ access_model "code.gitea.io/gitea/models/perm/access"
1718 repo_model "code.gitea.io/gitea/models/repo"
19+ "code.gitea.io/gitea/models/unit"
1820 user_model "code.gitea.io/gitea/models/user"
1921 "code.gitea.io/gitea/modules/cache"
2022 "code.gitea.io/gitea/modules/git"
@@ -29,6 +31,7 @@ import (
2931 "code.gitea.io/gitea/modules/util"
3032 webhook_module "code.gitea.io/gitea/modules/webhook"
3133 notify_service "code.gitea.io/gitea/services/notify"
34+ pull_service "code.gitea.io/gitea/services/pull"
3235 files_service "code.gitea.io/gitea/services/repository/files"
3336
3437 "xorm.io/builder"
@@ -460,12 +463,22 @@ func RenameBranch(ctx context.Context, repo *repo_model.Repository, doer *user_m
460463
461464// enmuerates all branch related errors
462465var (
463- ErrBranchIsDefault = errors .New ("branch is default" )
466+ ErrBranchIsDefault = errors .New ("branch is default" )
467+ ErrInsufficientAccess = errors .New ("insufficient access" )
464468)
465469
466470// DeleteBranch delete branch
467471func DeleteBranch (ctx context.Context , doer * user_model.User , repo * repo_model.Repository , gitRepo * git.Repository , branchName string ) error {
468- err := repo .MustNotBeArchived ()
472+ perm , err := access_model .GetUserRepoPermission (ctx , repo , doer )
473+ if err != nil {
474+ return err
475+ }
476+
477+ if ! perm .CanWrite (unit .TypeCode ) {
478+ return ErrInsufficientAccess
479+ }
480+
481+ err = repo .MustNotBeArchived ()
469482 if err != nil {
470483 return err
471484 }
@@ -528,6 +541,23 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R
528541 return nil
529542}
530543
544+ func DeletePullRequestHeadBranch (ctx context.Context , pr * issues_model.PullRequest , doer * user_model.User , headGitRepo * git.Repository ) error {
545+ if err := pull_service .RetargetChildrenOnMerge (ctx , doer , pr ); err != nil {
546+ return err
547+ }
548+
549+ if err := DeleteBranch (ctx , doer , pr .HeadRepo , headGitRepo , pr .HeadBranch ); err != nil {
550+ return err
551+ }
552+
553+ if err := issues_model .AddDeletePRBranchComment (ctx , doer , pr .BaseRepo , pr .IssueID , pr .HeadBranch ); err != nil {
554+ // Do not fail here as branch has already been deleted
555+ log .Error ("AddDeletePRBranchComment: %v" , err )
556+ }
557+
558+ return nil
559+ }
560+
531561type BranchSyncOptions struct {
532562 RepoID int64
533563}
0 commit comments