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 TestAPIGetBranch(t *testing.T) {
return in
}
+// IsUserMergeWhitelisted checks if some user is whitelisted to merge to this branch
+func (protectBranch *ProtectedBranch) IsUserMergeWhitelisted(userID int64) bool {
+ if !protectBranch.EnableMergeWhitelist {
+ return true
+ }
+
+ if base.Int64sContains(protectBranch.MergeWhitelistUserIDs, userID) {
+ return true
+ }
+
+ if len(protectBranch.MergeWhitelistTeamIDs) == 0 {
+ return false
+ }
+
+ in, err := IsUserInTeams(userID, protectBranch.MergeWhitelistTeamIDs)
+ if err != nil {
+ log.Error("IsUserInTeams: %v", err)
+ return false
+ }
+ return in
+}
+
// IsUserOfficialReviewer check if user is official reviewer for the branch (counts towards required approvals)
func (protectBranch *ProtectedBranch) IsUserOfficialReviewer(user *User) (bool, error) {
return protectBranch.isUserOfficialReviewer(x, user)
}
// 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) *api.Branch {
+func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.ProtectedBranch, user *models.User) (*api.Branch, error) {
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{
Name: b.Name,
Commit: ToCommit(repo, c),
RequiredApprovals: 0,
EnableStatusCheck: false,
StatusCheckContexts: []string{},
- UserCanPush: true,
- UserCanMerge: true,
- }
+ UserCanPush: hasPerm,
+ UserCanMerge: hasPerm,
+ }, nil
}
- return &api.Branch{
+
+ branch := &api.Branch{
Name: b.Name,
Commit: ToCommit(repo, c),
Protected: true,
RequiredApprovals: bp.RequiredApprovals,
EnableStatusCheck: bp.EnableStatusCheck,
StatusCheckContexts: bp.StatusCheckContexts,
- UserCanPush: bp.CanUserPush(user.ID),
- UserCanMerge: bp.CanUserMerge(user.ID),
}
+
+ if user != nil {
+ branch.UserCanPush = bp.CanUserPush(user.ID)
+ branch.UserCanMerge = bp.IsUserMergeWhitelisted(user.ID)
+ }
+ return branch, nil
}
// ToTag convert a git.Tag to an api.Tag
return
}
- ctx.JSON(http.StatusOK, convert.ToBranch(ctx.Repo.Repository, branch, c, branchProtection, ctx.User))
+ br, err := convert.ToBranch(ctx.Repo.Repository, branch, c, branchProtection, ctx.User)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "convert.ToBranch", err)
+ return
+ }
+
+ ctx.JSON(http.StatusOK, br)
}
// ListBranches list all the branches of a repository
ctx.Error(http.StatusInternalServerError, "GetBranchProtection", err)
return
}
- apiBranches[i] = convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User)
+
+ br, err := convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User)
+ if err != nil {
+ ctx.Error(http.StatusInternalServerError, "convert.ToBranch", err)
+ return
+ }
+
+ apiBranches[i] = br
}
ctx.JSON(http.StatusOK, &apiBranches)