package env import ( "fmt" "github.com/bdw/ship/internal/ssh" "github.com/bdw/ship/internal/state" "github.com/spf13/cobra" ) var unsetCmd = &cobra.Command{ Use: "unset KEY...", Short: "Unset environment variable(s)", Long: "Remove one or more environment variables from an app.", Args: cobra.MinimumNArgs(2), RunE: runUnset, } func runUnset(cmd *cobra.Command, args []string) error { name := args[0] if err := state.ValidateName(name); err != nil { return err } keys := args[1:] st, err := state.Load() if err != nil { return fmt.Errorf("error loading state: %w", err) } host, _ := cmd.Flags().GetString("host") if host == "" { host = st.GetDefaultHost() } if host == "" { return fmt.Errorf("--host is required") } app, err := st.GetApp(host, name) if err != nil { return err } if app.Type != "app" { return fmt.Errorf("env is only available for apps, not static sites") } if app.Env == nil { return fmt.Errorf("no environment variables set") } changed := false for _, key := range keys { if _, exists := app.Env[key]; exists { delete(app.Env, key) changed = true fmt.Printf("Unset %s\n", key) } else { fmt.Printf("Warning: %s not found\n", key) } } if !changed { return nil } if err := st.Save(); err != nil { return fmt.Errorf("error saving state: %w", err) } client, err := ssh.Connect(host) if err != nil { return fmt.Errorf("error connecting to VPS: %w", err) } defer client.Close() fmt.Println("-> Updating environment file on VPS...") envFilePath := fmt.Sprintf("/etc/ship/env/%s.env", name) envContent := "" for k, v := range app.Env { envContent += fmt.Sprintf("%s=%s\n", k, v) } if err := client.WriteSudoFile(envFilePath, envContent); err != nil { return fmt.Errorf("error updating env file: %w", err) } fmt.Println("-> Restarting service...") if _, err := client.RunSudo(fmt.Sprintf("systemctl restart %s", name)); err != nil { return fmt.Errorf("error restarting service: %w", err) } fmt.Println("Environment variables updated successfully") return nil }