2021-11-17 18:17:31 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repository
import (
"context"
"fmt"
"code.gitea.io/gitea/models/db"
2021-12-10 04:27:50 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-12-12 18:48:20 +03:00
"code.gitea.io/gitea/modules/git"
2021-11-17 18:17:31 +03:00
"code.gitea.io/gitea/modules/log"
repo_module "code.gitea.io/gitea/modules/repository"
"xorm.io/builder"
)
// SyncRepositoryHooks rewrites all repositories' pre-receive, update and post-receive hooks
// to make sure the binary and custom conf path are up-to-date.
func SyncRepositoryHooks ( ctx context . Context ) error {
log . Trace ( "Doing: SyncRepositoryHooks" )
if err := db . Iterate (
2022-03-22 18:22:54 +03:00
ctx ,
2021-12-10 04:27:50 +03:00
new ( repo_model . Repository ) ,
2021-11-17 18:17:31 +03:00
builder . Gt { "id" : 0 } ,
func ( idx int , bean interface { } ) error {
2021-12-10 04:27:50 +03:00
repo := bean . ( * repo_model . Repository )
2021-11-17 18:17:31 +03:00
select {
case <- ctx . Done ( ) :
return db . ErrCancelledf ( "before sync repository hooks for %s" , repo . FullName ( ) )
default :
}
if err := repo_module . CreateDelegateHooks ( repo . RepoPath ( ) ) ; err != nil {
return fmt . Errorf ( "SyncRepositoryHook: %v" , err )
}
if repo . HasWiki ( ) {
if err := repo_module . CreateDelegateHooks ( repo . WikiPath ( ) ) ; err != nil {
return fmt . Errorf ( "SyncRepositoryHook: %v" , err )
}
}
return nil
} ,
) ; err != nil {
return err
}
log . Trace ( "Finished: SyncRepositoryHooks" )
return nil
}
2021-12-12 18:48:20 +03:00
// GenerateGitHooks generates git hooks from a template repository
func GenerateGitHooks ( ctx context . Context , templateRepo , generateRepo * repo_model . Repository ) error {
2022-01-20 02:26:57 +03:00
generateGitRepo , err := git . OpenRepositoryCtx ( ctx , generateRepo . RepoPath ( ) )
2021-12-12 18:48:20 +03:00
if err != nil {
return err
}
defer generateGitRepo . Close ( )
2022-01-20 02:26:57 +03:00
templateGitRepo , err := git . OpenRepositoryCtx ( ctx , templateRepo . RepoPath ( ) )
2021-12-12 18:48:20 +03:00
if err != nil {
return err
}
defer templateGitRepo . Close ( )
templateHooks , err := templateGitRepo . Hooks ( )
if err != nil {
return err
}
for _ , templateHook := range templateHooks {
generateHook , err := generateGitRepo . GetHook ( templateHook . Name ( ) )
if err != nil {
return err
}
generateHook . Content = templateHook . Content
if err := generateHook . Update ( ) ; err != nil {
return err
}
}
return nil
}