Re: [OS-BUILD PATCHv2 1/3] redhat: update merge.py to handle merge.pl corner cases

2023-01-26 Thread Clark Williams (via Email Bridge)
From: Clark Williams on gitlab.com
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/2262#note_1254465038

Updated to address review suggestions and pylint complaints.
___
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue


[OS-BUILD PATCHv2 1/3] redhat: update merge.py to handle merge.pl corner cases

2023-01-26 Thread Clark Williams (via Email Bridge)
From: Clark Williams 

redhat: update merge.py to handle merge.pl corner cases

Change merge.py to handle input config files in  similar manner to
how merge.pl did it.

Signed-off-by: Clark Williams 

diff --git a/redhat/configs/merge.py b/redhat/configs/merge.py
index blahblah..blahblah 100755
--- a/redhat/configs/merge.py
+++ b/redhat/configs/merge.py
@@ -5,54 +5,77 @@
 #
 # merge.py - a direct replacement for merge.pl in the redhat/configs directory
 #
-# invocation:   python merge.py overrides baseconfig
+# invocation:   python merge.py overrides baseconfig [arch]
 #
-# Both input files are kernel config files, where overides is config overides
-# to the baseconfig file. Both are read into python dictionaries with the
-# keys being the config name and the values being the config file text
-
-# The script iterates through the overrides keys adding/replacing the contents
-# of the baseconfig values and then outputs the new baseconfig to stdout.
+# This script merges two kernel configuration files, an override file and a
+# base config file and writes the results to stdout.
 #
+# The script reads the overrides into a dictionary, then reads the baseconfig
+# file, looking for overrides and replacing any found, then printing the result
+# to stdout. Finally any remaining (new) configs in the override are appended 
to the
+# end of the output
 
 import sys
+import re
 import os.path
 
 def usage(msg):
-print(msg)
-print("usage: merge.py overrides baseconfig")
+sys.stderr.write(msg + "\n")
+sys.stderr.write("usage: merge.py overrides baseconfig [arch]\n")
 sys.exit(1)
 
-# read a config file and return a dictionary of the contents
-def read_config_file(cfgfile):
-configs = {}
-with open(cfgfile) as f:
-for l in [n.strip() for n in f.readlines()]:
-if not l:  continue
-if l.startswith("# CONFIG_"):
-configs[l.split()[1]] = l
-continue
-if l.startswith("CONFIG_"):
-configs[l.split('=')[0]] = l
-continue
-return configs
-
-
-if len(sys.argv) < 3: usage("must have two input files")
-
-# read in the overides file
-if not os.path.exists(sys.argv[1]):
-usage("overrides config file %s does not exist!" % sys.argv[1])
-overrides = read_config_file(sys.argv[1])
-
-# read in the base config file
-if not os.path.exists(sys.argv[2]):
-usage("base config file %s does not exist!" % sys.argv[2])
-baseconfigs = read_config_file(sys.argv[2])
-
-# update baseconfigs with the overrides values
-baseconfigs.update(overrides)
-
-# print the new config to stdout
-for v in baseconfigs.values():
-print(v)
+isset = re.compile(r'^(CONFIG_\w+)=')
+notset = re.compile(r'^#\s+(CONFIG_\w+)\s+is not set')
+
+# search an input line for a config (set or notset) pattern
+# if we get a match return the config that is being changed
+def find_config(line):
+if m := isset .match(line):
+return m.group(1)
+if m := notset.match(line):
+return m.group(1)
+return None
+
+#
+
+if len(sys.argv) < 3:
+usage("must have two input files")
+
+override_file = sys.argv[1]
+baseconfig_file = sys.argv[2]
+
+if not os.path.exists(override_file):
+usage("overrides config file %s does not exist!" % override_file)
+
+if not os.path.exists(baseconfig_file):
+usage("base configs file %s does not exist" % baseconfig_file)
+
+if len(sys.argv) == 4:
+print("# %s" % sys.argv[3])
+
+# read each line of the override file and store any configuration values
+# in the overrides dictionary, keyed by the configuration name.
+overrides = {}
+with open(override_file, "rt") as f:
+for l in [n.strip() for n in f.readlines()]:
+if c := find_config(l):
+overrides[c] = l
+
+# now read and print the base config, checking each line
+# that defines a config value and printing the override if
+# it exists
+with open(baseconfig_file, "rt") as f:
+for line in [ l.strip() for l in f.readlines() ]:
+c = find_config(line)
+if c and c in overrides:
+print(overrides[c])
+del overrides[c]
+else:
+print(line)
+
+# print out the remaining configs (new values)
+# from the overrides file
+for c in overrides:
+print (overrides[c])
+
+sys.exit(0)

--
https://gitlab.com/cki-project/kernel-ark/-/merge_requests/2262
___
kernel mailing list -- kernel@lists.fedoraproject.org
To unsubscribe send an email to kernel-le...@lists.fedoraproject.org
Fedora Code of Conduct: 
https://docs.fedoraproject.org/en-US/project/code-of-conduct/
List Guidelines: https://fedoraproject.org/wiki/Mailing_list_guidelines
List Archives: 
https://lists.fedoraproject.org/archives/list/kernel@lists.fedoraproject.org
Do not reply to spam, report it: 
https://pagure.io/fedora-infrastructure/new_issue