mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-15 17:22:25 -05:00
Initial project references changes (#11648)
* first changes for showing project references * add tests * fix interface and formatting * add try so that project still gets loaded even if dependency project loading fails * use instanceof * add circular reference error
This commit is contained in:
@@ -16,7 +16,7 @@ import * as vscode from 'vscode';
|
||||
import * as azdata from 'azdata';
|
||||
import { promises as fs } from 'fs';
|
||||
import { PublishDatabaseDialog } from '../dialogs/publishDatabaseDialog';
|
||||
import { Project, DatabaseReferenceLocation, SystemDatabase, TargetPlatform, ProjectEntry, reservedProjectFolders } from '../models/project';
|
||||
import { Project, DatabaseReferenceLocation, SystemDatabase, TargetPlatform, ProjectEntry, reservedProjectFolders, SqlProjectReferenceProjectEntry } from '../models/project';
|
||||
import { SqlDatabaseProjectTreeViewProvider } from './databaseProjectTreeViewProvider';
|
||||
import { FolderNode, FileNode } from '../models/tree/fileFolderTreeItem';
|
||||
import { IPublishSettings, IGenerateScriptSettings } from '../models/IPublishSettings';
|
||||
@@ -47,11 +47,15 @@ export class ProjectsController {
|
||||
this.projectTreeViewProvider.load(this.projects);
|
||||
}
|
||||
|
||||
public async openProject(projectFile: vscode.Uri, focusProject: boolean = true): Promise<Project> {
|
||||
public async openProject(projectFile: vscode.Uri, focusProject: boolean = true, isReferencedProject: boolean = false): Promise<Project> {
|
||||
for (const proj of this.projects) {
|
||||
if (proj.projectFilePath === projectFile.fsPath) {
|
||||
vscode.window.showInformationMessage(constants.projectAlreadyOpened(projectFile.fsPath));
|
||||
return proj;
|
||||
if (!isReferencedProject) {
|
||||
vscode.window.showInformationMessage(constants.projectAlreadyOpened(projectFile.fsPath));
|
||||
return proj;
|
||||
} else {
|
||||
throw new Error(constants.projectAlreadyOpened(projectFile.fsPath));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,6 +66,17 @@ export class ProjectsController {
|
||||
newProject = await Project.openProject(projectFile.fsPath);
|
||||
this.projects.push(newProject);
|
||||
|
||||
// open any reference projects (don't need to worry about circular dependencies because those aren't allowed)
|
||||
const referencedProjects = newProject.databaseReferences.filter(r => r instanceof SqlProjectReferenceProjectEntry);
|
||||
for (const proj of referencedProjects) {
|
||||
const projUri = vscode.Uri.file(path.join(newProject.projectFolderPath, proj.fsUri.fsPath));
|
||||
try {
|
||||
await this.openProject(projUri, false, true);
|
||||
} catch (e) {
|
||||
vscode.window.showErrorMessage(e.message === constants.projectAlreadyOpened(projUri.fsPath) ? constants.circularProjectReference(newProject.projectFileName, proj.databaseName) : e.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Update for round tripping as needed
|
||||
await this.updateProjectForRoundTrip(newProject);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user