Merge remote-tracking branch 'origin/dev'

This commit is contained in:
di-sukharev
2023-03-21 14:51:44 +08:00
8 changed files with 67 additions and 15 deletions
+2 -1
View File
@@ -10,4 +10,5 @@ application.log
logfile.log logfile.log
uncaughtExceptions.log uncaughtExceptions.log
.vscode .vscode
src/*.json src/*.json
.idea
+26
View File
@@ -84,6 +84,32 @@ To remove description:
oc config set description=false oc config set description=false
``` ```
### Git flags
The `opencommit` or `oc` commands can be used in place of the `git commit -m "${generatedMessage}"` command. This means that any regular flags that are used with the `git commit` command will also be applied when using `opencommit` or `oc`.
```sh
oc --no-verify
```
is translated to :
```sh
git commit -m "${generatedMessage}" --no-verify
```
### Ignore files
You can ignore files from submission to OpenAI by creating a `.opencommitignore` file. For example:
```ignorelang
path/to/large-asset.zip
**/*.jpg
```
This is useful for preventing opencommit from uploading artifacts and large files.
By default, opencommit ignores files matching: `*-lock.*` and `*.lock`
## Git hook ## Git hook
You can set OpenCommit as Git [`prepare-commit-msg`](https://git-scm.com/docs/githooks#_prepare_commit_msg) hook. Hook integrates with you IDE Source Control and allows you edit the message before commit. You can set OpenCommit as Git [`prepare-commit-msg`](https://git-scm.com/docs/githooks#_prepare_commit_msg) hook. Hook integrates with you IDE Source Control and allows you edit the message before commit.
+1 -1
View File
@@ -14,6 +14,7 @@
"chalk": "^5.2.0", "chalk": "^5.2.0",
"cleye": "^1.3.2", "cleye": "^1.3.2",
"execa": "^7.0.0", "execa": "^7.0.0",
"ignore": "^5.2.4",
"ini": "^3.0.1", "ini": "^3.0.1",
"inquirer": "^9.1.4", "inquirer": "^9.1.4",
"openai": "^3.2.1" "openai": "^3.2.1"
@@ -1880,7 +1881,6 @@
"version": "5.2.4", "version": "5.2.4",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true,
"engines": { "engines": {
"node": ">= 4" "node": ">= 4"
} }
+1
View File
@@ -64,6 +64,7 @@
"chalk": "^5.2.0", "chalk": "^5.2.0",
"cleye": "^1.3.2", "cleye": "^1.3.2",
"execa": "^7.0.0", "execa": "^7.0.0",
"ignore": "^5.2.4",
"ini": "^3.0.1", "ini": "^3.0.1",
"inquirer": "^9.1.4", "inquirer": "^9.1.4",
"openai": "^3.2.1" "openai": "^3.2.1"
+3 -3
View File
@@ -8,7 +8,7 @@ import { hookCommand, isHookCalled } from './commands/githook.js';
import { prepareCommitMessageHook } from './commands/prepare-commit-msg-hook'; import { prepareCommitMessageHook } from './commands/prepare-commit-msg-hook';
import { commit } from './commands/commit'; import { commit } from './commands/commit';
const rawArgv = process.argv.slice(2); const extraArgs = process.argv.slice(2);
cli( cli(
{ {
@@ -23,8 +23,8 @@ cli(
if (isHookCalled) { if (isHookCalled) {
prepareCommitMessageHook(); prepareCommitMessageHook();
} else { } else {
commit(); commit(extraArgs);
} }
}, },
rawArgv extraArgs
); );
+12 -6
View File
@@ -22,7 +22,8 @@ import chalk from 'chalk';
import { trytm } from '../utils/trytm'; import { trytm } from '../utils/trytm';
const generateCommitMessageFromGitDiff = async ( const generateCommitMessageFromGitDiff = async (
diff: string diff: string,
extraArgs: string[]
): Promise<void> => { ): Promise<void> => {
await assertGitRepo(); await assertGitRepo();
@@ -59,7 +60,7 @@ ${chalk.grey('——————————————————')}`
}); });
if (isCommitConfirmedByUser && !isCancel(isCommitConfirmedByUser)) { if (isCommitConfirmedByUser && !isCancel(isCommitConfirmedByUser)) {
const { stdout } = await execa('git', ['commit', '-m', commitMessage]); const { stdout } = await execa('git', ['commit', '-m', commitMessage, ...extraArgs]);
outro(`${chalk.green('✔')} successfully committed`); outro(`${chalk.green('✔')} successfully committed`);
@@ -74,6 +75,7 @@ ${chalk.grey('——————————————————')}`
pushSpinner.start('Running `git push`'); pushSpinner.start('Running `git push`');
const { stdout } = await execa('git', ['push']); const { stdout } = await execa('git', ['push']);
pushSpinner.stop(`${chalk.green('✔')} successfully pushed all commits`); pushSpinner.stop(`${chalk.green('✔')} successfully pushed all commits`);
if (stdout) outro(stdout); if (stdout) outro(stdout);
@@ -81,9 +83,11 @@ ${chalk.grey('——————————————————')}`
} else outro(`${chalk.gray('✖')} process cancelled`); } else outro(`${chalk.gray('✖')} process cancelled`);
}; };
export async function commit(isStageAllFlag = false) {
export async function commit(extraArgs=[], isStageAllFlag = false) {
if (isStageAllFlag) { if (isStageAllFlag) {
const changedFiles = await getChangedFiles(); const changedFiles = await getChangedFiles();
if (changedFiles) await gitAdd({ files: changedFiles }); if (changedFiles) await gitAdd({ files: changedFiles });
else { else {
outro('No changes detected, write some code and run `oc` again'); outro('No changes detected, write some code and run `oc` again');
@@ -106,6 +110,7 @@ export async function commit(isStageAllFlag = false) {
} }
const stagedFilesSpinner = spinner(); const stagedFilesSpinner = spinner();
stagedFilesSpinner.start('Counting staged files'); stagedFilesSpinner.start('Counting staged files');
if (!stagedFiles.length) { if (!stagedFiles.length) {
@@ -118,7 +123,8 @@ export async function commit(isStageAllFlag = false) {
isStageAllAndCommitConfirmedByUser && isStageAllAndCommitConfirmedByUser &&
!isCancel(isStageAllAndCommitConfirmedByUser) !isCancel(isStageAllAndCommitConfirmedByUser)
) { ) {
await commit(true);
await commit(extraArgs, true);
process.exit(1); process.exit(1);
} }
@@ -136,7 +142,7 @@ export async function commit(isStageAllFlag = false) {
await gitAdd({ files }); await gitAdd({ files });
} }
await commit(false); await commit(extraArgs, false);
process.exit(1); process.exit(1);
} }
@@ -147,7 +153,7 @@ export async function commit(isStageAllFlag = false) {
); );
const [, generateCommitError] = await trytm( const [, generateCommitError] = await trytm(
generateCommitMessageFromGitDiff(await getDiff({ files: stagedFiles })) generateCommitMessageFromGitDiff(await getDiff({ files: stagedFiles }), extraArgs)
); );
if (generateCommitError) { if (generateCommitError) {
+1 -1
View File
@@ -21,7 +21,7 @@ const INIT_MESSAGES_PROMPT: Array<ChatCompletionRequestMessage> = [
config?.description config?.description
? 'Add a short description of what commit is about after the commit message. Don\'t start it with "This commit", just describe the changes.' ? 'Add a short description of what commit is about after the commit message. Don\'t start it with "This commit", just describe the changes.'
: 'Don\'t add any descriptions to the commit, only commit message.' : 'Don\'t add any descriptions to the commit, only commit message.'
} Use ${translation.localLanguage} to answer.}` } Use ${translation.localLanguage} to answer.`
}, },
{ {
role: ChatCompletionRequestMessageRoleEnum.User, role: ChatCompletionRequestMessageRoleEnum.User,
+21 -3
View File
@@ -1,5 +1,7 @@
import { execa } from 'execa'; import { execa } from 'execa';
import { outro, spinner } from '@clack/prompts'; import { outro, spinner } from '@clack/prompts';
import { readFileSync } from 'fs';
import ignore, { Ignore } from 'ignore';
export const assertGitRepo = async () => { export const assertGitRepo = async () => {
try { try {
@@ -13,16 +15,32 @@ export const assertGitRepo = async () => {
// (file) => `:(exclude)${file}` // (file) => `:(exclude)${file}`
// ); // );
export const getOpenCommitIgnore = (): Ignore => {
const ig = ignore();
try {
ig.add(readFileSync('.opencommitignore').toString().split('\n'));
} catch(e) {}
return ig;
}
export const getStagedFiles = async (): Promise<string[]> => { export const getStagedFiles = async (): Promise<string[]> => {
const { stdout: files } = await execa('git', [ const { stdout: files } = await execa('git', [
'diff', 'diff',
'--name-only', '--name-only',
'--cached' '--cached',
]); ]);
if (!files) return []; const filesList = files.split('\n');
return files.split('\n').sort();
const ig = getOpenCommitIgnore();
const allowedFiles = filesList.filter(file => !ig.ignores(file));
if (!allowedFiles) return [];
return allowedFiles.sort();
}; };
export const getChangedFiles = async (): Promise<string[]> => { export const getChangedFiles = async (): Promise<string[]> => {