@ -9,23 +9,34 @@ import (
"github.com/cupcakearmy/autorestic/internal/colors"
"github.com/cupcakearmy/autorestic/internal/colors"
"github.com/cupcakearmy/autorestic/internal/flags"
"github.com/cupcakearmy/autorestic/internal/flags"
"github.com/fatih/color"
)
)
var RESTIC_BIN string
func CheckIfCommandIsCallable ( cmd string ) bool {
func CheckIfCommandIsCallable ( cmd string ) bool {
_ , err := exec . LookPath ( cmd )
_ , err := exec . LookPath ( cmd )
return err == nil
return err == nil
}
}
func CheckIfResticIsCallable ( ) bool {
func CheckIfResticIsCallable ( ) bool {
return CheckIfCommandIsCallable ( RESTIC_BIN)
return CheckIfCommandIsCallable ( flags. RESTIC_BIN)
}
}
type ExecuteOptions struct {
type ExecuteOptions struct {
Command string
Command string
Envs map [ string ] string
Envs map [ string ] string
Dir string
Dir string
Silent bool
}
type ColoredWriter struct {
target io . Writer
color * color . Color
}
func ( w ColoredWriter ) Write ( p [ ] byte ) ( n int , err error ) {
colored := [ ] byte ( w . color . Sprint ( string ( p ) ) )
w . target . Write ( colored )
return len ( p ) , nil
}
}
func ExecuteCommand ( options ExecuteOptions , args ... string ) ( int , string , error ) {
func ExecuteCommand ( options ExecuteOptions , args ... string ) ( int , string , error ) {
@ -43,23 +54,32 @@ func ExecuteCommand(options ExecuteOptions, args ...string) (int, string, error)
var out bytes . Buffer
var out bytes . Buffer
var error bytes . Buffer
var error bytes . Buffer
cmd . Stdout = & out
if flags . VERBOSE && ! options . Silent {
var colored ColoredWriter = ColoredWriter {
target : os . Stdout ,
color : colors . Faint ,
}
mw := io . MultiWriter ( colored , & out )
cmd . Stdout = mw
} else {
cmd . Stdout = & out
}
cmd . Stderr = & error
cmd . Stderr = & error
err := cmd . Run ( )
err := cmd . Run ( )
if err != nil {
if err != nil {
code := - 1
if exitError , ok := err . ( * exec . ExitError ) ; ok {
if exitError , ok := err . ( * exec . ExitError ) ; ok {
return exitError . ExitCode ( ) , error . String ( ) , err
code = exitError . ExitCode ( )
} else {
return - 1 , error . String ( ) , err
}
}
return code , error . String ( ) , err
}
}
return 0 , out . String ( ) , nil
return 0 , out . String ( ) , nil
}
}
func ExecuteResticCommand ( options ExecuteOptions , args ... string ) ( int , string , error ) {
func ExecuteResticCommand ( options ExecuteOptions , args ... string ) ( int , string , error ) {
options . Command = RESTIC_BIN
options . Command = flags. RESTIC_BIN
var c = GetConfig ( )
var c = GetConfig ( )
var optionsAsString = getOptions ( c . Global , " ")
var optionsAsString = getOptions ( c . Global , [ ] string { " all "} )
args = append ( optionsAsString , args ... )
args = append ( optionsAsString , args ... )
return ExecuteCommand ( options , args ... )
return ExecuteCommand ( options , args ... )
}
}