Skip to content

Commit

Permalink
Ensure workspace is cleared (#1318)
Browse files Browse the repository at this point in the history
* Ensure viewer is cleared

Workspace viewer will no longer show "ghost" data from previous sessions

* Update session.ts

* Detach command

- safe exit of R session causes a detach
- detach clears workspace + status item

* Update vsc.R

* Try polling pid

* Fix lint

---------

Co-authored-by: Kun Ren <renkun@outlook.com>
  • Loading branch information
ElianHugh and renkun-ken authored Mar 5, 2023
1 parent 83aaf2a commit 3a0784f
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 4 deletions.
2 changes: 2 additions & 0 deletions R/session/vsc.R
Original file line number Diff line number Diff line change
Expand Up @@ -791,3 +791,5 @@ print.hsearch <- function(x, ...) {
registerS3method(generic, class, method, envir = parent.frame())
invisible(NULL)
}

reg.finalizer(globalenv(), function(e) .vsc$request("detach"), onexit = TRUE)
3 changes: 2 additions & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export let enableSessionWatcher: boolean | undefined = undefined;
export let globalHttpgdManager: httpgdViewer.HttpgdManager | undefined = undefined;
export let rmdPreviewManager: rmarkdown.RMarkdownPreviewManager | undefined = undefined;
export let rmdKnitManager: rmarkdown.RMarkdownKnitManager | undefined = undefined;
export let sessionStatusBarItem: vscode.StatusBarItem | undefined = undefined;

// Called (once) when the extension is activated
export async function activate(context: vscode.ExtensionContext): Promise<apiImplementation.RExtensionImplementation> {
Expand Down Expand Up @@ -225,7 +226,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<apiImp

// create status bar item that contains info about the session watcher
console.info('Create sessionStatusBarItem');
const sessionStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 1000);
sessionStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 1000);
sessionStatusBarItem.command = 'r.attachActive';
sessionStatusBarItem.text = 'R: (not attached)';
sessionStatusBarItem.tooltip = 'Click to attach active terminal.';
Expand Down
4 changes: 2 additions & 2 deletions src/rTerminal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { extensionContext, homeExtDir } from './extension';
import * as util from './util';
import * as selection from './selection';
import { getSelection } from './selection';
import { removeSessionFiles } from './session';
import { cleanupSession } from './session';
import { config, delay, getRterm } from './util';
import { rGuestService, isGuestSession } from './liveShare';
import * as fs from 'fs';
Expand Down Expand Up @@ -162,7 +162,7 @@ export function deleteTerminal(term: vscode.Terminal): void {
if (isDeepStrictEqual(term, rTerm)) {
rTerm = undefined;
if (config().get<boolean>('sessionWatcher')) {
removeSessionFiles();
cleanupSession();
}
}
}
Expand Down
45 changes: 44 additions & 1 deletion src/session.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import { config, readContent, UriIcon } from './util';
import { purgeAddinPickerItems, dispatchRStudioAPICall } from './rstudioapi';

import { IRequest } from './liveShare/shareSession';
import { homeExtDir, rWorkspace, globalRHelp, globalHttpgdManager, extensionContext } from './extension';
import { homeExtDir, rWorkspace, globalRHelp, globalHttpgdManager, extensionContext, sessionStatusBarItem } from './extension';
import { UUID, rHostService, rGuestService, isLiveShare, isHost, isGuestSession, closeBrowser, guestResDir, shareBrowser, openVirtualDoc, shareWorkspace } from './liveShare';

export interface GlobalEnv {
Expand Down Expand Up @@ -734,6 +734,7 @@ type ISessionRequest = {
async function updateRequest(sessionStatusBarItem: StatusBarItem) {
console.info('[updateRequest] Started');
console.info(`[updateRequest] requestFile: ${requestFile}`);

const lockContent = await fs.readFile(requestLockFile, 'utf8');
const newTimeStamp = Number.parseFloat(lockContent);
if (newTimeStamp !== requestTimeStamp) {
Expand Down Expand Up @@ -776,6 +777,15 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
if (request.plot_url) {
await globalHttpgdManager?.showViewer(request.plot_url);
}
void watchProcess(Number(pid)).then((v) => {
if (v === Number(pid)) {
cleanupSession();
}
});
break;
}
case 'detach': {
cleanupSession();
break;
}
case 'browser': {
Expand Down Expand Up @@ -815,3 +825,36 @@ async function updateRequest(sessionStatusBarItem: StatusBarItem) {
}
}
}

export function cleanupSession(): void {
if (sessionStatusBarItem) {
sessionStatusBarItem.text = 'R: (not attached)';
sessionStatusBarItem.tooltip = 'Click to attach active terminal.';
}
workspaceData.globalenv = {};
workspaceData.loaded_namespaces = [];
workspaceData.search = [];
rWorkspace?.refresh();
removeSessionFiles();
}

async function watchProcess(pid: number): Promise<number> {
function pidIsRunning(pid: number) {
try {
process.kill(pid, 0);
return true;
} catch (e) {
return false;
}
}

let res = true;
do {
res = pidIsRunning(pid);
await new Promise(resolve => {
setTimeout(resolve, 1000);
});

} while (res);
return pid;
}

0 comments on commit 3a0784f

Please sign in to comment.