diff --git a/src/cloudShell.ts b/src/cloudShell.ts index f72539d..22275fd 100644 --- a/src/cloudShell.ts +++ b/src/cloudShell.ts @@ -13,7 +13,7 @@ import { TelemetryWrapper } from "vscode-extension-telemetry-wrapper"; import { AzureAccount, CloudShell } from "./azure-account.api"; import { BaseShell } from "./baseShell"; import { aciConfig, Constants, exportContainerCmd, exportTestScript } from "./constants"; -import { azFilePush, escapeFile, TerraformCommand, TestOption } from "./shared"; +import { azFileDelete, azFilePush, escapeFile, TerraformCommand, TestOption } from "./shared"; import { terraformChannel } from "./terraformChannel"; import { getStorageAccountforCloudShell, IStorageAccount } from "./utils/cloudShellUtils"; import * as settingUtils from "./utils/settingUtils"; @@ -47,6 +47,32 @@ export class AzureCloudShell extends BaseShell { } } + public async deleteFiles(files: vscode.Uri[]): Promise { + const RETRY_TIMES = 3; + + if (!await this.connectedToCloudShell()) { + terraformChannel.appendLine(`cloud shell can not be opened, file deleting operation is not synced`); + return; + } + + for (const file of files.map((a) => a.fsPath)) { + for (let i = 0; i < RETRY_TIMES; i++) { + try { + terraformChannel.appendLine(`Deleting file ${file} from cloud shell`); + await azFileDelete( + vscode.workspace.getWorkspaceFolder(vscode.Uri.file(file)).name, + this.storageAccountName, + this.storageAccountKey, + this.fileShareName, + file); + break; + } catch (err) { + terraformChannel.appendLine(err); + } + } + } + } + public async runTerraformTests(testType: string, workingDirectory: string) { if (await this.connectedToCloudShell()) { diff --git a/src/extension.ts b/src/extension.ts index 5ec6c9f..174b33f 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -16,9 +16,12 @@ import { checkTerraformInstalled } from "./utils/terraformUtils"; import { DialogOption } from "./utils/uiUtils"; import { selectWorkspaceFolder } from "./utils/workspaceUtils"; +let fileWatcher: vscode.FileSystemWatcher; + export async function activate(ctx: vscode.ExtensionContext) { await checkTerraformInstalled(); await TelemetryWrapper.initilizeFromJsonFile(ctx.asAbsolutePath("./package.json")); + initFileWatcher(ctx); ctx.subscriptions.push(TelemetryWrapper.registerCommand("azureTerraform.init", () => { terraformShellManager.getShell().runTerraformCmd(TerraformCommand.Init); @@ -88,4 +91,18 @@ export async function activate(ctx: vscode.ExtensionContext) { export function deactivate(): void { terraformShellManager.dispose(); - } + if (fileWatcher) { + fileWatcher.dispose(); + } +} + +function initFileWatcher(ctx: vscode.ExtensionContext): void { + fileWatcher = vscode.workspace.createFileSystemWatcher(getSyncFileBlobPattern()); + ctx.subscriptions.push( + fileWatcher.onDidDelete((deletedUri) => { + if (isTerminalSetToCloudShell()) { + terraformShellManager.getCloudShell().deleteFiles([deletedUri]); + } + }), + ); +}