#!/usr/bin/python

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Copyright 2007 by Adel Gadllah

import re, os
from fnmatch import fnmatch
from yum.plugins import TYPE_INTERACTIVE

requires_api_version = '2.3'
plugin_type = TYPE_INTERACTIVE


def exclude_hook(conduit):

    # Only install i386 packages when told to do so 
    if os.uname()[-1] == 'x86_64':
        basearch(conduit, "x86", "i?86$")
    
    # Only install ppc64 packages when told to do so     
    if os.uname()[-1] == 'ppc64':
        basearch(conduit, "ppc", "ppc64$")

    # Only install sparc64 packages when told to do so     
    if os.uname()[-1] == 'sparc64':
        basearch(conduit, "sparc", "sparc64$")


def basearch(conduit, barch, excludearchP):
    
    exclude = []
    whitelist = []
    skippkg = 0
    conf , cmd = conduit.getCmdLine()
    
    if not cmd:
        return

    if cmd[0] != "install":
        return

    packageList = conduit.getPackages()
    excludearch = re.compile(excludearchP)

    """ get whitelist from config file """    
    
    conflist = conduit.confString(barch, 'whitelist')
    if conflist:
        tmp = conflist.split(",")
        for confitem in tmp:
            whitelist.append(confitem.strip())
    
    """ decide which packages we want to exclude """    

    for userpkg in cmd:
        skippkg = 0
        for wlpkg in whitelist:
            if fnmatch(userpkg,wlpkg):
                skippkg = 1
        if not skippkg and not excludearch.search(userpkg):
            exclude.append(userpkg)

    """ exclude the packages """    
    
    for pkg in packageList:
        if pkg.name in exclude and excludearch.search(pkg.arch):
            conduit.delPackage(pkg)
            conduit.info(3, "--> excluded %s.%s" % (pkg.name, pkg.arch))    
