123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // Copyright 2021 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package repository
-
- import (
- "context"
- "fmt"
-
- "code.gitea.io/gitea/models/db"
- repo_model "code.gitea.io/gitea/models/repo"
- "code.gitea.io/gitea/models/webhook"
- "code.gitea.io/gitea/modules/gitrepo"
- "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(
- ctx,
- builder.Gt{"id": 0},
- func(ctx context.Context, repo *repo_model.Repository) error {
- 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: %w", err)
- }
- if repo.HasWiki() {
- if err := repo_module.CreateDelegateHooks(repo.WikiPath()); err != nil {
- return fmt.Errorf("SyncRepositoryHook: %w", err)
- }
- }
- return nil
- },
- ); err != nil {
- return err
- }
-
- log.Trace("Finished: SyncRepositoryHooks")
- return nil
- }
-
- // GenerateGitHooks generates git hooks from a template repository
- func GenerateGitHooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
- generateGitRepo, err := gitrepo.OpenRepository(ctx, generateRepo)
- if err != nil {
- return err
- }
- defer generateGitRepo.Close()
-
- templateGitRepo, err := gitrepo.OpenRepository(ctx, templateRepo)
- 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
- }
-
- // GenerateWebhooks generates webhooks from a template repository
- func GenerateWebhooks(ctx context.Context, templateRepo, generateRepo *repo_model.Repository) error {
- templateWebhooks, err := db.Find[webhook.Webhook](ctx, webhook.ListWebhookOptions{RepoID: templateRepo.ID})
- if err != nil {
- return err
- }
-
- ws := make([]*webhook.Webhook, 0, len(templateWebhooks))
- for _, templateWebhook := range templateWebhooks {
- ws = append(ws, &webhook.Webhook{
- RepoID: generateRepo.ID,
- URL: templateWebhook.URL,
- HTTPMethod: templateWebhook.HTTPMethod,
- ContentType: templateWebhook.ContentType,
- Secret: templateWebhook.Secret,
- HookEvent: templateWebhook.HookEvent,
- IsActive: templateWebhook.IsActive,
- Type: templateWebhook.Type,
- OwnerID: templateWebhook.OwnerID,
- Events: templateWebhook.Events,
- Meta: templateWebhook.Meta,
- })
- }
- return webhook.CreateWebhooks(ctx, ws)
- }
|