diff --git a/.changeset/calm-scissors-rescue.md b/.changeset/calm-scissors-rescue.md new file mode 100644 index 0000000000..4a5318d240 --- /dev/null +++ b/.changeset/calm-scissors-rescue.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Create unique temp directory for each `create-app` execution. diff --git a/packages/create-app/src/createApp.test.ts b/packages/create-app/src/createApp.test.ts index 47c62520e0..7cb9733567 100644 --- a/packages/create-app/src/createApp.test.ts +++ b/packages/create-app/src/createApp.test.ts @@ -36,10 +36,6 @@ const templatingMock = jest.spyOn(tasks, 'templatingTask'); const checkAppExistsMock = jest.spyOn(tasks, 'checkAppExistsTask'); const tryInitGitRepositoryMock = jest.spyOn(tasks, 'tryInitGitRepository'); const readGitConfig = jest.spyOn(tasks, 'readGitConfig'); -const createTemporaryAppFolderMock = jest.spyOn( - tasks, - 'createTemporaryAppFolderTask', -); const moveAppMock = jest.spyOn(tasks, 'moveAppTask'); const buildAppMock = jest.spyOn(tasks, 'buildAppTask'); @@ -73,7 +69,6 @@ describe('command entrypoint', () => { const cmd = {} as unknown as Command; await createApp(cmd); expect(checkAppExistsMock).toHaveBeenCalled(); - expect(createTemporaryAppFolderMock).toHaveBeenCalled(); expect(tryInitGitRepositoryMock).toHaveBeenCalled(); expect(templatingMock).toHaveBeenCalled(); expect(templatingMock.mock.lastCall?.[0]).toEqual( @@ -85,7 +80,7 @@ describe('command entrypoint', () => { 'default-app', ), ); - expect(templatingMock.mock.lastCall?.[1]).toEqual( + expect(templatingMock.mock.lastCall?.[1]).toContain( path.join(tmpdir(), 'MyApp'), ); expect(moveAppMock).toHaveBeenCalled(); diff --git a/packages/create-app/src/createApp.ts b/packages/create-app/src/createApp.ts index efa299a3c9..bfa53f03c0 100644 --- a/packages/create-app/src/createApp.ts +++ b/packages/create-app/src/createApp.ts @@ -20,12 +20,12 @@ import inquirer, { Answers } from 'inquirer'; import { resolve as resolvePath } from 'path'; import { findPaths } from '@backstage/cli-common'; import os from 'os'; +import fs from 'fs-extra'; import { Task, buildAppTask, checkAppExistsTask, checkPathExistsTask, - createTemporaryAppFolderTask, moveAppTask, templatingTask, tryInitGitRepository, @@ -37,7 +37,6 @@ const DEFAULT_BRANCH = 'master'; export default async (opts: OptionValues): Promise => { /* eslint-disable-next-line no-restricted-syntax */ const paths = findPaths(__dirname); - const answers: Answers = await inquirer.prompt([ { type: 'input', @@ -68,7 +67,6 @@ export default async (opts: OptionValues): Promise => { const templateDir = opts.templatePath ? paths.resolveTarget(opts.templatePath) : paths.resolveOwn('templates/default-app'); - const tempDir = resolvePath(os.tmpdir(), answers.name); // Use `--path` argument as application directory when specified, otherwise // create a directory using `answers.name` @@ -100,7 +98,9 @@ export default async (opts: OptionValues): Promise => { await checkAppExistsTask(paths.targetDir, answers.name); Task.section('Creating a temporary app directory'); - await createTemporaryAppFolderTask(tempDir); + const tempDir = await fs.mkdtemp( + resolvePath(resolvePath(os.tmpdir(), answers.name)), + ); Task.section('Preparing files'); await templatingTask(templateDir, tempDir, { diff --git a/packages/create-app/src/lib/tasks.test.ts b/packages/create-app/src/lib/tasks.test.ts index 781e6a126c..68afdc9222 100644 --- a/packages/create-app/src/lib/tasks.test.ts +++ b/packages/create-app/src/lib/tasks.test.ts @@ -24,7 +24,6 @@ import { buildAppTask, checkAppExistsTask, checkPathExistsTask, - createTemporaryAppFolderTask, moveAppTask, templatingTask, tryInitGitRepository, @@ -163,30 +162,6 @@ describe('tasks', () => { }); }); - describe('createTemporaryAppFolderTask', () => { - it('should create a directory at a given path', async () => { - const tempDir = 'projects/tmpFolder'; - await expect( - createTemporaryAppFolderTask(tempDir), - ).resolves.not.toThrow(); - expect(fs.existsSync(tempDir)).toBe(true); - }); - - it('should fail if a directory of the same name exists', async () => { - const tempDir = 'projects/dir'; - await expect(createTemporaryAppFolderTask(tempDir)).rejects.toThrow( - 'file already exists', - ); - }); - - it('should fail if a file of the same name exists', async () => { - const tempDir = 'projects/dir/my-file.txt'; - await expect(createTemporaryAppFolderTask(tempDir)).rejects.toThrow( - 'file already exists', - ); - }); - }); - describe('buildAppTask', () => { it('should change to `appDir` and run `yarn install` and `yarn tsc`', async () => { const mockChdir = jest.spyOn(process, 'chdir'); diff --git a/packages/create-app/src/lib/tasks.ts b/packages/create-app/src/lib/tasks.ts index 1943b0c3cc..90e6f6ae53 100644 --- a/packages/create-app/src/lib/tasks.ts +++ b/packages/create-app/src/lib/tasks.ts @@ -178,22 +178,6 @@ export async function checkPathExistsTask(path: string) { }); } -/** - * Create a folder to store templated files - * - * @param tempDir - target temporary directory - * @throws if `fs.mkdir` fails - */ -export async function createTemporaryAppFolderTask(tempDir: string) { - await Task.forItem('creating', 'temporary directory', async () => { - try { - await fs.mkdir(tempDir); - } catch (error) { - throw new Error(`Failed to create temporary app directory, ${error}`); - } - }); -} - /** * Run `yarn install` and `run tsc` in application directory *