Files
unitforge/migrate-to-uv.sh
William Valentin 860f60591c Fix contrast issues with text-muted and bg-dark classes
- Fixed Bootstrap bg-dark class to use better contrasting color
- Added comprehensive text-muted contrast fixes for various contexts
- Improved dark theme colors for better accessibility
- Fixed CSS inheritance issues for code elements in dark contexts
- All color choices meet WCAG AA contrast requirements
2025-09-14 14:58:35 -07:00

284 lines
9.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# UnitForge Migration Script: pip → uv
# Migrates existing UnitForge installations from pip-based to uv-only workflow
set -e
# Load centralized color utility
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${SCRIPT_DIR}/scripts/colors.sh"
echo -e "${BLUE}╔══════════════════════════════════════════════╗${NC}"
echo -e "${BLUE}║ UnitForge Migration to uv v1.1 ║${NC}"
echo -e "${BLUE}║ Upgrading from pip-based workflow ║${NC}"
echo -e "${BLUE}╚══════════════════════════════════════════════╝${NC}"
echo ""
# Function to check if command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to backup files
backup_file() {
local file="$1"
if [[ -f "$file" ]]; then
cp "$file" "${file}.backup.$(date +%Y%m%d_%H%M%S)"
echo -e "${YELLOW} ✓ Backed up $file${NC}"
fi
}
echo -e "${CYAN}🔍 Analyzing current installation...${NC}"
echo ""
# Check if we're in UnitForge directory
if [[ ! -f "pyproject.toml" || ! -f "unitforge-cli" ]]; then
echo -e "${RED}Error: Not in UnitForge project directory${NC}"
echo "Please navigate to your UnitForge project root and try again."
exit 1
fi
echo -e "${GREEN}✓ UnitForge project detected${NC}"
# Check current Python setup
if [[ -d "venv" ]]; then
echo -e "${YELLOW}⚠ Found old 'venv' directory${NC}"
OLD_VENV="venv"
elif [[ -d ".venv" ]]; then
echo -e "${BLUE} Found '.venv' directory${NC}"
OLD_VENV=".venv"
else
echo -e "${BLUE} No existing virtual environment found${NC}"
OLD_VENV=""
fi
# Check for pip-based installations
PIP_INSTALLED=false
if [[ -n "$OLD_VENV" && -f "$OLD_VENV/bin/activate" ]]; then
echo -e "${BLUE}Checking existing environment...${NC}"
# Check if UnitForge is installed in pip mode
if source "$OLD_VENV/bin/activate" 2>/dev/null && pip show unitforge >/dev/null 2>&1; then
PIP_INSTALLED=true
echo -e "${YELLOW}⚠ UnitForge is installed via pip${NC}"
fi
fi
echo ""
echo -e "${CYAN}📋 Migration Plan:${NC}"
echo ""
if [[ -n "$OLD_VENV" ]]; then
echo -e "${YELLOW}1. Backup existing virtual environment${NC}"
fi
echo -e "${YELLOW}2. Install uv package manager${NC}"
echo -e "${YELLOW}3. Create new uv-based environment${NC}"
echo -e "${YELLOW}4. Install dependencies with uv${NC}"
echo -e "${YELLOW}5. Update development scripts${NC}"
echo -e "${YELLOW}6. Verify functionality${NC}"
echo -e "${YELLOW}7. Clean up old environment${NC}"
echo ""
read -p "Proceed with migration? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "Migration cancelled."
exit 0
fi
echo ""
echo -e "${CYAN}🚀 Starting migration...${NC}"
echo ""
# Step 1: Backup existing environment
if [[ -n "$OLD_VENV" ]]; then
echo -e "${BLUE}Step 1: Backing up existing environment...${NC}"
if [[ "$OLD_VENV" == "venv" ]]; then
mv venv venv.backup.$(date +%Y%m%d_%H%M%S)
echo -e "${GREEN}✓ Backed up old 'venv' directory${NC}"
elif [[ "$OLD_VENV" == ".venv" ]]; then
mv .venv .venv.backup.$(date +%Y%m%d_%H%M%S)
echo -e "${GREEN}✓ Backed up old '.venv' directory${NC}"
fi
# Save requirements if possible
if [[ -f "backend/requirements.txt" ]]; then
backup_file "backend/requirements.txt"
fi
echo ""
fi
# Step 2: Install uv
echo -e "${BLUE}Step 2: Installing uv package manager...${NC}"
if command_exists uv; then
UV_VERSION=$(uv --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown")
echo -e "${GREEN}✓ uv ${UV_VERSION} already installed${NC}"
else
echo -e "${YELLOW}Installing uv...${NC}"
if command_exists curl; then
curl -LsSf https://astral.sh/uv/install.sh | sh
elif command_exists wget; then
wget -qO- https://astral.sh/uv/install.sh | sh
else
echo -e "${RED}Error: Neither curl nor wget found${NC}"
echo "Please install uv manually: https://github.com/astral-sh/uv#installation"
exit 1
fi
# Add uv to PATH for current session
export PATH="$HOME/.cargo/bin:$PATH"
if command_exists uv; then
echo -e "${GREEN}✓ uv installed successfully${NC}"
else
echo -e "${RED}Error: uv installation failed${NC}"
echo "Please install uv manually and restart this script"
exit 1
fi
fi
echo ""
# Step 3: Create new uv-based environment
echo -e "${BLUE}Step 3: Creating new uv-based environment...${NC}"
uv venv .venv
echo -e "${GREEN}✓ Created .venv with uv${NC}"
# Step 4: Install dependencies
echo -e "${BLUE}Step 4: Installing dependencies with uv...${NC}"
source .venv/bin/activate
uv pip install -e ".[dev,web]"
success "All dependencies installed with uv"
echo ""
# Step 5: Update development scripts
echo -e "${BLUE}Step 5: Updating development scripts...${NC}"
# Make sure all scripts are executable
chmod +x unitforge-cli
chmod +x start-server.sh
chmod +x setup-dev.sh
chmod +x demo.sh
chmod +x check-uv.sh
echo -e "${GREEN}✓ Scripts updated and made executable${NC}"
echo ""
# Step 6: Verify functionality
echo -e "${BLUE}Step 6: Verifying functionality...${NC}"
# Test CLI
if ./unitforge-cli --help >/dev/null 2>&1; then
echo -e "${GREEN}✓ CLI tool working${NC}"
else
echo -e "${RED}✗ CLI tool test failed${NC}"
fi
# Test template listing
if ./unitforge-cli template list >/dev/null 2>&1; then
echo -e "${GREEN}✓ Template system working${NC}"
else
echo -e "${RED}✗ Template system test failed${NC}"
fi
# Test unit file creation
if ./unitforge-cli create --type service --name migration-test --exec-start "/bin/true" --output migration-test.service >/dev/null 2>&1; then
echo -e "${GREEN}✓ Unit file creation working${NC}"
rm -f migration-test.service
else
echo -e "${RED}✗ Unit file creation test failed${NC}"
fi
# Test pytest
if uv run pytest tests/ --tb=no -q >/dev/null 2>&1; then
echo -e "${GREEN}✓ Test suite working${NC}"
else
echo -e "${YELLOW}⚠ Some tests failed (this may be expected)${NC}"
fi
echo ""
# Step 7: Clean up options
echo -e "${BLUE}Step 7: Cleanup options...${NC}"
echo ""
BACKUP_DIRS=$(find . -maxdepth 1 -name "*.backup.*" -type d 2>/dev/null || true)
BACKUP_FILES=$(find . -maxdepth 2 -name "*.backup.*" -type f 2>/dev/null || true)
if [[ -n "$BACKUP_DIRS" || -n "$BACKUP_FILES" ]]; then
echo -e "${YELLOW}Found backup files/directories:${NC}"
[[ -n "$BACKUP_DIRS" ]] && echo "$BACKUP_DIRS"
[[ -n "$BACKUP_FILES" ]] && echo "$BACKUP_FILES"
echo ""
read -p "Remove backup files? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
[[ -n "$BACKUP_DIRS" ]] && rm -rf $BACKUP_DIRS
[[ -n "$BACKUP_FILES" ]] && rm -f $BACKUP_FILES
echo -e "${GREEN}✓ Backup files removed${NC}"
else
echo -e "${BLUE} Backup files preserved${NC}"
fi
fi
echo ""
echo -e "${GREEN}🎉 Migration to uv completed successfully!${NC}"
echo ""
# Show new workflow
echo -e "${CYAN}📋 New uv-based workflow:${NC}"
echo ""
echo -e "${BLUE}Development commands:${NC}"
echo -e " ${CYAN}make setup-dev # Complete development setup${NC}"
echo -e " ${CYAN}make server # Start development server${NC}"
echo -e " ${CYAN}make test # Run test suite${NC}"
echo -e " ${CYAN}make test-cov # Tests with coverage${NC}"
echo -e " ${CYAN}make lint # Code quality checks${NC}"
echo -e " ${CYAN}make format # Auto-format code${NC}"
echo -e " ${CYAN}make docker-dev # Docker development${NC}"
echo -e " ${CYAN}make clean # Clean cache files${NC}"
echo ""
echo -e "${BLUE}Package management:${NC}"
echo -e " ${CYAN}uv pip install <pkg> # Install package${NC}"
echo -e " ${CYAN}uv pip list # List packages${NC}"
echo -e " ${CYAN}uv pip show <pkg> # Show package info${NC}"
echo -e " ${CYAN}uv venv # Create environment${NC}"
echo ""
echo -e "${BLUE}Key improvements:${NC}"
echo -e " ${GREEN}⚡ 10-100x faster installs${NC}"
echo -e " ${GREEN}🔒 Better dependency resolution${NC}"
echo -e " ${GREEN}🎯 Modern Python standards${NC}"
echo -e " ${GREEN}🛠 Integrated development tools${NC}"
echo -e " ${GREEN}🐳 Optimized Docker workflows${NC}"
echo ""
echo -e "${CYAN}Next steps:${NC}"
echo -e " ${YELLOW}1. Test your workflow: make test${NC}"
echo -e " ${YELLOW}2. Start development: make server${NC}"
echo -e " ${YELLOW}3. Check system status: ./check-uv.sh${NC}"
echo -e " ${YELLOW}4. Read updated README.md${NC}"
echo ""
echo -e "${BLUE}Environment Information:${NC}"
if command_exists uv; then
UV_VERSION=$(uv --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' || echo "unknown")
echo -e " ${CYAN}uv version: ${UV_VERSION}${NC}"
fi
echo -e " ${CYAN}Python version: $(python3 --version | cut -d' ' -f2)${NC}"
echo -e " ${CYAN}Virtual environment: .venv${NC}"
echo -e " ${CYAN}Package manager: uv (no pip fallback)${NC}"
echo ""
echo -e "${GREEN}Welcome to the future of Python development! 🚀${NC}"