#!/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 verify pigfoot's mozilla firefox builds

    $Id$
"""

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

class Mozverify:

    def __init__ (self, szLocale, szBuildVersion):
        self.szLocale = szLocale
        self.szBuildVersion = szBuildVersion
        self.aDict = {}

    def run(self):
        import os, glob
        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[-7:] == '.7z.exe'):
                        self.aDict.setdefault(szArch, {}).setdefault("Build", szFile)
                    elif (szFile[-15:] == '.7z.exe.sha1sum'):
                        self.aDict.setdefault(szArch, {}).setdefault("BuildSum", szFile)
                    elif (szFile[-4:] == '.mar'):
                        self.aDict.setdefault(szArch, {}).setdefault("Mar", szFile)
                    elif (szFile[-12:] == '.mar.sha1sum'):
                        self.aDict.setdefault(szArch, {}).setdefault("MarSum", szFile)

        # It's time to do verification for build P0 to P3
        for i in range(1, 4):
            keyArch = "P%d" % i

            szBuild = self.doSHA1(self.aDict[keyArch]["Build"])
            szBuildSum = self.doVerify(self.aDict[keyArch]["BuildSum"])
            if (szBuild == szBuildSum):
                print "%s: %s -> Matched." % (self.aDict[keyArch]["Build"], szBuildSum)
            else:
                print "%s: %s...%s -> Error!!" % (self.aDict[keyArch]["Build"], szBuild, szBuildSum)
                return

            szMar = self.doSHA1(self.aDict[keyArch]["Mar"])
            szMarSum = self.doVerify(self.aDict[keyArch]["MarSum"])
            if (szMar == szMarSum):
                print "%s:    %s -> Matched." % (self.aDict[keyArch]["Mar"], szMarSum)
            else:
                print "%s:    %s...%s -> Error!!" % (self.aDict[keyArch]["Mar"], szMar, szMarSum)
                return

            os.system("cat '%s' >> sha1sum.txt" % self.aDict[keyArch]["BuildSum"])
            os.system("cat '%s' >> sha1sum.txt" % self.aDict[keyArch]["MarSum"])

    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 doVerify(self, szFile):
        f = open (szFile, "rU")
        aListContext = [szLine.rstrip("\n") for szLine in f.readlines()]
        f.close()

        # As you known, 2hex hash value of sha1 is 40 bytes, so we return the first 40 bytes of the first line
        return aListContext[0][:40]

def usage ():
    return """\

Usage: %s <Options>

Main Options:\n
\t-l, --locale          - locales to be verified
\t-b, --buildversion    - build version to be verified
"""

if __name__ == '__main__':

    import sys, getopt
    import string

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

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

    # reset value
    szLocale  = ''
    szBuildVersion = ''

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

    # 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:
        verifier = Mozverify(szLocale, szBuildVersion)
        verifier.run()
    except KeyboardInterrupt:
        print "Shutting down..."

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