gitea
Зеркало из https://github.com/go-gitea/gitea
1// Copyright 2018 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4// Package cmd provides subcommands to the gitea binary - such as "web" or
5// "admin".
6package cmd
7
8import (
9"context"
10"errors"
11"fmt"
12"io"
13"os"
14"os/signal"
15"strings"
16"syscall"
17
18"code.gitea.io/gitea/models/db"
19"code.gitea.io/gitea/modules/log"
20"code.gitea.io/gitea/modules/setting"
21"code.gitea.io/gitea/modules/util"
22
23"github.com/urfave/cli/v2"
24)
25
26// argsSet checks that all the required arguments are set. args is a list of
27// arguments that must be set in the passed Context.
28func argsSet(c *cli.Context, args ...string) error {
29for _, a := range args {
30if !c.IsSet(a) {
31return errors.New(a + " is not set")
32}
33
34if util.IsEmptyString(c.String(a)) {
35return errors.New(a + " is required")
36}
37}
38return nil
39}
40
41// confirm waits for user input which confirms an action
42func confirm() (bool, error) {
43var response string
44
45_, err := fmt.Scanln(&response)
46if err != nil {
47return false, err
48}
49
50switch strings.ToLower(response) {
51case "y", "yes":
52return true, nil
53case "n", "no":
54return false, nil
55default:
56return false, errors.New(response + " isn't a correct confirmation string")
57}
58}
59
60func initDB(ctx context.Context) error {
61setting.MustInstalled()
62setting.LoadDBSetting()
63setting.InitSQLLoggersForCli(log.INFO)
64
65if setting.Database.Type == "" {
66log.Fatal(`Database settings are missing from the configuration file: %q.
67Ensure you are running in the correct environment or set the correct configuration file with -c.
68If this is the intended configuration file complete the [database] section.`, setting.CustomConf)
69}
70if err := db.InitEngine(ctx); err != nil {
71return fmt.Errorf("unable to initialize the database using the configuration in %q. Error: %w", setting.CustomConf, err)
72}
73return nil
74}
75
76func installSignals() (context.Context, context.CancelFunc) {
77ctx, cancel := context.WithCancel(context.Background())
78go func() {
79// install notify
80signalChannel := make(chan os.Signal, 1)
81
82signal.Notify(
83signalChannel,
84syscall.SIGINT,
85syscall.SIGTERM,
86)
87select {
88case <-signalChannel:
89case <-ctx.Done():
90}
91cancel()
92signal.Reset()
93}()
94
95return ctx, cancel
96}
97
98func setupConsoleLogger(level log.Level, colorize bool, out io.Writer) {
99if out != os.Stdout && out != os.Stderr {
100panic("setupConsoleLogger can only be used with os.Stdout or os.Stderr")
101}
102
103writeMode := log.WriterMode{
104Level: level,
105Colorize: colorize,
106WriterOption: log.WriterConsoleOption{Stderr: out == os.Stderr},
107}
108writer := log.NewEventWriterConsole("console-default", writeMode)
109log.GetManager().GetLogger(log.DEFAULT).ReplaceAllWriters(writer)
110}
111
112func globalBool(c *cli.Context, name string) bool {
113for _, ctx := range c.Lineage() {
114if ctx.Bool(name) {
115return true
116}
117}
118return false
119}
120
121// PrepareConsoleLoggerLevel by default, use INFO level for console logger, but some sub-commands (for git/ssh protocol) shouldn't output any log to stdout.
122// Any log appears in git stdout pipe will break the git protocol, eg: client can't push and hangs forever.
123func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(*cli.Context) error {
124return func(c *cli.Context) error {
125level := defaultLevel
126if globalBool(c, "quiet") {
127level = log.FATAL
128}
129if globalBool(c, "debug") || globalBool(c, "verbose") {
130level = log.TRACE
131}
132log.SetConsoleLogger(log.DEFAULT, "console-default", level)
133return nil
134}
135}
136