feat: 在aicommits中添加提交、推送、重写和取消操作选项
This commit is contained in:
@@ -61,7 +61,7 @@ export default async (
|
|||||||
});
|
});
|
||||||
|
|
||||||
const s = spinner();
|
const s = spinner();
|
||||||
s.start('The AI is analyzing your changes');
|
s.start('正在分析您的更改');
|
||||||
let messages: string[];
|
let messages: string[];
|
||||||
try {
|
try {
|
||||||
messages = await generateCommitMessage(
|
messages = await generateCommitMessage(
|
||||||
@@ -84,34 +84,126 @@ export default async (
|
|||||||
throw new KnownError('No commit messages were generated. Try again.');
|
throw new KnownError('No commit messages were generated. Try again.');
|
||||||
}
|
}
|
||||||
|
|
||||||
let message: string;
|
// 处理单个或多个提交消息的函数
|
||||||
if (messages.length === 1) {
|
const handleCommitAction = async (msg: string, isSingleMessage: boolean = true) => {
|
||||||
[message] = messages;
|
const action = await select({
|
||||||
const confirmed = await confirm({
|
message: isSingleMessage ? `使用此提交消息?\n\n ${msg}\n` : '选择操作:',
|
||||||
message: `Use this commit message?\n\n ${message}\n`,
|
options: [
|
||||||
|
{ label: '提交', value: 'commit' },
|
||||||
|
{ label: '提交并推送', value: 'commit-and-push' },
|
||||||
|
{ label: '重写', value: 'rewrite' },
|
||||||
|
{ label: '取消', value: 'cancel' },
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!confirmed || isCancel(confirmed)) {
|
if (isCancel(action) || action === 'cancel') {
|
||||||
outro('Commit cancelled');
|
outro('提交已取消');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
const selected = await select({
|
if (action === 'rewrite') {
|
||||||
message: `Pick a commit message to use: ${dim('(Ctrl+c to exit)')}`,
|
return 'rewrite';
|
||||||
options: messages.map((value) => ({ label: value, value })),
|
}
|
||||||
});
|
|
||||||
|
if (action === 'commit') {
|
||||||
if (isCancel(selected)) {
|
await execa('git', ['commit', '-m', msg, ...rawArgv]);
|
||||||
outro('Commit cancelled');
|
outro(`${green('✔')} 提交成功!`);
|
||||||
return;
|
return true;
|
||||||
|
} else if (action === 'commit-and-push') {
|
||||||
|
await execa('git', ['commit', '-m', msg, ...rawArgv]);
|
||||||
|
const pushSpinner = spinner();
|
||||||
|
pushSpinner.start('正在推送到远程仓库...');
|
||||||
|
try {
|
||||||
|
await execa('git', ['push']);
|
||||||
|
pushSpinner.stop('推送成功');
|
||||||
|
outro(`${green('✔')} 提交并推送成功!`);
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
pushSpinner.stop('推送失败');
|
||||||
|
outro(`${red('✖')} 提交成功但推送失败: ${(error as Error).message}`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 重新生成提交消息的函数
|
||||||
|
const regenerateMessages = async () => {
|
||||||
|
const s = spinner();
|
||||||
|
s.start('正在重新生成提交消息...');
|
||||||
|
try {
|
||||||
|
const config = await getConfig({
|
||||||
|
OPENAI_KEY: env.OPENAI_KEY || env.OPENAI_API_KEY,
|
||||||
|
proxy:
|
||||||
|
env.https_proxy || env.HTTPS_PROXY || env.http_proxy || env.HTTP_PROXY,
|
||||||
|
generate: generate?.toString(),
|
||||||
|
type: commitType?.toString(),
|
||||||
|
});
|
||||||
|
|
||||||
|
const newMessages = await generateCommitMessage(
|
||||||
|
config.OPENAI_KEY,
|
||||||
|
config.model,
|
||||||
|
config.locale,
|
||||||
|
staged.diff,
|
||||||
|
config.generate,
|
||||||
|
config['max-length'],
|
||||||
|
config.type,
|
||||||
|
config.timeout,
|
||||||
|
config.proxy,
|
||||||
|
config.baseURL
|
||||||
|
);
|
||||||
|
|
||||||
|
s.stop('已重新生成提交消息');
|
||||||
|
|
||||||
|
if (newMessages.length === 0) {
|
||||||
|
throw new KnownError('没有重新生成提交消息。请重试。');
|
||||||
|
}
|
||||||
|
|
||||||
|
return newMessages;
|
||||||
|
} catch (error) {
|
||||||
|
s.stop('重新生成失败');
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 处理消息选择和提交的主循环
|
||||||
|
let currentMessages = messages;
|
||||||
|
while (true) {
|
||||||
|
let message: string;
|
||||||
|
|
||||||
|
if (currentMessages.length === 1) {
|
||||||
|
[message] = currentMessages;
|
||||||
|
const result = await handleCommitAction(message, true);
|
||||||
|
|
||||||
|
if (result === 'rewrite') {
|
||||||
|
currentMessages = await regenerateMessages();
|
||||||
|
continue;
|
||||||
|
} else if (result === true || result === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const selected = await select({
|
||||||
|
message: `选择一个提交消息: ${dim('(Ctrl+c 退出)')}`,
|
||||||
|
options: currentMessages.map((value) => ({ label: value, value })),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isCancel(selected)) {
|
||||||
|
outro('提交已取消');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
message = selected as string;
|
||||||
|
const result = await handleCommitAction(message, false);
|
||||||
|
|
||||||
|
if (result === 'rewrite') {
|
||||||
|
currentMessages = await regenerateMessages();
|
||||||
|
continue;
|
||||||
|
} else if (result === true || result === false) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
message = selected as string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await execa('git', ['commit', '-m', message, ...rawArgv]);
|
|
||||||
|
|
||||||
outro(`${green('✔')} Successfully committed!`);
|
|
||||||
})().catch((error) => {
|
})().catch((error) => {
|
||||||
outro(`${red('✖')} ${error.message}`);
|
outro(`${red('✖')} ${error.message}`);
|
||||||
handleCliError(error);
|
handleCliError(error);
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ export default () =>
|
|||||||
});
|
});
|
||||||
|
|
||||||
const s = spinner();
|
const s = spinner();
|
||||||
s.start('The AI is analyzing your changes');
|
s.start('正在分析您的更改');
|
||||||
let messages: string[];
|
let messages: string[];
|
||||||
try {
|
try {
|
||||||
messages = await generateCommitMessage(
|
messages = await generateCommitMessage(
|
||||||
|
|||||||
Reference in New Issue
Block a user