mirror of
				https://github.com/jesseduffield/lazygit.git
				synced 2025-10-30 23:57:43 +02:00 
			
		
		
		
	Show a confirmation when changing a config that can't be auto-reloaded
This commit is contained in:
		| @@ -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 { | ||||
|   | ||||
| @@ -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.", | ||||
|   | ||||
		Reference in New Issue
	
	Block a user