mirror of
https://github.com/A6-9V/MQL5-Google-Onedrive.git
synced 2026-04-11 06:30:56 +00:00
129 lines
4.1 KiB
Python
Executable file
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()
|