From 0b5c0663106a538ee5bb953248f225210a698170 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Tue, 17 Sep 2024 16:30:01 -0700 Subject: [PATCH] put exact build command in manifest instead of flag --- .../chat/controller/controller.ts | 6 ++- .../chat/controller/messenger/messenger.ts | 2 +- .../commands/startTransformByQ.ts | 2 +- .../src/codewhisperer/models/constants.ts | 6 ++- .../core/src/codewhisperer/models/model.ts | 14 +++--- .../transformByQ/transformMavenHandler.ts | 49 ++----------------- .../commands/transformByQ.test.ts | 4 +- 7 files changed, 23 insertions(+), 60 deletions(-) diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index fb32cdb671..65deea82b5 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -343,9 +343,11 @@ export class GumbyController { private async handleSkipTestsSelection(message: any) { const skipTestsSelection = message.formSelectedValues['GumbyTransformSkipTestsForm'] if (skipTestsSelection === CodeWhispererConstants.skipIntegrationTestsMessage) { - transformByQState.setSkipTestsFlag(CodeWhispererConstants.skipIntegrationTestsFlag) + transformByQState.setCustomBuildCommand(CodeWhispererConstants.skipIntegrationTestsBuildCommand) } else if (skipTestsSelection === CodeWhispererConstants.skipAllTestsMessage) { - transformByQState.setSkipTestsFlag(CodeWhispererConstants.skipAllTestsFlag) + transformByQState.setCustomBuildCommand(CodeWhispererConstants.skipAllTestsBuildCommand) + } else { + transformByQState.setCustomBuildCommand(CodeWhispererConstants.doNotSkipTestsBuildCommand) } telemetry.codeTransform_submitSelection.emit({ codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts index 4653881bf4..595c5fdb56 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts @@ -470,7 +470,7 @@ export class Messenger { if (skipTestsText === CodeWhispererConstants.doNotSkipTestsMessage) { skipTestsText = 'not skip tests' } - const message = `Got it! Amazon Q will ${skipTestsText.toLowerCase()} when building your project.` + const message = `Ok, I will ${skipTestsText.toLowerCase()} when building your project.` this.dispatcher.sendChatMessage(new ChatMessage({ message, messageType: 'prompt' }, tabID)) } diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index 71e2c33b4a..d0c232317c 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -276,7 +276,7 @@ export async function preTransformationUploadCode() { const transformZipManifest = new ZipManifest() // if the user chose to skip tests, add the flag here - transformZipManifest.skipTestsFlag = transformByQState.getSkipTestsFlag() + transformZipManifest.customBuildCommand = transformByQState.getCustomBuildCommand() const zipCodeResult = await zipCode({ dependenciesFolder: transformByQState.getDependencyFolderInfo()!, modulePath: transformByQState.getProjectPath(), diff --git a/packages/core/src/codewhisperer/models/constants.ts b/packages/core/src/codewhisperer/models/constants.ts index 2f5ebab457..22bc6149c1 100644 --- a/packages/core/src/codewhisperer/models/constants.ts +++ b/packages/core/src/codewhisperer/models/constants.ts @@ -639,13 +639,15 @@ export const skipTestsFormMessage = export const doNotSkipTestsMessage = 'Do not skip tests' +export const doNotSkipTestsBuildCommand = 'verify' + export const skipIntegrationTestsMessage = 'Skip integration tests' -export const skipIntegrationTestsFlag = '-DskipITs' +export const skipIntegrationTestsBuildCommand = 'test' export const skipAllTestsMessage = 'Skip all tests' -export const skipAllTestsFlag = '-DskipTests' +export const skipAllTestsBuildCommand = 'test-compile' export const planTitle = 'Code Transformation plan by Amazon Q' diff --git a/packages/core/src/codewhisperer/models/model.ts b/packages/core/src/codewhisperer/models/model.ts index 71fda4443b..ccc2473d26 100644 --- a/packages/core/src/codewhisperer/models/model.ts +++ b/packages/core/src/codewhisperer/models/model.ts @@ -316,7 +316,7 @@ export class ZipManifest { version: string = '1.0' hilCapabilities: string[] = ['HIL_1pDependency_VersionUpgrade'] transformCapabilities: string[] = ['EXPLAINABILITY_V1'] - skipTestsFlag: string = '' + customBuildCommand: string = '' } export interface IHilZipManifestParams { @@ -375,7 +375,7 @@ export class TransformByQState { private targetJDKVersion: JDKVersion = JDKVersion.JDK17 - private skipTestsFlag: string = '' + private customBuildCommand: string = '' private planFilePath: string = '' private summaryFilePath: string = '' @@ -440,8 +440,8 @@ export class TransformByQState { return this.projectPath } - public getSkipTestsFlag() { - return this.skipTestsFlag + public getCustomBuildCommand() { + return this.customBuildCommand } public getPreBuildLogFilePath() { @@ -568,8 +568,8 @@ export class TransformByQState { this.projectPath = path } - public setSkipTestsFlag(flags: string) { - this.skipTestsFlag = flags + public setCustomBuildCommand(command: string) { + this.customBuildCommand = command } public setStartTime(time: string) { @@ -667,7 +667,7 @@ export class TransformByQState { this.jobFailureMetadata = '' this.payloadFilePath = '' this.errorLog = '' - this.skipTestsFlag = '' + this.customBuildCommand = '' this.intervalId = undefined } } diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts index 6498bdb121..e79f5e1606 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts @@ -59,28 +59,7 @@ function installProjectDependencies(dependenciesFolder: FolderInfo, modulePath: getLogger().error( `CodeTransformation: Error in running Maven ${argString} command ${baseCommand} = ${errorLog}` ) - let errorReason = '' - if (spawnResult.stdout) { - errorReason = `Maven ${argString}: InstallationExecutionError` - /* - * adding this check here because these mvn commands sometimes generate a lot of output. - * rarely, a buffer overflow has resulted when these mvn commands are run with -X, -e flags - * which are not being used here (for now), but still keeping this just in case. - */ - if (Buffer.byteLength(spawnResult.stdout, 'utf-8') > CodeWhispererConstants.maxBufferSize) { - errorReason += '-BufferOverflow' - } - } else { - errorReason = `Maven ${argString}: InstallationSpawnError` - } - if (spawnResult.error) { - const errorCode = (spawnResult.error as any).code ?? 'UNKNOWN' - errorReason += `-${errorCode}` - } - - // Explicitly set metric as failed since no exception was caught - telemetry.record({ result: MetadataResult.Fail, reason: errorReason }) - + telemetry.record({ result: MetadataResult.Fail, reason: (spawnResult.error as any).code }) throw new ToolkitError(`Maven ${argString} error`, { code: 'MavenExecutionError' }) } else { transformByQState.appendToErrorLog(`${baseCommand} ${argString} succeeded`) @@ -102,11 +81,12 @@ function copyProjectDependencies(dependenciesFolder: FolderInfo, modulePath: str '-Dmdep.addParentPoms=true', '-q', ] + let environment = process.env - // if JAVA_HOME not found or not matching project JDK, get user input for it and set here if (transformByQState.getJavaHome() !== undefined) { environment = { ...process.env, JAVA_HOME: transformByQState.getJavaHome() } } + const spawnResult = spawnSync(baseCommand, args, { cwd: modulePath, shell: true, @@ -119,30 +99,9 @@ function copyProjectDependencies(dependenciesFolder: FolderInfo, modulePath: str errorLog += spawnResult.error ? JSON.stringify(spawnResult.error) : '' errorLog += `${spawnResult.stderr}\n${spawnResult.stdout}` transformByQState.appendToErrorLog(`${baseCommand} copy-dependencies failed: \n ${errorLog}`) - let errorReason = '' - if (spawnResult.stdout) { - errorReason = 'Maven Copy: CopyDependenciesExecutionError' - if (Buffer.byteLength(spawnResult.stdout, 'utf-8') > CodeWhispererConstants.maxBufferSize) { - errorReason += '-BufferOverflow' - } - } else { - errorReason = 'Maven Copy: CopyDependenciesSpawnError' - } - if (spawnResult.error) { - const errorCode = (spawnResult.error as any).code ?? 'UNKNOWN' - errorReason += `-${errorCode}` - } getLogger().info( - `CodeTransformation: Maven copy-dependencies command ${baseCommand} failed, but still continuing with transformation: ${errorReason}, log: ${errorLog}` + `CodeTransformation: Maven copy-dependencies command ${baseCommand} failed, but still continuing with transformation: ${errorLog}` ) - - let mavenBuildCommand = transformByQState.getMavenName() - // slashes not allowed in telemetry - if (mavenBuildCommand === './mvnw') { - mavenBuildCommand = 'mvnw' - } else if (mavenBuildCommand === '.\\mvnw.cmd') { - mavenBuildCommand = 'mvnw.cmd' - } throw new Error('Maven copy-deps error') } else { transformByQState.appendToErrorLog(`${baseCommand} copy-dependencies succeeded`) diff --git a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts index 37c34bb92f..84b75c7717 100644 --- a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts +++ b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts @@ -207,7 +207,7 @@ describe('transformByQ', function () { const tempFileName = `testfile-${globals.clock.Date.now()}.zip` transformByQState.setProjectPath(tempDir) const transformManifest = new ZipManifest() - transformManifest.skipTestsFlag = '-DskipTests' + transformManifest.customBuildCommand = 'test-compile' return zipCode({ dependenciesFolder: { path: tempDir, @@ -225,7 +225,7 @@ describe('transformByQ', function () { const manifestBuffer = manifestEntry.getData() const manifestText = manifestBuffer.toString('utf8') const manifest = JSON.parse(manifestText) - assert.strictEqual(manifest.skipTestsFlag, '-DskipTests') + assert.strictEqual(manifest.customBuildCommand, 'test-compile') }) })