#!/usr/bin/python
__requires__ = 'TurboGears[future]'
import pkg_resources
pkg_resources.require("TurboGears")

import sys, re, os
from optparse import OptionParser
from sqlobject import *
import warnings
with warnings.catch_warnings():
    warnings.filterwarnings("ignore", category=DeprecationWarning) 
    import turbogears
sys.path.append('/usr/share/mirrormanager/server')
from mirrormanager.model import Category, Directory, Version

from turbogears.database import PackageHub
hub = __connection__ = None

options = None

# moving from pub/fedora/linux/development/14/x86_64/os to pub/fedora/linux/releases/14/Everything/x86_64/os
# by now, UMDL would have created a new repository object at the target directory anyhow
# except it's version and arch values are wrong
# and we want to zero out the values in the current repository object

def fixup_repos(version, fromrepo, torepo):
    fromrepo_arch = fromrepo.arch
    fromrepo.arch = None
    fromrepo.sync()
    
    torepo.prefix = fromrepo.prefix
    torepo.arch = fromrepo_arch
    torepo.version = version
    torepo.sync()


def doit():
    global options
    try:
        c = Category.byName(options.category)
    except SQLObjectNotFound:
        sys.stderr.write("Category '%s' not found, exiting" % options.category)
        print_categories(sys.stderr)
        sys.stderr.flush()
        sys.exit(1)

    try:
        v = Version.selectBy(product=c.product, name=options.version)[0]
    except:
        raise # fixme
    oldpattern = os.path.join('development', options.version)
    newpattern = os.path.join('releases', options.version, 'Everything')
    oldRe = re.compile(oldpattern)
    for r in c.repositories:
        d = r.directory
        if oldRe.search(d.name):
            t = d.name.replace(oldpattern, newpattern)
            try:
                new_d = Directory.byName(t)
            except SQLObjectNotFound:
                sys.stderr.write("target Directory(%s) not found, ignoring.\n" % t)
                sys.stderr.flush()
                continue

            l = len(new_d.repositories)
            if l == 0:
                continue # uh oh, umdl hasn't found this directory yet.  Pretty unlikely...
            if l > 1:
                raise ValueError # uh oh, how'd we wind up with 2 repos pointing at this directory?

            fixup_repos(v, r, new_d.repositories[0])
            print "%s => %s" % (d.name, t)

def print_categories(fileno):
    fileno.write("Available categories:\n")
    for c in Category.select():
        fileno.write("\t%s\n" % c.name)
        fileno.flush()

def main():
    global options
    parser = OptionParser(usage=sys.argv[0] + " [options]")
    parser.add_option("-c", "--config",
                      dest="config", default='/etc/mirrormanager/prod.cfg',
                      help="TurboGears config file to use (default=/etc/mirrormanager/prod.cfg)")
    parser.add_option("--version",
                      dest="version", action="store", type="string", help="OS version to move (e.g. '14') [required]", default=None)
    parser.add_option("--category",
                      dest="category", action="store", type="string", help="Category (e.g. 'Fedora Linux') [required]", default=None)

    (options, args) = parser.parse_args()
    if options.version is None or options.category is None:
        parser.print_help()
        print_categories(sys.stdout)
        sys.exit(1)

    turbogears.update_config(configfile=options.config,
                             modulename="mirrormanager.config")
    global hub
    global __connection__
    hub = PackageHub("mirrormanager")
    __connection__ = hub
    
    doit()
    return 0

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