MQL5-Google-Onedrive/scripts/sync_github_pages.py
2026-02-27 02:56:09 +00:00

129 lines
4.1 KiB
Python
Executable file

#!/usr/bin/env python3
"""
Sync MQL5 files and documentation to GitHub Pages repository.
Improved version with cross-platform support using shutil and robust logging.
"""
import argparse
import subprocess
import sys
import shutil
import logging
import os
from pathlib import Path
from datetime import datetime
# Configure logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
REPO_ROOT = Path(__file__).resolve().parents[1]
PAGES_REPO = "https://github.com/Mouy-leng/-LengKundee-mql5.github.io.git"
PAGES_BRANCH = "main"
def run_command(cmd, cwd=None, check=True):
"""Run a shell command and return the result."""
logger.info(f"Executing: {' '.join(map(str, cmd))}")
result = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True)
if check and result.returncode != 0:
logger.error(f"Command failed with exit code {result.returncode}")
logger.error(f"Error output: {result.stderr}")
sys.exit(result.returncode)
return result
def copy_tree(src, dst):
"""Copy a directory tree, creating destination if it doesn't exist."""
if not src.exists():
logger.warning(f"Source directory {src} does not exist. Skipping.")
return False
if dst.exists():
logger.info(f"Removing existing destination: {dst}")
shutil.rmtree(dst)
logger.info(f"Copying {src} to {dst}")
shutil.copytree(src, dst)
return True
def sync_to_pages(dry_run=False):
"""Sync MQL5 files and docs to GitHub Pages repository."""
pages_dir = REPO_ROOT / "pages-repo"
logger.info("=" * 60)
logger.info("GitHub Pages Sync Script (Improved)")
logger.info("=" * 60)
logger.info(f"Source: {REPO_ROOT}")
logger.info(f"Target: {PAGES_REPO}")
if dry_run:
logger.info("[DRY RUN] Would sync mt5/MQL5, docs, and README.md")
return
# Clone or update pages repository
if pages_dir.exists():
logger.info("Updating existing pages repository...")
run_command(["git", "pull", "origin", PAGES_BRANCH], cwd=pages_dir)
else:
logger.info("Cloning pages repository...")
run_command(["git", "clone", PAGES_REPO, str(pages_dir)])
run_command(["git", "checkout", PAGES_BRANCH], cwd=pages_dir)
# Sync MQL5 files
mql5_source = REPO_ROOT / "mt5" / "MQL5"
mql5_dest = pages_dir / "mql5"
copy_tree(mql5_source, mql5_dest)
# Sync documentation
docs_source = REPO_ROOT / "docs"
docs_dest = pages_dir / "docs"
copy_tree(docs_source, docs_dest)
# Copy README
readme_source = REPO_ROOT / "README.md"
if readme_source.exists():
logger.info(f"Copying README.md to {pages_dir}")
shutil.copy2(readme_source, pages_dir / "README.md")
# Commit and push
logger.info("Checking for changes...")
run_command(["git", "add", "-A"], cwd=pages_dir)
# Check if there are changes
result = run_command(["git", "diff", "--staged", "--quiet"], cwd=pages_dir, check=False)
if result.returncode != 0:
commit_msg = f"Auto-sync from MQL5-Google-Onedrive: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
run_command(["git", "commit", "-m", commit_msg], cwd=pages_dir)
logger.info("Committed changes")
logger.info(f"Pushing to {PAGES_BRANCH}...")
run_command(["git", "push", "origin", PAGES_BRANCH], cwd=pages_dir)
logger.info("Successfully pushed changes")
else:
logger.info("No changes to sync")
logger.info("=" * 60)
logger.info("✅ Sync completed successfully!")
logger.info("=" * 60)
def main():
parser = argparse.ArgumentParser(
description="Sync MQL5 files and documentation to GitHub Pages repository"
)
parser.add_argument(
"--dry-run",
action="store_true",
help="Show what would be synced without making changes"
)
args = parser.parse_args()
try:
sync_to_pages(dry_run=args.dry_run)
except Exception as e:
logger.error(f"Sync failed: {e}", exc_info=True)
sys.exit(1)
if __name__ == "__main__":
main()