@@ -12,6 +12,9 @@ import { PromiseDelegate } from '@lumino/coreutils';
12
12
import { Message } from '@lumino/messaging' ;
13
13
import { Panel , Widget } from '@lumino/widgets' ;
14
14
import { IDiffEntry } from 'nbdime/lib/diff/diffentries' ;
15
+ import { IMergeDecision } from 'nbdime/lib/merge/decisions' ;
16
+ import { NotebookMergeModel } from 'nbdime/lib/merge/model' ;
17
+ import { NotebookMergeWidget } from 'nbdime/lib/merge/widget' ;
15
18
import { NotebookDiffModel } from 'nbdime/lib/diff/model' ;
16
19
import { CELLDIFF_CLASS , NotebookDiffWidget } from 'nbdime/lib/diff/widget' ;
17
20
import {
@@ -50,6 +53,18 @@ interface INbdimeDiff {
50
53
diff : IDiffEntry [ ] ;
51
54
}
52
55
56
+ interface INbdimeMergeDiff {
57
+ /**
58
+ * Base notebook content
59
+ */
60
+ base : INotebookContent ;
61
+ /**
62
+ * Set of decisions made by comparing
63
+ * reference, challenger, and base notebooks
64
+ */
65
+ merge_decisions : IMergeDecision [ ] ;
66
+ }
67
+
53
68
/**
54
69
* Diff callback to be registered for notebook files.
55
70
*
@@ -142,8 +157,13 @@ export class NotebookDiff
142
157
return this . _isReady ;
143
158
}
144
159
160
+ /**
161
+ * Gets the file contents of a resolved merge conflict,
162
+ * and rejects if unable to retrieve.
163
+ */
145
164
async getResolvedFile ( ) : Promise < string > {
146
- return Promise . resolve ( '' ) ;
165
+ // TODO: Implement
166
+ return Promise . reject ( 'TODO' ) ;
147
167
}
148
168
149
169
/**
@@ -159,6 +179,7 @@ export class NotebookDiff
159
179
160
180
const header = Private . diffHeader (
161
181
this . _model . reference . label ,
182
+ this . _model . base ?. label ,
162
183
this . _model . challenger . label
163
184
) ;
164
185
this . addWidget ( header ) ;
@@ -173,10 +194,16 @@ export class NotebookDiff
173
194
// ENH request content only if it changed
174
195
const referenceContent = await this . _model . reference . content ( ) ;
175
196
const challengerContent = await this . _model . challenger . content ( ) ;
197
+ const baseContent = await this . _model . base ?. content ( ) ;
176
198
177
- const nbdWidget = await this . createDiffView (
199
+ const createView = baseContent
200
+ ? this . createMergeView . bind ( this )
201
+ : this . createDiffView . bind ( this ) ;
202
+
203
+ const nbdWidget = await createView (
178
204
challengerContent ,
179
- referenceContent
205
+ referenceContent ,
206
+ baseContent
180
207
) ;
181
208
182
209
while ( this . _scroller . widgets . length > 0 ) {
@@ -215,6 +242,24 @@ export class NotebookDiff
215
242
return new NotebookDiffWidget ( model , this . _renderMime ) ;
216
243
}
217
244
245
+ protected async createMergeView (
246
+ challengerContent : string ,
247
+ referenceContent : string ,
248
+ baseContent : string
249
+ ) : Promise < NotebookMergeWidget > {
250
+ const data = await requestAPI < INbdimeMergeDiff > ( 'diffnotebook' , 'POST' , {
251
+ currentContent : challengerContent ,
252
+ previousContent : referenceContent ,
253
+ baseContent
254
+ } ) ;
255
+
256
+ const model = new NotebookMergeModel ( data . base , data . merge_decisions ) ;
257
+
258
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
259
+ // @ts -ignore
260
+ return new NotebookMergeWidget ( model , this . _renderMime ) ;
261
+ }
262
+
218
263
/**
219
264
* Handle `'activate-request'` messages.
220
265
*/
@@ -258,14 +303,16 @@ namespace Private {
258
303
/**
259
304
* Create a header widget for the diff view.
260
305
*/
261
- export function diffHeader ( baseLabel : string , remoteLabel : string ) : Widget {
306
+ export function diffHeader ( ... labels : string [ ] ) : Widget {
262
307
const node = document . createElement ( 'div' ) ;
263
308
node . className = 'jp-git-diff-header' ;
264
- node . innerHTML = `<div class="jp-git-diff-banner">
265
- <span>${ baseLabel } </span>
266
- <span class="jp-spacer"></span>
267
- <span>${ remoteLabel } </span>
268
- </div>` ;
309
+ node . innerHTML = `
310
+ <div class="jp-git-diff-banner">
311
+ ${ labels
312
+ . filter ( label => ! ! label )
313
+ . map ( label => `<span>${ label } </span>` )
314
+ . join ( '<span class="jp-spacer"></span>' ) }
315
+ </div>` ;
269
316
270
317
return new Widget ( { node } ) ;
271
318
}
0 commit comments