~ruther/qmk_firmware

c89c0841468ad23153a9fc9578d344845df31a88 — Erovia 5 years ago 13fff52
CLI: More MSYS2 fixes (#8577)

* CLI: More MSYS2 fixes

Now I can fully setup and work with qmk_firmware on an MSYS2
installation without any errors or exceptions.

* Apply suggestions from code review

Co-Authored-By: skullydazed <skullydazed@users.noreply.github.com>

* Some improvements

* Remove unnecessary import

* Remove slow, unused code

Getting the version from GIT was slow on both Windows and Docker.
Until we find a better, faster way, this is removed.

* remove unused imports

* Implement @vomindoraan's suggestions

* refine how we pick the shell to use

* Apply @fauxpark's suggestions

fauxpark investigated the topic of shells in MSYS2 a bit and we come to the conclusion that the safest bet was to just use the user's shell.
Anything more just opens up more edge-cases than it solves.

Co-Authored-By: Ryan <fauxpark@gmail.com>

* Use `platform_id` in doctor

This will bring it in line with the new code.

Co-authored-by: skullydazed <skullydazed@users.noreply.github.com>
Co-authored-by: skullY <skullydazed@gmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
M bin/qmk => bin/qmk +0 -12
@@ 2,10 2,8 @@
"""CLI wrapper for running QMK commands.
"""
import os
import subprocess
import sys
from importlib.util import find_spec
from time import strftime

# Add the QMK python libs to our path
script_dir = os.path.dirname(os.path.realpath(__file__))


@@ 35,16 33,6 @@ with open(os.path.join(qmk_dir, 'requirements.txt'), 'r') as fd:
            print('Please run `pip3 install -r requirements.txt` to install the python dependencies.')
            exit(255)

# Figure out our version
# TODO(skullydazed/anyone): Find a method that doesn't involve git. This is slow in docker and on windows.
command = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags']
result = subprocess.run(command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

if result.returncode == 0:
    os.environ['QMK_VERSION'] = result.stdout.strip()
else:
    os.environ['QMK_VERSION'] = 'nogit-' + strftime('%Y-%m-%d-%H:%M:%S') + '-dirty'

# Setup the CLI
import milc  # noqa


M lib/python/qmk/cli/doctor.py => lib/python/qmk/cli/doctor.py +9 -8
@@ 10,6 10,7 @@ from pathlib import Path
from milc import cli
from qmk import submodules
from qmk.questions import yesno
from qmk.commands import run

ESSENTIAL_BINARIES = {
    'dfu-programmer': {},


@@ 135,7 136,7 @@ def check_modem_manager():
    """Returns True if ModemManager is running.
    """
    if shutil.which("systemctl"):
        mm_check = subprocess.run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10)
        mm_check = run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10)
        if mm_check.returncode == 0:
            return True



@@ 153,7 154,7 @@ def is_executable(command):
        return False

    # Make sure the command can be executed
    check = subprocess.run([command, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5, universal_newlines=True)
    check = run([command, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5, universal_newlines=True)
    ESSENTIAL_BINARIES[command]['output'] = check.stdout

    if check.returncode in [0, 1]:  # Older versions of dfu-programmer exit 1


@@ 207,19 208,19 @@ def doctor(cli):
    ok = True

    # Determine our OS and run platform specific tests
    OS = platform.platform().lower()  # noqa (N806), uppercase name is ok in this instance
    platform_id = platform.platform().lower()

    if 'darwin' in OS or 'macos' in OS:
    if 'darwin' in platform_id or 'macos' in platform_id:
        if not os_test_macos():
            ok = False
    elif 'linux' in OS:
    elif 'linux' in platform_id:
        if not os_test_linux():
            ok = False
    elif 'windows' in OS:
    elif 'windows' in platform_id:
        if not os_test_windows():
            ok = False
    else:
        cli.log.error('Unsupported OS detected: %s', OS)
        cli.log.error('Unsupported OS detected: %s', platform_id)
        ok = False

    # Make sure the basic CLI tools we need are available and can be executed.


@@ 227,7 228,7 @@ def doctor(cli):

    if not bin_ok:
        if yesno('Would you like to install dependencies?', default=True):
            subprocess.run(['util/qmk_install.sh'])
            run(['util/qmk_install.sh'])
            bin_ok = check_binaries()

    if bin_ok:

M lib/python/qmk/commands.py => lib/python/qmk/commands.py +20 -0
@@ 1,6 1,10 @@
"""Helper functions for commands.
"""
import json
import os
import platform
import subprocess
import shlex

import qmk.keymap



@@ 61,3 65,19 @@ def parse_configurator_json(configurator_file):
    user_keymap = json.load(configurator_file)

    return user_keymap


def run(command, *args, **kwargs):
    """Run a command with subprocess.run
    """
    platform_id = platform.platform().lower()

    if isinstance(command, str):
        raise TypeError('`command` must be a non-text sequence such as list or tuple.')

    if 'windows' in platform_id:
        safecmd = map(shlex.quote, command)
        safecmd = ' '.join(safecmd)
        command = [os.environ['SHELL'], '-c', safecmd]

    return subprocess.run(command, *args, **kwargs)

M lib/python/qmk/tests/test_cli_commands.py => lib/python/qmk/tests/test_cli_commands.py +2 -1
@@ 1,9 1,10 @@
import subprocess
from qmk.commands import run


def check_subcommand(command, *args):
    cmd = ['bin/qmk', command] + list(args)
    return subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    return run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)


def test_cformat():