@@ -30,6 +30,7 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
30
30
super ( {
31
31
node : PlainTextDiff . createNode (
32
32
model . reference . label ,
33
+ model . base ?. label ,
33
34
model . challenger . label
34
35
)
35
36
} ) ;
@@ -41,11 +42,13 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
41
42
// Load file content early
42
43
Promise . all ( [
43
44
this . _model . reference . content ( ) ,
44
- this . _model . challenger . content ( )
45
+ this . _model . challenger . content ( ) ,
46
+ this . _model . base ?. content ( )
45
47
] )
46
- . then ( ( [ reference , challenger ] ) => {
48
+ . then ( ( [ reference , challenger , base ] ) => {
47
49
this . _reference = reference ;
48
50
this . _challenger = challenger ;
51
+ this . _base = base ;
49
52
50
53
getReady . resolve ( ) ;
51
54
} )
@@ -70,7 +73,7 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
70
73
this . ready
71
74
. then ( ( ) => {
72
75
if ( this . _challenger !== null && this . _reference !== null ) {
73
- this . createDiffView ( this . _challenger , this . _reference ) ;
76
+ this . createDiffView ( this . _challenger , this . _reference , this . _base ) ;
74
77
}
75
78
} )
76
79
. catch ( reason => {
@@ -105,9 +108,16 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
105
108
this . _challenger = await this . _model . challenger . content ( ) ;
106
109
}
107
110
108
- this . createDiffView ( this . _challenger , this . _reference ) ;
111
+ // Request base content only if base was provided in the model
112
+ this . _base = await this . _model . base ?. content ( ) ;
113
+
114
+ this . createDiffView ( this . _challenger , this . _reference , this . _base ) ;
109
115
this . _challenger = null ;
110
116
this . _reference = null ;
117
+
118
+ // Set to null only if base was provided in the model
119
+ // else leave as undefined
120
+ this . _base = ! ! this . _model . base && null ;
111
121
} catch ( reason ) {
112
122
this . showError ( reason ) ;
113
123
}
@@ -116,17 +126,15 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
116
126
/**
117
127
* Create wrapper node
118
128
*/
119
- protected static createNode (
120
- baseLabel : string ,
121
- remoteLabel : string
122
- ) : HTMLElement {
129
+ protected static createNode ( ...labels : string [ ] ) : HTMLElement {
123
130
const head = document . createElement ( 'div' ) ;
124
131
head . className = 'jp-git-diff-root' ;
125
132
head . innerHTML = `
126
133
<div class="jp-git-diff-banner">
127
- <span>${ baseLabel } </span>
128
- <span class="jp-spacer"></span>
129
- <span>${ remoteLabel } </span>
134
+ ${ labels
135
+ . filter ( label => ! ! label )
136
+ . map ( label => `<span>${ label } </span>` )
137
+ . join ( '<span class="jp-spacer"></span>' ) }
130
138
</div>
131
139
<div class="jp-git-PlainText-diff"></div>` ;
132
140
return head ;
@@ -137,19 +145,40 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
137
145
*/
138
146
protected async createDiffView (
139
147
challengerContent : string ,
140
- referenceContent : string
148
+ referenceContent : string ,
149
+ baseContent ?: string
141
150
) : Promise < void > {
142
151
if ( ! this . _mergeView ) {
152
+ // Empty base content ("") can be an edge case.
153
+ const isMergeConflict = baseContent !== undefined ;
154
+
143
155
const mode =
144
156
Mode . findByFileName ( this . _model . filename ) ||
145
157
Mode . findBest ( this . _model . filename ) ;
146
158
147
- this . _mergeView = mergeView ( this . _container , {
159
+ let options : Parameters < typeof mergeView > [ 1 ] = {
148
160
value : challengerContent ,
149
161
orig : referenceContent ,
150
162
mode : mode . mime ,
151
163
...this . getDefaultOptions ( )
152
- } ) as MergeView . MergeViewEditor ;
164
+ } ;
165
+
166
+ // Show three-way diff on merge conflict
167
+ if ( isMergeConflict ) {
168
+ options = {
169
+ ...options ,
170
+ value : baseContent ,
171
+ origRight : referenceContent ,
172
+ origLeft : challengerContent ,
173
+ readOnly : true ,
174
+ revertButtons : false
175
+ } ;
176
+ }
177
+
178
+ this . _mergeView = mergeView (
179
+ this . _container ,
180
+ options
181
+ ) as MergeView . MergeViewEditor ;
153
182
}
154
183
155
184
return Promise . resolve ( ) ;
@@ -192,4 +221,5 @@ export class PlainTextDiff extends Widget implements Git.Diff.IDiffWidget {
192
221
193
222
private _reference : string | null = null ;
194
223
private _challenger : string | null = null ;
224
+ private _base ?: string | null ;
195
225
}
0 commit comments