mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-26 12:01:08 +00:00
(cherry picked from commit20b5669269) (cherry picked from commit1574643a6a) Update semantic version according to specification (cherry picked from commit22510f4130) Mise à jour de 'Makefile' (cherry picked from commitc3d85d8409) (cherry picked from commit5ea2309851) (cherry picked from commitec5217b9d1) (cherry picked from commit14f08e364b) (cherry picked from commitb4465c67b8) [API] [SEMVER] replace number with version (cherry picked from commitfba48e6497) (cherry picked from commit532ec5d878) [API] [SEMVER] [v1.20] less is replaced by css (cherry picked from commit01ca3a4f42) (cherry picked from commit1d928c3ab2) (cherry picked from commita39dc804cd) Conflicts: webpack.config.js (cherry picked from commitadc68578b3) (cherry picked from commit9b8d98475f) (cherry picked from commit2516103974) (cherry picked from commit18e6287963) (cherry picked from commite9694e67ab) (cherry picked from commita9763edaf0)
207 lines
6.5 KiB
Go
207 lines
6.5 KiB
Go
// Copyright 2016 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package routers
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
"runtime"
|
|
|
|
"code.gitea.io/gitea/models"
|
|
asymkey_model "code.gitea.io/gitea/models/asymkey"
|
|
"code.gitea.io/gitea/modules/cache"
|
|
"code.gitea.io/gitea/modules/eventsource"
|
|
"code.gitea.io/gitea/modules/git"
|
|
"code.gitea.io/gitea/modules/highlight"
|
|
code_indexer "code.gitea.io/gitea/modules/indexer/code"
|
|
issue_indexer "code.gitea.io/gitea/modules/indexer/issues"
|
|
stats_indexer "code.gitea.io/gitea/modules/indexer/stats"
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/markup"
|
|
"code.gitea.io/gitea/modules/markup/external"
|
|
"code.gitea.io/gitea/modules/notification"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
"code.gitea.io/gitea/modules/ssh"
|
|
"code.gitea.io/gitea/modules/storage"
|
|
"code.gitea.io/gitea/modules/svg"
|
|
"code.gitea.io/gitea/modules/system"
|
|
"code.gitea.io/gitea/modules/templates"
|
|
"code.gitea.io/gitea/modules/translation"
|
|
"code.gitea.io/gitea/modules/util"
|
|
"code.gitea.io/gitea/modules/web"
|
|
actions_router "code.gitea.io/gitea/routers/api/actions"
|
|
forgejo "code.gitea.io/gitea/routers/api/forgejo/v1"
|
|
packages_router "code.gitea.io/gitea/routers/api/packages"
|
|
apiv1 "code.gitea.io/gitea/routers/api/v1"
|
|
"code.gitea.io/gitea/routers/common"
|
|
"code.gitea.io/gitea/routers/private"
|
|
web_routers "code.gitea.io/gitea/routers/web"
|
|
actions_service "code.gitea.io/gitea/services/actions"
|
|
"code.gitea.io/gitea/services/auth"
|
|
"code.gitea.io/gitea/services/auth/source/oauth2"
|
|
"code.gitea.io/gitea/services/automerge"
|
|
"code.gitea.io/gitea/services/cron"
|
|
"code.gitea.io/gitea/services/mailer"
|
|
mailer_incoming "code.gitea.io/gitea/services/mailer/incoming"
|
|
markup_service "code.gitea.io/gitea/services/markup"
|
|
repo_migrations "code.gitea.io/gitea/services/migrations"
|
|
mirror_service "code.gitea.io/gitea/services/mirror"
|
|
pull_service "code.gitea.io/gitea/services/pull"
|
|
repo_service "code.gitea.io/gitea/services/repository"
|
|
"code.gitea.io/gitea/services/repository/archiver"
|
|
"code.gitea.io/gitea/services/task"
|
|
"code.gitea.io/gitea/services/webhook"
|
|
)
|
|
|
|
func mustInit(fn func() error) {
|
|
err := fn()
|
|
if err != nil {
|
|
ptr := reflect.ValueOf(fn).Pointer()
|
|
fi := runtime.FuncForPC(ptr)
|
|
log.Fatal("%s failed: %v", fi.Name(), err)
|
|
}
|
|
}
|
|
|
|
func mustInitCtx(ctx context.Context, fn func(ctx context.Context) error) {
|
|
err := fn(ctx)
|
|
if err != nil {
|
|
ptr := reflect.ValueOf(fn).Pointer()
|
|
fi := runtime.FuncForPC(ptr)
|
|
log.Fatal("%s(ctx) failed: %v", fi.Name(), err)
|
|
}
|
|
}
|
|
|
|
func syncAppConfForGit(ctx context.Context) error {
|
|
runtimeState := new(system.RuntimeState)
|
|
if err := system.AppState.Get(runtimeState); err != nil {
|
|
return err
|
|
}
|
|
|
|
updated := false
|
|
if runtimeState.LastAppPath != setting.AppPath {
|
|
log.Info("AppPath changed from '%s' to '%s'", runtimeState.LastAppPath, setting.AppPath)
|
|
runtimeState.LastAppPath = setting.AppPath
|
|
updated = true
|
|
}
|
|
if runtimeState.LastCustomConf != setting.CustomConf {
|
|
log.Info("CustomConf changed from '%s' to '%s'", runtimeState.LastCustomConf, setting.CustomConf)
|
|
runtimeState.LastCustomConf = setting.CustomConf
|
|
updated = true
|
|
}
|
|
|
|
if updated {
|
|
log.Info("re-sync repository hooks ...")
|
|
mustInitCtx(ctx, repo_service.SyncRepositoryHooks)
|
|
|
|
log.Info("re-write ssh public keys ...")
|
|
mustInit(asymkey_model.RewriteAllPublicKeys)
|
|
|
|
return system.AppState.Set(runtimeState)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GlobalInitInstalled is for global installed configuration.
|
|
func GlobalInitInstalled(ctx context.Context) {
|
|
if !setting.InstallLock {
|
|
log.Fatal("Gitea is not installed")
|
|
}
|
|
|
|
mustInitCtx(ctx, git.InitFull)
|
|
log.Info("Gitea Version: %s%s", setting.AppVer, setting.AppBuiltWith)
|
|
log.Info("Git Version: %s (home: %s)", git.VersionInfo(), git.HomeDir())
|
|
log.Info("AppPath: %s", setting.AppPath)
|
|
log.Info("AppWorkPath: %s", setting.AppWorkPath)
|
|
log.Info("Custom path: %s", setting.CustomPath)
|
|
log.Info("Log path: %s", setting.Log.RootPath)
|
|
log.Info("Configuration file: %s", setting.CustomConf)
|
|
log.Info("Run Mode: %s", util.ToTitleCase(setting.RunMode))
|
|
|
|
// Setup i18n
|
|
translation.InitLocales(ctx)
|
|
|
|
setting.LoadSettings()
|
|
mustInit(storage.Init)
|
|
|
|
mailer.NewContext(ctx)
|
|
mustInit(cache.NewContext)
|
|
notification.NewContext()
|
|
mustInit(archiver.Init)
|
|
|
|
highlight.NewContext()
|
|
external.RegisterRenderers()
|
|
markup.Init(markup_service.ProcessorHelper())
|
|
|
|
if setting.EnableSQLite3 {
|
|
log.Info("SQLite3 support is enabled")
|
|
} else if setting.Database.Type.IsSQLite3() {
|
|
log.Fatal("SQLite3 support is disabled, but it is used for database setting. Please get or build a Gitea release with SQLite3 support.")
|
|
}
|
|
|
|
mustInitCtx(ctx, common.InitDBEngine)
|
|
log.Info("ORM engine initialization successful!")
|
|
mustInit(system.Init)
|
|
mustInit(oauth2.Init)
|
|
|
|
mustInitCtx(ctx, models.Init)
|
|
mustInit(repo_service.Init)
|
|
|
|
// Booting long running goroutines.
|
|
issue_indexer.InitIssueIndexer(false)
|
|
code_indexer.Init()
|
|
mustInit(stats_indexer.Init)
|
|
|
|
mirror_service.InitSyncMirrors()
|
|
mustInit(webhook.Init)
|
|
mustInit(pull_service.Init)
|
|
mustInit(automerge.Init)
|
|
mustInit(task.Init)
|
|
mustInit(repo_migrations.Init)
|
|
eventsource.GetManager().Init()
|
|
mustInitCtx(ctx, mailer_incoming.Init)
|
|
|
|
mustInitCtx(ctx, syncAppConfForGit)
|
|
|
|
mustInit(ssh.Init)
|
|
|
|
auth.Init()
|
|
mustInit(svg.Init)
|
|
|
|
actions_service.Init()
|
|
|
|
// Finally start up the cron
|
|
cron.NewContext(ctx)
|
|
}
|
|
|
|
// NormalRoutes represents non install routes
|
|
func NormalRoutes(ctx context.Context) *web.Route {
|
|
_ = templates.HTMLRenderer()
|
|
r := web.NewRoute()
|
|
r.Use(common.ProtocolMiddlewares()...)
|
|
|
|
r.Mount("/", web_routers.Routes(ctx))
|
|
r.Mount("/api/v1", apiv1.Routes(ctx))
|
|
r.Mount("/api/forgejo/v1", forgejo.Routes(ctx))
|
|
r.Mount("/api/internal", private.Routes())
|
|
|
|
if setting.Packages.Enabled {
|
|
// This implements package support for most package managers
|
|
r.Mount("/api/packages", packages_router.CommonRoutes(ctx))
|
|
// This implements the OCI API (Note this is not preceded by /api but is instead /v2)
|
|
r.Mount("/v2", packages_router.ContainerRoutes(ctx))
|
|
}
|
|
|
|
if setting.Actions.Enabled {
|
|
prefix := "/api/actions"
|
|
r.Mount(prefix, actions_router.Routes(ctx, prefix))
|
|
|
|
// TODO: Pipeline api used for runner internal communication with gitea server. but only artifact is used for now.
|
|
// In Github, it uses ACTIONS_RUNTIME_URL=https://pipelines.actions.githubusercontent.com/fLgcSHkPGySXeIFrg8W8OBSfeg3b5Fls1A1CwX566g8PayEGlg/
|
|
// TODO: this prefix should be generated with a token string with runner ?
|
|
prefix = "/api/actions_pipeline"
|
|
r.Mount(prefix, actions_router.ArtifactsRoutes(prefix))
|
|
}
|
|
|
|
return r
|
|
}
|