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