diff --git a/packages/databricks-vscode/src/extension.ts b/packages/databricks-vscode/src/extension.ts index 06fe54a02..f53ae62f9 100644 --- a/packages/databricks-vscode/src/extension.ts +++ b/packages/databricks-vscode/src/extension.ts @@ -34,6 +34,7 @@ import { } from "./workspace-fs"; import {generateBundleSchema} from "./bundle/GenerateBundle"; import {CustomWhenContext} from "./vscode-objs/CustomWhenContext"; +import {WorkspaceStateManager} from "./vscode-objs/WorkspaceState"; export async function activate( context: ExtensionContext @@ -85,8 +86,11 @@ export async function activate( metadata: packageMetadata, }); + const workspaceStateManager = new WorkspaceStateManager(context); + const configureAutocomplete = new ConfigureAutocomplete( context, + workspaceStateManager, workspace.workspaceFolders[0].uri.fsPath ); context.subscriptions.push( @@ -115,6 +119,7 @@ export async function activate( ); const workspaceFsCommands = new WorkspaceFsCommands( workspace.workspaceFolders[0].uri, + workspaceStateManager, connectionManager, workspaceFsDataProvider ); diff --git a/packages/databricks-vscode/src/language/ConfigureAutocomplete.ts b/packages/databricks-vscode/src/language/ConfigureAutocomplete.ts index 997594371..39561b276 100644 --- a/packages/databricks-vscode/src/language/ConfigureAutocomplete.ts +++ b/packages/databricks-vscode/src/language/ConfigureAutocomplete.ts @@ -12,6 +12,7 @@ import { ConfigurationTarget, } from "vscode"; import {Loggers} from "../logger"; +import {WorkspaceStateManager} from "../vscode-objs/WorkspaceState"; type Resource = Uri | undefined; @@ -65,6 +66,7 @@ export class ConfigureAutocomplete implements Disposable { constructor( private readonly context: ExtensionContext, + private readonly workspaceState: WorkspaceStateManager, private readonly workspaceFolder: string ) { this.configure(); @@ -113,12 +115,7 @@ export class ConfigureAutocomplete implements Disposable { } private async configure(force = false) { - if ( - !force && - this.context.workspaceState.get( - "databricks.autocompletion.skipConfigure" - ) - ) { + if (!force && this.workspaceState.skipAutocompleteConfigure) { return; } @@ -181,10 +178,7 @@ export class ConfigureAutocomplete implements Disposable { } if (choice === "Never for this workspace") { - this.context.workspaceState.update( - "databricks.autocompletion.skipConfigure", - true - ); + this.workspaceState.skipAutocompleteConfigure = true; return; } diff --git a/packages/databricks-vscode/src/vscode-objs/WorkspaceState.ts b/packages/databricks-vscode/src/vscode-objs/WorkspaceState.ts new file mode 100644 index 000000000..fd640ae3c --- /dev/null +++ b/packages/databricks-vscode/src/vscode-objs/WorkspaceState.ts @@ -0,0 +1,31 @@ +import {randomUUID} from "crypto"; +import {ExtensionContext} from "vscode"; + +export class WorkspaceStateManager { + constructor(private context: ExtensionContext) {} + + get skipAutocompleteConfigure() { + return this.context.workspaceState.get( + "databricks.autocompletion.skipConfigure", + false + ); + } + + set skipAutocompleteConfigure(value: boolean) { + this.context.workspaceState.update( + "databricks.autocompletion.skipConfigure", + true + ); + } + + get fixedUUID() { + let uuid = this.context.workspaceState.get( + "databricks.fixedUUID" + ); + if (!uuid) { + uuid = randomUUID(); + this.context.workspaceState.update("databricks.fixedUUID", uuid); + } + return uuid; + } +} diff --git a/packages/databricks-vscode/src/workspace-fs/WorkspaceFsCommands.ts b/packages/databricks-vscode/src/workspace-fs/WorkspaceFsCommands.ts index 9c5cf8fe8..01590d456 100644 --- a/packages/databricks-vscode/src/workspace-fs/WorkspaceFsCommands.ts +++ b/packages/databricks-vscode/src/workspace-fs/WorkspaceFsCommands.ts @@ -12,15 +12,44 @@ import {Loggers} from "../logger"; import {workspaceConfigs} from "../vscode-objs/WorkspaceConfigs"; import {createDirWizard} from "./createDirectoryWizard"; import {WorkspaceFsDataProvider} from "./WorkspaceFsDataProvider"; +import path from "node:path"; +import {WorkspaceStateManager} from "../vscode-objs/WorkspaceState"; export class WorkspaceFsCommands implements Disposable { private disposables: Disposable[] = []; constructor( private _workspaceFolder: Uri, + private readonly _workspaceState: WorkspaceStateManager, private _connectionManager: ConnectionManager, private _workspaceFsDataProvider: WorkspaceFsDataProvider - ) {} + ) { + this.disposables.push( + this._connectionManager.onDidChangeState(async (state) => { + if ( + state !== "CONNECTED" || + !workspaceConfigs.enableFilesInWorkspace || + this._connectionManager.syncDestinationMapper !== undefined + ) { + return; + } + + const root = await this.getValidRoot( + this._connectionManager.databricksWorkspace?.currentFsRoot + .path + ); + + const element = await root?.mkdir( + `${path.basename( + this._workspaceFolder.fsPath + )}-${this._workspaceState.fixedUUID.slice(0, 8)}` + ); + if (element) { + this.attachSyncDestination(element); + } + }) + ); + } async attachSyncDestination(element: WorkspaceFsEntity) { await this._connectionManager.attachSyncDestination(