#!/bin/python
# From Supertuxkart SVN revision $Revision$
# Copyright (C) 2012 Jean-manuel clemencon (samuncle)
################################################################################

# Script used to build nighlies



import os
import sys
import getopt

# import the configuration file
from config import *

# import functions/class 
from utils import *
from svn import *
from build import *
from package import *
from send import *

def main():
    # error 
    noBuildErr = False
    nosvnErr = False
    isBuilt = False
    # parse input FIXME The parser doesn't work
    #parser(sys.argv[1:])
    # welcome message
    print
    print "nightly builder for supertuxkart"
    print "Copyright (C) 2012 Jean-manuel clemencon (samuncle)"
    print separator(COLOR.OKBLUE)
    
    # display help
    if (ARG["HELP"]):
        usage()
        print separator(COLOR.OKBLUE)
        print
        exit()
    
    # svn part -----------------------------------------------------------------
    # init the svn
    mysvn = Svn(CONFIG["WORKINGDIR"])
    print "current svn revision: " + str(mysvn.getLocalRevision())
    # Update the svn
    if (ARG["UPDATE"]):
        space = bufferedOutput("start svn update @ " + getTime())
        try:
            mysvn.update()
            nosvnErr = True
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        except:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
        
        # If no error occured
        if (nosvnErr):
            print "svn updated rev: " + str(mysvn.getLastRevision())
    
    # buid part ----------------------------------------------------------------
    # init the build
    mybuild = Build(CONFIG["WORKINGDIR"] + "/cmake_build")
    # Clean the project
    if (ARG["CLEAN"]):
        space = bufferedOutput("start clean @ " + getTime())
        try:
            mybuild.clean()
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        except:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
    
    # build the project (only if no error and the revision has changed
    if (nosvnErr):
        if (mysvn.getIsChanged()):
            print "revision changed"
            space = bufferedOutput("start compilation @ " + getTime())
            mybuild.make(ARG["JOB"])
            isBuilt = True
            if (mybuild.noError()):
                noBuildErr = True
                sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
            else:
                sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
        else:
            print "revsion not changed"
    
    # Build the project (force)
    if (ARG["FORCE"] and (not isBuilt) ):
        space = bufferedOutput("start forced compilation @ " + getTime())
        mybuild.make(ARG["JOB"])
        if (mybuild.noError()):
            noBuildErr = True
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        else:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
    
    # package part -------------------------------------------------------------
    mypack = Package(mysvn.getLastRevision(), CONFIG["COMPRESSDIR"],CONFIG["OS"],CONFIG["PLATFORM"])
    # pack the binary
    if (noBuildErr and ARG["BIN"]):
        space = bufferedOutput("start bin file compress @ " + getTime())
        try:
            mypack.addFile("supertuxkart", "stkbin", CONFIG["BUILDDIR"] + "/bin")
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        except:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
    
    # pack the data
    if(ARG["DATA"]):
        space = bufferedOutput("start data file compress @ " + getTime())
        try:
            mypack.addDir("data", "stkdat", CONFIG["WORKINGDIR"], "*.svn*")
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        except:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")
    
    # network part -------------------------------------------------------------
    if(ARG["SEND"]):
        # send file by FTP
        space = bufferedOutput("start file(s) transfer by FTP @ " + getTime())
        myFiles = mypack.getFiles()
        mysend = Send(CONFIG["FTPHOST"],CONFIG["FTPUSER"],CONFIG["FTPPASS"],CONFIG["SCRIPTDIR"])
        for i in myFiles:
            mysend.add(i, CONFIG["COMPRESSDIR"], CONFIG["REMOTEDIR"])
        #FIXME The ftp didn't throw an exception.
        try:
            mysend.send()
            sys.stdout.write(COLOR.OKGREEN + space + "[DONE]" + COLOR.ENDC + "\n")
        except:
            sys.stdout.write(COLOR.WARNING + 74 * " " + "[FAIL]" + COLOR.ENDC + "\n")

    print separator(COLOR.OKBLUE)
    print

if __name__ == "__main__":
    main()
    
    #sys.argv[1:]