diff options
| author | Zach White <skullydazed@gmail.com> | 2021-05-19 15:24:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-19 15:24:46 -0700 |
| commit | db1eacdaacb9c8f6889f46bc1c6af155b81ad72a (patch) | |
| tree | cd32a69a04c7ff93a11941d82aef3ce31c2b7523 /lib | |
| parent | a9aec546c873fa5a2cb1d9a10878aca71818b609 (diff) | |
| download | qmk_firmware-db1eacdaacb9c8f6889f46bc1c6af155b81ad72a.tar.gz qmk_firmware-db1eacdaacb9c8f6889f46bc1c6af155b81ad72a.zip | |
Align our subprocess usage with current best practices. (#12940)
* Align our subprocess usage with current best practices.
* remove unused import
* Apply suggestions from code review
Co-authored-by: Ryan <fauxpark@gmail.com>
* fix the cpp invocation for older python
* allow for unprompted installation
* make sure qmk new-keyboard works on windows
Co-authored-by: Ryan <fauxpark@gmail.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/python/qmk/cli/cformat.py | 10 | ||||
| -rw-r--r-- | lib/python/qmk/cli/clean.py | 6 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/compile.py | 5 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/doctor.py | 4 | ||||
| -rw-r--r-- | lib/python/qmk/cli/flash.py | 5 | ||||
| -rw-r--r-- | lib/python/qmk/cli/generate/docs.py | 14 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/multibuild.py | 5 | ||||
| -rw-r--r-- | lib/python/qmk/cli/new/keyboard.py | 2 | ||||
| -rwxr-xr-x | lib/python/qmk/cli/pyformat.py | 8 | ||||
| -rw-r--r-- | lib/python/qmk/cli/pytest.py | 6 | ||||
| -rw-r--r-- | lib/python/qmk/commands.py | 23 | ||||
| -rw-r--r-- | lib/python/qmk/keymap.py | 9 | ||||
| -rw-r--r-- | lib/python/qmk/os_helpers/__init__.py | 5 | ||||
| -rw-r--r-- | lib/python/qmk/os_helpers/linux/__init__.py | 3 | ||||
| -rw-r--r-- | lib/python/qmk/submodules.py | 17 | ||||
| -rw-r--r-- | lib/python/qmk/tests/test_cli_commands.py | 9 |
16 files changed, 58 insertions, 73 deletions
diff --git a/lib/python/qmk/cli/cformat.py b/lib/python/qmk/cli/cformat.py index 15158d9c7..efeb45967 100644 --- a/lib/python/qmk/cli/cformat.py +++ b/lib/python/qmk/cli/cformat.py | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | """Format C code according to QMK's style. | 1 | """Format C code according to QMK's style. |
| 2 | """ | 2 | """ |
| 3 | import subprocess | ||
| 4 | from os import path | 3 | from os import path |
| 5 | from shutil import which | 4 | from shutil import which |
| 5 | from subprocess import CalledProcessError, DEVNULL, Popen, PIPE | ||
| 6 | 6 | ||
| 7 | from argcomplete.completers import FilesCompleter | 7 | from argcomplete.completers import FilesCompleter |
| 8 | from milc import cli | 8 | from milc import cli |
| @@ -34,7 +34,7 @@ def find_diffs(files): | |||
| 34 | 34 | ||
| 35 | for file in files: | 35 | for file in files: |
| 36 | cli.log.debug('Checking for changes in %s', file) | 36 | cli.log.debug('Checking for changes in %s', file) |
| 37 | clang_format = subprocess.Popen([find_clang_format(), file], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) | 37 | clang_format = Popen([find_clang_format(), file], stdout=PIPE, stderr=PIPE, universal_newlines=True) |
| 38 | diff = cli.run(['diff', '-u', f'--label=a/{file}', f'--label=b/{file}', str(file), '-'], stdin=clang_format.stdout, capture_output=True) | 38 | diff = cli.run(['diff', '-u', f'--label=a/{file}', f'--label=b/{file}', str(file), '-'], stdin=clang_format.stdout, capture_output=True) |
| 39 | 39 | ||
| 40 | if diff.returncode != 0: | 40 | if diff.returncode != 0: |
| @@ -51,11 +51,11 @@ def cformat_run(files): | |||
| 51 | clang_format = [find_clang_format(), '-i'] | 51 | clang_format = [find_clang_format(), '-i'] |
| 52 | 52 | ||
| 53 | try: | 53 | try: |
| 54 | cli.run(clang_format + list(map(str, files)), check=True, capture_output=False) | 54 | cli.run([*clang_format, *map(str, files)], check=True, capture_output=False, stdin=DEVNULL) |
| 55 | cli.log.info('Successfully formatted the C code.') | 55 | cli.log.info('Successfully formatted the C code.') |
| 56 | return True | 56 | return True |
| 57 | 57 | ||
| 58 | except subprocess.CalledProcessError as e: | 58 | except CalledProcessError as e: |
| 59 | cli.log.error('Error formatting C code!') | 59 | cli.log.error('Error formatting C code!') |
| 60 | cli.log.debug('%s exited with returncode %s', e.cmd, e.returncode) | 60 | cli.log.debug('%s exited with returncode %s', e.cmd, e.returncode) |
| 61 | cli.log.debug('STDOUT:') | 61 | cli.log.debug('STDOUT:') |
| @@ -111,7 +111,7 @@ def cformat(cli): | |||
| 111 | 111 | ||
| 112 | else: | 112 | else: |
| 113 | git_diff_cmd = ['git', 'diff', '--name-only', cli.args.base_branch, *core_dirs] | 113 | git_diff_cmd = ['git', 'diff', '--name-only', cli.args.base_branch, *core_dirs] |
| 114 | git_diff = cli.run(git_diff_cmd) | 114 | git_diff = cli.run(git_diff_cmd, stdin=DEVNULL) |
| 115 | 115 | ||
| 116 | if git_diff.returncode != 0: | 116 | if git_diff.returncode != 0: |
| 117 | cli.log.error("Error running %s", git_diff_cmd) | 117 | cli.log.error("Error running %s", git_diff_cmd) |
diff --git a/lib/python/qmk/cli/clean.py b/lib/python/qmk/cli/clean.py index 9096529fd..72b7ffe81 100644 --- a/lib/python/qmk/cli/clean.py +++ b/lib/python/qmk/cli/clean.py | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | """Clean the QMK firmware folder of build artifacts. | 1 | """Clean the QMK firmware folder of build artifacts. |
| 2 | """ | 2 | """ |
| 3 | from qmk.commands import run, create_make_target | 3 | from subprocess import DEVNULL |
| 4 | |||
| 5 | from qmk.commands import create_make_target | ||
| 4 | from milc import cli | 6 | from milc import cli |
| 5 | 7 | ||
| 6 | 8 | ||
| @@ -9,4 +11,4 @@ from milc import cli | |||
| 9 | def clean(cli): | 11 | def clean(cli): |
| 10 | """Runs `make clean` (or `make distclean` if --all is passed) | 12 | """Runs `make clean` (or `make distclean` if --all is passed) |
| 11 | """ | 13 | """ |
| 12 | run(create_make_target('distclean' if cli.args.all else 'clean')) | 14 | cli.run(create_make_target('distclean' if cli.args.all else 'clean'), capture_output=False, stdin=DEVNULL) |
diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py index 23ca4e00a..7a45e7721 100755 --- a/lib/python/qmk/cli/compile.py +++ b/lib/python/qmk/cli/compile.py | |||
| @@ -2,6 +2,8 @@ | |||
| 2 | 2 | ||
| 3 | You can compile a keymap already in the repo or using a QMK Configurator export. | 3 | You can compile a keymap already in the repo or using a QMK Configurator export. |
| 4 | """ | 4 | """ |
| 5 | from subprocess import DEVNULL | ||
| 6 | |||
| 5 | from argcomplete.completers import FilesCompleter | 7 | from argcomplete.completers import FilesCompleter |
| 6 | from milc import cli | 8 | from milc import cli |
| 7 | 9 | ||
| @@ -31,8 +33,7 @@ def compile(cli): | |||
| 31 | """ | 33 | """ |
| 32 | if cli.args.clean and not cli.args.filename and not cli.args.dry_run: | 34 | if cli.args.clean and not cli.args.filename and not cli.args.dry_run: |
| 33 | command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, 'clean') | 35 | command = create_make_command(cli.config.compile.keyboard, cli.config.compile.keymap, 'clean') |
| 34 | # FIXME(skullydazed/anyone): Remove text=False once milc 1.0.11 has had enough time to be installed everywhere. | 36 | cli.run(command, capture_output=False, stdin=DEVNULL) |
| 35 | cli.run(command, capture_output=False, text=False) | ||
| 36 | 37 | ||
| 37 | # Build the environment vars | 38 | # Build the environment vars |
| 38 | envs = {} | 39 | envs = {} |
diff --git a/lib/python/qmk/cli/doctor.py b/lib/python/qmk/cli/doctor.py index 4a2e2010f..9e1057062 100755 --- a/lib/python/qmk/cli/doctor.py +++ b/lib/python/qmk/cli/doctor.py | |||
| @@ -3,12 +3,12 @@ | |||
| 3 | Check out the user's QMK environment and make sure it's ready to compile. | 3 | Check out the user's QMK environment and make sure it's ready to compile. |
| 4 | """ | 4 | """ |
| 5 | import platform | 5 | import platform |
| 6 | from subprocess import DEVNULL | ||
| 6 | 7 | ||
| 7 | from milc import cli | 8 | from milc import cli |
| 8 | from milc.questions import yesno | 9 | from milc.questions import yesno |
| 9 | from qmk import submodules | 10 | from qmk import submodules |
| 10 | from qmk.constants import QMK_FIRMWARE | 11 | from qmk.constants import QMK_FIRMWARE |
| 11 | from qmk.commands import run | ||
| 12 | from qmk.os_helpers import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo | 12 | from qmk.os_helpers import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo |
| 13 | 13 | ||
| 14 | 14 | ||
| @@ -93,7 +93,7 @@ def doctor(cli): | |||
| 93 | 93 | ||
| 94 | if not bin_ok: | 94 | if not bin_ok: |
| 95 | if yesno('Would you like to install dependencies?', default=True): | 95 | if yesno('Would you like to install dependencies?', default=True): |
| 96 | run(['util/qmk_install.sh']) | 96 | cli.run(['util/qmk_install.sh', '-y'], stdin=DEVNULL, capture_output=False) |
| 97 | bin_ok = check_binaries() | 97 | bin_ok = check_binaries() |
| 98 | 98 | ||
| 99 | if bin_ok: | 99 | if bin_ok: |
diff --git a/lib/python/qmk/cli/flash.py b/lib/python/qmk/cli/flash.py index 1b6784061..1b2932a5b 100644 --- a/lib/python/qmk/cli/flash.py +++ b/lib/python/qmk/cli/flash.py | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | You can compile a keymap already in the repo or using a QMK Configurator export. | 3 | You can compile a keymap already in the repo or using a QMK Configurator export. |
| 4 | A bootloader must be specified. | 4 | A bootloader must be specified. |
| 5 | """ | 5 | """ |
| 6 | from subprocess import DEVNULL | ||
| 6 | 7 | ||
| 7 | from argcomplete.completers import FilesCompleter | 8 | from argcomplete.completers import FilesCompleter |
| 8 | from milc import cli | 9 | from milc import cli |
| @@ -55,7 +56,7 @@ def flash(cli): | |||
| 55 | """ | 56 | """ |
| 56 | if cli.args.clean and not cli.args.filename and not cli.args.dry_run: | 57 | if cli.args.clean and not cli.args.filename and not cli.args.dry_run: |
| 57 | command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean') | 58 | command = create_make_command(cli.config.flash.keyboard, cli.config.flash.keymap, 'clean') |
| 58 | cli.run(command, capture_output=False) | 59 | cli.run(command, capture_output=False, stdin=DEVNULL) |
| 59 | 60 | ||
| 60 | # Build the environment vars | 61 | # Build the environment vars |
| 61 | envs = {} | 62 | envs = {} |
| @@ -98,7 +99,7 @@ def flash(cli): | |||
| 98 | cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) | 99 | cli.log.info('Compiling keymap with {fg_cyan}%s', ' '.join(command)) |
| 99 | if not cli.args.dry_run: | 100 | if not cli.args.dry_run: |
| 100 | cli.echo('\n') | 101 | cli.echo('\n') |
| 101 | compile = cli.run(command, capture_output=False, text=True) | 102 | compile = cli.run(command, capture_output=False, stdin=DEVNULL) |
| 102 | return compile.returncode | 103 | return compile.returncode |
| 103 | 104 | ||
| 104 | else: | 105 | else: |
diff --git a/lib/python/qmk/cli/generate/docs.py b/lib/python/qmk/cli/generate/docs.py index a59a24db5..749336fea 100644 --- a/lib/python/qmk/cli/generate/docs.py +++ b/lib/python/qmk/cli/generate/docs.py | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | """Build QMK documentation locally | 1 | """Build QMK documentation locally |
| 2 | """ | 2 | """ |
| 3 | import shutil | 3 | import shutil |
| 4 | import subprocess | ||
| 5 | from pathlib import Path | 4 | from pathlib import Path |
| 5 | from subprocess import DEVNULL | ||
| 6 | 6 | ||
| 7 | from milc import cli | 7 | from milc import cli |
| 8 | 8 | ||
| @@ -24,14 +24,16 @@ def generate_docs(cli): | |||
| 24 | shutil.copytree(DOCS_PATH, BUILD_PATH) | 24 | shutil.copytree(DOCS_PATH, BUILD_PATH) |
| 25 | 25 | ||
| 26 | # When not verbose we want to hide all output | 26 | # When not verbose we want to hide all output |
| 27 | args = {'check': True} | 27 | args = { |
| 28 | if not cli.args.verbose: | 28 | 'capture_output': False if cli.config.general.verbose else True, |
| 29 | args.update({'stdout': subprocess.DEVNULL, 'stderr': subprocess.STDOUT}) | 29 | 'check': True, |
| 30 | 'stdin': DEVNULL, | ||
| 31 | } | ||
| 30 | 32 | ||
| 31 | cli.log.info('Generating internal docs...') | 33 | cli.log.info('Generating internal docs...') |
| 32 | 34 | ||
| 33 | # Generate internal docs | 35 | # Generate internal docs |
| 34 | subprocess.run(['doxygen', 'Doxyfile'], **args) | 36 | cli.run(['doxygen', 'Doxyfile'], **args) |
| 35 | subprocess.run(['moxygen', '-q', '-a', '-g', '-o', BUILD_PATH / 'internals_%s.md', 'doxygen/xml'], **args) | 37 | cli.run(['moxygen', '-q', '-a', '-g', '-o', BUILD_PATH / 'internals_%s.md', 'doxygen/xml'], **args) |
| 36 | 38 | ||
| 37 | cli.log.info('Successfully generated internal docs to %s.', BUILD_PATH) | 39 | cli.log.info('Successfully generated internal docs to %s.', BUILD_PATH) |
diff --git a/lib/python/qmk/cli/multibuild.py b/lib/python/qmk/cli/multibuild.py index a4f0a0cc0..46594c099 100755 --- a/lib/python/qmk/cli/multibuild.py +++ b/lib/python/qmk/cli/multibuild.py | |||
| @@ -4,6 +4,7 @@ This will compile everything in parallel, for testing purposes. | |||
| 4 | """ | 4 | """ |
| 5 | import re | 5 | import re |
| 6 | from pathlib import Path | 6 | from pathlib import Path |
| 7 | from subprocess import DEVNULL | ||
| 7 | 8 | ||
| 8 | from milc import cli | 9 | from milc import cli |
| 9 | 10 | ||
| @@ -35,7 +36,7 @@ def multibuild(cli): | |||
| 35 | 36 | ||
| 36 | make_cmd = _find_make() | 37 | make_cmd = _find_make() |
| 37 | if cli.args.clean: | 38 | if cli.args.clean: |
| 38 | cli.run([make_cmd, 'clean'], capture_output=False, text=False) | 39 | cli.run([make_cmd, 'clean'], capture_output=False, stdin=DEVNULL) |
| 39 | 40 | ||
| 40 | builddir = Path(QMK_FIRMWARE) / '.build' | 41 | builddir = Path(QMK_FIRMWARE) / '.build' |
| 41 | makefile = builddir / 'parallel_kb_builds.mk' | 42 | makefile = builddir / 'parallel_kb_builds.mk' |
| @@ -75,4 +76,4 @@ all: {keyboard_safe}_binary | |||
| 75 | ) | 76 | ) |
| 76 | # yapf: enable | 77 | # yapf: enable |
| 77 | 78 | ||
| 78 | cli.run([make_cmd, '-j', str(cli.args.parallel), '-f', makefile, 'all'], capture_output=False, text=False) | 79 | cli.run([make_cmd, '-j', str(cli.args.parallel), '-f', makefile, 'all'], capture_output=False, stdin=DEVNULL) |
diff --git a/lib/python/qmk/cli/new/keyboard.py b/lib/python/qmk/cli/new/keyboard.py index cab0198fb..ae4445ca4 100644 --- a/lib/python/qmk/cli/new/keyboard.py +++ b/lib/python/qmk/cli/new/keyboard.py | |||
| @@ -8,4 +8,4 @@ def new_keyboard(cli): | |||
| 8 | """Creates a new keyboard | 8 | """Creates a new keyboard |
| 9 | """ | 9 | """ |
| 10 | # TODO: replace this bodge to the existing script | 10 | # TODO: replace this bodge to the existing script |
| 11 | cli.run(['util/new_keyboard.sh'], capture_output=False) | 11 | cli.run(['util/new_keyboard.sh'], stdin=None, capture_output=False) |
diff --git a/lib/python/qmk/cli/pyformat.py b/lib/python/qmk/cli/pyformat.py index 02581f0d8..abe5f6de1 100755 --- a/lib/python/qmk/cli/pyformat.py +++ b/lib/python/qmk/cli/pyformat.py | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | """Format python code according to QMK's style. | 1 | """Format python code according to QMK's style. |
| 2 | """ | 2 | """ |
| 3 | from milc import cli | 3 | from subprocess import CalledProcessError, DEVNULL |
| 4 | 4 | ||
| 5 | import subprocess | 5 | from milc import cli |
| 6 | 6 | ||
| 7 | 7 | ||
| 8 | @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Flag only, don't automatically format.") | 8 | @cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help="Flag only, don't automatically format.") |
| @@ -13,11 +13,11 @@ def pyformat(cli): | |||
| 13 | edit = '--diff' if cli.args.dry_run else '--in-place' | 13 | edit = '--diff' if cli.args.dry_run else '--in-place' |
| 14 | yapf_cmd = ['yapf', '-vv', '--recursive', edit, 'bin/qmk', 'lib/python'] | 14 | yapf_cmd = ['yapf', '-vv', '--recursive', edit, 'bin/qmk', 'lib/python'] |
| 15 | try: | 15 | try: |
| 16 | cli.run(yapf_cmd, check=True, capture_output=False) | 16 | cli.run(yapf_cmd, check=True, capture_output=False, stdin=DEVNULL) |
| 17 | cli.log.info('Python code in `bin/qmk` and `lib/python` is correctly formatted.') | 17 | cli.log.info('Python code in `bin/qmk` and `lib/python` is correctly formatted.') |
| 18 | return True | 18 | return True |
| 19 | 19 | ||
| 20 | except subprocess.CalledProcessError: | 20 | except CalledProcessError: |
| 21 | if cli.args.dry_run: | 21 | if cli.args.dry_run: |
| 22 | cli.log.error('Python code in `bin/qmk` and `lib/python` incorrectly formatted!') | 22 | cli.log.error('Python code in `bin/qmk` and `lib/python` incorrectly formatted!') |
| 23 | else: | 23 | else: |
diff --git a/lib/python/qmk/cli/pytest.py b/lib/python/qmk/cli/pytest.py index 50a1d70a4..bdb336b9a 100644 --- a/lib/python/qmk/cli/pytest.py +++ b/lib/python/qmk/cli/pytest.py | |||
| @@ -2,7 +2,7 @@ | |||
| 2 | 2 | ||
| 3 | QMK script to run unit and integration tests against our python code. | 3 | QMK script to run unit and integration tests against our python code. |
| 4 | """ | 4 | """ |
| 5 | import subprocess | 5 | from subprocess import DEVNULL |
| 6 | 6 | ||
| 7 | from milc import cli | 7 | from milc import cli |
| 8 | 8 | ||
| @@ -11,7 +11,7 @@ from milc import cli | |||
| 11 | def pytest(cli): | 11 | def pytest(cli): |
| 12 | """Run several linting/testing commands. | 12 | """Run several linting/testing commands. |
| 13 | """ | 13 | """ |
| 14 | nose2 = subprocess.run(['nose2', '-v']) | 14 | nose2 = cli.run(['nose2', '-v'], capture_output=False, stdin=DEVNULL) |
| 15 | flake8 = subprocess.run(['flake8', 'lib/python', 'bin/qmk']) | 15 | flake8 = cli.run(['flake8', 'lib/python', 'bin/qmk'], capture_output=False, stdin=DEVNULL) |
| 16 | 16 | ||
| 17 | return flake8.returncode | nose2.returncode | 17 | return flake8.returncode | nose2.returncode |
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py index 8c3f95ea2..ee049e8af 100644 --- a/lib/python/qmk/commands.py +++ b/lib/python/qmk/commands.py | |||
| @@ -2,11 +2,9 @@ | |||
| 2 | """ | 2 | """ |
| 3 | import json | 3 | import json |
| 4 | import os | 4 | import os |
| 5 | import platform | ||
| 6 | import subprocess | ||
| 7 | import shlex | ||
| 8 | import shutil | 5 | import shutil |
| 9 | from pathlib import Path | 6 | from pathlib import Path |
| 7 | from subprocess import DEVNULL | ||
| 10 | from time import strftime | 8 | from time import strftime |
| 11 | 9 | ||
| 12 | from milc import cli | 10 | from milc import cli |
| @@ -94,7 +92,7 @@ def get_git_version(repo_dir='.', check_dir='.'): | |||
| 94 | git_describe_cmd = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags'] | 92 | git_describe_cmd = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags'] |
| 95 | 93 | ||
| 96 | if Path(check_dir).exists(): | 94 | if Path(check_dir).exists(): |
| 97 | git_describe = cli.run(git_describe_cmd, cwd=repo_dir) | 95 | git_describe = cli.run(git_describe_cmd, stdin=DEVNULL, cwd=repo_dir) |
| 98 | 96 | ||
| 99 | if git_describe.returncode == 0: | 97 | if git_describe.returncode == 0: |
| 100 | return git_describe.stdout.strip() | 98 | return git_describe.stdout.strip() |
| @@ -224,20 +222,3 @@ def parse_configurator_json(configurator_file): | |||
| 224 | user_keymap['layout'] = aliases[orig_keyboard]['layouts'][user_keymap['layout']] | 222 | user_keymap['layout'] = aliases[orig_keyboard]['layouts'][user_keymap['layout']] |
| 225 | 223 | ||
| 226 | return user_keymap | 224 | return user_keymap |
| 227 | |||
| 228 | |||
| 229 | def run(command, *args, **kwargs): | ||
| 230 | """Run a command with subprocess.run | ||
| 231 | """ | ||
| 232 | platform_id = platform.platform().lower() | ||
| 233 | |||
| 234 | if isinstance(command, str): | ||
| 235 | raise TypeError('`command` must be a non-text sequence such as list or tuple.') | ||
| 236 | |||
| 237 | if 'windows' in platform_id: | ||
| 238 | safecmd = map(str, command) | ||
| 239 | safecmd = map(shlex.quote, safecmd) | ||
| 240 | safecmd = ' '.join(safecmd) | ||
| 241 | command = [os.environ.get('SHELL', '/usr/bin/bash'), '-c', safecmd] | ||
| 242 | |||
| 243 | return subprocess.run(command, *args, **kwargs) | ||
diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py index 4ad9ffb59..ac7951082 100644 --- a/lib/python/qmk/keymap.py +++ b/lib/python/qmk/keymap.py | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | """Functions that help you work with QMK keymaps. | 1 | """Functions that help you work with QMK keymaps. |
| 2 | """ | 2 | """ |
| 3 | import json | 3 | import json |
| 4 | import subprocess | ||
| 5 | import sys | 4 | import sys |
| 6 | from pathlib import Path | 5 | from pathlib import Path |
| 6 | from subprocess import DEVNULL | ||
| 7 | 7 | ||
| 8 | import argcomplete | 8 | import argcomplete |
| 9 | from milc import cli | 9 | from milc import cli |
| @@ -12,7 +12,6 @@ from pygments.token import Token | |||
| 12 | from pygments import lex | 12 | from pygments import lex |
| 13 | 13 | ||
| 14 | import qmk.path | 14 | import qmk.path |
| 15 | import qmk.commands | ||
| 16 | from qmk.keyboard import find_keyboard_from_dir, rules_mk | 15 | from qmk.keyboard import find_keyboard_from_dir, rules_mk |
| 17 | 16 | ||
| 18 | # The `keymap.c` template to use when a keyboard doesn't have its own | 17 | # The `keymap.c` template to use when a keyboard doesn't have its own |
| @@ -361,7 +360,7 @@ def list_keymaps(keyboard, c=True, json=True, additional_files=None, fullpath=Fa | |||
| 361 | return sorted(names) | 360 | return sorted(names) |
| 362 | 361 | ||
| 363 | 362 | ||
| 364 | def _c_preprocess(path, stdin=None): | 363 | def _c_preprocess(path, stdin=DEVNULL): |
| 365 | """ Run a file through the C pre-processor | 364 | """ Run a file through the C pre-processor |
| 366 | 365 | ||
| 367 | Args: | 366 | Args: |
| @@ -371,7 +370,9 @@ def _c_preprocess(path, stdin=None): | |||
| 371 | Returns: | 370 | Returns: |
| 372 | the stdout of the pre-processor | 371 | the stdout of the pre-processor |
| 373 | """ | 372 | """ |
| 374 | pre_processed_keymap = qmk.commands.run(['cpp', path] if path else ['cpp'], stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True) | 373 | cmd = ['cpp', str(path)] if path else ['cpp'] |
| 374 | pre_processed_keymap = cli.run(cmd, stdin=stdin) | ||
| 375 | |||
| 375 | return pre_processed_keymap.stdout | 376 | return pre_processed_keymap.stdout |
| 376 | 377 | ||
| 377 | 378 | ||
diff --git a/lib/python/qmk/os_helpers/__init__.py b/lib/python/qmk/os_helpers/__init__.py index 3f64a63a3..3e98db3c3 100644 --- a/lib/python/qmk/os_helpers/__init__.py +++ b/lib/python/qmk/os_helpers/__init__.py | |||
| @@ -3,10 +3,9 @@ | |||
| 3 | from enum import Enum | 3 | from enum import Enum |
| 4 | import re | 4 | import re |
| 5 | import shutil | 5 | import shutil |
| 6 | import subprocess | 6 | from subprocess import DEVNULL |
| 7 | 7 | ||
| 8 | from milc import cli | 8 | from milc import cli |
| 9 | from qmk.commands import run | ||
| 10 | from qmk import submodules | 9 | from qmk import submodules |
| 11 | from qmk.constants import QMK_FIRMWARE | 10 | from qmk.constants import QMK_FIRMWARE |
| 12 | 11 | ||
| @@ -142,7 +141,7 @@ def is_executable(command): | |||
| 142 | 141 | ||
| 143 | # Make sure the command can be executed | 142 | # Make sure the command can be executed |
| 144 | version_arg = ESSENTIAL_BINARIES[command].get('version_arg', '--version') | 143 | version_arg = ESSENTIAL_BINARIES[command].get('version_arg', '--version') |
| 145 | check = run([command, version_arg], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=5, universal_newlines=True) | 144 | check = cli.run([command, version_arg], combined_output=True, stdin=DEVNULL, timeout=5) |
| 146 | 145 | ||
| 147 | ESSENTIAL_BINARIES[command]['output'] = check.stdout | 146 | ESSENTIAL_BINARIES[command]['output'] = check.stdout |
| 148 | 147 | ||
diff --git a/lib/python/qmk/os_helpers/linux/__init__.py b/lib/python/qmk/os_helpers/linux/__init__.py index 9e73964e4..008654ab0 100644 --- a/lib/python/qmk/os_helpers/linux/__init__.py +++ b/lib/python/qmk/os_helpers/linux/__init__.py | |||
| @@ -5,7 +5,6 @@ import shutil | |||
| 5 | 5 | ||
| 6 | from milc import cli | 6 | from milc import cli |
| 7 | from qmk.constants import QMK_FIRMWARE | 7 | from qmk.constants import QMK_FIRMWARE |
| 8 | from qmk.commands import run | ||
| 9 | from qmk.os_helpers import CheckStatus | 8 | from qmk.os_helpers import CheckStatus |
| 10 | 9 | ||
| 11 | 10 | ||
| @@ -132,7 +131,7 @@ def check_modem_manager(): | |||
| 132 | 131 | ||
| 133 | """ | 132 | """ |
| 134 | if check_systemd(): | 133 | if check_systemd(): |
| 135 | mm_check = run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10) | 134 | mm_check = cli.run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10) |
| 136 | if mm_check.returncode == 0: | 135 | if mm_check.returncode == 0: |
| 137 | return True | 136 | return True |
| 138 | else: | 137 | else: |
diff --git a/lib/python/qmk/submodules.py b/lib/python/qmk/submodules.py index be51a6804..6a272dae5 100644 --- a/lib/python/qmk/submodules.py +++ b/lib/python/qmk/submodules.py | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | """Functions for working with QMK's submodules. | 1 | """Functions for working with QMK's submodules. |
| 2 | """ | 2 | """ |
| 3 | 3 | from milc import cli | |
| 4 | import subprocess | ||
| 5 | 4 | ||
| 6 | 5 | ||
| 7 | def status(): | 6 | def status(): |
| @@ -18,7 +17,7 @@ def status(): | |||
| 18 | status is None when the submodule doesn't exist, False when it's out of date, and True when it's current | 17 | status is None when the submodule doesn't exist, False when it's out of date, and True when it's current |
| 19 | """ | 18 | """ |
| 20 | submodules = {} | 19 | submodules = {} |
| 21 | git_cmd = subprocess.run(['git', 'submodule', 'status'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=30, universal_newlines=True) | 20 | git_cmd = cli.run(['git', 'submodule', 'status'], timeout=30) |
| 22 | 21 | ||
| 23 | for line in git_cmd.stdout.split('\n'): | 22 | for line in git_cmd.stdout.split('\n'): |
| 24 | if not line: | 23 | if not line: |
| @@ -53,19 +52,19 @@ def update(submodules=None): | |||
| 53 | # Update everything | 52 | # Update everything |
| 54 | git_sync_cmd.append('--recursive') | 53 | git_sync_cmd.append('--recursive') |
| 55 | git_update_cmd.append('--recursive') | 54 | git_update_cmd.append('--recursive') |
| 56 | subprocess.run(git_sync_cmd, check=True) | 55 | cli.run(git_sync_cmd, check=True) |
| 57 | subprocess.run(git_update_cmd, check=True) | 56 | cli.run(git_update_cmd, check=True) |
| 58 | 57 | ||
| 59 | else: | 58 | else: |
| 60 | if isinstance(submodules, str): | 59 | if isinstance(submodules, str): |
| 61 | # Update only a single submodule | 60 | # Update only a single submodule |
| 62 | git_sync_cmd.append(submodules) | 61 | git_sync_cmd.append(submodules) |
| 63 | git_update_cmd.append(submodules) | 62 | git_update_cmd.append(submodules) |
| 64 | subprocess.run(git_sync_cmd, check=True) | 63 | cli.run(git_sync_cmd, check=True) |
| 65 | subprocess.run(git_update_cmd, check=True) | 64 | cli.run(git_update_cmd, check=True) |
| 66 | 65 | ||
| 67 | else: | 66 | else: |
| 68 | # Update submodules in a list | 67 | # Update submodules in a list |
| 69 | for submodule in submodules: | 68 | for submodule in submodules: |
| 70 | subprocess.run(git_sync_cmd + [submodule], check=True) | 69 | cli.run([*git_sync_cmd, submodule], check=True) |
| 71 | subprocess.run(git_update_cmd + [submodule], check=True) | 70 | cli.run([*git_update_cmd, submodule], check=True) |
diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index 741551e5e..d13e42d40 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py | |||
| @@ -1,15 +1,14 @@ | |||
| 1 | import platform | 1 | import platform |
| 2 | from subprocess import DEVNULL | ||
| 2 | 3 | ||
| 3 | from subprocess import STDOUT, PIPE | 4 | from milc import cli |
| 4 | |||
| 5 | from qmk.commands import run | ||
| 6 | 5 | ||
| 7 | is_windows = 'windows' in platform.platform().lower() | 6 | is_windows = 'windows' in platform.platform().lower() |
| 8 | 7 | ||
| 9 | 8 | ||
| 10 | def check_subcommand(command, *args): | 9 | def check_subcommand(command, *args): |
| 11 | cmd = ['bin/qmk', command, *args] | 10 | cmd = ['bin/qmk', command, *args] |
| 12 | result = run(cmd, stdout=PIPE, stderr=STDOUT, universal_newlines=True) | 11 | result = cli.run(cmd, stdin=DEVNULL, combined_output=True) |
| 13 | return result | 12 | return result |
| 14 | 13 | ||
| 15 | 14 | ||
| @@ -18,7 +17,7 @@ def check_subcommand_stdin(file_to_read, command, *args): | |||
| 18 | """ | 17 | """ |
| 19 | with open(file_to_read, encoding='utf-8') as my_file: | 18 | with open(file_to_read, encoding='utf-8') as my_file: |
| 20 | cmd = ['bin/qmk', command, *args] | 19 | cmd = ['bin/qmk', command, *args] |
| 21 | result = run(cmd, stdin=my_file, stdout=PIPE, stderr=STDOUT, universal_newlines=True) | 20 | result = cli.run(cmd, stdin=my_file, combined_output=True) |
| 22 | return result | 21 | return result |
| 23 | 22 | ||
| 24 | 23 | ||
