diff --git a/aider/utils.py b/aider/utils.py index 834ffa195..f8d843eec 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -95,7 +95,10 @@ def is_image_file(file_name): def safe_abs_path(res): "Gives an abs path, which safely returns a full (not 8.3) windows path" - res = Path(res).resolve() + try: + res = Path(res).resolve() + except (RuntimeError, OSError): + res = Path(res).absolute() return str(res) diff --git a/tests/basic/test_utils.py b/tests/basic/test_utils.py new file mode 100644 index 000000000..9f5c0a54b --- /dev/null +++ b/tests/basic/test_utils.py @@ -0,0 +1,15 @@ +import os + +from aider.utils import safe_abs_path + + +def test_safe_abs_path_symlink_loop(tmp_path): + # Create circular symlink: a -> b -> a + link_a = tmp_path / "link_a" + link_b = tmp_path / "link_b" + link_a.symlink_to(link_b) + link_b.symlink_to(link_a) + + # safe_abs_path must not raise, and must return an absolute path + result = safe_abs_path(str(link_a)) + assert os.path.isabs(result)