diff --git a/packages/betterer/src/fs/git.ts b/packages/betterer/src/fs/git.ts index e1ad7ca5b..92053f289 100644 --- a/packages/betterer/src/fs/git.ts +++ b/packages/betterer/src/fs/git.ts @@ -105,12 +105,17 @@ export class BettererGitΩ implements BettererVersionControl { } private async _init(git: SimpleGit): Promise { + if (await git.checkIsRepo()) { + return; + } + const retries = 3; for (let i = 0; i < retries; i++) { try { await git.init(); + return; } catch (error) { - if (i >= retries) { + if (i === retries - 1) { throw error; } } diff --git a/test/worktree.spec.ts b/test/worktree.spec.ts new file mode 100644 index 000000000..2c78cef80 --- /dev/null +++ b/test/worktree.spec.ts @@ -0,0 +1,51 @@ +// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet +import { createFixture } from './fixture'; + +import { simpleGit } from 'simple-git'; + +describe('betterer', () => { + it('should not reinitialise the repository when run inside a git worktree', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { resolve, cleanup } = await createFixture('worktree', { + 'source/.betterer.js': ` +const { regexp } = require('@betterer/regexp'); + +module.exports = { + test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') +}; + `, + 'source/src/index.ts': `// HACK:` + }); + + const sourcePath = resolve('source'); + const barePath = resolve('repo.git'); + const worktreePath = resolve('worktree'); + + const source = simpleGit(sourcePath); + await source.init(); + await source.addConfig('user.email', 'test@betterer.dev'); + await source.addConfig('user.name', 'Betterer Test'); + await source.add('.'); + await source.commit('init'); + const branch = (await source.revparse(['--abbrev-ref', 'HEAD'])).trim(); + + await simpleGit(resolve('.')).clone(sourcePath, barePath, ['--bare']); + + const bare = simpleGit(barePath); + await bare.raw('worktree', 'add', worktreePath, branch); + + expect((await bare.raw('config', '--get', 'core.bare')).trim()).toBe('true'); + + await betterer({ + cwd: worktreePath, + configPaths: [resolve('worktree/.betterer.js')], + resultsPath: resolve('worktree/.betterer.results'), + workers: false + }); + + expect((await bare.raw('config', '--get', 'core.bare')).trim()).toBe('true'); + + await cleanup(); + }); +});