mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-17 09:35:37 -05:00
Add reference to another sql project (#12186)
* add projects to add database reference dialog * able to add project references * check for circular dependency * only allow adding reference to project in the same workspace * fix location dropdown when project reference is enabled * add tests * more tests * cleanup * fix flakey test * addressing comments
This commit is contained in:
@@ -9,11 +9,10 @@ import * as dataworkspace from 'dataworkspace';
|
||||
import * as templates from '../templates/templates';
|
||||
import * as constants from '../common/constants';
|
||||
import * as path from 'path';
|
||||
import * as glob from 'fast-glob';
|
||||
import * as newProjectTool from '../tools/newProjectTool';
|
||||
|
||||
import { SqlDatabaseProjectTreeViewProvider } from './databaseProjectTreeViewProvider';
|
||||
import { getErrorMessage } from '../common/utils';
|
||||
import { getErrorMessage, getSqlProjectFilesInFolder } from '../common/utils';
|
||||
import { ProjectsController } from './projectController';
|
||||
import { BaseProjectTreeItem } from '../models/tree/baseTreeItem';
|
||||
import { NetCoreTool } from '../tools/netcoreTool';
|
||||
@@ -113,10 +112,7 @@ export default class MainController implements vscode.Disposable {
|
||||
}
|
||||
|
||||
public async loadProjectsInFolder(folderPath: string): Promise<void> {
|
||||
// path needs to use forward slashes for glob to work
|
||||
let escapedPath = glob.escapePath(folderPath.replace(/\\/g, '/'));
|
||||
let sqlprojFilter = path.posix.join(escapedPath, '**', '*.sqlproj');
|
||||
let results = await glob(sqlprojFilter);
|
||||
const results = await getSqlProjectFilesInFolder(folderPath);
|
||||
|
||||
for (let f in results) {
|
||||
// open the project, but don't switch focus to the file explorer viewlet
|
||||
|
||||
@@ -28,7 +28,7 @@ import { NetCoreTool, DotNetCommandOptions } from '../tools/netcoreTool';
|
||||
import { BuildHelper } from '../tools/buildHelper';
|
||||
import { PublishProfile, load } from '../models/publishProfile/publishProfile';
|
||||
import { AddDatabaseReferenceDialog } from '../dialogs/addDatabaseReferenceDialog';
|
||||
import { ISystemDatabaseReferenceSettings, IDacpacReferenceSettings } from '../models/IDatabaseReferenceSettings';
|
||||
import { ISystemDatabaseReferenceSettings, IDacpacReferenceSettings, IProjectReferenceSettings } from '../models/IDatabaseReferenceSettings';
|
||||
|
||||
/**
|
||||
* Controller for managing project lifecycle
|
||||
@@ -76,7 +76,6 @@ export class ProjectsController {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -486,9 +485,28 @@ export class ProjectsController {
|
||||
return addDatabaseReferenceDialog;
|
||||
}
|
||||
|
||||
public async addDatabaseReferenceCallback(project: Project, settings: ISystemDatabaseReferenceSettings | IDacpacReferenceSettings): Promise<void> {
|
||||
public async addDatabaseReferenceCallback(project: Project, settings: ISystemDatabaseReferenceSettings | IDacpacReferenceSettings | IProjectReferenceSettings): Promise<void> {
|
||||
try {
|
||||
if ((<ISystemDatabaseReferenceSettings>settings).systemDb !== undefined) {
|
||||
if ((<IProjectReferenceSettings>settings).projectName !== undefined) {
|
||||
// get project path and guid
|
||||
const projectReferenceSettings = settings as IProjectReferenceSettings;
|
||||
const referencedProject = this.projects.find(p => p.projectFileName === projectReferenceSettings.projectName);
|
||||
const relativePath = path.relative(project.projectFolderPath, referencedProject?.projectFilePath!);
|
||||
projectReferenceSettings.projectRelativePath = vscode.Uri.file(relativePath);
|
||||
projectReferenceSettings.projectGuid = referencedProject?.projectGuid!;
|
||||
|
||||
const projectReferences = referencedProject?.databaseReferences.filter(r => r instanceof SqlProjectReferenceProjectEntry) ?? [];
|
||||
|
||||
// check for cirular dependency
|
||||
for (let r of projectReferences) {
|
||||
if ((<SqlProjectReferenceProjectEntry>r).projectName === project.projectFileName) {
|
||||
vscode.window.showErrorMessage(constants.cantAddCircularProjectReference(referencedProject?.projectFileName!));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
await project.addProjectReference(projectReferenceSettings);
|
||||
} else if ((<ISystemDatabaseReferenceSettings>settings).systemDb !== undefined) {
|
||||
await project.addSystemDatabaseReference(<ISystemDatabaseReferenceSettings>settings);
|
||||
} else {
|
||||
await project.addDatabaseReference(<IDacpacReferenceSettings>settings);
|
||||
|
||||
Reference in New Issue
Block a user