diff --git a/re.sh b/re.sh new file mode 100755 index 0000000..b20ba22 --- /dev/null +++ b/re.sh @@ -0,0 +1,176 @@ +#! /usr/bin/env sh + +root="/prj/venv" +url="http://localhost:8000" +url_pypi="${url}/pypi/os/simple" + +activate() { + echo + export VIRTUAL_ENV="${1}" + echo "→ ${VIRTUAL_ENV}" + export OLD_PATH="${PATH}" + export PATH="${VIRTUAL_ENV}/bin:${PATH}" + echo "→ ${PATH}" + python3 --version + pip --version +} +caches() { + local command="${1}" + set \ + ".cache/pip" \ + ".cache/uv" \ + ".local/share/pip" \ + ".local/share/uv" + echo + echo "caches:" + for cache in "${@}"; do + "${command}" "${HOME}/${cache}" + done +} +deactivate() { + echo + echo "← ${VIRTUAL_ENV}" + export PATH="${OLD_PATH}" + echo "← ${PATH}" + unset OLD_PATH VIRTUAL_ENV +} +list() { + echo + ls -a -l "${1}/${2}" +} +list_venv() { + list "${1}" "bin" +} +pip_install() { + echo + pip install \ + --index-url "${url_pypi}" \ + --no-cache-dir \ + "${@}" +} +remove() { + rm --force --recursive "${@}" +} +uv_install() { +set \ + "pelican" \ + \ + "hatch" \ + \ + "Sphinx" \ + "sphinx-rtd-theme" \ + \ + "gitlint" \ + \ + "pydoclint" \ + "pylint" \ + "ruff" \ + \ + "pytest" \ + \ + "toml" \ + \ + "twine" \ + \ + "mypy" \ + "pyright" \ + \ + "ruamel.yaml" \ + "PyYAML" \ + "types-PyYAML" + echo + uv pip install --index-url "${url_pypi}" "${@}" +} +uv_python() { + echo + export UV_PYTHON_INSTALL_MIRROR="${url}/cpypy" + uv python install "${2}" + unset UV_PYTHON_INSTALL_MIRROR +} +uv_venv() { + echo + uv venv \ + --allow-existing \ + --index-url "${url_pypi}" \ + --python "${2}" \ + --relocatable \ + --seed \ + "${1}" +} +venvs() { + local action="${1}" + local venv version + set \ + "3.12" \ + "3.11" \ + "3.10" + for version in "${@}"; do + url_pypi="${url}/pypi/${version}/simple" + venv="${root}/${version}" + echo + echo "${venv} ← ${action}" + case "${action}" in + "create") + export UV_PYTHON_INSTALL_DIR="${venv}/cpypy" + echo "→ install python ${version}" + uv_python "${venv}" "${version}" + echo "→ create venv ${version}" + uv_venv "${venv}" "${version}" + unset UV_PYTHON_INSTALL_DIR + ;; + "init") + activate "${venv}" + pip_install "uv" + deactivate + ;; + "install") + activate "${venv}" + uv_install + deactivate + ;; + "link") + activate "${venv}" + for module in "rwx"; do + ln --symbolic \ + "/rwx/rwx/${module}" \ + "${venv}/lib/python${version}/site-packages/${module}" + done + deactivate + ;; + "list") + activate "${venv}" + list_venv "${venv}" + deactivate + ;; + "relate") + absolute="$(readlink -f "${venv}/bin/python")" + prevenv="$(readlink -f "${venv}")" + relative=$(echo "${absolute}" | sed "s|${prevenv}|..|") + ln --force --symbolic "${relative}" "${venv}/bin/python" + ;; + *) ;; + esac + done +} + +caches remove + +remove "${root}" + +os="${root}/os" +python3 -m "venv" "${os}" +activate "${os}" +list_venv "${os}" +pip_install --upgrade "pip" +pip_install "uv" +list_venv "${os}" +venvs create +deactivate + +venvs init +venvs relate +venvs link +venvs install +venvs list + +caches list_venv