Skip to content

Commit b934174

Browse files
committed
Fix when diff view shows diff loading
1 parent 33c1a09 commit b934174

File tree

1 file changed

+45
-58
lines changed

1 file changed

+45
-58
lines changed

cmd/grv/diff_view.go

+45-58
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"strings"
77
"sync"
8-
"time"
98

109
log "github.com/Sirupsen/logrus"
1110
)
@@ -96,33 +95,34 @@ type diffLines struct {
9695
}
9796

9897
type diffLoadRequest interface {
99-
diffLoadRequestTime() time.Time
100-
}
101-
102-
type abstractDiffLoadRequest struct {
103-
requestTime time.Time
104-
}
105-
106-
func (request *abstractDiffLoadRequest) diffLoadRequestTime() time.Time {
107-
return request.requestTime
98+
diffID() diffID
10899
}
109100

110101
type commitDiffLoadRequest struct {
111-
*abstractDiffLoadRequest
112102
commit *Commit
113103
}
114104

105+
func (commitDiffLoadRequest *commitDiffLoadRequest) diffID() diffID {
106+
return diffID(commitDiffLoadRequest.commit.oid.String())
107+
}
108+
115109
type fileDiffLoadRequest struct {
116-
*abstractDiffLoadRequest
117110
statusType StatusType
118111
filePath string
119112
}
120113

114+
func (fileDiffLoadRequest *fileDiffLoadRequest) diffID() diffID {
115+
return diffID(fileDiffLoadRequest.filePath)
116+
}
117+
121118
type stageDiffLoadRequest struct {
122-
*abstractDiffLoadRequest
123119
statusType StatusType
124120
}
125121

122+
func (stageDiffLoadRequest *stageDiffLoadRequest) diffID() diffID {
123+
return diffID(fmt.Sprintf("%v files", strings.ToLower(StatusTypeDisplayName(stageDiffLoadRequest.statusType))))
124+
}
125+
126126
type diffID string
127127

128128
// DiffView contains all state for the diff view
@@ -131,16 +131,15 @@ type DiffView struct {
131131
channels Channels
132132
repoData RepoData
133133
config Config
134+
lastRequestedDiff diffID
134135
activeDiff diffID
135-
activeDiffTime time.Time
136136
diffs map[diffID]*diffLines
137137
activeViewPos ViewPos
138138
lastViewDimension ViewDimension
139139
handlers map[ActionType]diffViewHandler
140140
active bool
141141
viewSearch *ViewSearch
142142
diffLoadRequestCh chan diffLoadRequest
143-
diffLoading bool
144143
lock sync.Mutex
145144
}
146145

@@ -194,7 +193,7 @@ func (diffView *DiffView) Render(win RenderWindow) (err error) {
194193

195194
if diffView.activeDiff == "" {
196195
return diffView.renderEmptyView(win, "No diff to display")
197-
} else if diffView.diffLoading {
196+
} else if diffView.activeDiff != diffView.lastRequestedDiff {
198197
return diffView.renderEmptyView(win, "Loading diff...")
199198
}
200199

@@ -352,9 +351,10 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
352351
diffID := diffID(commit.oid.String())
353352

354353
diffView.lock.Lock()
354+
diffView.lastRequestedDiff = diffID
355+
355356
if diffLines, ok := diffView.diffs[diffID]; ok {
356357
diffView.activeDiff = diffID
357-
diffView.activeDiffTime = time.Now()
358358
diffView.activeViewPos = diffLines.viewPos
359359
diffView.channels.UpdateDisplay()
360360
diffView.lock.Unlock()
@@ -364,9 +364,6 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
364364
diffView.lock.Unlock()
365365

366366
diffView.addDiffLoadRequest(&commitDiffLoadRequest{
367-
abstractDiffLoadRequest: &abstractDiffLoadRequest{
368-
requestTime: time.Now(),
369-
},
370367
commit: commit,
371368
})
372369

@@ -377,25 +374,31 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
377374
func (diffView *DiffView) OnFileSelected(statusType StatusType, filePath string) {
378375
log.Debugf("DiffView loading diff for file %v", filePath)
379376

380-
diffView.addDiffLoadRequest(&fileDiffLoadRequest{
381-
abstractDiffLoadRequest: &abstractDiffLoadRequest{
382-
requestTime: time.Now(),
383-
},
377+
request := &fileDiffLoadRequest{
384378
statusType: statusType,
385379
filePath: filePath,
386-
})
380+
}
381+
382+
diffView.lock.Lock()
383+
diffView.lastRequestedDiff = request.diffID()
384+
diffView.lock.Unlock()
385+
386+
diffView.addDiffLoadRequest(request)
387387
}
388388

389389
// OnStageGroupSelected does nothing
390390
func (diffView *DiffView) OnStageGroupSelected(statusType StatusType) {
391391
log.Debugf("DiffView loading diff for stage %v", statusType)
392392

393-
diffView.addDiffLoadRequest(&stageDiffLoadRequest{
394-
abstractDiffLoadRequest: &abstractDiffLoadRequest{
395-
requestTime: time.Now(),
396-
},
393+
request := &stageDiffLoadRequest{
397394
statusType: statusType,
398-
})
395+
}
396+
397+
diffView.lock.Lock()
398+
diffView.lastRequestedDiff = request.diffID()
399+
diffView.lock.Unlock()
400+
401+
diffView.addDiffLoadRequest(request)
399402
}
400403

401404
// OnNoEntrySelected clears the diff view
@@ -417,16 +420,9 @@ func (diffView *DiffView) addDiffLoadRequest(request diffLoadRequest) {
417420

418421
func (diffView *DiffView) processDiffLoadRequests() {
419422
for request := range diffView.diffLoadRequestCh {
420-
if request = diffView.retrieveLatestDiffLoadRequest(request); request == nil {
421-
continue
422-
}
423-
423+
request = diffView.retrieveLatestDiffLoadRequest(request)
424424
var err error
425425

426-
diffView.lock.Lock()
427-
diffView.diffLoading = true
428-
diffView.lock.Unlock()
429-
430426
switch req := request.(type) {
431427
case *commitDiffLoadRequest:
432428
err = diffView.loadCommitDiffAndMakeActive(req)
@@ -438,10 +434,6 @@ func (diffView *DiffView) processDiffLoadRequests() {
438434
log.Errorf("Unknown diff load request type: %T", request)
439435
}
440436

441-
diffView.lock.Lock()
442-
diffView.diffLoading = false
443-
diffView.lock.Unlock()
444-
445437
if err != nil {
446438
diffView.channels.ReportError(err)
447439
}
@@ -461,28 +453,19 @@ func (diffView *DiffView) retrieveLatestDiffLoadRequest(request diffLoadRequest)
461453
}
462454
}
463455

464-
diffView.lock.Lock()
465-
activeDiffTime := diffView.activeDiffTime
466-
diffView.lock.Unlock()
467-
468-
if activeDiffTime.After(request.diffLoadRequestTime()) {
469-
return nil
470-
}
471-
472456
return request
473457
}
474458

475459
func (diffView *DiffView) loadCommitDiffAndMakeActive(request *commitDiffLoadRequest) (err error) {
476460
commit := request.commit
477-
diffID := diffID(commit.oid.String())
478461

479462
lines, err := diffView.generateDiffLinesForCommit(commit)
480463
if err != nil {
481464
log.Errorf("Unable to store commit diff: %v", err)
482465
return
483466
}
484467

485-
diffView.storeDiff(diffID, lines)
468+
diffView.storeDiff(request.diffID(), lines)
486469

487470
return
488471
}
@@ -503,7 +486,7 @@ func (diffView *DiffView) loadFileDiffAndMakeActive(request *fileDiffLoadRequest
503486
return
504487
}
505488

506-
diffView.storeDiff(diffID(filePath), lines)
489+
diffView.storeDiff(request.diffID(), lines)
507490

508491
return
509492
}
@@ -523,22 +506,26 @@ func (diffView *DiffView) loadStageDiffAndMakeActive(request *stageDiffLoadReque
523506
return
524507
}
525508

526-
id := fmt.Sprintf("%v files", strings.ToLower(StatusTypeDisplayName(statusType)))
527-
diffView.storeDiff(diffID(id), lines)
509+
diffView.storeDiff(request.diffID(), lines)
528510

529511
return
530512
}
531513

532514
func (diffView *DiffView) storeDiff(diffID diffID, lines []*diffLineData) {
515+
diffView.lock.Lock()
516+
defer diffView.lock.Unlock()
517+
533518
diffLines := &diffLines{
534519
lines: lines,
535520
viewPos: NewViewPosition(),
536521
}
537522

538-
diffView.lock.Lock()
539-
defer diffView.lock.Unlock()
540-
541523
diffView.diffs[diffID] = diffLines
524+
525+
if diffID != diffView.lastRequestedDiff {
526+
return
527+
}
528+
542529
diffView.activeDiff = diffID
543530
diffView.activeViewPos = diffLines.viewPos
544531

0 commit comments

Comments
 (0)