* [PATCH v2 0/5] checkkconfigsymbols: several updates
@ 2016-08-28 6:51 Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 1/5] checkkconfigsymbols.py: port to Python 3 Valentin Rothberg
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
Note that the patches base on [1], which has already been applied to
Greg's char-misc tree [2] (testing branch).
[1] https://lkml.org/lkml/2016/8/27/50
[2] git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
Changelog v2:
- Break v1 into multiple changes (i.e., python3 port, ArgumentParser,
pylint/pep8 warnings)
- More descriptive commit messages
Valentin Rothberg (5):
checkkconfigsymbols.py: port to Python 3
checkkconfigsymbols: use ArgumentParser
checkkconfigsymbols.py: fix pylint and pep8 warnings
checkkconfigsymblos: consistent symbol terminology
checkkconfigsymbols: use arglist instead of cmd string
scripts/checkkconfigsymbols.py | 338 ++++++++++++++++++++---------------------
1 file changed, 169 insertions(+), 169 deletions(-)
--
2.9.3
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/5] checkkconfigsymbols.py: port to Python 3
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
@ 2016-08-28 6:51 ` Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 2/5] checkkconfigsymbols: use ArgumentParser Valentin Rothberg
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
Python 2 is slowly dying, so port the script to Python 3.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
---
scripts/checkkconfigsymbols.py | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 0cae73b5c925..2b13d8a5c0f6 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2
+#!/usr/bin/env python3
"""Find Kconfig symbols that are referenced but not defined."""
@@ -128,9 +128,9 @@ def main():
if opts.sim and not opts.commit and not opts.diff:
sims = find_sims(opts.sim, opts.ignore)
if sims:
- print "%s: %s" % (yel("Similar symbols"), ', '.join(sims))
+ print("%s: %s" % (yel("Similar symbols"), ', '.join(sims)))
else:
- print "%s: no similar symbols found" % yel("Similar symbols")
+ print("%s: no similar symbols found" % yel("Similar symbols"))
sys.exit(0)
# dictionary of (un)defined symbols
@@ -183,28 +183,28 @@ def main():
# now print the output
for feature in sorted(undefined):
- print red(feature)
+ print(red(feature))
files = sorted(undefined.get(feature))
- print "%s: %s" % (yel("Referencing files"), ", ".join(files))
+ print("%s: %s" % (yel("Referencing files"), ", ".join(files)))
sims = find_sims(feature, opts.ignore, defined)
sims_out = yel("Similar symbols")
if sims:
- print "%s: %s" % (sims_out, ', '.join(sims))
+ print("%s: %s" % (sims_out, ', '.join(sims)))
else:
- print "%s: %s" % (sims_out, "no similar symbols found")
+ print("%s: %s" % (sims_out, "no similar symbols found"))
if opts.find:
- print "%s:" % yel("Commits changing symbol")
+ print("%s:" % yel("Commits changing symbol"))
commits = find_commits(feature, opts.diff)
if commits:
for commit in commits:
commit = commit.split(" ", 1)
- print "\t- %s (\"%s\")" % (yel(commit[0]), commit[1])
+ print("\t- %s (\"%s\")" % (yel(commit[0]), commit[1]))
else:
- print "\t- no commit found"
- print # new line
+ print("\t- no commit found")
+ print() # new line
def yel(string):
@@ -225,7 +225,8 @@ def execute(cmd):
"""Execute %cmd and return stdout. Exit in case of error."""
try:
cmdlist = cmd.split(" ")
- stdout = subprocess.check_output(cmdlist, stderr=STDOUT, shell=False)
+ stdout = subprocess.check_output(cmdlist, stderr=subprocess.STDOUT, shell=False)
+ stdout = stdout.decode(errors='replace')
except subprocess.CalledProcessError as fail:
exit("Failed to execute %s\n%s" % (cmd, fail))
return stdout
@@ -256,7 +257,7 @@ def get_head():
def partition(lst, size):
"""Partition list @lst into eveni-sized lists of size @size."""
- return [lst[i::size] for i in xrange(size)]
+ return [lst[i::size] for i in range(size)]
def init_worker():
@@ -350,7 +351,7 @@ def check_symbols_helper(pool, ignore):
# inverse mapping of referenced_features to dict(feature: [files])
inv_map = dict()
- for _file, features in referenced_features.iteritems():
+ for _file, features in referenced_features.items():
for feature in features:
inv_map[feature] = inv_map.get(feature, set())
inv_map[feature].add(_file)
@@ -388,7 +389,7 @@ def parse_source_file(sfile):
if not os.path.exists(sfile):
return references
- with open(sfile, "r") as stream:
+ with open(sfile, "r", encoding='utf-8', errors='replace') as stream:
lines = stream.readlines()
for line in lines:
@@ -437,7 +438,7 @@ def parse_kconfig_file(kfile):
if not os.path.exists(kfile):
return defined, references
- with open(kfile, "r") as stream:
+ with open(kfile, "r", encoding='utf-8', errors='replace') as stream:
lines = stream.readlines()
for i in range(len(lines)):
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/5] checkkconfigsymbols: use ArgumentParser
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 1/5] checkkconfigsymbols.py: port to Python 3 Valentin Rothberg
@ 2016-08-28 6:51 ` Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 3/5] checkkconfigsymbols.py: fix pylint and pep8 warnings Valentin Rothberg
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
Replace the deprecated OptionParser with ArgumentParser, as recommended
by pylint.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
---
scripts/checkkconfigsymbols.py | 142 ++++++++++++++++++++---------------------
1 file changed, 69 insertions(+), 73 deletions(-)
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 2b13d8a5c0f6..322c5e817b4c 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -8,6 +8,7 @@
# Licensed under the terms of the GNU GPL License version 2
+import argparse
import difflib
import os
import re
@@ -15,7 +16,6 @@ import signal
import subprocess
import sys
from multiprocessing import Pool, cpu_count
-from optparse import OptionParser
from subprocess import Popen, PIPE, STDOUT
@@ -43,62 +43,58 @@ REGEX_QUOTES = re.compile("(\"(.*?)\")")
def parse_options():
"""The user interface of this module."""
- usage = "%prog [options]\n\n" \
- "Run this tool to detect Kconfig symbols that are referenced but " \
- "not defined in\nKconfig. The output of this tool has the " \
- "format \'Undefined symbol\\tFile list\'\n\n" \
- "If no option is specified, %prog will default to check your\n" \
- "current tree. Please note that specifying commits will " \
- "\'git reset --hard\'\nyour current tree! You may save " \
- "uncommitted changes to avoid losing data."
-
- parser = OptionParser(usage=usage)
-
- parser.add_option('-c', '--commit', dest='commit', action='store',
- default="",
- help="Check if the specified commit (hash) introduces "
- "undefined Kconfig symbols.")
-
- parser.add_option('-d', '--diff', dest='diff', action='store',
- default="",
- help="Diff undefined symbols between two commits. The "
- "input format bases on Git log's "
- "\'commmit1..commit2\'.")
-
- parser.add_option('-f', '--find', dest='find', action='store_true',
- default=False,
- help="Find and show commits that may cause symbols to be "
- "missing. Required to run with --diff.")
-
- parser.add_option('-i', '--ignore', dest='ignore', action='store',
- default="",
- help="Ignore files matching this pattern. Note that "
- "the pattern needs to be a Python regex. To "
- "ignore defconfigs, specify -i '.*defconfig'.")
-
- parser.add_option('-s', '--sim', dest='sim', action='store', default="",
- help="Print a list of maximum 10 string-similar symbols.")
-
- parser.add_option('', '--force', dest='force', action='store_true',
- default=False,
- help="Reset current Git tree even when it's dirty.")
-
- parser.add_option('', '--no-color', dest='color', action='store_false',
- default=True,
- help="Don't print colored output. Default when not "
- "outputting to a terminal.")
-
- (opts, _) = parser.parse_args()
-
- if opts.commit and opts.diff:
+ usage = "Run this tool to detect Kconfig symbols that are referenced but " \
+ "not defined in Kconfig. If no option is specified, " \
+ "checkkconfigsymbols defaults to check your current tree. " \
+ "Please note that specifying commits will 'git reset --hard\' " \
+ "your current tree! You may save uncommitted changes to avoid " \
+ "losing data."
+
+ parser = argparse.ArgumentParser(description=usage)
+
+ parser.add_argument('-c', '--commit', dest='commit', action='store',
+ default="",
+ help="check if the specified commit (hash) introduces "
+ "undefined Kconfig symbols")
+
+ parser.add_argument('-d', '--diff', dest='diff', action='store',
+ default="",
+ help="diff undefined symbols between two commits "
+ "(e.g., -d commmit1..commit2)")
+
+ parser.add_argument('-f', '--find', dest='find', action='store_true',
+ default=False,
+ help="find and show commits that may cause symbols to be "
+ "missing (required to run with --diff)")
+
+ parser.add_argument('-i', '--ignore', dest='ignore', action='store',
+ default="",
+ help="ignore files matching this Python regex "
+ "(e.g., -i '.*defconfig')")
+
+ parser.add_argument('-s', '--sim', dest='sim', action='store', default="",
+ help="print a list of max. 10 string-similar symbols")
+
+ parser.add_argument('--force', dest='force', action='store_true',
+ default=False,
+ help="reset current Git tree even when it's dirty")
+
+ parser.add_argument('--no-color', dest='color', action='store_false',
+ default=True,
+ help="don't print colored output (default when not "
+ "outputting to a terminal)")
+
+ args = parser.parse_args()
+
+ if args.commit and args.diff:
sys.exit("Please specify only one option at once.")
- if opts.diff and not re.match(r"^[\w\-\.]+\.\.[\w\-\.]+$", opts.diff):
+ if args.diff and not re.match(r"^[\w\-\.]+\.\.[\w\-\.]+$", args.diff):
sys.exit("Please specify valid input in the following format: "
"\'commit1..commit2\'")
- if opts.commit or opts.diff:
- if not opts.force and tree_is_dirty():
+ if args.commit or args.diff:
+ if not args.force and tree_is_dirty():
sys.exit("The current Git tree is dirty (see 'git status'). "
"Running this script may\ndelete important data since it "
"calls 'git reset --hard' for some performance\nreasons. "
@@ -106,27 +102,27 @@ def parse_options():
"'--force' if you\nwant to ignore this warning and "
"continue.")
- if opts.commit:
- opts.find = False
+ if args.commit:
+ args.find = False
- if opts.ignore:
+ if args.ignore:
try:
- re.match(opts.ignore, "this/is/just/a/test.c")
+ re.match(args.ignore, "this/is/just/a/test.c")
except:
sys.exit("Please specify a valid Python regex.")
- return opts
+ return args
def main():
"""Main function of this module."""
- opts = parse_options()
+ args = parse_options()
global color
- color = opts.color and sys.stdout.isatty()
+ color = args.color and sys.stdout.isatty()
- if opts.sim and not opts.commit and not opts.diff:
- sims = find_sims(opts.sim, opts.ignore)
+ if args.sim and not args.commit and not args.diff:
+ sims = find_sims(args.sim, args.ignore)
if sims:
print("%s: %s" % (yel("Similar symbols"), ', '.join(sims)))
else:
@@ -137,17 +133,17 @@ def main():
defined = {}
undefined = {}
- if opts.commit or opts.diff:
+ if args.commit or args.diff:
head = get_head()
# get commit range
commit_a = None
commit_b = None
- if opts.commit:
- commit_a = opts.commit + "~"
- commit_b = opts.commit
- elif opts.diff:
- split = opts.diff.split("..")
+ if args.commit:
+ commit_a = args.commit + "~"
+ commit_b = args.commit
+ elif args.diff:
+ split = args.diff.split("..")
commit_a = split[0]
commit_b = split[1]
undefined_a = {}
@@ -155,11 +151,11 @@ def main():
# get undefined items before the commit
execute("git reset --hard %s" % commit_a)
- undefined_a, _ = check_symbols(opts.ignore)
+ undefined_a, _ = check_symbols(args.ignore)
# get undefined items for the commit
execute("git reset --hard %s" % commit_b)
- undefined_b, defined = check_symbols(opts.ignore)
+ undefined_b, defined = check_symbols(args.ignore)
# report cases that are present for the commit but not before
for feature in sorted(undefined_b):
@@ -179,7 +175,7 @@ def main():
# default to check the entire tree
else:
- undefined, defined = check_symbols(opts.ignore)
+ undefined, defined = check_symbols(args.ignore)
# now print the output
for feature in sorted(undefined):
@@ -188,16 +184,16 @@ def main():
files = sorted(undefined.get(feature))
print("%s: %s" % (yel("Referencing files"), ", ".join(files)))
- sims = find_sims(feature, opts.ignore, defined)
+ sims = find_sims(feature, args.ignore, defined)
sims_out = yel("Similar symbols")
if sims:
print("%s: %s" % (sims_out, ', '.join(sims)))
else:
print("%s: %s" % (sims_out, "no similar symbols found"))
- if opts.find:
+ if args.find:
print("%s:" % yel("Commits changing symbol"))
- commits = find_commits(feature, opts.diff)
+ commits = find_commits(feature, args.diff)
if commits:
for commit in commits:
commit = commit.split(" ", 1)
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/5] checkkconfigsymbols.py: fix pylint and pep8 warnings
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 1/5] checkkconfigsymbols.py: port to Python 3 Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 2/5] checkkconfigsymbols: use ArgumentParser Valentin Rothberg
@ 2016-08-28 6:51 ` Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 4/5] checkkconfigsymblos: consistent symbol terminology Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 5/5] checkkconfigsymbols: use arglist instead of cmd string Valentin Rothberg
4 siblings, 0 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
Fix pylint and pep8 warnings to have a consistent syntax and style.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
---
scripts/checkkconfigsymbols.py | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 322c5e817b4c..4111746b5110 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -16,7 +16,6 @@ import signal
import subprocess
import sys
from multiprocessing import Pool, cpu_count
-from subprocess import Popen, PIPE, STDOUT
# regex expressions
@@ -118,8 +117,8 @@ def main():
"""Main function of this module."""
args = parse_options()
- global color
- color = args.color and sys.stdout.isatty()
+ global COLOR
+ COLOR = args.color and sys.stdout.isatty()
if args.sim and not args.commit and not args.diff:
sims = find_sims(args.sim, args.ignore)
@@ -160,7 +159,7 @@ def main():
# report cases that are present for the commit but not before
for feature in sorted(undefined_b):
# feature has not been undefined before
- if not feature in undefined_a:
+ if feature not in undefined_a:
files = sorted(undefined_b.get(feature))
undefined[feature] = files
# check if there are new files that reference the undefined feature
@@ -200,21 +199,21 @@ def main():
print("\t- %s (\"%s\")" % (yel(commit[0]), commit[1]))
else:
print("\t- no commit found")
- print() # new line
+ print() # new line
def yel(string):
"""
Color %string yellow.
"""
- return "\033[33m%s\033[0m" % string if color else string
+ return "\033[33m%s\033[0m" % string if COLOR else string
def red(string):
"""
Color %string red.
"""
- return "\033[31m%s\033[0m" % string if color else string
+ return "\033[31m%s\033[0m" % string if COLOR else string
def execute(cmd):
@@ -261,7 +260,7 @@ def init_worker():
signal.signal(signal.SIGINT, signal.SIG_IGN)
-def find_sims(symbol, ignore, defined = []):
+def find_sims(symbol, ignore, defined=[]):
"""Return a list of max. ten Kconfig symbols that are string-similar to
@symbol."""
if defined:
@@ -335,7 +334,6 @@ def check_symbols_helper(pool, ignore):
for res in pool.map(parse_source_files, arglist):
referenced_features.update(res)
-
# parse kconfig files
arglist = []
for part in partition(kconfig_files, cpu_count()):
@@ -389,7 +387,7 @@ def parse_source_file(sfile):
lines = stream.readlines()
for line in lines:
- if not "CONFIG_" in line:
+ if "CONFIG_" not in line:
continue
features = REGEX_SOURCE_FEATURE.findall(line)
for feature in features:
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 4/5] checkkconfigsymblos: consistent symbol terminology
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
` (2 preceding siblings ...)
2016-08-28 6:51 ` [PATCH v2 3/5] checkkconfigsymbols.py: fix pylint and pep8 warnings Valentin Rothberg
@ 2016-08-28 6:51 ` Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 5/5] checkkconfigsymbols: use arglist instead of cmd string Valentin Rothberg
4 siblings, 0 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
'symbol' and 'feature' are used synonymously to refer to Kconfig symbols
(configs, menus, etc.). Use the term 'symbol' to have a consistent
terminology and to make the code more comprehensible.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
---
scripts/checkkconfigsymbols.py | 134 ++++++++++++++++++++---------------------
1 file changed, 67 insertions(+), 67 deletions(-)
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 4111746b5110..4b54aa342ac9 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -20,22 +20,22 @@ from multiprocessing import Pool, cpu_count
# regex expressions
OPERATORS = r"&|\(|\)|\||\!"
-FEATURE = r"(?:\w*[A-Z0-9]\w*){2,}"
-DEF = r"^\s*(?:menu){,1}config\s+(" + FEATURE + r")\s*"
-EXPR = r"(?:" + OPERATORS + r"|\s|" + FEATURE + r")+"
+SYMBOL = r"(?:\w*[A-Z0-9]\w*){2,}"
+DEF = r"^\s*(?:menu){,1}config\s+(" + SYMBOL + r")\s*"
+EXPR = r"(?:" + OPERATORS + r"|\s|" + SYMBOL + r")+"
DEFAULT = r"default\s+.*?(?:if\s.+){,1}"
STMT = r"^\s*(?:if|select|depends\s+on|(?:" + DEFAULT + r"))\s+" + EXPR
-SOURCE_FEATURE = r"(?:\W|\b)+[D]{,1}CONFIG_(" + FEATURE + r")"
+SOURCE_SYMBOL = r"(?:\W|\b)+[D]{,1}CONFIG_(" + SYMBOL + r")"
# regex objects
REGEX_FILE_KCONFIG = re.compile(r".*Kconfig[\.\w+\-]*$")
-REGEX_FEATURE = re.compile(r'(?!\B)' + FEATURE + r'(?!\B)')
-REGEX_SOURCE_FEATURE = re.compile(SOURCE_FEATURE)
+REGEX_SYMBOL = re.compile(r'(?!\B)' + SYMBOL + r'(?!\B)')
+REGEX_SOURCE_SYMBOL = re.compile(SOURCE_SYMBOL)
REGEX_KCONFIG_DEF = re.compile(DEF)
REGEX_KCONFIG_EXPR = re.compile(EXPR)
REGEX_KCONFIG_STMT = re.compile(STMT)
REGEX_KCONFIG_HELP = re.compile(r"^\s+(help|---help---)\s*$")
-REGEX_FILTER_FEATURES = re.compile(r"[A-Za-z0-9]$")
+REGEX_FILTER_SYMBOLS = re.compile(r"[A-Za-z0-9]$")
REGEX_NUMERIC = re.compile(r"0[xX][0-9a-fA-F]+|[0-9]+")
REGEX_QUOTES = re.compile("(\"(.*?)\")")
@@ -157,17 +157,17 @@ def main():
undefined_b, defined = check_symbols(args.ignore)
# report cases that are present for the commit but not before
- for feature in sorted(undefined_b):
- # feature has not been undefined before
- if feature not in undefined_a:
- files = sorted(undefined_b.get(feature))
- undefined[feature] = files
- # check if there are new files that reference the undefined feature
+ for symbol in sorted(undefined_b):
+ # symbol has not been undefined before
+ if symbol not in undefined_a:
+ files = sorted(undefined_b.get(symbol))
+ undefined[symbol] = files
+ # check if there are new files that reference the undefined symbol
else:
- files = sorted(undefined_b.get(feature) -
- undefined_a.get(feature))
+ files = sorted(undefined_b.get(symbol) -
+ undefined_a.get(symbol))
if files:
- undefined[feature] = files
+ undefined[symbol] = files
# reset to head
execute("git reset --hard %s" % head)
@@ -177,13 +177,13 @@ def main():
undefined, defined = check_symbols(args.ignore)
# now print the output
- for feature in sorted(undefined):
- print(red(feature))
+ for symbol in sorted(undefined):
+ print(red(symbol))
- files = sorted(undefined.get(feature))
+ files = sorted(undefined.get(symbol))
print("%s: %s" % (yel("Referencing files"), ", ".join(files)))
- sims = find_sims(feature, args.ignore, defined)
+ sims = find_sims(symbol, args.ignore, defined)
sims_out = yel("Similar symbols")
if sims:
print("%s: %s" % (sims_out, ', '.join(sims)))
@@ -192,7 +192,7 @@ def main():
if args.find:
print("%s:" % yel("Commits changing symbol"))
- commits = find_commits(feature, args.diff)
+ commits = find_commits(symbol, args.diff)
if commits:
for commit in commits:
commit = commit.split(" ", 1)
@@ -317,8 +317,8 @@ def check_symbols_helper(pool, ignore):
check_symbols() in order to properly terminate running worker processes."""
source_files = []
kconfig_files = []
- defined_features = []
- referenced_features = dict() # {file: [features]}
+ defined_symbols = []
+ referenced_symbols = dict() # {file: [symbols]}
for gitfile in get_files():
if REGEX_FILE_KCONFIG.match(gitfile):
@@ -332,51 +332,51 @@ def check_symbols_helper(pool, ignore):
# parse source files
arglist = partition(source_files, cpu_count())
for res in pool.map(parse_source_files, arglist):
- referenced_features.update(res)
+ referenced_symbols.update(res)
# parse kconfig files
arglist = []
for part in partition(kconfig_files, cpu_count()):
arglist.append((part, ignore))
for res in pool.map(parse_kconfig_files, arglist):
- defined_features.extend(res[0])
- referenced_features.update(res[1])
- defined_features = set(defined_features)
+ defined_symbols.extend(res[0])
+ referenced_symbols.update(res[1])
+ defined_symbols = set(defined_symbols)
- # inverse mapping of referenced_features to dict(feature: [files])
+ # inverse mapping of referenced_symbols to dict(symbol: [files])
inv_map = dict()
- for _file, features in referenced_features.items():
- for feature in features:
- inv_map[feature] = inv_map.get(feature, set())
- inv_map[feature].add(_file)
- referenced_features = inv_map
-
- undefined = {} # {feature: [files]}
- for feature in sorted(referenced_features):
+ for _file, symbols in referenced_symbols.items():
+ for symbol in symbols:
+ inv_map[symbol] = inv_map.get(symbol, set())
+ inv_map[symbol].add(_file)
+ referenced_symbols = inv_map
+
+ undefined = {} # {symbol: [files]}
+ for symbol in sorted(referenced_symbols):
# filter some false positives
- if feature == "FOO" or feature == "BAR" or \
- feature == "FOO_BAR" or feature == "XXX":
+ if symbol == "FOO" or symbol == "BAR" or \
+ symbol == "FOO_BAR" or symbol == "XXX":
continue
- if feature not in defined_features:
- if feature.endswith("_MODULE"):
+ if symbol not in defined_symbols:
+ if symbol.endswith("_MODULE"):
# avoid false positives for kernel modules
- if feature[:-len("_MODULE")] in defined_features:
+ if symbol[:-len("_MODULE")] in defined_symbols:
continue
- undefined[feature] = referenced_features.get(feature)
- return undefined, defined_features
+ undefined[symbol] = referenced_symbols.get(symbol)
+ return undefined, defined_symbols
def parse_source_files(source_files):
"""Parse each source file in @source_files and return dictionary with source
files as keys and lists of references Kconfig symbols as values."""
- referenced_features = dict()
+ referenced_symbols = dict()
for sfile in source_files:
- referenced_features[sfile] = parse_source_file(sfile)
- return referenced_features
+ referenced_symbols[sfile] = parse_source_file(sfile)
+ return referenced_symbols
def parse_source_file(sfile):
- """Parse @sfile and return a list of referenced Kconfig features."""
+ """Parse @sfile and return a list of referenced Kconfig symbols."""
lines = []
references = []
@@ -389,18 +389,18 @@ def parse_source_file(sfile):
for line in lines:
if "CONFIG_" not in line:
continue
- features = REGEX_SOURCE_FEATURE.findall(line)
- for feature in features:
- if not REGEX_FILTER_FEATURES.search(feature):
+ symbols = REGEX_SOURCE_SYMBOL.findall(line)
+ for symbol in symbols:
+ if not REGEX_FILTER_SYMBOLS.search(symbol):
continue
- references.append(feature)
+ references.append(symbol)
return references
-def get_features_in_line(line):
- """Return mentioned Kconfig features in @line."""
- return REGEX_FEATURE.findall(line)
+def get_symbols_in_line(line):
+ """Return mentioned Kconfig symbols in @line."""
+ return REGEX_SYMBOL.findall(line)
def parse_kconfig_files(args):
@@ -409,21 +409,21 @@ def parse_kconfig_files(args):
pattern."""
kconfig_files = args[0]
ignore = args[1]
- defined_features = []
- referenced_features = dict()
+ defined_symbols = []
+ referenced_symbols = dict()
for kfile in kconfig_files:
defined, references = parse_kconfig_file(kfile)
- defined_features.extend(defined)
+ defined_symbols.extend(defined)
if ignore and re.match(ignore, kfile):
# do not collect references for files that match the ignore pattern
continue
- referenced_features[kfile] = references
- return (defined_features, referenced_features)
+ referenced_symbols[kfile] = references
+ return (defined_symbols, referenced_symbols)
def parse_kconfig_file(kfile):
- """Parse @kfile and update feature definitions and references."""
+ """Parse @kfile and update symbol definitions and references."""
lines = []
defined = []
references = []
@@ -441,8 +441,8 @@ def parse_kconfig_file(kfile):
line = line.split("#")[0] # ignore comments
if REGEX_KCONFIG_DEF.match(line):
- feature_def = REGEX_KCONFIG_DEF.findall(line)
- defined.append(feature_def[0])
+ symbol_def = REGEX_KCONFIG_DEF.findall(line)
+ defined.append(symbol_def[0])
skip = False
elif REGEX_KCONFIG_HELP.match(line):
skip = True
@@ -451,18 +451,18 @@ def parse_kconfig_file(kfile):
pass
elif REGEX_KCONFIG_STMT.match(line):
line = REGEX_QUOTES.sub("", line)
- features = get_features_in_line(line)
+ symbols = get_symbols_in_line(line)
# multi-line statements
while line.endswith("\\"):
i += 1
line = lines[i]
line = line.strip('\n')
- features.extend(get_features_in_line(line))
- for feature in set(features):
- if REGEX_NUMERIC.match(feature):
+ symbols.extend(get_symbols_in_line(line))
+ for symbol in set(symbols):
+ if REGEX_NUMERIC.match(symbol):
# ignore numeric values
continue
- references.append(feature)
+ references.append(symbol)
return defined, references
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 5/5] checkkconfigsymbols: use arglist instead of cmd string
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
` (3 preceding siblings ...)
2016-08-28 6:51 ` [PATCH v2 4/5] checkkconfigsymblos: consistent symbol terminology Valentin Rothberg
@ 2016-08-28 6:51 ` Valentin Rothberg
4 siblings, 0 replies; 6+ messages in thread
From: Valentin Rothberg @ 2016-08-28 6:51 UTC (permalink / raw)
To: gregkh; +Cc: linux-kernel, Valentin Rothberg
Splitting a command string could lead to unintended arguments. Use an
argument list in the execute() function instead.
Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com>
---
scripts/checkkconfigsymbols.py | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 4b54aa342ac9..a32e4da4c117 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -149,11 +149,11 @@ def main():
undefined_b = {}
# get undefined items before the commit
- execute("git reset --hard %s" % commit_a)
+ reset(commit_a)
undefined_a, _ = check_symbols(args.ignore)
# get undefined items for the commit
- execute("git reset --hard %s" % commit_b)
+ reset(commit_b)
undefined_b, defined = check_symbols(args.ignore)
# report cases that are present for the commit but not before
@@ -170,7 +170,7 @@ def main():
undefined[symbol] = files
# reset to head
- execute("git reset --hard %s" % head)
+ reset(head)
# default to check the entire tree
else:
@@ -202,6 +202,11 @@ def main():
print() # new line
+def reset(commit):
+ """Reset current git tree to %commit."""
+ execute(["git", "reset", "--hard", commit])
+
+
def yel(string):
"""
Color %string yellow.
@@ -219,25 +224,25 @@ def red(string):
def execute(cmd):
"""Execute %cmd and return stdout. Exit in case of error."""
try:
- cmdlist = cmd.split(" ")
- stdout = subprocess.check_output(cmdlist, stderr=subprocess.STDOUT, shell=False)
+ stdout = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=False)
stdout = stdout.decode(errors='replace')
except subprocess.CalledProcessError as fail:
- exit("Failed to execute %s\n%s" % (cmd, fail))
+ exit(fail)
return stdout
def find_commits(symbol, diff):
"""Find commits changing %symbol in the given range of %diff."""
- commits = execute("git log --pretty=oneline --abbrev-commit -G %s %s"
- % (symbol, diff))
+ commits = execute(["git", "log", "--pretty=oneline",
+ "--abbrev-commit", "-G",
+ symbol, diff])
return [x for x in commits.split("\n") if x]
def tree_is_dirty():
"""Return true if the current working tree is dirty (i.e., if any file has
been added, deleted, modified, renamed or copied but not committed)."""
- stdout = execute("git status --porcelain")
+ stdout = execute(["git", "status", "--porcelain"])
for line in stdout:
if re.findall(r"[URMADC]{1}", line[:2]):
return True
@@ -246,7 +251,7 @@ def tree_is_dirty():
def get_head():
"""Return commit hash of current HEAD."""
- stdout = execute("git rev-parse HEAD")
+ stdout = execute(["git", "rev-parse", "HEAD"])
return stdout.strip('\n')
@@ -285,7 +290,7 @@ def find_sims(symbol, ignore, defined=[]):
def get_files():
"""Return a list of all files in the current git directory."""
# use 'git ls-files' to get the worklist
- stdout = execute("git ls-files")
+ stdout = execute(["git", "ls-files"])
if len(stdout) > 0 and stdout[-1] == "\n":
stdout = stdout[:-1]
--
2.9.3
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-08-28 6:54 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-28 6:51 [PATCH v2 0/5] checkkconfigsymbols: several updates Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 1/5] checkkconfigsymbols.py: port to Python 3 Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 2/5] checkkconfigsymbols: use ArgumentParser Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 3/5] checkkconfigsymbols.py: fix pylint and pep8 warnings Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 4/5] checkkconfigsymblos: consistent symbol terminology Valentin Rothberg
2016-08-28 6:51 ` [PATCH v2 5/5] checkkconfigsymbols: use arglist instead of cmd string Valentin Rothberg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).