add git.smartCommitChanges

This commit is contained in:
Joao Moreno 2019-08-08 11:55:13 +02:00
parent 3dc34be7ae
commit 181759fe6a
5 changed files with 38 additions and 40 deletions

View file

@ -1148,6 +1148,20 @@
"description": "%config.enableSmartCommit%",
"default": false
},
"git.smartCommitChanges": {
"type": "string",
"enum": [
"all",
"tracked"
],
"enumDescriptions": [
"%config.smartCommitChanges.all%",
"%config.smartCommitChanges.tracked%"
],
"scope": "resource",
"description": "%config.smartCommitChanges%",
"default": "all"
},
"git.suggestSmartCommit": {
"type": "boolean",
"scope": "resource",
@ -1254,12 +1268,6 @@
"default": false,
"description": "%config.alwaysShowStagedChangesResourceGroup%"
},
"git.onlyTrackedFilesCanBeAutoStaged": {
"type": "boolean",
"scope": "resource",
"default": false,
"description": "%config.onlyTrackedFilesCanBeAutoStaged%"
},
"git.alwaysSignOff": {
"type": "boolean",
"scope": "resource",

View file

@ -89,6 +89,9 @@
"config.ignoreLimitWarning": "Ignores the warning when there are too many changes in a repository.",
"config.defaultCloneDirectory": "The default location to clone a git repository.",
"config.enableSmartCommit": "Commit all changes when there are no staged changes.",
"config.smartCommitChanges": "Control which changes are automatically staged by Smart Commit.",
"config.smartCommitChanges.all": "Automatically stage all changes.",
"config.smartCommitChanges.tracked": "Automatically staged tracked changes only.",
"config.suggestSmartCommit": "Suggests to enable smart commit (commit all changes when there are no staged changes).",
"config.enableCommitSigning": "Enables commit signing with GPG.",
"config.discardAllScope": "Controls what changes are discarded by the `Discard all changes` command. `all` discards all changes. `tracked` discards only tracked files. `prompt` shows a prompt dialog every time the action is run.",
@ -109,7 +112,6 @@
"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.",

View file

@ -1275,8 +1275,8 @@ export class CommandCenter {
// no changes, and the user has not configured to commit all in this case
if (!noUnstagedChanges && noStagedChanges && !enableSmartCommit) {
const suggestSmartCommit = config.get<boolean>('suggestSmartCommit') === true;
if (!suggestSmartCommit) {
return false;
}
@ -1330,6 +1330,10 @@ export class CommandCenter {
return false;
}
if (opts.all && config.get<'all' | 'tracked'>('smartCommitChanges') === 'tracked') {
opts.all = 'tracked';
}
await repository.commit(message, opts);
const postCommitCommand = config.get<'none' | 'push' | 'sync'>('postCommitCommand');

View file

@ -642,7 +642,7 @@ export function parseLsFiles(raw: string): LsFilesElement[] {
}
export interface CommitOptions {
all?: boolean;
all?: boolean | 'tracked';
amend?: boolean;
signoff?: boolean;
signCommit?: boolean;
@ -1081,8 +1081,16 @@ export class Repository {
return result.stdout.trim();
}
async add(paths: string[]): Promise<void> {
const args = ['add', '-A', '--'];
async add(paths: string[], opts?: { update?: boolean }): Promise<void> {
const args = ['add'];
if (opts && opts.update) {
args.push('-u');
} else {
args.push('-A');
}
args.push('--');
if (paths && paths.length) {
args.push.apply(args, paths);

View file

@ -907,22 +907,11 @@ export class Repository implements Disposable {
}
async commit(message: string, opts: CommitOptions = Object.create(null)): Promise<void> {
const config = workspace.getConfiguration('git');
const onlyTrackStagedFile = config.get<boolean>('onlyTrackedFilesCanBeAutoStaged');
if (this.rebaseCommit) {
await this.run(Operation.RebaseContinue, async () => {
if (opts.all) {
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([]);
}
const addOpts = opts.all === 'tracked' ? { update: true } : {};
await this.repository.add([], addOpts);
}
await this.repository.rebaseContinue();
@ -930,18 +919,11 @@ export class Repository implements Disposable {
} else {
await this.run(Operation.Commit, async () => {
if (opts.all) {
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([]);
}
const addOpts = opts.all === 'tracked' ? { update: true } : {};
await this.repository.add([], addOpts);
}
delete opts.all;
await this.repository.commit(message, opts);
});
}
@ -1601,12 +1583,6 @@ export class Repository implements Disposable {
this.eventuallyUpdateWhenIdleAndWait();
}
private async trackedUnstagedFiles(): Promise<string[]> {
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();