summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Svantesson <davidsvantesson@gmail.com>2019-11-16 20:39:18 +0100
committerzeripath <art27@cantab.net>2019-11-16 19:39:18 +0000
commit86cff86b46116353e4d6605ccf5a77a7ac65bc78 (patch)
treec4b0cefc24d333f64682d9b31a91ad42406a6aef
parent3dfe9190b05b68497478324a776c1f80d6f5e56d (diff)
downloadgitea-86cff86b46116353e4d6605ccf5a77a7ac65bc78.tar.gz
gitea-86cff86b46116353e4d6605ccf5a77a7ac65bc78.zip
Update branch API endpoint to show effective branch protection. (#9031)
* Add API endpoint for displaying effective branch protection. * Add status checks.
-rw-r--r--models/branches.go5
-rw-r--r--modules/convert/convert.go24
-rw-r--r--modules/structs/repo_branch.go10
-rw-r--r--routers/api/v1/repo/branch.go17
-rw-r--r--templates/swagger/v1_json.tmpl30
5 files changed, 77 insertions, 9 deletions
diff --git a/models/branches.go b/models/branches.go
index c5f227f1e5..46670b18a0 100644
--- a/models/branches.go
+++ b/models/branches.go
@@ -242,6 +242,11 @@ func (repo *Repository) GetProtectedBranches() ([]*ProtectedBranch, error) {
return protectedBranches, x.Find(&protectedBranches, &ProtectedBranch{RepoID: repo.ID})
}
+// GetBranchProtection get the branch protection of a branch
+func (repo *Repository) GetBranchProtection(branchName string) (*ProtectedBranch, error) {
+ return GetProtectedBranchBy(repo.ID, branchName)
+}
+
// IsProtectedBranch checks if branch is protected
func (repo *Repository) IsProtectedBranch(branchName string, doer *User) (bool, error) {
if doer == nil {
diff --git a/modules/convert/convert.go b/modules/convert/convert.go
index f52ed63476..f65e4b4fe2 100644
--- a/modules/convert/convert.go
+++ b/modules/convert/convert.go
@@ -30,10 +30,28 @@ 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) *api.Branch {
+func ToBranch(repo *models.Repository, b *git.Branch, c *git.Commit, bp *models.ProtectedBranch, user *models.User) *api.Branch {
+ 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,
+ }
+ }
return &api.Branch{
- Name: b.Name,
- Commit: ToCommit(repo, c),
+ 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),
}
}
diff --git a/modules/structs/repo_branch.go b/modules/structs/repo_branch.go
index a6ae6c1663..42bb763893 100644
--- a/modules/structs/repo_branch.go
+++ b/modules/structs/repo_branch.go
@@ -6,6 +6,12 @@ package structs
// Branch represents a repository branch
type Branch struct {
- Name string `json:"name"`
- Commit *PayloadCommit `json:"commit"`
+ Name string `json:"name"`
+ Commit *PayloadCommit `json:"commit"`
+ Protected bool `json:"protected"`
+ RequiredApprovals int64 `json:"required_approvals"`
+ EnableStatusCheck bool `json:"enable_status_check"`
+ StatusCheckContexts []string `json:"status_check_contexts"`
+ UserCanPush bool `json:"user_can_push"`
+ UserCanMerge bool `json:"user_can_merge"`
}
diff --git a/routers/api/v1/repo/branch.go b/routers/api/v1/repo/branch.go
index 9f6a2e6294..9745903a95 100644
--- a/routers/api/v1/repo/branch.go
+++ b/routers/api/v1/repo/branch.go
@@ -16,7 +16,7 @@ import (
func GetBranch(ctx *context.APIContext) {
// swagger:operation GET /repos/{owner}/{repo}/branches/{branch} repository repoGetBranch
// ---
- // summary: Retrieve a specific branch from a repository
+ // summary: Retrieve a specific branch from a repository, including its effective branch protection
// produces:
// - application/json
// parameters:
@@ -61,7 +61,13 @@ func GetBranch(ctx *context.APIContext) {
return
}
- ctx.JSON(200, convert.ToBranch(ctx.Repo.Repository, branch, c))
+ branchProtection, err := ctx.Repo.Repository.GetBranchProtection(ctx.Repo.BranchName)
+ if err != nil {
+ ctx.Error(500, "GetBranchProtection", err)
+ return
+ }
+
+ ctx.JSON(200, convert.ToBranch(ctx.Repo.Repository, branch, c, branchProtection, ctx.User))
}
// ListBranches list all the branches of a repository
@@ -98,7 +104,12 @@ func ListBranches(ctx *context.APIContext) {
ctx.Error(500, "GetCommit", err)
return
}
- apiBranches[i] = convert.ToBranch(ctx.Repo.Repository, branches[i], c)
+ branchProtection, err := ctx.Repo.Repository.GetBranchProtection(branches[i].Name)
+ if err != nil {
+ ctx.Error(500, "GetBranchProtection", err)
+ return
+ }
+ apiBranches[i] = convert.ToBranch(ctx.Repo.Repository, branches[i], c, branchProtection, ctx.User)
}
ctx.JSON(200, &apiBranches)
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index bebe85246c..6b424131c5 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -1492,7 +1492,7 @@
"tags": [
"repository"
],
- "summary": "Retrieve a specific branch from a repository",
+ "summary": "Retrieve a specific branch from a repository, including its effective branch protection",
"operationId": "repoGetBranch",
"parameters": [
{
@@ -7583,9 +7583,37 @@
"commit": {
"$ref": "#/definitions/PayloadCommit"
},
+ "enable_status_check": {
+ "type": "boolean",
+ "x-go-name": "EnableStatusCheck"
+ },
"name": {
"type": "string",
"x-go-name": "Name"
+ },
+ "protected": {
+ "type": "boolean",
+ "x-go-name": "Protected"
+ },
+ "required_approvals": {
+ "type": "integer",
+ "format": "int64",
+ "x-go-name": "RequiredApprovals"
+ },
+ "status_check_contexts": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "x-go-name": "StatusCheckContexts"
+ },
+ "user_can_merge": {
+ "type": "boolean",
+ "x-go-name": "UserCanMerge"
+ },
+ "user_can_push": {
+ "type": "boolean",
+ "x-go-name": "UserCanPush"
}
},
"x-go-package": "code.gitea.io/gitea/modules/structs"