From f6aa45fd6c0724ce7415edaebce21993f70568a9 Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Tue, 2 Jul 2024 21:12:26 -0400 Subject: [PATCH 1/7] feat(lockfile): allow changing the lockfile path --- cmd/root.go | 1 + internal/flags/flags.go | 11 ++++++----- internal/lock/lock.go | 24 +++++++++++++++++------- internal/lock/lock_test.go | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 3da9e25..df69ab4 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -42,6 +42,7 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&flags.VERBOSE, "verbose", "v", false, "verbose mode") rootCmd.PersistentFlags().StringVar(&flags.RESTIC_BIN, "restic-bin", "restic", "specify custom restic binary") rootCmd.PersistentFlags().StringVar(&flags.DOCKER_IMAGE, "docker-image", "cupcakearmy/autorestic:"+internal.VERSION, "specify a custom docker image") + rootCmd.PersistentFlags().StringVar(&flags.LOCKFILE_PATH, "lockfile-path", "", "specify a custom path for the lockfile (defaults to .autorestic.lock.yml next to the loaded autorestic config file)") cobra.OnInitialize(initConfig) } diff --git a/internal/flags/flags.go b/internal/flags/flags.go index e03cc25..801aed7 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -1,9 +1,10 @@ package flags var ( - CI bool = false - VERBOSE bool = false - CRON_LEAN bool = false - RESTIC_BIN string - DOCKER_IMAGE string + CI bool = false + VERBOSE bool = false + CRON_LEAN bool = false + RESTIC_BIN string + DOCKER_IMAGE string + LOCKFILE_PATH string ) diff --git a/internal/lock/lock.go b/internal/lock/lock.go index 4e9fd52..caae87c 100644 --- a/internal/lock/lock.go +++ b/internal/lock/lock.go @@ -18,18 +18,28 @@ const ( RUNNING = "running" ) +// getLockfilePath returns the path to the lockfile. If flags.LOCKFILE_PATH is +// set, its value is used, otherwise the path is generated relative to the +// config file. +func getLockfilePath() string { + if flags.LOCKFILE_PATH != "" { + return flags.LOCKFILE_PATH + } else { + p := viper.ConfigFileUsed() + if p == "" { + colors.Error.Println("cannot lock before reading config location") + os.Exit(1) + } + return path.Join(path.Dir(p), ".autorestic.lock.yml") + } +} + func getLock() *viper.Viper { if lock == nil { - once.Do(func() { lock = viper.New() lock.SetDefault("running", false) - p := viper.ConfigFileUsed() - if p == "" { - colors.Error.Println("cannot lock before reading config location") - os.Exit(1) - } - file = path.Join(path.Dir(p), ".autorestic.lock.yml") + file = getLockfilePath() if !flags.CRON_LEAN { colors.Faint.Println("Using lock:\t", file) } diff --git a/internal/lock/lock_test.go b/internal/lock/lock_test.go index 2b9d9f7..7546d9d 100644 --- a/internal/lock/lock_test.go +++ b/internal/lock/lock_test.go @@ -7,6 +7,7 @@ import ( "strconv" "testing" + "github.com/cupcakearmy/autorestic/internal/flags" "github.com/spf13/viper" ) @@ -28,6 +29,37 @@ func setup(t *testing.T) { }) } +func TestGetLockfilePath(t *testing.T) { + t.Run("when flags.LOCKFILE_PATH is set", func(t *testing.T) { + flags.LOCKFILE_PATH = "/path/to/my/autorestic.lock.yml" + defer func() { flags.LOCKFILE_PATH = "" }() + + p := getLockfilePath() + + if p != "/path/to/my/autorestic.lock.yml" { + t.Errorf("got %v, want %v", p, "/path/to/my/autorestic.lock.yml") + } + }) + + t.Run("when flags.LOCKFILE_PATH is set", func(t *testing.T) { + d, err := os.MkdirTemp("", testDirectory) + if err != nil { + log.Fatalf("error creating temp dir: %v", err) + return + } + viper.SetConfigFile(d + "/.autorestic.yml") + defer viper.Reset() + + flags.LOCKFILE_PATH = "" + + p := getLockfilePath() + + if p != d+"/.autorestic.lock.yml" { + t.Errorf("got %v, want %v", p, d+"/.autorestic.lock.yml") + } + }) +} + func TestLock(t *testing.T) { setup(t) From 51a8298f2a48e43cfcf40664640cb82dc9f328d1 Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Tue, 2 Jul 2024 21:15:00 -0400 Subject: [PATCH 2/7] doc(lockfile): Document `--lockfile-path` flag --- docs/pages/cli/general.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/pages/cli/general.md b/docs/pages/cli/general.md index 9fa16eb..e9fad29 100644 --- a/docs/pages/cli/general.md +++ b/docs/pages/cli/general.md @@ -34,3 +34,11 @@ With `--restic-bin` you can specify to run a specific restic binary. This can be ```bash autorestic --restic-bin /some/path/to/my/custom/restic/binary ``` + +## `--lockfile-path` + +Specify the path for the lockfile used by `autorestic`. If omitted, this will default to `.autorestic.lock.yml` next to the loaded config file. + +```bash +autorestic --lockfile-path /path/to/my/.autorestic.lock.yml +``` From 8de8d0070e2ba15c119776c0797402549bdcd153 Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Sun, 10 Nov 2024 13:37:59 -0500 Subject: [PATCH 3/7] chore: move lockfile code to internal module In a future commit, I'll need the lockfile code to access the config file. This solves an import cycle. --- cmd/backup.go | 5 ++--- cmd/check.go | 5 ++--- cmd/cron.go | 5 ++--- cmd/exec.go | 5 ++--- cmd/forget.go | 5 ++--- cmd/restore.go | 5 ++--- cmd/root.go | 3 +-- cmd/unlock.go | 3 +-- internal/config.go | 3 +-- internal/location.go | 5 ++--- internal/{lock => }/lock.go | 6 +++--- internal/{lock => }/lock_test.go | 2 +- main.go | 4 ++-- 13 files changed, 23 insertions(+), 33 deletions(-) rename internal/{lock => }/lock.go (96%) rename internal/{lock => }/lock_test.go (99%) diff --git a/cmd/backup.go b/cmd/backup.go index a575220..da999a7 100644 --- a/cmd/backup.go +++ b/cmd/backup.go @@ -6,7 +6,6 @@ import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/colors" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -15,9 +14,9 @@ var backupCmd = &cobra.Command{ Short: "Create backups for given locations", Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() selected, err := internal.GetAllOrSelected(cmd, false) CheckErr(err) diff --git a/cmd/check.go b/cmd/check.go index 159f341..6d458e4 100644 --- a/cmd/check.go +++ b/cmd/check.go @@ -3,7 +3,6 @@ package cmd import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/colors" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -12,9 +11,9 @@ var checkCmd = &cobra.Command{ Short: "Check if everything is setup", Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() CheckErr(internal.CheckConfig()) diff --git a/cmd/cron.go b/cmd/cron.go index 175ae13..be5a4bd 100644 --- a/cmd/cron.go +++ b/cmd/cron.go @@ -3,7 +3,6 @@ package cmd import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/flags" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -13,9 +12,9 @@ var cronCmd = &cobra.Command{ Long: `Intended to be mainly triggered by an automated system like systemd or crontab. For each location checks if a cron backup is due and runs it.`, Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() err = internal.RunCron() CheckErr(err) diff --git a/cmd/exec.go b/cmd/exec.go index 107b0e1..b3f5db1 100644 --- a/cmd/exec.go +++ b/cmd/exec.go @@ -5,7 +5,6 @@ import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/colors" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -14,9 +13,9 @@ var execCmd = &cobra.Command{ Short: "Execute arbitrary native restic commands for given backends", Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() selected, err := internal.GetAllOrSelected(cmd, true) CheckErr(err) diff --git a/cmd/forget.go b/cmd/forget.go index 93d7137..ba3b594 100644 --- a/cmd/forget.go +++ b/cmd/forget.go @@ -2,7 +2,6 @@ package cmd import ( "github.com/cupcakearmy/autorestic/internal" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -11,9 +10,9 @@ var forgetCmd = &cobra.Command{ Short: "Forget and optionally prune snapshots according the specified policies", Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() selected, err := internal.GetAllOrSelected(cmd, false) CheckErr(err) diff --git a/cmd/restore.go b/cmd/restore.go index 8faf4a7..f84b240 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -4,7 +4,6 @@ import ( "fmt" "github.com/cupcakearmy/autorestic/internal" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -14,9 +13,9 @@ var restoreCmd = &cobra.Command{ Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { internal.GetConfig() - err := lock.Lock() + err := internal.Lock() CheckErr(err) - defer lock.Unlock() + defer internal.Unlock() location, _ := cmd.Flags().GetString("location") l, ok := internal.GetLocation(location) diff --git a/cmd/root.go b/cmd/root.go index df69ab4..4db353e 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -8,7 +8,6 @@ import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/colors" "github.com/cupcakearmy/autorestic/internal/flags" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" homedir "github.com/mitchellh/go-homedir" @@ -18,7 +17,7 @@ import ( func CheckErr(err error) { if err != nil { colors.Error.Fprintln(os.Stderr, "Error:", err) - lock.Unlock() + internal.Unlock() os.Exit(1) } } diff --git a/cmd/unlock.go b/cmd/unlock.go index 75aabf5..0b79c8d 100644 --- a/cmd/unlock.go +++ b/cmd/unlock.go @@ -9,7 +9,6 @@ import ( "github.com/cupcakearmy/autorestic/internal" "github.com/cupcakearmy/autorestic/internal/colors" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/spf13/cobra" ) @@ -33,7 +32,7 @@ To check you can run "ps aux | grep autorestic".`, } } - err := lock.Unlock() + err := internal.Unlock() if err != nil { colors.Error.Println("Could not unlock:", err) return diff --git a/internal/config.go b/internal/config.go index c5430d3..89e7c82 100644 --- a/internal/config.go +++ b/internal/config.go @@ -10,7 +10,6 @@ import ( "github.com/cupcakearmy/autorestic/internal/colors" "github.com/cupcakearmy/autorestic/internal/flags" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/joho/godotenv" "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" @@ -40,7 +39,7 @@ func exitConfig(err error, msg string) { if msg != "" { colors.Error.Println(msg) } - lock.Unlock() + Unlock() os.Exit(1) } diff --git a/internal/location.go b/internal/location.go index 221c5f3..5ba7b56 100644 --- a/internal/location.go +++ b/internal/location.go @@ -11,7 +11,6 @@ import ( "github.com/cupcakearmy/autorestic/internal/colors" "github.com/cupcakearmy/autorestic/internal/flags" - "github.com/cupcakearmy/autorestic/internal/lock" "github.com/cupcakearmy/autorestic/internal/metadata" "github.com/robfig/cron" ) @@ -442,11 +441,11 @@ func (l Location) RunCron() error { if err != nil { return err } - last := time.Unix(lock.GetCron(l.name), 0) + last := time.Unix(GetCron(l.name), 0) next := schedule.Next(last) now := time.Now() if now.After(next) { - lock.SetCron(l.name, now.Unix()) + SetCron(l.name, now.Unix()) errs := l.Backup(true, "") if len(errs) > 0 { return fmt.Errorf("Failed to backup location \"%s\":\n%w", l.name, errors.Join(errs...)) diff --git a/internal/lock/lock.go b/internal/lock.go similarity index 96% rename from internal/lock/lock.go rename to internal/lock.go index caae87c..6226f12 100644 --- a/internal/lock/lock.go +++ b/internal/lock.go @@ -1,4 +1,4 @@ -package lock +package internal import ( "os" @@ -12,7 +12,7 @@ import ( var lock *viper.Viper var file string -var once sync.Once +var lockOnce sync.Once const ( RUNNING = "running" @@ -36,7 +36,7 @@ func getLockfilePath() string { func getLock() *viper.Viper { if lock == nil { - once.Do(func() { + lockOnce.Do(func() { lock = viper.New() lock.SetDefault("running", false) file = getLockfilePath() diff --git a/internal/lock/lock_test.go b/internal/lock_test.go similarity index 99% rename from internal/lock/lock_test.go rename to internal/lock_test.go index 7546d9d..83ea7cc 100644 --- a/internal/lock/lock_test.go +++ b/internal/lock_test.go @@ -1,4 +1,4 @@ -package lock +package internal import ( "log" diff --git a/main.go b/main.go index ae644c3..e0d9ae5 100644 --- a/main.go +++ b/main.go @@ -22,7 +22,7 @@ import ( "syscall" "github.com/cupcakearmy/autorestic/cmd" - "github.com/cupcakearmy/autorestic/internal/lock" + "github.com/cupcakearmy/autorestic/internal" ) func handleCtrlC() { @@ -31,7 +31,7 @@ func handleCtrlC() { go func() { sig := <-c fmt.Println("Signal:", sig) - lock.Unlock() + internal.Unlock() os.Exit(0) }() } From 0fdf9c77aebfb9129e21d612fa5917edb0570ffa Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Sun, 10 Nov 2024 13:45:24 -0500 Subject: [PATCH 4/7] feat(config): allow specifying lockfile --- internal/config.go | 1 + internal/lock.go | 34 ++++++++++++++++++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/internal/config.go b/internal/config.go index 89e7c82..f3c63b0 100644 --- a/internal/config.go +++ b/internal/config.go @@ -23,6 +23,7 @@ type Options map[string]OptionMap type Config struct { Version string `mapstructure:"version" yaml:"version"` + Lockfile string `mapstructure:"lockfile,omitempty" yaml:"lockfile,omitempty"` Extras interface{} `mapstructure:"extras" yaml:"extras"` Locations map[string]Location `mapstructure:"locations" yaml:"locations"` Backends map[string]Backend `mapstructure:"backends" yaml:"backends"` diff --git a/internal/lock.go b/internal/lock.go index 6226f12..a128bdf 100644 --- a/internal/lock.go +++ b/internal/lock.go @@ -3,6 +3,7 @@ package internal import ( "os" "path" + "path/filepath" "sync" "github.com/cupcakearmy/autorestic/internal/colors" @@ -18,20 +19,33 @@ const ( RUNNING = "running" ) -// getLockfilePath returns the path to the lockfile. If flags.LOCKFILE_PATH is -// set, its value is used, otherwise the path is generated relative to the -// config file. +// getLockfilePath returns the path to the lockfile. The path for the lockfile +// can be sources from multiple places If flags.LOCKFILE_PATH is set, its value +// is used; if the config has the `lockfile` option set, its value is used; +// otherwise the path is generated relative to the config file. func getLockfilePath() string { if flags.LOCKFILE_PATH != "" { - return flags.LOCKFILE_PATH - } else { - p := viper.ConfigFileUsed() - if p == "" { - colors.Error.Println("cannot lock before reading config location") - os.Exit(1) + abs, err := filepath.Abs(flags.LOCKFILE_PATH) + if err != nil { + return flags.LOCKFILE_PATH + } + return abs + } + + if lockfile := GetConfig().Lockfile; lockfile != "" { + abs, err := filepath.Abs(lockfile) + if err != nil { + return lockfile } - return path.Join(path.Dir(p), ".autorestic.lock.yml") + return abs + } + + p := viper.ConfigFileUsed() + if p == "" { + colors.Error.Println("cannot lock before reading config location") + os.Exit(1) } + return path.Join(path.Dir(p), ".autorestic.lock.yml") } func getLock() *viper.Viper { From c9a1474297ef531d1d87a2467d87fb32944a646d Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Sun, 1 Dec 2024 14:24:11 -0500 Subject: [PATCH 5/7] chore(lock): test setting lockfile path from config --- internal/lock_test.go | 92 +++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/internal/lock_test.go b/internal/lock_test.go index 83ea7cc..e364579 100644 --- a/internal/lock_test.go +++ b/internal/lock_test.go @@ -1,62 +1,88 @@ package internal import ( - "log" "os" "os/exec" + "path" "strconv" + "sync" "testing" "github.com/cupcakearmy/autorestic/internal/flags" "github.com/spf13/viper" + "github.com/stretchr/testify/assert" ) -var testDirectory = "autorestic_test_tmp" - // All tests must share the same lock file as it is only initialized once func setup(t *testing.T) { - d, err := os.MkdirTemp("", testDirectory) - if err != nil { - log.Fatalf("error creating temp dir: %v", err) - return + t.Helper() + cleanup := func() { + flags.LOCKFILE_PATH = "" + config = nil + once = sync.Once{} + viper.Reset() } - // set config file location + + cleanup() + d := t.TempDir() viper.SetConfigFile(d + "/.autorestic.yml") + viper.Set("version", 2) + viper.WriteConfig() - t.Cleanup(func() { - os.RemoveAll(d) - viper.Reset() - }) + t.Cleanup(cleanup) } func TestGetLockfilePath(t *testing.T) { - t.Run("when flags.LOCKFILE_PATH is set", func(t *testing.T) { - flags.LOCKFILE_PATH = "/path/to/my/autorestic.lock.yml" - defer func() { flags.LOCKFILE_PATH = "" }() - - p := getLockfilePath() - - if p != "/path/to/my/autorestic.lock.yml" { - t.Errorf("got %v, want %v", p, "/path/to/my/autorestic.lock.yml") + t.Run("user specified", func(t *testing.T) { + testCases := []struct { + name string + flag string + config string + expected string + }{ + { + name: "flag and config", + flag: "/flag.lock.yml", + config: "/config.lock.yml", + expected: "/flag.lock.yml", + }, + { + name: "flag only", + flag: "/flag.lock.yml", + config: "", + expected: "/flag.lock.yml", + }, + { + name: "config only", + flag: "", + config: "/config.lock.yml", + expected: "/config.lock.yml", + }, + } + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + setup(t) + flags.LOCKFILE_PATH = testCase.flag + if testCase.config != "" { + viper.Set("lockfile", testCase.config) + err := viper.WriteConfig() + assert.NoError(t, err) + } + + p := getLockfilePath() + assert.Equal(t, testCase.expected, p) + }) } }) - t.Run("when flags.LOCKFILE_PATH is set", func(t *testing.T) { - d, err := os.MkdirTemp("", testDirectory) - if err != nil { - log.Fatalf("error creating temp dir: %v", err) - return - } - viper.SetConfigFile(d + "/.autorestic.yml") - defer viper.Reset() + t.Run("default", func(t *testing.T) { + setup(t) - flags.LOCKFILE_PATH = "" + configPath := viper.ConfigFileUsed() + expectedLockfile := path.Join(path.Dir(configPath), ".autorestic.lock.yml") p := getLockfilePath() - - if p != d+"/.autorestic.lock.yml" { - t.Errorf("got %v, want %v", p, d+"/.autorestic.lock.yml") - } + assert.Equal(t, expectedLockfile, p) }) } From de0862a3dd8002d9bc94f71ab9a1318ca8bd9677 Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Sun, 1 Dec 2024 14:43:29 -0500 Subject: [PATCH 6/7] doc(lock): add lockfile doc with customization explanation --- docs/pages/_meta.json | 1 + docs/pages/cli/general.md | 2 +- docs/pages/lockfile.md | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 docs/pages/lockfile.md diff --git a/docs/pages/_meta.json b/docs/pages/_meta.json index 74856dc..7e38ca7 100644 --- a/docs/pages/_meta.json +++ b/docs/pages/_meta.json @@ -3,6 +3,7 @@ "quick": "Quick Start", "installation": "Installation", "config": "Configuration", + "lockfile": "Lockfile", "location": "Locations", "backend": "Backend", "cli": "CLI", diff --git a/docs/pages/cli/general.md b/docs/pages/cli/general.md index e9fad29..e653c77 100644 --- a/docs/pages/cli/general.md +++ b/docs/pages/cli/general.md @@ -37,7 +37,7 @@ autorestic --restic-bin /some/path/to/my/custom/restic/binary ## `--lockfile-path` -Specify the path for the lockfile used by `autorestic`. If omitted, this will default to `.autorestic.lock.yml` next to the loaded config file. +Specify the path for the [lockfile](../lockfile.md) used by `autorestic`. If omitted, this will default to `.autorestic.lock.yml` next to the loaded config file. ```bash autorestic --lockfile-path /path/to/my/.autorestic.lock.yml diff --git a/docs/pages/lockfile.md b/docs/pages/lockfile.md new file mode 100644 index 0000000..ca111f0 --- /dev/null +++ b/docs/pages/lockfile.md @@ -0,0 +1,14 @@ +# Lockfile + +Under the hood, `autorestic` uses a lockfile to ensure that only one instance is running and to keep track of when [cronjobs](./location/cron.md) were last run. + +By default, the lockfile is stored next to your [configuration file](./config.md) as `.autorestic.lock.yml`. In other words, if your config file is located at `/some/path/.autorestic.yml`, then the lockfile will be located at `/some/path/.autorestic.lock.yml`. + +## Customization + +The path to the lockfile can be customized if need be. This can be done is a few ways: + +1. Using the `--lockfile-path ...` command line flag +1. Setting `lockfile: ...` in the configuration file + +Note that `autorestic` will check for a customized lockfile path in the order listed above. This means that if you specify a lockfile path in multiple places, the method that's higher in the list will win. From 59b23931272ca6f112a83c1c983ddd324717c395 Mon Sep 17 00:00:00 2001 From: Boris Bera Date: Sun, 1 Dec 2024 14:53:25 -0500 Subject: [PATCH 7/7] chore(lockfile) change flag to --lockfile This is more consistent with the `lockfile` config option --- cmd/root.go | 2 +- docs/pages/cli/general.md | 4 ++-- docs/pages/lockfile.md | 2 +- internal/flags/flags.go | 12 ++++++------ internal/lock.go | 10 +++++----- internal/lock_test.go | 4 ++-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 4db353e..86b7714 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -41,7 +41,7 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&flags.VERBOSE, "verbose", "v", false, "verbose mode") rootCmd.PersistentFlags().StringVar(&flags.RESTIC_BIN, "restic-bin", "restic", "specify custom restic binary") rootCmd.PersistentFlags().StringVar(&flags.DOCKER_IMAGE, "docker-image", "cupcakearmy/autorestic:"+internal.VERSION, "specify a custom docker image") - rootCmd.PersistentFlags().StringVar(&flags.LOCKFILE_PATH, "lockfile-path", "", "specify a custom path for the lockfile (defaults to .autorestic.lock.yml next to the loaded autorestic config file)") + rootCmd.PersistentFlags().StringVar(&flags.LOCKFILE, "lockfile", "", "specify a custom path for the lockfile (defaults to .autorestic.lock.yml next to the loaded autorestic config file)") cobra.OnInitialize(initConfig) } diff --git a/docs/pages/cli/general.md b/docs/pages/cli/general.md index e653c77..cd304c7 100644 --- a/docs/pages/cli/general.md +++ b/docs/pages/cli/general.md @@ -35,10 +35,10 @@ With `--restic-bin` you can specify to run a specific restic binary. This can be autorestic --restic-bin /some/path/to/my/custom/restic/binary ``` -## `--lockfile-path` +## `--lockfile` Specify the path for the [lockfile](../lockfile.md) used by `autorestic`. If omitted, this will default to `.autorestic.lock.yml` next to the loaded config file. ```bash -autorestic --lockfile-path /path/to/my/.autorestic.lock.yml +autorestic --lockfile /path/to/my/.autorestic.lock.yml ``` diff --git a/docs/pages/lockfile.md b/docs/pages/lockfile.md index ca111f0..11baaa3 100644 --- a/docs/pages/lockfile.md +++ b/docs/pages/lockfile.md @@ -8,7 +8,7 @@ By default, the lockfile is stored next to your [configuration file](./config.md The path to the lockfile can be customized if need be. This can be done is a few ways: -1. Using the `--lockfile-path ...` command line flag +1. Using the `--lockfile ...` command line flag 1. Setting `lockfile: ...` in the configuration file Note that `autorestic` will check for a customized lockfile path in the order listed above. This means that if you specify a lockfile path in multiple places, the method that's higher in the list will win. diff --git a/internal/flags/flags.go b/internal/flags/flags.go index 801aed7..73560e1 100644 --- a/internal/flags/flags.go +++ b/internal/flags/flags.go @@ -1,10 +1,10 @@ package flags var ( - CI bool = false - VERBOSE bool = false - CRON_LEAN bool = false - RESTIC_BIN string - DOCKER_IMAGE string - LOCKFILE_PATH string + CI bool = false + VERBOSE bool = false + CRON_LEAN bool = false + RESTIC_BIN string + DOCKER_IMAGE string + LOCKFILE string ) diff --git a/internal/lock.go b/internal/lock.go index a128bdf..38037cd 100644 --- a/internal/lock.go +++ b/internal/lock.go @@ -20,14 +20,14 @@ const ( ) // getLockfilePath returns the path to the lockfile. The path for the lockfile -// can be sources from multiple places If flags.LOCKFILE_PATH is set, its value -// is used; if the config has the `lockfile` option set, its value is used; +// can be sources from multiple places If flags.LOCKFILE is set, its value is +// used; if the config has the `lockfile` option set, its value is used; // otherwise the path is generated relative to the config file. func getLockfilePath() string { - if flags.LOCKFILE_PATH != "" { - abs, err := filepath.Abs(flags.LOCKFILE_PATH) + if flags.LOCKFILE != "" { + abs, err := filepath.Abs(flags.LOCKFILE) if err != nil { - return flags.LOCKFILE_PATH + return flags.LOCKFILE } return abs } diff --git a/internal/lock_test.go b/internal/lock_test.go index e364579..eb5a6a2 100644 --- a/internal/lock_test.go +++ b/internal/lock_test.go @@ -17,7 +17,7 @@ import ( func setup(t *testing.T) { t.Helper() cleanup := func() { - flags.LOCKFILE_PATH = "" + flags.LOCKFILE = "" config = nil once = sync.Once{} viper.Reset() @@ -62,7 +62,7 @@ func TestGetLockfilePath(t *testing.T) { for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) { setup(t) - flags.LOCKFILE_PATH = testCase.flag + flags.LOCKFILE = testCase.flag if testCase.config != "" { viper.Set("lockfile", testCase.config) err := viper.WriteConfig()