diff options
author | Unknwon <u@gogs.io> | 2017-02-17 15:10:50 -0500 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-02-17 15:10:50 -0500 |
commit | 7e09d210ba421a1baf03ef7ba8770bebe8d28b72 (patch) | |
tree | 1d209f6175c3e4d7e21c4bda62e65db0ac4608f5 /models/repo_branch.go | |
parent | dab768212af15f4e671e5403ad3def455117f699 (diff) |
Initial version of protected branches (#776)
- Able to restrict force push and deletion
- Able to restrict direct push
Diffstat (limited to 'models/repo_branch.go')
-rw-r--r-- | models/repo_branch.go | 57 |
1 files changed, 56 insertions, 1 deletions
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) +} |