#!/usr/bin/python
#
# Copyright 2007 Dell, Inc.
#   by Matt Domsch <Matt_Domsch@dell.com>
# MIT/X11 license


__requires__ = 'TurboGears[future]'
import pkg_resources
pkg_resources.require("TurboGears")

from sqlobject import *
import sys
import turbogears
from mirrormanager.model import *
from optparse import OptionParser

from turbogears.database import PackageHub
from turbogears import config
hub = __connection__ = None

repos = None

def add_version_redirect(options):
    for k,v in repos.iteritems():
        if options.updatesOnly and 'updates' not in k: continue
        if options.torepomap: toversion = v
        else:                 toversion = k % (options.toversion)
        try:
            RepositoryRedirect(fromRepo=k % (options.fromversion),
                               toRepo = toversion)
        except:
            print "unable to create redirect %s => %s" % (k % options.fromversion, k % options.toversion)

def remove_version_redirect(options):
    for k,v in repos.iteritems():
        if options.updatesOnly and 'updates' not in k: continue
        try:
            rr = RepositoryRedirect.selectBy(fromRepo=k % (options.fromversion))[0]
            print "removing redirect %s => %s" % (rr.fromRepo, rr.toRepo)
            rr.destroySelf()
        except:
            pass

def list_redirects():
    for r in RepositoryRedirect.select():
        print "%s => %s" % (r.fromRepo, r.toRepo)


def doit(options, args):
    if options.add:
        add_version_redirect(options)
    elif options.remove:
        remove_version_redirect(options)
    else:
        list_redirects()
    return 0


def main():
    parser = OptionParser(usage=sys.argv[0] + " [options]")
    parser.add_option("-c", "--config",
                      dest="config", default='dev.cfg',
                      help="TurboGears config file to use")
    parser.add_option("-a", "--add",
                      dest="add", action="store_true", default=False,
                      help="Add version redirects")
    parser.add_option("-r", "--remove",
                      dest="remove", action="store_true", default=False,
                      help="Remove version redirects")
    parser.add_option("-f", "--from",
                      dest="fromversion", default=None,
                      help="Specify from \"from\" version for add/remove redirects")
    parser.add_option("-t", "--to",
                      dest="toversion", default=None,
                      help="Specify to \"to\" version for add/remove redirects")
    parser.add_option("--torepomap",
                      dest="torepomap", action="store_true", default=False,
                      help="add/remove redirects based on 'to' value in config mrr.repos")
    parser.add_option("-u", "--updates-only",
                      dest="updatesOnly", action="store_true", default=False,
                      help="Only add/remove redirects to updates and updates-testing repos")

    (options, args) = parser.parse_args()

    turbogears.update_config(configfile=options.config,
                             modulename="mirrormanager.config")
    global hub
    global __connection__
    global repos
    hub = PackageHub("mirrormanager")
    __connection__ = hub
    
    if options.add and (options.fromversion is None or (options.toversion is None and not options.torepomap) ):
        parser.print_help()
        sys.exit(1)

    if options.remove and options.fromversion is None:
        parser.print_help()
        sys.exit(1)

    repos = config.get('mrr.repos')
    if repos is None:
        print "Unable to load repo definition from " + options.config 
        sys.exit(1)
    doit(options, args)



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