in source-control-sample/src/extension.ts [208:275]
async function selectWorkspaceFolder(context: vscode.ExtensionContext, fiddleId: string): Promise<vscode.WorkspaceFolder | undefined> {
let selectedFolder: vscode.WorkspaceFolder | undefined;
let workspaceFolderUri: vscode.Uri | undefined;
let workspaceFolderIndex: number | undefined;
let folderOpeningMode: FolderOpeningMode;
const folderPicks: WorkspaceFolderPick[] = [newFolderPick];
if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) {
folderPicks.push(newWorkspaceFolderPick);
for (const wf of vscode.workspace.workspaceFolders) {
const content = await afs.readdir(wf.uri.fsPath);
folderPicks.push(new ExistingWorkspaceFolderPick(wf, content));
}
}
const selectedFolderPick: WorkspaceFolderPick =
folderPicks.length === 1 ?
folderPicks[0] :
await vscode.window.showQuickPick(folderPicks, {
canPickMany: false, ignoreFocusOut: true, placeHolder: 'Pick workspace folder to create files in.'
});
if (!selectedFolderPick) { return null; }
if (selectedFolderPick instanceof ExistingWorkspaceFolderPick) {
selectedFolder = selectedFolderPick.workspaceFolder;
workspaceFolderIndex = selectedFolder.index;
workspaceFolderUri = selectedFolder.uri;
}
// eslint-disable-next-line prefer-const
folderOpeningMode = selectedFolderPick.folderOpeningMode;
if (!workspaceFolderUri && !selectedFolder) {
const folderUris = await vscode.window.showOpenDialog({ canSelectFolders: true, canSelectFiles: false, canSelectMany: false, openLabel: 'Select folder' });
if (!folderUris) {
return null;
}
workspaceFolderUri = folderUris[0];
// was such workspace folder already open?
workspaceFolderIndex = vscode.workspace.workspaceFolders && firstIndex(vscode.workspace.workspaceFolders, (folder1: any) => folder1.uri.toString() === workspaceFolderUri!.toString());
}
if (! await clearWorkspaceFolder(workspaceFolderUri)) { return null; }
const fiddleConfiguration = parseFiddleId(fiddleId);
// save folder configuration
FiddleSourceControl.saveConfiguration(workspaceFolderUri, fiddleConfiguration);
if (folderOpeningMode === FolderOpeningMode.AddToWorkspace || folderOpeningMode === undefined) {
const workSpacesToReplace = typeof workspaceFolderIndex === 'number' && workspaceFolderIndex > -1 ? 1 : 0;
if (workspaceFolderIndex === undefined || workspaceFolderIndex < 0) { workspaceFolderIndex = 0; }
// replace or insert the workspace
if (workspaceFolderUri) {
vscode.workspace.updateWorkspaceFolders(workspaceFolderIndex, workSpacesToReplace, { uri: workspaceFolderUri });
}
}
else if (folderOpeningMode === FolderOpeningMode.OpenFolder) {
vscode.commands.executeCommand("vscode.openFolder", workspaceFolderUri);
}
return selectedFolder;
}