5
5
"fmt"
6
6
"strings"
7
7
"sync"
8
- "time"
9
8
10
9
log "github.com/Sirupsen/logrus"
11
10
)
@@ -96,33 +95,34 @@ type diffLines struct {
96
95
}
97
96
98
97
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
108
99
}
109
100
110
101
type commitDiffLoadRequest struct {
111
- * abstractDiffLoadRequest
112
102
commit * Commit
113
103
}
114
104
105
+ func (commitDiffLoadRequest * commitDiffLoadRequest ) diffID () diffID {
106
+ return diffID (commitDiffLoadRequest .commit .oid .String ())
107
+ }
108
+
115
109
type fileDiffLoadRequest struct {
116
- * abstractDiffLoadRequest
117
110
statusType StatusType
118
111
filePath string
119
112
}
120
113
114
+ func (fileDiffLoadRequest * fileDiffLoadRequest ) diffID () diffID {
115
+ return diffID (fileDiffLoadRequest .filePath )
116
+ }
117
+
121
118
type stageDiffLoadRequest struct {
122
- * abstractDiffLoadRequest
123
119
statusType StatusType
124
120
}
125
121
122
+ func (stageDiffLoadRequest * stageDiffLoadRequest ) diffID () diffID {
123
+ return diffID (fmt .Sprintf ("%v files" , strings .ToLower (StatusTypeDisplayName (stageDiffLoadRequest .statusType ))))
124
+ }
125
+
126
126
type diffID string
127
127
128
128
// DiffView contains all state for the diff view
@@ -131,16 +131,15 @@ type DiffView struct {
131
131
channels Channels
132
132
repoData RepoData
133
133
config Config
134
+ lastRequestedDiff diffID
134
135
activeDiff diffID
135
- activeDiffTime time.Time
136
136
diffs map [diffID ]* diffLines
137
137
activeViewPos ViewPos
138
138
lastViewDimension ViewDimension
139
139
handlers map [ActionType ]diffViewHandler
140
140
active bool
141
141
viewSearch * ViewSearch
142
142
diffLoadRequestCh chan diffLoadRequest
143
- diffLoading bool
144
143
lock sync.Mutex
145
144
}
146
145
@@ -194,7 +193,7 @@ func (diffView *DiffView) Render(win RenderWindow) (err error) {
194
193
195
194
if diffView .activeDiff == "" {
196
195
return diffView .renderEmptyView (win , "No diff to display" )
197
- } else if diffView .diffLoading {
196
+ } else if diffView .activeDiff != diffView . lastRequestedDiff {
198
197
return diffView .renderEmptyView (win , "Loading diff..." )
199
198
}
200
199
@@ -352,9 +351,10 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
352
351
diffID := diffID (commit .oid .String ())
353
352
354
353
diffView .lock .Lock ()
354
+ diffView .lastRequestedDiff = diffID
355
+
355
356
if diffLines , ok := diffView .diffs [diffID ]; ok {
356
357
diffView .activeDiff = diffID
357
- diffView .activeDiffTime = time .Now ()
358
358
diffView .activeViewPos = diffLines .viewPos
359
359
diffView .channels .UpdateDisplay ()
360
360
diffView .lock .Unlock ()
@@ -364,9 +364,6 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
364
364
diffView .lock .Unlock ()
365
365
366
366
diffView .addDiffLoadRequest (& commitDiffLoadRequest {
367
- abstractDiffLoadRequest : & abstractDiffLoadRequest {
368
- requestTime : time .Now (),
369
- },
370
367
commit : commit ,
371
368
})
372
369
@@ -377,25 +374,31 @@ func (diffView *DiffView) OnCommitSelected(commit *Commit) (err error) {
377
374
func (diffView * DiffView ) OnFileSelected (statusType StatusType , filePath string ) {
378
375
log .Debugf ("DiffView loading diff for file %v" , filePath )
379
376
380
- diffView .addDiffLoadRequest (& fileDiffLoadRequest {
381
- abstractDiffLoadRequest : & abstractDiffLoadRequest {
382
- requestTime : time .Now (),
383
- },
377
+ request := & fileDiffLoadRequest {
384
378
statusType : statusType ,
385
379
filePath : filePath ,
386
- })
380
+ }
381
+
382
+ diffView .lock .Lock ()
383
+ diffView .lastRequestedDiff = request .diffID ()
384
+ diffView .lock .Unlock ()
385
+
386
+ diffView .addDiffLoadRequest (request )
387
387
}
388
388
389
389
// OnStageGroupSelected does nothing
390
390
func (diffView * DiffView ) OnStageGroupSelected (statusType StatusType ) {
391
391
log .Debugf ("DiffView loading diff for stage %v" , statusType )
392
392
393
- diffView .addDiffLoadRequest (& stageDiffLoadRequest {
394
- abstractDiffLoadRequest : & abstractDiffLoadRequest {
395
- requestTime : time .Now (),
396
- },
393
+ request := & stageDiffLoadRequest {
397
394
statusType : statusType ,
398
- })
395
+ }
396
+
397
+ diffView .lock .Lock ()
398
+ diffView .lastRequestedDiff = request .diffID ()
399
+ diffView .lock .Unlock ()
400
+
401
+ diffView .addDiffLoadRequest (request )
399
402
}
400
403
401
404
// OnNoEntrySelected clears the diff view
@@ -417,16 +420,9 @@ func (diffView *DiffView) addDiffLoadRequest(request diffLoadRequest) {
417
420
418
421
func (diffView * DiffView ) processDiffLoadRequests () {
419
422
for request := range diffView .diffLoadRequestCh {
420
- if request = diffView .retrieveLatestDiffLoadRequest (request ); request == nil {
421
- continue
422
- }
423
-
423
+ request = diffView .retrieveLatestDiffLoadRequest (request )
424
424
var err error
425
425
426
- diffView .lock .Lock ()
427
- diffView .diffLoading = true
428
- diffView .lock .Unlock ()
429
-
430
426
switch req := request .(type ) {
431
427
case * commitDiffLoadRequest :
432
428
err = diffView .loadCommitDiffAndMakeActive (req )
@@ -438,10 +434,6 @@ func (diffView *DiffView) processDiffLoadRequests() {
438
434
log .Errorf ("Unknown diff load request type: %T" , request )
439
435
}
440
436
441
- diffView .lock .Lock ()
442
- diffView .diffLoading = false
443
- diffView .lock .Unlock ()
444
-
445
437
if err != nil {
446
438
diffView .channels .ReportError (err )
447
439
}
@@ -461,28 +453,19 @@ func (diffView *DiffView) retrieveLatestDiffLoadRequest(request diffLoadRequest)
461
453
}
462
454
}
463
455
464
- diffView .lock .Lock ()
465
- activeDiffTime := diffView .activeDiffTime
466
- diffView .lock .Unlock ()
467
-
468
- if activeDiffTime .After (request .diffLoadRequestTime ()) {
469
- return nil
470
- }
471
-
472
456
return request
473
457
}
474
458
475
459
func (diffView * DiffView ) loadCommitDiffAndMakeActive (request * commitDiffLoadRequest ) (err error ) {
476
460
commit := request .commit
477
- diffID := diffID (commit .oid .String ())
478
461
479
462
lines , err := diffView .generateDiffLinesForCommit (commit )
480
463
if err != nil {
481
464
log .Errorf ("Unable to store commit diff: %v" , err )
482
465
return
483
466
}
484
467
485
- diffView .storeDiff (diffID , lines )
468
+ diffView .storeDiff (request . diffID () , lines )
486
469
487
470
return
488
471
}
@@ -503,7 +486,7 @@ func (diffView *DiffView) loadFileDiffAndMakeActive(request *fileDiffLoadRequest
503
486
return
504
487
}
505
488
506
- diffView .storeDiff (diffID (filePath ), lines )
489
+ diffView .storeDiff (request . diffID (), lines )
507
490
508
491
return
509
492
}
@@ -523,22 +506,26 @@ func (diffView *DiffView) loadStageDiffAndMakeActive(request *stageDiffLoadReque
523
506
return
524
507
}
525
508
526
- id := fmt .Sprintf ("%v files" , strings .ToLower (StatusTypeDisplayName (statusType )))
527
- diffView .storeDiff (diffID (id ), lines )
509
+ diffView .storeDiff (request .diffID (), lines )
528
510
529
511
return
530
512
}
531
513
532
514
func (diffView * DiffView ) storeDiff (diffID diffID , lines []* diffLineData ) {
515
+ diffView .lock .Lock ()
516
+ defer diffView .lock .Unlock ()
517
+
533
518
diffLines := & diffLines {
534
519
lines : lines ,
535
520
viewPos : NewViewPosition (),
536
521
}
537
522
538
- diffView .lock .Lock ()
539
- defer diffView .lock .Unlock ()
540
-
541
523
diffView .diffs [diffID ] = diffLines
524
+
525
+ if diffID != diffView .lastRequestedDiff {
526
+ return
527
+ }
528
+
542
529
diffView .activeDiff = diffID
543
530
diffView .activeViewPos = diffLines .viewPos
544
531
0 commit comments