Merge pull request #3869 from titusz/fix/shlex

Fix shlex.quote() use in linter on Windows
This commit is contained in:
paul-gauthier 2025-05-07 16:23:53 -07:00 committed by GitHub
commit cbaaf96324
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 24 additions and 8 deletions

View file

@ -4,7 +4,7 @@ import subprocess
import sys import sys
import traceback import traceback
import warnings import warnings
import shlex import oslex
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
@ -45,7 +45,7 @@ class Linter:
return fname return fname
def run_cmd(self, cmd, rel_fname, code): def run_cmd(self, cmd, rel_fname, code):
cmd += " " + shlex.quote(rel_fname) cmd += " " + oslex.quote(rel_fname)
returncode = 0 returncode = 0
stdout = "" stdout = ""

View file

@ -1,7 +1,7 @@
import itertools import itertools
import os import os
import platform import platform
import shlex import oslex
import subprocess import subprocess
import sys import sys
import tempfile import tempfile
@ -384,10 +384,7 @@ def printable_shell_command(cmd_list):
Returns: Returns:
str: Shell-escaped command string. str: Shell-escaped command string.
""" """
if platform.system() == "Windows": return oslex.join(cmd_list)
return subprocess.list2cmdline(cmd_list)
else:
return shlex.join(cmd_list)
def main(): def main():

View file

@ -237,6 +237,12 @@ mixpanel==4.10.1
# via # via
# -c requirements/common-constraints.txt # -c requirements/common-constraints.txt
# -r requirements/requirements.in # -r requirements/requirements.in
monotonic==1.6
# via
# -c requirements/common-constraints.txt
# posthog
mslex==1.3.0
# via oslex
multidict==6.4.3 multidict==6.4.3
# via # via
# -c requirements/common-constraints.txt # -c requirements/common-constraints.txt
@ -255,6 +261,8 @@ openai==1.75.0
# via # via
# -c requirements/common-constraints.txt # -c requirements/common-constraints.txt
# litellm # litellm
oslex==0.1.3
# via -r requirements/requirements.in
packaging==24.2 packaging==24.2
# via # via
# -c requirements/common-constraints.txt # -c requirements/common-constraints.txt
@ -515,6 +523,6 @@ zipp==3.21.0
# via # via
# -c requirements/common-constraints.txt # -c requirements/common-constraints.txt
# importlib-metadata # importlib-metadata
tree-sitter==0.23.2; python_version < "3.10" tree-sitter==0.23.2; python_version < "3.10"
tree-sitter==0.24.0; python_version >= "3.10" tree-sitter==0.24.0; python_version >= "3.10"

View file

@ -28,6 +28,7 @@ watchfiles
socksio socksio
pip pip
pillow pillow
oslex
google-generativeai google-generativeai
# The proper dependency is networkx[default], but this brings # The proper dependency is networkx[default], but this brings

View file

@ -1,3 +1,4 @@
import os
import unittest import unittest
from unittest.mock import MagicMock, patch 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") result = self.linter.run_cmd("test_cmd", "test_file.py", "code")
self.assertIsNone(result) 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") @patch("subprocess.Popen")
def test_run_cmd_with_errors(self, mock_popen): def test_run_cmd_with_errors(self, mock_popen):
mock_process = MagicMock() mock_process = MagicMock()