Compare commits
1 Commits
1.2.0
..
userspace2
| Author | SHA1 | Date | |
|---|---|---|---|
| 8d6a53d792 |
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
[bumpversion]
|
[bumpversion]
|
||||||
current_version = 1.2.0
|
current_version = 1.1.6
|
||||||
commit = True
|
commit = True
|
||||||
tag = True
|
tag = True
|
||||||
tag_name = {new_version}
|
tag_name = {new_version}
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
QMK_HOME: ~/qmk_firmware
|
QMK_HOME: ~/qmk_firmware
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: apt-get update && apt-get install -y python3-venv
|
run: apt-get update && apt-get install -y python3-venv
|
||||||
@@ -32,13 +32,16 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, ubuntu-latest]
|
os: [macos-latest, ubuntu-latest]
|
||||||
python-version: ['3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
|
python-version: ['3.9', '3.10', '3.11', '3.12']
|
||||||
|
include:
|
||||||
|
- os: macos-13
|
||||||
|
python-version: '3.9'
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python ${{ matrix.python-version }}
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: ${{ matrix.python-version }}
|
python-version: ${{ matrix.python-version }}
|
||||||
|
|
||||||
@@ -53,7 +56,7 @@ jobs:
|
|||||||
QMK_HOME: $HOME/qmk_firmware
|
QMK_HOME: $HOME/qmk_firmware
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: (MSYS2) Setup and install dependencies
|
- name: (MSYS2) Setup and install dependencies
|
||||||
uses: msys2/setup-msys2@v2
|
uses: msys2/setup-msys2@v2
|
||||||
@@ -65,7 +68,7 @@ jobs:
|
|||||||
- name: (MSYS2) Install Python dependencies
|
- name: (MSYS2) Install Python dependencies
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
python3 -m pip install --break-system-packages --force-reinstall --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
|
|
||||||
- name: (MSYS2) Install QMK CLI from source
|
- name: (MSYS2) Install QMK CLI from source
|
||||||
shell: msys2 {0}
|
shell: msys2 {0}
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v4
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# 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).
|
# 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)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v4
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 https://git.io/JvXDl
|
# 📚 https://git.io/JvXDl
|
||||||
@@ -68,4 +68,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v4
|
uses: github/codeql-action/analyze@v3
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: '3.9'
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||||
|
|
||||||
- name: Build and Push to Docker Hub
|
- name: Build and Push to Docker Hub
|
||||||
uses: docker/build-push-action@v6.18.0
|
uses: docker/build-push-action@v6.9.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
@@ -54,7 +54,3 @@ jobs:
|
|||||||
tags: |
|
tags: |
|
||||||
ghcr.io/qmk/qmk_cli:latest
|
ghcr.io/qmk/qmk_cli:latest
|
||||||
qmkfm/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 }}
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Set up Python
|
- name: Set up Python
|
||||||
uses: actions/setup-python@v6
|
uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.9'
|
python-version: '3.9'
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Run ci_tests
|
- name: Run ci_tests
|
||||||
run: ./ci_tests
|
run: ./ci_tests
|
||||||
@@ -43,7 +43,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
git config --local user.email "hello@qmk.fm"
|
git config --local user.email "hello@qmk.fm"
|
||||||
git config --local user.name "QMK Bot"
|
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 }}
|
bumpversion ${{ github.event.inputs.version_part }}
|
||||||
|
|
||||||
- name: Push changes
|
- name: Push changes
|
||||||
@@ -75,7 +74,7 @@ jobs:
|
|||||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||||
|
|
||||||
- name: Build and Push to Docker Hub
|
- name: Build and Push to Docker Hub
|
||||||
uses: docker/build-push-action@v6.18.0
|
uses: docker/build-push-action@v6.9.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
@@ -83,10 +82,6 @@ jobs:
|
|||||||
tags: |
|
tags: |
|
||||||
ghcr.io/qmk/qmk_cli:latest
|
ghcr.io/qmk/qmk_cli:latest
|
||||||
qmkfm/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
|
- name: Trigger OS package builds
|
||||||
run: ./trigger_packages
|
run: ./trigger_packages
|
||||||
|
|||||||
+5
-27
@@ -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
|
# Copy package in
|
||||||
ADD dist /tmp/dist
|
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
|
# Install python packages
|
||||||
RUN python3 -m pip uninstall -y qmk || true
|
RUN python3 -m pip uninstall -y qmk || true
|
||||||
RUN python3 -m pip install --upgrade pip setuptools wheel nose2 && \
|
RUN python3 -m pip install --upgrade pip setuptools wheel nose2 && \
|
||||||
python3 -m pip install /tmp/dist/qmk-*.whl
|
python3 -m pip install /tmp/dist/qmk-*.whl && \
|
||||||
|
rm -rf /tmp/dist
|
||||||
# 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
|
|
||||||
|
|
||||||
|
# Set the default location for qmk_firmware
|
||||||
|
ENV QMK_HOME /qmk_firmware
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
"""A program to help you work with qmk_firmware."""
|
"""A program to help you work with qmk_firmware."""
|
||||||
|
|
||||||
__version__ = '1.2.0'
|
__version__ = '1.1.6'
|
||||||
|
|||||||
+10
-17
@@ -2,22 +2,13 @@
|
|||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
|
from platformdirs import user_data_dir
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from milc import cli
|
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):
|
def is_qmk_firmware(qmk_firmware):
|
||||||
"""Returns True if the given Path() is a qmk_firmware clone.
|
"""Returns True if the given Path() is a qmk_firmware clone.
|
||||||
"""
|
"""
|
||||||
@@ -36,7 +27,7 @@ def is_qmk_firmware(qmk_firmware):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=1)
|
@lru_cache(maxsize=2)
|
||||||
def find_qmk_firmware():
|
def find_qmk_firmware():
|
||||||
"""Look for qmk_firmware in the usual places.
|
"""Look for qmk_firmware in the usual places.
|
||||||
|
|
||||||
@@ -54,10 +45,13 @@ def find_qmk_firmware():
|
|||||||
return path.resolve()
|
return path.resolve()
|
||||||
return path
|
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'
|
return Path.home() / 'qmk_firmware'
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=1)
|
|
||||||
def in_qmk_firmware():
|
def in_qmk_firmware():
|
||||||
"""Returns the path to the qmk_firmware we are currently in, or None if we are not inside qmk_firmware.
|
"""Returns the path to the qmk_firmware we are currently in, or None if we are not inside qmk_firmware.
|
||||||
"""
|
"""
|
||||||
@@ -84,26 +78,25 @@ def is_qmk_userspace(qmk_userspace):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=1)
|
@lru_cache(maxsize=2)
|
||||||
def find_qmk_userspace():
|
def find_qmk_userspace():
|
||||||
"""Look for qmk_userspace in the usual places.
|
"""Look for qmk_userspace in the usual places.
|
||||||
"""
|
"""
|
||||||
if in_qmk_userspace():
|
if in_qmk_userspace():
|
||||||
return in_qmk_userspace()
|
return in_qmk_userspace()
|
||||||
|
|
||||||
|
if cli.config.user.overlay_dir:
|
||||||
|
return Path(cli.config.user.overlay_dir).expanduser().resolve()
|
||||||
|
|
||||||
if 'QMK_USERSPACE' in os.environ:
|
if 'QMK_USERSPACE' in os.environ:
|
||||||
path = Path(os.environ['QMK_USERSPACE']).expanduser()
|
path = Path(os.environ['QMK_USERSPACE']).expanduser()
|
||||||
if path.exists():
|
if path.exists():
|
||||||
return path.resolve()
|
return path.resolve()
|
||||||
return path
|
return path
|
||||||
|
|
||||||
if cli.config.user.overlay_dir:
|
|
||||||
return Path(cli.config.user.overlay_dir).expanduser().resolve()
|
|
||||||
|
|
||||||
return Path.home() / 'qmk_userspace'
|
return Path.home() / 'qmk_userspace'
|
||||||
|
|
||||||
|
|
||||||
@lru_cache(maxsize=1)
|
|
||||||
def in_qmk_userspace():
|
def in_qmk_userspace():
|
||||||
"""Returns the path to the qmk_userspace we are currently in, or None if we are not inside qmk_userspace.
|
"""Returns the path to the qmk_userspace we are currently in, or None if we are not inside qmk_userspace.
|
||||||
"""
|
"""
|
||||||
|
|||||||
+1
-40
@@ -4,7 +4,6 @@
|
|||||||
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.
|
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
|
import os
|
||||||
from pathlib import Path
|
|
||||||
import shlex
|
import shlex
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
@@ -12,33 +11,10 @@ from platform import platform
|
|||||||
from traceback import print_exc
|
from traceback import print_exc
|
||||||
|
|
||||||
import milc
|
import milc
|
||||||
import platformdirs
|
|
||||||
|
|
||||||
from . import __version__
|
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, find_qmk_userspace, is_qmk_userspace
|
||||||
|
|
||||||
|
|
||||||
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.cli.milc_options(version=__version__)
|
||||||
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
|
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
|
||||||
|
|
||||||
@@ -76,19 +52,7 @@ def main():
|
|||||||
if 'windows' in platform().lower():
|
if 'windows' in platform().lower():
|
||||||
msystem = os.environ.get('MSYSTEM', '')
|
msystem = os.environ.get('MSYSTEM', '')
|
||||||
|
|
||||||
# Assume the environment isn't workable by default
|
if 'mingw64' not in sys.executable or 'MINGW64' not in msystem:
|
||||||
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:
|
|
||||||
print('ERROR: It seems you are not using the MINGW64 terminal.')
|
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('Please close this terminal and open a new MSYS2 MinGW 64-bit terminal.')
|
||||||
print('Python: %s, MSYSTEM: %s' % (sys.executable, msystem))
|
print('Python: %s, MSYSTEM: %s' % (sys.executable, msystem))
|
||||||
@@ -97,10 +61,7 @@ def main():
|
|||||||
# Environment setup
|
# Environment setup
|
||||||
qmk_userspace = find_qmk_userspace()
|
qmk_userspace = find_qmk_userspace()
|
||||||
qmk_firmware = find_qmk_firmware()
|
qmk_firmware = find_qmk_firmware()
|
||||||
if is_qmk_userspace(qmk_userspace):
|
|
||||||
os.environ['QMK_USERSPACE'] = str(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['QMK_HOME'] = str(qmk_firmware)
|
||||||
os.environ['ORIG_CWD'] = os.getcwd()
|
os.environ['ORIG_CWD'] = os.getcwd()
|
||||||
|
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ from . import clone # noqa
|
|||||||
from . import console # noqa
|
from . import console # noqa
|
||||||
from . import env # noqa
|
from . import env # noqa
|
||||||
from . import setup # noqa
|
from . import setup # noqa
|
||||||
|
from . import userspace # noqa
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from pathlib import Path
|
|||||||
|
|
||||||
from milc import cli
|
from milc import cli
|
||||||
from qmk_cli.git import git_clone
|
from qmk_cli.git import git_clone
|
||||||
from qmk_cli.helpers import AbsPath
|
|
||||||
|
|
||||||
default_repo = 'qmk_firmware'
|
default_repo = 'qmk_firmware'
|
||||||
default_fork = 'qmk/' + default_repo
|
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('--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('-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.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.')
|
@cli.subcommand('Clone a qmk_firmware fork.')
|
||||||
def clone(cli):
|
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))
|
git_url = '/'.join((cli.args.baseurl, cli.args.fork))
|
||||||
|
|
||||||
# Exists (but not an empty dir)
|
# 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)
|
cli.log.error('Destination already exists: %s', cli.args.destination)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
|||||||
@@ -96,19 +96,7 @@ def import_usb_core():
|
|||||||
def import_hid():
|
def import_hid():
|
||||||
"""Attempts to import the hid module.
|
"""Attempts to import the hid module.
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
old_cwd = os.getcwd()
|
|
||||||
try:
|
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
|
import hid
|
||||||
return hid
|
return hid
|
||||||
|
|
||||||
@@ -119,8 +107,6 @@ def import_hid():
|
|||||||
return import_hid()
|
return import_hid()
|
||||||
|
|
||||||
raise
|
raise
|
||||||
finally:
|
|
||||||
os.chdir(old_cwd)
|
|
||||||
|
|
||||||
|
|
||||||
class MonitorDevice(object):
|
class MonitorDevice(object):
|
||||||
|
|||||||
@@ -15,9 +15,7 @@ def env(cli):
|
|||||||
data = {
|
data = {
|
||||||
'QMK_HOME': home,
|
'QMK_HOME': home,
|
||||||
'QMK_FIRMWARE': home if is_qmk_firmware(Path(home)) else "",
|
'QMK_FIRMWARE': home if is_qmk_firmware(Path(home)) else "",
|
||||||
'QMK_USERSPACE': userspace if is_qmk_userspace(Path(userspace)) 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', "")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Now munge the current cli config
|
# Now munge the current cli config
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ from shutil import rmtree
|
|||||||
from milc import cli
|
from milc import cli
|
||||||
from milc.questions import choice, question, yesno
|
from milc.questions import choice, question, yesno
|
||||||
from qmk_cli.git import git_clone
|
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_base = 'https://github.com'
|
||||||
default_repo = 'qmk_firmware'
|
default_repo = 'qmk_firmware'
|
||||||
@@ -59,7 +59,7 @@ def git_clone_fork(fork, branch, force=False):
|
|||||||
@cli.argument('-y', '--yes', arg_only=True, action='store_true', help='Answer yes 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('--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('-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.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.')
|
@cli.subcommand('Setup your computer for qmk_firmware.')
|
||||||
def setup(cli):
|
def setup(cli):
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
"""Setup qmk_userspace on your computer.
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
from platformdirs import user_data_dir
|
||||||
|
|
||||||
|
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(user_data_dir('qmk_cli', 'QMK')) / '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)
|
||||||
@@ -9,7 +9,7 @@ ignore = E501,E226
|
|||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
name = qmk
|
name = qmk
|
||||||
version = 1.2.0
|
version = 1.1.6
|
||||||
author = skullydazed
|
author = skullydazed
|
||||||
author_email = skullydazed@gmail.com
|
author_email = skullydazed@gmail.com
|
||||||
description = A program to help users work with QMK Firmware.
|
description = A program to help users work with QMK Firmware.
|
||||||
@@ -38,8 +38,8 @@ classifiers =
|
|||||||
install_requires =
|
install_requires =
|
||||||
hid
|
hid
|
||||||
milc>=1.9.0
|
milc>=1.9.0
|
||||||
platformdirs
|
|
||||||
pyusb
|
pyusb
|
||||||
|
setuptools>=45
|
||||||
# qmk_firmware packages
|
# qmk_firmware packages
|
||||||
dotty-dict
|
dotty-dict
|
||||||
hjson
|
hjson
|
||||||
|
|||||||
Reference in New Issue
Block a user