Skip to content

Commit 2f01af4

Browse files
authored
Non-sticky range selection diff (#3869)
- **PR Description** When selecting a range of commits, show the combined diff for them. Along the way, fix a few minor issues with the current implementation of diffing mode; see the individual commit messages for details. Fixes #3862. - **Please check if the PR fulfills these requirements** * [x] Cheatsheets are up-to-date (run `go generate ./...`) * [x] Code has been formatted (see [here](https://github.com/jesseduffield/lazygit/blob/master/CONTRIBUTING.md#code-formatting)) * [x] Tests have been added/updated (see [here](https://github.com/jesseduffield/lazygit/blob/master/pkg/integration/README.md) for the integration test guide) * [x] Text is internationalised (see [here](https://github.com/jesseduffield/lazygit/blob/master/CONTRIBUTING.md#internationalisation)) * [ ] If a new UserConfig entry was added, make sure it can be hot-reloaded (see [here](https://github.com/jesseduffield/lazygit/blob/master/docs/dev/Codebase_Guide.md#using-userconfig)) * [ ] Docs have been updated if necessary * [x] You've read through your own file changes for silly mistakes etc
2 parents 05ae080 + 32fef9a commit 2f01af4

26 files changed

+270
-94
lines changed

pkg/commands/models/branch.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ func (b *Branch) RefName() string {
5353
return b.Name
5454
}
5555

56+
func (b *Branch) ShortRefName() string {
57+
return b.RefName()
58+
}
59+
5660
func (b *Branch) ParentRefName() string {
5761
return b.RefName() + "^"
5862
}

pkg/commands/models/commit.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ func (c *Commit) RefName() string {
7070
return c.Hash
7171
}
7272

73+
func (c *Commit) ShortRefName() string {
74+
return c.Hash[:7]
75+
}
76+
7377
func (c *Commit) ParentRefName() string {
7478
if c.IsFirstCommit() {
7579
return EmptyTreeCommitHash

pkg/commands/models/remote_branch.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ func (r *RemoteBranch) RefName() string {
1818
return r.FullName()
1919
}
2020

21+
func (r *RemoteBranch) ShortRefName() string {
22+
return r.RefName()
23+
}
24+
2125
func (r *RemoteBranch) ParentRefName() string {
2226
return r.RefName() + "^"
2327
}

pkg/commands/models/stash_entry.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ func (s *StashEntry) RefName() string {
1717
return fmt.Sprintf("stash@{%d}", s.Index)
1818
}
1919

20+
func (s *StashEntry) ShortRefName() string {
21+
return s.RefName()
22+
}
23+
2024
func (s *StashEntry) ParentRefName() string {
2125
return s.RefName() + "^"
2226
}

pkg/commands/models/tag.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ func (t *Tag) RefName() string {
1616
return t.Name
1717
}
1818

19+
func (t *Tag) ShortRefName() string {
20+
return t.RefName()
21+
}
22+
1923
func (t *Tag) ParentRefName() string {
2024
return t.RefName() + "^"
2125
}

pkg/gui/context/commit_files_context.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package context
22

33
import (
4+
"fmt"
5+
46
"github.com/jesseduffield/gocui"
57
"github.com/jesseduffield/lazygit/pkg/commands/models"
68
"github.com/jesseduffield/lazygit/pkg/gui/filetree"
@@ -75,6 +77,25 @@ func (self *CommitFilesContext) GetDiffTerminals() []string {
7577
return []string{self.GetRef().RefName()}
7678
}
7779

80+
func (self *CommitFilesContext) GetFromAndToForDiff() (string, string) {
81+
if refs := self.GetRefRange(); refs != nil {
82+
return refs.From.ParentRefName(), refs.To.RefName()
83+
}
84+
ref := self.GetRef()
85+
return ref.ParentRefName(), ref.RefName()
86+
}
87+
7888
func (self *CommitFilesContext) ModelSearchResults(searchStr string, caseSensitive bool) []gocui.SearchPosition {
7989
return nil
8090
}
91+
92+
func (self *CommitFilesContext) ReInit(ref types.Ref, refRange *types.RefRange) {
93+
self.SetRef(ref)
94+
self.SetRefRange(refRange)
95+
if refRange != nil {
96+
self.SetTitleRef(fmt.Sprintf("%s-%s", refRange.From.ShortRefName(), refRange.To.ShortRefName()))
97+
} else {
98+
self.SetTitleRef(ref.Description())
99+
}
100+
self.GetView().Title = self.Title()
101+
}

pkg/gui/context/local_commits_context.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,19 @@ func (self *LocalCommitsContext) GetSelectedRef() types.Ref {
128128
return commit
129129
}
130130

131+
func (self *LocalCommitsContext) GetSelectedRefRangeForDiffFiles() *types.RefRange {
132+
commits, startIdx, endIdx := self.GetSelectedItems()
133+
if commits == nil || startIdx == endIdx {
134+
return nil
135+
}
136+
from := commits[len(commits)-1]
137+
to := commits[0]
138+
if from.IsTODO() || to.IsTODO() {
139+
return nil
140+
}
141+
return &types.RefRange{From: from, To: to}
142+
}
143+
131144
// Returns the commit hash of the selected commit, or an empty string if no
132145
// commit is selected
133146
func (self *LocalCommitsContext) GetSelectedCommitHash() string {

pkg/gui/context/reflog_commits_context.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@ func (self *ReflogCommitsContext) GetSelectedRef() types.Ref {
7171
return commit
7272
}
7373

74+
func (self *ReflogCommitsContext) GetSelectedRefRangeForDiffFiles() *types.RefRange {
75+
// It doesn't make much sense to show a range diff between two reflog entries.
76+
return nil
77+
}
78+
7479
func (self *ReflogCommitsContext) GetCommits() []*models.Commit {
7580
return self.getModel()
7681
}

pkg/gui/context/stash_context.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ func (self *StashContext) GetSelectedRef() types.Ref {
6161
return stash
6262
}
6363

64+
func (self *StashContext) GetSelectedRefRangeForDiffFiles() *types.RefRange {
65+
// It doesn't make much sense to show a range diff between two stash entries.
66+
return nil
67+
}
68+
6469
func (self *StashContext) GetDiffTerminals() []string {
6570
itemId := self.GetSelectedItemId()
6671

pkg/gui/context/sub_commits_context.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,19 @@ func (self *SubCommitsContext) GetSelectedRef() types.Ref {
186186
return commit
187187
}
188188

189+
func (self *SubCommitsContext) GetSelectedRefRangeForDiffFiles() *types.RefRange {
190+
commits, startIdx, endIdx := self.GetSelectedItems()
191+
if commits == nil || startIdx == endIdx {
192+
return nil
193+
}
194+
from := commits[len(commits)-1]
195+
to := commits[0]
196+
if from.Divergence != to.Divergence {
197+
return nil
198+
}
199+
return &types.RefRange{From: from, To: to}
200+
}
201+
189202
func (self *SubCommitsContext) GetCommits() []*models.Commit {
190203
return self.getModel()
191204
}

0 commit comments

Comments
 (0)