From 6f7905c8ecf17d5f74ac9a71a453d6768c212b6d Mon Sep 17 00:00:00 2001
From: Earl Warren <contact@earl-warren.org>
Date: Sun, 9 Jul 2023 16:01:27 +0200
Subject: [PATCH] [CLI] implement forgejo-cli actions generate-secret

---
 cmd/forgejo/actions.go                        | 27 +++++++++++++++++--
 tests/integration/cmd_forgejo_actions_test.go |  7 ++++-
 2 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/cmd/forgejo/actions.go b/cmd/forgejo/actions.go
index 1262a02584..74629ba025 100644
--- a/cmd/forgejo/actions.go
+++ b/cmd/forgejo/actions.go
@@ -7,6 +7,7 @@ import (
 	"context"
 	"fmt"
 
+	actions_model "code.gitea.io/gitea/models/actions"
 	"code.gitea.io/gitea/modules/private"
 	"code.gitea.io/gitea/modules/setting"
 
@@ -18,12 +19,13 @@ func CmdActions(ctx context.Context) cli.Command {
 		Name:  "actions",
 		Usage: "Commands for managing Forgejo Actions",
 		Subcommands: []cli.Command{
-			SubcmdActionsGenRunnerToken(ctx),
+			SubcmdActionsGenerateRunnerToken(ctx),
+			SubcmdActionsGenerateRunnerSecret(ctx),
 		},
 	}
 }
 
-func SubcmdActionsGenRunnerToken(ctx context.Context) cli.Command {
+func SubcmdActionsGenerateRunnerToken(ctx context.Context) cli.Command {
 	return cli.Command{
 		Name:   "generate-runner-token",
 		Usage:  "Generate a new token for a runner to use to register with the server",
@@ -38,6 +40,27 @@ func SubcmdActionsGenRunnerToken(ctx context.Context) cli.Command {
 	}
 }
 
+func SubcmdActionsGenerateRunnerSecret(ctx context.Context) cli.Command {
+	return cli.Command{
+		Name:   "generate-secret",
+		Usage:  "Generate a secret suitable for input to the register subcommand",
+		Action: func(cliCtx *cli.Context) error { return RunGenerateSecret(ctx, cliCtx) },
+	}
+}
+
+func RunGenerateSecret(ctx context.Context, cliCtx *cli.Context) error {
+	setting.MustInstalled()
+
+	runner := actions_model.ActionRunner{}
+	if err := runner.GenerateToken(); err != nil {
+		return err
+	}
+	if _, err := fmt.Fprintf(ContextGetStdout(ctx), "%s", runner.Token); err != nil {
+		panic(err)
+	}
+	return nil
+}
+
 func RunGenerateActionsRunnerToken(ctx context.Context, cliCtx *cli.Context) error {
 	if !ContextGetNoInstallSignals(ctx) {
 		var cancel context.CancelFunc
diff --git a/tests/integration/cmd_forgejo_actions_test.go b/tests/integration/cmd_forgejo_actions_test.go
index 9767d03675..e2fbb77dae 100644
--- a/tests/integration/cmd_forgejo_actions_test.go
+++ b/tests/integration/cmd_forgejo_actions_test.go
@@ -16,7 +16,12 @@ func Test_CmdForgejo_Actions(t *testing.T) {
 	onGiteaRun(t, func(*testing.T, *url.URL) {
 		defer test.MockVariable(&setting.Actions.Enabled, true)()
 
-		output := cmdForgejoCaptureOutput(t, []string{"forgejo-cli", "actions", "generate-runner-token"})
+		var output string
+
+		output = cmdForgejoCaptureOutput(t, []string{"forgejo-cli", "actions", "generate-runner-token"})
+		assert.EqualValues(t, 40, len(output))
+
+		output = cmdForgejoCaptureOutput(t, []string{"forgejo-cli", "actions", "generate-secret"})
 		assert.EqualValues(t, 40, len(output))
 	})
 }