22// Licensed under the MIT License.
33import type { nbformat } from '@jupyterlab/coreutils' ;
44import type { Kernel } from '@jupyterlab/services' ;
5+ import { sha256 } from 'hash.js' ;
56import { inject , injectable } from 'inversify' ;
67// tslint:disable-next-line: no-require-imports
78import cloneDeep = require( 'lodash/cloneDeep' ) ;
@@ -18,6 +19,7 @@ import { PythonEnvironment } from '../../../pythonEnvironments/info';
1819import { IEventNamePropertyMapping , sendTelemetryEvent } from '../../../telemetry' ;
1920import { Commands , KnownNotebookLanguages , Settings , Telemetry } from '../../constants' ;
2021import { IKernelFinder } from '../../kernel-launcher/types' ;
22+ import { getInterpreterInfoStoredInMetadata } from '../../notebookStorage/baseModel' ;
2123import { reportAction } from '../../progress/decorator' ;
2224import { ReportableAction } from '../../progress/types' ;
2325import {
@@ -486,6 +488,17 @@ export class KernelSelector implements IKernelSelectionUsage {
486488 }
487489 }
488490 }
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+ }
489502
490503 // Get our kernelspec and interpreter for a local raw connection
491504 private async getKernelForLocalRawConnection (
@@ -494,6 +507,19 @@ export class KernelSelector implements IKernelSelectionUsage {
494507 cancelToken ?: CancellationToken ,
495508 ignoreDependencyCheck ?: boolean
496509 ) : 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+
497523 // First use our kernel finder to locate a kernelspec on disk
498524 const kernelSpec = await this . kernelFinder . findKernelSpec (
499525 resource ,
0 commit comments