mirror of
https://github.com/go-gitea/gitea.git
synced 2026-10-03 17:17:36 +02:00
Merge branch 'origin/main' into session-management
Conflict resolutions: - models/migrations/v1_26/v328.go: kept origin/main's TokenPermissions migration; moved AddUserSessionTable to v1_27/v332.go (1.26.0 closed at migration 330; 1.27 starts at 331). - models/migrations/migrations.go: registered session migration as 332 using v1_27.AddUserSessionTable. - tests/integration/api_admin_test.go: adopted new DecodeJSON return style; cron count is 30 (added cleanup_user_sessions task). Co-Authored-By: Claude (Opus 4.7) <noreply@anthropic.com>
This commit is contained in:
1841 files changed
+83555
-29241
No files matched your search
+19
-8
@@ -10,13 +10,22 @@ import (
|
||||
"time"
|
||||
|
||||
"code.gitea.io/gitea/modules/graceful"
|
||||
"code.gitea.io/gitea/modules/log"
|
||||
"code.gitea.io/gitea/modules/process"
|
||||
"code.gitea.io/gitea/modules/translation"
|
||||
|
||||
"github.com/go-co-op/gocron"
|
||||
"github.com/go-co-op/gocron/v2"
|
||||
)
|
||||
|
||||
var scheduler = gocron.NewScheduler(time.Local)
|
||||
var scheduler gocron.Scheduler
|
||||
|
||||
func init() {
|
||||
var err error
|
||||
scheduler, err = gocron.NewScheduler(gocron.WithLocation(time.Local))
|
||||
if err != nil {
|
||||
log.Fatal("Unable to create cron scheduler: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Init begins cron tasks
|
||||
// Each cron task is run within the shutdown context as a running server
|
||||
@@ -35,11 +44,13 @@ func Init(original context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
scheduler.StartAsync()
|
||||
scheduler.Start()
|
||||
started = true
|
||||
lock.Unlock()
|
||||
graceful.GetManager().RunAtShutdown(context.Background(), func() {
|
||||
scheduler.Stop()
|
||||
if err := scheduler.Shutdown(); err != nil {
|
||||
log.Error("Unable to shutdown cron scheduler: %v", err)
|
||||
}
|
||||
lock.Lock()
|
||||
started = false
|
||||
lock.Unlock()
|
||||
@@ -74,14 +85,14 @@ type TaskTable []*TaskTableRow
|
||||
// ListTasks returns all running cron tasks.
|
||||
func ListTasks() TaskTable {
|
||||
jobs := scheduler.Jobs()
|
||||
jobMap := map[string]*gocron.Job{}
|
||||
jobMap := map[string]gocron.Job{}
|
||||
for _, job := range jobs {
|
||||
// the first tag is the task name
|
||||
tags := job.Tags()
|
||||
if len(tags) == 0 { // should never happen
|
||||
continue
|
||||
}
|
||||
jobMap[job.Tags()[0]] = job
|
||||
jobMap[tags[0]] = job
|
||||
}
|
||||
|
||||
lock.Lock()
|
||||
@@ -99,8 +110,8 @@ func ListTasks() TaskTable {
|
||||
if len(tags) > 1 {
|
||||
spec = tags[1] // the second tag is the task spec
|
||||
}
|
||||
next = e.NextRun()
|
||||
prev = e.PreviousRun()
|
||||
next, _ = e.NextRun()
|
||||
prev, _ = e.LastRunStartedAt()
|
||||
}
|
||||
|
||||
task.lock.Lock()
|
||||
|
||||
+10
-7
@@ -20,6 +20,8 @@ import (
|
||||
"code.gitea.io/gitea/modules/process"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/modules/translation"
|
||||
|
||||
"github.com/go-co-op/gocron/v2"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -55,7 +57,7 @@ func (t *Task) IsEnabled() bool {
|
||||
|
||||
// GetConfig will return a copy of the task's config
|
||||
func (t *Task) GetConfig() Config {
|
||||
if reflect.TypeOf(t.config).Kind() == reflect.Ptr {
|
||||
if reflect.TypeOf(t.config).Kind() == reflect.Pointer {
|
||||
// Pointer:
|
||||
return reflect.New(reflect.ValueOf(t.config).Elem().Type()).Interface().(Config)
|
||||
}
|
||||
@@ -224,12 +226,13 @@ func RegisterTaskFatal(name string, config Config, fun func(context.Context, *us
|
||||
|
||||
func addTaskToScheduler(task *Task) error {
|
||||
tags := []string{task.Name, task.config.GetSchedule()} // name and schedule can't be get from job, so we add them as tag
|
||||
if scheduleHasSeconds(task.config.GetSchedule()) {
|
||||
scheduler = scheduler.CronWithSeconds(task.config.GetSchedule())
|
||||
} else {
|
||||
scheduler = scheduler.Cron(task.config.GetSchedule())
|
||||
}
|
||||
if _, err := scheduler.Tag(tags...).Do(task.Run); err != nil {
|
||||
withSeconds := scheduleHasSeconds(task.config.GetSchedule())
|
||||
_, err := scheduler.NewJob(
|
||||
gocron.CronJob(task.config.GetSchedule(), withSeconds),
|
||||
gocron.NewTask(task.Run),
|
||||
gocron.WithTags(tags...),
|
||||
)
|
||||
if err != nil {
|
||||
log.Error("Unable to register cron task with name: %s Error: %v", task.Name, err)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -13,7 +13,11 @@ import (
|
||||
|
||||
func TestAddTaskToScheduler(t *testing.T) {
|
||||
assert.Empty(t, scheduler.Jobs())
|
||||
defer scheduler.Clear()
|
||||
defer func() {
|
||||
for _, j := range scheduler.Jobs() {
|
||||
_ = scheduler.RemoveJob(j.ID())
|
||||
}
|
||||
}()
|
||||
|
||||
// no seconds
|
||||
err := addTaskToScheduler(&Task{
|
||||
|
||||
Reference in new issue
Block a user