#!/usr/bin/env python

import os
from helpers import run_command
from optparse import OptionParser

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

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

def export(revision, outdir, mt):
    os.mkdir(outdir)
    if mt:
        ffmpeg = "ffmpeg-mt"
        open(outdir + '/ffmpeg-mt-enabled', 'w').close()
    else:
        ffmpeg = "ffmpeg"
        open(outdir + '/ffmpeg-mt-disabled', 'w').close()
    if os.path.exists('ffmpeg-mt-enabled'):
        local_ffmpeg = 'ffmpeg-mt'
    else:
        local_ffmpeg = 'ffmpeg'
    mplayer_rev = subrev(revision, "mplayer")
    libass_rev = subrev(revision, "libass")
    ffmpeg_rev = subrev(revision, ffmpeg)
    os.chdir(local_ffmpeg)
    swscale_rev = subrev(ffmpeg_rev, "libswscale")
    os.chdir('..')
    os.chdir('mplayer')
    version = run_command('git describe --match v[0-9]* --always ' +
                          mplayer_rev).strip()
    os.chdir('..')
    write('.', '.', revision, outdir)
    os.putenv('PYTHONDONTWRITEBYTECODE', '1')
    os.system("cd %s && ./init --init-optionfiles-only" % outdir)
    for name in 'clean disable-mt enable-mt init update'.split():
        os.remove(outdir + '/' + name)
    write('mplayer', "mplayer", mplayer_rev, outdir)
    f = open(outdir + '/mplayer/snapshot_version', 'w')
    f.write(version)
    f.close()
    write('libass', "libass", libass_rev, outdir)
    write(local_ffmpeg, ffmpeg, ffmpeg_rev, outdir)
    write(local_ffmpeg + '/libswscale', ffmpeg + '/libswscale', swscale_rev,
          outdir)


def main():
    usage = "usage: [options] revision outdir"
    parser = OptionParser(usage=usage)
    parser.add_option('--disable-mt', action='store_false', dest="mt",
                      help='use non-mt FFmpeg')
    parser.set_defaults(mt=True)
    options, args = parser.parse_args()
    if len(args) != 2:
        parser.error("incorrect number of arguments")
    export(args[0], args[1], options.mt)

main()
