diff --git a/integrations/api_branch_test.go b/integrations/api_branch_test.go index 3fe7f2322..b6452a6ab 100644 --- a/integrations/api_branch_test.go +++ b/integrations/api_branch_test.go @@ -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) { diff --git a/modules/convert/convert.go b/modules/convert/convert.go index 240db77d2..d75a13053 100644 --- a/modules/convert/convert.go +++ b/modules/convert/convert.go @@ -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 diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go index fccfc2bfe..0d4501cd7 100644 --- a/routers/api/v1/repo/branch.go +++ b/routers/api/v1/repo/branch.go @@ -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)