From 113b51bd330c2af058675386e482d38f170a6688 Mon Sep 17 00:00:00 2001 From: Mark Phippard Date: Tue, 27 Mar 2018 10:45:49 -0400 Subject: [PATCH] feat(schematics): affected support for uncommitted changes Extended the syntax for affected so that it can get the list of files from either locally staged changes or all modified but unstaged files. Syntax is: nx affected apps staged nx affected apps unstaged This could enable developer to more easily run a subset of tests locally before committing. Related to #201 --- packages/bazel/src/utils/tasks.ts | 2 +- .../schematics/src/command-line/affected.ts | 3 +++ .../schematics/src/command-line/shared.ts | 27 ++++++++++++++++++- packages/schematics/src/utils/tasks.ts | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/packages/bazel/src/utils/tasks.ts b/packages/bazel/src/utils/tasks.ts index 64f79a00e7..2a20e80898 100644 --- a/packages/bazel/src/utils/tasks.ts +++ b/packages/bazel/src/utils/tasks.ts @@ -10,7 +10,7 @@ export class FormatFiles implements TaskConfigurationGenerator { return { name: 'node-package', options: { - command: 'run format', + command: 'run format -- --untracked', quiet: true } }; diff --git a/packages/schematics/src/command-line/affected.ts b/packages/schematics/src/command-line/affected.ts index 27c4344434..d851e95b27 100644 --- a/packages/schematics/src/command-line/affected.ts +++ b/packages/schematics/src/command-line/affected.ts @@ -38,6 +38,9 @@ function printError(command: string, e: any) { console.error( `Or pass the list of files, as follows: npm run affected:${command} -- --files="libs/mylib/index.ts,libs/mylib2/index.ts".` ); + console.error( + `Or to get the list of files from staged or unstaged changes: npm run affected:${command} -- staged | unstaged".` + ); console.error(e.message); } diff --git a/packages/schematics/src/command-line/shared.ts b/packages/schematics/src/command-line/shared.ts index 17dd1bd744..798526b85c 100644 --- a/packages/schematics/src/command-line/shared.ts +++ b/packages/schematics/src/command-line/shared.ts @@ -29,12 +29,25 @@ export function parseFiles( }); const dashDashFiles = named.filter(a => a.startsWith('--files='))[0]; + const uncommitted = named.some(a => a === '--uncommitted'); + const untracked = named.some(a => a === '--untracked'); + if (dashDashFiles) { named.splice(named.indexOf(dashDashFiles), 1); return { files: parseDashDashFiles(dashDashFiles), rest: [...unnamed, ...named] }; + } else if (uncommitted) { + return { + files: getUncommittedFiles(), + rest: [...unnamed, ...named] + }; + } else if (untracked) { + return { + files: getUntrackedFiles(), + rest: [...unnamed, ...named] + }; } else if (unnamed.length >= 2) { return { files: getFilesFromShash(unnamed[0], unnamed[1]), @@ -53,8 +66,20 @@ function parseDashDashFiles(dashDashFiles: string): string[] { return f.split(',').map(f => f.trim()); } +function getUncommittedFiles(): string[] { + return parseGitOutput(`git diff --name-only HEAD .`); +} + +function getUntrackedFiles(): string[] { + return parseGitOutput(`git ls-files --others --exclude-standard`); +} + function getFilesFromShash(sha1: string, sha2: string): string[] { - return execSync(`git diff --name-only ${sha1} ${sha2}`) + return parseGitOutput(`git diff --name-only ${sha1} ${sha2}`); +} + +function parseGitOutput(command: string): string[] { + return execSync(command) .toString('utf-8') .split('\n') .map(a => a.trim()) diff --git a/packages/schematics/src/utils/tasks.ts b/packages/schematics/src/utils/tasks.ts index 64f79a00e7..2a20e80898 100644 --- a/packages/schematics/src/utils/tasks.ts +++ b/packages/schematics/src/utils/tasks.ts @@ -10,7 +10,7 @@ export class FormatFiles implements TaskConfigurationGenerator { return { name: 'node-package', options: { - command: 'run format', + command: 'run format -- --untracked', quiet: true } };