From 57de11b70929a92814cbb5ea8eb5161d32334aa9 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Sun, 4 Aug 2024 15:09:38 +0200 Subject: [PATCH] Show a confirmation when changing a config that can't be auto-reloaded --- pkg/gui/gui.go | 56 +++++++++++++++++++++++++++++++++++++++++++++ pkg/i18n/english.go | 8 +++++++ 2 files changed, 64 insertions(+) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 9d5aad97a..c26774fd0 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -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 { diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index f2503e2e6..f4520a3ee 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -225,6 +225,8 @@ type TranslationSet struct { MergeToolPrompt string IntroPopupMessage string DeprecatedEditConfigWarning string + NonReloadableConfigWarningTitle string + NonReloadableConfigWarning string GitconfigParseErr string EditFile string EditFileTooltip string @@ -985,6 +987,10 @@ for up-to-date information how to configure your editor. ` +const englishNonReloadableConfigWarning = `The following config settings were changed, but the change doesn't take effect immediately. Please quit and restart lazygit for changes to take effect: + +{{configs}}` + // exporting this so we can use it in tests func EnglishTranslationSet() *TranslationSet { return &TranslationSet{ @@ -1199,6 +1205,8 @@ func EnglishTranslationSet() *TranslationSet { MergeToolPrompt: "Are you sure you want to open `git mergetool`?", IntroPopupMessage: englishIntroPopupMessage, DeprecatedEditConfigWarning: englishDeprecatedEditConfigWarning, + NonReloadableConfigWarningTitle: "Config changed", + NonReloadableConfigWarning: englishNonReloadableConfigWarning, GitconfigParseErr: `Gogit failed to parse your gitconfig file due to the presence of unquoted '\' characters. Removing these should fix the issue.`, EditFile: `Edit file`, EditFileTooltip: "Open file in external editor.",