#!/usr/bin/env python
import glob
import os
import re
import sys
import optparse

try:
    import ConfigParser
except ImportError:
    import configparser as ConfigParser


def main():
    parser = optparse.OptionParser(
        usage="%prog [options] package...",
        description="""\
Creates a custom repo based on an existing repo with only the listed
packages (or package globs) enabled. Example: %prog -s osg-testing hadoop""",
    )
    parser.add_option(
        "-s",
        "--source-repo",
        metavar="REPONAME",
        help="Name of repo to base new repo off of",
    )
    parser.add_option("-n", "--name", metavar="REPONAME", help="Name of new repo")
    parser.add_option(
        "-G",
        "--noglob",
        action="store_false",
        dest="glob",
        help="Do not append a * to the package names",
    )

    parser.set_defaults(glob=True, name=None, source_repo="matyas")

    options, args = parser.parse_args()

    if not args:
        parser.error("No packages given")

    if not options.name:
        options.name = options.source_repo + "-custom"

    badchar_matches = re.findall(r"[^\-_+A-Za-z0-9]", options.name)
    if badchar_matches:
        parser.error(
            "Invalid character(s) in repo name: '%s'" % "','".join(badchar_matches)
        )

    if options.glob:
        packages = [a + "*" for a in args]
    else:
        packages = args

    config = ConfigParser.SafeConfigParser()
    config.read(glob.glob("/etc/yum.repos.d/*.repo"))

    if not config.has_section(options.source_repo):
        sys.stderr.write("Couldn't find source repo (%s)\n" % options.source_repo)
        return 1

    new_config = ConfigParser.SafeConfigParser()
    new_config.add_section(options.name)
    for name, value in config.items(options.source_repo):
        new_config.set(options.name, name, value)
    new_config.set(options.name, "enabled", "1")
    new_config.set(options.name, "name", options.name)
    new_config.set(options.name, "includepkgs", " ".join(packages))
    new_config.write(
        open(os.path.join("/etc/yum.repos.d", options.name + ".repo"), "w")
    )

    return 0


if __name__ == "__main__":
    sys.exit(main())
