diff --git a/modules/structs/repo.go b/modules/structs/repo.go index 404718def0f..e82a6dc25e9 100644 --- a/modules/structs/repo.go +++ b/modules/structs/repo.go @@ -282,9 +282,9 @@ type CreateBranchRepoOption struct { OldRefName string `json:"old_ref_name" binding:"GitRefName;MaxSize(100)"` } -// UpdateBranchRepoOption options when updating a branch in a repository +// RenameBranchRepoOption options when renaming a branch in a repository // swagger:model -type UpdateBranchRepoOption struct { +type RenameBranchRepoOption struct { // New branch name // // required: true diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index e185a2147c5..bada1f6b760 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -1256,7 +1256,7 @@ func Routes() *web.Router { m.Get("/*", repo.GetBranch) m.Delete("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, repo.DeleteBranch) m.Post("", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.CreateBranchRepoOption{}), repo.CreateBranch) - m.Patch("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.UpdateBranchRepoOption{}), repo.UpdateBranch) + m.Patch("/*", reqToken(), reqRepoWriter(unit.TypeCode), mustNotBeArchived, bind(api.RenameBranchRepoOption{}), repo.RenameBranch) }, context.ReferencesGitRepo(), reqRepoReader(unit.TypeCode)) m.Group("/branch_protections", func() { m.Get("", repo.ListBranchProtections) diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index 9af958a5b7b..65fac45aa11 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -380,11 +380,11 @@ func ListBranches(ctx *context.APIContext) { ctx.JSON(http.StatusOK, apiBranches) } -// UpdateBranch updates a repository's branch. -func UpdateBranch(ctx *context.APIContext) { - // swagger:operation PATCH /repos/{owner}/{repo}/branches/{branch} repository repoUpdateBranch +// RenameBranch renames a repository's branch. +func RenameBranch(ctx *context.APIContext) { + // swagger:operation PATCH /repos/{owner}/{repo}/branches/{branch} repository repoRenameBranch // --- - // summary: Update a branch + // summary: Rename a branch // consumes: // - application/json // produces: @@ -408,7 +408,7 @@ func UpdateBranch(ctx *context.APIContext) { // - name: body // in: body // schema: - // "$ref": "#/definitions/UpdateBranchRepoOption" + // "$ref": "#/definitions/RenameBranchRepoOption" // responses: // "204": // "$ref": "#/responses/empty" @@ -419,7 +419,7 @@ func UpdateBranch(ctx *context.APIContext) { // "422": // "$ref": "#/responses/validationError" - opt := web.GetForm(ctx).(*api.UpdateBranchRepoOption) + opt := web.GetForm(ctx).(*api.RenameBranchRepoOption) oldName := ctx.PathParam("*") repo := ctx.Repo.Repository diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go index bafd5e04a2a..4aba74b9396 100644 --- a/routers/api/v1/swagger/options.go +++ b/routers/api/v1/swagger/options.go @@ -90,7 +90,7 @@ type swaggerParameterBodies struct { // in:body EditRepoOption api.EditRepoOption // in:body - UpdateBranchRepoOption api.UpdateBranchRepoOption + RenameBranchRepoOption api.RenameBranchRepoOption // in:body TransferRepoOption api.TransferRepoOption // in:body diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 749d86901de..51ba751f280 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -6807,8 +6807,8 @@ "tags": [ "repository" ], - "summary": "Update a branch", - "operationId": "repoUpdateBranch", + "summary": "Rename a branch", + "operationId": "repoRenameBranch", "parameters": [ { "type": "string", @@ -6835,7 +6835,7 @@ "name": "body", "in": "body", "schema": { - "$ref": "#/definitions/UpdateBranchRepoOption" + "$ref": "#/definitions/RenameBranchRepoOption" } } ], @@ -27163,6 +27163,22 @@ }, "x-go-package": "code.gitea.io/gitea/modules/structs" }, + "RenameBranchRepoOption": { + "description": "RenameBranchRepoOption options when renaming a branch in a repository", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "New branch name", + "type": "string", + "uniqueItems": true, + "x-go-name": "Name" + } + }, + "x-go-package": "code.gitea.io/gitea/modules/structs" + }, "RenameOrgOption": { "description": "RenameOrgOption options when renaming an organization", "type": "object", @@ -28093,22 +28109,6 @@ }, "x-go-package": "code.gitea.io/gitea/modules/structs" }, - "UpdateBranchRepoOption": { - "description": "UpdateBranchRepoOption options when updating a branch in a repository", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "New branch name", - "type": "string", - "uniqueItems": true, - "x-go-name": "Name" - } - }, - "x-go-package": "code.gitea.io/gitea/modules/structs" - }, "UpdateFileOptions": { "description": "UpdateFileOptions options for updating files\nNote: `author` and `committer` are optional (if only one is given, it will be used for the other, otherwise the authenticated user will be used)", "type": "object", diff --git a/tests/integration/api_branch_test.go b/tests/integration/api_branch_test.go index 7d6b8723494..12e2b18312a 100644 --- a/tests/integration/api_branch_test.go +++ b/tests/integration/api_branch_test.go @@ -187,26 +187,26 @@ func testAPICreateBranch(t testing.TB, session *TestSession, user, repo, oldBran return resp.Result().StatusCode == status } -func TestAPIUpdateBranch(t *testing.T) { +func TestAPIRenameBranch(t *testing.T) { onGiteaRun(t, func(t *testing.T, _ *url.URL) { - t.Run("UpdateBranchWithEmptyRepo", func(t *testing.T) { - testAPIUpdateBranch(t, "user10", "user10", "repo6", "master", "test", http.StatusNotFound) + t.Run("RenameBranchWithEmptyRepo", func(t *testing.T) { + testAPIRenameBranch(t, "user10", "user10", "repo6", "master", "test", http.StatusNotFound) }) - t.Run("UpdateBranchWithSameBranchNames", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "user2", "repo1", "master", "master", http.StatusUnprocessableEntity) + t.Run("RenameBranchWithSameBranchNames", func(t *testing.T) { + resp := testAPIRenameBranch(t, "user2", "user2", "repo1", "master", "master", http.StatusUnprocessableEntity) assert.Contains(t, resp.Body.String(), "Cannot rename a branch using the same name or rename to a branch that already exists.") }) - t.Run("UpdateBranchThatAlreadyExists", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "user2", "repo1", "master", "branch2", http.StatusUnprocessableEntity) + t.Run("RenameBranchThatAlreadyExists", func(t *testing.T) { + resp := testAPIRenameBranch(t, "user2", "user2", "repo1", "master", "branch2", http.StatusUnprocessableEntity) assert.Contains(t, resp.Body.String(), "Cannot rename a branch using the same name or rename to a branch that already exists.") }) - t.Run("UpdateBranchWithNonExistentBranch", func(t *testing.T) { - resp := testAPIUpdateBranch(t, "user2", "user2", "repo1", "i-dont-exist", "new-branch-name", http.StatusNotFound) + t.Run("RenameBranchWithNonExistentBranch", func(t *testing.T) { + resp := testAPIRenameBranch(t, "user2", "user2", "repo1", "i-dont-exist", "new-branch-name", http.StatusNotFound) assert.Contains(t, resp.Body.String(), "Branch doesn't exist.") }) - t.Run("UpdateBranchWithNonAdminDoer", func(t *testing.T) { + t.Run("RenameBranchWithNonAdminDoer", func(t *testing.T) { // don't allow default branch renaming - resp := testAPIUpdateBranch(t, "user40", "user2", "repo1", "master", "new-branch-name", http.StatusForbidden) + resp := testAPIRenameBranch(t, "user40", "user2", "repo1", "master", "new-branch-name", http.StatusForbidden) assert.Contains(t, resp.Body.String(), "User must be a repo or site admin to rename default or protected branches.") // don't allow protected branch renaming @@ -216,10 +216,10 @@ func TestAPIUpdateBranch(t *testing.T) { }).AddTokenAuth(token) MakeRequest(t, req, http.StatusCreated) testAPICreateBranchProtection(t, "protected-branch", 1, http.StatusCreated) - resp = testAPIUpdateBranch(t, "user40", "user2", "repo1", "protected-branch", "new-branch-name", http.StatusForbidden) + resp = testAPIRenameBranch(t, "user40", "user2", "repo1", "protected-branch", "new-branch-name", http.StatusForbidden) assert.Contains(t, resp.Body.String(), "User must be a repo or site admin to rename default or protected branches.") }) - t.Run("UpdateBranchWithGlobedBasedProtectionRulesAndAdminAccess", func(t *testing.T) { + t.Run("RenameBranchWithGlobedBasedProtectionRulesAndAdminAccess", func(t *testing.T) { // don't allow branch that falls under glob-based protection rules to be renamed token := getUserToken(t, "user2", auth_model.AccessTokenScopeWriteRepository) req := NewRequestWithJSON(t, "POST", "/api/v1/repos/user2/repo1/branch_protections", &api.BranchProtection{ @@ -234,18 +234,18 @@ func TestAPIUpdateBranch(t *testing.T) { }).AddTokenAuth(token) MakeRequest(t, req, http.StatusCreated) - resp := testAPIUpdateBranch(t, "user2", "user2", "repo1", from, "new-branch-name", http.StatusForbidden) + resp := testAPIRenameBranch(t, "user2", "user2", "repo1", from, "new-branch-name", http.StatusForbidden) assert.Contains(t, resp.Body.String(), "Branch is protected by glob-based protection rules.") }) - t.Run("UpdateBranchNormalScenario", func(t *testing.T) { - testAPIUpdateBranch(t, "user2", "user2", "repo1", "branch2", "new-branch-name", http.StatusNoContent) + t.Run("RenameBranchNormalScenario", func(t *testing.T) { + testAPIRenameBranch(t, "user2", "user2", "repo1", "branch2", "new-branch-name", http.StatusNoContent) }) }) } -func testAPIUpdateBranch(t *testing.T, doerName, ownerName, repoName, from, to string, expectedHTTPStatus int) *httptest.ResponseRecorder { +func testAPIRenameBranch(t *testing.T, doerName, ownerName, repoName, from, to string, expectedHTTPStatus int) *httptest.ResponseRecorder { token := getUserToken(t, doerName, auth_model.AccessTokenScopeWriteRepository) - req := NewRequestWithJSON(t, "PATCH", "api/v1/repos/"+ownerName+"/"+repoName+"/branches/"+from, &api.UpdateBranchRepoOption{ + req := NewRequestWithJSON(t, "PATCH", "api/v1/repos/"+ownerName+"/"+repoName+"/branches/"+from, &api.RenameBranchRepoOption{ Name: to, }).AddTokenAuth(token) return MakeRequest(t, req, expectedHTTPStatus)