@ -12,6 +12,7 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/perm"
"code.gitea.io/gitea/models/perm"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/models/unit"
user_model "code.gitea.io/gitea/models/user"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/base"
@ -74,8 +75,8 @@ func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool {
if user , err := user_model . GetUserByID ( userID ) ; err != nil {
if user , err := user_model . GetUserByID ( userID ) ; err != nil {
log . Error ( "GetUserByID: %v" , err )
log . Error ( "GetUserByID: %v" , err )
return false
return false
} else if repo , err := GetRepositoryByID ( protectBranch . RepoID ) ; err != nil {
} else if repo , err := repo_model . GetRepositoryByID ( protectBranch . RepoID ) ; err != nil {
log . Error ( "GetRepositoryByID: %v" , err )
log . Error ( "repo_model. GetRepositoryByID: %v" , err )
return false
return false
} else if writeAccess , err := HasAccessUnit ( user , repo , unit . TypeCode , perm . AccessModeWrite ) ; err != nil {
} else if writeAccess , err := HasAccessUnit ( user , repo , unit . TypeCode , perm . AccessModeWrite ) ; err != nil {
log . Error ( "HasAccessUnit: %v" , err )
log . Error ( "HasAccessUnit: %v" , err )
@ -102,7 +103,7 @@ func (protectBranch *ProtectedBranch) CanUserPush(userID int64) bool {
}
}
// IsUserMergeWhitelisted checks if some user is whitelisted to merge to this branch
// IsUserMergeWhitelisted checks if some user is whitelisted to merge to this branch
func ( protectBranch * ProtectedBranch ) IsUserMergeWhitelisted ( userID int64 , permissionInRepo Permission ) bool {
func IsUserMergeWhitelisted ( protectBranch * ProtectedBranch , userID int64 , permissionInRepo Permission ) bool {
if ! protectBranch . EnableMergeWhitelist {
if ! protectBranch . EnableMergeWhitelist {
// Then we need to fall back on whether the user has write permission
// Then we need to fall back on whether the user has write permission
return permissionInRepo . CanWrite ( unit . TypeCode )
return permissionInRepo . CanWrite ( unit . TypeCode )
@ -125,19 +126,19 @@ func (protectBranch *ProtectedBranch) IsUserMergeWhitelisted(userID int64, permi
}
}
// IsUserOfficialReviewer check if user is official reviewer for the branch (counts towards required approvals)
// IsUserOfficialReviewer check if user is official reviewer for the branch (counts towards required approvals)
func ( protectBranch * ProtectedBranch ) IsUserOfficialReviewer ( user * user_model . User ) ( bool , error ) {
func IsUserOfficialReviewer ( protectBranch * ProtectedBranch , user * user_model . User ) ( bool , error ) {
return protectBranch . isUserOfficialReviewer ( db . GetEngine ( db . DefaultContext ) , user )
return isUserOfficialReviewer ( db . DefaultContext , protectBranch , user )
}
}
func ( protectBranch * ProtectedBranch ) isUserOfficialReviewer ( e db . Engine , user * user_model . User ) ( bool , error ) {
func isUserOfficialReviewer ( ctx context . Context , protectBranch * ProtectedBranch , user * user_model . User ) ( bool , error ) {
repo , err := getRepositoryByID ( e , protectBranch . RepoID )
repo , err := repo_model . GetRepositoryByIDCtx ( ctx , protectBranch . RepoID )
if err != nil {
if err != nil {
return false , err
return false , err
}
}
if ! protectBranch . EnableApprovalsWhitelist {
if ! protectBranch . EnableApprovalsWhitelist {
// Anyone with write access is considered official reviewer
// Anyone with write access is considered official reviewer
writeAccess , err := hasAccessUnit ( e , user , repo , unit . TypeCode , perm . AccessModeWrite )
writeAccess , err := hasAccessUnit ( ctx , user , repo , unit . TypeCode , perm . AccessModeWrite )
if err != nil {
if err != nil {
return false , err
return false , err
}
}
@ -148,7 +149,7 @@ func (protectBranch *ProtectedBranch) isUserOfficialReviewer(e db.Engine, user *
return true , nil
return true , nil
}
}
inTeam , err := isUserInTeams ( e , user . ID , protectBranch . ApprovalsWhitelistTeamIDs )
inTeam , err := isUserInTeams ( db . G etEngine ( ctx ) , user . ID , protectBranch . ApprovalsWhitelistTeamIDs )
if err != nil {
if err != nil {
return false , err
return false , err
}
}
@ -335,8 +336,8 @@ type WhitelistOptions struct {
// If ID is 0, it creates a new record. Otherwise, updates existing record.
// If ID is 0, it creates a new record. Otherwise, updates existing record.
// This function also performs check if whitelist user and team's IDs have been changed
// This function also performs check if whitelist user and team's IDs have been changed
// to avoid unnecessary whitelist delete and regenerate.
// to avoid unnecessary whitelist delete and regenerate.
func UpdateProtectBranch ( repo * Repository , protectBranch * ProtectedBranch , opts WhitelistOptions ) ( err error ) {
func UpdateProtectBranch ( repo * repo_model . Repository , protectBranch * ProtectedBranch , opts WhitelistOptions ) ( err error ) {
if err = repo . GetOwner ( ) ; err != nil {
if err = repo . GetOwner ( db . DefaultContext ) ; err != nil {
return fmt . Errorf ( "GetOwner: %v" , err )
return fmt . Errorf ( "GetOwner: %v" , err )
}
}
@ -393,20 +394,15 @@ func UpdateProtectBranch(repo *Repository, protectBranch *ProtectedBranch, opts
}
}
// GetProtectedBranches get all protected branches
// GetProtectedBranches get all protected branches
func ( repo * Repository ) GetProtectedBranches ( ) ( [ ] * ProtectedBranch , error ) {
func GetProtectedBranches ( repoID int64 ) ( [ ] * ProtectedBranch , error ) {
protectedBranches := make ( [ ] * ProtectedBranch , 0 )
protectedBranches := make ( [ ] * ProtectedBranch , 0 )
return protectedBranches , db . GetEngine ( db . DefaultContext ) . Find ( & protectedBranches , & ProtectedBranch { RepoID : repo . ID } )
return protectedBranches , db . GetEngine ( db . DefaultContext ) . Find ( & protectedBranches , & ProtectedBranch { RepoID : repoID } )
}
// 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
// IsProtectedBranch checks if branch is protected
func ( repo * Repository ) IsProtectedBranch ( branchName string ) ( bool , error ) {
func IsProtectedBranch ( repoID int64 , branchName string ) ( bool , error ) {
protectedBranch := & ProtectedBranch {
protectedBranch := & ProtectedBranch {
RepoID : repo . ID ,
RepoID : repoID ,
BranchName : branchName ,
BranchName : branchName ,
}
}
@ -419,7 +415,7 @@ func (repo *Repository) IsProtectedBranch(branchName string) (bool, error) {
// updateApprovalWhitelist checks whether the user whitelist changed and returns a whitelist with
// updateApprovalWhitelist checks whether the user whitelist changed and returns a whitelist with
// the users from newWhitelist which have explicit read or write access to the repo.
// the users from newWhitelist which have explicit read or write access to the repo.
func updateApprovalWhitelist ( repo * Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
func updateApprovalWhitelist ( repo * repo_model . Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
hasUsersChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
hasUsersChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
if ! hasUsersChanged {
if ! hasUsersChanged {
return currentWhitelist , nil
return currentWhitelist , nil
@ -427,7 +423,7 @@ func updateApprovalWhitelist(repo *Repository, currentWhitelist, newWhitelist []
whitelist = make ( [ ] int64 , 0 , len ( newWhitelist ) )
whitelist = make ( [ ] int64 , 0 , len ( newWhitelist ) )
for _ , userID := range newWhitelist {
for _ , userID := range newWhitelist {
if reader , err := repo . IsReader ( userID ) ; err != nil {
if reader , err := IsRepoReader ( repo , userID ) ; err != nil {
return nil , err
return nil , err
} else if ! reader {
} else if ! reader {
continue
continue
@ -440,7 +436,7 @@ func updateApprovalWhitelist(repo *Repository, currentWhitelist, newWhitelist []
// updateUserWhitelist checks whether the user whitelist changed and returns a whitelist with
// updateUserWhitelist checks whether the user whitelist changed and returns a whitelist with
// the users from newWhitelist which have write access to the repo.
// the users from newWhitelist which have write access to the repo.
func updateUserWhitelist ( repo * Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
func updateUserWhitelist ( repo * repo_model . Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
hasUsersChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
hasUsersChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
if ! hasUsersChanged {
if ! hasUsersChanged {
return currentWhitelist , nil
return currentWhitelist , nil
@ -469,7 +465,7 @@ func updateUserWhitelist(repo *Repository, currentWhitelist, newWhitelist []int6
// updateTeamWhitelist checks whether the team whitelist changed and returns a whitelist with
// updateTeamWhitelist checks whether the team whitelist changed and returns a whitelist with
// the teams from newWhitelist which have write access to the repo.
// the teams from newWhitelist which have write access to the repo.
func updateTeamWhitelist ( repo * Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
func updateTeamWhitelist ( repo * repo_model . Repository , currentWhitelist , newWhitelist [ ] int64 ) ( whitelist [ ] int64 , err error ) {
hasTeamsChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
hasTeamsChanged := ! util . IsSliceInt64Eq ( currentWhitelist , newWhitelist )
if ! hasTeamsChanged {
if ! hasTeamsChanged {
return currentWhitelist , nil
return currentWhitelist , nil
@ -491,9 +487,9 @@ func updateTeamWhitelist(repo *Repository, currentWhitelist, newWhitelist []int6
}
}
// DeleteProtectedBranch removes ProtectedBranch relation between the user and repository.
// DeleteProtectedBranch removes ProtectedBranch relation between the user and repository.
func ( repo * Repository ) DeleteProtectedBranch ( id int64 ) ( err error ) {
func DeleteProtectedBranch ( repoID , id int64 ) ( err error ) {
protectedBranch := & ProtectedBranch {
protectedBranch := & ProtectedBranch {
RepoID : repo . ID ,
RepoID : repoID ,
ID : id ,
ID : id ,
}
}
@ -518,28 +514,28 @@ type DeletedBranch struct {
}
}
// AddDeletedBranch adds a deleted branch to the database
// AddDeletedBranch adds a deleted branch to the database
func ( repo * Repository ) AddDeletedBranch ( branchName , commit string , deletedByID int64 ) error {
func AddDeletedBranch ( repoID int64 , branchName , commit string , deletedByID int64 ) error {
deletedBranch := & DeletedBranch {
deletedBranch := & DeletedBranch {
RepoID : repo . ID ,
RepoID : repoID ,
Name : branchName ,
Name : branchName ,
Commit : commit ,
Commit : commit ,
DeletedByID : deletedByID ,
DeletedByID : deletedByID ,
}
}
_ , err := db . GetEngine ( db . DefaultContext ) . InsertOne ( deletedBranch )
_ , err := db . GetEngine ( db . DefaultContext ) . Insert ( deletedBranch )
return err
return err
}
}
// GetDeletedBranches returns all the deleted branches
// GetDeletedBranches returns all the deleted branches
func ( repo * Repository ) GetDeletedBranches ( ) ( [ ] * DeletedBranch , error ) {
func GetDeletedBranches ( repoID int64 ) ( [ ] * DeletedBranch , error ) {
deletedBranches := make ( [ ] * DeletedBranch , 0 )
deletedBranches := make ( [ ] * DeletedBranch , 0 )
return deletedBranches , db . GetEngine ( db . DefaultContext ) . Where ( "repo_id = ?" , repo . ID ) . Desc ( "deleted_unix" ) . Find ( & deletedBranches )
return deletedBranches , db . GetEngine ( db . DefaultContext ) . Where ( "repo_id = ?" , repoID ) . Desc ( "deleted_unix" ) . Find ( & deletedBranches )
}
}
// GetDeletedBranchByID get a deleted branch by its ID
// GetDeletedBranchByID get a deleted branch by its ID
func ( repo * Repository ) GetDeletedBranchByID ( id int64 ) ( * DeletedBranch , error ) {
func GetDeletedBranchByID ( repoID , id int64 ) ( * DeletedBranch , error ) {
deletedBranch := & DeletedBranch { }
deletedBranch := & DeletedBranch { }
has , err := db . GetEngine ( db . DefaultContext ) . Where ( "repo_id = ?" , repo . ID ) . And ( "id = ?" , id ) . Get ( deletedBranch )
has , err := db . GetEngine ( db . DefaultContext ) . Where ( "repo_id = ?" , repoID ) . And ( "id = ?" , id ) . Get ( deletedBranch )
if err != nil {
if err != nil {
return nil , err
return nil , err
}
}
@ -549,10 +545,10 @@ func (repo *Repository) GetDeletedBranchByID(id int64) (*DeletedBranch, error) {
return deletedBranch , nil
return deletedBranch , nil
}
}
// RemoveDeletedBranch removes a deleted branch from the database
// RemoveDeletedBranchByID removes a deleted branch from the database
func ( repo * Repository ) RemoveDeletedBranch ( id int64 ) ( err error ) {
func RemoveDeletedBranchByID ( repoID , id int64 ) ( err error ) {
deletedBranch := & DeletedBranch {
deletedBranch := & DeletedBranch {
RepoID : repo . ID ,
RepoID : repoID ,
ID : id ,
ID : id ,
}
}
@ -575,8 +571,8 @@ func (deletedBranch *DeletedBranch) LoadUser() {
deletedBranch . DeletedBy = user
deletedBranch . DeletedBy = user
}
}
// RemoveDeletedBranch removes all deleted branches
// RemoveDeletedBranchByName removes all deleted branches
func RemoveDeletedBranch ( repoID int64 , branch string ) error {
func RemoveDeletedBranchByName ( repoID int64 , branch string ) error {
_ , err := db . GetEngine ( db . DefaultContext ) . Where ( "repo_id=? AND name=?" , repoID , branch ) . Delete ( new ( DeletedBranch ) )
_ , err := db . GetEngine ( db . DefaultContext ) . Where ( "repo_id=? AND name=?" , repoID , branch ) . Delete ( new ( DeletedBranch ) )
return err
return err
}
}
@ -615,7 +611,7 @@ func FindRenamedBranch(repoID int64, from string) (branch *RenamedBranch, exist
}
}
// RenameBranch rename a branch
// RenameBranch rename a branch
func ( repo * Repository ) RenameBranch ( from , to string , gitAction func ( isDefault bool ) error ) ( err error ) {
func RenameBranch ( repo * repo_model . Repository , from , to string , gitAction func ( isDefault bool ) error ) ( err error ) {
ctx , committer , err := db . TxContext ( )
ctx , committer , err := db . TxContext ( )
if err != nil {
if err != nil {
return err
return err