From 08ab9fb142e9492c3d70c35d16041f265fb39e0e Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Fri, 12 Dec 2025 15:42:25 +0100 Subject: [PATCH] feat(ci): stabilize virgin Arch tests with Makefile install/setup and Nix Git safety MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Switch virgin root/user workflows to use *make install* + *make setup/setup-venv* * Add Git *safe.directory /src* to avoid flake evaluation failures on mounted repos * Enable Nix flake run in workflows and prepare */nix* for non-root execution * Refactor Arch packaging to build in an isolated */tmp* directory via *aur_builder* * Rename installer scripts (*run-** → *dependencies.sh* / *package.sh*) and adjust Docker entry + env var to *REINSTALL_PKGMGR* https://chatgpt.com/share/693c29d9-9b28-800f-a549-5661c783d968 --- .github/workflows/test-virgin-root.yml | 27 ++--- .github/workflows/test-virgin-user.yml | 48 ++++----- Dockerfile | 11 +-- Makefile | 35 ++++--- scripts/docker/entry.sh | 14 +-- scripts/installation/arch/package.sh | 62 +++++++++--- .../{run-dependencies.sh => dependencies.sh} | 0 scripts/installation/main.sh | 92 ++--------------- .../{run-package.sh => package.sh} | 10 +- scripts/installation/venv-create.sh | 86 ---------------- scripts/setup/nix.sh | 9 ++ scripts/setup/venv.sh | 98 +++++++++++++++++++ scripts/test/test-e2e.sh | 2 +- scripts/test/test-env-nix.sh | 2 +- scripts/test/test-env-virtual.sh | 2 +- scripts/test/test-integration.sh | 2 +- scripts/test/test-unit.sh | 2 +- 17 files changed, 233 insertions(+), 269 deletions(-) rename scripts/installation/{run-dependencies.sh => dependencies.sh} (100%) rename scripts/installation/{run-package.sh => package.sh} (65%) delete mode 100644 scripts/installation/venv-create.sh create mode 100644 scripts/setup/nix.sh create mode 100644 scripts/setup/venv.sh diff --git a/.github/workflows/test-virgin-root.yml b/.github/workflows/test-virgin-root.yml index cc69763..ba1e976 100644 --- a/.github/workflows/test-virgin-root.yml +++ b/.github/workflows/test-virgin-root.yml @@ -19,8 +19,6 @@ jobs: run: | set -euo pipefail - echo ">>> Starting virgin ArchLinux container test (root, with shared caches)..." - docker run --rm \ -v "$PWD":/src \ -v pkgmgr_repos:/root/Repositories \ @@ -30,29 +28,22 @@ jobs: bash -lc ' set -euo pipefail - echo ">>> Updating and upgrading Arch system..." - pacman -Syu --noconfirm git python python-pip nix >/dev/null + pacman -Syu --noconfirm git python python-pip nix make - echo ">>> Creating isolated virtual environment for pkgmgr..." - python -m venv /tmp/pkgmgr-venv + # Fix: allow git operations on mounted repo path + git config --global --add safe.directory /src - echo ">>> Activating virtual environment..." - source /tmp/pkgmgr-venv/bin/activate + make install + make setup - echo ">>> Upgrading pip (cached)..." - python -m pip install --upgrade pip >/dev/null + . "$HOME/.venvs/pkgmgr/bin/activate" - echo ">>> Installing pkgmgr from current source tree (cached pip)..." - python -m pip install /src >/dev/null - - echo ">>> Enabling Nix experimental features..." export NIX_CONFIG="experimental-features = nix-command flakes" - echo ">>> Running: pkgmgr update pkgmgr --clone-mode shallow --no-verification" pkgmgr update pkgmgr --clone-mode shallow --no-verification - - echo ">>> Running: pkgmgr version pkgmgr" pkgmgr version pkgmgr - echo ">>> Virgin Arch (root) test completed successfully." + echo ">>> Running Nix-based: nix run .#pkgmgr -- version pkgmgr" + nix run /src#pkgmgr -- version pkgmgr ' + diff --git a/.github/workflows/test-virgin-user.yml b/.github/workflows/test-virgin-user.yml index c1c2912..a981f6f 100644 --- a/.github/workflows/test-virgin-user.yml +++ b/.github/workflows/test-virgin-user.yml @@ -19,55 +19,47 @@ jobs: run: | set -euo pipefail - echo ">>> Starting virgin ArchLinux container test (non-root user with sudo)..." - docker run --rm \ -v "$PWD":/src \ + -w /src \ archlinux:latest \ bash -lc ' set -euo pipefail - echo ">>> [root] Updating and upgrading Arch system..." - pacman -Syu --noconfirm git python python-pip sudo base-devel debugedit + pacman -Syu --noconfirm git python python-pip sudo base-devel debugedit nix make + + make install - echo ">>> [root] Creating non-root user dev..." useradd -m dev - - echo ">>> [root] Allowing passwordless sudo for dev..." echo "dev ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/dev chmod 0440 /etc/sudoers.d/dev - - echo ">>> [root] Adjusting ownership of /src for dev..." chown -R dev:dev /src - echo ">>> [root] Running pkgmgr flow as non-root user dev..." - sudo -u dev env PKGMGR_DISABLE_NIX_FLAKE_INSTALLER=1 bash -lc " + # --- make Nix usable for non-root inside this container --- + mkdir -p /nix/store /nix/var/nix /nix/var/log/nix /nix/var/nix/profiles + chown -R dev:dev /nix + chmod 0755 /nix + chmod 1777 /nix/store + + sudo -H -u dev env HOME=/home/dev PKGMGR_DISABLE_NIX_FLAKE_INSTALLER=1 bash -lc " set -euo pipefail cd /src echo \">>> [dev] Using user: \$(whoami)\" - echo \">>> [dev] Running scripts/installation/main.sh...\" - bash scripts/installation/main.sh + + echo \">>> [dev] Running make setup-venv...\" + make setup-venv echo \">>> [dev] Activating venv...\" . \"\$HOME/.venvs/pkgmgr/bin/activate\" - echo \">>> [dev] Installing pkgmgr into venv via pip...\" - python -m pip install /src >/dev/null - - echo \">>> [dev] PKGMGR_DISABLE_NIX_FLAKE_INSTALLER=\$PKGMGR_DISABLE_NIX_FLAKE_INSTALLER\" - echo \">>> [dev] Updating managed repo package-manager via pkgmgr...\" - pkgmgr update pkgmgr --clone-mode shallow --no-verification - - echo \">>> [dev] PATH:\" - echo \"\$PATH\" - - echo \">>> [dev] which pkgmgr:\" - which pkgmgr || echo \">>> [dev] pkgmgr not found in PATH\" - echo \">>> [dev] Running: pkgmgr version pkgmgr\" pkgmgr version pkgmgr - " - echo ">>> [root] Container flow finished." + echo \">>> [dev] Running Nix-based pkgmgr version...\" + export NIX_REMOTE=local + export NIX_CONFIG=\"experimental-features = nix-command flakes\" + nix run /src#pkgmgr -- version pkgmgr + " ' + diff --git a/Dockerfile b/Dockerfile index 76f90d9..6443b15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,10 +15,6 @@ RUN echo "BASE_IMAGE=${BASE_IMAGE}" && \ # ------------------------------------------------------------ ENV NIX_CONFIG="experimental-features = nix-command flakes" -# ------------------------------------------------------------ -# Unprivileged user for Arch package build (makepkg) -# ------------------------------------------------------------ -RUN useradd -m aur_builder || true # ------------------------------------------------------------ # Copy scripts and install distro dependencies @@ -29,20 +25,17 @@ WORKDIR /build COPY scripts/ scripts/ RUN find scripts -type f -name '*.sh' -exec chmod +x {} \; -# Install distro-specific build dependencies (and AUR builder on Arch) -RUN scripts/installation/run-dependencies.sh - # ------------------------------------------------------------ # Select distro-specific Docker entrypoint # ------------------------------------------------------------ -# Docker entrypoint (distro-agnostic, nutzt run-package.sh) +# Docker entrypoint (distro-agnostic, nutzt package.sh) # ------------------------------------------------------------ COPY scripts/docker/entry.sh /usr/local/bin/docker-entry.sh RUN chmod +x /usr/local/bin/docker-entry.sh # ------------------------------------------------------------ # Build and install distro-native package-manager package -# via Makefile `install` target (calls scripts/installation/run-package.sh) +# via Makefile `install` target # ------------------------------------------------------------ COPY . . RUN find scripts -type f -name '*.sh' -exec chmod +x {} \; diff --git a/Makefile b/Makefile index 1423e4c..333ef53 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ -.PHONY: install setup uninstall \ - test build build-no-cache build-no-cache-all build-missing delete-volumes purge \ - test-unit test-e2e test-integration test-env-virtual test-env-nix +.PHONY: install uninstall \ + build build-no-cache build-no-cache-all build-missing \ + delete-volumes purge \ + test test-unit test-e2e test-integration test-env-virtual test-env-nix \ + setup setup-venv setup-nix # Distro # Options: arch debian ubuntu fedora centos @@ -30,11 +32,27 @@ TEST_PATTERN := test_*.py export TEST_PATTERN # ------------------------------------------------------------ -# PKGMGR setup (developer wrapper -> scripts/installation/main.sh) +# System install # ------------------------------------------------------------ -setup: +install: + @echo "Building and installing distro-native package-manager for this system..." @bash scripts/installation/main.sh +# ------------------------------------------------------------ +# PKGMGR setup +# ------------------------------------------------------------ + +# Default: keep current auto-detection behavior +setup: setup-nix setup-venv + +# Explicit: developer setup (Python venv + shell RC + main.py install) +setup-venv: + @bash scripts/setup/venv.sh + +# Explicit: Nix shell mode (no venv, no RC changes) +setup-nix: + @bash scripts/setup/nix.sh + # ------------------------------------------------------------ # Docker build targets (delegated to scripts/build) # ------------------------------------------------------------ @@ -85,13 +103,6 @@ delete-volumes: purge: delete-volumes build-no-cache -# ------------------------------------------------------------ -# System install (native packages, calls scripts/installation/run-package.sh) -# ------------------------------------------------------------ -install: - @echo "Building and installing distro-native package-manager for this system..." - @bash scripts/installation/run-package.sh - # ------------------------------------------------------------ # Uninstall target # ------------------------------------------------------------ diff --git a/scripts/docker/entry.sh b/scripts/docker/entry.sh index 5517156..196ce42 100755 --- a/scripts/docker/entry.sh +++ b/scripts/docker/entry.sh @@ -68,16 +68,10 @@ cd /src # --------------------------------------------------------------------------- # DEV mode: rebuild package-manager from the mounted /src tree # --------------------------------------------------------------------------- -if [[ "${PKGMGR_DEV:-0}" == "1" ]]; then - echo "[docker] DEV mode enabled (PKGMGR_DEV=1)" - echo "[docker] Rebuilding package-manager from /src via scripts/installation/run-package.sh..." - - if [[ -x scripts/installation/run-package.sh ]]; then - bash scripts/installation/run-package.sh - else - echo "[docker] ERROR: scripts/installation/run-package.sh not found or not executable" - exit 1 - fi +if [[ "${REINSTALL_PKGMGR:-0}" == "1" ]]; then + echo "[docker] DEV mode enabled (REINSTALL_PKGMGR=1)" + echo "[docker] Rebuilding package-manager from /src via scripts/installation/package.sh..." + bash scripts/installation/package.sh || exit 1 fi # --------------------------------------------------------------------------- diff --git a/scripts/installation/arch/package.sh b/scripts/installation/arch/package.sh index 3a902b3..7a6304e 100755 --- a/scripts/installation/arch/package.sh +++ b/scripts/installation/arch/package.sh @@ -1,30 +1,64 @@ #!/usr/bin/env bash set -euo pipefail -echo "[arch/package] Building Arch package (makepkg --nodeps)..." +echo "[arch/package] Building Arch package (makepkg --nodeps) in an isolated build dir..." SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)" -PKG_DIR="${PROJECT_ROOT}/packaging/arch" -if [[ ! -f "${PKG_DIR}/PKGBUILD" ]]; then - echo "[arch/package] ERROR: PKGBUILD not found in ${PKG_DIR}" +# We must not build inside /src (mounted repo). Build in /tmp to avoid permission issues. +BUILD_ROOT="/tmp/package-manager-arch-build" +PKG_SRC_DIR="${PROJECT_ROOT}/packaging/arch" +PKG_BUILD_DIR="${BUILD_ROOT}/packaging/arch" + +if [[ ! -f "${PKG_SRC_DIR}/PKGBUILD" ]]; then + echo "[arch/package] ERROR: PKGBUILD not found in ${PKG_SRC_DIR}" exit 1 fi -cd "${PKG_DIR}" +echo "[arch/package] Preparing build directory: ${BUILD_ROOT}" +rm -rf "${BUILD_ROOT}" +mkdir -p "${BUILD_ROOT}" -if id aur_builder >/dev/null 2>&1; then - echo "[arch/package] Using 'aur_builder' user for makepkg..." - chown -R aur_builder:aur_builder "${PKG_DIR}" - su aur_builder -c "cd '${PKG_DIR}' && rm -f package-manager-*.pkg.tar.* && makepkg --noconfirm --clean --nodeps" -else - echo "[arch/package] WARNING: user 'aur_builder' not found, running makepkg as current user..." - rm -f package-manager-*.pkg.tar.* - makepkg --noconfirm --clean --nodeps +echo "[arch/package] Syncing project sources to ${BUILD_ROOT}..." +# Keep it simple: copy everything; adjust excludes if needed later. +rsync -a --delete \ + --exclude '.git' \ + --exclude '.venv' \ + --exclude '.venvs' \ + --exclude '__pycache__' \ + --exclude '*.pyc' \ + "${PROJECT_ROOT}/" "${BUILD_ROOT}/" + +if [[ ! -d "${PKG_BUILD_DIR}" ]]; then + echo "[arch/package] ERROR: Build PKG dir missing: ${PKG_BUILD_DIR}" + exit 1 fi +# ------------------------------------------------------------ +# Unprivileged user for Arch package build (makepkg) +# ------------------------------------------------------------ +if ! id aur_builder >/dev/null 2>&1; then + echo "[arch/package] ERROR: user 'aur_builder' not found. Run scripts/installation/arch/aur-builder-setup.sh first." + exit 1 +fi + +echo "[arch/package] Using 'aur_builder' user for makepkg..." +chown -R aur_builder:aur_builder "${BUILD_ROOT}" + +echo "[arch/package] Running makepkg in: ${PKG_BUILD_DIR}" +su aur_builder -c "cd '${PKG_BUILD_DIR}' && rm -f package-manager-*.pkg.tar.* && makepkg --noconfirm --clean --nodeps" + echo "[arch/package] Installing generated Arch package..." -pacman -U --noconfirm package-manager-*.pkg.tar.* +pkg_path="$(find "${PKG_BUILD_DIR}" -maxdepth 1 -type f -name 'package-manager-*.pkg.tar.*' | head -n1)" +if [[ -z "${pkg_path}" ]]; then + echo "[arch/package] ERROR: Built package not found in ${PKG_BUILD_DIR}" + exit 1 +fi + +pacman -U --noconfirm "${pkg_path}" + +echo "[arch/package] Cleanup build directory..." +rm -rf "${BUILD_ROOT}" echo "[arch/package] Done." diff --git a/scripts/installation/run-dependencies.sh b/scripts/installation/dependencies.sh similarity index 100% rename from scripts/installation/run-dependencies.sh rename to scripts/installation/dependencies.sh diff --git a/scripts/installation/main.sh b/scripts/installation/main.sh index c8559de..f38669b 100755 --- a/scripts/installation/main.sh +++ b/scripts/installation/main.sh @@ -1,87 +1,15 @@ #!/usr/bin/env bash set -euo pipefail -# ------------------------------------------------------------ -# main.sh -# -# Developer / system setup entrypoint. -# -# Responsibilities: -# - If inside a Nix shell (IN_NIX_SHELL=1): -# * Skip venv creation and dependency installation -# * Run `python3 main.py install` -# - If running as root (EUID=0): -# * Run system-level installer (run-package.sh) -# - Otherwise (normal user): -# * Create ~/.venvs/pkgmgr virtual environment if missing -# * Install Python dependencies into that venv -# * Append auto-activation to ~/.bashrc and ~/.zshrc -# * Run `main.py install` using the venv Python -# ------------------------------------------------------------ - -echo "[installation/main] Starting setup..." - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -cd "${PROJECT_ROOT}" - -VENV_DIR="${HOME}/.venvs/pkgmgr" -RC_LINE='if [ -d "${HOME}/.venvs/pkgmgr" ]; then . "${HOME}/.venvs/pkgmgr/bin/activate"; if [ -n "${PS1:-}" ]; then echo "Global Python virtual environment '\''~/.venvs/pkgmgr'\'' activated."; fi; fi' - -# ------------------------------------------------------------ -# 1) Nix shell mode: do not touch venv, only run main.py install -# ------------------------------------------------------------ -if [[ -n "${IN_NIX_SHELL:-}" ]]; then - echo "[installation/main] Nix shell detected (IN_NIX_SHELL=1)." - echo "[installation/main] Skipping virtualenv creation and dependency installation." - echo "[installation/main] Running main.py install via system python3..." - python3 main.py install - echo "[installation/main] Setup finished (Nix mode)." - exit 0 +if [[ "${EUID:-$(id -u)}" -ne 0 ]]; then + echo "[installation/install] Warning: Installation is just possible via root." + exit 0 fi -# ------------------------------------------------------------ -# 2) Root mode: system / distro-level installation -# ------------------------------------------------------------ -if [[ "${EUID:-$(id -u)}" -eq 0 ]]; then - echo "[installation/main] Running as root (EUID=0)." - echo "[installation/main] Skipping user virtualenv and shell RC modifications." - echo "[installation/main] Delegating to scripts/installation/run-package.sh..." - bash scripts/installation/run-package.sh - echo "[installation/main] Root/system setup complete." - exit 0 -fi - -# ------------------------------------------------------------ -# 3) Normal user mode: dev setup with venv -# ------------------------------------------------------------ - -echo "[installation/main] Running in normal user mode (developer setup)." - -echo "[installation/main] Ensuring main.py is executable..." -chmod +x main.py || true - -echo "[installation/main] Ensuring global virtualenv root: ${HOME}/.venvs" -mkdir -p "${HOME}/.venvs" - -echo "[installation/main] Creating/updating virtualenv via helper..." -PKGMGR_VENV_DIR="${VENV_DIR}" bash scripts/installation/venv-create.sh - -echo "[installation/main] Ensuring ~/.bashrc and ~/.zshrc exist..." -touch "${HOME}/.bashrc" "${HOME}/.zshrc" - -echo "[installation/main] Ensuring venv auto-activation is present in shell rc files..." -for rc in "${HOME}/.bashrc" "${HOME}/.zshrc"; do - if ! grep -qxF "${RC_LINE}" "$rc"; then - echo "${RC_LINE}" >> "$rc" - echo "[installation/main] Appended auto-activation to $rc" - else - echo "[installation/main] Auto-activation already present in $rc" - fi -done - -echo "[installation/main] Running main.py install via venv Python..." -"${VENV_DIR}/bin/python" main.py install - -echo -echo "[installation/main] Developer setup complete." -echo "Restart your shell (or run 'exec bash' or 'exec zsh') to activate the environment." +echo "[installation] Running as root (EUID=0)." +echo "[installation] Install Package Dependencies..." +bash scripts/installation/dependencies.sh +echo "[installation] Install Distribution Package..." +bash scripts/installation/package.sh +echo "[installation] Root/system setup complete." +exit 0 diff --git a/scripts/installation/run-package.sh b/scripts/installation/package.sh similarity index 65% rename from scripts/installation/run-package.sh rename to scripts/installation/package.sh index d782232..b006046 100755 --- a/scripts/installation/run-package.sh +++ b/scripts/installation/package.sh @@ -10,26 +10,26 @@ OS_ID="$(detect_os_id)" # Map Manjaro to Arch if [[ "${OS_ID}" == "manjaro" ]]; then - echo "[run-package] Mapping OS 'manjaro' → 'arch'" + echo "[package] Mapping OS 'manjaro' → 'arch'" OS_ID="arch" fi -echo "[run-package] Detected OS: ${OS_ID}" +echo "[package] Detected OS: ${OS_ID}" case "${OS_ID}" in arch|debian|ubuntu|fedora|centos) PKG_SCRIPT="${SCRIPT_DIR}/${OS_ID}/package.sh" ;; *) - echo "[run-package] Unsupported OS: ${OS_ID}" + echo "[package] Unsupported OS: ${OS_ID}" exit 1 ;; esac if [[ ! -f "${PKG_SCRIPT}" ]]; then - echo "[run-package] Package script not found: ${PKG_SCRIPT}" + echo "[package] Package script not found: ${PKG_SCRIPT}" exit 1 fi -echo "[run-package] Executing: ${PKG_SCRIPT}" +echo "[package] Executing: ${PKG_SCRIPT}" exec bash "${PKG_SCRIPT}" diff --git a/scripts/installation/venv-create.sh b/scripts/installation/venv-create.sh deleted file mode 100644 index 4c712a5..0000000 --- a/scripts/installation/venv-create.sh +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -# venv-create.sh -# -# Create/update a Python virtual environment for pkgmgr and install dependencies. -# -# Priority order: -# 1) pyproject.toml -> pip install (editable by default) -# 2) requirements.txt -# 3) _requirements.txt (legacy) -# -# Usage: -# PKGMGR_VENV_DIR=/home/dev/.venvs/pkgmgr bash scripts/installation/venv-create.sh -# or -# bash scripts/installation/venv-create.sh /home/dev/.venvs/pkgmgr -# -# Optional: -# PKGMGR_PIP_EDITABLE=0 # install non-editable (default: 1) -# PKGMGR_PIP_EXTRAS="dev,test" # install extras: .[dev,test] -# PKGMGR_PREFER_NIX=1 # print Nix hint and exit non-zero - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -cd "${PROJECT_ROOT}" - -VENV_DIR="${PKGMGR_VENV_DIR:-${1:-${HOME}/.venvs/pkgmgr}}" -PIP_EDITABLE="${PKGMGR_PIP_EDITABLE:-1}" -PIP_EXTRAS="${PKGMGR_PIP_EXTRAS:-}" -PREFER_NIX="${PKGMGR_PREFER_NIX:-0}" - -echo "[venv-create] Using VENV_DIR=${VENV_DIR}" - -if [[ "${PREFER_NIX}" == "1" ]]; then - echo "[venv-create] PKGMGR_PREFER_NIX=1 set." - echo "[venv-create] Hint: Use Nix instead of a venv for reproducible installs:" - echo "[venv-create] nix develop" - echo "[venv-create] nix run .#pkgmgr -- --help" - exit 2 -fi - -echo "[venv-create] Ensuring virtualenv parent directory exists..." -mkdir -p "$(dirname "${VENV_DIR}")" - -if [[ ! -d "${VENV_DIR}" ]]; then - echo "[venv-create] Creating virtual environment at: ${VENV_DIR}" - python3 -m venv "${VENV_DIR}" -else - echo "[venv-create] Virtual environment already exists at: ${VENV_DIR}" -fi - -echo "[venv-create] Installing Python tooling into venv..." -"${VENV_DIR}/bin/python" -m ensurepip --upgrade -"${VENV_DIR}/bin/pip" install --upgrade pip setuptools wheel - -# --------------------------------------------------------------------------- -# Install dependencies -# --------------------------------------------------------------------------- -if [[ -f "pyproject.toml" ]]; then - echo "[venv-create] Detected pyproject.toml. Installing project via pip..." - - target="." - if [[ -n "${PIP_EXTRAS}" ]]; then - target=".[${PIP_EXTRAS}]" - fi - - if [[ "${PIP_EDITABLE}" == "1" ]]; then - echo "[venv-create] pip install -e ${target}" - "${VENV_DIR}/bin/pip" install -e "${target}" - else - echo "[venv-create] pip install ${target}" - "${VENV_DIR}/bin/pip" install "${target}" - fi - -elif [[ -f "requirements.txt" ]]; then - echo "[venv-create] Installing dependencies from requirements.txt..." - "${VENV_DIR}/bin/pip" install -r requirements.txt - -elif [[ -f "_requirements.txt" ]]; then - echo "[venv-create] Installing dependencies from _requirements.txt (legacy)..." - "${VENV_DIR}/bin/pip" install -r _requirements.txt - -else - echo "[venv-create] No pyproject.toml, requirements.txt, or _requirements.txt found. Skipping dependency installation." -fi - -echo "[venv-create] Done." diff --git a/scripts/setup/nix.sh b/scripts/setup/nix.sh new file mode 100644 index 0000000..d3dd5ba --- /dev/null +++ b/scripts/setup/nix.sh @@ -0,0 +1,9 @@ +# ------------------------------------------------------------ +# Nix shell mode: do not touch venv, only run main.py install +# ------------------------------------------------------------ + +echo "[setup] Nix mode enabled (NIX_ENABLED=1)." +echo "[setup] Skipping virtualenv creation and dependency installation." +echo "[setup] Running main.py install via system python3..." +python3 main.py install +echo "[setup] Setup finished (Nix mode)." diff --git a/scripts/setup/venv.sh b/scripts/setup/venv.sh new file mode 100644 index 0000000..a1f3a7a --- /dev/null +++ b/scripts/setup/venv.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "[setup] Starting setup..." + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "${PROJECT_ROOT}" + +VENV_DIR="${HOME}/.venvs/pkgmgr" +RC_LINE='if [ -d "${HOME}/.venvs/pkgmgr" ]; then . "${HOME}/.venvs/pkgmgr/bin/activate"; if [ -n "${PS1:-}" ]; then echo "Global Python virtual environment '\''~/.venvs/pkgmgr'\'' activated."; fi; fi' + +# ------------------------------------------------------------ +# Normal user mode: dev setup with venv +# ------------------------------------------------------------ + +echo "[setup] Running in normal user mode (developer setup)." + +echo "[setup] Ensuring main.py is executable..." +chmod +x main.py || true + +echo "[setup] Ensuring global virtualenv root: ${HOME}/.venvs" +mkdir -p "${HOME}/.venvs" + +echo "[setup] Creating/updating virtualenv via helper..." +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +cd "${PROJECT_ROOT}" + +PIP_EDITABLE="${PKGMGR_PIP_EDITABLE:-1}" +PIP_EXTRAS="${PKGMGR_PIP_EXTRAS:-}" +PREFER_NIX="${PKGMGR_PREFER_NIX:-0}" + +echo "[venv] Using VENV_DIR=${VENV_DIR}" + +if [[ "${PREFER_NIX}" == "1" ]]; then + echo "[venv] PKGMGR_PREFER_NIX=1 set." + echo "[venv] Hint: Use Nix instead of a venv for reproducible installs:" + echo "[venv] nix develop" + echo "[venv] nix run .#pkgmgr -- --help" + exit 2 +fi + +echo "[venv] Ensuring virtualenv parent directory exists..." +mkdir -p "$(dirname "${VENV_DIR}")" + +if [[ ! -d "${VENV_DIR}" ]]; then + echo "[venv] Creating virtual environment at: ${VENV_DIR}" + python3 -m venv "${VENV_DIR}" +else + echo "[venv] Virtual environment already exists at: ${VENV_DIR}" +fi + +echo "[venv] Installing Python tooling into venv..." +"${VENV_DIR}/bin/python" -m ensurepip --upgrade +"${VENV_DIR}/bin/pip" install --upgrade pip setuptools wheel + +# --------------------------------------------------------------------------- +# Install dependencies +# --------------------------------------------------------------------------- +if [[ -f "pyproject.toml" ]]; then + echo "[venv] Detected pyproject.toml. Installing project via pip..." + + target="." + if [[ -n "${PIP_EXTRAS}" ]]; then + target=".[${PIP_EXTRAS}]" + fi + + if [[ "${PIP_EDITABLE}" == "1" ]]; then + echo "[venv] pip install -e ${target}" + "${VENV_DIR}/bin/pip" install -e "${target}" + else + echo "[venv] pip install ${target}" + "${VENV_DIR}/bin/pip" install "${target}" + fi +else + echo "[venv] No pyproject.toml found. Skipping dependency installation." +fi + +echo "[venv] Done." + +echo "[setup] Ensuring ~/.bashrc and ~/.zshrc exist..." +touch "${HOME}/.bashrc" "${HOME}/.zshrc" + +echo "[setup] Ensuring venv auto-activation is present in shell rc files..." +for rc in "${HOME}/.bashrc" "${HOME}/.zshrc"; do + if ! grep -qxF "${RC_LINE}" "$rc"; then + echo "${RC_LINE}" >> "$rc" + echo "[setup] Appended auto-activation to $rc" + else + echo "[setup] Auto-activation already present in $rc" + fi +done + +echo "[setup] Running main.py install via venv Python..." +"${VENV_DIR}/bin/python" main.py install + +echo +echo "[setup] Developer setup complete." +echo "Restart your shell (or run 'exec bash' or 'exec zsh') to activate the environment." \ No newline at end of file diff --git a/scripts/test/test-e2e.sh b/scripts/test/test-e2e.sh index 28f66d2..6e5bd6a 100755 --- a/scripts/test/test-e2e.sh +++ b/scripts/test/test-e2e.sh @@ -9,7 +9,7 @@ docker run --rm \ -v "$(pwd):/src" \ -v "pkgmgr_nix_store_${distro}:/nix" \ -v "pkgmgr_nix_cache_${distro}:/root/.cache/nix" \ - -e PKGMGR_DEV=1 \ + -e REINSTALL_PKGMGR=1 \ -e TEST_PATTERN="${TEST_PATTERN}" \ --workdir /src \ "package-manager-test-${distro}" \ diff --git a/scripts/test/test-env-nix.sh b/scripts/test/test-env-nix.sh index c71ea37..14dd59e 100644 --- a/scripts/test/test-env-nix.sh +++ b/scripts/test/test-env-nix.sh @@ -13,7 +13,7 @@ docker run --rm \ -v "pkgmgr_nix_store_${distro}:/nix" \ -v "pkgmgr_nix_cache_${distro}:/root/.cache/nix" \ --workdir /src \ - -e PKGMGR_DEV=0 \ + -e REINSTALL_PKGMGR=1 \ "${IMAGE}" \ bash -lc ' set -euo pipefail diff --git a/scripts/test/test-env-virtual.sh b/scripts/test/test-env-virtual.sh index 25e6ad3..a50662e 100755 --- a/scripts/test/test-env-virtual.sh +++ b/scripts/test/test-env-virtual.sh @@ -15,7 +15,7 @@ echo # Run the command and capture the output if OUTPUT=$(docker run --rm \ - -e PKGMGR_DEV=1 \ + -e REINSTALL_PKGMGR=1 \ -v pkgmgr_nix_store_${distro}:/nix \ -v "$(pwd):/src" \ -v "pkgmgr_nix_cache_${distro}:/root/.cache/nix" \ diff --git a/scripts/test/test-integration.sh b/scripts/test/test-integration.sh index 75141de..a4fa60e 100755 --- a/scripts/test/test-integration.sh +++ b/scripts/test/test-integration.sh @@ -10,7 +10,7 @@ docker run --rm \ -v pkgmgr_nix_store_${distro}:/nix \ -v "pkgmgr_nix_cache_${distro}:/root/.cache/nix" \ --workdir /src \ - -e PKGMGR_DEV=1 \ + -e REINSTALL_PKGMGR=1 \ -e TEST_PATTERN="${TEST_PATTERN}" \ "package-manager-test-${distro}" \ bash -lc ' diff --git a/scripts/test/test-unit.sh b/scripts/test/test-unit.sh index 68a406b..5b8ec32 100755 --- a/scripts/test/test-unit.sh +++ b/scripts/test/test-unit.sh @@ -10,7 +10,7 @@ docker run --rm \ -v "pkgmgr_nix_cache_${distro}:/root/.cache/nix" \ -v pkgmgr_nix_store_${distro}:/nix \ --workdir /src \ - -e PKGMGR_DEV=1 \ + -e REINSTALL_PKGMGR=1 \ -e TEST_PATTERN="${TEST_PATTERN}" \ "package-manager-test-${distro}" \ bash -lc '