diff --git a/app/db.go b/app/db.go index 6968067..cda1d77 100644 --- a/app/db.go +++ b/app/db.go @@ -326,8 +326,15 @@ func (db *Db) Delete(path string) error { } // Finds .env files in the filesystem that aren't present in the database. -func (db *Db) Scan() ([]string, error) { - all_paths, err := db.cfg.scan() +// path overrides the already configured +func (db *Db) Scan(paths []string) ([]string, error) { + cfg := db.cfg + + if paths != nil { + cfg.ScanConfig.Include = paths + } + + all_paths, err := cfg.scan() if err != nil { return []string{}, err } diff --git a/cmd/check.go b/cmd/check.go new file mode 100644 index 0000000..4f258b8 --- /dev/null +++ b/cmd/check.go @@ -0,0 +1,109 @@ +package cmd + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/sbrow/envr/app" + "github.com/spf13/cobra" +) + +var checkCmd = &cobra.Command{ + Use: "check [path]", + Short: "check if files in the current directory are backed up", + // TODO: Long description for new check command + Args: cobra.MaximumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + // Accept an optional path arg, default to current working directory + var checkPath string + if len(args) > 0 { + checkPath = args[0] + } else { + cwd, err := os.Getwd() + if err != nil { + return fmt.Errorf("failed to get current working directory: %w", err) + } + checkPath = cwd + } + + // Get absolute path + absPath, err := filepath.Abs(checkPath) + if err != nil { + return fmt.Errorf("failed to get absolute path: %w", err) + } + + // Open database + db, err := app.Open() + if err != nil { + return fmt.Errorf("failed to open database: %w", err) + } + defer db.Close(app.ReadOnly) + + // Check if the path is a file or directory + info, err := os.Stat(absPath) + if err != nil { + return fmt.Errorf("failed to stat path: %w", err) + } + + var filesInPath []string + + if info.IsDir() { + // Find .env files in the specified directory + if err := db.CanScan(); err != nil { + return err + } + + // Scan only the specified path for .env files + filesInPath, err = db.Scan([]string{absPath}) + if err != nil { + return fmt.Errorf("failed to scan path for env files: %w", err) + } + } else { + // Path is a file, just check this specific file + filesInPath = []string{absPath} + } + + // Get all backed up files from the database + envFiles, err := db.List() + if err != nil { + return fmt.Errorf("failed to list files from database: %w", err) + } + + // Check which files are not backed up + var notBackedUp []string + for _, file := range filesInPath { + isBackedUp := false + for _, envFile := range envFiles { + if envFile.Path == file { + isBackedUp = true + break + } + } + if !isBackedUp { + notBackedUp = append(notBackedUp, file) + } + } + + // Display results + if len(notBackedUp) == 0 { + if len(filesInPath) == 0 { + fmt.Println("No .env files found in the specified directory.") + } else { + fmt.Println("✓ All .env files in the directory are backed up.") + } + } else { + fmt.Printf("Found %d .env file(s) that are not backed up:\n", len(notBackedUp)) + for _, file := range notBackedUp { + fmt.Printf(" %s\n", file) + } + fmt.Println("\nRun 'envr sync' to back up these files.") + } + + return nil + }, +} + +func init() { + rootCmd.AddCommand(checkCmd) +} diff --git a/cmd/scan.go b/cmd/scan.go index 0138f89..a079dae 100644 --- a/cmd/scan.go +++ b/cmd/scan.go @@ -28,7 +28,7 @@ var scanCmd = &cobra.Command{ return err } - files, err := db.Scan() + files, err := db.Scan(nil) if err != nil { return err } diff --git a/docs/cli/envr.md b/docs/cli/envr.md index c9ae469..7066b1f 100644 --- a/docs/cli/envr.md +++ b/docs/cli/envr.md @@ -44,6 +44,7 @@ at before, restore your backup with: ### SEE ALSO * [envr backup](envr_backup.md) - Import a .env file into envr +* [envr check](envr_check.md) - check if files in the current directory are backed up * [envr deps](envr_deps.md) - Check for missing binaries * [envr edit-config](envr_edit-config.md) - Edit your config with your default editor * [envr init](envr_init.md) - Set up envr diff --git a/docs/cli/envr_check.md b/docs/cli/envr_check.md new file mode 100644 index 0000000..3b00192 --- /dev/null +++ b/docs/cli/envr_check.md @@ -0,0 +1,18 @@ +## envr check + +check if files in the current directory are backed up + +``` +envr check [path] [flags] +``` + +### Options + +``` + -h, --help help for check +``` + +### SEE ALSO + +* [envr](envr.md) - Manage your .env files. +