]> source.dussan.org Git - gitea.git/commitdiff
Update branch API endpoint to show effective branch protection. (#9031)
authorDavid Svantesson <davidsvantesson@gmail.com>
Sat, 16 Nov 2019 19:39:18 +0000 (20:39 +0100)
committerzeripath <art27@cantab.net>
Sat, 16 Nov 2019 19:39:18 +0000 (19:39 +0000)
* Add API endpoint for displaying effective branch protection.

* Add status checks.

models/branches.go
modules/convert/convert.go
modules/structs/repo_branch.go
routers/api/v1/repo/branch.go
templates/swagger/v1_json.tmpl

index c5f227f1e5a1ef8460de69403a8489e289e1043b..46670b18a0a1b8635b375a9f12b7a13c7c697ddb 100644 (file)
@@ -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 {
index f52ed63476dcb753e7858c55760ef0d61e08230a..f65e4b4fe24099f033b1ba058b3ca0f2c7703677 100644 (file)
@@ -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),
        }
 }
 
index a6ae6c16633d5388bb59c590fcaffa9b606321a5..42bb7638938b25854274a7f8f99f423bd9839ba8 100644 (file)
@@ -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"`
 }
index 9f6a2e6294f392a1794580eff1a689585e498054..9745903a95986d8cb076bdff133451922bbae19b 100644 (file)
@@ -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)
index bebe85246c43476711f72dca9e986c161b839b42..6b424131c5d48fa4991dc0603fa160d4c5a4d2b1 100644 (file)
         "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": [
           {
         "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"