From 7e09d210ba421a1baf03ef7ba8770bebe8d28b72 Mon Sep 17 00:00:00 2001 From: Unknwon Date: Fri, 17 Feb 2017 15:10:50 -0500 Subject: Initial version of protected branches (#776) - Able to restrict force push and deletion - Able to restrict direct push --- models/repo_branch.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'models/repo_branch.go') diff --git a/models/repo_branch.go b/models/repo_branch.go index 9cf2e9c4..6fe2222d 100644 --- a/models/repo_branch.go +++ b/models/repo_branch.go @@ -5,6 +5,8 @@ package models import ( + "fmt" + "github.com/gogits/git-module" ) @@ -36,7 +38,7 @@ func GetBranchesByPath(path string) ([]*Branch, error) { func (repo *Repository) GetBranch(br string) (*Branch, error) { if !git.IsBranchExist(repo.RepoPath(), br) { - return nil, &ErrBranchNotExist{br} + return nil, ErrBranchNotExist{br} } return &Branch{ Path: repo.RepoPath(), @@ -55,3 +57,56 @@ func (br *Branch) GetCommit() (*git.Commit, error) { } return gitRepo.GetBranchCommit(br.Name) } + +// ProtectBranch contains options of a protected branch. +type ProtectBranch struct { + ID int64 + RepoID int64 `xorm:"UNIQUE(protect_branch)"` + Name string `xorm:"UNIQUE(protect_branch)"` + Protected bool + RequirePullRequest bool +} + +// GetProtectBranchOfRepoByName returns *ProtectBranch by branch name in given repostiory. +func GetProtectBranchOfRepoByName(repoID int64, name string) (*ProtectBranch, error) { + protectBranch := &ProtectBranch{ + RepoID: repoID, + Name: name, + } + has, err := x.Get(protectBranch) + if err != nil { + return nil, err + } else if !has { + return nil, ErrBranchNotExist{name} + } + return protectBranch, nil +} + +// IsBranchOfRepoRequirePullRequest returns true if branch requires pull request in given repository. +func IsBranchOfRepoRequirePullRequest(repoID int64, name string) bool { + protectBranch, err := GetProtectBranchOfRepoByName(repoID, name) + if err != nil { + return false + } + return protectBranch.Protected && protectBranch.RequirePullRequest +} + +// UpdateProtectBranch saves branch protection options. +// If ID is 0, it creates a new record. Otherwise, updates existing record. +func UpdateProtectBranch(protectBranch *ProtectBranch) (err error) { + if protectBranch.ID == 0 { + if _, err = x.Insert(protectBranch); err != nil { + return fmt.Errorf("Insert: %v", err) + } + return + } + + _, err = x.Id(protectBranch.ID).AllCols().Update(protectBranch) + return err +} + +// GetProtectBranchesByRepoID returns a list of *ProtectBranch in given repostiory. +func GetProtectBranchesByRepoID(repoID int64) ([]*ProtectBranch, error) { + protectBranches := make([]*ProtectBranch, 0, 2) + return protectBranches, x.Where("repo_id = ?", repoID).Asc("name").Find(&protectBranches) +} -- cgit v1.2.3