Browse Source

Backport PR #12250: Open terminal in cwd from launcher (#12430)

Co-authored-by: rccern <70897679+rccern@users.noreply.github.com>
Frédéric Collonval 3 years ago
parent
commit
eaa0de0a68

+ 15 - 0
galata/test/jupyterlab/terminal.test.ts

@@ -83,3 +83,18 @@ test.describe('Terminal', () => {
     });
   });
 });
+
+test('Terminal should open in Launcher cwd', async ({ page, tmpPath }) => {
+  await page.waitForSelector(`.jp-Launcher-cwd > h3:has-text("${tmpPath}")`);
+
+  await page.locator('[role="main"] >> p:has-text("Terminal")').click();
+
+  const terminal = page.locator(TERMINAL_SELECTOR);
+  await terminal.waitFor();
+
+  await page.waitForTimeout(1000);
+  await page.keyboard.type('basename $PWD');
+  await page.keyboard.press('Enter');
+  await page.waitForTimeout(1000);
+  expect(await terminal.screenshot()).toMatchSnapshot('launcher-term.png');
+});

BIN
galata/test/jupyterlab/terminal.test.ts-snapshots/launcher-term-jupyterlab-linux.png


+ 5 - 1
packages/services/src/terminal/manager.ts

@@ -175,7 +175,11 @@ export class TerminalManager extends BaseManager implements Terminal.IManager {
   async startNew(
     options?: Terminal.ITerminal.IOptions
   ): Promise<Terminal.ITerminalConnection> {
-    const model = await startNew(this.serverSettings, options?.name);
+    const model = await startNew(
+      this.serverSettings,
+      options?.name,
+      options?.cwd
+    );
     await this.refreshRunning();
     return this.connectTo({ model });
   }

+ 5 - 2
packages/services/src/terminal/restapi.ts

@@ -34,17 +34,20 @@ export interface IModel {
  *
  * @param name - The name of the target terminal.
  *
+ * @param cwd - The path in which the terminal will start.
+ *
  * @returns A promise that resolves with the session model.
  */
 export async function startNew(
   settings: ServerConnection.ISettings = ServerConnection.makeSettings(),
-  name?: string
+  name?: string,
+  cwd?: string
 ): Promise<IModel> {
   Private.errorIfNotAvailable();
   const url = URLExt.join(settings.baseUrl, TERMINAL_SERVICE_URL);
   const init = {
     method: 'POST',
-    body: JSON.stringify({ name })
+    body: JSON.stringify({ name, cwd })
   };
 
   const response = await ServerConnection.makeRequest(url, init, settings);

+ 6 - 2
packages/services/src/terminal/terminal.ts

@@ -19,9 +19,13 @@ export { IModel, isAvailable };
 export namespace ITerminal {
   export interface IOptions {
     /**
-     * Terminal name.
+     * The terminal name.
      */
-    name: string;
+    name?: string;
+    /**
+     *  The terminal current directory.
+     */
+    cwd?: string;
   }
 }
 

+ 3 - 2
packages/terminal-extension/src/index.ts

@@ -347,6 +347,7 @@ export function addCommands(
       }
 
       const name = args['name'] as string;
+      const cwd = args['cwd'] as string;
 
       let session;
       if (name) {
@@ -358,12 +359,12 @@ export function addCommands(
         } else {
           // we are restoring a terminal widget but the corresponding terminal was closed
           // let's start a new terminal with the original name
-          session = await serviceManager.terminals.startNew({ name });
+          session = await serviceManager.terminals.startNew({ name, cwd });
         }
       } else {
         // we are creating a new terminal widget with a new terminal
         // let the server choose the terminal name
-        session = await serviceManager.terminals.startNew();
+        session = await serviceManager.terminals.startNew({ cwd });
       }
 
       const term = new Terminal(session, options, translator);

+ 1 - 1
setup.cfg

@@ -36,7 +36,7 @@ install_requires =
     tornado>=6.1.0
     jupyter_core
     jupyterlab_server~=2.10
-    jupyter_server~=1.4
+    jupyter_server~=1.16
     nbclassic~=0.2
     jinja2>=2.1