1*53ee8cc1Swenshuai.xi#!/usr/bin/python 2*53ee8cc1Swenshuai.xi# 3*53ee8cc1Swenshuai.xi# diffconfig - a tool to compare .config files. 4*53ee8cc1Swenshuai.xi# 5*53ee8cc1Swenshuai.xi# originally written in 2006 by Matt Mackall 6*53ee8cc1Swenshuai.xi# (at least, this was in his bloatwatch source code) 7*53ee8cc1Swenshuai.xi# last worked on 2008 by Tim Bird 8*53ee8cc1Swenshuai.xi# 9*53ee8cc1Swenshuai.xi 10*53ee8cc1Swenshuai.xiimport sys, os 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xidef usage(): 13*53ee8cc1Swenshuai.xi print """Usage: diffconfig [-h] [-m] [<config1> <config2>] 14*53ee8cc1Swenshuai.xi 15*53ee8cc1Swenshuai.xiDiffconfig is a simple utility for comparing two .config files. 16*53ee8cc1Swenshuai.xiUsing standard diff to compare .config files often includes extraneous and 17*53ee8cc1Swenshuai.xidistracting information. This utility produces sorted output with only the 18*53ee8cc1Swenshuai.xichanges in configuration values between the two files. 19*53ee8cc1Swenshuai.xi 20*53ee8cc1Swenshuai.xiAdded and removed items are shown with a leading plus or minus, respectively. 21*53ee8cc1Swenshuai.xiChanged items show the old and new values on a single line. 22*53ee8cc1Swenshuai.xi 23*53ee8cc1Swenshuai.xiIf -m is specified, then output will be in "merge" style, which has the 24*53ee8cc1Swenshuai.xichanged and new values in kernel config option format. 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xiIf no config files are specified, .config and .config.old are used. 27*53ee8cc1Swenshuai.xi 28*53ee8cc1Swenshuai.xiExample usage: 29*53ee8cc1Swenshuai.xi $ diffconfig .config config-with-some-changes 30*53ee8cc1Swenshuai.xi-EXT2_FS_XATTR n 31*53ee8cc1Swenshuai.xi-EXT2_FS_XIP n 32*53ee8cc1Swenshuai.xi CRAMFS n -> y 33*53ee8cc1Swenshuai.xi EXT2_FS y -> n 34*53ee8cc1Swenshuai.xi LOG_BUF_SHIFT 14 -> 16 35*53ee8cc1Swenshuai.xi PRINTK_TIME n -> y 36*53ee8cc1Swenshuai.xi""" 37*53ee8cc1Swenshuai.xi sys.exit(0) 38*53ee8cc1Swenshuai.xi 39*53ee8cc1Swenshuai.xi# returns a dictionary of name/value pairs for config items in the file 40*53ee8cc1Swenshuai.xidef readconfig(config_file): 41*53ee8cc1Swenshuai.xi d = {} 42*53ee8cc1Swenshuai.xi for line in config_file: 43*53ee8cc1Swenshuai.xi line = line[:-1] 44*53ee8cc1Swenshuai.xi if line[:7] == "CONFIG_": 45*53ee8cc1Swenshuai.xi name, val = line[7:].split("=", 1) 46*53ee8cc1Swenshuai.xi d[name] = val 47*53ee8cc1Swenshuai.xi if line[-11:] == " is not set": 48*53ee8cc1Swenshuai.xi d[line[9:-11]] = "n" 49*53ee8cc1Swenshuai.xi return d 50*53ee8cc1Swenshuai.xi 51*53ee8cc1Swenshuai.xidef print_config(op, config, value, new_value): 52*53ee8cc1Swenshuai.xi global merge_style 53*53ee8cc1Swenshuai.xi 54*53ee8cc1Swenshuai.xi if merge_style: 55*53ee8cc1Swenshuai.xi if new_value: 56*53ee8cc1Swenshuai.xi if new_value=="n": 57*53ee8cc1Swenshuai.xi print "# CONFIG_%s is not set" % config 58*53ee8cc1Swenshuai.xi else: 59*53ee8cc1Swenshuai.xi print "CONFIG_%s=%s" % (config, new_value) 60*53ee8cc1Swenshuai.xi else: 61*53ee8cc1Swenshuai.xi if op=="-": 62*53ee8cc1Swenshuai.xi print "-%s %s" % (config, value) 63*53ee8cc1Swenshuai.xi elif op=="+": 64*53ee8cc1Swenshuai.xi print "+%s %s" % (config, new_value) 65*53ee8cc1Swenshuai.xi else: 66*53ee8cc1Swenshuai.xi print " %s %s -> %s" % (config, value, new_value) 67*53ee8cc1Swenshuai.xi 68*53ee8cc1Swenshuai.xidef main(): 69*53ee8cc1Swenshuai.xi global merge_style 70*53ee8cc1Swenshuai.xi 71*53ee8cc1Swenshuai.xi # parse command line args 72*53ee8cc1Swenshuai.xi if ("-h" in sys.argv or "--help" in sys.argv): 73*53ee8cc1Swenshuai.xi usage() 74*53ee8cc1Swenshuai.xi 75*53ee8cc1Swenshuai.xi merge_style = 0 76*53ee8cc1Swenshuai.xi if "-m" in sys.argv: 77*53ee8cc1Swenshuai.xi merge_style = 1 78*53ee8cc1Swenshuai.xi sys.argv.remove("-m") 79*53ee8cc1Swenshuai.xi 80*53ee8cc1Swenshuai.xi argc = len(sys.argv) 81*53ee8cc1Swenshuai.xi if not (argc==1 or argc == 3): 82*53ee8cc1Swenshuai.xi print "Error: incorrect number of arguments or unrecognized option" 83*53ee8cc1Swenshuai.xi usage() 84*53ee8cc1Swenshuai.xi 85*53ee8cc1Swenshuai.xi if argc == 1: 86*53ee8cc1Swenshuai.xi # if no filenames given, assume .config and .config.old 87*53ee8cc1Swenshuai.xi build_dir="" 88*53ee8cc1Swenshuai.xi if os.environ.has_key("KBUILD_OUTPUT"): 89*53ee8cc1Swenshuai.xi build_dir = os.environ["KBUILD_OUTPUT"]+"/" 90*53ee8cc1Swenshuai.xi 91*53ee8cc1Swenshuai.xi configa_filename = build_dir + ".config.old" 92*53ee8cc1Swenshuai.xi configb_filename = build_dir + ".config" 93*53ee8cc1Swenshuai.xi else: 94*53ee8cc1Swenshuai.xi configa_filename = sys.argv[1] 95*53ee8cc1Swenshuai.xi configb_filename = sys.argv[2] 96*53ee8cc1Swenshuai.xi 97*53ee8cc1Swenshuai.xi a = readconfig(file(configa_filename)) 98*53ee8cc1Swenshuai.xi b = readconfig(file(configb_filename)) 99*53ee8cc1Swenshuai.xi 100*53ee8cc1Swenshuai.xi # print items in a but not b (accumulate, sort and print) 101*53ee8cc1Swenshuai.xi old = [] 102*53ee8cc1Swenshuai.xi for config in a: 103*53ee8cc1Swenshuai.xi if config not in b: 104*53ee8cc1Swenshuai.xi old.append(config) 105*53ee8cc1Swenshuai.xi old.sort() 106*53ee8cc1Swenshuai.xi for config in old: 107*53ee8cc1Swenshuai.xi print_config("-", config, a[config], None) 108*53ee8cc1Swenshuai.xi del a[config] 109*53ee8cc1Swenshuai.xi 110*53ee8cc1Swenshuai.xi # print items that changed (accumulate, sort, and print) 111*53ee8cc1Swenshuai.xi changed = [] 112*53ee8cc1Swenshuai.xi for config in a: 113*53ee8cc1Swenshuai.xi if a[config] != b[config]: 114*53ee8cc1Swenshuai.xi changed.append(config) 115*53ee8cc1Swenshuai.xi else: 116*53ee8cc1Swenshuai.xi del b[config] 117*53ee8cc1Swenshuai.xi changed.sort() 118*53ee8cc1Swenshuai.xi for config in changed: 119*53ee8cc1Swenshuai.xi print_config("->", config, a[config], b[config]) 120*53ee8cc1Swenshuai.xi del b[config] 121*53ee8cc1Swenshuai.xi 122*53ee8cc1Swenshuai.xi # now print items in b but not in a 123*53ee8cc1Swenshuai.xi # (items from b that were in a were removed above) 124*53ee8cc1Swenshuai.xi new = b.keys() 125*53ee8cc1Swenshuai.xi new.sort() 126*53ee8cc1Swenshuai.xi for config in new: 127*53ee8cc1Swenshuai.xi print_config("+", config, None, b[config]) 128*53ee8cc1Swenshuai.xi 129*53ee8cc1Swenshuai.ximain() 130