mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Fix branch api canPush and canMerge (#10776)
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
This commit is contained in:
		@@ -28,6 +28,8 @@ func testAPIGetBranch(t *testing.T, branchName string, exists bool) {
 | 
			
		||||
	var branch api.Branch
 | 
			
		||||
	DecodeJSON(t, resp, &branch)
 | 
			
		||||
	assert.EqualValues(t, branchName, branch.Name)
 | 
			
		||||
	assert.True(t, branch.UserCanPush)
 | 
			
		||||
	assert.True(t, branch.UserCanMerge)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testAPIGetBranchProtection(t *testing.T, branchName string, expectedHTTPStatus int) {
 | 
			
		||||
 
 | 
			
		||||
@@ -30,40 +30,48 @@ func ToEmail(email *models.EmailAddress) *api.Email {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToBranch convert a git.Commit and git.Branch to an api.Branch
 | 
			
		||||
func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.ProtectedBranch, user *models.User, isRepoAdmin bool) *api.Branch {
 | 
			
		||||
func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.ProtectedBranch, user *models.User, isRepoAdmin bool) (*api.Branch, error) {
 | 
			
		||||
	if bp == nil {
 | 
			
		||||
		return &api.Branch{
 | 
			
		||||
			Name:                          b.Name,
 | 
			
		||||
			Commit:                        ToCommit(repo, c),
 | 
			
		||||
			Protected:                     false,
 | 
			
		||||
			RequiredApprovals:             0,
 | 
			
		||||
			EnableStatusCheck:             false,
 | 
			
		||||
			StatusCheckContexts:           []string{},
 | 
			
		||||
			UserCanPush:                   true,
 | 
			
		||||
			UserCanMerge:                  true,
 | 
			
		||||
			EffectiveBranchProtectionName: "",
 | 
			
		||||
		var hasPerm bool
 | 
			
		||||
		var err error
 | 
			
		||||
		if user != nil {
 | 
			
		||||
			hasPerm, err = models.HasAccessUnit(user, repo, models.UnitTypeCode, models.AccessModeWrite)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return nil, err
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	branchProtectionName := ""
 | 
			
		||||
	if isRepoAdmin {
 | 
			
		||||
		branchProtectionName = bp.BranchName
 | 
			
		||||
 | 
			
		||||
		return &api.Branch{
 | 
			
		||||
			Name:                b.Name,
 | 
			
		||||
			Commit:              ToCommit(repo, c),
 | 
			
		||||
			Protected:           false,
 | 
			
		||||
			RequiredApprovals:   0,
 | 
			
		||||
			EnableStatusCheck:   false,
 | 
			
		||||
			StatusCheckContexts: []string{},
 | 
			
		||||
			UserCanPush:         hasPerm,
 | 
			
		||||
			UserCanMerge:        hasPerm,
 | 
			
		||||
		}, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	branch := &api.Branch{
 | 
			
		||||
		Name:                          b.Name,
 | 
			
		||||
		Commit:                        ToCommit(repo, c),
 | 
			
		||||
		Protected:                     true,
 | 
			
		||||
		RequiredApprovals:             bp.RequiredApprovals,
 | 
			
		||||
		EnableStatusCheck:             bp.EnableStatusCheck,
 | 
			
		||||
		StatusCheckContexts:           bp.StatusCheckContexts,
 | 
			
		||||
		EffectiveBranchProtectionName: branchProtectionName,
 | 
			
		||||
		Name:                b.Name,
 | 
			
		||||
		Commit:              ToCommit(repo, c),
 | 
			
		||||
		Protected:           true,
 | 
			
		||||
		RequiredApprovals:   bp.RequiredApprovals,
 | 
			
		||||
		EnableStatusCheck:   bp.EnableStatusCheck,
 | 
			
		||||
		StatusCheckContexts: bp.StatusCheckContexts,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if isRepoAdmin {
 | 
			
		||||
		branch.EffectiveBranchProtectionName = bp.BranchName
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if user != nil {
 | 
			
		||||
		branch.UserCanPush = bp.CanUserPush(user.ID)
 | 
			
		||||
		branch.UserCanMerge = bp.IsUserMergeWhitelisted(user.ID)
 | 
			
		||||
	}
 | 
			
		||||
	return branch
 | 
			
		||||
 | 
			
		||||
	return branch, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ToBranchProtection convert a ProtectedBranch to api.BranchProtection
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,13 @@ func GetBranch(ctx *context.APIContext) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.JSON(http.StatusOK, convert.ToBranch(ctx.Repo.Repository, branch, c, branchProtection, ctx.User, ctx.Repo.IsAdmin()))
 | 
			
		||||
	br, err := convert.ToBranch(ctx.Repo.Repository, branch, c, branchProtection, ctx.User, ctx.Repo.IsAdmin())
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusInternalServerError, "convert.ToBranch", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.JSON(http.StatusOK, br)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ListBranches list all the branches of a repository
 | 
			
		||||
@@ -115,7 +121,11 @@ func ListBranches(ctx *context.APIContext) {
 | 
			
		||||
			ctx.Error(http.StatusInternalServerError, "GetBranchProtection", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		apiBranches[i] = convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User, ctx.Repo.IsAdmin())
 | 
			
		||||
		apiBranches[i], err = convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User, ctx.Repo.IsAdmin())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.Error(http.StatusInternalServerError, "convert.ToBranch", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.JSON(http.StatusOK, &apiBranches)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user