diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index bee62eb49b9..88682873845 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,54 @@ 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, ".") + // navigate to the leaves in old and new config + for _, fieldName := range fieldNames { + old = old.FieldByName(fieldName) + new = new.FieldByName(fieldName) + } + // if the value has changed, ... + if !old.Equal(new) { + // ... convert the field names to the user-facing names by + // lower-casing the first letter, ... + userFacingName := strings.Join(lo.Map(fieldNames, func(f string, _ int) string { + return strings.ToLower(f[:1]) + f[1:] + }), ".") + // ... and append it to the list of changed configs + changedConfigs = append(changedConfigs, userFacingName) + } + } + + 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 296239ddecd..59ba91ba22a 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.",