1
1
// Copyright (c) Microsoft Corporation. All rights reserved.
2
2
// Licensed under the MIT License.
3
3
4
+ import * as fastDeepEqual from 'fast-deep-equal' ;
4
5
import { inject , injectable } from 'inversify' ;
5
6
import { CancellationToken , Event , EventEmitter } from 'vscode' ;
6
7
import {
@@ -13,6 +14,7 @@ import { IVSCodeNotebook } from '../../common/application/types';
13
14
import { createPromiseFromCancellation } from '../../common/cancellation' ;
14
15
import { IDisposableRegistry } from '../../common/types' ;
15
16
import { noop } from '../../common/utils/misc' ;
17
+ import { KernelProvider } from '../jupyter/kernels/kernelProvider' ;
16
18
import { KernelSelectionProvider } from '../jupyter/kernels/kernelSelections' ;
17
19
import { KernelSelector } from '../jupyter/kernels/kernelSelector' ;
18
20
import { KernelSwitcher } from '../jupyter/kernels/kernelSwitcher' ;
@@ -22,6 +24,7 @@ import { INotebook, INotebookProvider } from '../types';
22
24
import { getNotebookMetadata , isJupyterNotebook , updateKernelInNotebookMetadata } from './helpers/helpers' ;
23
25
import { NotebookKernel } from './notebookKernel' ;
24
26
import { INotebookContentProvider , INotebookExecutionService } from './types' ;
27
+
25
28
@injectable ( )
26
29
export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
27
30
public get onDidChangeKernels ( ) : Event < void > {
@@ -33,6 +36,7 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
33
36
@inject ( INotebookExecutionService ) private readonly execution : INotebookExecutionService ,
34
37
@inject ( KernelSelectionProvider ) private readonly kernelSelectionProvider : KernelSelectionProvider ,
35
38
@inject ( KernelSelector ) private readonly kernelSelector : KernelSelector ,
39
+ @inject ( KernelProvider ) private readonly kernelProvider : KernelProvider ,
36
40
@inject ( IVSCodeNotebook ) private readonly notebook : IVSCodeNotebook ,
37
41
@inject ( INotebookStorageProvider ) private readonly storageProvider : INotebookStorageProvider ,
38
42
@inject ( INotebookProvider ) private readonly notebookProvider : INotebookProvider ,
@@ -87,14 +91,14 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
87
91
if (
88
92
preferredKernel . kernelSpec &&
89
93
item . kernelSpec &&
90
- JSON . stringify ( preferredKernel . kernelSpec ) === JSON . stringify ( item . kernelSpec )
94
+ fastDeepEqual ( preferredKernel . kernelSpec , item . kernelSpec )
91
95
) {
92
96
return true ;
93
97
}
94
98
if (
95
99
preferredKernel . kernelModel &&
96
100
item . kernelModel &&
97
- JSON . stringify ( preferredKernel . kernelModel ) === JSON . stringify ( item . kernelModel )
101
+ fastDeepEqual ( preferredKernel . kernelModel , item . kernelModel )
98
102
) {
99
103
return true ;
100
104
}
@@ -130,12 +134,23 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
130
134
// Possibly closed or different kernel picked.
131
135
return ;
132
136
}
137
+
133
138
const model = await this . storageProvider . getOrCreateModel ( document . uri ) ;
134
139
if ( ! model || ! model . isTrusted ) {
135
140
// If a model is not trusted, we cannot change the kernel (this results in changes to notebook metadata).
136
141
// This is because we store selected kernel in the notebook metadata.
137
142
return ;
138
143
}
144
+
145
+ // Check what the existing kernel is.
146
+ const existingKernel = this . kernelProvider . get ( document . uri ) ;
147
+ if ( existingKernel && fastDeepEqual ( existingKernel . metadata , newKernelInfo . kernel . selection ) ) {
148
+ return ;
149
+ }
150
+
151
+ // Make this the new kernel (calling this method will associate the new kernel with this Uri).
152
+ this . kernelProvider . getOrCreate ( document . uri , { metadata : newKernelInfo . kernel . selection } ) ;
153
+
139
154
// Change kernel and update metadata.
140
155
const notebook = await this . notebookProvider . getOrCreateNotebook ( {
141
156
resource : document . uri ,
0 commit comments