mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	[API] make change repo settings work on empty repos (#15778)
* API: Fix #15602 * Add TEST
This commit is contained in:
		@@ -130,11 +130,14 @@ func getNewRepoEditOption(opts *api.EditRepoOption) *api.EditRepoOption {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestAPIRepoEdit(t *testing.T) {
 | 
					func TestAPIRepoEdit(t *testing.T) {
 | 
				
			||||||
	onGiteaRun(t, func(t *testing.T, u *url.URL) {
 | 
						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
 | 
							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
 | 
							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
 | 
							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
 | 
							repo1 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 1}).(*models.Repository)   // public repo
 | 
				
			||||||
		repo3 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 3}).(*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
 | 
							repo16 := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository) // private repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Get user2's token
 | 
							// Get user2's token
 | 
				
			||||||
@@ -286,9 +289,8 @@ func TestAPIRepoEdit(t *testing.T) {
 | 
				
			|||||||
		// Test making a repo public that is private
 | 
							// Test making a repo public that is private
 | 
				
			||||||
		repo16 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository)
 | 
							repo16 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository)
 | 
				
			||||||
		assert.True(t, repo16.IsPrivate)
 | 
							assert.True(t, repo16.IsPrivate)
 | 
				
			||||||
		private := false
 | 
					 | 
				
			||||||
		repoEditOption = &api.EditRepoOption{
 | 
							repoEditOption = &api.EditRepoOption{
 | 
				
			||||||
			Private: &private,
 | 
								Private: &bFalse,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, repo16.Name, token2)
 | 
							url = fmt.Sprintf("/api/v1/repos/%s/%s?token=%s", user2.Name, repo16.Name, token2)
 | 
				
			||||||
		req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
 | 
							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)
 | 
							repo16 = models.AssertExistsAndLoadBean(t, &models.Repository{ID: 16}).(*models.Repository)
 | 
				
			||||||
		assert.False(t, repo16.IsPrivate)
 | 
							assert.False(t, repo16.IsPrivate)
 | 
				
			||||||
		// Make it private again
 | 
							// Make it private again
 | 
				
			||||||
		private = true
 | 
							repoEditOption.Private = &bTrue
 | 
				
			||||||
		repoEditOption.Private = &private
 | 
					 | 
				
			||||||
		req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
 | 
							req = NewRequestWithJSON(t, "PATCH", url, &repoEditOption)
 | 
				
			||||||
		_ = session.MakeRequest(t, req, http.StatusOK)
 | 
							_ = 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
 | 
							// Test using org repo "user3/repo3" where user2 is a collaborator
 | 
				
			||||||
		origRepoEditOption = getRepoEditOptionFromRepo(repo3)
 | 
							origRepoEditOption = getRepoEditOptionFromRepo(repo3)
 | 
				
			||||||
		repoEditOption = getNewRepoEditOption(origRepoEditOption)
 | 
							repoEditOption = getNewRepoEditOption(origRepoEditOption)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -712,7 +712,7 @@ func Routes() *web.Route {
 | 
				
			|||||||
			m.Group("/{username}/{reponame}", func() {
 | 
								m.Group("/{username}/{reponame}", func() {
 | 
				
			||||||
				m.Combo("").Get(reqAnyRepoReader(), repo.Get).
 | 
									m.Combo("").Get(reqAnyRepoReader(), repo.Get).
 | 
				
			||||||
					Delete(reqToken(), reqOwner(), repo.Delete).
 | 
										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.Post("/transfer", reqOwner(), bind(api.TransferRepoOption{}), repo.Transfer)
 | 
				
			||||||
				m.Combo("/notifications").
 | 
									m.Combo("/notifications").
 | 
				
			||||||
					Get(reqToken(), notify.ListRepoNotifications).
 | 
										Get(reqToken(), notify.ListRepoNotifications).
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -578,7 +578,7 @@ func updateBasicProperties(ctx *context.APIContext, opts api.EditRepoOption) err
 | 
				
			|||||||
		repo.IsTemplate = *opts.Template
 | 
							repo.IsTemplate = *opts.Template
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ctx.Repo.GitRepo == nil {
 | 
						if ctx.Repo.GitRepo == nil && !repo.IsEmpty {
 | 
				
			||||||
		var err error
 | 
							var err error
 | 
				
			||||||
		ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
 | 
							ctx.Repo.GitRepo, err = git.OpenRepository(ctx.Repo.Repository.RepoPath())
 | 
				
			||||||
		if err != nil {
 | 
							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
 | 
						// Default branch only updated if changed and exist or the repository is empty
 | 
				
			||||||
	if opts.DefaultBranch != nil &&
 | 
						if opts.DefaultBranch != nil && repo.DefaultBranch != *opts.DefaultBranch && (repo.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) {
 | 
				
			||||||
		repo.DefaultBranch != *opts.DefaultBranch &&
 | 
							if !repo.IsEmpty {
 | 
				
			||||||
		(ctx.Repo.Repository.IsEmpty || ctx.Repo.GitRepo.IsBranchExist(*opts.DefaultBranch)) {
 | 
								if err := ctx.Repo.GitRepo.SetDefaultBranch(*opts.DefaultBranch); err != nil {
 | 
				
			||||||
		if err := ctx.Repo.GitRepo.SetDefaultBranch(*opts.DefaultBranch); err != nil {
 | 
									if !git.IsErrUnsupportedVersion(err) {
 | 
				
			||||||
			if !git.IsErrUnsupportedVersion(err) {
 | 
										ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err)
 | 
				
			||||||
				ctx.Error(http.StatusInternalServerError, "SetDefaultBranch", err)
 | 
										return err
 | 
				
			||||||
				return err
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		repo.DefaultBranch = *opts.DefaultBranch
 | 
							repo.DefaultBranch = *opts.DefaultBranch
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user