mirror of
https://github.com/hanzoai/forge.git
synced 2026-10-30 15:00:39 +00:00
Source files keep their SPDX-License-Identifier and Hanzo copyright line; the Gitea, Gogs and LFS Test Server copyrights they used to repeat now live once in NOTICE, alongside LICENSE. The header lint accepts any copyright line above the SPDX line, so it no longer demands an upstream one. Co-authored-by: Hanzo Dev <[email protected]>
190 lines
5.5 KiB
Go
190 lines
5.5 KiB
Go
// Copyright 2026 Hanzo AI, Inc. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package cron
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/hanzoai/git/models"
|
|
git_model "github.com/hanzoai/git/models/git"
|
|
user_model "github.com/hanzoai/git/models/user"
|
|
"github.com/hanzoai/git/models/webhook"
|
|
"github.com/hanzoai/git/modules/git/gitcmd"
|
|
"github.com/hanzoai/git/modules/setting"
|
|
"github.com/hanzoai/git/services/auth"
|
|
"github.com/hanzoai/git/services/migrations"
|
|
mirror_service "github.com/hanzoai/git/services/mirror"
|
|
packages_cleanup_service "github.com/hanzoai/git/services/packages/cleanup"
|
|
repo_service "github.com/hanzoai/git/services/repository"
|
|
archiver_service "github.com/hanzoai/git/services/repository/archiver"
|
|
)
|
|
|
|
func registerUpdateMirrorTask() {
|
|
type UpdateMirrorTaskConfig struct {
|
|
BaseConfig
|
|
PullLimit int
|
|
PushLimit int
|
|
}
|
|
|
|
// PullLimit 0 skips pull mirrors: they refresh on read (GetInfoRefs) and on a
|
|
// push event, never on a timer. PushLimit stays — a push mirror's cron pass
|
|
// retries a delivery that already had its trigger.
|
|
RegisterTaskFatal("update_mirrors", &UpdateMirrorTaskConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: false,
|
|
Schedule: "@every 10m",
|
|
},
|
|
PullLimit: 0,
|
|
PushLimit: 50,
|
|
}, func(ctx context.Context, _ *user_model.User, cfg Config) error {
|
|
umtc := cfg.(*UpdateMirrorTaskConfig)
|
|
return mirror_service.Update(ctx, umtc.PullLimit, umtc.PushLimit)
|
|
})
|
|
}
|
|
|
|
func registerRepoHealthCheck() {
|
|
type RepoHealthCheckConfig struct {
|
|
BaseConfig
|
|
Timeout time.Duration
|
|
Args []string `delim:" "`
|
|
}
|
|
RegisterTaskFatal("repo_health_check", &RepoHealthCheckConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: false,
|
|
Schedule: "@midnight",
|
|
},
|
|
Timeout: time.Duration(setting.Git.Timeout.GC) * time.Second,
|
|
Args: []string{},
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
rhcConfig := config.(*RepoHealthCheckConfig)
|
|
// the git args are set by config, they can be safe to be trusted
|
|
return repo_service.GitFsckRepos(ctx, rhcConfig.Timeout, gitcmd.ToTrustedCmdArgs(rhcConfig.Args))
|
|
})
|
|
}
|
|
|
|
func registerCheckRepoStats() {
|
|
RegisterTaskFatal("check_repo_stats", &BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: true,
|
|
Schedule: "@midnight",
|
|
}, func(ctx context.Context, _ *user_model.User, _ Config) error {
|
|
return models.CheckRepoStats(ctx)
|
|
})
|
|
}
|
|
|
|
func registerArchiveCleanup() {
|
|
RegisterTaskFatal("archive_cleanup", &OlderThanConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: true,
|
|
Schedule: "@midnight",
|
|
},
|
|
OlderThan: 24 * time.Hour,
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
acConfig := config.(*OlderThanConfig)
|
|
return archiver_service.DeleteOldRepositoryArchives(ctx, acConfig.OlderThan)
|
|
})
|
|
}
|
|
|
|
func registerSyncExternalUsers() {
|
|
RegisterTaskFatal("sync_external_users", &UpdateExistingConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: false,
|
|
Schedule: "@midnight",
|
|
},
|
|
UpdateExisting: true,
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
realConfig := config.(*UpdateExistingConfig)
|
|
return auth.SyncExternalUsers(ctx, realConfig.UpdateExisting)
|
|
})
|
|
}
|
|
|
|
func registerDeletedBranchesCleanup() {
|
|
RegisterTaskFatal("deleted_branches_cleanup", &OlderThanConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: true,
|
|
Schedule: "@midnight",
|
|
},
|
|
OlderThan: 24 * time.Hour,
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
realConfig := config.(*OlderThanConfig)
|
|
git_model.RemoveOldDeletedBranches(ctx, realConfig.OlderThan)
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func registerUpdateMigrationPosterID() {
|
|
RegisterTaskFatal("update_migration_poster_id", &BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: true,
|
|
Schedule: "@midnight",
|
|
}, func(ctx context.Context, _ *user_model.User, _ Config) error {
|
|
return migrations.UpdateMigrationPosterID(ctx)
|
|
})
|
|
}
|
|
|
|
func registerCleanupHookTaskTable() {
|
|
RegisterTaskFatal("cleanup_hook_task_table", &CleanupHookTaskConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: false,
|
|
Schedule: "@midnight",
|
|
},
|
|
CleanupType: "OlderThan",
|
|
OlderThan: 168 * time.Hour,
|
|
NumberToKeep: 10,
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
realConfig := config.(*CleanupHookTaskConfig)
|
|
return webhook.CleanupHookTaskTable(ctx, webhook.ToHookTaskCleanupType(realConfig.CleanupType), realConfig.OlderThan, realConfig.NumberToKeep)
|
|
})
|
|
}
|
|
|
|
func registerCleanupPackages() {
|
|
RegisterTaskFatal("cleanup_packages", &OlderThanConfig{
|
|
BaseConfig: BaseConfig{
|
|
Enabled: true,
|
|
RunAtStart: true,
|
|
Schedule: "@midnight",
|
|
},
|
|
OlderThan: 24 * time.Hour,
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
realConfig := config.(*OlderThanConfig)
|
|
return packages_cleanup_service.CleanupTask(ctx, realConfig.OlderThan)
|
|
})
|
|
}
|
|
|
|
func registerSyncRepoLicenses() {
|
|
RegisterTaskFatal("sync_repo_licenses", &BaseConfig{
|
|
Enabled: false,
|
|
RunAtStart: false,
|
|
Schedule: "@annually",
|
|
}, func(ctx context.Context, _ *user_model.User, config Config) error {
|
|
return repo_service.SyncRepoLicenses(ctx)
|
|
})
|
|
}
|
|
|
|
func initBasicTasks() {
|
|
if setting.Mirror.Enabled {
|
|
registerUpdateMirrorTask()
|
|
}
|
|
registerRepoHealthCheck()
|
|
registerCheckRepoStats()
|
|
registerArchiveCleanup()
|
|
registerSyncExternalUsers()
|
|
registerDeletedBranchesCleanup()
|
|
if !setting.Repository.DisableMigrations {
|
|
registerUpdateMigrationPosterID()
|
|
}
|
|
registerCleanupHookTaskTable()
|
|
if setting.Packages.Enabled {
|
|
registerCleanupPackages()
|
|
}
|
|
registerSyncRepoLicenses()
|
|
}
|