From 8176345c0ed7f947d9748a9b1774ad00f5199281 Mon Sep 17 00:00:00 2001
From: techknowlogick <techknowlogick@users.noreply.github.com>
Date: Wed, 16 May 2018 21:35:07 -0400
Subject: [PATCH] Add cli commands to regen hooks & keys (#3979)

* Add cli commands to regen hooks & keys

* make fmt

* Allow passing path to config as an option

* add docs
---
 cmd/admin.go                           | 58 ++++++++++++++++++++++++++
 docs/content/doc/usage/command-line.md |  7 ++++
 2 files changed, 65 insertions(+)

diff --git a/cmd/admin.go b/cmd/admin.go
index 5492b9a2db..6c79141eab 100644
--- a/cmd/admin.go
+++ b/cmd/admin.go
@@ -25,6 +25,7 @@ var (
 			subcmdCreateUser,
 			subcmdChangePassword,
 			subcmdRepoSyncReleases,
+			subcmdRegenerate,
 		},
 	}
 
@@ -80,6 +81,41 @@ var (
 		Usage:  "Synchronize repository releases with tags",
 		Action: runRepoSyncReleases,
 	}
+
+	subcmdRegenerate = cli.Command{
+		Name:  "regenerate",
+		Usage: "Regenerate specific files",
+		Subcommands: []cli.Command{
+			microcmdRegenHooks,
+			microcmdRegenKeys,
+		},
+	}
+
+	microcmdRegenHooks = cli.Command{
+		Name:   "hooks",
+		Usage:  "Regenerate git-hooks",
+		Action: runRegenerateHooks,
+		Flags: []cli.Flag{
+			cli.StringFlag{
+				Name:  "config, c",
+				Value: "custom/conf/app.ini",
+				Usage: "Custom configuration file path",
+			},
+		},
+	}
+
+	microcmdRegenKeys = cli.Command{
+		Name:   "keys",
+		Usage:  "Regenerate authorized_keys file",
+		Action: runRegenerateKeys,
+		Flags: []cli.Flag{
+			cli.StringFlag{
+				Name:  "config, c",
+				Value: "custom/conf/app.ini",
+				Usage: "Custom configuration file path",
+			},
+		},
+	}
 )
 
 func runChangePassword(c *cli.Context) error {
@@ -195,3 +231,25 @@ func getReleaseCount(id int64) (int64, error) {
 		},
 	)
 }
+
+func runRegenerateHooks(c *cli.Context) error {
+	if c.IsSet("config") {
+		setting.CustomConf = c.String("config")
+	}
+
+	if err := initDB(); err != nil {
+		return err
+	}
+	return models.SyncRepositoryHooks()
+}
+
+func runRegenerateKeys(c *cli.Context) error {
+	if c.IsSet("config") {
+		setting.CustomConf = c.String("config")
+	}
+
+	if err := initDB(); err != nil {
+		return err
+	}
+	return models.RewriteAllPublicKeys()
+}
diff --git a/docs/content/doc/usage/command-line.md b/docs/content/doc/usage/command-line.md
index cf6feeaf5e..9c16d49049 100644
--- a/docs/content/doc/usage/command-line.md
+++ b/docs/content/doc/usage/command-line.md
@@ -64,6 +64,13 @@ Admin operations:
             - `--password value`, `-p value`: New password. Required.
         - Examples:
             - `gitea admin change-password --username myname --password asecurepassword`
+    - `regenerate`
+        - Options:
+            - `hooks`: Regenerate git-hooks for all repositories
+            - `keys`: Regenerate authorized_keys file
+        - Examples:
+            - `gitea admin regenerate hooks`
+            - `gitea admin regenerate keys`
 
 #### cert