docs: Do not use shell=True in dart_domain.py (#2405)

This fixes a problem that we accidentally introduced in a recent PR: the
`shell=True` setting requires that the arguments were passed as a single
string instead of a list. Passing as a string, in turn, is somewhat
problematic because the file names need to be escaped, and there is no
utility function to make this escaping cross-platform.

So, instead we'll use the standard `shell=False`, and invoke
`dartdoc_json.bat` on Windows instead of simply `dartdoc_json`. Hope
this would work.
This commit is contained in:
Pasha Stetsenko
2023-03-13 11:43:40 -07:00
committed by GitHub
parent 5e8ecf5450
commit a72b0ff3ac

View File

@ -2,7 +2,6 @@ import json
import os import os
import re import re
import subprocess import subprocess
import sys
import tempfile import tempfile
from typing import List, Tuple, Dict, Optional, Set, Any from typing import List, Tuple, Dict, Optional, Set, Any
@ -168,14 +167,20 @@ class DartdocDirective(SphinxDirective):
def _scan_source_file(self): def _scan_source_file(self):
with tempfile.NamedTemporaryFile(mode='rt', suffix='.json', delete=False) as temp_file: with tempfile.NamedTemporaryFile(mode='rt', suffix='.json', delete=False) as temp_file:
# Note: on Windows, a temporary file cannot be opened in another
# process if it is already open in this process. Thus, we need to
# close the file handle first before handing the file name to
# `subprocess.run()`.
temp_file.close()
try: try:
temp_file.close() executable = 'dartdoc_json'
if os.name == 'nt': # Windows
executable = 'dartdoc_json.bat'
subprocess.run( subprocess.run(
['dartdoc_json', self.source_file, '--output', temp_file.name], [executable, self.source_file, '--output', temp_file.name],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,
check=True, check=True,
shell=True,
) )
with open(temp_file.name, 'r') as t: with open(temp_file.name, 'r') as t:
json_string = t.read() json_string = t.read()