summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Burke <rich.g.burke@gmail.com>2019-01-07 22:45:05 +0000
committerRichard Burke <rich.g.burke@gmail.com>2019-01-07 22:45:05 +0000
commit66302c58b1510310493389938a844b538c555b7a (patch)
tree6e4fd6943d40fdad57e06602061915addb5c206c
parentf9c8df8adfa7ff59e16ae6423cdd8e2bb619f3de (diff)
Show diffs for unmerged files
Also handle case where diff lines is empty
-rw-r--r--cmd/grv/diff_view.go4
-rw-r--r--cmd/grv/repo_data_loader.go56
2 files changed, 46 insertions, 14 deletions
diff --git a/cmd/grv/diff_view.go b/cmd/grv/diff_view.go
index d2c7ef2..cc4affe 100644
--- a/cmd/grv/diff_view.go
+++ b/cmd/grv/diff_view.go
@@ -721,6 +721,10 @@ func selectDiffLine(diffView *DiffView, action Action) (err error) {
}
lineIndex := diffView.activeViewPos.ActiveRowIndex()
+ if lineIndex >= diffView.rows() {
+ return
+ }
+
diffLine := diffLines.lines[lineIndex]
if diffLine.lineType != dltDiffStatsFile {
diff --git a/cmd/grv/repo_data_loader.go b/cmd/grv/repo_data_loader.go
index 1d54dbd..d5dab88 100644
--- a/cmd/grv/repo_data_loader.go
+++ b/cmd/grv/repo_data_loader.go
@@ -1177,12 +1177,16 @@ func (repoDataLoader *RepoDataLoader) DiffStage(statusType StatusType) (diff *Di
diff = &Diff{}
rawDiff, err := repoDataLoader.generateRawDiff(statusType)
+ if err != nil {
+ if diffErrorRegex.MatchString(err.Error()) {
+ log.Infof("Falling back to git cli after encountering error: %v", err)
+ repoDataLoader.diffErrorPresent = true
+ return repoDataLoader.generateStageDiffUsingCLI(statusType)
+ }
- if err != nil && diffErrorRegex.MatchString(err.Error()) {
- log.Infof("Falling back to git cli after encountering error: %v", err)
- repoDataLoader.diffErrorPresent = true
- return repoDataLoader.generateStageDiffUsingCLI(statusType)
- } else if err != nil || rawDiff == nil {
+ return
+ } else if rawDiff == nil {
+ err = fmt.Errorf("Failed to generate diff for %v files", StatusTypeDisplayName(statusType))
return
}
defer rawDiff.Free()
@@ -1201,11 +1205,16 @@ func (repoDataLoader *RepoDataLoader) DiffFile(statusType StatusType, path strin
diff = &Diff{}
rawDiff, err := repoDataLoader.generateRawDiff(statusType)
- if err != nil && diffErrorRegex.MatchString(err.Error()) {
- log.Infof("Falling back to git cli after encountering error: %v", err)
- repoDataLoader.diffErrorPresent = true
- return repoDataLoader.generateFileDiffUsingCLI(statusType, path)
- } else if err != nil || rawDiff == nil {
+ if err != nil {
+ if diffErrorRegex.MatchString(err.Error()) {
+ log.Infof("Falling back to git cli after encountering error: %v", err)
+ repoDataLoader.diffErrorPresent = true
+ return repoDataLoader.generateFileDiffUsingCLI(statusType, path)
+ }
+
+ return
+ } else if rawDiff == nil {
+ err = fmt.Errorf("Failed to generate diff for %v file %v", StatusTypeDisplayName(statusType), path)
return
}
defer rawDiff.Free()
@@ -1249,13 +1258,12 @@ func (repoDataLoader *RepoDataLoader) DiffFile(statusType StatusType, path strin
func (repoDataLoader *RepoDataLoader) generateRawDiff(statusType StatusType) (rawDiff *git.Diff, err error) {
var index *git.Index
var options git.DiffOptions
+ var head Ref
+ var commit *Commit
+ var tree *git.Tree
switch statusType {
case StStaged:
- var head Ref
- var commit *Commit
- var tree *git.Tree
-
if head, err = repoDataLoader.Head(); err != nil {
return
}
@@ -1291,6 +1299,26 @@ func (repoDataLoader *RepoDataLoader) generateRawDiff(statusType StatusType) (ra
if rawDiff, err = repoDataLoader.repo.DiffIndexToWorkdir(index, &options); err != nil {
return
}
+ case StConflicted:
+ if head, err = repoDataLoader.Head(); err != nil {
+ return
+ }
+
+ if commit, err = repoDataLoader.Commit(head.Oid()); err != nil {
+ return
+ }
+
+ if tree, err = commit.commit.Tree(); err != nil {
+ return
+ }
+
+ if options, err = git.DefaultDiffOptions(); err != nil {
+ return
+ }
+
+ if rawDiff, err = repoDataLoader.repo.DiffTreeToWorkdir(tree, &options); err != nil {
+ return
+ }
}
return