]> source.dussan.org Git - gitea.git/commitdiff
[API] make change repo settings work on empty repos (#15778) (#15789)
author6543 <6543@obermui.de>
Sat, 8 May 2021 13:14:42 +0000 (15:14 +0200)
committerGitHub <noreply@github.com>
Sat, 8 May 2021 13:14:42 +0000 (15:14 +0200)
* API: Fix #15602

* Add TEST

integrations/api_repo_edit_test.go
routers/api/v1/api.go
routers/api/v1/repo/repo.go

index c1b513d0753c118ebebe0e72156ffd95429438f6..618c1f0ad09b0d5232b2ffcff99646a974c284cd 100644 (file)
@@ -130,11 +130,14 @@ func getNewRepoEditOption(opts *api.EditRepoOption) *api.EditRepoOption {
 
 func TestAPIRepoEdit(t *testing.T) {
        onGiteaRun(t, func(t *testing.T, u *url.URL) {
+               bFalse, bTrue := false, true
+
                user2 := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)               // owner of the repo1 & repo16
                user3 := models.AssertExistsAndLoadBean(t, &models.User{ID: 3}).(*models.User)               // owner of the repo3, is an org
                user4 := models.AssertExistsAndLoadBean(t, &models.User{ID: 4}).(*models.User)               // owner of neither repos
                repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)   // public repo
                repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*models.Repository)   // public repo
+               repo15 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 15}).(*models.Repository) // empty repo
                repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
 
                // Get user2's token
@@ -286,9 +289,8 @@ func TestAPIRepoEdit(t *testing.T) {
                // Test making a repo public that is private
                repo16 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository)
                assert.True(t, repo16.IsPrivate)
-               private := false
                repoEditOption = &api.EditRepoOption{
-                       Private: &private,
+                       Private: &bFalse,
                }
                url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, repo16.Name, token2)
                req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
@@ -296,11 +298,24 @@ func TestAPIRepoEdit(t *testing.T) {
                repo16 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository)
                assert.False(t, repo16.IsPrivate)
                // Make it private again
-               private = true
-               repoEditOption.Private = &private
+               repoEditOption.Private = &bTrue
                req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
                _ = session.MakeRequest(t, req, http.StatusOK)
 
+               // Test to change empty repo
+               assert.False(t, repo15.IsArchived)
+               url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, repo15.Name, token2)
+               req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{
+                       Archived: &bTrue,
+               })
+               _ = session.MakeRequest(t, req, http.StatusOK)
+               repo15 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 15}).(*models.Repository)
+               assert.True(t, repo15.IsArchived)
+               req = NewRequestWithJSON(t, "PATCH", url, &api.EditRepoOption{
+                       Archived: &bFalse,
+               })
+               _ = session.MakeRequest(t, req, http.StatusOK)
+
                // Test using org repo "user3/repo3" where user2 is a collaborator
                origRepoEditOption = getRepoEditOptionFromRepo(repo3)
                repoEditOption = getNewRepoEditOption(origRepoEditOption)
index 60c4f6d790d5f3c516a660107080a8621bcbcdc9..7beaf96020fa4db15d93b5174da91b17a1d88bf1 100644 (file)
@@ -716,7 +716,7 @@ func Routes() *web.Route {
                        m.Group("/{username}/{reponame}", func() {
                                m.Combo("").Get(reqAnyRepoReader(), repo.Get).
                                        Delete(reqToken(), reqOwner(), repo.Delete).
-                                       Patch(reqToken(), reqAdmin(), context.RepoRefForAPI, bind(api.EditRepoOption{}), repo.Edit)
+                                       Patch(reqToken(), reqAdmin(), bind(api.EditRepoOption{}), repo.Edit)
                                m.Post("/transfer", reqOwner(), bind(api.TransferRepoOption{}), repo.Transfer)
                                m.Combo("/notifications").
                                        Get(reqToken(), notify.ListRepoNotifications).
index b7ed2951ad663c98333991d709893c65d2d5ca71..4d96516d210d6dbd0d522570f34464087812ce26 100644 (file)
@@ -578,7 +578,7 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err
                repo.IsTemplate = *opts.Template
        }
 
-       if ctx.Repo.GitRepo == nil {
+       if ctx.Repo.GitRepo == nil && !repo.IsEmpty {
                var err error
                ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
                if err != nil {
@@ -589,13 +589,13 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err
        }
 
        // Default branch only updated if changed and exist or the repository is empty
-       if opts.DefaultBranch != nil &&
-               repo.DefaultBranch != *opts.DefaultBranch &&
-               (ctx.Repo.Repository.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) {
-               if err := ctx.Repo.GitRepo.SetDefaultBranch(*opts.DefaultBranch); err != nil {
-                       if !git.IsErrUnsupportedVersion(err) {
-                               ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err)
-                               return err
+       if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) {
+               if !repo.IsEmpty {
+                       if err := ctx.Repo.GitRepo.SetDefaultBranch(*opts.DefaultBranch); err != nil {
+                               if !git.IsErrUnsupportedVersion(err) {
+                                       ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err)
+                                       return err
+                               }
                        }
                }
                repo.DefaultBranch = *opts.DefaultBranch