#!/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()