mirror of
https://github.com/sbrow/envr.git
synced 2025-12-29 15:47:38 -05:00
105 lines
2.0 KiB
Go
105 lines
2.0 KiB
Go
package cmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/AlecAivazis/survey/v2"
|
|
"github.com/mattn/go-isatty"
|
|
"github.com/sbrow/envr/app"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var scanCmd = &cobra.Command{
|
|
Use: "scan",
|
|
Short: "Find and select .env files for backup",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
db, err := app.Open()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if db == nil {
|
|
return fmt.Errorf("No db was loaded")
|
|
}
|
|
|
|
if err := db.CanScan(); err != nil {
|
|
return err
|
|
}
|
|
|
|
files, err := db.Scan(nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(files) == 0 {
|
|
return fmt.Errorf("No .env files found to add.")
|
|
}
|
|
|
|
if isatty.IsTerminal(os.Stdout.Fd()) {
|
|
selectedFiles, err := selectEnvFiles(files)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Insert selected files into database
|
|
var addedCount int
|
|
for _, file := range selectedFiles {
|
|
envFile := app.NewEnvFile(file)
|
|
err := db.Insert(envFile)
|
|
if err != nil {
|
|
fmt.Printf("Error adding %s: %v\n", file, err)
|
|
} else {
|
|
addedCount++
|
|
}
|
|
}
|
|
|
|
// Close database with write mode to persist changes
|
|
if addedCount > 0 {
|
|
err = db.Close(app.Write)
|
|
if err != nil {
|
|
return fmt.Errorf("Error saving changes: %v\n", err)
|
|
} else {
|
|
fmt.Printf("Successfully added %d file(s) to backup.\n", addedCount)
|
|
return nil
|
|
}
|
|
} else {
|
|
err = db.Close(app.ReadOnly)
|
|
if err != nil {
|
|
return fmt.Errorf("Error closing database: %v\n", err)
|
|
}
|
|
fmt.Println("No files were added.")
|
|
return nil
|
|
}
|
|
} else {
|
|
output, err := json.Marshal(files)
|
|
if err != nil {
|
|
return fmt.Errorf("Error marshaling files to JSON: %v", err)
|
|
}
|
|
fmt.Println(string(output))
|
|
return nil
|
|
}
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(scanCmd)
|
|
}
|
|
|
|
func selectEnvFiles(files []string) ([]string, error) {
|
|
var selectedFiles []string
|
|
|
|
prompt := &survey.MultiSelect{
|
|
Message: "Select .env files to backup:",
|
|
Options: files,
|
|
}
|
|
|
|
err := survey.AskOne(prompt, &selectedFiles)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return selectedFiles, nil
|
|
}
|