mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Add dacpac references to sqlproj with relative path (#14877)
* relative paths written to sqlproj, but can't delete yet * only keep track of relative path * remove leading slash * add test * use path.relative * Add error message if dacpac reference is located on a different drive
This commit is contained in:
@@ -111,6 +111,7 @@ export const databaseNameServerNameVariableRequired = localize('databaseNameServ
|
|||||||
export const otherServer = 'OtherServer';
|
export const otherServer = 'OtherServer';
|
||||||
export const otherSeverVariable = 'OtherServer';
|
export const otherSeverVariable = 'OtherServer';
|
||||||
export const databaseProject = localize('databaseProject', "Database project");
|
export const databaseProject = localize('databaseProject', "Database project");
|
||||||
|
export const dacpacNotOnSameDrive = (projectLocation: string): string => { return localize('dacpacNotOnSameDrive', "Dacpac references need to be located on the same drive as the project file. The project file is located at {0}", projectLocation); };
|
||||||
|
|
||||||
// Create Project From Database dialog strings
|
// Create Project From Database dialog strings
|
||||||
|
|
||||||
|
|||||||
@@ -580,7 +580,10 @@ export class ProjectsController {
|
|||||||
} else if ((<ISystemDatabaseReferenceSettings>settings).systemDb !== undefined) {
|
} else if ((<ISystemDatabaseReferenceSettings>settings).systemDb !== undefined) {
|
||||||
await project.addSystemDatabaseReference(<ISystemDatabaseReferenceSettings>settings);
|
await project.addSystemDatabaseReference(<ISystemDatabaseReferenceSettings>settings);
|
||||||
} else {
|
} else {
|
||||||
await project.addDatabaseReference(<IDacpacReferenceSettings>settings);
|
// update dacpacFileLocation to relative path to project file
|
||||||
|
const dacpacRefSettings = settings as IDacpacReferenceSettings;
|
||||||
|
dacpacRefSettings.dacpacFileLocation = vscode.Uri.file(path.relative(project.projectFolderPath, dacpacRefSettings.dacpacFileLocation.fsPath));
|
||||||
|
await project.addDatabaseReference(dacpacRefSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.refreshProjectsTree(context);
|
this.refreshProjectsTree(context);
|
||||||
|
|||||||
@@ -54,6 +54,27 @@ export class AddDatabaseReferenceDialog {
|
|||||||
constructor(private project: Project) {
|
constructor(private project: Project) {
|
||||||
this.dialog = azdata.window.createModelViewDialog(constants.addDatabaseReferenceDialogName, 'addDatabaseReferencesDialog');
|
this.dialog = azdata.window.createModelViewDialog(constants.addDatabaseReferenceDialogName, 'addDatabaseReferencesDialog');
|
||||||
this.addDatabaseReferenceTab = azdata.window.createTab(constants.addDatabaseReferenceDialogName);
|
this.addDatabaseReferenceTab = azdata.window.createTab(constants.addDatabaseReferenceDialogName);
|
||||||
|
this.dialog.registerCloseValidator(async () => {
|
||||||
|
return this.validate();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
validate(): boolean {
|
||||||
|
// only support adding dacpacs that are on the same drive as the sqlproj
|
||||||
|
if (this.currentReferenceType === ReferenceType.dacpac) {
|
||||||
|
const projectDrive = path.parse(this.project.projectFilePath).root;
|
||||||
|
const dacpacDrive = path.parse(this.dacpacTextbox!.value!).root;
|
||||||
|
|
||||||
|
if (projectDrive !== dacpacDrive) {
|
||||||
|
this.dialog.message = {
|
||||||
|
text: constants.dacpacNotOnSameDrive(this.project.projectFilePath),
|
||||||
|
level: azdata.window.MessageLevel.Error
|
||||||
|
};
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async openDialog(): Promise<void> {
|
public async openDialog(): Promise<void> {
|
||||||
|
|||||||
@@ -1020,6 +1020,11 @@ export class DacpacReferenceProjectEntry extends FileProjectEntry implements IDa
|
|||||||
public get databaseName(): string {
|
public get databaseName(): string {
|
||||||
return path.parse(utils.getPlatformSafeFileEntryPath(this.fsUri.fsPath)).name;
|
return path.parse(utils.getPlatformSafeFileEntryPath(this.fsUri.fsPath)).name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public pathForSqlProj(): string {
|
||||||
|
// need to remove the leading slash from path for build to work
|
||||||
|
return utils.convertSlashesForSqlProj(this.fsUri.path.substring(1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class SystemDatabaseReferenceProjectEntry extends FileProjectEntry implements IDatabaseReferenceProjectEntry {
|
export class SystemDatabaseReferenceProjectEntry extends FileProjectEntry implements IDatabaseReferenceProjectEntry {
|
||||||
|
|||||||
@@ -601,6 +601,62 @@ describe('ProjectsController', function (): void {
|
|||||||
should(showErrorMessageSpy.called).be.true('showErrorMessage should have been called');
|
should(showErrorMessageSpy.called).be.true('showErrorMessage should have been called');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('Should add dacpac references as relative paths', async function (): Promise<void> {
|
||||||
|
const projFilePath = await testUtils.createTestSqlProjFile(baselines.newProjectFileBaseline);
|
||||||
|
const projController = new ProjectsController();
|
||||||
|
|
||||||
|
const project1 = await Project.openProject(vscode.Uri.file(projFilePath).fsPath);
|
||||||
|
const showErrorMessageSpy = sinon.spy(vscode.window, 'showErrorMessage');
|
||||||
|
const dataWorkspaceMock = TypeMoq.Mock.ofType<dataworkspace.IExtension>();
|
||||||
|
sinon.stub(vscode.extensions, 'getExtension').returns(<any>{ exports: dataWorkspaceMock.object });
|
||||||
|
|
||||||
|
// add dacpac reference to something in the same folder
|
||||||
|
should(project1.databaseReferences.length).equal(0, 'There should not be any database references to start with');
|
||||||
|
|
||||||
|
await projController.addDatabaseReferenceCallback(project1, {
|
||||||
|
databaseName: <string>this.databaseNameTextbox?.value,
|
||||||
|
dacpacFileLocation: vscode.Uri.file(path.join(path.dirname(projFilePath), 'sameFolderTest.dacpac')),
|
||||||
|
suppressMissingDependenciesErrors: false
|
||||||
|
},
|
||||||
|
{ treeDataProvider: new SqlDatabaseProjectTreeViewProvider(), element: undefined });
|
||||||
|
should(showErrorMessageSpy.notCalled).be.true('showErrorMessage should not have been called');
|
||||||
|
should(project1.databaseReferences.length).equal(1, 'Dacpac reference should have been added');
|
||||||
|
should(project1.databaseReferences[0].databaseName).equal('sameFolderTest');
|
||||||
|
should(project1.databaseReferences[0].pathForSqlProj()).equal('sameFolderTest.dacpac');
|
||||||
|
// make sure reference to sameFolderTest.dacpac was added to project file
|
||||||
|
let projFileText = (await fs.readFile(projFilePath)).toString();
|
||||||
|
should(projFileText).containEql('sameFolderTest.dacpac');
|
||||||
|
|
||||||
|
// add dacpac reference to something in the a nested folder
|
||||||
|
await projController.addDatabaseReferenceCallback(project1, {
|
||||||
|
databaseName: <string>this.databaseNameTextbox?.value,
|
||||||
|
dacpacFileLocation: vscode.Uri.file(path.join(path.dirname(projFilePath), 'refs', 'nestedFolderTest.dacpac')),
|
||||||
|
suppressMissingDependenciesErrors: false
|
||||||
|
},
|
||||||
|
{ treeDataProvider: new SqlDatabaseProjectTreeViewProvider(), element: undefined });
|
||||||
|
should(showErrorMessageSpy.notCalled).be.true('showErrorMessage should not have been called');
|
||||||
|
should(project1.databaseReferences.length).equal(2, 'Another dacpac reference should have been added');
|
||||||
|
should(project1.databaseReferences[1].databaseName).equal('nestedFolderTest');
|
||||||
|
should(project1.databaseReferences[1].pathForSqlProj()).equal('refs\\nestedFolderTest.dacpac');
|
||||||
|
// make sure reference to nestedFolderTest.dacpac was added to project file
|
||||||
|
projFileText = (await fs.readFile(projFilePath)).toString();
|
||||||
|
should(projFileText).containEql('refs\\nestedFolderTest.dacpac');
|
||||||
|
|
||||||
|
// add dacpac reference to something in the a folder outside of the project
|
||||||
|
await projController.addDatabaseReferenceCallback(project1, {
|
||||||
|
databaseName: <string>this.databaseNameTextbox?.value,
|
||||||
|
dacpacFileLocation: vscode.Uri.file(path.join(path.dirname(projFilePath), '..','someFolder', 'outsideFolderTest.dacpac')),
|
||||||
|
suppressMissingDependenciesErrors: false
|
||||||
|
},
|
||||||
|
{ treeDataProvider: new SqlDatabaseProjectTreeViewProvider(), element: undefined });
|
||||||
|
should(showErrorMessageSpy.notCalled).be.true('showErrorMessage should not have been called');
|
||||||
|
should(project1.databaseReferences.length).equal(3, 'Another dacpac reference should have been added');
|
||||||
|
should(project1.databaseReferences[2].databaseName).equal('outsideFolderTest');
|
||||||
|
should(project1.databaseReferences[2].pathForSqlProj()).equal('..\\someFolder\\outsideFolderTest.dacpac');
|
||||||
|
// make sure reference to outsideFolderTest.dacpac was added to project file
|
||||||
|
projFileText = (await fs.readFile(projFilePath)).toString();
|
||||||
|
should(projFileText).containEql('..\\someFolder\\outsideFolderTest.dacpac');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user