fix(config): write config file when instructed to

Ayman Bagabas created

Change summary

cmd/soft/migrate_config.go   |  8 ++++++++
cmd/soft/serve.go            |  8 ++++++++
examples/setuid/main.go      |  6 ++++++
server/config/config.go      | 18 +++++++++++-------
server/daemon/daemon_test.go |  3 +++
server/server_test.go        |  3 +++
6 files changed, 39 insertions(+), 7 deletions(-)

Detailed changes

cmd/soft/migrate_config.go 🔗

@@ -37,7 +37,15 @@ var (
 			keyPath := os.Getenv("SOFT_SERVE_KEY_PATH")
 			reposPath := os.Getenv("SOFT_SERVE_REPO_PATH")
 			bindAddr := os.Getenv("SOFT_SERVE_BIND_ADDRESS")
+
+			// Set up config
 			cfg := config.DefaultConfig()
+			if !cfg.Exist() {
+				if err := cfg.WriteConfig(); err != nil {
+					return fmt.Errorf("failed to write default config: %w", err)
+				}
+			}
+
 			ctx = config.WithContext(ctx, cfg)
 			sb, err := sqlite.NewSqliteBackend(ctx)
 			if err != nil {

cmd/soft/serve.go 🔗

@@ -22,7 +22,15 @@ var (
 		Args:  cobra.NoArgs,
 		RunE: func(cmd *cobra.Command, _ []string) error {
 			ctx := cmd.Context()
+
+			// Set up config
 			cfg := config.DefaultConfig()
+			if !cfg.Exist() {
+				if err := cfg.WriteConfig(); err != nil {
+					return fmt.Errorf("failed to write default config: %w", err)
+				}
+			}
+
 			ctx = config.WithContext(ctx, cfg)
 			cmd.SetContext(ctx)
 

examples/setuid/main.go 🔗

@@ -45,7 +45,13 @@ func main() {
 		log.Fatal("Setuid error", "err", err)
 	}
 	ctx := context.Background()
+	// Set up config
 	cfg := config.DefaultConfig()
+	if !cfg.Exist() {
+		if err := cfg.WriteConfig(); err != nil {
+			log.Fatal("failed to write default config: %w", err)
+		}
+	}
 	ctx = config.WithContext(ctx, cfg)
 	cfg.SSH.ListenAddr = fmt.Sprintf(":%d", *port)
 	s, err := server.NewServer(ctx)

server/config/config.go 🔗

@@ -256,13 +256,6 @@ func DefaultConfig() *Config {
 		log.Errorf("failed to parse config: %v", err)
 	}
 
-	// Write config if it doesn't exist
-	if _, err := os.Stat(cp); os.IsNotExist(err) {
-		if err := WriteConfig(cp, cfg); err != nil {
-			log.Fatal("failed to write config", "err", err)
-		}
-	}
-
 	if err := cfg.validate(); err != nil {
 		log.Fatal(err)
 	}
@@ -270,6 +263,17 @@ func DefaultConfig() *Config {
 	return cfg
 }
 
+// Exist returns true if the configuration file exists.
+func (c *Config) Exist() bool {
+	_, err := os.Stat(filepath.Join(c.DataPath, "config.yaml"))
+	return err == nil
+}
+
+// WriteConfig writes the configuration in the default path.
+func (c *Config) WriteConfig() error {
+	return WriteConfig(filepath.Join(c.DataPath, "config.yaml"), c)
+}
+
 // WithBackend sets the backend for the configuration.
 func (c *Config) WithBackend(backend backend.Backend) *Config {
 	c.Backend = backend

server/daemon/daemon_test.go 🔗

@@ -35,6 +35,9 @@ func TestMain(m *testing.M) {
 	os.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
 	ctx := context.TODO()
 	cfg := config.DefaultConfig()
+	if err := cfg.WriteConfig(); err != nil {
+		log.Fatal("failed to write default config: %w", err)
+	}
 	ctx = config.WithContext(ctx, cfg)
 	fb, err := sqlite.NewSqliteBackend(ctx)
 	if err != nil {

server/server_test.go 🔗

@@ -27,6 +27,9 @@ func setupServer(tb testing.TB) (*Server, *config.Config, string) {
 	tb.Setenv("SOFT_SERVE_GIT_LISTEN_ADDR", fmt.Sprintf(":%d", test.RandomPort()))
 	ctx := context.TODO()
 	cfg := config.DefaultConfig()
+	if err := cfg.WriteConfig(); err != nil {
+		tb.Fatal("failed to write default config: %w", err)
+	}
 	ctx = config.WithContext(ctx, cfg)
 	tb.Log("configuring server")
 	s, err := NewServer(ctx)