refactor doctor.py into a directory

This commit is contained in:
Zach White 2021-06-21 22:22:35 -07:00
parent 286acfe7fd
commit e293bf243d
6 changed files with 70 additions and 49 deletions

View file

@ -0,0 +1,5 @@
"""QMK Doctor
Check out the user's QMK environment and make sure it's ready to compile.
"""
from .main import doctor

View file

@ -1,4 +1,4 @@
"""OS-agnostic helper functions """Check for specific programs.
""" """
from enum import Enum from enum import Enum
import re import re
@ -30,7 +30,7 @@ ESSENTIAL_BINARIES = {
} }
def parse_gcc_version(version): def _parse_gcc_version(version):
m = re.match(r"(\d+)(?:\.(\d+))?(?:\.(\d+))?", version) m = re.match(r"(\d+)(?:\.(\d+))?(?:\.(\d+))?", version)
return { return {
@ -40,7 +40,7 @@ def parse_gcc_version(version):
} }
def check_arm_gcc_version(): def _check_arm_gcc_version():
"""Returns True if the arm-none-eabi-gcc version is not known to cause problems. """Returns True if the arm-none-eabi-gcc version is not known to cause problems.
""" """
if 'output' in ESSENTIAL_BINARIES['arm-none-eabi-gcc']: if 'output' in ESSENTIAL_BINARIES['arm-none-eabi-gcc']:
@ -50,7 +50,7 @@ def check_arm_gcc_version():
return CheckStatus.OK # Right now all known arm versions are ok return CheckStatus.OK # Right now all known arm versions are ok
def check_avr_gcc_version(): def _check_avr_gcc_version():
"""Returns True if the avr-gcc version is not known to cause problems. """Returns True if the avr-gcc version is not known to cause problems.
""" """
rc = CheckStatus.ERROR rc = CheckStatus.ERROR
@ -60,7 +60,7 @@ def check_avr_gcc_version():
cli.log.info('Found avr-gcc version %s', version_number) cli.log.info('Found avr-gcc version %s', version_number)
rc = CheckStatus.OK rc = CheckStatus.OK
parsed_version = parse_gcc_version(version_number) parsed_version = _parse_gcc_version(version_number)
if parsed_version['major'] > 8: if parsed_version['major'] > 8:
cli.log.warning('{fg_yellow}We do not recommend avr-gcc newer than 8. Downgrading to 8.x is recommended.') cli.log.warning('{fg_yellow}We do not recommend avr-gcc newer than 8. Downgrading to 8.x is recommended.')
rc = CheckStatus.WARNING rc = CheckStatus.WARNING
@ -68,7 +68,7 @@ def check_avr_gcc_version():
return rc return rc
def check_avrdude_version(): def _check_avrdude_version():
if 'output' in ESSENTIAL_BINARIES['avrdude']: if 'output' in ESSENTIAL_BINARIES['avrdude']:
last_line = ESSENTIAL_BINARIES['avrdude']['output'].split('\n')[-2] last_line = ESSENTIAL_BINARIES['avrdude']['output'].split('\n')[-2]
version_number = last_line.split()[2][:-1] version_number = last_line.split()[2][:-1]
@ -77,7 +77,7 @@ def check_avrdude_version():
return CheckStatus.OK return CheckStatus.OK
def check_dfu_util_version(): def _check_dfu_util_version():
if 'output' in ESSENTIAL_BINARIES['dfu-util']: if 'output' in ESSENTIAL_BINARIES['dfu-util']:
first_line = ESSENTIAL_BINARIES['dfu-util']['output'].split('\n')[0] first_line = ESSENTIAL_BINARIES['dfu-util']['output'].split('\n')[0]
version_number = first_line.split()[1] version_number = first_line.split()[1]
@ -86,7 +86,7 @@ def check_dfu_util_version():
return CheckStatus.OK return CheckStatus.OK
def check_dfu_programmer_version(): def _check_dfu_programmer_version():
if 'output' in ESSENTIAL_BINARIES['dfu-programmer']: if 'output' in ESSENTIAL_BINARIES['dfu-programmer']:
first_line = ESSENTIAL_BINARIES['dfu-programmer']['output'].split('\n')[0] first_line = ESSENTIAL_BINARIES['dfu-programmer']['output'].split('\n')[0]
version_number = first_line.split()[1] version_number = first_line.split()[1]
@ -111,7 +111,7 @@ def check_binary_versions():
"""Check the versions of ESSENTIAL_BINARIES """Check the versions of ESSENTIAL_BINARIES
""" """
versions = [] versions = []
for check in (check_arm_gcc_version, check_avr_gcc_version, check_avrdude_version, check_dfu_util_version, check_dfu_programmer_version): for check in (_check_arm_gcc_version, _check_avr_gcc_version, _check_avrdude_version, _check_dfu_util_version, _check_dfu_programmer_version):
versions.append(check()) versions.append(check())
return versions return versions

View file

@ -1,11 +1,13 @@
"""OS-specific functions for: Linux """OS-specific functions for: Linux
""" """
from pathlib import Path import platform
import shutil import shutil
from pathlib import Path
from milc import cli from milc import cli
from qmk.constants import QMK_FIRMWARE from qmk.constants import QMK_FIRMWARE
from qmk.os_helpers import CheckStatus from .check import CheckStatus
def _udev_rule(vid, pid=None, *args): def _udev_rule(vid, pid=None, *args):
@ -138,3 +140,23 @@ def check_modem_manager():
"""(TODO): Add check for non-systemd systems """(TODO): Add check for non-systemd systems
""" """
return False return False
def os_test_linux():
"""Run the Linux specific tests.
"""
# Don't bother with udev on WSL, for now
if 'microsoft' in platform.uname().release.lower():
cli.log.info("Detected {fg_cyan}Linux (WSL){fg_reset}.")
# https://github.com/microsoft/WSL/issues/4197
if QMK_FIRMWARE.as_posix().startswith("/mnt"):
cli.log.warning("I/O performance on /mnt may be extremely slow.")
return CheckStatus.WARNING
return CheckStatus.OK
else:
cli.log.info("Detected {fg_cyan}Linux{fg_reset}.")
from .linux import check_udev_rules
return check_udev_rules()

View file

@ -0,0 +1,13 @@
import platform
from milc import cli
from .check import CheckStatus
def os_test_macos():
"""Run the Mac specific tests.
"""
cli.log.info("Detected {fg_cyan}macOS %s{fg_reset}.", platform.mac_ver()[0])
return CheckStatus.OK

View file

@ -7,9 +7,10 @@ from subprocess import DEVNULL
from milc import cli from milc import cli
from milc.questions import yesno from milc.questions import yesno
from qmk import submodules from qmk import submodules
from qmk.constants import QMK_FIRMWARE from qmk.constants import QMK_FIRMWARE
from qmk.os_helpers import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo from .check import CheckStatus, check_binaries, check_binary_versions, check_submodules, check_git_repo
def os_tests(): def os_tests():
@ -18,53 +19,19 @@ def os_tests():
platform_id = platform.platform().lower() platform_id = platform.platform().lower()
if 'darwin' in platform_id or 'macos' in platform_id: if 'darwin' in platform_id or 'macos' in platform_id:
from .macos import os_test_macos
return os_test_macos() return os_test_macos()
elif 'linux' in platform_id: elif 'linux' in platform_id:
from .linux import os_test_linux
return os_test_linux() return os_test_linux()
elif 'windows' in platform_id: elif 'windows' in platform_id:
from .windows import os_test_windows
return os_test_windows() return os_test_windows()
else: else:
cli.log.warning('Unsupported OS detected: %s', platform_id) cli.log.warning('Unsupported OS detected: %s', platform_id)
return CheckStatus.WARNING return CheckStatus.WARNING
def os_test_linux():
"""Run the Linux specific tests.
"""
# Don't bother with udev on WSL, for now
if 'microsoft' in platform.uname().release.lower():
cli.log.info("Detected {fg_cyan}Linux (WSL){fg_reset}.")
# https://github.com/microsoft/WSL/issues/4197
if QMK_FIRMWARE.as_posix().startswith("/mnt"):
cli.log.warning("I/O performance on /mnt may be extremely slow.")
return CheckStatus.WARNING
return CheckStatus.OK
else:
cli.log.info("Detected {fg_cyan}Linux{fg_reset}.")
from qmk.os_helpers.linux import check_udev_rules
return check_udev_rules()
def os_test_macos():
"""Run the Mac specific tests.
"""
cli.log.info("Detected {fg_cyan}macOS %s{fg_reset}.", platform.mac_ver()[0])
return CheckStatus.OK
def os_test_windows():
"""Run the Windows specific tests.
"""
win32_ver = platform.win32_ver()
cli.log.info("Detected {fg_cyan}Windows %s (%s){fg_reset}.", win32_ver[0], win32_ver[1])
return CheckStatus.OK
@cli.argument('-y', '--yes', action='store_true', arg_only=True, help='Answer yes to all questions.') @cli.argument('-y', '--yes', action='store_true', arg_only=True, help='Answer yes to all questions.')
@cli.argument('-n', '--no', action='store_true', arg_only=True, help='Answer no to all questions.') @cli.argument('-n', '--no', action='store_true', arg_only=True, help='Answer no to all questions.')
@cli.subcommand('Basic QMK environment checks') @cli.subcommand('Basic QMK environment checks')

View file

@ -0,0 +1,14 @@
import platform
from milc import cli
from .check import CheckStatus
def os_test_windows():
"""Run the Windows specific tests.
"""
win32_ver = platform.win32_ver()
cli.log.info("Detected {fg_cyan}Windows %s (%s){fg_reset}.", win32_ver[0], win32_ver[1])
return CheckStatus.OK