2023-01-16 11:00:22 +03:00
// Copyright 2022 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package git
import (
"context"
"sort"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/git"
"github.com/gobwas/glob"
)
type ProtectedBranchRules [ ] * ProtectedBranch
func ( rules ProtectedBranchRules ) GetFirstMatched ( branchName string ) * ProtectedBranch {
for _ , rule := range rules {
if rule . Match ( branchName ) {
return rule
}
}
return nil
}
func ( rules ProtectedBranchRules ) sort ( ) {
sort . Slice ( rules , func ( i , j int ) bool {
rules [ i ] . loadGlob ( )
rules [ j ] . loadGlob ( )
2023-04-11 20:22:49 +03:00
if rules [ i ] . isPlainName != rules [ j ] . isPlainName {
return rules [ i ] . isPlainName // plain name comes first, so plain name means "less"
2023-01-16 11:00:22 +03:00
}
return rules [ i ] . CreatedUnix < rules [ j ] . CreatedUnix
} )
}
// FindRepoProtectedBranchRules load all repository's protected rules
func FindRepoProtectedBranchRules ( ctx context . Context , repoID int64 ) ( ProtectedBranchRules , error ) {
var rules ProtectedBranchRules
err := db . GetEngine ( ctx ) . Where ( "repo_id = ?" , repoID ) . Asc ( "created_unix" ) . Find ( & rules )
if err != nil {
return nil , err
}
2023-04-11 20:22:49 +03:00
rules . sort ( ) // to make non-glob rules have higher priority, and for same glob/non-glob rules, first created rules have higher priority
2023-01-16 11:00:22 +03:00
return rules , nil
}
// FindAllMatchedBranches find all matched branches
func FindAllMatchedBranches ( ctx context . Context , gitRepo * git . Repository , ruleName string ) ( [ ] string , error ) {
// FIXME: how many should we get?
branches , _ , err := gitRepo . GetBranchNames ( 0 , 9999999 )
if err != nil {
return nil , err
}
rule := glob . MustCompile ( ruleName )
results := make ( [ ] string , 0 , len ( branches ) )
for _ , branch := range branches {
if rule . Match ( branch ) {
results = append ( results , branch )
}
}
return results , nil
}
// GetFirstMatchProtectedBranchRule returns the first matched rules
func GetFirstMatchProtectedBranchRule ( ctx context . Context , repoID int64 , branchName string ) ( * ProtectedBranch , error ) {
rules , err := FindRepoProtectedBranchRules ( ctx , repoID )
if err != nil {
return nil , err
}
return rules . GetFirstMatched ( branchName ) , nil
}
// IsBranchProtected checks if branch is protected
func IsBranchProtected ( ctx context . Context , repoID int64 , branchName string ) ( bool , error ) {
rule , err := GetFirstMatchProtectedBranchRule ( ctx , repoID , branchName )
if err != nil {
return false , err
}
return rule != nil , nil
}