diff --git a/packages/create-react-native-library/src/exampleApp/generateExampleApp.ts b/packages/create-react-native-library/src/exampleApp/generateExampleApp.ts index c3f6aff02..b8df1856b 100644 --- a/packages/create-react-native-library/src/exampleApp/generateExampleApp.ts +++ b/packages/create-react-native-library/src/exampleApp/generateExampleApp.ts @@ -68,6 +68,7 @@ export default async function generateExampleApp({ '--version', reactNativeVersion, '--skip-install', + '--skip-git-init', '--pm', 'npm', ]; diff --git a/packages/create-react-native-library/src/index.ts b/packages/create-react-native-library/src/index.ts index 33d87bfb2..14b95ee26 100644 --- a/packages/create-react-native-library/src/index.ts +++ b/packages/create-react-native-library/src/index.ts @@ -160,7 +160,28 @@ async function create(_argv: Args) { folder, }); } else { - await createInitialGitCommit(folder); + spinner.text = 'Initializing git repository'; + + try { + const abortController = new AbortController(); + + // Creating git repository can get stuck in some cases, + // e.g. if git asks for ssh passphrase. + // We abort it after a timeout so that this doesn't hang forever. + await Promise.race([ + createInitialGitCommit(folder, abortController.signal), + new Promise((_resolve, reject) => { + setTimeout(() => { + const error = new Error('Creating git repository took too long'); + + abortController.abort(error.message); + reject(error); + }, 5000); + }), + ]); + } catch (error) { + spinner.warn('Failed to create git repository'); + } printSuccessMessage(); diff --git a/packages/create-react-native-library/src/utils/initialCommit.ts b/packages/create-react-native-library/src/utils/initialCommit.ts index fe76e760e..5d011a957 100644 --- a/packages/create-react-native-library/src/utils/initialCommit.ts +++ b/packages/create-react-native-library/src/utils/initialCommit.ts @@ -1,25 +1,22 @@ import { spawn } from './spawn'; -export async function createInitialGitCommit(folder: string) { - let isInGitRepo = false; - - try { - isInGitRepo = - (await spawn('git', ['rev-parse', '--is-inside-work-tree'])) === 'true'; - } catch (e) { - // Ignore error - } +export async function createInitialGitCommit( + folder: string, + signal?: AbortSignal +) { + const isInGitRepo = + (await spawn('git', ['rev-parse', '--is-inside-work-tree'], { + cwd: folder, + signal, + })) === 'true'; if (!isInGitRepo) { - try { - await spawn('git', ['init'], { cwd: folder }); - await spawn('git', ['branch', '-M', 'main'], { cwd: folder }); - await spawn('git', ['add', '.'], { cwd: folder }); - await spawn('git', ['commit', '-m', 'chore: initial commit'], { - cwd: folder, - }); - } catch (e) { - // Ignore error - } + await spawn('git', ['init'], { cwd: folder, signal }); + await spawn('git', ['branch', '-M', 'main'], { cwd: folder, signal }); + await spawn('git', ['add', '.'], { cwd: folder, signal }); + await spawn('git', ['commit', '-m', 'chore: initial commit'], { + cwd: folder, + signal, + }); } } diff --git a/tsconfig.json b/tsconfig.json index 5535c97be..b5a42828a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -32,7 +32,7 @@ "verbatimModuleSyntax": true }, "exclude": [ - "lib", + "**/lib", "packages/react-native-builder-bob/src/__fixtures__", "packages/create-react-native-library/templates" ]