From 486f3b3eef8136436eccc97e03002332539b81c2 Mon Sep 17 00:00:00 2001 From: Mike Gehard Date: Sat, 18 Jan 2025 11:01:17 -0500 Subject: [PATCH 1/2] docs: Be explicit about supported Python dev versions --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index abe35a1c0ee..991a9de3c6d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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 From fc6c9bf1569e372e82ab63091e8dab4e90ed83ce Mon Sep 17 00:00:00 2001 From: Mike Gehard Date: Sat, 18 Jan 2025 11:03:04 -0500 Subject: [PATCH 2/2] feat: Add append-provided-message Allow user to provide message in combination with AI generated message --- aider/args.py | 6 +++++ aider/repo.py | 28 ++++++++++++++-------- aider/website/assets/sample.aider.conf.yml | 3 +++ aider/website/assets/sample.env | 3 +++ aider/website/docs/config/dotenv.md | 3 +++ aider/website/docs/config/options.md | 8 +++++++ tests/basic/test_repo.py | 25 +++++++++++++++++++ 7 files changed, 66 insertions(+), 10 deletions(-) diff --git a/aider/args.py b/aider/args.py index b880605a90a..128ee76d875 100644 --- a/aider/args.py +++ b/aider/args.py @@ -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, diff --git a/aider/repo.py b/aider/repo.py index dd8b6f113fc..f526e2d65e3 100644 --- a/aider/repo.py +++ b/aider/repo.py @@ -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 = {} @@ -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 = "" @@ -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 diff --git a/aider/website/assets/sample.aider.conf.yml b/aider/website/assets/sample.aider.conf.yml index fa85acda58d..92050efbd84 100644 --- a/aider/website/assets/sample.aider.conf.yml +++ b/aider/website/assets/sample.aider.conf.yml @@ -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 diff --git a/aider/website/assets/sample.env b/aider/website/assets/sample.env index cfb19aa6de7..5fc0f9ca856 100644 --- a/aider/website/assets/sample.env +++ b/aider/website/assets/sample.env @@ -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 diff --git a/aider/website/docs/config/dotenv.md b/aider/website/docs/config/dotenv.md index d7bf7503d96..b61198d1209 100644 --- a/aider/website/docs/config/dotenv.md +++ b/aider/website/docs/config/dotenv.md @@ -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 diff --git a/aider/website/docs/config/options.md b/aider/website/docs/config/options.md index fc672186bdb..92256e5ee1f 100644 --- a/aider/website/docs/config/options.md +++ b/aider/website/docs/config/options.md @@ -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 diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py index a9de68a66e9..76b390da18b 100644 --- a/tests/basic/test_repo.py +++ b/tests/basic/test_repo.py @@ -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