From cd6b39ffeee4a990fd0dd52a52bb42e9ccb1346c Mon Sep 17 00:00:00 2001 From: Kim Santiago <31145923+kisantia@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:01:39 -0800 Subject: [PATCH] add a project guid if a sql project doesn't have one (#18009) --- .../src/common/constants.ts | 1 + .../src/models/project.ts | 10 +++++-- .../src/test/baselines/baselines.ts | 2 ++ ...dkStyleSqlProjectNoProjectGuidBaseline.xml | 26 +++++++++++++++++++ .../src/test/project.test.ts | 16 +++++++++++- 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 extensions/sql-database-projects/src/test/baselines/openSdkStyleSqlProjectNoProjectGuidBaseline.xml diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 3a80bcceb8..acd733977f 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -376,6 +376,7 @@ export const True = 'True'; export const False = 'False'; export const Private = 'Private'; export const ProjectGuid = 'ProjectGuid'; +export const PropertyGroup = 'PropertyGroup'; export const Type = 'Type'; export const ExternalStreamingJob: string = 'ExternalStreamingJob'; export const Sdk: string = 'Sdk'; diff --git a/extensions/sql-database-projects/src/models/project.ts b/extensions/sql-database-projects/src/models/project.ts index b8843946d5..76f5d470d2 100644 --- a/extensions/sql-database-projects/src/models/project.ts +++ b/extensions/sql-database-projects/src/models/project.ts @@ -10,6 +10,7 @@ import * as utils from '../common/utils'; import * as xmlFormat from 'xml-formatter'; import * as os from 'os'; import * as templates from '../templates/templates'; +import * as UUID from 'vscode-languageclient/lib/utils/uuid'; import { Uri, window } from 'vscode'; import { ISqlProject, SqlTargetPlatform } from 'sqldbproj'; @@ -146,8 +147,13 @@ export class Project implements ISqlProject { try { this._projectGuid = this.projFileXmlDoc!.documentElement.getElementsByTagName(constants.ProjectGuid)[0].childNodes[0].nodeValue!; } catch (e) { - void window.showErrorMessage(constants.errorReadingProject(constants.ProjectGuid, this.projectFilePath)); - console.error(utils.getErrorMessage(e)); + // if no project guid, add a new one + this._projectGuid = UUID.generateUuid(); + const newProjectGuidNode = this.projFileXmlDoc!.createElement(constants.ProjectGuid); + const newProjectGuidTextNode = this.projFileXmlDoc!.createTextNode(`{${this._projectGuid}}`); + newProjectGuidNode.appendChild(newProjectGuidTextNode); + this.projFileXmlDoc!.documentElement.getElementsByTagName(constants.PropertyGroup)[0]?.appendChild(newProjectGuidNode); + await this.serializeToProjFile(this.projFileXmlDoc); } } diff --git a/extensions/sql-database-projects/src/test/baselines/baselines.ts b/extensions/sql-database-projects/src/test/baselines/baselines.ts index 9c346869bf..7f3eb63deb 100644 --- a/extensions/sql-database-projects/src/test/baselines/baselines.ts +++ b/extensions/sql-database-projects/src/test/baselines/baselines.ts @@ -34,6 +34,7 @@ export let openSdkStyleSqlProjectBaseline: string; export let openSdkStyleSqlProjectWithFilesSpecifiedBaseline: string; export let openSdkStyleSqlProjectWithGlobsSpecifiedBaseline: string; export let openSdkStyleSqlProjectWithBuildRemoveBaseline: string; +export let openSdkStyleSqlProjectNoProjectGuidBaseline: string; const baselineFolderPath = __dirname; @@ -65,6 +66,7 @@ export async function loadBaselines() { openSdkStyleSqlProjectWithFilesSpecifiedBaseline = await loadBaseline(baselineFolderPath, 'openSdkStyleSqlProjectWithFilesSpecifiedBaseline.xml'); openSdkStyleSqlProjectWithGlobsSpecifiedBaseline = await loadBaseline(baselineFolderPath, 'openSdkStyleSqlProjectWithGlobsSpecifiedBaseline.xml'); openSdkStyleSqlProjectWithBuildRemoveBaseline = await loadBaseline(baselineFolderPath, 'openSdkStyleSqlProjectWithBuildRemoveBaseline.xml'); + openSdkStyleSqlProjectNoProjectGuidBaseline = await loadBaseline(baselineFolderPath, 'openSdkStyleSqlProjectNoProjectGuidBaseline.xml'); } async function loadBaseline(baselineFolderPath: string, fileName: string): Promise { diff --git a/extensions/sql-database-projects/src/test/baselines/openSdkStyleSqlProjectNoProjectGuidBaseline.xml b/extensions/sql-database-projects/src/test/baselines/openSdkStyleSqlProjectNoProjectGuidBaseline.xml new file mode 100644 index 0000000000..95a75083d4 --- /dev/null +++ b/extensions/sql-database-projects/src/test/baselines/openSdkStyleSqlProjectNoProjectGuidBaseline.xml @@ -0,0 +1,26 @@ + + + + + TestProjectName + Microsoft.Data.Tools.Schema.Sql.Sql150DatabaseSchemaProvider + 1033, CI + + + + + + + MyProdDatabase + $(SqlCmdVar__1) + + + MyBackupDatabase + $(SqlCmdVar__2) + + + + + + + diff --git a/extensions/sql-database-projects/src/test/project.test.ts b/extensions/sql-database-projects/src/test/project.test.ts index 92de05b087..62dfa672bf 100644 --- a/extensions/sql-database-projects/src/test/project.test.ts +++ b/extensions/sql-database-projects/src/test/project.test.ts @@ -1097,7 +1097,6 @@ describe('Project: sdk style project content operations', function (): void { should(projFileText.includes('')).equal(false, projFileText); }); - it('Should handle excluding nested glob included folders', async function (): Promise { const testFolderPath = await testUtils.generateTestFolderPath(); projFilePath = await testUtils.createTestSqlProjFile(baselines.openSdkStyleSqlProjectBaseline, testFolderPath); @@ -1344,6 +1343,21 @@ describe('Project: sdk style project content operations', function (): void { should(projFileText.includes('')).equal(false, projFileText); should(projFileText.includes('')).equal(false, projFileText); }); + + it('Should add a project guid if there is not one in the sqlproj', async function (): Promise { + projFilePath = await testUtils.createTestSqlProjFile(baselines.openSdkStyleSqlProjectNoProjectGuidBaseline); + let projFileText = (await fs.readFile(projFilePath)).toString(); + + // verify no project guid + should(projFileText.includes(constants.ProjectGuid)).equal(false); + + const project: Project = await Project.openProject(projFilePath); + + // verify project guid was added + projFileText = (await fs.readFile(projFilePath)).toString(); + should(project.projectGuid).not.equal(undefined); + should(projFileText.includes(constants.ProjectGuid)).equal(true); + }); }); describe('Project: add SQLCMD Variables', function (): void {