Skip to content

Commit

Permalink
feat: add option to open the full commit message in a separate tab
Browse files Browse the repository at this point in the history
Add a new configuration option: "showEditor" that displays
the commit message in a separate tab as a text document the user can edit.
If autoCommit is set to true, saving the file will automatically commit the
message. If autoCommit is set to false, it will paste the contents
into the scm as usual and close the tab.
  • Loading branch information
sbacic committed Feb 4, 2021
1 parent d3cd7b8 commit e519d11
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 8 deletions.
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@
"type": "string",
"default": "",
"markdownDescription": "%extension.configuration.properties.conventionalCommits.lineBreak.markdownDescription%"
},
"conventionalCommits.showEditor": {
"type": "boolean",
"default": false,
"markdownDescription": "%extension.configuration.properties.conventionalCommits.showEditor.markdownDescription%"
}
}
}
Expand Down
1 change: 1 addition & 0 deletions package.nls.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"extension.configuration.properties.conventionalCommits.emojiFormat.markdownEnumDescriptions.emoji": "Display as `🐛`",
"extension.configuration.properties.conventionalCommits.scopes.markdownDescription": "Available scopes.",
"extension.configuration.properties.conventionalCommits.lineBreak.markdownDescription": "Treat words as line breaks.\n\nBlank means no line breaks.",
"extension.configuration.properties.conventionalCommits.showEditor.markdownDescription": "Show the commit message as a text document in a separate tab.",
"extension.sources.repositoryNotFoundInPath": "Repository not found in path: ",
"extension.sources.repositoriesEmpty": "Please open a repository.",
"extension.sources.promptRepositoryPlaceholder": "Choose a repository",
Expand Down
2 changes: 2 additions & 0 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import * as vscode from 'vscode';
import createConventionalCommits from './lib/conventional-commits';
import * as output from './lib/output';
import * as localize from './lib/localize';
import CommitProvider from './lib/editor/provider';

export function activate(context: vscode.ExtensionContext) {
output.initialize();
Expand All @@ -20,6 +21,7 @@ export function activate(context: vscode.ExtensionContext) {
);

context.subscriptions.push(disposable);
vscode.workspace.registerFileSystemProvider('commit-message', CommitProvider);
}

export function deactivate() {}
1 change: 1 addition & 0 deletions src/lib/configuration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type Configuration = {
autoCommit: boolean;
gitmoji: boolean;
emojiFormat: EMOJI_FORMAT;
showEditor: boolean;
scopes: string[];
lineBreak: string;
};
Expand Down
22 changes: 16 additions & 6 deletions src/lib/conventional-commits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import commitlint from './commitlint';
import createSimpleQuickPick from './prompts/quick-pick';
import { serialize } from './commit-message';
import localize from './localize';
import openMessageInTab from './editor';

function getGitAPI(): VSCodeGit.API | void {
const vscodeGit = vscode.extensions.getExtension<VSCodeGit.GitExtension>(
Expand Down Expand Up @@ -170,6 +171,7 @@ export default function createConventionalCommits() {
// 5. get message
const commitMessage = await prompts({
gitmoji: configuration.get<boolean>('gitmoji'),
showEditor: configuration.get<boolean>('showEditor'),
emojiFormat: configuration.get<configuration.EMOJI_FORMAT>(
'emojiFormat',
),
Expand All @@ -181,17 +183,25 @@ export default function createConventionalCommits() {
const message = serialize(commitMessage);
output.appendLine(`message: ${message}`);

// 6. switch to scm and put message into message box
vscode.commands.executeCommand('workbench.view.scm');
repository.inputBox.value = message;
output.appendLine(`inputBox.value: ${repository.inputBox.value}`);
// 6. switch to scm and put message into message box or show the entire commit message in a separate tab
const showEditor = configuration.get<boolean>('showEditor');

if (showEditor) {
repository.inputBox.value = message;
openMessageInTab(repository);
output.appendLine(`show full commit message in a separate tab`);
} else {
vscode.commands.executeCommand('workbench.view.scm');
repository.inputBox.value = message;
output.appendLine(`inputBox.value: ${repository.inputBox.value}`);
}

// 7. auto commit
const autoCommit = configuration.get<boolean>('autoCommit');
if (autoCommit) {
if (autoCommit && !showEditor) {
await vscode.commands.executeCommand('git.commit', repository);
output.appendLine('Finished successfully.');
}
output.appendLine('Finished successfully.');
} catch (e) {
output.appendLine(`Finished with an error: ${e.stack}`);
vscode.window.showErrorMessage(
Expand Down
23 changes: 23 additions & 0 deletions src/lib/editor/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* @since 2021-01-29 11:09
* @author sbacic
*/

import * as vscode from 'vscode';
import * as VSCodeGit from '../../vendors/git';
import { state } from './provider';

/**
* Opens a new empty file and adds the commit message. The language mode is set to "Git Commit Message" and
* the FileSystemProvider is set to CommitProvider.
* @param repository The project repository.
*/
export default async function openMessageInTab(
repository: VSCodeGit.Repository,
) {
state.repository = repository;
const uri = vscode.Uri.file('COMMIT_EDITMSG').with({
scheme: 'commit-message',
});
await vscode.commands.executeCommand('vscode.open', uri);
}
85 changes: 85 additions & 0 deletions src/lib/editor/provider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import * as vscode from 'vscode';
import { TextDecoder, TextEncoder } from 'util';
import localize from '../localize';
import { Repository } from '../../vendors/git';
import * as configuration from '../configuration';
import * as output from '../output';

interface State {
repository?: Repository;
}

export const state: State = {
repository: undefined,
};

/**
* Simplified provider for handling Git commit messages.
* On save, the contents are instead autocommited or used to update repository object (depending on settings).
*/
const CommitProvider = new (class implements vscode.FileSystemProvider {
private _emitter = new vscode.EventEmitter<vscode.FileChangeEvent[]>();
readonly onDidChangeFile: vscode.Event<vscode.FileChangeEvent[]> = this
._emitter.event;

watch(_resource: vscode.Uri): vscode.Disposable {
return new vscode.Disposable(() => {});
}

stat(): vscode.FileStat {
return {
type: vscode.FileType.File,
ctime: Date.now(),
mtime: Date.now(),
size: 0,
};
}

readDirectory() {
return [];
}

readFile(_uri: vscode.Uri): Uint8Array {
const enc = new TextEncoder();
return enc.encode(state.repository?.inputBox.value);
}

createDirectory(): void {}
writeFile(_uri: vscode.Uri, content: Uint8Array): Thenable<void> {
return new Promise(async (resolve) => {
try {
const value = new TextDecoder().decode(content);

if (state.repository) {
const autoCommit = configuration.get<boolean>('autoCommit');
state.repository.inputBox.value = value;
vscode.commands.executeCommand(
'workbench.action.revertAndCloseActiveEditor',
);

if (autoCommit) {
await vscode.commands.executeCommand(
'git.commit',
state.repository,
);
resolve();
} else {
await vscode.commands.executeCommand('workbench.view.scm');
resolve();
}

output.appendLine('Finished successfully.');
}
} catch (e) {
output.appendLine(`Finished with an error: ${e.stack}`);
vscode.window.showErrorMessage(
`${localize('extension.name')}: ${e.message}`,
);
}
});
}
rename(): void {}
delete(): void {}
})();

export default CommitProvider;
12 changes: 10 additions & 2 deletions src/lib/prompts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,12 @@ import localize from './localize';

export default async function prompts({
gitmoji,
showEditor,
emojiFormat,
lineBreak,
}: {
gitmoji: boolean;
showEditor: boolean;
emojiFormat: configuration.EMOJI_FORMAT;
lineBreak: string;
}): Promise<CommitMessage> {
Expand Down Expand Up @@ -235,10 +237,16 @@ export default async function prompts({
},
]
.filter(function (question) {
if (gitmoji) {
if (!gitmoji && question.name === 'gitmoji') {
return false;
} else if (
showEditor &&
(question.name === 'body' || question.name === 'footer')
) {
return false;
} else {
return true;
}
return question.name !== 'gitmoji';
})
.map(function (question, index, array) {
return {
Expand Down

0 comments on commit e519d11

Please sign in to comment.