Rewrite: rewrites env config repo and commits application cue files

We can build upon this tool to implement version to version migration logic.

Change-Id: I6066f565f118ca44ca3ce7a0ac7522258958cf25
diff --git a/core/installer/cmd/app_manager.go b/core/installer/cmd/app_manager.go
index b6c083c..7b05081 100644
--- a/core/installer/cmd/app_manager.go
+++ b/core/installer/cmd/app_manager.go
@@ -27,10 +27,10 @@
 		Use:  "appmanager",
 		RunE: appManagerCmdRun,
 	}
-	cmd.Flags().StringVar(
-		&appManagerFlags.sshKey,
-		"ssh-key",
-		"",
+	cmd.Flags().IntVar(
+		&appManagerFlags.port,
+		"port",
+		8080,
 		"",
 	)
 	cmd.Flags().StringVar(
@@ -39,10 +39,10 @@
 		"",
 		"",
 	)
-	cmd.Flags().IntVar(
-		&appManagerFlags.port,
-		"port",
-		8080,
+	cmd.Flags().StringVar(
+		&appManagerFlags.sshKey,
+		"ssh-key",
+		"",
 		"",
 	)
 	cmd.Flags().StringVar(
@@ -80,7 +80,7 @@
 	if err != nil {
 		return err
 	}
-	m, err := installer.NewAppManager(repoIO, kube)
+	m, err := installer.NewAppManager(repoIO, kube, "/apps")
 	if err != nil {
 		return err
 	}
diff --git a/core/installer/cmd/main.go b/core/installer/cmd/main.go
index 70e58de..1e4ec1d 100644
--- a/core/installer/cmd/main.go
+++ b/core/installer/cmd/main.go
@@ -26,6 +26,7 @@
 	rootCmd.AddCommand(appManagerCmd())
 	rootCmd.AddCommand(envManagerCmd())
 	rootCmd.AddCommand(welcomeCmd())
+	rootCmd.AddCommand(rewriteCmd())
 }
 
 func main() {
diff --git a/core/installer/cmd/rewrite.go b/core/installer/cmd/rewrite.go
new file mode 100644
index 0000000..5eddc67
--- /dev/null
+++ b/core/installer/cmd/rewrite.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+	"fmt"
+	"log"
+	"os"
+
+	"golang.org/x/crypto/ssh"
+
+	"github.com/spf13/cobra"
+
+	"github.com/giolekva/pcloud/core/installer"
+	"github.com/giolekva/pcloud/core/installer/soft"
+)
+
+var rewriteFlags struct {
+	path string
+}
+
+func rewriteCmd() *cobra.Command {
+	cmd := &cobra.Command{
+		Use:  "rewrite",
+		RunE: rewriteCmdRun,
+	}
+	cmd.Flags().StringVar(
+		&appManagerFlags.repoAddr,
+		"repo-addr",
+		"",
+		"",
+	)
+	cmd.Flags().StringVar(
+		&appManagerFlags.sshKey,
+		"ssh-key",
+		"",
+		"",
+	)
+	return cmd
+}
+
+func rewriteCmdRun(cmd *cobra.Command, args []string) error {
+	sshKey, err := os.ReadFile(appManagerFlags.sshKey)
+	if err != nil {
+		return err
+	}
+	signer, err := ssh.ParsePrivateKey(sshKey)
+	if err != nil {
+		return err
+	}
+	addr, err := soft.ParseRepositoryAddress(appManagerFlags.repoAddr)
+	if err != nil {
+		return err
+	}
+	repo, err := soft.CloneRepository(addr, signer)
+	if err != nil {
+		return err
+	}
+	log.Println("Cloned repository")
+	repoIO, err := installer.NewRepoIO(repo, signer)
+	if err != nil {
+		return err
+	}
+	log.Println("Creating repository")
+	r := installer.NewInMemoryAppRepository(installer.CreateStoreApps())
+	mgr, err := installer.NewAppManager(repoIO, nil, "/apps")
+	if err != nil {
+		return err
+	}
+	env, err := mgr.Config()
+	if err != nil {
+		return err
+	}
+	fmt.Printf("%+v\n", env)
+	log.Println("Read config")
+	if err != nil {
+		return err
+	}
+	all, err := mgr.FindAllInstances()
+	if err != nil {
+		return err
+	}
+	for _, inst := range all {
+		app, err := installer.FindEnvApp(r, inst.AppId)
+		if err != nil {
+			return err
+		}
+		v := inst.InputToValues(app.Schema())
+		if err := mgr.Update(app, inst.Id, v, installer.WithNoCommit()); err != nil {
+			return err
+		}
+	}
+	repoIO.CommitAndPush("upgrade: persist cue files")
+	return nil
+}