2014-03-24 14:25:15 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
2018-11-28 14:26:14 +03:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2014-03-24 14:25:15 +04:00
package repo
import (
2021-06-07 17:52:59 +03:00
"errors"
2020-06-12 02:49:47 +03:00
"fmt"
2021-04-05 18:30:52 +03:00
"net/http"
2023-03-14 08:11:38 +03:00
"net/url"
2017-10-26 03:49:16 +03:00
"strings"
2017-10-15 22:59:24 +03:00
"code.gitea.io/gitea/models"
2022-06-12 18:51:54 +03:00
git_model "code.gitea.io/gitea/models/git"
2022-06-13 12:37:59 +03:00
issues_model "code.gitea.io/gitea/models/issues"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-09 22:57:58 +03:00
"code.gitea.io/gitea/models/unit"
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
2019-03-27 12:33:00 +03:00
"code.gitea.io/gitea/modules/git"
2017-10-26 03:49:16 +03:00
"code.gitea.io/gitea/modules/log"
2020-01-14 06:38:04 +03:00
repo_module "code.gitea.io/gitea/modules/repository"
2021-06-26 14:28:55 +03:00
"code.gitea.io/gitea/modules/setting"
2019-03-26 22:59:48 +03:00
"code.gitea.io/gitea/modules/util"
2021-01-26 18:36:53 +03:00
"code.gitea.io/gitea/modules/web"
2020-03-28 07:13:18 +03:00
"code.gitea.io/gitea/routers/utils"
2021-04-06 22:44:05 +03:00
"code.gitea.io/gitea/services/forms"
2021-02-28 22:57:45 +03:00
release_service "code.gitea.io/gitea/services/release"
2020-09-11 17:14:48 +03:00
repo_service "code.gitea.io/gitea/services/repository"
2021-11-24 10:56:24 +03:00
files_service "code.gitea.io/gitea/services/repository/files"
2014-03-24 14:25:15 +04:00
)
2014-06-23 07:11:12 +04:00
const (
2017-10-26 03:49:16 +03:00
tplBranch base . TplName = "repo/branch/list"
2014-06-23 07:11:12 +04:00
)
2017-10-26 03:49:16 +03:00
// Branch contains the branch information
type Branch struct {
2019-06-27 17:15:30 +03:00
Name string
Commit * git . Commit
IsProtected bool
IsDeleted bool
2019-10-15 01:40:17 +03:00
IsIncluded bool
2022-06-12 18:51:54 +03:00
DeletedBranch * git_model . DeletedBranch
2019-06-27 17:15:30 +03:00
CommitsAhead int
CommitsBehind int
2022-06-13 12:37:59 +03:00
LatestPullRequest * issues_model . PullRequest
2020-01-07 20:06:14 +03:00
MergeMovedOn bool
2017-10-26 03:49:16 +03:00
}
2016-11-22 11:32:00 +03:00
// Branches render repository branch page
2016-03-11 19:56:52 +03:00
func Branches ( ctx * context . Context ) {
2014-05-26 04:11:25 +04:00
ctx . Data [ "Title" ] = "Branches"
ctx . Data [ "IsRepoToolbarBranches" ] = true
2017-10-26 03:49:16 +03:00
ctx . Data [ "DefaultBranch" ] = ctx . Repo . Repository . DefaultBranch
2019-07-11 23:21:16 +03:00
ctx . Data [ "AllowsPulls" ] = ctx . Repo . Repository . AllowsPulls ( )
2021-11-09 22:57:58 +03:00
ctx . Data [ "IsWriter" ] = ctx . Repo . CanWrite ( unit . TypeCode )
2017-10-26 03:49:16 +03:00
ctx . Data [ "IsMirror" ] = ctx . Repo . Repository . IsMirror
2021-11-22 18:21:55 +03:00
ctx . Data [ "CanPull" ] = ctx . Repo . CanWrite ( unit . TypeCode ) ||
2022-03-22 10:03:22 +03:00
( ctx . IsSigned && repo_model . HasForkedRepo ( ctx . Doer . ID , ctx . Repo . Repository . ID ) )
2017-10-26 03:49:16 +03:00
ctx . Data [ "PageIsViewCode" ] = true
ctx . Data [ "PageIsBranches" ] = true
2021-07-29 04:42:15 +03:00
page := ctx . FormInt ( "page" )
2021-01-19 07:07:38 +03:00
if page <= 1 {
page = 1
}
2023-03-14 08:11:38 +03:00
pageSize := setting . Git . BranchesRangeSize
2021-01-19 07:07:38 +03:00
2023-03-14 08:11:38 +03:00
skip := ( page - 1 ) * pageSize
log . Debug ( "Branches: skip: %d limit: %d" , skip , pageSize )
defaultBranchBranch , branches , branchesCount := loadBranches ( ctx , skip , pageSize )
2021-01-19 07:07:38 +03:00
if ctx . Written ( ) {
return
}
ctx . Data [ "Branches" ] = branches
2022-01-16 17:59:16 +03:00
ctx . Data [ "DefaultBranchBranch" ] = defaultBranchBranch
2023-03-14 08:11:38 +03:00
pager := context . NewPagination ( branchesCount , pageSize , page , 5 )
2021-01-19 07:07:38 +03:00
pager . SetDefaultParams ( ctx )
ctx . Data [ "Page" ] = pager
2021-04-05 18:30:52 +03:00
ctx . HTML ( http . StatusOK , tplBranch )
2017-10-26 03:49:16 +03:00
}
2014-05-26 04:11:25 +04:00
2017-10-26 03:49:16 +03:00
// DeleteBranchPost responses for delete merged branch
func DeleteBranchPost ( ctx * context . Context ) {
defer redirect ( ctx )
2021-08-11 03:31:13 +03:00
branchName := ctx . FormString ( "name" )
2014-03-24 14:25:15 +04:00
2023-03-01 01:17:51 +03:00
if err := repo_service . DeleteBranch ( ctx , ctx . Doer , ctx . Repo . Repository , ctx . Repo . GitRepo , branchName ) ; err != nil {
2021-06-07 17:52:59 +03:00
switch {
case git . IsErrBranchNotExist ( err ) :
log . Debug ( "DeleteBranch: Can't delete non existing branch '%s'" , branchName )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.deletion_failed" , branchName ) )
case errors . Is ( err , repo_service . ErrBranchIsDefault ) :
log . Debug ( "DeleteBranch: Can't delete default branch '%s'" , branchName )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.default_deletion_failed" , branchName ) )
2023-01-16 11:00:22 +03:00
case errors . Is ( err , git_model . ErrBranchIsProtected ) :
2021-06-07 17:52:59 +03:00
log . Debug ( "DeleteBranch: Can't delete protected branch '%s'" , branchName )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.protected_deletion_failed" , branchName ) )
default :
log . Error ( "DeleteBranch: %v" , err )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.deletion_failed" , branchName ) )
}
2017-10-26 03:49:16 +03:00
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.branch.deletion_success" , branchName ) )
}
// RestoreBranchPost responses for delete merged branch
func RestoreBranchPost ( ctx * context . Context ) {
defer redirect ( ctx )
2021-07-29 04:42:15 +03:00
branchID := ctx . FormInt64 ( "branch_id" )
2021-08-11 03:31:13 +03:00
branchName := ctx . FormString ( "name" )
2017-10-26 03:49:16 +03:00
2023-01-09 06:50:54 +03:00
deletedBranch , err := git_model . GetDeletedBranchByID ( ctx , ctx . Repo . Repository . ID , branchID )
2017-10-26 03:49:16 +03:00
if err != nil {
2019-04-02 10:48:31 +03:00
log . Error ( "GetDeletedBranchByID: %v" , err )
2017-10-26 03:49:16 +03:00
ctx . Flash . Error ( ctx . Tr ( "repo.branch.restore_failed" , branchName ) )
return
2022-11-25 23:58:20 +03:00
} else if deletedBranch == nil {
log . Debug ( "RestoreBranch: Can't restore branch[%d] '%s', as it does not exist" , branchID , branchName )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.restore_failed" , branchName ) )
return
2017-10-26 03:49:16 +03:00
}
2021-11-30 23:06:32 +03:00
if err := git . Push ( ctx , ctx . Repo . Repository . RepoPath ( ) , git . PushOptions {
2020-06-12 02:49:47 +03:00
Remote : ctx . Repo . Repository . RepoPath ( ) ,
Branch : fmt . Sprintf ( "%s:%s%s" , deletedBranch . Commit , git . BranchPrefix , deletedBranch . Name ) ,
2022-05-08 19:46:32 +03:00
Env : repo_module . PushingEnvironment ( ctx . Doer , ctx . Repo . Repository ) ,
2020-06-12 02:49:47 +03:00
} ) ; err != nil {
2017-10-26 03:49:16 +03:00
if strings . Contains ( err . Error ( ) , "already exists" ) {
2021-02-03 22:06:13 +03:00
log . Debug ( "RestoreBranch: Can't restore branch '%s', since one with same name already exist" , deletedBranch . Name )
2017-10-26 03:49:16 +03:00
ctx . Flash . Error ( ctx . Tr ( "repo.branch.already_exists" , deletedBranch . Name ) )
return
}
2021-02-03 22:06:13 +03:00
log . Error ( "RestoreBranch: CreateBranch: %v" , err )
2017-10-26 03:49:16 +03:00
ctx . Flash . Error ( ctx . Tr ( "repo.branch.restore_failed" , deletedBranch . Name ) )
return
}
2019-12-26 16:17:31 +03:00
// Don't return error below this
2020-09-11 17:14:48 +03:00
if err := repo_service . PushUpdate (
2020-10-31 00:59:02 +03:00
& repo_module . PushUpdateOptions {
2019-12-26 16:17:31 +03:00
RefFullName : git . BranchPrefix + deletedBranch . Name ,
OldCommitID : git . EmptySHA ,
NewCommitID : deletedBranch . Commit ,
2022-03-22 10:03:22 +03:00
PusherID : ctx . Doer . ID ,
PusherName : ctx . Doer . Name ,
2019-12-26 16:17:31 +03:00
RepoUserName : ctx . Repo . Owner . Name ,
RepoName : ctx . Repo . Repository . Name ,
} ) ; err != nil {
2021-02-03 22:06:13 +03:00
log . Error ( "RestoreBranch: Update: %v" , err )
2019-12-26 16:17:31 +03:00
}
2017-10-26 03:49:16 +03:00
ctx . Flash . Success ( ctx . Tr ( "repo.branch.restore_success" , deletedBranch . Name ) )
}
func redirect ( ctx * context . Context ) {
2021-04-05 18:30:52 +03:00
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2023-03-14 08:11:38 +03:00
"redirect" : ctx . Repo . RepoLink + "/branches?page=" + url . QueryEscape ( ctx . FormString ( "page" ) ) ,
2017-10-26 03:49:16 +03:00
} )
}
2021-01-19 07:07:38 +03:00
// loadBranches loads branches from the repository limited by page & pageSize.
2021-02-03 22:06:13 +03:00
// NOTE: May write to context on error.
2022-01-16 17:59:16 +03:00
func loadBranches ( ctx * context . Context , skip , limit int ) ( * Branch , [ ] * Branch , int ) {
2021-12-08 22:08:16 +03:00
defaultBranch , err := ctx . Repo . GitRepo . GetBranch ( ctx . Repo . Repository . DefaultBranch )
2021-01-19 07:07:38 +03:00
if err != nil {
2022-01-16 17:59:16 +03:00
if ! git . IsErrBranchNotExist ( err ) {
log . Error ( "loadBranches: get default branch: %v" , err )
ctx . ServerError ( "GetDefaultBranch" , err )
return nil , nil , 0
}
log . Warn ( "loadBranches: missing default branch %s for %-v" , ctx . Repo . Repository . DefaultBranch , ctx . Repo . Repository )
2021-01-19 07:07:38 +03:00
}
2021-12-08 22:08:16 +03:00
rawBranches , totalNumOfBranches , err := ctx . Repo . GitRepo . GetBranches ( skip , limit )
2017-10-26 03:49:16 +03:00
if err != nil {
2021-02-03 22:06:13 +03:00
log . Error ( "GetBranches: %v" , err )
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "GetBranches" , err )
2022-01-16 17:59:16 +03:00
return nil , nil , 0
2017-10-26 03:49:16 +03:00
}
2023-01-16 11:00:22 +03:00
rules , err := git_model . FindRepoProtectedBranchRules ( ctx , ctx . Repo . Repository . ID )
2019-08-01 17:50:06 +03:00
if err != nil {
2023-01-16 11:00:22 +03:00
ctx . ServerError ( "FindRepoProtectedBranchRules" , err )
2022-01-16 17:59:16 +03:00
return nil , nil , 0
2019-08-01 17:50:06 +03:00
}
2021-12-10 04:27:50 +03:00
repoIDToRepo := map [ int64 ] * repo_model . Repository { }
2020-01-07 20:06:14 +03:00
repoIDToRepo [ ctx . Repo . Repository . ID ] = ctx . Repo . Repository
repoIDToGitRepo := map [ int64 ] * git . Repository { }
repoIDToGitRepo [ ctx . Repo . Repository . ID ] = ctx . Repo . GitRepo
2021-01-19 07:07:38 +03:00
var branches [ ] * Branch
2021-02-03 22:06:13 +03:00
for i := range rawBranches {
2022-01-16 17:59:16 +03:00
if defaultBranch != nil && rawBranches [ i ] . Name == defaultBranch . Name {
2021-02-03 22:06:13 +03:00
// Skip default branch
continue
}
2023-01-16 11:00:22 +03:00
branch := loadOneBranch ( ctx , rawBranches [ i ] , defaultBranch , & rules , repoIDToRepo , repoIDToGitRepo )
2021-01-19 07:07:38 +03:00
if branch == nil {
2022-01-16 17:59:16 +03:00
return nil , nil , 0
2021-01-19 07:07:38 +03:00
}
branches = append ( branches , branch )
}
2022-01-16 17:59:16 +03:00
var defaultBranchBranch * Branch
if defaultBranch != nil {
// Always add the default branch
log . Debug ( "loadOneBranch: load default: '%s'" , defaultBranch . Name )
2023-01-16 11:00:22 +03:00
defaultBranchBranch = loadOneBranch ( ctx , defaultBranch , defaultBranch , & rules , repoIDToRepo , repoIDToGitRepo )
2022-01-16 17:59:16 +03:00
branches = append ( branches , defaultBranchBranch )
}
2021-01-19 07:07:38 +03:00
2021-11-09 22:57:58 +03:00
if ctx . Repo . CanWrite ( unit . TypeCode ) {
2021-01-19 07:07:38 +03:00
deletedBranches , err := getDeletedBranches ( ctx )
2017-10-26 03:49:16 +03:00
if err != nil {
2021-01-19 07:07:38 +03:00
ctx . ServerError ( "getDeletedBranches" , err )
2022-01-16 17:59:16 +03:00
return nil , nil , 0
2017-10-26 03:49:16 +03:00
}
2021-01-19 07:07:38 +03:00
branches = append ( branches , deletedBranches ... )
}
2017-10-26 03:49:16 +03:00
2022-01-16 17:59:16 +03:00
return defaultBranchBranch , branches , totalNumOfBranches
2021-01-19 07:07:38 +03:00
}
2023-01-16 11:00:22 +03:00
func loadOneBranch ( ctx * context . Context , rawBranch , defaultBranch * git . Branch , protectedBranches * git_model . ProtectedBranchRules ,
2021-12-10 04:27:50 +03:00
repoIDToRepo map [ int64 ] * repo_model . Repository ,
2022-02-23 23:16:07 +03:00
repoIDToGitRepo map [ int64 ] * git . Repository ,
) * Branch {
2021-02-03 22:06:13 +03:00
log . Trace ( "loadOneBranch: '%s'" , rawBranch . Name )
2021-01-19 07:07:38 +03:00
commit , err := rawBranch . GetCommit ( )
if err != nil {
ctx . ServerError ( "GetCommit" , err )
return nil
}
branchName := rawBranch . Name
2023-01-16 11:00:22 +03:00
p := protectedBranches . GetFirstMatched ( branchName )
isProtected := p != nil
2021-01-19 07:07:38 +03:00
2022-01-16 17:59:16 +03:00
divergence := & git . DivergeObject {
Ahead : - 1 ,
Behind : - 1 ,
}
if defaultBranch != nil {
2022-01-20 02:26:57 +03:00
divergence , err = files_service . CountDivergingCommits ( ctx , ctx . Repo . Repository , git . BranchPrefix + branchName )
2022-01-16 17:59:16 +03:00
if err != nil {
log . Error ( "CountDivergingCommits" , err )
}
2021-01-19 07:07:38 +03:00
}
2017-10-26 03:49:16 +03:00
2022-06-13 12:37:59 +03:00
pr , err := issues_model . GetLatestPullRequestByHeadInfo ( ctx . Repo . Repository . ID , branchName )
2021-01-19 07:07:38 +03:00
if err != nil {
ctx . ServerError ( "GetLatestPullRequestByHeadInfo" , err )
return nil
}
headCommit := commit . ID . String ( )
mergeMovedOn := false
if pr != nil {
pr . HeadRepo = ctx . Repo . Repository
2022-11-19 11:12:33 +03:00
if err := pr . LoadIssue ( ctx ) ; err != nil {
ctx . ServerError ( "LoadIssue" , err )
2019-05-05 19:25:25 +03:00
return nil
}
2021-01-19 07:07:38 +03:00
if repo , ok := repoIDToRepo [ pr . BaseRepoID ] ; ok {
pr . BaseRepo = repo
2022-11-19 11:12:33 +03:00
} else if err := pr . LoadBaseRepo ( ctx ) ; err != nil {
ctx . ServerError ( "LoadBaseRepo" , err )
2019-06-27 17:15:30 +03:00
return nil
2021-01-19 07:07:38 +03:00
} else {
repoIDToRepo [ pr . BaseRepoID ] = pr . BaseRepo
2019-06-27 17:15:30 +03:00
}
2021-01-19 07:07:38 +03:00
pr . Issue . Repo = pr . BaseRepo
if pr . HasMerged {
baseGitRepo , ok := repoIDToGitRepo [ pr . BaseRepoID ]
if ! ok {
2022-03-29 22:13:41 +03:00
baseGitRepo , err = git . OpenRepository ( ctx , pr . BaseRepo . RepoPath ( ) )
2021-01-19 07:07:38 +03:00
if err != nil {
ctx . ServerError ( "OpenRepository" , err )
return nil
}
defer baseGitRepo . Close ( )
repoIDToGitRepo [ pr . BaseRepoID ] = baseGitRepo
2019-06-27 17:15:30 +03:00
}
2021-01-19 07:07:38 +03:00
pullCommit , err := baseGitRepo . GetRefCommitID ( pr . GetGitRefName ( ) )
if err != nil && ! git . IsErrNotExist ( err ) {
ctx . ServerError ( "GetBranchCommitID" , err )
2020-01-07 20:06:14 +03:00
return nil
}
2021-01-19 07:07:38 +03:00
if err == nil && headCommit != pullCommit {
// the head has moved on from the merge - we shouldn't delete
mergeMovedOn = true
2020-01-07 20:06:14 +03:00
}
2019-06-27 17:15:30 +03:00
}
2017-10-26 03:49:16 +03:00
}
2021-01-19 07:07:38 +03:00
isIncluded := divergence . Ahead == 0 && ctx . Repo . Repository . DefaultBranch != branchName
return & Branch {
Name : branchName ,
Commit : commit ,
IsProtected : isProtected ,
IsIncluded : isIncluded ,
CommitsAhead : divergence . Ahead ,
CommitsBehind : divergence . Behind ,
LatestPullRequest : pr ,
MergeMovedOn : mergeMovedOn ,
2017-10-26 03:49:16 +03:00
}
}
func getDeletedBranches ( ctx * context . Context ) ( [ ] * Branch , error ) {
branches := [ ] * Branch { }
2023-01-09 06:50:54 +03:00
deletedBranches , err := git_model . GetDeletedBranches ( ctx , ctx . Repo . Repository . ID )
2017-10-26 03:49:16 +03:00
if err != nil {
return branches , err
}
for i := range deletedBranches {
2022-12-03 05:48:26 +03:00
deletedBranches [ i ] . LoadUser ( ctx )
2017-10-26 03:49:16 +03:00
branches = append ( branches , & Branch {
Name : deletedBranches [ i ] . Name ,
IsDeleted : true ,
DeletedBranch : deletedBranches [ i ] ,
} )
}
return branches , nil
2014-03-24 14:25:15 +04:00
}
2017-10-15 22:59:24 +03:00
// CreateBranch creates new branch in repository
2021-01-26 18:36:53 +03:00
func CreateBranch ( ctx * context . Context ) {
2021-04-06 22:44:05 +03:00
form := web . GetForm ( ctx ) . ( * forms . NewBranchForm )
2017-10-15 22:59:24 +03:00
if ! ctx . Repo . CanCreateBranch ( ) {
2018-01-11 00:34:17 +03:00
ctx . NotFound ( "CreateBranch" , nil )
2017-10-15 22:59:24 +03:00
return
}
if ctx . HasError ( ) {
ctx . Flash . Error ( ctx . GetErrMsg ( ) )
2017-10-30 05:04:25 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
2017-10-15 22:59:24 +03:00
return
}
var err error
2021-02-28 22:57:45 +03:00
if form . CreateTag {
2021-11-18 02:50:17 +03:00
target := ctx . Repo . CommitID
if ctx . Repo . IsViewBranch {
target = ctx . Repo . BranchName
2021-02-28 22:57:45 +03:00
}
2022-03-22 10:03:22 +03:00
err = release_service . CreateNewTag ( ctx , ctx . Doer , ctx . Repo . Repository , target , form . NewBranchName , "" )
2021-02-28 22:57:45 +03:00
} else if ctx . Repo . IsViewBranch {
2022-03-22 10:03:22 +03:00
err = repo_service . CreateNewBranch ( ctx , ctx . Doer , ctx . Repo . Repository , ctx . Repo . BranchName , form . NewBranchName )
2017-10-15 22:59:24 +03:00
} else {
2022-03-22 10:03:22 +03:00
err = repo_service . CreateNewBranchFromCommit ( ctx , ctx . Doer , ctx . Repo . Repository , ctx . Repo . CommitID , form . NewBranchName )
2017-10-15 22:59:24 +03:00
}
if err != nil {
2022-06-16 23:03:03 +03:00
if models . IsErrProtectedTagName ( err ) {
ctx . Flash . Error ( ctx . Tr ( "repo.release.tag_name_protected" ) )
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
return
}
2017-10-15 22:59:24 +03:00
if models . IsErrTagAlreadyExists ( err ) {
e := err . ( models . ErrTagAlreadyExists )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.tag_collision" , e . TagName ) )
2017-10-30 05:04:25 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
2017-10-15 22:59:24 +03:00
return
}
2020-03-28 07:13:18 +03:00
if models . IsErrBranchAlreadyExists ( err ) || git . IsErrPushOutOfDate ( err ) {
ctx . Flash . Error ( ctx . Tr ( "repo.branch.branch_already_exists" , form . NewBranchName ) )
2017-10-30 05:04:25 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
2017-10-15 22:59:24 +03:00
return
}
if models . IsErrBranchNameConflict ( err ) {
e := err . ( models . ErrBranchNameConflict )
ctx . Flash . Error ( ctx . Tr ( "repo.branch.branch_name_conflict" , form . NewBranchName , e . BranchName ) )
2017-10-30 05:04:25 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
2017-10-15 22:59:24 +03:00
return
}
2020-03-28 07:13:18 +03:00
if git . IsErrPushRejected ( err ) {
e := err . ( * git . ErrPushRejected )
if len ( e . Message ) == 0 {
ctx . Flash . Error ( ctx . Tr ( "repo.editor.push_rejected_no_message" ) )
} else {
2021-12-15 09:59:57 +03:00
flashError , err := ctx . RenderToString ( tplAlertDetails , map [ string ] interface { } {
2020-10-21 02:50:10 +03:00
"Message" : ctx . Tr ( "repo.editor.push_rejected" ) ,
"Summary" : ctx . Tr ( "repo.editor.push_rejected_summary" ) ,
"Details" : utils . SanitizeFlashErrorString ( e . Message ) ,
} )
if err != nil {
ctx . ServerError ( "UpdatePullRequest.HTMLString" , err )
return
}
ctx . Flash . Error ( flashError )
2020-03-28 07:13:18 +03:00
}
ctx . Redirect ( ctx . Repo . RepoLink + "/src/" + ctx . Repo . BranchNameSubURL ( ) )
return
}
2017-10-15 22:59:24 +03:00
2018-01-11 00:34:17 +03:00
ctx . ServerError ( "CreateNewBranch" , err )
2017-10-15 22:59:24 +03:00
return
}
2021-02-28 22:57:45 +03:00
if form . CreateTag {
ctx . Flash . Success ( ctx . Tr ( "repo.tag.create_success" , form . NewBranchName ) )
ctx . Redirect ( ctx . Repo . RepoLink + "/src/tag/" + util . PathEscapeSegments ( form . NewBranchName ) )
return
}
2017-10-15 22:59:24 +03:00
ctx . Flash . Success ( ctx . Tr ( "repo.branch.create_success" , form . NewBranchName ) )
2022-09-15 16:25:16 +03:00
ctx . Redirect ( ctx . Repo . RepoLink + "/src/branch/" + util . PathEscapeSegments ( form . NewBranchName ) + "/" + util . PathEscapeSegments ( form . CurrentPath ) )
2017-10-15 22:59:24 +03:00
}