diff --git a/qmk_cli/helpers.py b/qmk_cli/helpers.py index d3c9265..14a2278 100644 --- a/qmk_cli/helpers.py +++ b/qmk_cli/helpers.py @@ -2,6 +2,7 @@ """ import os import json +from platformdirs import user_data_dir from functools import lru_cache from pathlib import Path @@ -44,6 +45,10 @@ def find_qmk_firmware(): return path.resolve() return path + hidden_home = Path(user_data_dir('qmk_cli', 'QMK')) / 'qmk_firmware' + if hidden_home.exists(): + return hidden_home + return Path.home() / 'qmk_firmware' diff --git a/qmk_cli/subcommands/__init__.py b/qmk_cli/subcommands/__init__.py index 9ba4579..356b411 100644 --- a/qmk_cli/subcommands/__init__.py +++ b/qmk_cli/subcommands/__init__.py @@ -6,3 +6,4 @@ from . import console # noqa from . import env # noqa from . import setup # noqa +from . import userspace # noqa diff --git a/qmk_cli/subcommands/userspace.py b/qmk_cli/subcommands/userspace.py new file mode 100644 index 0000000..c1f7250 --- /dev/null +++ b/qmk_cli/subcommands/userspace.py @@ -0,0 +1,69 @@ +"""Setup qmk_userspace on your computer. +""" +import os +import sys +from pathlib import Path + +from milc import cli + +from milc.questions import yesno +from qmk_cli.git import git_clone +from qmk_cli.helpers import find_qmk_firmware, is_qmk_firmware, is_qmk_userspace + +default_base = 'https://github.com' +default_fork = 'qmk/qmk_userspace' +default_branch = 'main' + + +@cli.argument('-n', '--no', arg_only=True, action='store_true', help='Answer no to all questions') +@cli.argument('-y', '--yes', arg_only=True, action='store_true', help='Answer yes to all questions') +@cli.argument('--baseurl', arg_only=True, default=default_base, help='The URL all git operations start from. Default: %s' % default_base) +@cli.argument('-b', '--branch', arg_only=True, default=default_branch, help='The branch to clone. Default: %s' % default_branch) +@cli.argument('-H', '--home', arg_only=True, default=Path(os.environ['QMK_USERSPACE']), type=Path, help='The location for qmk_userspace. Default: %s' % os.environ['QMK_HOME']) +@cli.argument('fork', arg_only=True, default=default_fork, nargs='?', help='The qmk_userspace fork to clone. Default: %s' % default_fork) +@cli.subcommand('Setup your computer for qmk_userspace.') +def userspace_setup(cli): + """Guide the user through setting up their QMK environment. + """ + # Sanity checks + if cli.args.yes and cli.args.no: + cli.log.error("Can't use both --yes and --no at the same time.") + exit(1) + + if is_qmk_userspace(cli.args.home): + cli.log.info(f'Found qmk_userspace at {cli.args.home}.') + else: + cli.log.error('Could not find qmk_userspace!') + if yesno('Would you like to clone qmk_userspace?'): + git_url = f'{cli.args.baseurl}/{cli.args.fork}' + if not git_clone(git_url, cli.args.home, cli.args.branch): + exit(1) + else: + cli.log.warning('Not cloning qmk_userspace due to user input or --no flag.') + + qmk_firmware = find_qmk_firmware() + if is_qmk_firmware(qmk_firmware): + cli.log.info(f'Found qmk_firmware at {qmk_firmware}.') + else: + cli.log.error('Could not find qmk_firmware!') + if yesno('Would you like to clone qmk_firmware?'): + git_url = f'{cli.args.baseurl}/qmk/qmk_firmware' + hidden_home = Path.home() / '.qmk_firmware' + if not git_clone(git_url, hidden_home, 'master'): + exit(1) + else: + cli.log.warning('Not cloning qmk_firmware due to user input or --no flag.') + + # Run `qmk doctor` to check the rest of the environment out + if cli.args.home.exists(): + color = '--color' if cli.config.general.color else '--no-color' + unicode = '--unicode' if cli.config.general.unicode else '--no-unicode' + doctor_command = [Path(sys.argv[0]).as_posix(), color, unicode, 'doctor'] + + if cli.args.no: + doctor_command.append('-n') + + if cli.args.yes: + doctor_command.append('-y') + + cli.run(doctor_command, stdin=None, capture_output=False, cwd=cli.args.home)