1// SPDX-License-Identifier: AGPL-3.0-or-later
2
3package app
4
5import (
6 "github.com/spf13/cobra"
7)
8
9func newRootCmd() *cobra.Command {
10 return newRootCmdWith(defaultCLIEnv())
11}
12
13// newRootCmdWith builds the command tree around env, which the remote commands
14// use to reach the environment, the clock and the build version.
15func newRootCmdWith(env *cliEnv) *cobra.Command {
16 root := &cobra.Command{
17 Use: "ermite",
18 Short: "A single-user Git forge",
19 Long: "ermite is a single-user Git forge: `ermite serve` runs the server, the other commands\n" +
20 "drive a running server over its API.\n\n" +
21 "Remote commands need the server address (http:// or https://) and, except for public reads,\n" +
22 "a bearer token (see `ermite token create`). Each comes from, in order:\n\n" +
23 " ERMITE_URL / ERMITE_TOKEN the environment\n" +
24 " url / token.cmd in ~/.config/ermite/config the config file (ERMITE_CONFIG selects another;\n `ermite config show` prints its path)\n\n" +
25 "token.cmd is a command line that prints the token, run only when a command needs it, so the\n" +
26 "token stays in your secret manager (pass, gopass, op, bw, secret-tool…), never in the file.\n" +
27 "See `ermite config --help`.",
28 SilenceUsage: true,
29 SilenceErrors: true, // cmd/ermite prints the error once
30 }
31 root.AddCommand(
32 newServeCmd(), newHookCmd(),
33 newVersionCmd(env), newRepoCmd(env), newTokenCmd(env), newWatchCmd(env),
34 newMRCmd(env), newSigningKeyCmd(env), newWebCmd(env), newConfigCmd(env),
35 newRunCmd(env), newRunnerCmd(env),
36 )
37 return root
38}