aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--models/errors/repo.go13
-rw-r--r--models/repo_editor.go19
2 files changed, 31 insertions, 1 deletions
diff --git a/models/errors/repo.go b/models/errors/repo.go
index 15adb2b0..69c29be6 100644
--- a/models/errors/repo.go
+++ b/models/errors/repo.go
@@ -59,3 +59,16 @@ func IsMirrorNotExist(err error) bool {
func (err MirrorNotExist) Error() string {
return fmt.Sprintf("mirror does not exist [repo_id: %d]", err.RepoID)
}
+
+type BranchAlreadyExists struct {
+ Name string
+}
+
+func IsBranchAlreadyExists(err error) bool {
+ _, ok := err.(BranchAlreadyExists)
+ return ok
+}
+
+func (err BranchAlreadyExists) Error() string {
+ return fmt.Sprintf("branch already exists [name: %s]", err.Name)
+}
diff --git a/models/repo_editor.go b/models/repo_editor.go
index 955d018d..ebf25ecd 100644
--- a/models/repo_editor.go
+++ b/models/repo_editor.go
@@ -21,6 +21,7 @@ import (
git "github.com/gogits/git-module"
+ "github.com/gogits/gogs/models/errors"
"github.com/gogits/gogs/pkg/process"
"github.com/gogits/gogs/pkg/setting"
)
@@ -92,13 +93,29 @@ func (repo *Repository) UpdateRepoFile(doer *User, opts UpdateRepoFileOptions) (
return fmt.Errorf("UpdateLocalCopyBranch [branch: %s]: %v", opts.OldBranch, err)
}
+ repoPath := repo.RepoPath()
+ localPath := repo.LocalCopyPath()
+
if opts.OldBranch != opts.NewBranch {
+ // Directly return error if new branch already exists in the server
+ if git.IsBranchExist(repoPath, opts.NewBranch) {
+ return errors.BranchAlreadyExists{opts.NewBranch}
+ }
+
+ // Otherwise, delete branch from local copy in case out of sync
+ if git.IsBranchExist(localPath, opts.NewBranch) {
+ if err = git.DeleteBranch(localPath, opts.NewBranch, git.DeleteBranchOptions{
+ Force: true,
+ }); err != nil {
+ return fmt.Errorf("DeleteBranch [name: %s]: %v", opts.NewBranch, err)
+ }
+ }
+
if err := repo.CheckoutNewBranch(opts.OldBranch, opts.NewBranch); err != nil {
return fmt.Errorf("CheckoutNewBranch [old_branch: %s, new_branch: %s]: %v", opts.OldBranch, opts.NewBranch, err)
}
}
- localPath := repo.LocalCopyPath()
oldFilePath := path.Join(localPath, opts.OldTreeName)
filePath := path.Join(localPath, opts.NewTreeName)
os.MkdirAll(path.Dir(filePath), os.ModePerm)