Skip to content

Commit e88c040

Browse files
committed
ignore transient metadata in diff editor.
1 parent 7c986e9 commit e88c040

10 files changed

Lines changed: 57 additions & 74 deletions

File tree

src/vs/workbench/api/common/extHostNotebook.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,9 @@ export class ExtHostNotebookDocument extends Disposable {
428428
this._emitter.emitCellLanguageChange(event);
429429
}
430430

431-
private _changeCellMetadata(index: number, newMetadata: NotebookCellMetadata): void {
431+
private _changeCellMetadata(index: number, newMetadata: NotebookCellMetadata | undefined): void {
432432
const cell = this._cells[index];
433-
cell.setMetadata(newMetadata);
433+
cell.setMetadata(newMetadata || {});
434434
const event: vscode.NotebookCellMetadataChangeEvent = { document: this.notebookDocument, cell: cell.cell };
435435
this._emitter.emitCellMetadataChange(event);
436436
}

src/vs/workbench/contrib/notebook/browser/diff/cellComponents.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ abstract class AbstractCellRenderer extends Disposable {
235235
{
236236
updateInfoRendering: this.updateMetadataRendering.bind(this),
237237
checkIfModified: (cell) => {
238-
return cell.type === 'modified' && hash(cell.original?.metadata ?? {}) !== hash(cell.modified?.metadata ?? {});
238+
return cell.type === 'modified' && hash(this._getFormatedMetadataJSON(cell.original?.metadata || {})) !== hash(this._getFormatedMetadataJSON(cell.modified?.metadata ?? {}));
239239
},
240240
getFoldingState: (cell) => {
241241
return cell.metadataFoldingState;
@@ -321,10 +321,25 @@ abstract class AbstractCellRenderer extends Disposable {
321321
}
322322
}
323323

324-
private _getFormatedMetadataJSON(metadata: NotebookCellMetadata, language?: string) {
324+
protected _getFormatedMetadataJSON(metadata: NotebookCellMetadata, language?: string) {
325+
let filteredMetadata: { [key: string]: any } = {};
326+
if (this.notebookEditor.textModel) {
327+
const transientMetadata = this.notebookEditor.textModel!.transientMetadata;
328+
329+
const keys = new Set([...Object.keys(metadata)]);
330+
for (let key of keys) {
331+
if (!(transientMetadata[key as keyof NotebookCellMetadata])
332+
) {
333+
filteredMetadata[key] = metadata[key as keyof NotebookCellMetadata];
334+
}
335+
}
336+
} else {
337+
filteredMetadata = metadata;
338+
}
339+
325340
const content = JSON.stringify({
326341
language,
327-
...metadata
342+
...filteredMetadata
328343
});
329344

330345
const edits = format(content, undefined, {});

src/vs/workbench/contrib/notebook/browser/diff/common.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import { CellDiffViewModel } from 'vs/workbench/contrib/notebook/browser/diff/ce
88
import { Event } from 'vs/base/common/event';
99
import { BareFontInfo } from 'vs/editor/common/config/fontInfo';
1010
import { DisposableStore } from 'vs/base/common/lifecycle';
11+
import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel';
1112

1213
export interface INotebookTextDiffEditor {
14+
readonly textModel?: NotebookTextModel;
1315
onMouseUp: Event<{ readonly event: MouseEvent; readonly target: CellDiffViewModel; }>;
1416
getOverflowContainerDomNode(): HTMLElement;
1517
getLayoutInfo(): NotebookLayoutInfo;

src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { Emitter } from 'vs/base/common/event';
3030
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
3131
import { NotebookDiffEditorEventDispatcher, NotebookLayoutChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher';
3232
import { EditorPane } from 'vs/workbench/browser/parts/editor/editorPane';
33+
import { INotebookDiffEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon';
3334

3435
export const IN_NOTEBOOK_TEXT_DIFF_EDITOR = new RawContextKey<boolean>('isInNotebookTextDiffEditor', false);
3536

@@ -46,6 +47,10 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD
4647
public readonly onMouseUp = this._onMouseUp.event;
4748
private _eventDispatcher: NotebookDiffEditorEventDispatcher | undefined;
4849
protected _scopeContextKeyService!: IContextKeyService;
50+
private _model: INotebookDiffEditorModel | null = null;
51+
get textModel() {
52+
return this._model?.modified.notebook;
53+
}
4954

5055
constructor(
5156
@IInstantiationService readonly instantiationService: IInstantiationService,
@@ -132,19 +137,19 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD
132137
async setInput(input: NotebookDiffEditorInput, options: EditorOptions | undefined, context: IEditorOpenContext, token: CancellationToken): Promise<void> {
133138
await super.setInput(input, options, context, token);
134139

135-
const model = await input.resolve();
136-
if (model === null) {
140+
this._model = await input.resolve();
141+
if (this._model === null) {
137142
return;
138143
}
139144

140145
this._eventDispatcher = new NotebookDiffEditorEventDispatcher();
141146

142-
const diffResult = await this.notebookEditorWorkerService.computeDiff(model.original.resource, model.modified.resource);
147+
const diffResult = await this.notebookEditorWorkerService.computeDiff(this._model.original.resource, this._model.modified.resource);
143148
const cellChanges = diffResult.cellsDiff.changes;
144149

145150
const cellDiffViewModels: CellDiffViewModel[] = [];
146-
const originalModel = model.original.notebook;
147-
const modifiedModel = model.modified.notebook;
151+
const originalModel = this._model.original.notebook;
152+
const modifiedModel = this._model.modified.notebook;
148153
let originalCellIndex = 0;
149154
let modifiedCellIndex = 0;
150155

src/vs/workbench/contrib/notebook/browser/notebookDiffEditorInput.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,14 +198,6 @@ ${patterns}
198198
if (!this._textModel) {
199199
this._textModel = await this._notebookModelResolverService.resolve(this.resource, this.viewType!, editorId);
200200
this._originalTextModel = await this._notebookModelResolverService.resolve(this.originalResource, this.viewType!, editorId);
201-
202-
// this._register(this._textModel.object.onDidChangeDirty(() => {
203-
// this._onDidChangeDirty.fire();
204-
// }));
205-
206-
// if (this._textModel.object.isDirty()) {
207-
// this._onDidChangeDirty.fire();
208-
// }
209201
}
210202

211203
return new NotebookDiffEditorModel(this._originalTextModel!.object as NotebookEditorModel, this._textModel.object as NotebookEditorModel);

src/vs/workbench/contrib/notebook/common/model/cellEdit.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export interface ITextCellEditingDelegate {
1515
insertCell?(index: number, cell: NotebookCellTextModel): void;
1616
deleteCell?(index: number): void;
1717
moveCell?(fromIndex: number, length: number, toIndex: number, beforeSelections: number[] | undefined, endSelections: number[] | undefined): void;
18-
updateCellMetadata?(index: number, newMetadata: NotebookCellMetadata | undefined): void;
18+
updateCellMetadata?(index: number, newMetadata: NotebookCellMetadata): void;
1919
emitSelections(selections: number[]): void;
2020
}
2121

@@ -192,8 +192,8 @@ export class CellMetadataEdit implements IResourceUndoRedoElement {
192192
constructor(
193193
public resource: URI,
194194
readonly index: number,
195-
readonly oldMetadata: NotebookCellMetadata | undefined,
196-
readonly newMetadata: NotebookCellMetadata | undefined,
195+
readonly oldMetadata: NotebookCellMetadata,
196+
readonly newMetadata: NotebookCellMetadata,
197197
private editingDelegate: ITextCellEditingDelegate,
198198
) {
199199

src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ export class NotebookCellTextModel extends Disposable implements ICell {
3232
return this._outputs;
3333
}
3434

35-
private _metadata: NotebookCellMetadata | undefined;
35+
private _metadata: NotebookCellMetadata;
3636

3737
get metadata() {
3838
return this._metadata;
3939
}
4040

41-
set metadata(newMetadata: NotebookCellMetadata | undefined) {
41+
set metadata(newMetadata: NotebookCellMetadata) {
4242
this._metadata = newMetadata;
4343
this._hash = null;
4444
this._onDidChangeMetadata.fire();
@@ -89,7 +89,7 @@ export class NotebookCellTextModel extends Disposable implements ICell {
8989
) {
9090
super();
9191
this._outputs = outputs;
92-
this._metadata = metadata;
92+
this._metadata = metadata || {};
9393
}
9494

9595
getValue(): string {

src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts

Lines changed: 12 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
187187
) {
188188
const cellHandle = this._cellhandlePool++;
189189
const cellUri = CellUri.generate(this.uri, cellHandle);
190-
return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata, this._modelService);
190+
return new NotebookCellTextModel(cellUri, cellHandle, source, language, cellKind, outputs || [], metadata || {}, this._modelService);
191191
}
192192

193193
initialize(cells: ICellDto2[]) {
@@ -497,59 +497,22 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel
497497
}
498498
}
499499

500-
private _compareCellMetadata(a: NotebookCellMetadata | undefined, b: NotebookCellMetadata | undefined) {
501-
if (a?.editable !== b?.editable && !this.transientMetadata.editable) {
502-
return true;
503-
}
504-
505-
if (a?.runnable !== b?.runnable && !this.transientMetadata.runnable) {
506-
return true;
507-
}
508-
509-
if (a?.breakpointMargin !== b?.breakpointMargin && !this.transientMetadata.breakpointMargin) {
510-
return true;
511-
}
512-
513-
if (a?.hasExecutionOrder !== b?.hasExecutionOrder && !this.transientMetadata.hasExecutionOrder) {
514-
return true;
515-
}
516-
517-
if (a?.executionOrder !== b?.executionOrder && !this.transientMetadata.executionOrder) {
518-
return true;
519-
}
520-
521-
if (a?.statusMessage !== b?.statusMessage && !this.transientMetadata.statusMessage) {
522-
return true;
523-
}
524-
525-
if (a?.runState !== b?.runState && !this.transientMetadata.runState) {
526-
return true;
527-
}
528-
529-
if (a?.runStartTime !== b?.runStartTime && !this.transientMetadata.runStartTime) {
530-
return true;
531-
}
532-
533-
if (a?.lastRunDuration !== b?.lastRunDuration && !this.transientMetadata.lastRunDuration) {
534-
return true;
535-
}
536-
537-
if (a?.inputCollapsed !== b?.inputCollapsed && !this.transientMetadata.inputCollapsed) {
538-
return true;
539-
}
540-
541-
if (a?.outputCollapsed !== b?.outputCollapsed && !this.transientMetadata.outputCollapsed) {
542-
return true;
543-
}
544-
545-
if (a?.custom !== b?.custom && !this.transientMetadata.custom) {
546-
return true;
500+
private _compareCellMetadata(a: NotebookCellMetadata, b: NotebookCellMetadata) {
501+
const keys = new Set([...Object.keys(a || {}), ...Object.keys(b || {})]);
502+
for (let key of keys) {
503+
if (
504+
(a[key as keyof NotebookCellMetadata] !== b[key as keyof NotebookCellMetadata])
505+
&&
506+
!(this.transientMetadata[key as keyof NotebookCellMetadata])
507+
) {
508+
return true;
509+
}
547510
}
548511

549512
return false;
550513
}
551514

552-
changeCellMetadata(handle: number, metadata: NotebookCellMetadata | undefined, pushUndoStop: boolean) {
515+
changeCellMetadata(handle: number, metadata: NotebookCellMetadata, pushUndoStop: boolean) {
553516
const cell = this.cells.find(cell => cell.handle === handle);
554517

555518
if (!cell) {

src/vs/workbench/contrib/notebook/common/notebookCommon.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ export interface NotebookCellsChangeMetadataEvent {
397397
readonly kind: NotebookCellsChangeType.ChangeMetadata;
398398
readonly versionId: number;
399399
readonly index: number;
400-
readonly metadata: NotebookCellMetadata;
400+
readonly metadata: NotebookCellMetadata | undefined;
401401
}
402402

403403
export type NotebookCellsChangedEvent = NotebookCellsInitializeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent | NotebookCellsChangeMetadataEvent;

src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,9 @@ export class NotebookModelResolverService implements INotebookEditorModelResolve
7676
};
7777
}
7878
}
79+
80+
// notebookService.onDidAddDocument
81+
82+
// resolve()
83+
84+
// notebookService.onDidRemoveDocument ...

0 commit comments

Comments
 (0)