#!/usr/bin/env python3

import os
import sys
from helpers import run_command
from optparse import OptionParser

def write(path, revision, outdir):
    if os.system(b"(cd " +path +b" && git archive --format=tar --prefix=" +path +b"/ " +revision + b" | (cd " +outdir + b" && tar xf -))") != 0:
        raise OSError

def subrev(revision, name):
    return run_command(("git", "ls-tree", revision, name)).split()[2]

def export(revision, outdir):
    os.mkdir(outdir)
    mplayer_rev = subrev(revision, "mplayer")
    libass_rev = subrev(revision, "libass")
    libav_rev = subrev(revision, "libav")
    os.chdir('mplayer')
    version = run_command(b'git describe --match v[0-9]* --always ' +
                          mplayer_rev).strip()
    os.chdir('..')
    write(b'.',revision, outdir)
    os.putenv('PYTHONDONTWRITEBYTECODE', '1')
    os.system(b"cd " +outdir +b" && ./init --init-optionfiles-only")
    for name in b'clean init update'.split():
        os.remove(outdir + b'/' + name)
    numeric_rev = run_command(b'git rev-parse ' + revision)
    with open(outdir + b'/wrapper_export_version', 'wb') as f:
        f.write(numeric_rev)
    write(b'mplayer', mplayer_rev, outdir)
    with open(outdir + b'/mplayer/snapshot_version', 'wb') as f:
        f.write(version)
    write(b'libass', libass_rev, outdir)
    os.system(b"cd " +outdir + b"/libass && autoreconf -ivf")
    write(b'libav', libav_rev, outdir)


def main():
    usage = "usage: [options] revision outdir"
    parser = OptionParser(usage=usage)
    options, args = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    export(args[0].encode('ascii'), args[1].encode(sys.getfilesystemencoding()))

main()
