Loading...
No commits yet
Not committed History
Blame
update.sh • 5.8 KB
#!/bin/bash
# -*- coding: utf-8 -*-
# Timestamp: "2025-11-09 19:00:00 (ywatanabe)"
# File: ./scripts/maintenance/update.sh
# Description: Update scitex-writer while preserving user content

set -e

ORIG_DIR="$(pwd)"
THIS_DIR="$(cd $(dirname ${BASH_SOURCE[0]}) && pwd)"
PROJECT_ROOT="$(cd $THIS_DIR/.. && pwd)"

GIT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null)"

GRAY='\033[0;90m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color

echo_info() { echo -e "${GRAY}INFO: $1${NC}"; }
echo_success() { echo -e "${GREEN}SUCC: $1${NC}"; }
echo_warning() { echo -e "${YELLOW}WARN: $1${NC}"; }
echo_error() { echo -e "${RED}ERRO: $1${NC}"; }
echo_header() { echo_info "=== $1 ==="; }
# ---------------------------------------

# Read current version from pyproject.toml (single source of truth)
PYPROJECT_FILE="${PROJECT_ROOT}/pyproject.toml"
if [ -f "$PYPROJECT_FILE" ]; then
    if command -v yq &> /dev/null; then
        CURRENT_VERSION=$(yq -r '.project.version' "$PYPROJECT_FILE" 2>/dev/null || echo "unknown")
    else
        CURRENT_VERSION=$(grep '^version = ' "$PYPROJECT_FILE" | sed 's/version = "\(.*\)"/\1/' | head -1 | tr -d '"' | tr -d '[:space:]')
    fi
else
    CURRENT_VERSION="unknown"
fi

echo
echo_header "SciTeX Writer Update Tool"
echo_info "Current version: v${CURRENT_VERSION}"
echo

# Check if we're in a git repository
if [ ! -d "${PROJECT_ROOT}/.git" ]; then
    echo_error "Not a git repository. Please clone from GitHub:"
    echo_error "  git clone https://github.com/ywatanabe1989/scitex-writer.git"
    exit 1
fi

# Fetch latest changes
echo_info "Checking for updates..."
git fetch origin main 2>/dev/null || {
    echo_error "Failed to fetch updates. Check your network connection."
    exit 1
}

# Get remote version from pyproject.toml
REMOTE_VERSION=$(git show origin/main:pyproject.toml 2>/dev/null | grep '^version = ' | sed 's/version = "\(.*\)"/\1/' | head -1 | tr -d '"' | tr -d '[:space:]' || echo "unknown")
echo_info "Latest version: v${REMOTE_VERSION}"
echo

# Check if update is needed
if [ "$CURRENT_VERSION" == "$REMOTE_VERSION" ]; then
    echo_success "Already up to date (v${CURRENT_VERSION})"
    exit 0
fi

# Show what will be updated
echo_warning "Update available: v${CURRENT_VERSION} → v${REMOTE_VERSION}"
echo
echo_info "What will be updated:"
echo_info "  ✓ scripts/         (shell scripts)"
echo_info "  ✓ config/          (configuration files)"
echo_info "  ✓ docs/            (documentation)"
echo_info "  ✓ Makefile         (build system)"
echo_info "  ✓ VERSION          (version file)"
echo
echo_info "What will be preserved:"
echo_info "  ✓ 01_manuscript/contents/    (your manuscript)"
echo_info "  ✓ 02_supplementary/contents/ (your supplementary)"
echo_info "  ✓ 03_revision/contents/      (your revision)"
echo_info "  ✓ 00_shared/bib_files/          (your bibliography)"
echo_info "  ✓ archive/                   (your archived versions)"
echo

# Ask for confirmation
read -p "Proceed with update? [y/N] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo_info "Update cancelled."
    exit 0
fi

# Create backup
BACKUP_DIR="${PROJECT_ROOT}/.backup_$(date +%Y%m%d_%H%M%S)"
echo_info "Creating backup at: $BACKUP_DIR"
mkdir -p "$BACKUP_DIR"

# Backup critical user files
echo_info "Backing up user content..."
for dir in 01_manuscript/contents 02_supplementary/contents 03_revision/contents 00_shared/bib_files archive; do
    if [ -d "${PROJECT_ROOT}/$dir" ]; then
        mkdir -p "$BACKUP_DIR/$(dirname $dir)"
        cp -r "${PROJECT_ROOT}/$dir" "$BACKUP_DIR/$dir" 2>/dev/null || true
    fi
done

# Check for local modifications
if ! git diff --quiet || ! git diff --cached --quiet; then
    echo_warning "You have local modifications."
    echo_info "Stashing local changes..."
    git stash push -m "Auto-stash before update to v${REMOTE_VERSION}"
    STASHED=true
else
    STASHED=false
fi

# Update system files
echo_info "Updating system files..."
git checkout origin/main -- scripts/ config/ docs/ Makefile pyproject.toml src/ 2>/dev/null || {
    echo_error "Failed to update files."
    if [ "$STASHED" = true ]; then
        git stash pop
    fi
    exit 1
}

# Update templates (but not user content)
echo_info "Updating templates..."
for doc_type in 01_manuscript 02_supplementary 03_revision; do
    # Update structure but preserve contents/
    git checkout origin/main -- \
        ${doc_type}/base.tex \
        ${doc_type}/compiled/ \
        ${doc_type}/diff/ \
        2>/dev/null || true
done

# Restore stashed changes if any
if [ "$STASHED" = true ]; then
    echo_info "Restoring your local changes..."
    if git stash pop; then
        echo_success "Local changes restored"
    else
        echo_warning "Conflicts detected. Please resolve manually:"
        echo_warning "  git status"
        echo_warning "  git stash list"
    fi
fi

# Verify update by reading from pyproject.toml
if [ -f "$PYPROJECT_FILE" ]; then
    if command -v yq &> /dev/null; then
        NEW_VERSION=$(yq -r '.project.version' "$PYPROJECT_FILE" 2>/dev/null || echo "unknown")
    else
        NEW_VERSION=$(grep '^version = ' "$PYPROJECT_FILE" | sed 's/version = "\(.*\)"/\1/' | head -1 | tr -d '"' | tr -d '[:space:]')
    fi
else
    NEW_VERSION="unknown"
fi
echo
if [ "$NEW_VERSION" == "$REMOTE_VERSION" ]; then
    echo_success "Successfully updated to v${NEW_VERSION}!"
    echo
    echo_info "Backup created at: $BACKUP_DIR"
    echo_info "You can remove it once you verify everything works."
    echo
    echo_info "Next steps:"
    echo_info "  1. Test compilation: ./compile.sh"
    echo_info "  2. Review changes: git log v${CURRENT_VERSION}..v${NEW_VERSION}"
    echo_info "  3. Remove backup if all looks good: rm -rf $BACKUP_DIR"
else
    echo_error "Update verification failed."
    echo_error "Expected v${REMOTE_VERSION}, got v${NEW_VERSION}"
    exit 1
fi

# EOF