From bfaad12cac828cd098294c7d7980a6bef614f3f1 Mon Sep 17 00:00:00 2001 From: muravvv <50175509+muravvv@users.noreply.github.com> Date: Sun, 1 Jun 2025 14:56:23 +0300 Subject: [PATCH] add missing encoding conversion for diff contents --- aider/repo.py | 16 ++++++++++++---- tests/basic/test_repo.py | 22 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/aider/repo.py b/aider/repo.py index 83d9e202a..bd4937303 100644 --- a/aider/repo.py +++ b/aider/repo.py @@ -391,14 +391,20 @@ class GitRepo: try: if current_branch_has_commits: args = ["HEAD", "--"] + list(fnames) - diffs += self.repo.git.diff(*args) + diffs += self.repo.git.diff(*args, stdout_as_string=False).decode( + self.io.encoding, "replace" + ) return diffs wd_args = ["--"] + list(fnames) index_args = ["--cached"] + wd_args - diffs += self.repo.git.diff(*index_args) - diffs += self.repo.git.diff(*wd_args) + diffs += self.repo.git.diff(*index_args, stdout_as_string=False).decode( + self.io.encoding, "replace" + ) + diffs += self.repo.git.diff(*wd_args, stdout_as_string=False).decode( + self.io.encoding, "replace" + ) return diffs except ANY_GIT_ERROR as err: @@ -412,7 +418,9 @@ class GitRepo: args += ["--color=never"] args += [from_commit, to_commit] - diffs = self.repo.git.diff(*args) + diffs = self.repo.git.diff(*args, stdout_as_string=False).decode( + self.io.encoding, "replace" + ) return diffs diff --git a/tests/basic/test_repo.py b/tests/basic/test_repo.py index 0f1e7ed0e..5c366f87f 100644 --- a/tests/basic/test_repo.py +++ b/tests/basic/test_repo.py @@ -59,6 +59,28 @@ class TestRepo(unittest.TestCase): self.assertIn("index", diffs) self.assertIn("workingdir", diffs) + def test_diffs_with_single_byte_encoding(self): + with GitTemporaryDirectory(): + encoding = "cp1251" + + repo = git.Repo() + + fname = Path("foo.txt") + fname.write_text("index\n", encoding=encoding) + repo.git.add(str(fname)) + + # Make a change with non-ASCII symbols in the working dir + fname.write_text("АБВ\n", encoding=encoding) + + git_repo = GitRepo(InputOutput(encoding=encoding), None, ".") + diffs = git_repo.get_diffs() + + # check that all diff output can be converted to utf-8 for sending to model + diffs.encode("utf-8") + + self.assertIn("index", diffs) + self.assertIn("АБВ", diffs) + def test_diffs_detached_head(self): with GitTemporaryDirectory(): repo = git.Repo()