diff --git a/README.md b/README.md index 2301b2d..2f66555 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Note: Do NOT install `gptcommit` hook via `gptcommit install` under the root of | ----------------- | --------------- | ----------------- | | < 0.1.0 | 1.75+ | 0.1.16 | | 0.1.x | 1.70+ | 0.1.16 | -| 0.2.0 | 1.70+ | 0.3.0 | +| 0.2.x | 1.70+ | 0.3.0 | ## Commands diff --git a/package.json b/package.json index fe824a1..cfc86d3 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "gptcommit", "displayName": "vscode-gptcommit", "description": "Automated git commit messages using GPT models", - "version": "0.2.0", + "version": "0.2.1", "repository": { "url": "https://github.com/pwwang/vscode-gptcommit" }, @@ -32,7 +32,8 @@ { "command": "gptcommit.generateGitCommitMessage", "title": "GPTCommit: Generate Git Commit Message", - "icon": "$(output)" + "icon": "$(output)", + "enablement": "!gptcommit.generating" }, { "command": "gptcommit.setupOpenAIApiKey", @@ -64,6 +65,11 @@ "default": "", "description": "Path to gptcommit executable." }, + "gptcommit.debug": { + "type": "boolean", + "default": false, + "description": "If true, debug information will be shown in the output channel." + }, "gptcommit.expressMode": { "type": "boolean", "default": false, diff --git a/src/commands/createCommandGenerateGitCommitMessage.ts b/src/commands/createCommandGenerateGitCommitMessage.ts index 0299c09..f0309f2 100644 --- a/src/commands/createCommandGenerateGitCommitMessage.ts +++ b/src/commands/createCommandGenerateGitCommitMessage.ts @@ -12,13 +12,15 @@ export default (context: vscode.ExtensionContext, channel: vscode.OutputChannel) } const config = vscode.workspace.getConfiguration('gptcommit'); - + vscode.commands.executeCommand('setContext', 'gptcommit.generating', true); getCommitMessage(config, repo, context, channel).then((message) => { if (repo) { repo.inputBox.value = message; } + vscode.commands.executeCommand('setContext', 'gptcommit.generating', false); }).catch((err) => { vscode.window.showErrorMessage(err); + vscode.commands.executeCommand('setContext', 'gptcommit.generating', false); }); } ); diff --git a/src/utils.ts b/src/utils.ts index 085b9aa..bbc75c3 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -40,6 +40,10 @@ export async function getCommitMessage( diff = await repo.diff(false); } } + // if diff is empty, return the promise here + if (!diff) { + return Promise.reject('No changes to commit'); + } writeFileSync(tmpDiffFile, diff); const cmd = `${gptcommit} prepare-commit-msg --commit-msg-file ${tmpMsgFile} --commit-source commit --git-diff-content ${tmpDiffFile}`; channel.appendLine(`COMMAND: ${cmd}`); @@ -52,10 +56,19 @@ export async function getCommitMessage( try { unlinkSync(tmpDiffFile); } catch (e) {} if (/: not found\s*$/.test(stderr)) { + if (config.debug) { + channel.appendLine('DEBUG: gptcommit not found'); + } reject('gptcommit not found, see https://github.com/zurawiki/gptcommit. If it is not in your PATH, set "gptcommit.gptcommitPath" in your settings to the path to gptcommit'); } else if (/OpenAI API key not found/.test(stderr)) { + if (config.debug) { + channel.appendLine('DEBUG: OpenAI API key not set'); + } reject('OpenAI API key not found, run "gptcommit.setupOpenAIApiKey" command to set it up'); } else if (/is being amended/.test(stdout)) { + if (config.debug) { + channel.appendLine('DEBUG: allow_amend is false'); + } // set allow-amend to true const cmd = `${gptcommit} config set allow_amend true`; channel.appendLine(`COMMAND: ${cmd}`); @@ -67,15 +80,27 @@ export async function getCommitMessage( reject(err); }); } else if (err || stderr) { + if (config.debug) { + channel.appendLine(`DEBUG: gptcommit failed with error: ${err} | ${stderr}`); + } try { unlinkSync(tmpMsgFile); } catch (e) {} reject(err || stderr); } else if (!existsSync(tmpMsgFile)) { + if (config.debug) { + channel.appendLine('DEBUG: gptcommit failed to generate commit message, message file not generated'); + } reject('Failed to generate commit message'); } else if (config.expressMode) { + if (config.debug) { + channel.appendLine('DEBUG: express mode enabled, skipping editor'); + } const msg = readFileSync(tmpMsgFile, 'utf8'); try { unlinkSync(tmpMsgFile); } catch (e) {} resolve(polishMessage(msg, config.expressModeContent)); } else { + if (config.debug) { + channel.appendLine('DEBUG: opening editor'); + } const editor = vscode.window.activeTextEditor; vscode.workspace.openTextDocument(tmpMsgFile).then(async (doc) => { await vscode.window.showTextDocument(doc, {