From f96d64a81332c0183aa6e1847651f18b54e4abd2 Mon Sep 17 00:00:00 2001 From: Lloyd Date: Tue, 10 Mar 2026 15:37:12 +0000 Subject: [PATCH] Refactor version retrieval and remove legacy PYTHONPATH from service unit --- manage.sh | 87 ++++++++++++------------------------------- pymc-repeater.service | 1 - 2 files changed, 24 insertions(+), 64 deletions(-) diff --git a/manage.sh b/manage.sh index 9c2c090..db119ae 100755 --- a/manage.sh +++ b/manage.sh @@ -96,14 +96,9 @@ is_enabled() { # Function to get current version get_version() { - # Try to read from _version.py first (generated by setuptools_scm) - if [ -f "$INSTALL_DIR/repeater/_version.py" ]; then - grep "^__version__ = version = " "$INSTALL_DIR/repeater/_version.py" | cut -d"'" -f2 2>/dev/null || echo "unknown" - elif [ -f "$INSTALL_DIR/pyproject.toml" ]; then - grep "^version" "$INSTALL_DIR/pyproject.toml" | cut -d'"' -f2 2>/dev/null || echo "unknown" - else - echo "not installed" - fi + # Read version from the pip-installed package in dist-packages + python3 -c "from importlib.metadata import version; print(version('pymc_repeater'))" 2>/dev/null \ + || echo "not installed" } # Function to get service status for display @@ -297,31 +292,7 @@ install_repeater() { wget -qO /usr/local/bin/yq "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/${YQ_BINARY}" 2>/dev/null && chmod +x /usr/local/bin/yq fi - echo "28"; echo "# Generating version file..." - cd "$SCRIPT_DIR" - # Generate version file using setuptools_scm before copying - if [ -d .git ]; then - git fetch --tags >/dev/null 2>&1 || true - # Write the version file that will be copied - python3 -m setuptools_scm >/dev/null 2>&1 || true - python3 -c "from setuptools_scm import get_version; get_version(write_to='repeater/_version.py')" >/dev/null 2>&1 || true - fi - - # Clean up stale bytecode in source directory before copying - find "$SCRIPT_DIR/repeater" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true - find "$SCRIPT_DIR/repeater" -type f -name '*.pyc' -delete 2>/dev/null || true - - echo "29"; echo "# Cleaning old installation files..." - # Remove old repeater directory to ensure clean install - rm -rf "$INSTALL_DIR/repeater" 2>/dev/null || true - # Clean up old Python bytecode - find "$INSTALL_DIR" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true - find "$INSTALL_DIR" -type f -name '*.pyc' -delete 2>/dev/null || true - - echo "30"; echo "# Installing files..." - cp -r "$SCRIPT_DIR/repeater" "$INSTALL_DIR/" - cp "$SCRIPT_DIR/pyproject.toml" "$INSTALL_DIR/" - cp "$SCRIPT_DIR/README.md" "$INSTALL_DIR/" + echo "29"; echo "# Installing files..." cp "$SCRIPT_DIR/manage.sh" "$INSTALL_DIR/" 2>/dev/null || true cp "$SCRIPT_DIR/pymc-repeater.service" "$INSTALL_DIR/" 2>/dev/null || true cp "$SCRIPT_DIR/radio-settings.json" /var/lib/pymc_repeater/ 2>/dev/null || true @@ -393,6 +364,14 @@ export PIP_ROOT_USER_ACTION=ignore # If caller supplied a version string, tell setuptools_scm to use it (sudo # strips env vars so it is passed as a positional argument instead). [ -n "$PRETEND_VERSION" ] && export SETUPTOOLS_SCM_PRETEND_VERSION="$PRETEND_VERSION" +# Migration: remove legacy PYTHONPATH from service unit if present. +# Old installs set PYTHONPATH=/opt/pymc_repeater which caused the service to +# load from a stale source copy instead of the pip-installed dist-packages. +SVC_UNIT=/etc/systemd/system/pymc-repeater.service +if grep -q 'PYTHONPATH' "$SVC_UNIT" 2>/dev/null; then + sed -i '/^Environment=.*PYTHONPATH/d' "$SVC_UNIT" + systemctl daemon-reload +fi exec python3 -m pip install \ --break-system-packages \ --no-cache-dir \ @@ -631,37 +610,11 @@ upgrade_repeater() { fi echo " ✓ Dependencies updated" - echo "[3.5/9] Generating version file..." + echo "[4/9] Installing files..." SCRIPT_DIR="$(dirname "$0")" - cd "$SCRIPT_DIR" - # Generate version file using setuptools_scm before copying - if [ -d .git ]; then - git fetch --tags 2>/dev/null || true - # Write the version file that will be copied - GENERATED_VERSION=$(python3 -m setuptools_scm 2>&1 || echo "unknown (setuptools_scm not available)") - python3 -c "from setuptools_scm import get_version; get_version(write_to='repeater/_version.py')" 2>&1 || echo " Warning: Could not generate _version.py file" - echo " Generated version: $GENERATED_VERSION" - fi - # Clean up stale bytecode in source directory before copying - find "$SCRIPT_DIR/repeater" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true - find "$SCRIPT_DIR/repeater" -type f -name '*.pyc' -delete 2>/dev/null || true - echo " ✓ Version file generated and bytecode cleaned" - - echo "[3.8/9] Cleaning old installation files..." - # Remove old repeater directory to ensure clean upgrade - rm -rf "$INSTALL_DIR/repeater" 2>/dev/null || true - # Clean up old Python bytecode - find "$INSTALL_DIR" -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true - find "$INSTALL_DIR" -type f -name '*.pyc' -delete 2>/dev/null || true - echo " ✓ Old files cleaned" - - echo "[4/9] Installing new files..." - cp -r repeater "$INSTALL_DIR/" 2>/dev/null || true - cp pyproject.toml "$INSTALL_DIR/" 2>/dev/null || true - cp README.md "$INSTALL_DIR/" 2>/dev/null || true - cp pymc-repeater.service /etc/systemd/system/ 2>/dev/null || true - cp radio-settings.json /var/lib/pymc_repeater/ 2>/dev/null || true - cp radio-presets.json /var/lib/pymc_repeater/ 2>/dev/null || true + cp "$SCRIPT_DIR/pymc-repeater.service" /etc/systemd/system/ 2>/dev/null || true + cp "$SCRIPT_DIR/radio-settings.json" /var/lib/pymc_repeater/ 2>/dev/null || true + cp "$SCRIPT_DIR/radio-presets.json" /var/lib/pymc_repeater/ 2>/dev/null || true echo " ✓ Files updated" echo "[5/9] Validating and updating configuration..." @@ -730,6 +683,14 @@ export PIP_ROOT_USER_ACTION=ignore # If caller supplied a version string, tell setuptools_scm to use it (sudo # strips env vars so it is passed as a positional argument instead). [ -n "$PRETEND_VERSION" ] && export SETUPTOOLS_SCM_PRETEND_VERSION="$PRETEND_VERSION" +# Migration: remove legacy PYTHONPATH from service unit if present. +# Old installs set PYTHONPATH=/opt/pymc_repeater which caused the service to +# load from a stale source copy instead of the pip-installed dist-packages. +SVC_UNIT=/etc/systemd/system/pymc-repeater.service +if grep -q 'PYTHONPATH' "$SVC_UNIT" 2>/dev/null; then + sed -i '/^Environment=.*PYTHONPATH/d' "$SVC_UNIT" + systemctl daemon-reload +fi exec python3 -m pip install \ --break-system-packages \ --no-cache-dir \ diff --git a/pymc-repeater.service b/pymc-repeater.service index 80b0456..8ae844a 100644 --- a/pymc-repeater.service +++ b/pymc-repeater.service @@ -11,7 +11,6 @@ Type=simple User=repeater Group=repeater WorkingDirectory=/opt/pymc_repeater -Environment="PYTHONPATH=/opt/pymc_repeater" # Start command - use python module directly with proper path ExecStart=/usr/bin/python3 -m repeater.main --config /etc/pymc_repeater/config.yaml