tools: moveconfig: trim garbage lines after header cleanups

The tools/moveconfig.py has a feature to cleanup #define/#undef's
of moved config options, but I want this tool to do a better job.

For example, when we are moving CONFIG_FOO and its define is
surrounded by #ifdef ... #endif, like follows:

  #ifdef CONFIG_BAR
  #  define CONFIG_FOO
  #endif

The header cleanup will leave empty #ifdef ... #endif:

  #ifdef CONFIG_BAR
  #endif

Likewise, if a define line between two blank lines

  <blank line>
  #define CONFIG_FOO
  <blank lines.

... is deleted, the result of the clean-up will be successive empty
lines, which is a coding-style violation.

It is tedious to remove left-over garbage lines manually, so I want
the tool to take care of this.  The tool's job is still not perfect,
so we should check the output of the tool, but I hope our life will
be much easier with this patch.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
master
Masahiro Yamada 8 years ago committed by Tom Rini
parent f7536f798d
commit 8ba1f5de45
  1. 85
      tools/moveconfig.py

@ -160,6 +160,7 @@ To see the complete list of supported options, run
"""
import copy
import filecmp
import fnmatch
import multiprocessing
@ -319,6 +320,57 @@ def update_cross_compile(color_enabled):
CROSS_COMPILE[arch] = cross_compile
def extend_matched_lines(lines, matched, pre_patterns, post_patterns, extend_pre,
extend_post):
"""Extend matched lines if desired patterns are found before/after already
matched lines.
Arguments:
lines: A list of lines handled.
matched: A list of line numbers that have been already matched.
(will be updated by this function)
pre_patterns: A list of regular expression that should be matched as
preamble.
post_patterns: A list of regular expression that should be matched as
postamble.
extend_pre: Add the line number of matched preamble to the matched list.
extend_post: Add the line number of matched postamble to the matched list.
"""
extended_matched = []
j = matched[0]
for i in matched:
if i == 0 or i < j:
continue
j = i
while j in matched:
j += 1
if j >= len(lines):
break
for p in pre_patterns:
if p.search(lines[i - 1]):
break
else:
# not matched
continue
for p in post_patterns:
if p.search(lines[j]):
break
else:
# not matched
continue
if extend_pre:
extended_matched.append(i - 1)
if extend_post:
extended_matched.append(j)
matched += extended_matched
matched.sort()
def cleanup_one_header(header_path, patterns, dry_run):
"""Clean regex-matched lines away from a file.
@ -334,13 +386,38 @@ def cleanup_one_header(header_path, patterns, dry_run):
matched = []
for i, line in enumerate(lines):
for pattern in patterns:
m = pattern.search(line)
if m:
print '%s: %s: %s' % (header_path, i + 1, line),
if pattern.search(line):
matched.append(i)
break
if dry_run or not matched:
if not matched:
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_blank = re.compile(r'^\s*$') # empty line
while True:
old_matched = copy.copy(matched)
extend_matched_lines(lines, matched, [pattern_if],
[pattern_endif], True, True)
extend_matched_lines(lines, matched, [pattern_elif],
[pattern_elif, pattern_endif], True, False)
extend_matched_lines(lines, matched, [pattern_if, pattern_elif],
[pattern_blank], False, True)
extend_matched_lines(lines, matched, [pattern_blank],
[pattern_elif, pattern_endif], True, False)
extend_matched_lines(lines, matched, [pattern_blank],
[pattern_blank], True, False)
if matched == old_matched:
break
for i in matched:
print '%s: %s: %s' % (header_path, i + 1, lines[i]),
if dry_run:
return
with open(header_path, 'w') as f:

Loading…
Cancel
Save