From 6e462e62a65d03470226afe03b6521ecdf8ef8f5 Mon Sep 17 00:00:00 2001 From: chengyongru <2755839590@qq.com> Date: Mon, 13 Jul 2026 23:50:53 +0800 Subject: [PATCH] fix(dream): limit newline normalization to CRLF --- nanobot/utils/gitstore.py | 10 +++++----- tests/agent/test_dream.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/nanobot/utils/gitstore.py b/nanobot/utils/gitstore.py index 58daeeac..1ccf3d0c 100644 --- a/nanobot/utils/gitstore.py +++ b/nanobot/utils/gitstore.py @@ -365,7 +365,7 @@ class GitStore: wt_path = self._workspace / path try: wt_text = ( - wt_path.read_text(encoding="utf-8") + wt_path.read_bytes().decode("utf-8") if wt_path.exists() else "" ) @@ -377,12 +377,12 @@ class GitStore: changed += 1 summary_lines.append(f"{path}: binary or non-UTF-8 file changed") continue - # Git blobs preserve line endings while read_text() normalizes - # them. Compare the same logical lines used by the diff. + # Treat CRLF and LF as equivalent without hiding other + # newline changes, such as a missing final newline. + if head_text.replace("\r\n", "\n") == wt_text.replace("\r\n", "\n"): + continue head_lines = head_text.splitlines() wt_lines = wt_text.splitlines() - if head_lines == wt_lines: - continue changed += 1 hunks = list(difflib.unified_diff( head_lines, diff --git a/tests/agent/test_dream.py b/tests/agent/test_dream.py index b2791502..998d0ae3 100644 --- a/tests/agent/test_dream.py +++ b/tests/agent/test_dream.py @@ -697,6 +697,22 @@ class TestDreamContentDiff: assert status == "" assert store.dream_content_diff() == "" + @pytest.mark.parametrize( + ("before", "after", "changed"), + [ + (b"# Memory\r\n", b"# Memory\n", False), + (b"# Memory\n", b"# Memory", True), + (b"# Memory\r", b"# Memory\n", True), + ], + ) + def test_only_ignores_crlf_lf_changes(self, store, before, after, changed): + store.memory_file.write_bytes(before) + store.git.init() + + store.memory_file.write_bytes(after) + + assert bool(store.dream_content_diff()) is changed + def test_reflects_real_content_edits(self, store): store.git.init() store.git.auto_commit("initial")