mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 12:26:05 +01: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,40 +30,48 @@ 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 {
 | 
				
			||||||
		return &api.Branch{
 | 
							var hasPerm bool
 | 
				
			||||||
			Name:                          b.Name,
 | 
							var err error
 | 
				
			||||||
			Commit:                        ToCommit(repo, c),
 | 
							if user != nil {
 | 
				
			||||||
			Protected:                     false,
 | 
								hasPerm, err = models.HasAccessUnit(user, repo, models.UnitTypeCode, models.AccessModeWrite)
 | 
				
			||||||
			RequiredApprovals:             0,
 | 
								if err != nil {
 | 
				
			||||||
			EnableStatusCheck:             false,
 | 
									return nil, err
 | 
				
			||||||
			StatusCheckContexts:           []string{},
 | 
								}
 | 
				
			||||||
			UserCanPush:                   true,
 | 
					 | 
				
			||||||
			UserCanMerge:                  true,
 | 
					 | 
				
			||||||
			EffectiveBranchProtectionName: "",
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
					
 | 
				
			||||||
	branchProtectionName := ""
 | 
							return &api.Branch{
 | 
				
			||||||
	if isRepoAdmin {
 | 
								Name:                b.Name,
 | 
				
			||||||
		branchProtectionName = bp.BranchName
 | 
								Commit:              ToCommit(repo, c),
 | 
				
			||||||
 | 
								Protected:           false,
 | 
				
			||||||
 | 
								RequiredApprovals:   0,
 | 
				
			||||||
 | 
								EnableStatusCheck:   false,
 | 
				
			||||||
 | 
								StatusCheckContexts: []string{},
 | 
				
			||||||
 | 
								UserCanPush:         hasPerm,
 | 
				
			||||||
 | 
								UserCanMerge:        hasPerm,
 | 
				
			||||||
 | 
							}, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	branch := &api.Branch{
 | 
						branch := &api.Branch{
 | 
				
			||||||
		Name:                          b.Name,
 | 
							Name:                b.Name,
 | 
				
			||||||
		Commit:                        ToCommit(repo, c),
 | 
							Commit:              ToCommit(repo, c),
 | 
				
			||||||
		Protected:                     true,
 | 
							Protected:           true,
 | 
				
			||||||
		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