#!/usr/bin/python -O

from errno import EEXIST
from optparse import OptionParser
from os import chown, makedirs, stat
from os.path import dirname, join
from shutil import copymode, move
from string import Template


########################################################################


def main():
    usage = 'usage: %prog [options] {executables}'
    description = 'All options are required except for "--template".  At least one executable is required.'
    parser = OptionParser(usage=usage, description=description)
    parser.add_option('--name')
    parser.add_option('--version', metavar='X.Y.Z')
    parser.add_option('--release', metavar='X.Y.Z')
    parser.add_option('--install', metavar='PATH')
    parser.add_option('--template', metavar='FILE', default=join(dirname(__file__), 'wrapper.in'))

    options, executables = parser.parse_args()
    if not (options.name and options.version and options.release and options.install and executables):
        parser.print_help()
        exit(2)

    substitutions = {
        'name': options.name,
        'version': options.version,
        'release': options.release,
        }

    pkglibdir = '/usr/lib/sampler'.lstrip('/')
    for executable in executables:
        executable = executable.lstrip('/')
        original = join(options.install, executable)
        wrapped = join(options.install, pkglibdir, 'wrapped', executable)
        path = '/' + executable

        try:
            makedirs(dirname(wrapped))
        except OSError as error:
            if error.errno != EEXIST:
                raise
        move(original, wrapped)

        before = open(options.template).read()
        template = Template(before)
        after = template.substitute(substitutions, path=path)
        open(original, 'w').write(after)

        copymode(wrapped, original)
        stats = stat(wrapped)
        chown(original, stats.st_uid, stats.st_gid)


if __name__ == '__main__':
    main()
