Major update script overhaul - robust conflict handling

- Complete rewrite of update script with better error handling
- Added automatic backup/restore of important config files
- Robust cache cleanup (removes all .pyc and __pycache__ files)
- Uses git reset --hard and clean for conflict-free updates
- Force pull strategy prevents merge conflicts entirely
- Preserves session files, config.py, and .env during updates
- Windows-compatible commands for file operations
- More reliable update process that handles any local changes
This commit is contained in:
Cursor User
2025-06-18 17:45:22 +02:00
parent 1e02568f49
commit fe810e7ad0

View File

@@ -1,7 +1,7 @@
#!/usr/bin/env python3
"""
Ultroid Update Script
This script handles updating the bot while it's not running.
Ultroid Update Script - Improved Version
This script handles updating the bot while it's not running using a robust approach.
"""
import os
@@ -15,14 +15,56 @@ def run_command(cmd, shell=True):
try:
result = subprocess.run(cmd, shell=shell, capture_output=True, text=True)
print(f"Command: {cmd}")
print(f"Output: {result.stdout}")
if result.stderr:
if result.stdout.strip():
print(f"Output: {result.stdout}")
if result.stderr.strip():
print(f"Error: {result.stderr}")
return result.returncode == 0
except Exception as e:
print(f"Error running command '{cmd}': {e}")
return False
def backup_important_files():
"""Backup important configuration files."""
important_files = [
"config.py",
".env",
"resources/session/ultroid.session",
"resources/session/ultroid.session-journal"
]
backed_up = []
for file in important_files:
if os.path.exists(file):
backup_name = f"{file}.backup"
if run_command(f'copy "{file}" "{backup_name}"'):
backed_up.append((file, backup_name))
print(f"✅ Backed up {file}")
return backed_up
def restore_important_files(backed_up):
"""Restore important configuration files."""
for original, backup in backed_up:
if os.path.exists(backup):
if run_command(f'copy "{backup}" "{original}"'):
print(f"✅ Restored {original}")
run_command(f'del "{backup}"')
def clean_repository():
"""Clean the repository of cache files and reset to clean state."""
print("🧹 Cleaning repository...")
# Remove Python cache files
run_command('for /r . %i in (*.pyc) do @del "%i" >nul 2>&1')
run_command('for /d /r . %d in (__pycache__) do @if exist "%d" rd /s /q "%d" >nul 2>&1')
# Reset all tracked files to their HEAD state
run_command("git reset --hard HEAD")
# Clean untracked files (but preserve update script and important files)
run_command("git clean -fd -e update_script*.py -e config.py -e .env -e resources/session/")
def main():
"""Main update function."""
print("🔄 Starting Ultroid update process...")
@@ -36,78 +78,55 @@ def main():
# Check if we're in a git repository
if not (script_dir / ".git").exists():
print("❌ Not a git repository. Cannot update.")
return False
return False
# Get the repository URL from command line args or default to user's fork
repo_url = sys.argv[1] if len(sys.argv) > 1 else "https://github.com/overspend1/Ultroid-fork.git"
# Fetch and pull updates
print("📥 Fetching updates from repository...")
print(f"🔗 Using repository: {repo_url}")
if repo_url:
print(f"🔗 Using repository: {repo_url}")
# Set up remote if needed
if not run_command("git remote get-url origin"):
run_command(f"git remote add origin {repo_url}")
else:
run_command(f"git remote set-url origin {repo_url}")
# Backup important files
backed_up_files = backup_important_files()
# Set up remote
if not run_command("git remote get-url origin"):
run_command(f"git remote add origin {repo_url}")
else:
run_command(f"git remote set-url origin {repo_url}")
# Fetch latest changes
print("📥 Fetching updates from repository...")
if not run_command("git fetch origin"):
print("❌ Failed to fetch updates")
return False
# Get current branch
# Get current branch
result = subprocess.run("git branch --show-current", shell=True, capture_output=True, text=True)
current_branch = result.stdout.strip() or "main"
print(f"🌿 Current branch: {current_branch}")
# Check for untracked files that might conflict
print("🔍 Checking for conflicting files...")
untracked_result = subprocess.run("git ls-files --others --exclude-standard", shell=True, capture_output=True, text=True)
untracked_files = untracked_result.stdout.strip().split('\n') if untracked_result.stdout.strip() else []
# Clean repository
clean_repository()
# If update_script.py is untracked and would conflict, temporarily move it
script_moved = False
if "update_script.py" in untracked_files:
print("📦 Temporarily moving update script to avoid conflicts...")
if run_command("move update_script.py update_script_temp.py"):
script_moved = True
# Stash any local changes first
print("💾 Stashing local changes...")
run_command("git stash push -m 'Auto-stash before update'")
# Pull updates
print("⬇️ Pulling updates...")
# Force pull updates (this will overwrite any local changes)
print("⬇️ Force pulling updates...")
if not run_command(f"git pull origin {current_branch}"):
print("❌ Failed to pull updates")
# Try to restore stashed changes
print("🔄 Attempting to restore stashed changes...")
run_command("git stash pop")
# Restore moved script if it was moved
if script_moved and os.path.exists("update_script_temp.py"):
print("🔄 Restoring update script...")
run_command("move update_script_temp.py update_script.py")
return False
# Restore stashed changes if any
print("🔄 Restoring local changes...")
stash_result = subprocess.run("git stash list", shell=True, capture_output=True, text=True)
if "Auto-stash before update" in stash_result.stdout:
if not run_command("git stash pop"):
print("⚠️ Warning: Could not restore some local changes. Check git stash list.")
else:
print("✅ Local changes restored successfully")
# If pull fails, try reset to remote
print("🔄 Trying hard reset to remote...")
if not run_command(f"git reset --hard origin/{current_branch}"):
print("❌ Failed to update repository")
return False
# Restore moved script if it was moved
if script_moved and os.path.exists("update_script_temp.py"):
print("🔄 Restoring update script...")
run_command("move update_script_temp.py update_script.py")
# Restore important files
restore_important_files(backed_up_files)
# Update dependencies
print("📦 Installing/updating dependencies...")
if not run_command("pip3 install -r requirements.txt --upgrade"):
print("⚠️ Warning: Failed to update some dependencies")
# Try alternative pip command
# Try alternative pip command for systems that need it
run_command("pip3 install -r requirements.txt --break-system-packages --upgrade")
print("✅ Update completed successfully!")
@@ -139,15 +158,15 @@ def restart_bot():
os.execv(sys.executable, [sys.executable, "-m", "pyUltroid"])
if __name__ == "__main__":
print("🚀 Ultroid Update Script")
print("=" * 40)
print("🚀 Ultroid Update Script - Improved Version")
print("=" * 50)
# Wait a moment for the bot to fully shutdown
time.sleep(2)
# Perform update
if main():
print("=" * 40)
print("=" * 50)
restart_bot()
else:
print("❌ Update failed. Please check the errors above.")