diff --git a/aider/linter.py b/aider/linter.py index 920a8b7c6..51ed40b70 100644 --- a/aider/linter.py +++ b/aider/linter.py @@ -4,7 +4,7 @@ import subprocess import sys import traceback import warnings -import shlex +import oslex from dataclasses import dataclass from pathlib import Path @@ -45,7 +45,7 @@ class Linter: return fname def run_cmd(self, cmd, rel_fname, code): - cmd += " " + shlex.quote(rel_fname) + cmd += " " + oslex.quote(rel_fname) returncode = 0 stdout = "" diff --git a/aider/utils.py b/aider/utils.py index c6773f140..8ab8184a3 100644 --- a/aider/utils.py +++ b/aider/utils.py @@ -1,7 +1,7 @@ import itertools import os import platform -import shlex +import oslex import subprocess import sys import tempfile @@ -384,10 +384,7 @@ def printable_shell_command(cmd_list): Returns: str: Shell-escaped command string. """ - if platform.system() == "Windows": - return subprocess.list2cmdline(cmd_list) - else: - return shlex.join(cmd_list) + return oslex.join(cmd_list) def main(): diff --git a/requirements.txt b/requirements.txt index 31a3c058f..6aebb7322 100644 --- a/requirements.txt +++ b/requirements.txt @@ -237,6 +237,12 @@ mixpanel==4.10.1 # via # -c requirements/common-constraints.txt # -r requirements/requirements.in +monotonic==1.6 + # via + # -c requirements/common-constraints.txt + # posthog +mslex==1.3.0 + # via oslex multidict==6.4.3 # via # -c requirements/common-constraints.txt @@ -255,6 +261,8 @@ openai==1.75.0 # via # -c requirements/common-constraints.txt # litellm +oslex==0.1.3 + # via -r requirements/requirements.in packaging==24.2 # via # -c requirements/common-constraints.txt @@ -515,6 +523,6 @@ zipp==3.21.0 # via # -c requirements/common-constraints.txt # importlib-metadata - + tree-sitter==0.23.2; python_version < "3.10" tree-sitter==0.24.0; python_version >= "3.10" diff --git a/requirements/requirements.in b/requirements/requirements.in index 56bd17132..1d3e7d895 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -28,6 +28,7 @@ watchfiles socksio pip pillow +oslex google-generativeai # The proper dependency is networkx[default], but this brings diff --git a/tests/basic/test_linter.py b/tests/basic/test_linter.py index 9dce56355..60132b565 100644 --- a/tests/basic/test_linter.py +++ b/tests/basic/test_linter.py @@ -1,3 +1,4 @@ +import os import unittest from unittest.mock import MagicMock, patch @@ -36,6 +37,15 @@ class TestLinter(unittest.TestCase): result = self.linter.run_cmd("test_cmd", "test_file.py", "code") self.assertIsNone(result) + def test_run_cmd_win(self): + if os.name != "nt": + self.skipTest("This test only runs on Windows") + from pathlib import Path + root = Path(__file__).parent.parent.parent.absolute().as_posix() + linter = Linter(encoding="utf-8", root=root) + result = linter.run_cmd("dir", "tests\\basic", "code") + self.assertIsNone(result) + @patch("subprocess.Popen") def test_run_cmd_with_errors(self, mock_popen): mock_process = MagicMock()