diff --git a/packages/snyk-protect/src/lib/patch.ts b/packages/snyk-protect/src/lib/patch.ts index f6a1534ff8..1983b7fe49 100644 --- a/packages/snyk-protect/src/lib/patch.ts +++ b/packages/snyk-protect/src/lib/patch.ts @@ -6,9 +6,16 @@ export function applyPatchToFile(patchContents: string, baseFolder: string) { baseFolder, extractTargetFilePathFromPatch(patchContents), ); + + const flagPath = `${targetFilePath}.snyk-protect.flag`; + if (fs.existsSync(flagPath)) { + return targetFilePath; + } + const contentsToPatch = fs.readFileSync(targetFilePath, 'utf-8'); const patchedContents = patchString(patchContents, contentsToPatch); fs.writeFileSync(targetFilePath, patchedContents); + fs.writeFileSync(flagPath, ''); return targetFilePath; } diff --git a/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts b/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts index 9c01d8bbbf..46c0e7685d 100644 --- a/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts +++ b/packages/snyk-protect/test/acceptance/fix-pr.smoke.spec.ts @@ -9,6 +9,22 @@ describe('Fix PR', () => { const project = await createProject('fix-pr'); const patchedLodash = await getPatchedLodash(); + expect( + await runCommand('npm', ['install'], { + cwd: project.path(), + }), + ).toEqual( + expect.objectContaining({ + code: 0, + stdout: expect.stringContaining('Applied Snyk patches'), + stderr: expect.not.stringMatching(/snyk/gi), + }), + ); + + await expect( + project.read('node_modules/lodash/lodash.js'), + ).resolves.toEqual(patchedLodash); + expect( await runCommand('npm', ['install'], { cwd: project.path(), @@ -17,7 +33,7 @@ describe('Fix PR', () => { expect.objectContaining({ code: 0, stdout: expect.stringContaining('Applied Snyk patches.'), - stderr: expect.any(String), + stderr: expect.not.stringMatching(/snyk/gi), }), );