Config: fix don't create empty dir when resolving path (#575)

* Config: fix don't create empty dir when resolving path

* refactor migration of default config file

* gracefully handle src == target on Move
* create target directory on Move, if necessary

* unify resolution of default config location

* refactor the use of flagSet to be explicit
* remove package variable
* use empty config file path setting if not set in flags
* resolve default file location the same way when showing the target and
when loading default config file

* don't migrate if target file is the same as source

* rename configfile to configFile

* add migrateConfig tests
This commit is contained in:
Rauno Ots
2020-10-15 04:24:43 +02:00
committed by GitHub
parent f11c904743
commit 8c86aac21d
10 changed files with 253 additions and 129 deletions

View File

@@ -2,7 +2,6 @@ package engine
import (
"errors"
"flag"
"fmt"
"log"
"path/filepath"
@@ -47,9 +46,6 @@ type Engine struct {
// Vars for engine
var (
Bot *Engine
// Stores the set flags
flagSet = make(map[string]bool)
)
// New starts a new engine
@@ -66,17 +62,15 @@ func New() (*Engine, error) {
}
// NewFromSettings starts a new engine based on supplied settings
func NewFromSettings(settings *Settings) (*Engine, error) {
func NewFromSettings(settings *Settings, flagSet map[string]bool) (*Engine, error) {
if settings == nil {
return nil, errors.New("engine: settings is nil")
}
// collect flags
flag.Visit(func(f *flag.Flag) { flagSet[f.Name] = true })
var b Engine
var err error
b.Config, err = loadConfigWithSettings(settings)
b.Config, err = loadConfigWithSettings(settings, flagSet)
if err != nil {
return nil, fmt.Errorf("failed to load config. Err: %s", err)
}
@@ -96,13 +90,13 @@ func NewFromSettings(settings *Settings) (*Engine, error) {
return nil, fmt.Errorf("unable to adjust runtime GOMAXPROCS value. Err: %s", err)
}
validateSettings(&b, settings)
validateSettings(&b, settings, flagSet)
return &b, nil
}
// loadConfigWithSettings creates configuration based on the provided settings
func loadConfigWithSettings(settings *Settings) (*config.Config, error) {
filePath, err := config.GetFilePath(settings.ConfigFile)
func loadConfigWithSettings(settings *Settings, flagSet map[string]bool) (*config.Config, error) {
filePath, err := config.GetAndMigrateDefaultPath(settings.ConfigFile)
if err != nil {
return nil, err
}
@@ -127,7 +121,7 @@ func loadConfigWithSettings(settings *Settings) (*config.Config, error) {
}
// validateSettings validates and sets all bot settings
func validateSettings(b *Engine, s *Settings) {
func validateSettings(b *Engine, s *Settings, flagSet map[string]bool) {
b.Settings.Verbose = s.Verbose
b.Settings.EnableDryRun = s.EnableDryRun
b.Settings.EnableAllExchanges = s.EnableAllExchanges

View File

@@ -51,12 +51,12 @@ func TestLoadConfigWithSettings(t *testing.T) {
tt := tt
t.Run(tt.name, func(t *testing.T) {
// prepare the 'flags'
flagSet = make(map[string]bool)
flagSet := make(map[string]bool)
for _, v := range tt.flags {
flagSet[v] = true
}
// Run the test
got, err := loadConfigWithSettings(tt.settings)
got, err := loadConfigWithSettings(tt.settings, flagSet)
if (err != nil) != tt.wantErr {
t.Errorf("loadConfigWithSettings() error = %v, wantErr %v", err, tt.wantErr)
return
@@ -77,7 +77,7 @@ func TestStartStopDoesNotCausePanic(t *testing.T) {
botOne, err := NewFromSettings(&Settings{
ConfigFile: config.TestFile,
EnableDryRun: true,
})
}, make(map[string]bool))
if err != nil {
t.Error(err)
}

View File

@@ -57,7 +57,7 @@ func dryrunParamInteraction(param string) {
return
}
if !Bot.Settings.EnableDryRun && !flagSet["dryrun"] {
if !Bot.Settings.EnableDryRun {
log.Warnf(log.Global,
"Command line argument '-%s' induces dry run mode."+
" Set -dryrun=false if you wish to override this.",

View File

@@ -183,13 +183,12 @@ func TestDryRunParamInteraction(t *testing.T) {
t.Error(err)
}
// Now set dryrun mode to false (via flagset and the previously enabled
// setting), enable exchange verbose mode and verify that verbose mode
// Now set dryrun mode to true,
// enable exchange verbose mode and verify that verbose mode
// will be set on Bitfinex
bot.Settings.EnableDryRun = false
bot.Settings.EnableDryRun = true
bot.Settings.CheckParamInteraction = true
bot.Settings.EnableExchangeVerbose = true
flagSet["dryrun"] = true
if err = bot.LoadExchange(testExchange, false, nil); err != nil {
t.Error(err)
}
@@ -199,8 +198,8 @@ func TestDryRunParamInteraction(t *testing.T) {
t.Error(err)
}
if bot.Settings.EnableDryRun ||
if !bot.Settings.EnableDryRun ||
!exchCfg.Verbose {
t.Error("dryrun should be false and verbose should be true")
t.Error("dryrun should be true and verbose should be true")
}
}