123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- #!/usr/bin/python
- #
- # diffconfig - a tool to compare .config files.
- #
- # originally written in 2006 by Matt Mackall
- # (at least, this was in his bloatwatch source code)
- # last worked on 2008 by Tim Bird
- #
- import sys, os
- def usage():
- print """Usage: diffconfig [-h] [-m] [<config1> <config2>]
- Diffconfig is a simple utility for comparing two .config files.
- Using standard diff to compare .config files often includes extraneous and
- distracting information. This utility produces sorted output with only the
- changes in configuration values between the two files.
- Added and removed items are shown with a leading plus or minus, respectively.
- Changed items show the old and new values on a single line.
- If -m is specified, then output will be in "merge" style, which has the
- changed and new values in kernel config option format.
- If no config files are specified, .config and .config.old are used.
- Example usage:
- $ diffconfig .config config-with-some-changes
- -EXT2_FS_XATTR n
- -EXT2_FS_XIP n
- CRAMFS n -> y
- EXT2_FS y -> n
- LOG_BUF_SHIFT 14 -> 16
- PRINTK_TIME n -> y
- """
- sys.exit(0)
- # returns a dictionary of name/value pairs for config items in the file
- def readconfig(config_file):
- d = {}
- for line in config_file:
- line = line[:-1]
- if line[:7] == "CONFIG_":
- name, val = line[7:].split("=", 1)
- d[name] = val
- if line[-11:] == " is not set":
- d[line[9:-11]] = "n"
- return d
- def print_config(op, config, value, new_value):
- global merge_style
- if merge_style:
- if new_value:
- if new_value=="n":
- print "# CONFIG_%s is not set" % config
- else:
- print "CONFIG_%s=%s" % (config, new_value)
- else:
- if op=="-":
- print "-%s %s" % (config, value)
- elif op=="+":
- print "+%s %s" % (config, new_value)
- else:
- print " %s %s -> %s" % (config, value, new_value)
- def main():
- global merge_style
- # parse command line args
- if ("-h" in sys.argv or "--help" in sys.argv):
- usage()
- merge_style = 0
- if "-m" in sys.argv:
- merge_style = 1
- sys.argv.remove("-m")
- argc = len(sys.argv)
- if not (argc==1 or argc == 3):
- print "Error: incorrect number of arguments or unrecognized option"
- usage()
- if argc == 1:
- # if no filenames given, assume .config and .config.old
- build_dir=""
- if os.environ.has_key("KBUILD_OUTPUT"):
- build_dir = os.environ["KBUILD_OUTPUT"]+"/"
- configa_filename = build_dir + ".config.old"
- configb_filename = build_dir + ".config"
- else:
- configa_filename = sys.argv[1]
- configb_filename = sys.argv[2]
- a = readconfig(file(configa_filename))
- b = readconfig(file(configb_filename))
- # print items in a but not b (accumulate, sort and print)
- old = []
- for config in a:
- if config not in b:
- old.append(config)
- old.sort()
- for config in old:
- print_config("-", config, a[config], None)
- del a[config]
- # print items that changed (accumulate, sort, and print)
- changed = []
- for config in a:
- if a[config] != b[config]:
- changed.append(config)
- else:
- del b[config]
- changed.sort()
- for config in changed:
- print_config("->", config, a[config], b[config])
- del b[config]
- # now print items in b but not in a
- # (items from b that were in a were removed above)
- new = b.keys()
- new.sort()
- for config in new:
- print_config("+", config, None, b[config])
- main()
|