mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-10-30 21:02:32 +01:00 
			
		
		
		
	Refactor doctor.py into a directory (#13298)
This commit is contained in:
		
							parent
							
								
									d61e5c0027
								
							
						
					
					
						commit
						e87d231645
					
				
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Zach White
						Zach White