refactor doctor.py into a directory
This commit is contained in:
parent
286acfe7fd
commit
e293bf243d
6 changed files with 70 additions and 49 deletions
5
lib/python/qmk/cli/doctor/__init__.py
Executable file
5
lib/python/qmk/cli/doctor/__init__.py
Executable 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
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
13
lib/python/qmk/cli/doctor/macos.py
Normal file
13
lib/python/qmk/cli/doctor/macos.py
Normal 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
|
|
@ -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')
|
14
lib/python/qmk/cli/doctor/windows.py
Normal file
14
lib/python/qmk/cli/doctor/windows.py
Normal 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
|
Loading…
Reference in a new issue