From 1f3a9cf98432ac25ec025674f45f511af49c7ae1 Mon Sep 17 00:00:00 2001 From: "Derrick Hammer (aider)" Date: Mon, 12 May 2025 08:18:20 -0400 Subject: [PATCH] feat: add --auto-commit-message argument to control auto-commit message generation --- aider/args.py | 6 ++++++ aider/coders/base_coder.py | 3 +++ aider/repo.py | 11 +++++++---- tests/basic/test_coder.py | 28 ++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/aider/args.py b/aider/args.py index 08c9bde76..86159262d 100644 --- a/aider/args.py +++ b/aider/args.py @@ -398,6 +398,12 @@ def get_parser(default_config_files, git_root): ########## group = parser.add_argument_group("Git settings") + group.add_argument( + "--auto-commit-message", + action=argparse.BooleanOptionalAction, + default=True, + help="Enable/disable automatic LLM commit message generation for auto-commits and '/commit' without message.", + ) group.add_argument( "--git", action=argparse.BooleanOptionalAction, diff --git a/aider/coders/base_coder.py b/aider/coders/base_coder.py index f37e47bed..aa82895fd 100755 --- a/aider/coders/base_coder.py +++ b/aider/coders/base_coder.py @@ -335,6 +335,7 @@ class Coder: file_watcher=None, auto_copy_context=False, auto_accept_architect=True, + auto_commit_message=True, ): # Fill in a dummy Analytics if needed, but it is never .enable()'d self.analytics = analytics if analytics is not None else Analytics() @@ -348,6 +349,7 @@ class Coder: self.auto_copy_context = auto_copy_context self.auto_accept_architect = auto_accept_architect + self.auto_commit_message = auto_commit_message self.ignore_mentions = ignore_mentions if not self.ignore_mentions: @@ -434,6 +436,7 @@ class Coder: fnames, None, models=main_model.commit_message_models(), + auto_commit_message=self.auto_commit_message, ) except FileNotFoundError: pass diff --git a/aider/repo.py b/aider/repo.py index 01652b15f..c6b9d9f47 100644 --- a/aider/repo.py +++ b/aider/repo.py @@ -74,6 +74,7 @@ class GitRepo: subtree_only=False, git_commit_verify=True, attribute_co_authored_by=False, # Added parameter + auto_commit_message=True, ): self.io = io self.models = models @@ -86,6 +87,7 @@ class GitRepo: self.attribute_commit_message_author = attribute_commit_message_author self.attribute_commit_message_committer = attribute_commit_message_committer self.attribute_co_authored_by = attribute_co_authored_by # Assign from parameter + self.auto_commit_message = auto_commit_message self.commit_prompt = commit_prompt self.subtree_only = subtree_only self.git_commit_verify = git_commit_verify @@ -208,10 +210,11 @@ class GitRepo: if message: commit_message = message else: - user_language = None - if coder: - user_language = coder.get_user_language() - commit_message = self.get_commit_message(diffs, context, user_language) + if coder and self.auto_commit_message: + user_language = coder.get_user_language() if coder else None + commit_message = self.get_commit_message(diffs, context, user_language) + else: + commit_message = None # Retrieve attribute settings, prioritizing coder.args if available if coder and hasattr(coder, "args"): diff --git a/tests/basic/test_coder.py b/tests/basic/test_coder.py index e9cbe6842..c34a7a145 100644 --- a/tests/basic/test_coder.py +++ b/tests/basic/test_coder.py @@ -1403,6 +1403,34 @@ This command will print 'Hello, World!' to the console.""" # (because user rejected the changes) mock_editor.run.assert_not_called() + def test_auto_commit_message_flag(self): + with GitTemporaryDirectory(): + repo = git.Repo() + fname = Path("test.txt") + fname.touch() + + # Test with auto_commit_message=True (default) + io = InputOutput(yes=True) + coder = Coder.create( + self.GPT35, + "diff", + io=io, + fnames=[str(fname)], + auto_commit_message=True, + ) + assert coder.repo.auto_commit_message is True + + # Test with auto_commit_message=False + io = InputOutput(yes=True) + coder = Coder.create( + self.GPT35, + "diff", + io=io, + fnames=[str(fname)], + auto_commit_message=False, + ) + assert coder.repo.auto_commit_message is False + if __name__ == "__main__": unittest.main()