Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combine user and ai commit messages #2904

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ cd aider

It is recommended to create a virtual environment outside of the repository to keep your development environment isolated.

#### Using `venv` (Python 3.9 and later)
#### Using `venv` (Python 3.9 to 3.12, Python 3.13 is not supported)

```
python -m venv /path/to/venv
Expand Down
6 changes: 6 additions & 0 deletions aider/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,12 @@ def get_parser(default_config_files, git_root):
default=True,
help="Enable/disable suggesting shell commands (default: True)",
)
group.add_argument(
"--append-provided-message",
action=argparse.BooleanOptionalAction,
default=False,
help="Append human provided commit messages after AI generated ones (default: False)",
)
group.add_argument(
"--fancy-input",
action=argparse.BooleanOptionalAction,
Expand Down
28 changes: 18 additions & 10 deletions aider/repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,11 @@ def __init__(
attribute_commit_message_committer=False,
commit_prompt=None,
subtree_only=False,
append_provided_message=False,
):
self.io = io
self.models = models
self.append_provided_message = append_provided_message

self.normalized_path = {}
self.tree_files = {}
Expand Down Expand Up @@ -184,7 +186,10 @@ def get_rel_repo_dir(self):
except (ValueError, OSError):
return self.repo.git_dir

def get_commit_message(self, diffs, context):
def get_commit_message(self, diffs, context, message=None):
if message and not self.append_provided_message:
return message

diffs = "# Diffs:\n" + diffs

content = ""
Expand All @@ -198,25 +203,28 @@ def get_commit_message(self, diffs, context):
dict(role="user", content=content),
]

commit_message = None
ai_message = None
for model in self.models:
num_tokens = model.token_count(messages)
max_tokens = model.info.get("max_input_tokens") or 0
if max_tokens and num_tokens > max_tokens:
continue
commit_message = simple_send_with_retries(model, messages)
if commit_message:
ai_message = simple_send_with_retries(model, messages)
if ai_message:
break

if not commit_message:
if not ai_message:
self.io.tool_error("Failed to generate commit message!")
return
return message or "(no commit message provided)"

ai_message = ai_message.strip()
if ai_message and ai_message[0] == '"' and ai_message[-1] == '"':
ai_message = ai_message[1:-1].strip()

commit_message = commit_message.strip()
if commit_message and commit_message[0] == '"' and commit_message[-1] == '"':
commit_message = commit_message[1:-1].strip()
if message and self.append_provided_message:
return f"{ai_message}\n\n{message}"

return commit_message
return ai_message

def get_diffs(self, fnames=None):
# We always want diffs of index and working dir
Expand Down
3 changes: 3 additions & 0 deletions aider/website/assets/sample.aider.conf.yml
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,9 @@
## Specify a custom prompt for generating commit messages
#commit-prompt: xxx

## Append human provided commit messages after AI generated ones (default: False)
#append-provided-message: false

## Perform a dry run without modifying files (default: False)
#dry-run: false

Expand Down
3 changes: 3 additions & 0 deletions aider/website/assets/sample.env
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,9 @@
## Specify a custom prompt for generating commit messages
#AIDER_COMMIT_PROMPT=

## Append human provided commit messages after AI generated ones (default: False)
#AIDER_APPEND_PROVIDED_MESSAGE=false

## Perform a dry run without modifying files (default: False)
#AIDER_DRY_RUN=false

Expand Down
3 changes: 3 additions & 0 deletions aider/website/docs/config/dotenv.md
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,9 @@ cog.outl("```")
## Specify a custom prompt for generating commit messages
#AIDER_COMMIT_PROMPT=

## Append human provided commit messages after AI generated ones (default: False)
#AIDER_APPEND_PROVIDED_MESSAGE=false

## Perform a dry run without modifying files (default: False)
#AIDER_DRY_RUN=false

Expand Down
8 changes: 8 additions & 0 deletions aider/website/docs/config/options.md
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,14 @@ Environment variable: `AIDER_COMMIT`
Specify a custom prompt for generating commit messages
Environment variable: `AIDER_COMMIT_PROMPT`

### `--append-provided-message`
Append human provided commit messages after AI generated ones (default: False)
Default: False
Environment variable: `AIDER_APPEND_PROVIDED_MESSAGE`
Aliases:
- `--append-provided-message`
- `--no-append-provided-message`

### `--dry-run`
Perform a dry run without modifying files (default: False)
Default: False
Expand Down
25 changes: 25 additions & 0 deletions tests/basic/test_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,31 @@ def test_get_tracked_files_from_subdir(self):
fnames = git_repo.get_tracked_files()
self.assertIn(str(fname), fnames)

@patch("aider.repo.simple_send_with_retries")
def test_get_commit_message_append_provided(self, mock_send):
mock_send.return_value = "feat: add new feature"

# Test with append_provided_message=True
repo = GitRepo(InputOutput(), None, None, models=[self.GPT35], append_provided_message=True)
result = repo.get_commit_message(
"dummy diff", "dummy context", "This change was needed because..."
)
self.assertEqual(result, "feat: add new feature\n\nThis change was needed because...")

# Test with append_provided_message=False (default behavior)
repo = GitRepo(
InputOutput(), None, None, models=[self.GPT35], append_provided_message=False
)
result = repo.get_commit_message(
"dummy diff", "dummy context", "This change was needed because..."
)
self.assertEqual(result, "This change was needed because...")

# Test with append_provided_message=True but no provided message
repo = GitRepo(InputOutput(), None, None, models=[self.GPT35], append_provided_message=True)
result = repo.get_commit_message("dummy diff", "dummy context")
self.assertEqual(result, "feat: add new feature")

def test_subtree_only(self):
with GitTemporaryDirectory():
# Create a new repo
Expand Down
Loading