11// Copyright (c) Microsoft Corporation. All rights reserved.
22// Licensed under the MIT License.
33
4+ import * as fastDeepEqual from 'fast-deep-equal' ;
45import { inject , injectable } from 'inversify' ;
56import { CancellationToken , Event , EventEmitter } from 'vscode' ;
67import {
@@ -13,6 +14,7 @@ import { IVSCodeNotebook } from '../../common/application/types';
1314import { createPromiseFromCancellation } from '../../common/cancellation' ;
1415import { IDisposableRegistry } from '../../common/types' ;
1516import { noop } from '../../common/utils/misc' ;
17+ import { KernelProvider } from '../jupyter/kernels/kernelProvider' ;
1618import { KernelSelectionProvider } from '../jupyter/kernels/kernelSelections' ;
1719import { KernelSelector } from '../jupyter/kernels/kernelSelector' ;
1820import { KernelSwitcher } from '../jupyter/kernels/kernelSwitcher' ;
@@ -22,6 +24,7 @@ import { INotebook, INotebookProvider } from '../types';
2224import { getNotebookMetadata , isJupyterNotebook , updateKernelInNotebookMetadata } from './helpers/helpers' ;
2325import { NotebookKernel } from './notebookKernel' ;
2426import { INotebookContentProvider , INotebookExecutionService } from './types' ;
27+
2528@injectable ( )
2629export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
2730 public get onDidChangeKernels ( ) : Event < void > {
@@ -33,6 +36,7 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
3336 @inject ( INotebookExecutionService ) private readonly execution : INotebookExecutionService ,
3437 @inject ( KernelSelectionProvider ) private readonly kernelSelectionProvider : KernelSelectionProvider ,
3538 @inject ( KernelSelector ) private readonly kernelSelector : KernelSelector ,
39+ @inject ( KernelProvider ) private readonly kernelProvider : KernelProvider ,
3640 @inject ( IVSCodeNotebook ) private readonly notebook : IVSCodeNotebook ,
3741 @inject ( INotebookStorageProvider ) private readonly storageProvider : INotebookStorageProvider ,
3842 @inject ( INotebookProvider ) private readonly notebookProvider : INotebookProvider ,
@@ -87,14 +91,14 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
8791 if (
8892 preferredKernel . kernelSpec &&
8993 item . kernelSpec &&
90- JSON . stringify ( preferredKernel . kernelSpec ) === JSON . stringify ( item . kernelSpec )
94+ fastDeepEqual ( preferredKernel . kernelSpec , item . kernelSpec )
9195 ) {
9296 return true ;
9397 }
9498 if (
9599 preferredKernel . kernelModel &&
96100 item . kernelModel &&
97- JSON . stringify ( preferredKernel . kernelModel ) === JSON . stringify ( item . kernelModel )
101+ fastDeepEqual ( preferredKernel . kernelModel , item . kernelModel )
98102 ) {
99103 return true ;
100104 }
@@ -130,12 +134,23 @@ export class VSCodeKernelPickerProvider implements NotebookKernelProvider {
130134 // Possibly closed or different kernel picked.
131135 return ;
132136 }
137+
133138 const model = await this . storageProvider . getOrCreateModel ( document . uri ) ;
134139 if ( ! model || ! model . isTrusted ) {
135140 // If a model is not trusted, we cannot change the kernel (this results in changes to notebook metadata).
136141 // This is because we store selected kernel in the notebook metadata.
137142 return ;
138143 }
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+
139154 // Change kernel and update metadata.
140155 const notebook = await this . notebookProvider . getOrCreateNotebook ( {
141156 resource : document . uri ,
0 commit comments