// Copyright 2019 Gitea. All rights reserved. // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file. package task import ( "fmt" "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/migrations/base" "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/structs" ) // taskQueue is a global queue of tasks var taskQueue Queue // Run a task func Run(t *models.Task) error { switch t.Type { case structs.TaskTypeMigrateRepo: return runMigrateTask(t) default: return fmt.Errorf("Unknow task type: %d", t.Type) } } // Init will start the service to get all unfinished tasks and run them func Init() error { switch setting.Task.QueueType { case setting.ChannelQueueType: taskQueue = NewChannelQueue(setting.Task.QueueLength) case setting.RedisQueueType: var err error addrs, pass, idx, err := parseConnStr(setting.Task.QueueConnStr) if err != nil { return err } taskQueue, err = NewRedisQueue(addrs, pass, idx) if err != nil { return err } default: return fmt.Errorf("Unsupported task queue type: %v", setting.Task.QueueType) } go func() { if err := taskQueue.Run(); err != nil { log.Error("taskQueue.Run end failed: %v", err) } }() return nil } // MigrateRepository add migration repository to task func MigrateRepository(doer, u *models.User, opts base.MigrateOptions) error { task, err := models.CreateMigrateTask(doer, u, opts) if err != nil { return err } return taskQueue.Push(task) }