[PATCH] moveconfig: Fix code relying on now-stripped newline characters

Simon Glass sjg at chromium.org
Sat Jan 29 22:09:47 CET 2022


Hi Alper,

On Sat, 29 Jan 2022 at 08:22, Alper Nebi Yasak <alpernebiyasak at gmail.com> wrote:
>
> 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 <alpernebiyasak at gmail.com>
> ---
>
>  tools/moveconfig.py | 26 +++++++++++++-------------
>  1 file changed, 13 insertions(+), 13 deletions(-)

I was a little worried about the subtleties here. Thanks for fixing
it! I almost got annoyed and wrote some tests, but I guess we can limp
on without them.

>
> diff --git a/tools/moveconfig.py b/tools/moveconfig.py
> index 35fe6710d70a..1bcf58caf14c 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 @@ def check_defconfig(self):
>          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)
> --
> 2.34.1
>

Regards,
Simon


More information about the U-Boot mailing list