mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00: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 | 	var branch api.Branch | ||||||
| 	DecodeJSON(t, resp, &branch) | 	DecodeJSON(t, resp, &branch) | ||||||
| 	assert.EqualValues(t, branchName, branch.Name) | 	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) { | func testAPIGetBranchProtection(t *testing.T, branchName string, expectedHTTPStatus int) { | ||||||
|   | |||||||
| @@ -30,8 +30,17 @@ func ToEmail(email *models.EmailAddress) *api.Email { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ToBranch convert a git.Commit and git.Branch to an api.Branch | // 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 { | 	if bp == nil { | ||||||
|  | 		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 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		return &api.Branch{ | 		return &api.Branch{ | ||||||
| 			Name:                b.Name, | 			Name:                b.Name, | ||||||
| 			Commit:              ToCommit(repo, c), | 			Commit:              ToCommit(repo, c), | ||||||
| @@ -39,14 +48,9 @@ func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models. | |||||||
| 			RequiredApprovals:   0, | 			RequiredApprovals:   0, | ||||||
| 			EnableStatusCheck:   false, | 			EnableStatusCheck:   false, | ||||||
| 			StatusCheckContexts: []string{}, | 			StatusCheckContexts: []string{}, | ||||||
| 			UserCanPush:                   true, | 			UserCanPush:         hasPerm, | ||||||
| 			UserCanMerge:                  true, | 			UserCanMerge:        hasPerm, | ||||||
| 			EffectiveBranchProtectionName: "", | 		}, nil | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	branchProtectionName := "" |  | ||||||
| 	if isRepoAdmin { |  | ||||||
| 		branchProtectionName = bp.BranchName |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	branch := &api.Branch{ | 	branch := &api.Branch{ | ||||||
| @@ -56,14 +60,18 @@ func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models. | |||||||
| 		RequiredApprovals:   bp.RequiredApprovals, | 		RequiredApprovals:   bp.RequiredApprovals, | ||||||
| 		EnableStatusCheck:   bp.EnableStatusCheck, | 		EnableStatusCheck:   bp.EnableStatusCheck, | ||||||
| 		StatusCheckContexts: bp.StatusCheckContexts, | 		StatusCheckContexts: bp.StatusCheckContexts, | ||||||
| 		EffectiveBranchProtectionName: branchProtectionName, | 	} | ||||||
|  |  | ||||||
|  | 	if isRepoAdmin { | ||||||
|  | 		branch.EffectiveBranchProtectionName = bp.BranchName | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if user != nil { | 	if user != nil { | ||||||
| 		branch.UserCanPush = bp.CanUserPush(user.ID) | 		branch.UserCanPush = bp.CanUserPush(user.ID) | ||||||
| 		branch.UserCanMerge = bp.IsUserMergeWhitelisted(user.ID) | 		branch.UserCanMerge = bp.IsUserMergeWhitelisted(user.ID) | ||||||
| 	} | 	} | ||||||
| 	return branch |  | ||||||
|  | 	return branch, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // ToBranchProtection convert a ProtectedBranch to api.BranchProtection | // ToBranchProtection convert a ProtectedBranch to api.BranchProtection | ||||||
|   | |||||||
| @@ -72,7 +72,13 @@ func GetBranch(ctx *context.APIContext) { | |||||||
| 		return | 		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 | // ListBranches list all the branches of a repository | ||||||
| @@ -115,7 +121,11 @@ func ListBranches(ctx *context.APIContext) { | |||||||
| 			ctx.Error(http.StatusInternalServerError, "GetBranchProtection", err) | 			ctx.Error(http.StatusInternalServerError, "GetBranchProtection", err) | ||||||
| 			return | 			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) | 	ctx.JSON(http.StatusOK, &apiBranches) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Lunny Xiao
					Lunny Xiao