Blame view

scripts/diffconfig 3.72 KB
a717417e7   Tim Bird   kconfig: add diff...
1
  #!/usr/bin/python
b24413180   Greg Kroah-Hartman   License cleanup: ...
2
  # SPDX-License-Identifier: GPL-2.0
a717417e7   Tim Bird   kconfig: add diff...
3
4
5
6
7
8
9
10
11
12
13
  #
  # 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():
c8272faf5   Mike Pagano   diffconfig: Updat...
14
      print("""Usage: diffconfig [-h] [-m] [<config1> <config2>]
a717417e7   Tim Bird   kconfig: add diff...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  
  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
a717417e7   Tim Bird   kconfig: add diff...
32
33
34
35
   CRAMFS  n -> y
   EXT2_FS  y -> n
   LOG_BUF_SHIFT  14 -> 16
   PRINTK_TIME  n -> y
c8272faf5   Mike Pagano   diffconfig: Updat...
36
  """)
a717417e7   Tim Bird   kconfig: add diff...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
      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":
c8272faf5   Mike Pagano   diffconfig: Updat...
57
                  print("# CONFIG_%s is not set" % config)
a717417e7   Tim Bird   kconfig: add diff...
58
              else:
c8272faf5   Mike Pagano   diffconfig: Updat...
59
                  print("CONFIG_%s=%s" % (config, new_value))
a717417e7   Tim Bird   kconfig: add diff...
60
61
      else:
          if op=="-":
c8272faf5   Mike Pagano   diffconfig: Updat...
62
              print("-%s %s" % (config, value))
a717417e7   Tim Bird   kconfig: add diff...
63
          elif op=="+":
c8272faf5   Mike Pagano   diffconfig: Updat...
64
              print("+%s %s" % (config, new_value))
a717417e7   Tim Bird   kconfig: add diff...
65
          else:
c8272faf5   Mike Pagano   diffconfig: Updat...
66
              print(" %s %s -> %s" % (config, value, new_value))
a717417e7   Tim Bird   kconfig: add diff...
67
68
69
70
71
72
  
  def main():
      global merge_style
  
      # parse command line args
      if ("-h" in sys.argv or "--help" in sys.argv):
c8272faf5   Mike Pagano   diffconfig: Updat...
73
          usage()
a717417e7   Tim Bird   kconfig: add diff...
74
75
76
77
78
79
80
81
  
      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):
c8272faf5   Mike Pagano   diffconfig: Updat...
82
          print("Error: incorrect number of arguments or unrecognized option")
a717417e7   Tim Bird   kconfig: add diff...
83
84
85
86
87
          usage()
  
      if argc == 1:
          # if no filenames given, assume .config and .config.old
          build_dir=""
c8272faf5   Mike Pagano   diffconfig: Updat...
88
          if "KBUILD_OUTPUT" in os.environ:
a717417e7   Tim Bird   kconfig: add diff...
89
              build_dir = os.environ["KBUILD_OUTPUT"]+"/"
a717417e7   Tim Bird   kconfig: add diff...
90
91
92
93
94
          configa_filename = build_dir + ".config.old"
          configb_filename = build_dir + ".config"
      else:
          configa_filename = sys.argv[1]
          configb_filename = sys.argv[2]
6bf2e84b8   Mike Pagano   diffconfig: Grace...
95
      try:
c8272faf5   Mike Pagano   diffconfig: Updat...
96
97
          a = readconfig(open(configa_filename))
          b = readconfig(open(configb_filename))
6bf2e84b8   Mike Pagano   diffconfig: Grace...
98
99
100
101
102
      except (IOError):
          e = sys.exc_info()[1]
          print("I/O error[%s]: %s
  " % (e.args[0],e.args[1]))
          usage()
a717417e7   Tim Bird   kconfig: add diff...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  
      # 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)
c8272faf5   Mike Pagano   diffconfig: Updat...
128
      new = sorted(b.keys())
a717417e7   Tim Bird   kconfig: add diff...
129
130
131
132
      for config in new:
          print_config("+", config, None, b[config])
  
  main()