Compare commits

..

1 Commits

Author SHA1 Message Date
Nick Brassel 44eb158748 Mucking about with forcing the use of a venv at runtime. 2024-06-17 16:47:08 +10:00
19 changed files with 174 additions and 280 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 1.2.0
current_version = 1.1.5
commit = True
tag = True
tag_name = {new_version}
+9 -10
View File
@@ -15,7 +15,7 @@ jobs:
QMK_HOME: ~/qmk_firmware
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- name: Install dependencies
run: apt-get update && apt-get install -y python3-venv
@@ -32,13 +32,13 @@ jobs:
strategy:
matrix:
os: [macos-latest, ubuntu-latest]
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
@@ -53,25 +53,24 @@ jobs:
QMK_HOME: $HOME/qmk_firmware
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- name: (MSYS2) Setup and install dependencies
uses: msys2/setup-msys2@v2
with:
update: true
install: git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python-pip mingw-w64-x86_64-python-build mingw-w64-x86_64-python-pillow mingw-w64-x86_64-rust
install: git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python-pip mingw-w64-x86_64-python-pillow mingw-w64-x86_64-rust
# Upgrade pip due to msys packaging + pypa/build/pull/736 issues
- name: (MSYS2) Install Python dependencies
shell: msys2 {0}
run: |
python3 -m pip install --break-system-packages --force-reinstall --upgrade pip
python3 -m pip install -U setuptools wheel
- name: (MSYS2) Install QMK CLI from source
shell: msys2 {0}
run: |
python3 -m pip install -U build
python3 -m build
python3 -m pip install --break-system-packages dist/qmk-*.tar.gz
python3 -m pip install dist/qmk-*.tar.gz
- name: (MSYS2) Run qmk setup -y
shell: msys2 {0}
run: qmk setup -y
+4 -4
View File
@@ -39,11 +39,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v4
uses: github/codeql-action/autobuild@v2
# ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@@ -68,4 +68,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
uses: github/codeql-action/analyze@v2
-42
View File
@@ -1,42 +0,0 @@
name: Test Docker Image
on:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: '3.9'
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- uses: actions/checkout@v6
- name: Run ci_tests
run: ./ci_tests
- name: Install dependencies
run: |
python3 -m pip install --upgrade pip
pip install setuptools wheel
pip install -r requirements-dev.txt
- name: Build Python
run: |
python3 -m build
- name: Build Container
uses: docker/build-push-action@v6.18.0
with:
context: .
platforms: linux/amd64,linux/arm64
+4 -8
View File
@@ -10,9 +10,9 @@ jobs:
steps:
- name: Set up Python
uses: actions/setup-python@v6
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.7'
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
@@ -20,7 +20,7 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- uses: actions/checkout@v6
- uses: actions/checkout@v4
with:
fetch-depth: 0
@@ -46,7 +46,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Build and Push to Docker Hub
uses: docker/build-push-action@v6.18.0
uses: docker/build-push-action@v5.1.0
with:
context: .
push: true
@@ -54,7 +54,3 @@ jobs:
tags: |
ghcr.io/qmk/qmk_cli:latest
qmkfm/qmk_cli:latest
ghcr.io/qmk/qmk_cli:${{ github.sha }}
qmkfm/qmk_cli:${{ github.sha }}
ghcr.io/qmk/qmk_cli:${{ steps.previoustag.outputs.tag }}
qmkfm/qmk_cli:${{ steps.previoustag.outputs.tag }}
+4 -9
View File
@@ -18,9 +18,9 @@ jobs:
steps:
- name: Set up Python
uses: actions/setup-python@v6
uses: actions/setup-python@v5
with:
python-version: '3.9'
python-version: '3.7'
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
@@ -28,7 +28,7 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- uses: actions/checkout@v6
- uses: actions/checkout@v4
- name: Run ci_tests
run: ./ci_tests
@@ -43,7 +43,6 @@ jobs:
run: |
git config --local user.email "hello@qmk.fm"
git config --local user.name "QMK Bot"
bumpversion --dry-run --list ${{ github.event.inputs.version_part }} | grep new_version= | sed "s/new_version/NEW_CLI_VERSION/" >> "$GITHUB_ENV"
bumpversion ${{ github.event.inputs.version_part }}
- name: Push changes
@@ -75,7 +74,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
- name: Build and Push to Docker Hub
uses: docker/build-push-action@v6.18.0
uses: docker/build-push-action@v5.1.0
with:
context: .
push: true
@@ -83,10 +82,6 @@ jobs:
tags: |
ghcr.io/qmk/qmk_cli:latest
qmkfm/qmk_cli:latest
ghcr.io/qmk/qmk_cli:${{ github.sha }}
qmkfm/qmk_cli:${{ github.sha }}
ghcr.io/qmk/qmk_cli:${{ env.NEW_CLI_VERSION }}
qmkfm/qmk_cli:${{ env.NEW_CLI_VERSION }}
- name: Trigger OS package builds
run: ./trigger_packages
+5 -27
View File
@@ -1,35 +1,13 @@
FROM ghcr.io/qmk/qmk_base_container:latest as builder
FROM ghcr.io/qmk/qmk_base_container:latest
# Copy package in
ADD dist /tmp/dist
# Install QMK CLI via bootstrap script
RUN mkdir -p /opt/uv/bin \
&& export UV_PYTHON_INSTALL_DIR=/opt/uv/bin \
&& /bin/bash -c "curl -fsSL https://install.qmk.fm | sh -s -- --confirm --uv-install-dir=/usr/local/bin --uv-tool-dir=/opt/uv/tools --qmk-distrib-dir=/opt/qmk"
# Do the equivalent of entering the virtual environment
ENV PATH=/opt/qmk/bin:/opt/uv/tools/qmk/bin:/usr/local/bin:$PATH \
VIRTUAL_ENV=/opt/uv/tools/qmk
# Install python packages
RUN python3 -m pip uninstall -y qmk || true
RUN python3 -m pip install --upgrade pip setuptools wheel nose2 && \
python3 -m pip install /tmp/dist/qmk-*.whl
# Allow the uv-installed python to be usable by others
RUN chmod -R go=u,go-w /opt/uv /opt/qmk
# 2nd stage so we don't have /tmp/dist in the final image
FROM ghcr.io/qmk/qmk_base_container:latest
COPY --from=builder /opt/uv /opt/uv
COPY --from=builder /opt/qmk /opt/qmk
# Do the equivalent of entering the virtual environment
ENV PATH=/opt/qmk/bin:/opt/uv/tools/qmk/bin:$PATH \
VIRTUAL_ENV=/opt/uv/tools/qmk \
QMK_DISTRIB_DIR=/opt/qmk \
QMK_HOME=/qmk_firmware \
QMK_USERSPACE=/qmk_userspace
python3 -m pip install /tmp/dist/qmk-*.whl && \
rm -rf /tmp/dist
# Set the default location for qmk_firmware
ENV QMK_HOME /qmk_firmware
+1 -1
View File
@@ -1,5 +1,5 @@
# QMK CLI
[![CLI Setup](https://github.com/qmk/qmk_cli/actions/workflows/cli_setup.yml/badge.svg)](https://github.com/qmk/qmk_cli/actions/workflows/cli_setup.yml)
[![CLI Setup](https://github.com/qmk/qmk_cli/workflows/CLI%20Setup/badge.svg)](https://github.com/qmk/qmk_cli/actions?query=workflow%3A%22CLI+Setup%22)
A program to help users work with [QMK Firmware](https://qmk.fm/).
+1 -1
View File
@@ -1,3 +1,3 @@
"""A program to help you work with qmk_firmware."""
__version__ = '1.2.0'
__version__ = '1.1.5'
+2 -59
View File
@@ -1,23 +1,13 @@
"""Useful helper functions.
"""
import os
import json
from functools import lru_cache
from importlib.util import find_spec
from pathlib import Path
from milc import cli
def AbsPath(arg):
"""Resolve relative paths to the original working directory.
"""
arg = Path(arg)
if not arg.is_absolute():
return (Path(os.environ['ORIG_CWD']) / arg).absolute()
return arg
def is_qmk_firmware(qmk_firmware):
"""Returns True if the given Path() is a qmk_firmware clone.
"""
@@ -36,7 +26,7 @@ def is_qmk_firmware(qmk_firmware):
return True
@lru_cache(maxsize=1)
@lru_cache(maxsize=2)
def find_qmk_firmware():
"""Look for qmk_firmware in the usual places.
@@ -57,7 +47,6 @@ def find_qmk_firmware():
return Path.home() / 'qmk_firmware'
@lru_cache(maxsize=1)
def in_qmk_firmware():
"""Returns the path to the qmk_firmware we are currently in, or None if we are not inside qmk_firmware.
"""
@@ -69,49 +58,3 @@ def in_qmk_firmware():
# Move up a directory before the next iteration
cur_dir = cur_dir / '..'
cur_dir = cur_dir.resolve()
def is_qmk_userspace(qmk_userspace):
"""Returns True if the given Path() is a qmk_userspace clone.
"""
path = qmk_userspace / 'qmk.json'
if not path.exists():
return False
try:
return 'userspace_version' in json.loads(path.read_text(encoding="UTF-8"))
except json.decoder.JSONDecodeError as e:
return False
@lru_cache(maxsize=1)
def find_qmk_userspace():
"""Look for qmk_userspace in the usual places.
"""
if in_qmk_userspace():
return in_qmk_userspace()
if 'QMK_USERSPACE' in os.environ:
path = Path(os.environ['QMK_USERSPACE']).expanduser()
if path.exists():
return path.resolve()
return path
if cli.config.user.overlay_dir:
return Path(cli.config.user.overlay_dir).expanduser().resolve()
return Path.home() / 'qmk_userspace'
@lru_cache(maxsize=1)
def in_qmk_userspace():
"""Returns the path to the qmk_userspace we are currently in, or None if we are not inside qmk_userspace.
"""
cur_dir = Path.cwd()
while len(cur_dir.parents) > 0:
if is_qmk_userspace(cur_dir):
return cur_dir
# Move up a directory before the next iteration
cur_dir = cur_dir / '..'
cur_dir = cur_dir.resolve()
+10 -48
View File
@@ -4,46 +4,25 @@
This program can be run from anywhere, with or without a qmk_firmware repository. If a qmk_firmware repository can be located we will use that to augment our available subcommands.
"""
import os
from pathlib import Path
import shlex
import subprocess
import sys
from platform import platform
from traceback import print_exc
from . import switch_to_venv # noqa, intentionally unused
import milc
import platformdirs
from . import __version__
from .helpers import find_qmk_firmware, is_qmk_firmware, find_qmk_userspace, is_qmk_userspace
from .helpers import find_qmk_firmware, is_qmk_firmware
def _get_default_distrib_path():
if 'windows' in platform().lower():
try:
result = milc.cli.run(['cygpath', '-w', '/opt/qmk'])
if result.returncode == 0:
return result.stdout.strip()
except Exception:
pass
return platformdirs.user_data_dir('qmk')
# Ensure the QMK distribution is on the `$PATH` if present. This must be kept in sync with qmk/qmk_firmware.
QMK_DISTRIB_DIR = Path(os.environ.get('QMK_DISTRIB_DIR', _get_default_distrib_path()))
if QMK_DISTRIB_DIR.exists():
os.environ['PATH'] = str(QMK_DISTRIB_DIR / 'bin') + os.pathsep + os.environ['PATH']
# Prepend any user-defined path prefix
if 'QMK_PATH_PREFIX' in os.environ:
os.environ['PATH'] = os.environ['QMK_PATH_PREFIX'] + os.pathsep + os.environ['PATH']
milc.cli.milc_options(version=__version__)
milc.set_metadata(version=__version__)
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
# These must happen after the milc.milc_options() call
import milc.subcommand.config # noqa, must come after milc.milc_options()
# These must happen after the milc.set_metadata() call
import milc.subcommand.config # noqa, must come after milc.set_metadata()
from milc.questions import yesno
@milc.cli.entrypoint('CLI wrapper for running QMK commands.')
@@ -69,38 +48,21 @@ def main():
"""Setup the environment before dispatching to the entrypoint.
"""
# Warn if they use an outdated python version
if sys.version_info < (3, 9):
if sys.version_info < (3, 7):
print('Warning: Your Python version is out of date! Some subcommands may not work!')
print('Please upgrade to Python 3.9 or later.')
print('Please upgrade to Python 3.7 or later.')
if 'windows' in platform().lower():
msystem = os.environ.get('MSYSTEM', '')
# Assume the environment isn't workable by default
env_ok = False
# Check if we're using the mingw64/msys2 environment
if 'mingw64' in sys.executable and 'MINGW64' in msystem:
env_ok = True
# Check if we're using a `uv`-based environment
if '\\uv\\' in sys.executable or '/uv/' in sys.executable:
env_ok = True
# If none of the options above were true, then we're in an unsupported environment. Bomb out.
if not env_ok:
if 'mingw64' not in sys.executable or 'MINGW64' not in msystem:
print('ERROR: It seems you are not using the MINGW64 terminal.')
print('Please close this terminal and open a new MSYS2 MinGW 64-bit terminal.')
print('Python: %s, MSYSTEM: %s' % (sys.executable, msystem))
exit(1)
# Environment setup
qmk_userspace = find_qmk_userspace()
qmk_firmware = find_qmk_firmware()
if is_qmk_userspace(qmk_userspace):
os.environ['QMK_USERSPACE'] = str(qmk_userspace)
elif 'QMK_USERSPACE' in os.environ: # Failed to find valid userspace, including what was in the environment if specified -- wipe any environment variable if present as it's clearly invalid.
os.environ.pop('QMK_USERSPACE')
os.environ['QMK_HOME'] = str(qmk_firmware)
os.environ['ORIG_CWD'] = os.getcwd()
+1
View File
@@ -6,3 +6,4 @@ from . import clone # noqa
from . import console # noqa
from . import env # noqa
from . import setup # noqa
from . import pip # noqa
+6 -3
View File
@@ -5,7 +5,6 @@ from pathlib import Path
from milc import cli
from qmk_cli.git import git_clone
from qmk_cli.helpers import AbsPath
default_repo = 'qmk_firmware'
default_fork = 'qmk/' + default_repo
@@ -14,14 +13,18 @@ default_branch = 'master'
@cli.argument('--baseurl', arg_only=True, default='https://github.com', help='The URL all git operations start from (Default: https://github.com)')
@cli.argument('-b', '--branch', arg_only=True, default=default_branch, help='The branch to clone. Default: %s' % default_branch)
@cli.argument('destination', arg_only=True, default=Path(os.environ['ORIG_CWD']) / default_repo, type=AbsPath, nargs='?', help='The directory to clone to. Default: (current directory)')
@cli.argument('destination', arg_only=True, default=None, nargs='?', help='The directory to clone to. Default: (current directory)')
@cli.argument('fork', arg_only=True, default=default_fork, nargs='?', help='The qmk_firmware fork to clone. Default: %s' % default_fork)
@cli.subcommand('Clone a qmk_firmware fork.')
def clone(cli):
if not cli.args.destination:
cli.args.destination = os.path.join(os.environ['ORIG_CWD'], default_fork.split('/')[-1])
qmk_firmware = Path(cli.args.destination)
git_url = '/'.join((cli.args.baseurl, cli.args.fork))
# Exists (but not an empty dir)
if cli.args.destination.exists() and any(cli.args.destination.iterdir()):
if qmk_firmware.exists() and any(qmk_firmware.iterdir()):
cli.log.error('Destination already exists: %s', cli.args.destination)
exit(1)
+1 -15
View File
@@ -96,19 +96,7 @@ def import_usb_core():
def import_hid():
"""Attempts to import the hid module.
"""
import os
old_cwd = os.getcwd()
try:
# macOS library search paths don't include homebrew by default when launched via a `uv`-based deployment.
# The `hid` python module does a search and attempts to load a set of known library names, but doesn't qualify the path, nor gives the option to do so.
# To work around this, we chdir to the homebrew lib directory before importing hid, then chdir back to where we were.
if 'darwin' in platform().lower() or 'macos' in platform().lower():
for path in ('/opt/homebrew/lib', '/usr/local/lib'):
lib_search = Path(path) / 'libhidapi.dylib'
if lib_search.exists():
os.chdir(path)
break
import hid
return hid
@@ -119,8 +107,6 @@ def import_hid():
return import_hid()
raise
finally:
os.chdir(old_cwd)
class MonitorDevice(object):
@@ -198,7 +184,7 @@ class FindDevices(object):
except Exception as e:
device['e'] = e
device['e_name'] = e.__class__.__name__
cli.log.error("Could not connect to %(color)s%(manufacturer_string)s %(product_string)s{style_reset_all} (%(color)s%(vendor_id)04X:%(product_id)04X:%(index)d{style_reset_all}): %(e_name)s: %(e)s", device)
cli.log.error("Could not connect to %(color)s%(manufacturer_string)s %(product_string)s{style_reset_all} (%(color)s:%(vendor_id)04X:%(product_id)04X:%(index)d): %(e_name)s: %(e)s", device)
if cli.config.general.verbose:
cli.log.exception(e)
del live_devices[device['path']]
+2 -6
View File
@@ -4,20 +4,16 @@ import os
from pathlib import Path
from milc import cli
from qmk_cli.helpers import is_qmk_firmware, is_qmk_userspace
from qmk_cli.helpers import is_qmk_firmware
@cli.argument('var', arg_only=True, default=None, nargs='?', help='Optional variable to query')
@cli.subcommand('Prints environment information.')
def env(cli):
home = os.environ.get('QMK_HOME', "")
userspace = os.environ.get('QMK_USERSPACE', "")
data = {
'QMK_HOME': home,
'QMK_FIRMWARE': home if is_qmk_firmware(Path(home)) else "",
'QMK_USERSPACE': userspace if is_qmk_userspace(Path(userspace)) else "",
'QMK_DISTRIB_DIR': os.environ.get('QMK_DISTRIB_DIR', ""),
'QMK_PATH_PREFIX': os.environ.get('QMK_PATH_PREFIX', "")
'QMK_FIRMWARE': home if is_qmk_firmware(Path(home)) else ""
}
# Now munge the current cli config
+72
View File
@@ -0,0 +1,72 @@
"""Installs python dependencies.
"""
import shlex
import shutil
import subprocess
from milc import cli
from qmk_cli.helpers import find_qmk_firmware, is_qmk_firmware
def _run_pip(pip_args, dry_run=False, upgrade=False):
pip_exe = ['pip']
if cli.config.user.pip_exe:
pip_exe = shlex.split(cli.config.user.pip_exe)
pip_command = [*pip_exe, *pip_args]
pip_command[0] = shutil.which(pip_command[0])
if shutil.which(pip_command[0]) is None:
pip_command[0] = 'pip' # Hope falling back to unqualified path works
if dry_run:
print(" ".join(shlex.quote(str(s)) for s in pip_command))
return True
try:
with subprocess.Popen(pip_command, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True, encoding='utf-8') as p:
for line in p.stdout:
print(line, end='')
except Exception as e:
pip_cmd = ' '.join([s.replace(' ', r'\ ') for s in pip_command])
cli.log.error("Could not run '%s': %s: %s", pip_cmd, e.__class__.__name__, e)
return False
if p.returncode == 0:
return True
return False
def install_qmk_python_deps(upgrade=False, developer=False, dry_run=False):
qmk_firmware_dir = find_qmk_firmware()
if not is_qmk_firmware(qmk_firmware_dir):
cli.log.error('Could not find {fg_cyan}qmk_firmware{fg_reset}!')
return False
reqs_path = qmk_firmware_dir / 'requirements.txt' if not developer else qmk_firmware_dir / 'requirements-dev.txt'
pip_args = ['install', '-r', reqs_path]
if upgrade:
pip_args.append('--upgrade')
if _run_pip(pip_args, dry_run=dry_run):
if not dry_run:
cli.log.info('Successfully installed python dependencies!')
return True
else:
if not dry_run:
cli.log.error('Failed to install python dependencies!')
return False
@cli.argument('-u', '--upgrade', arg_only=True, action='store_true', help='Upgrades existing packages.')
@cli.argument('-d', '--developer', arg_only=True, action='store_true', help='Installs QMK Firmware developer dependencies, too.')
@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help='Prints the commands to execute, rather than executing them.')
@cli.subcommand('Installs python dependencies.')
def install_deps(cli):
return install_qmk_python_deps(upgrade=cli.args.upgrade, developer=cli.args.developer, dry_run=cli.args.dry_run)
@cli.argument('-n', '--dry-run', arg_only=True, action='store_true', help='Prints the commands to execute, rather than executing them.')
@cli.argument('arguments', arg_only=True, default=[], nargs='*', help='The arguments to pass to pip.')
@cli.subcommand('Runs pip inside the qmk venv.')
def pip(cli):
return _run_pip(cli.args.arguments, dry_run=cli.args.dry_run)
+10 -42
View File
@@ -5,12 +5,11 @@ import shlex
import subprocess
import sys
from pathlib import Path
from shutil import rmtree
from milc import cli
from milc.questions import choice, question, yesno
from milc.questions import yesno
from qmk_cli.git import git_clone
from qmk_cli.helpers import AbsPath, is_qmk_firmware
from qmk_cli.helpers import is_qmk_firmware
default_base = 'https://github.com'
default_repo = 'qmk_firmware'
@@ -44,22 +43,11 @@ def git_upstream(destination):
return False
def git_clone_fork(fork, branch, force=False):
if force:
rmtree(cli.args.home)
git_url = '/'.join((cli.args.baseurl, fork))
if git_clone(git_url, cli.args.home, branch):
git_upstream(cli.args.home)
else:
exit(1)
@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_HOME']), type=AbsPath, help='The location for QMK Firmware. Default: %s' % os.environ['QMK_HOME'])
@cli.argument('-H', '--home', arg_only=True, default=Path(os.environ['QMK_HOME']), type=Path, help='The location for QMK Firmware. Default: %s' % os.environ['QMK_HOME'])
@cli.argument('fork', arg_only=True, default=default_fork, nargs='?', help='The qmk_firmware fork to clone. Default: %s' % default_fork)
@cli.subcommand('Setup your computer for qmk_firmware.')
def setup(cli):
@@ -73,34 +61,9 @@ def setup(cli):
cli.log.error("Can't use both --yes and --no at the same time.")
exit(1)
# Check on qmk_firmware
# If it exists, ask the user what to do with it
# If it doesn't exist, offer to check it out
# Check on qmk_firmware, and if it doesn't exist offer to check it out.
if is_qmk_firmware(cli.args.home):
cli.log.info('Found qmk_firmware at %s.', str(cli.args.home))
found_prompt = "What do you want to do?"
found_options = [
f"Delete and reclone {cli.args.fork}",
"Delete and clone a different fork",
"Keep it and continue"
]
delete_confirm = "WARNING: This will delete your current qmk_firmware directory. Proceed?"
found_action = choice(found_prompt, options=found_options, default=2)
if found_action == f"Delete and reclone {cli.args.fork}":
if not yesno(delete_confirm, default=False):
exit(1)
git_clone_fork(cli.args.fork, cli.args.branch, force=True)
elif found_action == "Delete and clone a different fork":
fork_name = question("Enter the name of the fork:", default=cli.args.fork)
branch_name = question("Enter the branch name to clone:", default=cli.args.branch)
if not yesno(delete_confirm, default=False):
exit(1)
git_clone_fork(fork_name, branch_name, force=True)
# Exists (but not an empty dir)
elif cli.args.home.exists() and any(cli.args.home.iterdir()):
@@ -115,7 +78,12 @@ def setup(cli):
else:
cli.log.error('Could not find qmk_firmware!')
if yesno(clone_prompt):
git_clone_fork(cli.args.fork, cli.args.branch)
git_url = '/'.join((cli.args.baseurl, cli.args.fork))
if git_clone(git_url, cli.args.home, cli.args.branch):
git_upstream(cli.args.home)
else:
exit(1)
else:
cli.log.warning('Not cloning qmk_firmware due to user input or --no flag.')
+37
View File
@@ -0,0 +1,37 @@
""" Activates a virtualenv if not already present
"""
import os
import sys
if not os.environ.get('VIRTUAL_ENV') or True:
import site
from pathlib import Path
# Build a venv if required
INTENDED_VENV_PATH = Path(os.environ['HOME']) / ".local/qmk_venv"
if not INTENDED_VENV_PATH.exists():
from venv import EnvBuilder
builder = EnvBuilder(with_pip=True)
builder.create(str(INTENDED_VENV_PATH))
# Determine the venv's bin directory
bin_dir = INTENDED_VENV_PATH / "bin"
# Update the environment to point to the QMK venv (effectively matches `source path_to_venv/bin/activate`)
os.environ["PATH"] = os.pathsep.join([str(bin_dir), *os.environ.get("PATH", "").split(os.pathsep)])
os.environ["VIRTUAL_ENV"] = str(INTENDED_VENV_PATH)
if 'PYTHONHOME' in os.environ:
os.environ.pop('PYTHONHOME')
# Prepend the venv's library paths to the python import mechanism
pyver = sys.version_info[:2]
lib_dir = INTENDED_VENV_PATH / f'lib/python{pyver[0]}.{pyver[1]}/site-packages'
for d in [lib_dir, bin_dir]:
site.addsitedir(str(d))
sys.path.insert(0, str(d))
# Update the python prefixes
sys.base_prefix = sys.prefix
sys.prefix = str(INTENDED_VENV_PATH)
+4 -4
View File
@@ -9,7 +9,7 @@ ignore = E501,E226
[metadata]
name = qmk
version = 1.2.0
version = 1.1.5
author = skullydazed
author_email = skullydazed@gmail.com
description = A program to help users work with QMK Firmware.
@@ -37,9 +37,9 @@ classifiers =
[options]
install_requires =
hid
milc>=1.9.0
platformdirs
milc>=1.6.8
pyusb
setuptools>=45
# qmk_firmware packages
dotty-dict
hjson
@@ -48,7 +48,7 @@ install_requires =
pygments
pyserial
packages = find:
python_requires = >=3.9
python_requires = >=3.7
[options.entry_points]
console_scripts =