#!/usr/bin/env python3

import os, sys, subprocess, shutil

assert os.getcwd() == '/home/jpakkane'

from glob import glob

def purge(fname: str) -> None:
    if not os.path.exists(fname):
        return
    if os.path.isdir(fname):
        shutil.rmtree(fname)
    os.unlink(fname)

def update() -> None:
    webdir = 'mesonweb'
    repodir = 'mesonwebbuild'
    docdir = os.path.join(repodir, 'docs')
    builddir = os.path.join(docdir, 'builddir')
    htmldir = os.path.join(builddir, 'Meson documentation-doc/html')
#    subprocess.check_call(['git', 'pull'], cwd=webdir)
    subprocess.check_call(['git', 'fetch', '-a'], cwd=repodir)
    subprocess.check_call(['git', 'reset', '--hard', 'origin/master'],
                          cwd=repodir)
    if os.path.isdir(htmldir):
        shutil.rmtree(htmldir)
    if os.path.isdir(builddir):
        shutil.rmtree(builddir)
    env = os.environ.copy()
    env['PATH'] = env['PATH'] + ':/home/jpakkane/.local/bin'
    subprocess.check_call(['../meson.py', '.', 'builddir'], cwd=docdir, env=env)
    subprocess.check_call(['ninja'], cwd=builddir)
    old_files = glob(os.path.join(webdir, '*'))
    for f in old_files:
        base = f[len(webdir)+1:]
        if base == 'CNAME' or base == 'favicon.png':
            continue
        subprocess.check_call(['git', 'rm', '-rf', base], cwd=webdir)
    assert os.path.isdir(webdir)
    new_entries = glob(os.path.join(htmldir, '*'))
    for e in new_entries:
        shutil.move(e, webdir)
    subprocess.check_call('git add *', shell=True, cwd=webdir)
    subprocess.check_call(['git', 'commit', '-a', '-m', 'Bleep. Bloop. I am a bot.'],
                          cwd=webdir)
    subprocess.check_call(['git', 'push'], cwd=webdir)
    shutil.rmtree(builddir)

if __name__ == '__main__':
    update()
