2024-01-13 00:50:38 +03:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository
import (
"context"
"slices"
actions_model "code.gitea.io/gitea/models/actions"
"code.gitea.io/gitea/models/db"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unit"
"code.gitea.io/gitea/modules/log"
2024-01-31 17:55:12 +03:00
actions_service "code.gitea.io/gitea/services/actions"
2024-01-13 00:50:38 +03:00
)
// UpdateRepositoryUnits updates a repository's units
func UpdateRepositoryUnits ( ctx context . Context , repo * repo_model . Repository , units [ ] repo_model . RepoUnit , deleteUnitTypes [ ] unit . Type ) ( err error ) {
ctx , committer , err := db . TxContext ( ctx )
if err != nil {
return err
}
defer committer . Close ( )
// Delete existing settings of units before adding again
for _ , u := range units {
deleteUnitTypes = append ( deleteUnitTypes , u . Type )
}
if slices . Contains ( deleteUnitTypes , unit . TypeActions ) {
if err := actions_model . CleanRepoScheduleTasks ( ctx , repo ) ; err != nil {
log . Error ( "CleanRepoScheduleTasks: %v" , err )
}
}
2024-01-31 17:55:12 +03:00
for _ , u := range units {
if u . Type == unit . TypeActions {
if err := actions_service . DetectAndHandleSchedules ( ctx , repo ) ; err != nil {
log . Error ( "DetectAndHandleSchedules: %v" , err )
}
break
}
}
2024-01-13 00:50:38 +03:00
if _ , err = db . GetEngine ( ctx ) . Where ( "repo_id = ?" , repo . ID ) . In ( "type" , deleteUnitTypes ) . Delete ( new ( repo_model . RepoUnit ) ) ; err != nil {
return err
}
if len ( units ) > 0 {
if err = db . Insert ( ctx , units ) ; err != nil {
return err
}
}
return committer . Commit ( )
}