From 6c928c63a18cfc9e2a700cdd88a8db08a8680eb1 Mon Sep 17 00:00:00 2001 From: Alper Nebi Yasak Date: Sat, 29 Jan 2022 18:22:08 +0300 Subject: moveconfig: Fix code relying on now-stripped newline characters Commit 37f815cad07d ("moveconfig: Use a function to read files") adds a helper function that can read a file as lines, but strips the newline characters. This change broke parts of moveconfig code that relied on their existence, resulting in a few issues: Configs that are defined as empty aren't removed from header files (e.g. "#define CONFIG_REMAKE_ELF"). Make regex patterns use '\b' to match word boundaries instead of '\W' (which matched the newlines) so these lines still match and get removed. All changes in defconfig are considered removed by savedefconfig even if they weren't, and line continuations in the headers aren't recognized and removed properly, because their checks explicitly look for a newline character. Remove the character from both comparisons. The printed diff of header files is wrongly formatted and raises an IndexError if a blank line was removed. Let print() print the new lines, and use size-independent ways to check strings to fix the diff output. Signed-off-by: Alper Nebi Yasak Reviewed-by: Simon Glass Tested-by: Simon Glass --- tools/moveconfig.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/moveconfig.py b/tools/moveconfig.py index 35fe671..1bcf58c 100755 --- a/tools/moveconfig.py +++ b/tools/moveconfig.py @@ -205,12 +205,12 @@ def show_diff(alines, blines, file_path, color_enabled): tofile=os.path.join('b', file_path)) for line in diff: - if line[0] == '-' and line[1] != '-': - print(color_text(color_enabled, COLOR_RED, line), end=' ') - elif line[0] == '+' and line[1] != '+': - print(color_text(color_enabled, COLOR_GREEN, line), end=' ') + if line.startswith('-') and not line.startswith('--'): + print(color_text(color_enabled, COLOR_RED, line)) + elif line.startswith('+') and not line.startswith('++'): + print(color_text(color_enabled, COLOR_GREEN, line)) else: - print(line, end=' ') + print(line) def extend_matched_lines(lines, matched, pre_patterns, post_patterns, extend_pre, extend_post): @@ -368,7 +368,7 @@ def cleanup_one_header(header_path, patterns, args): matched = [] for i, line in enumerate(lines): - if i - 1 in matched and lines[i - 1][-2:] == '\\\n': + if i - 1 in matched and lines[i - 1].endswith('\\'): matched.append(i) continue for pattern in patterns: @@ -380,9 +380,9 @@ def cleanup_one_header(header_path, patterns, args): return # remove empty #ifdef ... #endif, successive blank lines - pattern_if = re.compile(r'#\s*if(def|ndef)?\W') # #if, #ifdef, #ifndef - pattern_elif = re.compile(r'#\s*el(if|se)\W') # #elif, #else - pattern_endif = re.compile(r'#\s*endif\W') # #endif + pattern_if = re.compile(r'#\s*if(def|ndef)?\b') # #if, #ifdef, #ifndef + pattern_elif = re.compile(r'#\s*el(if|se)\b') # #elif, #else + pattern_endif = re.compile(r'#\s*endif\b') # #endif pattern_blank = re.compile(r'^\s*$') # empty line while True: @@ -424,8 +424,8 @@ def cleanup_headers(configs, args): patterns = [] for config in configs: - patterns.append(re.compile(r'#\s*define\s+%s\W' % config)) - patterns.append(re.compile(r'#\s*undef\s+%s\W' % config)) + patterns.append(re.compile(r'#\s*define\s+%s\b' % config)) + patterns.append(re.compile(r'#\s*undef\s+%s\b' % config)) for dir in 'include', 'arch', 'board': for (dirpath, dirnames, filenames) in os.walk(dir): @@ -451,7 +451,7 @@ def cleanup_one_extra_option(defconfig_path, configs, args): """ start = 'CONFIG_SYS_EXTRA_OPTIONS="' - end = '"\n' + end = '"' lines = read_file(defconfig_path) @@ -812,7 +812,7 @@ class KconfigParser: for (action, value) in self.results: if action != ACTION_MOVE: continue - if not value + '\n' in defconfig_lines: + if not value in defconfig_lines: log += color_text(self.args.color, COLOR_YELLOW, "'%s' was removed by savedefconfig.\n" % value) -- cgit v1.1 From fcc87efdf3772e6e8d060dc10d521442d7772ce9 Mon Sep 17 00:00:00 2001 From: Jan Kiszka Date: Fri, 28 Jan 2022 20:37:53 +0100 Subject: binman: Skip node generation for images read from files We can and should run the node generator only when creating a new image. When we read it back, there is no need to generate nodes - they already exits, and binman does not dive that deep into the image - and there is no way to provide the required fdt-list. So store the mode in the image object so that Entry_fit can simply skip generator nodes when reading them from an fdtmap. This unbreaks all read-backs of images that contain generator nodes in their fdtmap. To confirm this, add a corresponding test case. Signed-off-by: Jan Kiszka Reviewed-by: Simon Glass Tested-by: Simon Glass Add SPDX to dts file: Signed-off-by: Simon Glass --- tools/binman/etype/fit.py | 2 +- tools/binman/ftest.py | 18 ++++++++++++++++++ tools/binman/image.py | 9 +++++++-- tools/binman/test/219_fit_gennode.dts | 26 ++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 tools/binman/test/219_fit_gennode.dts diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py index 6e5f020..6ad4a68 100644 --- a/tools/binman/etype/fit.py +++ b/tools/binman/etype/fit.py @@ -194,7 +194,7 @@ class Entry_fit(Entry): # the FIT (e.g. "/images/kernel/u-boot"), so don't call # fsw.add_node() or _AddNode() for it. pass - elif subnode.name.startswith('@'): + elif self.GetImage().generate and subnode.name.startswith('@'): if self._fdts: # Generate notes for each FDT for seq, fdt_fname in enumerate(self._fdts): diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index ca200ae..5400f76 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -5100,6 +5100,24 @@ fdt fdtmap Extract the devicetree blob from the fdtmap self.assertIn('Documentation is missing for modules: mkimage', str(e.exception)) + def testListWithGenNode(self): + """Check handling of an FDT map when the section cannot be found""" + entry_args = { + 'of-list': 'test-fdt1 test-fdt2', + } + data = self._DoReadFileDtb( + '219_fit_gennode.dts', + entry_args=entry_args, + use_real_dtb=True, + extra_indirs=[os.path.join(self._indir, TEST_FDT_SUBDIR)]) + + try: + tmpdir, updated_fname = self._SetupImageInTmpdir() + with test_util.capture_sys_output() as (stdout, stderr): + self._RunBinman('ls', '-i', updated_fname) + finally: + shutil.rmtree(tmpdir) + if __name__ == "__main__": unittest.main() diff --git a/tools/binman/image.py b/tools/binman/image.py index 0f0c1d2..cb5279c 100644 --- a/tools/binman/image.py +++ b/tools/binman/image.py @@ -67,9 +67,13 @@ class Image(section.Entry_section): does not exist in binman. This is useful if an image was created by binman a newer version of binman but we want to list it in an older version which does not support all the entry types. + generate: If true, generator nodes are processed. If false they are + ignored which is useful when an existing image is read back from a + file. """ def __init__(self, name, node, copy_to_orig=True, test=False, - ignore_missing=False, use_expanded=False, missing_etype=False): + ignore_missing=False, use_expanded=False, missing_etype=False, + generate=True): super().__init__(None, 'section', node, test=test) self.copy_to_orig = copy_to_orig self.name = 'main-section' @@ -83,6 +87,7 @@ class Image(section.Entry_section): self.use_expanded = use_expanded self.test_section_timeout = False self.bintools = {} + self.generate = generate if not test: self.ReadNode() @@ -131,7 +136,7 @@ class Image(section.Entry_section): # Return an Image with the associated nodes root = dtb.GetRoot() image = Image('image', root, copy_to_orig=False, ignore_missing=True, - missing_etype=True) + missing_etype=True, generate=False) image.image_node = fdt_util.GetString(root, 'image-node', 'image') image.fdtmap_dtb = dtb diff --git a/tools/binman/test/219_fit_gennode.dts b/tools/binman/test/219_fit_gennode.dts new file mode 100644 index 0000000..e9eda29 --- /dev/null +++ b/tools/binman/test/219_fit_gennode.dts @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0+ + +/dts-v1/; + +/ { + #address-cells = <1>; + #size-cells = <1>; + + binman { + fit { + description = "test-desc"; + #address-cells = <1>; + fit,fdt-list = "of-list"; + + images { + @fdt-SEQ { + description = "fdt-NAME.dtb"; + type = "flat_dt"; + compression = "none"; + }; + }; + }; + fdtmap { + }; + }; +}; -- cgit v1.1