2
2
// Licensed under the MIT License.
3
3
import type { nbformat } from '@jupyterlab/coreutils' ;
4
4
import type { Kernel } from '@jupyterlab/services' ;
5
+ import { sha256 } from 'hash.js' ;
5
6
import { inject , injectable } from 'inversify' ;
6
7
// tslint:disable-next-line: no-require-imports
7
8
import cloneDeep = require( 'lodash/cloneDeep' ) ;
@@ -18,6 +19,7 @@ import { PythonEnvironment } from '../../../pythonEnvironments/info';
18
19
import { IEventNamePropertyMapping , sendTelemetryEvent } from '../../../telemetry' ;
19
20
import { Commands , KnownNotebookLanguages , Settings , Telemetry } from '../../constants' ;
20
21
import { IKernelFinder } from '../../kernel-launcher/types' ;
22
+ import { getInterpreterInfoStoredInMetadata } from '../../notebookStorage/baseModel' ;
21
23
import { reportAction } from '../../progress/decorator' ;
22
24
import { ReportableAction } from '../../progress/types' ;
23
25
import {
@@ -486,6 +488,17 @@ export class KernelSelector implements IKernelSelectionUsage {
486
488
}
487
489
}
488
490
}
491
+ private async findInterpreterStoredInNotebookMetadata (
492
+ resource : Resource ,
493
+ notebookMetadata ?: nbformat . INotebookMetadata
494
+ ) : Promise < PythonEnvironment | undefined > {
495
+ const info = getInterpreterInfoStoredInMetadata ( notebookMetadata ) ;
496
+ if ( ! info ) {
497
+ return ;
498
+ }
499
+ const interpreters = await this . interpreterService . getInterpreters ( resource ) ;
500
+ return interpreters . find ( ( item ) => sha256 ( ) . update ( item . path ) . digest ( 'hex' ) === info . hash ) ;
501
+ }
489
502
490
503
// Get our kernelspec and interpreter for a local raw connection
491
504
private async getKernelForLocalRawConnection (
@@ -494,6 +507,19 @@ export class KernelSelector implements IKernelSelectionUsage {
494
507
cancelToken ?: CancellationToken ,
495
508
ignoreDependencyCheck ?: boolean
496
509
) : Promise < KernelSpecConnectionMetadata | PythonKernelConnectionMetadata | undefined > {
510
+ // If user had selected an interpreter (raw kernel), then that interpreter would be stored in the kernelspec metadata.
511
+ // Find this matching interpreter & start that using raw kernel.
512
+ const interpreterStoredInKernelSpec = await this . findInterpreterStoredInNotebookMetadata (
513
+ resource ,
514
+ notebookMetadata
515
+ ) ;
516
+ if ( interpreterStoredInKernelSpec ) {
517
+ return {
518
+ kind : 'startUsingPythonInterpreter' ,
519
+ interpreter : interpreterStoredInKernelSpec
520
+ } ;
521
+ }
522
+
497
523
// First use our kernel finder to locate a kernelspec on disk
498
524
const kernelSpec = await this . kernelFinder . findKernelSpec (
499
525
resource ,
0 commit comments