2021-04-08 23:55:10 +00:00
package cmd
import (
"os"
2021-10-06 13:50:23 +00:00
"path/filepath"
2022-02-16 20:28:13 +00:00
"strings"
2021-04-08 23:55:10 +00:00
"github.com/cupcakearmy/autorestic/internal"
2021-04-12 08:55:57 +00:00
"github.com/cupcakearmy/autorestic/internal/colors"
2022-02-16 20:42:54 +00:00
"github.com/cupcakearmy/autorestic/internal/flags"
2021-04-08 23:55:10 +00:00
"github.com/spf13/cobra"
homedir "github.com/mitchellh/go-homedir"
"github.com/spf13/viper"
)
2021-04-11 15:02:34 +00:00
func CheckErr ( err error ) {
if err != nil {
2021-04-12 14:15:17 +00:00
colors . Error . Fprintln ( os . Stderr , "Error:" , err )
2024-11-10 18:37:59 +00:00
internal . Unlock ( )
2021-04-11 15:02:34 +00:00
os . Exit ( 1 )
}
}
2021-04-08 23:55:10 +00:00
var cfgFile string
var rootCmd = & cobra . Command {
2021-04-11 11:04:11 +00:00
Version : internal . VERSION ,
Use : "autorestic" ,
Short : "CLI Wrapper for restic" ,
2021-12-22 13:45:04 +00:00
Long : "Documentation:\thttps://autorestic.vercel.app\nSupport:\thttps://discord.gg/wS7RpYTYd2" ,
2021-04-08 23:55:10 +00:00
}
func Execute ( ) {
2021-04-11 15:02:34 +00:00
CheckErr ( rootCmd . Execute ( ) )
2021-04-08 23:55:10 +00:00
}
func init ( ) {
2021-04-15 22:27:06 +00:00
rootCmd . PersistentFlags ( ) . StringVarP ( & cfgFile , "config" , "c" , "" , "config file (default is $HOME/.autorestic.yml or ./.autorestic.yml)" )
2022-02-16 20:42:54 +00:00
rootCmd . PersistentFlags ( ) . BoolVar ( & flags . CI , "ci" , false , "CI mode disabled interactive mode and colors and enables verbosity" )
rootCmd . PersistentFlags ( ) . BoolVarP ( & flags . VERBOSE , "verbose" , "v" , false , "verbose mode" )
2022-04-26 22:48:52 +00:00
rootCmd . PersistentFlags ( ) . StringVar ( & flags . RESTIC_BIN , "restic-bin" , "restic" , "specify custom restic binary" )
2022-09-13 13:04:12 +00:00
rootCmd . PersistentFlags ( ) . StringVar ( & flags . DOCKER_IMAGE , "docker-image" , "cupcakearmy/autorestic:" + internal . VERSION , "specify a custom docker image" )
2024-07-03 01:12:26 +00:00
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)" )
2021-04-12 14:15:17 +00:00
cobra . OnInitialize ( initConfig )
2021-04-08 23:55:10 +00:00
}
func initConfig ( ) {
2021-04-12 14:15:17 +00:00
if ci , _ := rootCmd . Flags ( ) . GetBool ( "ci" ) ; ci {
colors . DisableColors ( true )
2022-02-16 20:42:54 +00:00
flags . VERBOSE = true
2021-04-12 14:15:17 +00:00
}
2021-04-08 23:55:10 +00:00
if cfgFile != "" {
viper . SetConfigFile ( cfgFile )
2022-02-09 08:07:01 +00:00
viper . AutomaticEnv ( )
if viper . ConfigFileUsed ( ) == "" {
2023-07-31 08:03:18 +00:00
colors . Error . Printf ( "cannot read config file %s\n" , cfgFile )
2022-02-09 08:07:01 +00:00
os . Exit ( 1 )
}
2021-04-08 23:55:10 +00:00
} else {
2024-01-11 18:01:59 +00:00
configPaths := getConfigPaths ( )
2022-02-09 08:07:01 +00:00
for _ , cfgPath := range configPaths {
viper . AddConfigPath ( cfgPath )
}
2022-02-16 20:42:54 +00:00
if flags . VERBOSE {
2022-02-16 20:28:13 +00:00
colors . Faint . Printf ( "Using config paths: %s\n" , strings . Join ( configPaths , " " ) )
}
2022-02-09 08:07:01 +00:00
cfgFileName := ".autorestic"
viper . SetConfigName ( cfgFileName )
viper . AutomaticEnv ( )
2021-04-08 23:55:10 +00:00
}
}
2024-01-11 18:01:59 +00:00
func getConfigPaths ( ) [ ] string {
result := [ ] string { "." }
if home , err := homedir . Dir ( ) ; err == nil {
result = append ( result , home )
}
{
xdgConfigHome , found := os . LookupEnv ( "XDG_CONFIG_HOME" )
if ! found {
if home , err := homedir . Dir ( ) ; err == nil {
xdgConfigHome = filepath . Join ( home , ".config" )
}
}
xdgConfig := filepath . Join ( xdgConfigHome , "autorestic" )
result = append ( result , xdgConfig )
}
return result
}