Skip to content

Commit d137a2f

Browse files
authored
Git - add repository/branch name to the commit message generation context (#1756)
1 parent 486df42 commit d137a2f

File tree

6 files changed

+23
-11
lines changed

6 files changed

+23
-11
lines changed

src/extension/prompt/node/gitCommitMessageGenerator.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import type { CancellationToken } from 'vscode';
7+
import { IAuthenticationService } from '../../../platform/authentication/common/authentication';
78
import { ChatFetchResponseType, ChatLocation } from '../../../platform/chat/common/commonTypes';
89
import { IConversationOptions } from '../../../platform/chat/common/conversationOptions';
910
import { IInteractionService } from '../../../platform/chat/common/interactionService';
@@ -15,13 +16,11 @@ import { IInstantiationService } from '../../../util/vs/platform/instantiation/c
1516
import { PromptRenderer } from '../../prompts/node/base/promptRenderer';
1617
import { GitCommitMessagePrompt } from '../../prompts/node/git/gitCommitMessagePrompt';
1718
import { RecentCommitMessages } from '../common/repository';
18-
import { IAuthenticationService } from '../../../platform/authentication/common/authentication';
1919

2020
type ResponseFormat = 'noTextCodeBlock' | 'oneTextCodeBlock' | 'multipleTextCodeBlocks';
2121

2222
export class GitCommitMessageGenerator {
2323
constructor(
24-
2524
@IConversationOptions private readonly conversationOptions: IConversationOptions,
2625
@IEndpointProvider private readonly endpointProvider: IEndpointProvider,
2726
@IInstantiationService private readonly instantiationService: IInstantiationService,
@@ -31,11 +30,11 @@ export class GitCommitMessageGenerator {
3130
@IAuthenticationService private readonly authService: IAuthenticationService,
3231
) { }
3332

34-
async generateGitCommitMessage(changes: Diff[], recentCommitMessages: RecentCommitMessages, attemptCount: number, token: CancellationToken): Promise<string | undefined> {
33+
async generateGitCommitMessage(repositoryName: string, branchName: string, changes: Diff[], recentCommitMessages: RecentCommitMessages, attemptCount: number, token: CancellationToken): Promise<string | undefined> {
3534
const startTime = Date.now();
3635

3736
const endpoint = await this.endpointProvider.getChatEndpoint('gpt-5-mini');
38-
const promptRenderer = PromptRenderer.create(this.instantiationService, endpoint, GitCommitMessagePrompt, { changes, recentCommitMessages });
37+
const promptRenderer = PromptRenderer.create(this.instantiationService, endpoint, GitCommitMessagePrompt, { repositoryName, branchName, changes, recentCommitMessages });
3938
const prompt = await promptRenderer.render(undefined, undefined);
4039

4140
const temperature = Math.min(

src/extension/prompt/vscode-node/gitCommitMessageServiceImpl.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { API, Repository } from '../../../platform/git/vscode/git';
1212
import { ITelemetryService } from '../../../platform/telemetry/common/telemetry';
1313
import { CancellationToken } from '../../../util/vs/base/common/cancellation';
1414
import { DisposableMap, DisposableStore } from '../../../util/vs/base/common/lifecycle';
15+
import { basename } from '../../../util/vs/base/common/resources';
1516
import { IInstantiationService } from '../../../util/vs/platform/instantiation/common/instantiation';
1617
import { RecentCommitMessages } from '../common/repository';
1718
import { GitCommitMessageGenerator } from '../node/gitCommitMessageGenerator';
@@ -96,8 +97,10 @@ export class GitCommitMessageServiceImpl implements IGitCommitMessageService {
9697
const attemptCount = this._getAttemptCount(repository, diffs);
9798
const recentCommitMessages = await this._getRecentCommitMessages(repository);
9899

100+
const repositoryName = basename(repository.rootUri);
101+
const branchName = repository.state.HEAD?.name ?? '';
99102
const gitCommitMessageGenerator = this._instantiationService.createInstance(GitCommitMessageGenerator);
100-
const commitMessage = await gitCommitMessageGenerator.generateGitCommitMessage(changes, recentCommitMessages, attemptCount, cancellationToken);
103+
const commitMessage = await gitCommitMessageGenerator.generateGitCommitMessage(repositoryName, branchName, changes, recentCommitMessages, attemptCount, cancellationToken);
101104

102105
// Save generated commit message
103106
if (commitMessage && repository.state.HEAD && repository.state.HEAD.commit) {

src/extension/prompts/node/git/gitCommitMessagePrompt.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import { FilePathMode, FileVariable } from '../panel/fileVariable';
1414
import { UnsafeCodeBlock } from '../panel/unsafeElements';
1515

1616
export interface GitCommitMessagePromptProps extends BasePromptElementProps {
17+
readonly repositoryName: string;
18+
readonly branchName: string;
1719
readonly changes: Diff[];
1820
readonly recentCommitMessages: RecentCommitMessages;
1921
}
@@ -28,6 +30,11 @@ export class GitCommitMessagePrompt extends PromptElement<GitCommitMessagePrompt
2830
<ResponseTranslationRules />
2931
</SystemMessage>
3032
<UserMessage>
33+
<Tag priority={850} name='repository-context'>
34+
# REPOSITORY DETAILS:<br />
35+
Repository name: {this.props.repositoryName}<br />
36+
Branch name: {this.props.branchName}<br />
37+
</Tag>
3138
{this.props.recentCommitMessages.user.length > 0 && (
3239
<Tag priority={700} name='user-commits'>
3340
# RECENT USER COMMITS (For reference only, do not copy!):<br />

test/outcome/git-commit-message-external.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
{
33
"name": "git commit message [external] [python] - Generated commit messages do not bias to conventional commit style",
44
"requests": [
5-
"76e4cedef4871402e7a219abb86cf82d2f15e61066129b886247eec2624fa28f"
5+
"af8c7badfdd9eca8438b8fbe9fbf772a78d7ee7cb981cc8308f8b87b4d4c343c"
66
]
77
},
88
{
99
"name": "git commit message [external] [python] - Generates a conventional commit message for a bug fix",
1010
"requests": [
11-
"6aaa56b823f7941301713472a5b64b6d4e2f5cb5b2b0109369f2af89fb41b46d"
11+
"130e5b4e8c15c9596988984b617b15756328cd1979e20c23de37770aa5a7ba63"
1212
]
1313
},
1414
{
1515
"name": "git commit message [external] [python] - Generates a simple commit message",
1616
"requests": [
17-
"10feebb5b1a8683f302c4ff663bf32abd018c8bc449d544f5f65ad28b0410d65"
17+
"c83ac5663b803b9afc81cb3969ca6946ca0b12da171971fa5426c0bcc18f30ab"
1818
]
1919
}
2020
]

test/prompts/gitCommitMessageGenerator.stest.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ index 0877b83..6260896 100644
4646
];
4747

4848
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
49-
const message = await generator.generateGitCommitMessage(changes, { repository: [], user: [] }, 0, CancellationToken.None);
49+
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: [], user: [] }, 0, CancellationToken.None);
5050
assert.ok(message !== undefined, 'Failed to generate a commit message');
5151
});
5252

@@ -91,7 +91,7 @@ index 0877b83..6260896 100644
9191
];
9292

9393
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
94-
const message = await generator.generateGitCommitMessage(changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
94+
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
9595

9696
assert.ok(message !== undefined, 'Failed to generate a commit message');
9797
assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');
@@ -143,7 +143,7 @@ index 0877b83..6260896 100644
143143
];
144144

145145
const generator = instantiationService.createInstance(GitCommitMessageGenerator);
146-
const message = await generator.generateGitCommitMessage(changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
146+
const message = await generator.generateGitCommitMessage('test-repo', 'main', changes, { repository: repoCommits, user: userCommits }, 0, CancellationToken.None);
147147

148148
assert.ok(message !== undefined, 'Failed to generate a commit message');
149149
assert.ok(!userCommits.some(commit => message.toLowerCase().includes(commit)), 'Commit message contains a user commit');
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:1db51b8d46c0c1640b4beff7f55319f8db363b4206ecd7a48f16be5d17278311
3+
size 40960

0 commit comments

Comments
 (0)