Compare commits
76 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4508b8548f | |||
| 2ea90a0893 | |||
| 9fccc990be | |||
| 6d99eacdf8 | |||
| dbd731585a | |||
| 9d480bd287 | |||
| 709f416e52 | |||
| bcdac9a80e | |||
| 4772e68828 | |||
| 24741c7d2b | |||
| b756421528 | |||
| 3d96bcdc14 | |||
| 6e6b6bcde6 | |||
| 1df06eed72 | |||
| 60a56b6976 | |||
| 1e3605feb3 | |||
| 48ddcefea1 | |||
| 2f6f38cc33 | |||
| c73ae7e97c | |||
| 0475193870 | |||
| 8d9b3b2880 | |||
| 0dbe3dc448 | |||
| c41fd5e940 | |||
| b70736a876 | |||
| 69b3b890d2 | |||
| 8b30a9766d | |||
| 982349a450 | |||
| 4d161c9ec4 | |||
| 047eb00594 | |||
| 558251860a | |||
| b685fe5d3f | |||
| e447fb4252 | |||
| 066a865084 | |||
| a1276f8d58 | |||
| 3555e34ae9 | |||
| b36cf144e3 | |||
| fb05b69adc | |||
| 4283c258d9 | |||
| b5e8aa4cac | |||
| 1c6d81fc3b | |||
| 0ffae74377 | |||
| cbe3ad0248 | |||
| 97689b53d7 | |||
| 054e071787 | |||
| 78e0fda2f0 | |||
| 9c6123483b | |||
| e851c8fcb5 | |||
| 92168e1ef0 | |||
| fd744ac24c | |||
| 840c791cc8 | |||
| 8f5b8e83c0 | |||
| 1da98510d3 | |||
| 6ec242b133 | |||
| 6433cbc0f4 | |||
| aedad7e602 | |||
| 504291bbf5 | |||
| c6e736adc7 | |||
| fe42ab3534 | |||
| d805fe2b6e | |||
| 5321a121fc | |||
| 3c31d41bf3 | |||
| c6977fa851 | |||
| 3b6c0fd058 | |||
| 216f5d44c1 | |||
| 0bf0b5a503 | |||
| 4b11e04672 | |||
| aba043abdc | |||
| efd9f68243 | |||
| e3e0856f96 | |||
| 670a07ff0b | |||
| c4c76e3534 | |||
| 9ad519d4a2 | |||
| 655979cef5 | |||
| 6b0d5fe85b | |||
| d163222123 | |||
| 5342ab3e10 |
@@ -0,0 +1,15 @@
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
- package-ecosystem: "pip" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
reviewers:
|
||||
- "qmk/collaborators"
|
||||
@@ -14,30 +14,18 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-latest, ubuntu-latest]
|
||||
python-version: [3.6, 3.7, 3.8]
|
||||
python-version: [3.7, 3.8, 3.9]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2.3.4
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v1
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
|
||||
- name: Install Python dependencies
|
||||
run: |
|
||||
python3 -m pip install wheel
|
||||
echo "::add-path::$HOME/.local/bin"
|
||||
|
||||
- name: Install QMK CLI from source
|
||||
run: |
|
||||
python3 -m pip install -r requirements.txt
|
||||
python3 setup.py sdist bdist_wheel
|
||||
cd ..
|
||||
python3 -m pip install --force-reinstall --no-index --no-deps --prefix=~/.local --find-links qmk_cli/dist qmk
|
||||
|
||||
- name: Run qmk setup -y
|
||||
run: qmk setup -y
|
||||
- name: Run ci_tests
|
||||
run: ./ci_tests -a
|
||||
|
||||
test_cli_win:
|
||||
runs-on: windows-latest
|
||||
@@ -45,7 +33,7 @@ jobs:
|
||||
QMK_HOME: $HOME/qmk_firmware
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v2.3.4
|
||||
|
||||
- name: (MSYS2) Setup and install dependencies
|
||||
uses: msys2/setup-msys2@v2
|
||||
@@ -53,12 +41,10 @@ jobs:
|
||||
update: true
|
||||
install: git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python-pip
|
||||
|
||||
- name: (MSYS2) Upgrade pip and setuptools and install wheel
|
||||
- name: (MSYS2) Install Python dependencies
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
python3 -m pip install --upgrade pip setuptools
|
||||
python3 -m pip install wheel
|
||||
|
||||
- name: (MSYS2) Install QMK CLI from source
|
||||
shell: msys2 {0}
|
||||
run: |
|
||||
@@ -66,7 +52,6 @@ jobs:
|
||||
python3 setup.py sdist bdist_wheel
|
||||
cd ..
|
||||
python3 -m pip install --force-reinstall --no-index --no-deps --find-links qmk_cli/dist qmk
|
||||
|
||||
- name: (MSYS2) Run qmk setup -y
|
||||
shell: msys2 {0}
|
||||
run: qmk setup -y
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
# For most projects, this workflow file will not need changing; you simply need
|
||||
# to commit it to your repository.
|
||||
#
|
||||
# You may wish to alter this file to override the set of languages analyzed,
|
||||
# or to provide custom queries or build logic.
|
||||
#
|
||||
# ******** NOTE ********
|
||||
# We have attempted to detect the languages in your repository. Please check
|
||||
# the `language` matrix defined below to confirm you have the correct set of
|
||||
# supported CodeQL languages.
|
||||
#
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [ master ]
|
||||
schedule:
|
||||
- cron: '22 18 * * 0'
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
security-events: write
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
language: [ 'python' ]
|
||||
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
|
||||
# Learn more:
|
||||
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2.3.4
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||
# By default, queries listed here will override any specified in a config file.
|
||||
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||
# queries: ./path/to/local/query, your-org/your-repo/queries@main
|
||||
|
||||
# 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@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
@@ -0,0 +1,59 @@
|
||||
# This workflow will upload a Python Package using Twine when a release is created
|
||||
# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
|
||||
|
||||
name: Upload Python Package
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version_part:
|
||||
description: 'Which part of the version to increment (patch, minor, major)'
|
||||
required: true
|
||||
default: 'patch'
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.3.4
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v2.2.2
|
||||
with:
|
||||
python-version: '3.7'
|
||||
- name: Run ci_tests
|
||||
run: ./ci_tests
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install setuptools wheel
|
||||
pip install -r requirements-dev.txt
|
||||
- name: Bump version
|
||||
run: |
|
||||
git config --local user.email "hello@qmk.fm"
|
||||
git config --local user.name "QMK Bot"
|
||||
bumpversion ${{ github.event.inputs.version_part }}
|
||||
- name: Push changes
|
||||
uses: ad-m/github-push-action@master
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
branch: master
|
||||
tags: true
|
||||
- name: Build and publish
|
||||
env:
|
||||
TWINE_USERNAME: qmk
|
||||
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
|
||||
run: |
|
||||
python setup.py sdist bdist_wheel
|
||||
twine upload dist/*
|
||||
- name: Log in to Docker Hub
|
||||
uses: docker/login-action@v1.10.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||
- name: Build and Push to Docker Hub
|
||||
uses: docker/build-push-action@v2.6.1
|
||||
with:
|
||||
push: true
|
||||
tags: qmkfm/qmk_cli:latest
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"python.formatting.provider": "yapf"
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
# Code Of Conduct
|
||||
|
||||
QMK strives to be an inclusive, tolerant, and welcoming community. We encourage participation from anyone regardless of age, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, political belief, race, religion, or sexual identity and orientation.
|
||||
|
||||
> “A gentle word turns away wrath, but a harsh word stirs up anger."
|
||||
|
||||
Our users, contributors, and collaborators are expected to treat each other with kindness and respect, to assume good intentions, and to gently correct, where possible, rather than react with escalation. While our goal is to be as accurate as possible, kindness and understanding are more valuable than correctness. Some examples of behavior we will not tolerate include, but is not limited to:
|
||||
|
||||
* The use of sexualized language or imagery
|
||||
* Unwelcome advances, sexual or otherwise
|
||||
* Insults or derogatory comments, or personal or political attacks
|
||||
* Publishing others’ private information without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
If someone is violating this Code of Conduct you may email hello@qmk.fm to bring your concern to the Members. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident.
|
||||
@@ -0,0 +1,8 @@
|
||||
FROM qmkfm/base_container
|
||||
|
||||
# Install python packages
|
||||
RUN python3 -m pip install --upgrade pip setuptools wheel
|
||||
RUN python3 -m pip install --upgrade nose2 qmk
|
||||
|
||||
# Set the default location for qmk_firmware
|
||||
ENV QMK_HOME /qmk_firmware
|
||||
@@ -1,5 +1,6 @@
|
||||
# QMK CLI
|
||||
[](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/).
|
||||
|
||||
# Features
|
||||
@@ -8,10 +9,16 @@ A program to help users work with [QMK Firmware](https://qmk.fm/).
|
||||
* Use `qmk clone` to pull down anyone's `qmk_firmware` fork
|
||||
* Setup your build environment with `qmk setup`
|
||||
* Check that your environment is correctly setup with `qmk doctor`
|
||||
* Dispatches to `qmk_firmware/bin/qmk` for additional functionality:
|
||||
* `qmk compile-json`
|
||||
* More to come
|
||||
* Integrates with qmk_firmware for additional functionality:
|
||||
* `qmk compile`
|
||||
* `qmk console`
|
||||
* `qmk flash`
|
||||
* `qmk lint`
|
||||
* ...and many more!
|
||||
|
||||
# Quickstart
|
||||
|
||||
To be written.
|
||||
* `python3 -m pip install qmk`
|
||||
* `qmk setup`
|
||||
|
||||
Full documentation: <https://docs.qmk.fm/#/tutorial>
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.0.x | :white_check_mark: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
* [Open an Issue](https://github.com/qmk/qmk_cli/issues/new?assignees=&labels=bug&template=bug_report.md&title=%5BBug%5D+)
|
||||
@@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
#set -x
|
||||
|
||||
ADVANCED=false
|
||||
TMPDIR=$(mktemp -d)
|
||||
QMK_HOME="$TMPDIR/qmk_firmware"
|
||||
export QMK_HOME
|
||||
|
||||
for arg in $@; do
|
||||
if [ "$arg" = "-a" ]; then
|
||||
ADVANCED=true
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $ADVANCED = true ]; then
|
||||
echo "*** Running in advanced mode with tmp files in $TMPDIR"
|
||||
else
|
||||
echo "*** Running in basic mode with tmp files in $TMPDIR"
|
||||
fi
|
||||
|
||||
# Setup our virtualenv
|
||||
if [ -e .ci_venv ]; then
|
||||
rm -rf .ci_venv
|
||||
fi
|
||||
|
||||
python3 -m venv .ci_venv
|
||||
source .ci_venv/bin/activate
|
||||
|
||||
# Install dependencies
|
||||
python3 -m pip install -U pip wheel
|
||||
python3 -m pip install .
|
||||
python3 -m pip install -r requirements-dev.txt
|
||||
|
||||
# Ensure that qmk works
|
||||
echo "*** Testing 'qmk clone -h'"
|
||||
qmk clone -h
|
||||
echo "*** Testing 'qmk config -a'"
|
||||
qmk config -a
|
||||
echo "*** Testing 'qmk setup -n'"
|
||||
qmk setup -n
|
||||
|
||||
echo
|
||||
echo "*** Basic tests completed successfully!"
|
||||
|
||||
# Run advanced test if requested
|
||||
if [ $ADVANCED = true ]; then
|
||||
echo
|
||||
echo "*** Testing 'qmk setup -y'"
|
||||
qmk setup -y
|
||||
|
||||
echo
|
||||
echo "*** Advanced tests completed successfully!"
|
||||
fi
|
||||
|
||||
# Cleanup
|
||||
deactivate
|
||||
rm -rf .ci_venv $TMPDIR
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
"""A program to help you work with qmk_firmware."""
|
||||
|
||||
__version__ = '0.0.36'
|
||||
__version__ = '0.1.1'
|
||||
|
||||
+12
-4
@@ -16,17 +16,25 @@ def git_clone(url, destination, branch):
|
||||
'--recurse-submodules',
|
||||
'--branch=' + branch,
|
||||
url,
|
||||
destination,
|
||||
str(destination),
|
||||
]
|
||||
cli.log.debug('Git clone command: %s', git_clone)
|
||||
|
||||
with subprocess.Popen(git_clone, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True, encoding='utf-8') as p:
|
||||
for line in p.stdout:
|
||||
print(line, end='')
|
||||
try:
|
||||
with subprocess.Popen(git_clone, 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:
|
||||
git_cmd = ' '.join([s.replace(' ', r'\ ') for s in git_clone])
|
||||
|
||||
cli.log.error("Could not run '%s': %s: %s", git_cmd, e.__class__.__name__, e)
|
||||
return False
|
||||
|
||||
if p.returncode == 0:
|
||||
cli.log.info('Successfully cloned %s to %s!', url, destination)
|
||||
return True
|
||||
|
||||
else:
|
||||
cli.log.error('git clone exited %d', p.returncode)
|
||||
return False
|
||||
|
||||
+53
-29
@@ -1,36 +1,60 @@
|
||||
"""Useful helper functions.
|
||||
"""
|
||||
from milc import cli, format_ansi
|
||||
import os
|
||||
from functools import lru_cache
|
||||
from importlib.util import find_spec
|
||||
from pathlib import Path
|
||||
|
||||
from milc import cli
|
||||
|
||||
|
||||
def question(question, boolean=True, default=''):
|
||||
"""Asks the user to answer a question.
|
||||
|
||||
This keeps re-asking until it gets acceptible input.
|
||||
def is_qmk_firmware(qmk_firmware):
|
||||
"""Returns True if the given Path() is a qmk_firmware clone.
|
||||
"""
|
||||
if cli.args.yes:
|
||||
return True
|
||||
paths = [
|
||||
qmk_firmware,
|
||||
qmk_firmware / 'quantum',
|
||||
qmk_firmware / 'requirements.txt',
|
||||
qmk_firmware / 'requirements-dev.txt',
|
||||
qmk_firmware / 'lib/python/qmk/cli/__init__.py'
|
||||
]
|
||||
|
||||
if default and default.lower() == 'y':
|
||||
answer_key = 'Y/n'
|
||||
elif default and default.lower() == 'n':
|
||||
answer_key = 'y/N'
|
||||
else:
|
||||
answer_key = 'y/n'
|
||||
|
||||
prompt = format_ansi('\n*** %s [%s] ' % (question, answer_key))
|
||||
|
||||
while True:
|
||||
answer = input(prompt)
|
||||
print()
|
||||
if answer == '' and default.lower() == 'y':
|
||||
answer = 'y'
|
||||
elif answer == '' and default.lower() == 'n':
|
||||
answer = 'n'
|
||||
|
||||
if answer.lower() in ['y', 'yes']:
|
||||
return True
|
||||
elif answer.lower() in ['n', 'no']:
|
||||
for path in paths:
|
||||
if not path.exists():
|
||||
return False
|
||||
else:
|
||||
cli.echo('Invalid answer!')
|
||||
|
||||
return True
|
||||
|
||||
|
||||
@lru_cache(maxsize=2)
|
||||
def find_qmk_firmware():
|
||||
"""Look for qmk_firmware in the usual places.
|
||||
|
||||
This function returns the path to qmk_firmware, or the default location if one does not exist.
|
||||
"""
|
||||
if in_qmk_firmware():
|
||||
return in_qmk_firmware()
|
||||
|
||||
if cli.config.user.qmk_home:
|
||||
return Path(cli.config.user.qmk_home).expanduser().resolve()
|
||||
|
||||
if 'QMK_HOME' in os.environ:
|
||||
path = Path(os.environ['QMK_HOME']).expanduser()
|
||||
if path.exists():
|
||||
return path.resolve()
|
||||
return path
|
||||
|
||||
return Path.home() / '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.
|
||||
"""
|
||||
cur_dir = Path.cwd()
|
||||
while len(cur_dir.parents) > 0:
|
||||
if is_qmk_firmware(cur_dir):
|
||||
return cur_dir
|
||||
|
||||
# Move up a directory before the next iteration
|
||||
cur_dir = cur_dir / '..'
|
||||
cur_dir = cur_dir.resolve()
|
||||
|
||||
+35
-59
@@ -3,18 +3,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 argparse
|
||||
import platform
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import sys
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
from platform import platform
|
||||
from traceback import print_exc
|
||||
|
||||
import milc
|
||||
|
||||
from . import __version__
|
||||
from .helpers import find_qmk_firmware, is_qmk_firmware
|
||||
|
||||
milc.set_metadata(version=__version__)
|
||||
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
|
||||
|
||||
# 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.')
|
||||
def qmk_main(cli):
|
||||
@@ -23,59 +30,27 @@ def qmk_main(cli):
|
||||
cli.print_help()
|
||||
|
||||
|
||||
@lru_cache(maxsize=2)
|
||||
def in_qmk_firmware():
|
||||
"""Returns the path to the qmk_firmware we are currently in, or None if we are not inside qmk_firmware.
|
||||
def run_cmd(*command):
|
||||
"""Run a command in a subshell.
|
||||
"""
|
||||
cur_dir = Path.cwd()
|
||||
while len(cur_dir.parents) > 0:
|
||||
found_bin = cur_dir / 'bin' / 'qmk'
|
||||
# An additional check for something that exists in the root of qmk_firmware,
|
||||
# but not in the script's install directory, to avoid recursive execution,
|
||||
# if started from install directory.
|
||||
# e.g.: cd ~/.local/bin && ./qmk
|
||||
found_quantum = cur_dir / 'quantum'
|
||||
if found_bin.is_file() and found_quantum.is_dir():
|
||||
command = [sys.executable, found_bin.as_posix()]
|
||||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||
if 'windows' in milc.cli.platform.lower():
|
||||
safecmd = map(shlex.quote, command)
|
||||
safecmd = ' '.join(safecmd)
|
||||
command = [os.environ['SHELL'], '-c', safecmd]
|
||||
|
||||
if result.returncode == 0:
|
||||
return cur_dir
|
||||
|
||||
# Move up a directory before the next iteration
|
||||
cur_dir = cur_dir / '..'
|
||||
cur_dir = cur_dir.resolve()
|
||||
|
||||
|
||||
def find_qmk_firmware():
|
||||
"""Look for qmk_firmware in the usual places.
|
||||
|
||||
This function returns the path to qmk_firmware, or the default location if one does not exist.
|
||||
"""
|
||||
if in_qmk_firmware():
|
||||
return in_qmk_firmware()
|
||||
|
||||
if milc.cli.config.user.qmk_home:
|
||||
return Path(milc.cli.config.user.qmk_home).expanduser().resolve()
|
||||
|
||||
if 'QMK_HOME' in os.environ:
|
||||
path = Path(os.environ['QMK_HOME']).expanduser()
|
||||
if path.exists():
|
||||
return path.resolve()
|
||||
return path
|
||||
|
||||
return Path.home() / 'qmk_firmware'
|
||||
return subprocess.run(command)
|
||||
|
||||
|
||||
# Python setuptools entrypoint
|
||||
def main():
|
||||
"""Setup the environment before dispatching to the entrypoint.
|
||||
"""
|
||||
# Warn if they use an outdated python version
|
||||
if sys.version_info < (3, 6):
|
||||
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.6 or later.')
|
||||
print('Please upgrade to Python 3.7 or later.')
|
||||
|
||||
if 'windows' in platform.platform().lower():
|
||||
if 'windows' in platform().lower():
|
||||
msystem = os.environ.get('MSYSTEM', '')
|
||||
|
||||
if 'mingw64' not in sys.executable or 'MINGW64' not in msystem:
|
||||
@@ -85,26 +60,27 @@ def main():
|
||||
exit(1)
|
||||
|
||||
# Environment setup
|
||||
import qmk_cli
|
||||
milc.cli.version = qmk_cli.__version__
|
||||
qmk_firmware = find_qmk_firmware()
|
||||
os.environ['QMK_HOME'] = str(qmk_firmware)
|
||||
os.environ['ORIG_CWD'] = os.getcwd()
|
||||
|
||||
# Import the subcommand modules
|
||||
import qmk_cli.subcommands
|
||||
|
||||
if qmk_firmware.exists():
|
||||
# Check out and initialize the qmk_firmware environment
|
||||
if is_qmk_firmware(qmk_firmware):
|
||||
# All subcommands are run relative to the qmk_firmware root to make it easier to use the right copy of qmk_firmware.
|
||||
os.chdir(str(qmk_firmware))
|
||||
sys.path.append(str(qmk_firmware / 'lib' / 'python'))
|
||||
try:
|
||||
import qmk.cli
|
||||
except ImportError:
|
||||
if qmk_firmware.name != 'qmk_firmware':
|
||||
print('Warning: %s does not end in "qmk_firmware". Do you need to set QMK_HOME to "%s/qmk_firmware"?' % (qmk_firmware,qmk_firmware))
|
||||
sys.path.append(str(qmk_firmware / 'lib/python'))
|
||||
|
||||
print('Error: %s is too old or not set up correctly!' % qmk_firmware)
|
||||
print('Please update it or remove it completely before continuing.')
|
||||
try:
|
||||
import qmk.cli # noqa
|
||||
|
||||
except ImportError as e:
|
||||
if qmk_firmware.name != 'qmk_firmware':
|
||||
print('Warning: %s does not end in "qmk_firmware". Do you need to set QMK_HOME to "%s/qmk_firmware"?' % (qmk_firmware, qmk_firmware))
|
||||
|
||||
print('Error: %s: %s', (e.__class__.__name__, e))
|
||||
print_exc()
|
||||
sys.exit(1)
|
||||
|
||||
# Call the entrypoint
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
|
||||
We list each subcommand here explicitly because all the reliable ways of searching for modules are slow and delay startup.
|
||||
"""
|
||||
from . import clone
|
||||
from . import setup
|
||||
from . import clone # noqa
|
||||
from . import env # noqa
|
||||
from . import setup # noqa
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
"""Prints environment information.
|
||||
"""
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from milc import cli
|
||||
from qmk_cli.helpers import is_qmk_firmware
|
||||
|
||||
|
||||
@cli.argument('var', default=None, nargs='?', help='Optional variable to query')
|
||||
@cli.subcommand('Prints environment information.')
|
||||
def env(cli):
|
||||
home = os.environ.get('QMK_HOME', "")
|
||||
data = {
|
||||
'QMK_HOME': home,
|
||||
'QMK_FIRMWARE': home if is_qmk_firmware(Path(home)) else ""
|
||||
}
|
||||
|
||||
# Now munge the current cli config
|
||||
for key, val in cli.config.general.items():
|
||||
converted_key = 'QMK_' + key.upper()
|
||||
data[converted_key] = val
|
||||
|
||||
if cli.args.var:
|
||||
# dump out requested arg
|
||||
print(data[cli.args.var])
|
||||
else:
|
||||
# dump out everything
|
||||
for key, val in data.items():
|
||||
print(f'{key}="{val}"')
|
||||
@@ -9,6 +9,7 @@ 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 is_qmk_firmware
|
||||
|
||||
default_base = 'https://github.com'
|
||||
default_repo = 'qmk_firmware'
|
||||
@@ -61,8 +62,18 @@ def setup(cli):
|
||||
exit(1)
|
||||
|
||||
# Check on qmk_firmware, and if it doesn't exist offer to check it out.
|
||||
if (cli.args.home / 'Makefile').exists():
|
||||
if is_qmk_firmware(cli.args.home):
|
||||
cli.log.info('Found qmk_firmware at %s.', str(cli.args.home))
|
||||
|
||||
elif cli.args.home.exists():
|
||||
path_str = str(cli.args.home)
|
||||
|
||||
if cli.args.home.name != 'qmk_firmware':
|
||||
cli.log.warning('Warning: %s does not end in "qmk_firmware". Did you mean to use "--home %s/qmk_firmware"?' % (path_str, path_str))
|
||||
|
||||
cli.log.error("Path '%s' exists but is not a qmk_firmware clone!", path_str)
|
||||
exit(1)
|
||||
|
||||
else:
|
||||
cli.log.error('Could not find qmk_firmware!')
|
||||
if yesno(clone_prompt):
|
||||
@@ -72,20 +83,25 @@ def setup(cli):
|
||||
git_upstream(cli.args.home)
|
||||
else:
|
||||
exit(1)
|
||||
else:
|
||||
cli.log.warning('Not cloning qmk_firmware due to user input or --no flag.')
|
||||
|
||||
# Offer to set `user.qmk_home` for them.
|
||||
if cli.args.home != os.environ['QMK_HOME'] and yesno(home_prompt):
|
||||
if str(cli.args.home) != os.environ['QMK_HOME'] and yesno(home_prompt):
|
||||
cli.config['user']['qmk_home'] = str(cli.args.home.absolute())
|
||||
cli.config_source['user']['qmk_home'] = 'config_file'
|
||||
cli.write_config_option('user', 'qmk_home')
|
||||
|
||||
# Run `qmk_firmware/bin/qmk doctor` to check the rest of the environment out
|
||||
qmk_bin = cli.args.home / 'bin/qmk'
|
||||
doctor_cmd = [sys.executable, qmk_bin.as_posix(), 'doctor']
|
||||
# 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.yes:
|
||||
doctor_cmd.append('--yes')
|
||||
if cli.args.no:
|
||||
doctor_command.append('-n')
|
||||
|
||||
if cli.args.no:
|
||||
doctor_cmd.append('--no')
|
||||
if cli.args.yes:
|
||||
doctor_command.append('-y')
|
||||
|
||||
subprocess.run(doctor_cmd)
|
||||
cli.run(doctor_command, stdin=None, capture_output=False)
|
||||
|
||||
@@ -1,24 +1,7 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
# Increment the verison number and release a new version of qmk_cli.
|
||||
#
|
||||
# Required packages: pip3 install bumpversion twine
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
PYPI_USERNAME=${PYPI_USERNAME:=skully}
|
||||
FLIT_USERNAME=$PYPI_USERNAME
|
||||
TWINE_USERNAME=$PYPI_USERNAME
|
||||
|
||||
export FLIT_USERNAME TWINE_USERNAME
|
||||
|
||||
rm -f dist/*
|
||||
bumpversion patch
|
||||
git push origin master --tags
|
||||
|
||||
# For now we don't use flit
|
||||
#flit publish
|
||||
|
||||
# Use setuptools until flit works with homebrew
|
||||
python3 setup.py sdist bdist_wheel
|
||||
twine upload dist/qmk-*
|
||||
echo "Use the github action instead!"
|
||||
exit 1
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
bleach==3.3.0
|
||||
bump2version==1.0.1
|
||||
bumpversion==0.6.0
|
||||
certifi==2021.5.30
|
||||
cffi==1.14.5
|
||||
chardet==4.0.0
|
||||
colorama==0.4.4
|
||||
cryptography==3.4.7
|
||||
docutils==0.17.1
|
||||
idna==2.10
|
||||
importlib-metadata==4.6.1
|
||||
jeepney==0.6.0
|
||||
keyring==23.0.1
|
||||
packaging==21.0
|
||||
pkginfo==1.7.0
|
||||
pycparser==2.20
|
||||
Pygments==2.9.0
|
||||
pyparsing==2.4.7
|
||||
readme-renderer==29.0
|
||||
requests==2.25.1
|
||||
requests-toolbelt==0.9.1
|
||||
rfc3986==1.5.0
|
||||
SecretStorage==3.3.1
|
||||
six==1.16.0
|
||||
tqdm==4.61.2
|
||||
twine==3.4.1
|
||||
urllib3==1.26.6
|
||||
webencodings==0.5.1
|
||||
zipp==3.5.0
|
||||
@@ -1,5 +1,5 @@
|
||||
[bumpversion]
|
||||
current_version = 0.0.36
|
||||
current_version = 0.1.1
|
||||
commit = True
|
||||
tag = True
|
||||
tag_name = {new_version}
|
||||
@@ -23,7 +23,7 @@ dist-name = qmk
|
||||
license_file = LICENSE
|
||||
module = qmk_cli
|
||||
home-page = https://github.com/qmk/qmk_cli
|
||||
requires-python = >=3.5
|
||||
requires-python = >=3.7
|
||||
|
||||
[entry_points]
|
||||
qmk = qmk_cli.script_qmk:main
|
||||
|
||||
@@ -7,12 +7,12 @@ metadata = setup_cfg['metadata']
|
||||
|
||||
if __name__ == "__main__":
|
||||
with open('README.md', encoding='utf-8') as readme_file:
|
||||
long_description=readme_file.read()
|
||||
long_description = readme_file.read()
|
||||
setup(
|
||||
name=metadata['dist-name'],
|
||||
description='A program to help users work with QMK Firmware.',
|
||||
entry_points={
|
||||
'console_scripts': ['%s = %s' % l for l in setup_cfg['entry_points'].items()],
|
||||
'console_scripts': ['%s = %s' % i for i in setup_cfg['entry_points'].items()],
|
||||
},
|
||||
license='MIT License',
|
||||
url=metadata['home-page'],
|
||||
@@ -24,7 +24,7 @@ if __name__ == "__main__":
|
||||
long_description=long_description,
|
||||
long_description_content_type="text/markdown",
|
||||
packages=find_packages(),
|
||||
py_modules = ['milc'],
|
||||
py_modules=['qmk_cli'],
|
||||
classifiers=[
|
||||
'Development Status :: 3 - Alpha',
|
||||
'Environment :: Console',
|
||||
@@ -38,16 +38,32 @@ if __name__ == "__main__":
|
||||
'Topic :: Software Development',
|
||||
'Topic :: Utilities',
|
||||
],
|
||||
requires_python=metadata['requires-python'],
|
||||
python_requires=metadata['requires-python'],
|
||||
install_requires=[
|
||||
"appdirs",
|
||||
"argcomplete",
|
||||
"colorama",
|
||||
"flake8",
|
||||
"hjson",
|
||||
"milc>=1.0.8",
|
||||
"nose2",
|
||||
"pygments",
|
||||
"yapf"
|
||||
],
|
||||
"appdirs==1.4.4",
|
||||
"argcomplete==1.12.3",
|
||||
"attrs==21.2.0",
|
||||
"colorama==0.4.4",
|
||||
"coverage==5.5",
|
||||
"dotty-dict==1.3.0",
|
||||
"flake8==3.9.2",
|
||||
"halo==0.0.31",
|
||||
"hid==1.0.4",
|
||||
"hjson==3.0.2",
|
||||
"jsonschema==3.2.0",
|
||||
"log-symbols==0.0.14",
|
||||
"mccabe==0.6.1",
|
||||
"milc==1.4.2",
|
||||
"nose2==0.10.0",
|
||||
"pycodestyle==2.7.0",
|
||||
"pyflakes==2.3.1",
|
||||
"Pygments==2.9.0",
|
||||
"pyrsistent==0.18.0",
|
||||
"pyusb==1.2.0",
|
||||
"setuptools>=45",
|
||||
"six==1.16.0",
|
||||
"spinners==0.0.24",
|
||||
"termcolor==1.1.0",
|
||||
"yapf==0.31.0"
|
||||
]
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user