diff --git a/.changeset/wicked-dancers-count.md b/.changeset/wicked-dancers-count.md new file mode 100644 index 0000000000..24d3e95a05 --- /dev/null +++ b/.changeset/wicked-dancers-count.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Fixed bug in fs:delete causing no files to be deleted on windows machines diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.test.ts index f037323c04..b0b16c6d12 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.test.ts @@ -144,4 +144,25 @@ describe('fs:delete', () => { expect(fileExists).toBe(false); }); }); + + it('should handle windows style file paths', async () => { + const files = ['unit-test-a.js', 'unit-test-b.js']; + + files.forEach(file => { + const filePath = resolvePath(workspacePath, file); + const fileExists = fs.existsSync(filePath); + expect(fileExists).toBe(true); + }); + + await action.handler({ + ...mockContext, + input: { files: files.map(file => `.\\${file}`) }, + }); + + files.forEach(file => { + const filePath = resolvePath(workspacePath, file); + const fileExists = fs.existsSync(filePath); + expect(fileExists).toBe(false); + }); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts index 5a06c7d2aa..b2f9cddea4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/filesystem/delete.ts @@ -53,7 +53,11 @@ export const createFilesystemDeleteAction = () => { } for (const file of ctx.input.files) { - const safeFilepath = resolveSafeChildPath(ctx.workspacePath, file); + // globby cannot handle backslash file separators + const safeFilepath = resolveSafeChildPath( + ctx.workspacePath, + file, + ).replace(/\\/g, '/'); const resolvedPaths = await globby(safeFilepath, { cwd: ctx.workspacePath, absolute: true,