diff --git a/aider/commands.py b/aider/commands.py index f780e512005..79a1b33eb98 100644 --- a/aider/commands.py +++ b/aider/commands.py @@ -305,6 +305,7 @@ def cmd_add(self, args): for matched_file in all_matched_files: abs_file_path = self.coder.abs_root_path(matched_file) + rel_path = self.coder.get_rel_fname(matched_file) if not abs_file_path.startswith(self.coder.root): self.io.tool_error( @@ -312,7 +313,7 @@ def cmd_add(self, args): ) continue - if self.coder.repo and matched_file not in git_files: + if self.coder.repo and rel_path not in git_files: try: self.coder.repo.repo.git.add(abs_file_path) git_added.append(matched_file) diff --git a/tests/test_commands.py b/tests/test_commands.py index 3957df8efce..7ff801ba8c8 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -432,3 +432,29 @@ def test_cmd_add_no_autocommit(self): # Assert that foo.txt has been `git add` but not `git commit` added_files = repo.git.diff("--cached", "--name-only").split() self.assertIn("foo.txt", added_files) + + def test_cmd_add_existing_with_dirty_repo(self): + with GitTemporaryDirectory(): + repo = git.Repo() + + files = ["one.txt", "two.txt"] + for fname in files: + Path(fname).touch() + repo.git.add(fname) + repo.git.commit("-m", "initial") + + commit = repo.head.commit.hexsha + + # leave a dirty `git rm` + repo.git.rm("one.txt") + + io = InputOutput(pretty=False, yes=True) + from aider.coders import Coder + + coder = Coder.create(models.GPT35, None, io) + commands = Commands(io, coder) + + # There's no reason this /add should trigger a commit + commands.cmd_add("two.txt") + + self.assertEqual(commit, repo.head.commit.hexsha)