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}"