summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/structs/repo.go6
-rw-r--r--routers/api/v1/repo/branch.go32
-rw-r--r--templates/swagger/v1_json.tmpl8
3 files changed, 41 insertions, 5 deletions
diff --git a/modules/structs/repo.go b/modules/structs/repo.go
index 259c230571..01239188c2 100644
--- a/modules/structs/repo.go
+++ b/modules/structs/repo.go
@@ -249,10 +249,16 @@ type CreateBranchRepoOption struct {
// unique: true
BranchName string `json:"new_branch_name" binding:"Required;GitRefName;MaxSize(100)"`
+ // Deprecated: true
// Name of the old branch to create from
//
// unique: true
OldBranchName string `json:"old_branch_name" binding:"GitRefName;MaxSize(100)"`
+
+ // Name of the old branch/tag/commit to create from
+ //
+ // unique: true
+ OldRefName string `json:"old_ref_name" binding:"GitRefName;MaxSize(100)"`
}
// TransferRepoOption options when transfer a repository's ownership
diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go
index 1ae6193a8a..5336ccb797 100644
--- a/routers/api/v1/repo/branch.go
+++ b/routers/api/v1/repo/branch.go
@@ -173,11 +173,35 @@ func CreateBranch(ctx *context.APIContext) {
return
}
- if len(opt.OldBranchName) == 0 {
- opt.OldBranchName = ctx.Repo.Repository.DefaultBranch
+ var oldCommit *git.Commit
+ var err error
+
+ if len(opt.OldRefName) > 0 {
+ oldCommit, err = ctx.Repo.GitRepo.GetCommit(opt.OldRefName)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetCommit", err)
+ return
+ }
+ } else if len(opt.OldBranchName) > 0 { //nolint
+ if ctx.Repo.GitRepo.IsBranchExist(opt.OldBranchName) { //nolint
+ oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(opt.OldBranchName) //nolint
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetBranchCommit", err)
+ return
+ }
+ } else {
+ ctx.Error(http.StatusNotFound, "", "The old branch does not exist")
+ return
+ }
+ } else {
+ oldCommit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "GetBranchCommit", err)
+ return
+ }
}
- err := repo_service.CreateNewBranch(ctx, ctx.Doer, ctx.Repo.Repository, opt.OldBranchName, opt.BranchName)
+ err = repo_service.CreateNewBranchFromCommit(ctx, ctx.Doer, ctx.Repo.Repository, oldCommit.ID.String(), opt.BranchName)
if err != nil {
if models.IsErrBranchDoesNotExist(err) {
ctx.Error(http.StatusNotFound, "", "The old branch does not exist")
@@ -189,7 +213,7 @@ func CreateBranch(ctx *context.APIContext) {
} else if models.IsErrBranchNameConflict(err) {
ctx.Error(http.StatusConflict, "", "The branch with the same name already exists.")
} else {
- ctx.Error(http.StatusInternalServerError, "CreateRepoBranch", err)
+ ctx.Error(http.StatusInternalServerError, "CreateNewBranchFromCommit", err)
}
return
}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 99c49fec9c..e11fdeff80 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -16145,10 +16145,16 @@
"x-go-name": "BranchName"
},
"old_branch_name": {
- "description": "Name of the old branch to create from",
+ "description": "Deprecated: true\nName of the old branch to create from",
"type": "string",
"uniqueItems": true,
"x-go-name": "OldBranchName"
+ },
+ "old_ref_name": {
+ "description": "Name of the old branch/tag/commit to create from",
+ "type": "string",
+ "uniqueItems": true,
+ "x-go-name": "OldRefName"
}
},
"x-go-package": "code.gitea.io/gitea/modules/structs"