diff options
-rw-r--r-- | cmd/grv/config.go | 7 | ||||
-rw-r--r-- | cmd/grv/grv.go | 19 | ||||
-rw-r--r-- | cmd/grv/repo_data_loader.go | 39 | ||||
-rw-r--r-- | cmd/grv/ui.go | 12 | ||||
-rw-r--r-- | doc/documentation.md | 19 |
5 files changed, 66 insertions, 30 deletions
diff --git a/cmd/grv/config.go b/cmd/grv/config.go index b9702ba..577e106 100644 --- a/cmd/grv/config.go +++ b/cmd/grv/config.go @@ -32,6 +32,7 @@ const ( cfCommitGraphDefaultValue = false cfConfirmCheckoutDefaultValue = true cfPromptHistorySizeDefaultValue = 1000 + cfGitBinaryFilePathDefaultValue = "" cfAllView = "All" cfMainView = "MainView" @@ -68,6 +69,8 @@ const ( CfConfirmCheckout ConfigVariable = "confirm-checkout" // CfPromptHistorySize stores the maximum number of prompt entries retained CfPromptHistorySize ConfigVariable = "prompt-history-size" + // CfGitBinaryFilePath stores the file path to the git binary + CfGitBinaryFilePath ConfigVariable = "git-binary-file-path" ) var systemColorValues = map[string]SystemColorValue{ @@ -317,6 +320,10 @@ func NewConfiguration(keyBindings KeyBindings, channels Channels) *Configuration validator: promptHistorySizeValidator{}, description: "Maximum number of prompt entries retained", }, + CfGitBinaryFilePath: { + defaultValue: cfGitBinaryFilePathDefaultValue, + description: "File path to git binary. Required only when git binary is not in $PATH", + }, } for _, configVariable := range config.variables { diff --git a/cmd/grv/grv.go b/cmd/grv/grv.go index 447189c..d75cc4b 100644 --- a/cmd/grv/grv.go +++ b/cmd/grv/grv.go @@ -173,8 +173,10 @@ func NewGRV(readOnly bool) *GRV { } channels := grvChannels.Channels() + keyBindings := NewKeyBindingManager() + config := NewConfiguration(keyBindings, channels) - repoDataLoader := NewRepoDataLoader(channels) + repoDataLoader := NewRepoDataLoader(channels, config) repoData := NewRepositoryData(repoDataLoader, channels) var repoController RepoController @@ -185,8 +187,6 @@ func NewGRV(readOnly bool) *GRV { repoController = NewRepoController(repoData, channels) } - keyBindings := NewKeyBindingManager() - config := NewConfiguration(keyBindings, channels) ui := NewNCursesDisplay(channels, config) view := NewView(repoData, repoController, channels, config) @@ -208,6 +208,12 @@ func NewGRV(readOnly bool) *GRV { func (grv *GRV) Initialise(repoPath, workTreePath string) (err error) { log.Info("Initialising GRV") + channels := grv.channels.Channels() + + if configErrors := grv.config.Initialise(); configErrors != nil { + channels.ReportErrors(configErrors) + } + if err = grv.repoInitialiser.CreateRepositoryInstance(repoPath, workTreePath); err != nil { return } @@ -226,13 +232,6 @@ func (grv *GRV) Initialise(repoPath, workTreePath string) (err error) { return } - if configErrors := grv.config.Initialise(); configErrors != nil { - for _, configError := range configErrors { - grv.channels.errorCh <- configError - } - } - - channels := grv.channels.Channels() InitReadLine(channels, grv.config) return diff --git a/cmd/grv/repo_data_loader.go b/cmd/grv/repo_data_loader.go index 585540d..7a5844e 100644 --- a/cmd/grv/repo_data_loader.go +++ b/cmd/grv/repo_data_loader.go @@ -36,10 +36,12 @@ type instanceCache struct { // RepoDataLoader handles loading data from the repository type RepoDataLoader struct { - repo *git.Repository - cache *instanceCache - channels Channels - diffErrorPresent bool + repo *git.Repository + cache *instanceCache + channels Channels + config Config + diffErrorPresent bool + gitBinaryConfirmed bool } // Oid is reference to a git object @@ -600,10 +602,11 @@ func (cache *instanceCache) getCachedOid(oidStr string) (oid *Oid, exists bool) } // NewRepoDataLoader creates a new instance -func NewRepoDataLoader(channels Channels) *RepoDataLoader { +func NewRepoDataLoader(channels Channels, config Config) *RepoDataLoader { return &RepoDataLoader{ cache: newInstanceCache(), channels: channels, + config: config, } } @@ -1140,14 +1143,14 @@ const ( func (repoDataLoader *RepoDataLoader) generateCommitDiffUsingCLI(commit *Commit) (diff *Diff, err error) { log.Debugf("Attempting to load diff using cli for commit: %v", commit.oid.String()) - gitCommand := []string{"git", "show", "--encoding=UTF8", "--pretty=oneline", "--root", "--patch-with-stat", "--no-color", commit.oid.String()} + gitCommand := []string{"show", "--encoding=UTF8", "--pretty=oneline", "--root", "--patch-with-stat", "--no-color", commit.oid.String()} return repoDataLoader.runGitCLIDiff(gitCommand, dtCommit) } func (repoDataLoader *RepoDataLoader) generateFileDiffUsingCLI(statusType StatusType, path string) (diff *Diff, err error) { log.Debugf("Attempting to load diff using cli for StatusType: %v and file: %v", StatusTypeDisplayName(statusType), path) - gitCommand := []string{"git", "diff"} + gitCommand := []string{"diff"} if statusType == StStaged { gitCommand = append(gitCommand, "--cached") @@ -1163,7 +1166,7 @@ func (repoDataLoader *RepoDataLoader) generateFileDiffUsingCLI(statusType Status func (repoDataLoader *RepoDataLoader) generateStageDiffUsingCLI(statusType StatusType) (diff *Diff, err error) { log.Debugf("Attempting to load diff using cli for StatusType: %v", StatusTypeDisplayName(statusType)) - gitCommand := []string{"git", "diff"} + gitCommand := []string{"diff"} if statusType == StStaged { gitCommand = append(gitCommand, "--cached") @@ -1176,10 +1179,28 @@ func (repoDataLoader *RepoDataLoader) generateStageDiffUsingCLI(statusType Statu return repoDataLoader.runGitCLIDiff(gitCommand, dtStage) } +func (repoDataLoader *RepoDataLoader) gitBinary() string { + if gitBinary := repoDataLoader.config.GetString(CfGitBinaryFilePath); gitBinary != "" { + return gitBinary + } + + return "git" +} + func (repoDataLoader *RepoDataLoader) runGitCLIDiff(gitCommand []string, diffType diffType) (diff *Diff, err error) { diff = &Diff{} - cmd := exec.Command(gitCommand[0], gitCommand[1:]...) + if !repoDataLoader.gitBinaryConfirmed { + if exec.Command(repoDataLoader.gitBinary(), "version").Run() == nil { + repoDataLoader.gitBinaryConfirmed = true + } else { + err = fmt.Errorf("Unable to successfully call git binary. "+ + "If git is not in $PATH then please set the config variable %v", CfGitBinaryFilePath) + return + } + } + + cmd := exec.Command(repoDataLoader.gitBinary(), gitCommand...) cmd.Env = repoDataLoader.GenerateGitCommandEnvironment() var stdout, stderr bytes.Buffer diff --git a/cmd/grv/ui.go b/cmd/grv/ui.go index 05dc978..e896668 100644 --- a/cmd/grv/ui.go +++ b/cmd/grv/ui.go @@ -266,6 +266,10 @@ func (ui *NCursesUI) initialiseNCurses() (err error) { gc.Raw(true) gc.MouseInterval(0) + if ui.config.GetBool(CfMouse) { + ui.toggleMouse() + } + if gc.Cursor(0) != nil { log.Debugf("Unable to hide cursor") } @@ -649,13 +653,17 @@ func (ui *NCursesUI) onConfigVariableChange(configVariable ConfigVariable) { theme := ui.config.GetTheme() ui.initialiseColorPairsFromTheme(theme) case CfMouse: - log.Infof("Toggling mouse enabled") - gc.MouseMask(ui.mouseMask, &ui.mouseMask) + ui.toggleMouse() default: log.Warn("Received notification for variable I didn't register for: %v", configVariable) } } +func (ui *NCursesUI) toggleMouse() { + log.Infof("Toggling mouse enabled") + gc.MouseMask(ui.mouseMask, &ui.mouseMask) +} + func (ui *NCursesUI) initialiseColorPairsFromTheme(theme Theme) { defaultComponent := theme.GetComponent(CmpAllviewDefault) fgDefault := ui.getNCursesColor(defaultComponent.fgcolor) diff --git a/doc/documentation.md b/doc/documentation.md index 2ba2327..e8cc71b 100644 --- a/doc/documentation.md +++ b/doc/documentation.md @@ -166,15 +166,16 @@ Configuration variables allow features to be enabled, disabled and configured. They are specified using the set command in the grvrc file or at the command prompt ``` - Variable | Type | Default Value | Description - --------------------+--------+---------------+----------------------------------------------- - commit-graph | bool | false | Commit graph visible - confirm-checkout | bool | true | Confirm before performing git checkout - mouse | bool | false | Mouse support enabled - mouse-scroll-rows | int | 3 | Number of rows scrolled for each mouse event - prompt-history-size | int | 1000 | Maximum number of prompt entries retained - tabwidth | int | 8 | Tab character screen width (minimum value: 1) - theme | string | solarized | The currently active theme + Variable | Type | Default Value | Description + ---------------------+--------+---------------+------------------------------------------------------------------------ + commit-graph | bool | false | Commit graph visible + confirm-checkout | bool | true | Confirm before performing git checkout + git-binary-file-path | string | | File path to git binary. Required only when git binary is not in $PATH + mouse | bool | false | Mouse support enabled + mouse-scroll-rows | int | 3 | Number of rows scrolled for each mouse event + prompt-history-size | int | 1000 | Maximum number of prompt entries retained + tabwidth | int | 8 | Tab character screen width (minimum value: 1) + theme | string | solarized | The currently active theme ``` |