Miroslav Jonaš 15d83258fe
feat(core): move git commit from generators to create-nx-workspace (#11633)
* fix(core): move git commit to create-nx-workspace

* fix(core): add git init to create-nx-plugin
2022-08-18 18:40:46 -04:00

107 lines
3.0 KiB
TypeScript

import * as path from 'path';
import { execSync, spawn, SpawnOptions } from 'child_process';
import { output } from '@nrwl/devkit';
export function showNxWarning(workspaceName: string) {
try {
const pathToRunNxCommand = path.resolve(process.cwd(), workspaceName);
execSync('nx --version', {
cwd: pathToRunNxCommand,
stdio: ['ignore', 'ignore', 'ignore'],
});
} catch {
// no nx found
output.addVerticalSeparator();
output.note({
title: `Nx CLI is not installed globally.`,
bodyLines: [
`This means that you might have to use "yarn nx" or "npx nx" to execute commands in the workspace.`,
`Run "yarn global add nx" or "npm install -g nx" to be able to execute command directly.`,
],
});
}
}
/*
* Because we don't want to depend on @nrwl/workspace
* we duplicate the helper functions from @nrwl/workspace in this file.
*/
export function deduceDefaultBase(): string {
const nxDefaultBase = 'main';
try {
return (
execSync('git config --get init.defaultBranch').toString().trim() ||
nxDefaultBase
);
} catch {
return nxDefaultBase;
}
}
function checkGitVersion(): string | null {
try {
let gitVersionOutput = execSync('git --version').toString().trim();
return gitVersionOutput.match(/[0-9]+\.[0-9]+\.+[0-9]+/)[0];
} catch {
return null;
}
}
/*
* Because we don't want to depend on create-nx-workspace
* we duplicate the helper functions from create-nx-workspace in this file.
*/
export async function initializeGitRepo(directory: string) {
const execute = (args: ReadonlyArray<string>, ignoreErrorStream = false) => {
const errorStream = ignoreErrorStream ? 'ignore' : process.stderr;
const spawnOptions: SpawnOptions = {
stdio: [process.stdin, 'ignore', errorStream],
shell: true,
cwd: directory,
env: process.env,
};
return new Promise<void>((resolve, reject) => {
spawn('git', args, spawnOptions).on('close', (code) => {
if (code === 0) {
resolve();
} else {
reject(code);
}
});
});
};
const gitVersion = checkGitVersion();
if (!gitVersion) {
return;
}
const insideRepo = await execute(
['rev-parse', '--is-inside-work-tree'],
true
).then(
() => true,
() => false
);
if (insideRepo) {
output.log({
title:
'Directory is already under version control. Skipping initialization of git.',
});
return;
}
const defaultBase = deduceDefaultBase();
const [gitMajor, gitMinor] = gitVersion.split('.');
if (+gitMajor > 2 || (+gitMajor === 2 && +gitMinor >= 28)) {
await execute(['init', '-b', defaultBase]);
} else {
await execute(['init']);
await execute(['checkout', '-b', defaultBase]); // Git < 2.28 doesn't support -b on git init.
}
await execute(['add', '.']);
const message = 'Initial commit';
await execute(['commit', `-m "${message}"`]);
output.log({
title: 'Successfully initialized git.',
});
}