#!/bin/env python # # compare: a tool to compare kernel config files # # Marc E. Fiuczynski # Copyright (C) 2006 The Trustees of Princeton University # # $Id: compare,v 1.1 2006/11/30 16:39:29 mef Exp $ # import sys, re, os def process(file): ORDER = [] CONFIGS = {} for line in file.readlines(): iline = line.lower() offset=iline.find(" is not set") if offset <> -1: config = line[line.find("CONFIG"):offset].strip() if CONFIGS.has_key(config): print "duplicate entry %s" % config CONFIGS[config]=0 ORDER.append(config) continue offset = iline.find("=y") if offset <> -1: config = line[line.find("CONFIG"):offset].strip() if CONFIGS.has_key(config): print "duplicate entry %s" % config CONFIGS[config]=1 ORDER.append(config) continue offset = iline.find("=m") if iline.find("=m") <> -1: config = line[line.find("CONFIG"):offset].strip() if CONFIGS.has_key(config): print "duplicate entry %s" % config CONFIGS[config]=2 ORDER.append(config) continue return (CONFIGS,ORDER) showall=False args = sys.argv[1:] if len(args) <=1: name = os.path.basename(sys.argv[0]) print "USAGE: %s [options] from.config to.config" % name print """ Options -a Show all differences State Legend A Added config (exists in to.config, but not in from.config) R Removed config (exists in from.config, but not in to.config) B Builtin M Module D Disabled """ sys.exit(0) if args[0] == "-a": showall = True args = args[1:] (old,oldorder)= process(open(args[0])) (new,neworder)= process(open(args[1])) oldstate = {-1:'A',0:'D',1:'B',2:'M'} newstate = {-1:'R',0:'D',1:'B',2:'M'} keys = neworder for key in keys: o = old.get(key,-1) n = new[key] if n==o and not showall: continue print "%c -> %c : %s" % (newstate[o],newstate[n],key) # not sure we care about what options have been removed # from from.config file sys.exit(0) keys = oldorder for key in keys: n = new.get(key,-1) o = old[key] if n == -1 and not showall: print "%c -> %c : %s" % (oldstate[o],oldstate[n],key)