File qbittorrent-update_check.sh of Package qbittorrent

#!/bin/bash

# ==============================================================================
# qBittorrent Auto-Updater for OBS
# ==============================================================================
#
# 1. Fetches latest version from SourceForge RSS Feed (Source Tarball specific).
# 2. Updates 'Version' and 'Release' in the .spec file.
# 3. Triggers 'osc service manualrun download_files -v' to fetch sources.
# 4. Verifies all downloaded assets (Tarball, ASC, Keyring, Changelog).
# 5. Cleans up old version artifacts.
#
# ==============================================================================

# --- Configuration ---
PACKAGE_NAME="qbittorrent"
SPEC_FILE="${PACKAGE_NAME}.spec"

# SourceForge RSS Feed
# reliable way to get the source tarball, avoiding Windows .exe redirects
RSS_URL="https://sourceforge.net/projects/qbittorrent/rss?path=/qbittorrent"

# Colors
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# ------------------------------------------------------------------
# Step 1: Find the latest version from SourceForge RSS
# ------------------------------------------------------------------
echo -e "${BLUE}๐Ÿ” Checking SourceForge RSS for the latest source tarball...${NC}"

# Fetch RSS feed
RSS_CONTENT=$(curl -s "$RSS_URL")

# Extract the first occurrence of a tar.xz filename
# We grep for 'qbittorrent-X.Y.Z.tar.xz' and take the first match (newest)
LATEST_TARBALL=$(echo "$RSS_CONTENT" | grep -o "qbittorrent-[0-9.]\+\.tar\.xz" | head -n 1)

if [ -z "$LATEST_TARBALL" ]; then
    echo -e "${RED}โŒ Error: Could not find a .tar.xz file in the RSS feed.${NC}"
    exit 1
fi

# Extract version from filename: qbittorrent-5.1.4.tar.xz -> 5.1.4
NEW_VERSION=$(echo "$LATEST_TARBALL" | sed -n 's/^qbittorrent-\([0-9.]\+\)\.tar\.xz$/\1/p')

# Validation
if [[ ! "$NEW_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
    echo -e "${RED}โŒ Error: Could not parse version from filename: $LATEST_TARBALL${NC}"
    exit 1
fi

echo -e "${GREEN}โœ… Latest qBittorrent source version detected: $NEW_VERSION${NC}"

# ------------------------------------------------------------------
# Step 2: Check Local Spec File
# ------------------------------------------------------------------
if [ ! -f "$SPEC_FILE" ]; then
    echo -e "${RED}โŒ Error: $SPEC_FILE not found.${NC}"
    exit 1
fi

# Extract current version from spec
CURRENT_VERSION=$(grep "^Version:" "$SPEC_FILE" | awk '{print $2}' | tr -d '[:space:]')
echo -e "${BLUE}โ„น๏ธ  Current Spec version: $CURRENT_VERSION${NC}"

if [ "$NEW_VERSION" == "$CURRENT_VERSION" ]; then
    echo -e "${GREEN}๐ŸŽ‰ System is up-to-date ($CURRENT_VERSION). No action needed.${NC}"
    exit 0
fi

# ------------------------------------------------------------------
# Step 3: Update Spec File
# ------------------------------------------------------------------
echo -e "${BLUE}๐Ÿš€ Update required! Upgrading from $CURRENT_VERSION to $NEW_VERSION...${NC}"

# 1. Update Version
sed -i "s/^Version:[[:space:]]*.*/Version:        $NEW_VERSION/" "$SPEC_FILE"

# 2. Reset Release to 0
sed -i "s/^Release:[[:space:]]*.*/Release:        0/" "$SPEC_FILE"

echo -e "${GREEN}โœ… Spec file updated.${NC}"

# ------------------------------------------------------------------
# Step 4: Run OSC Service
# ------------------------------------------------------------------
echo -e "${BLUE}โฌ‡๏ธ  Running 'osc service manualrun download_files -v'...${NC}"
echo -e "${BLUE}โ„น๏ธ  Fetching from SourceForge and GitHub...${NC}"

osc service manualrun download_files -v

if [ $? -ne 0 ]; then
    echo -e "${RED}โŒ OSC Service run failed!${NC}"
    echo -e "${RED}   Check if the files exist on SourceForge/GitHub for version $NEW_VERSION.${NC}"
    exit 1
fi

# ------------------------------------------------------------------
# Step 5: Verify and Cleanup
# ------------------------------------------------------------------

# Defined expected filenames based on Spec renaming rules
EXPECTED_TAR="${PACKAGE_NAME}-${NEW_VERSION}.tar.xz"
EXPECTED_ASC="${PACKAGE_NAME}-${NEW_VERSION}.tar.xz.asc"
EXPECTED_KEYRING="${PACKAGE_NAME}.keyring" # Renamed in spec
EXPECTED_CHANGELOG="CHANGELOG"             # Renamed in spec

MISSING=0

# Check Tarball
if [ ! -f "$EXPECTED_TAR" ]; then
    echo -e "${RED}โŒ Missing source: $EXPECTED_TAR${NC}"
    MISSING=1
else
    echo -e "${GREEN}โœ… Verified: $EXPECTED_TAR${NC}"
fi

# Check Signature
if [ ! -f "$EXPECTED_ASC" ]; then
    echo -e "${RED}โŒ Missing signature: $EXPECTED_ASC${NC}"
    MISSING=1
else
    echo -e "${GREEN}โœ… Verified: $EXPECTED_ASC${NC}"
fi

# Check Keyring
if [ ! -f "$EXPECTED_KEYRING" ]; then
    echo -e "${RED}โŒ Missing keyring: $EXPECTED_KEYRING${NC}"
    MISSING=1
else
    echo -e "${GREEN}โœ… Verified: $EXPECTED_KEYRING${NC}"
fi

# Check Changelog
if [ ! -f "$EXPECTED_CHANGELOG" ]; then
    echo -e "${RED}โŒ Missing changelog: $EXPECTED_CHANGELOG${NC}"
    MISSING=1
else
    echo -e "${GREEN}โœ… Verified: $EXPECTED_CHANGELOG${NC}"
fi

if [ $MISSING -eq 1 ]; then
    exit 1
fi

# --- Cleanup Logic ---
echo -e "${BLUE}๐Ÿงน Cleaning up old versions...${NC}"
count=0

# Clean old tarballs
for f in ${PACKAGE_NAME}-*.tar.xz; do
    if [ "$f" != "$EXPECTED_TAR" ] && [ -f "$f" ]; then
        echo -e "   ๐Ÿ—‘๏ธ  Removing $f"
        rm "$f"
        count=$((count+1))
    fi
done

# Clean old signatures
for f in ${PACKAGE_NAME}-*.tar.xz.asc; do
    if [ "$f" != "$EXPECTED_ASC" ] && [ -f "$f" ]; then
        echo -e "   ๐Ÿ—‘๏ธ  Removing $f"
        rm "$f"
        count=$((count+1))
    fi
done

if [ $count -eq 0 ]; then
    echo -e "${BLUE}โ„น๏ธ  No old files found.${NC}"
else
    echo -e "${GREEN}โœจ Cleanup complete.${NC}"
fi

echo -e "${GREEN}โœจ Process complete! You can now run: osc addremove && osc ci${NC}"
openSUSE Build Service is sponsored by