From 4935612fe6f54dd3f37cc2fd7a280296d3a93989 Mon Sep 17 00:00:00 2001 From: ipmsteven Date: Thu, 14 Mar 2019 23:23:11 -0700 Subject: [PATCH 1/2] introduce onlyTrackedFilesCanBeAutoStaged feature flag --- extensions/git/package.json | 6 ++++++ extensions/git/package.nls.json | 1 + 2 files changed, 7 insertions(+) diff --git a/extensions/git/package.json b/extensions/git/package.json index b6f31076e76..33c964bcba8 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1222,6 +1222,12 @@ "default": false, "description": "%config.alwaysShowStagedChangesResourceGroup%" }, + "git.onlyTrackedFilesCanBeAutoStaged": { + "type": "boolean", + "scope": "resource", + "default": false, + "description": "%config.onlyTrackedFilesCanBeAutoStaged%" + }, "git.alwaysSignOff": { "type": "boolean", "scope": "resource", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 21ac86d8fbd..1c1f2552168 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -104,6 +104,7 @@ "config.detectSubmodules": "Controls whether to automatically detect git submodules.", "config.detectSubmodulesLimit": "Controls the limit of git submodules detected.", "config.alwaysShowStagedChangesResourceGroup": "Always show the Staged Changes resource group.", + "config.onlyTrackedFilesCanBeAutoStaged": "Only tracked files can be auto staged", "config.alwaysSignOff": "Controls the signoff flag for all commits.", "config.ignoredRepositories": "List of git repositories to ignore.", "config.scanRepositories": "List of paths to search for git repositories in.", From 49e0e2607cb396f57d478d4a03ac6581081270ab Mon Sep 17 00:00:00 2001 From: ipmsteven Date: Thu, 14 Mar 2019 23:48:24 -0700 Subject: [PATCH 2/2] add logic to skip staging untracked files when onlyTrackedFilesCanBeAutoStaged is on --- extensions/git/src/repository.ts | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index 2fac9e2a39f..e3d8ec3ccab 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -801,10 +801,22 @@ export class Repository implements Disposable { } async commit(message: string, opts: CommitOptions = Object.create(null)): Promise { + const config = workspace.getConfiguration('git'); + const onlyTrackStagedFile = config.get('onlyTrackedFilesCanBeAutoStaged'); + if (this.rebaseCommit) { await this.run(Operation.RebaseContinue, async () => { if (opts.all) { - await this.repository.add([]); + if (onlyTrackStagedFile) { + const unstageFiles = await this.trackedUnstagedFiles(); + if (unstageFiles.length === 0) { + window.showInformationMessage(localize('no changes', "There are no changes to commit.")); + return false; + } + await this.repository.add(unstageFiles); + } else { + await this.repository.add([]); + } } await this.repository.rebaseContinue(); @@ -812,7 +824,16 @@ export class Repository implements Disposable { } else { await this.run(Operation.Commit, async () => { if (opts.all) { - await this.repository.add([]); + if (onlyTrackStagedFile) { + const unstageFiles = await this.trackedUnstagedFiles(); + if (unstageFiles.length === 0) { + window.showInformationMessage(localize('no changes', "There are no changes to commit.")); + return false; + } + await this.repository.add(unstageFiles); + } else { + await this.repository.add([]); + } } await this.repository.commit(message, opts); @@ -1449,6 +1470,12 @@ export class Repository implements Disposable { this.eventuallyUpdateWhenIdleAndWait(); } + private async trackedUnstagedFiles(): Promise { + const rawChangedFiles = await this.repository.run(['ls-files', '.', '-m']); + const parsedFiles = rawChangedFiles.stdout.split('\n').filter(l => !!l); + return parsedFiles; + } + @debounce(1000) private eventuallyUpdateWhenIdleAndWait(): void { this.updateWhenIdleAndWait();