Show a confirmation when changing a config that can't be auto-reloaded

This commit is contained in:
Stefan Haller 2024-08-04 15:09:38 +02:00
parent ce50533689
commit 57de11b709
2 changed files with 64 additions and 0 deletions

View file

@ -6,6 +6,7 @@ import (
"io"
"os"
"path/filepath"
"reflect"
"sort"
"strings"
"sync"
@ -331,6 +332,7 @@ func (gui *Gui) onNewRepo(startArgs appTypes.StartArgs, contextKey types.Context
gui.g.SetFocusHandler(func(Focused bool) error {
if Focused {
oldConfig := gui.Config.GetUserConfig()
reloadErr, didChange := gui.Config.ReloadChangedUserConfigFiles()
if didChange && reloadErr == nil {
gui.c.Log.Info("User config changed - reloading")
@ -338,6 +340,10 @@ func (gui *Gui) onNewRepo(startArgs appTypes.StartArgs, contextKey types.Context
if err := gui.resetKeybindings(); err != nil {
return err
}
if err := gui.checkForChangedConfigsThatDontAutoReload(oldConfig, gui.Config.GetUserConfig()); err != nil {
return err
}
}
gui.c.Log.Info("Receiving focus - refreshing")
@ -434,6 +440,56 @@ func (gui *Gui) onUserConfigLoaded() error {
return nil
}
func (gui *Gui) checkForChangedConfigsThatDontAutoReload(oldConfig *config.UserConfig, newConfig *config.UserConfig) error {
configsThatDontAutoReload := []string{
"Git.AutoFetch",
"Git.AutoRefresh",
"Refresher.RefreshInterval",
"Refresher.FetchInterval",
"Update.Method",
"Update.Days",
}
changedConfigs := []string{}
for _, config := range configsThatDontAutoReload {
old := reflect.ValueOf(oldConfig).Elem()
new := reflect.ValueOf(newConfig).Elem()
fieldNames := strings.Split(config, ".")
userFacingPath := make([]string, 0, len(fieldNames))
// navigate to the leaves in old and new config
for _, fieldName := range fieldNames {
f, _ := old.Type().FieldByName(fieldName)
userFacingName := f.Tag.Get("yaml")
if userFacingName == "" {
userFacingName = fieldName
}
userFacingPath = append(userFacingPath, userFacingName)
old = old.FieldByName(fieldName)
new = new.FieldByName(fieldName)
}
// if the value has changed, ...
if !old.Equal(new) {
// ... append it to the list of changed configs
changedConfigs = append(changedConfigs, strings.Join(userFacingPath, "."))
}
}
if len(changedConfigs) == 0 {
return nil
}
message := utils.ResolvePlaceholderString(
gui.c.Tr.NonReloadableConfigWarning,
map[string]string{
"configs": strings.Join(changedConfigs, "\n"),
},
)
return gui.c.Confirm(types.ConfirmOpts{
Title: gui.c.Tr.NonReloadableConfigWarningTitle,
Prompt: message,
})
}
// resetState reuses the repo state from our repo state map, if the repo was
// open before; otherwise it creates a new one.
func (gui *Gui) resetState(startArgs appTypes.StartArgs) types.Context {