#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""
    Copyright (c) 2007 by pigfoot <pigfoot@gmail.com>
    All rights reserved, see COPYING for details.

    o Author: pigfoot <pigfoot@gmail.com>
    o History: Initial version.

    This script is to update pigfoot's mozilla firefox builds

    $Id$
"""

__VERSION__ = "$Revision$"[11:-2]

class Mozupdate:

    def __init__ (self, szLocale, szBuildVersion, bBranding):
        self.szLocale = szLocale
        self.szBuildVersion = szBuildVersion
        self.bBranding = bBranding
        self.BaseSN = 0
        self.BaseURL = 'http://ftp.twaren.net/local-distfiles/pigfoot/firefox/'
        self.aDict = {}

        # Adjust the SN number
        if self.szLocale == 'en_US':
            if not bBranding:
                self.BaseSN = 0
                self.BaseURL += 'milestone/'
            else:
                self.BaseSN = 1000
                self.BaseURL += 'official-branding/'

        elif self.szLocale == 'zh_TW':
            if not bBranding:
                self.BaseSN = 10
                self.BaseURL += 'localizedbuilds/zh_TW/'
            else:
                self.BaseSN = 1010
                self.BaseURL += 'official-branding/'

        elif self.szLocale == 'zh_CN':
            self.BaseSN = 20
            self.BaseURL += 'localizedbuilds/zh_CN/'

        elif self.szLocale == 'ja':
            self.BaseSN = 30
            self.BaseURL += 'localizedbuilds/ja/'

        elif self.szLocale == 'de':
            self.BaseSN = 40
            self.BaseURL += 'localizedbuilds/de/'

        elif self.szLocale == 'hu':
            self.BaseSN = 50
            self.BaseURL += 'localizedbuilds/hu/'

        elif self.szLocale == 'nl':
            self.BaseSN = 60
            self.BaseURL += 'localizedbuilds/nl/'

        else:
            print "Not support locale %s!" % self.szLocale

    def run(self):
        import os, glob, stat

        print "Try to glob current folder...\n"
        aListFiles = [ szFile.lstrip("./") for szFile in glob.glob ("./*") if ( (os.path.isfile(szFile)) and (os.path.basename(szFile)[0] != '_') ) ]

        # Try to gain target filenames of specified build version e.g. 'Firefox-20070804-CE-2.0.0.6-Release (pigfoot) VC7-P0-en_US.7z.exe'
        for szFile in aListFiles:
            for i in range(1, 4):
                if (-1 != szFile.find("%s-Release (pigfoot) VC9-P%d-%s" % (self.szBuildVersion, i, self.szLocale))):

                    szArch = "P%d" % i

                    if (szFile[-4:] == '.mar'):
                        self.aDict.setdefault(szArch, {}).setdefault("Mar", szFile)
                        self.aDict.setdefault(szArch, {}).setdefault("MarSum", self.doSHA1(szFile))
                        self.aDict.setdefault(szArch, {}).setdefault("MarSize", os.stat(szFile)[stat.ST_SIZE])
                        self.aDict.setdefault(szArch, {}).setdefault("MarURL", self.BaseURL + self.doEncode(szFile))

        # It's time to do verification for build P0 to P3
        print 'UPDATE `FileInfo` SET `DLURL` =\'%s\', `FileHash` = \'%s\', `FileSize` = \'%s\' WHERE `FileInfo`.`SN` = %s LIMIT 1 ;' % \
        (self.aDict["P2"]["MarURL"], self.aDict["P2"]["MarSum"], self.aDict["P2"]["MarSize"], str(self.BaseSN))
        for i in range(1, 4):
            keyArch = "P%d" % i
            #print "%s, %s, %s\n%s\n" % (self.aDict[keyArch]["Mar"], self.aDict[keyArch]["MarSum"], self.aDict[keyArch]["MarSize"], self.aDict[keyArch]["MarURL"])
            print 'UPDATE `FileInfo` SET `DLURL` =\'%s\', `FileHash` = \'%s\', `FileSize` = \'%s\' WHERE `FileInfo`.`SN` = %s LIMIT 1 ;' % \
            (self.aDict[keyArch]["MarURL"], self.aDict[keyArch]["MarSum"], self.aDict[keyArch]["MarSize"], str(self.BaseSN + i))

    def doSHA1(self, szFile):
        import sha
        sha1 = sha.new()
        f = open(szFile)
        buf = f.read(4096)
        while buf:
            sha1.update(buf)
            buf = f.read(4096)
        f.close()
        return sha1.hexdigest()

    def doEncode(self, szFile):
        szTmp = szFile.replace(' ', '%20')
        szTmp = szTmp.replace('(', '%28')
        szTmp = szTmp.replace(')', '%29')
        return szTmp

def usage ():
    return """\

Usage: %s <Options>

Main Options:\n
\t-l, --locale            - locales to be updated
\t-b, --buildversion      - build version to be updated
\t-o, --official-branding - Official branding
"""

if __name__ == '__main__':

    import sys, getopt
    import string

    print "--= Mozupdate Rev: %s ==-" % __VERSION__

    try:
        opts, args = getopt.getopt (sys.argv[1:], "l:b:o", ["locale", "buildversion", "official-branding"])
    except getopt.GetoptError:
        # print help information and exit:
        sys.exit(usage() % sys.argv[0])

    # reset value
    szLocale  = ''
    szBuildVersion = ''
    bBranding = False

    # parse opt
    for o, a in opts:
        if o in ("-l", "--locale"):
            szLocale = a
        if o in ("-b", "--buildversion"):
            szBuildVersion = a
        if o in ("-o", "--official-branding"):
            bBranding = True

    # Simple checking
    if (szLocale == ''):
        print "MUST specify locale by '-l'!"
        sys.exit(usage() % sys.argv[0])

    if (szBuildVersion == ''):
        print "MUST specify build version by '-b'!"
        sys.exit(usage() % sys.argv[0])

    try:
        update = Mozupdate(szLocale, szBuildVersion, bBranding)
        update.run()
    except KeyboardInterrupt:
        print "Shutting down..."

# vim:ts=4:sw=4:sta:et:sts=4:ai:nowrap
