#!/usr/bin/python

import os
import sys

def parse(config):
    """parse a kernel config file into a dict"""
    fd = open(config)
    tmp = {}
    for i in fd:
        i = i.strip()
        if i.startswith('#'):
            if i.endswith(' is not set'):
                i = i[2:]
                (key, non) = i.split(' ', 1)
                tmp[key] = None
        elif len(i) == 0:
            pass
        else:
            (key, value) = i.split('=', 1)
            tmp[key] = value
    fd.close()
    return tmp

def print_value(k, v):
    """print config entry"""
    if v == None:
        print "# %s is not set" % k
    else:
        print "%s=%s" % (k, v)

def print_values(keys, values):
    for i in keys:
        print_value(i, values[i])

def diff(a, b):
    return filter(lambda i: i not in b, a.iterkeys())

def common(a, b):
    return filter(lambda i: i in b, a.iterkeys())

def action_multi(fun, args):
    (f1, f2) = map(parse, args)
    c = fun(f1, f2)
    c.sort()
    print_values(c, f1)

def action_udiff(args):
    (f1, f2) = map(parse, args)
    d1 = diff(f1, f2)
    d2 = diff(f2, f1)
    d1.extend(d2)
    d1.sort()
    f2.update(f1)
    print_values(d1, f2)

if __name__ == "__main__":
    args = sys.argv[1:]
    cmd = args[0]
    # prints everything in 1 and 2
    if cmd == "base":
        action_multi(common, args[1:])
    # prints everything in 1 and not in 2
    if cmd == "diff":
        action_multi(diff, args[1:])
    # prints everyting thats missing in either 1 or 2
    if cmd == "udiff":
        action_udiff(args[1:])
