mirror of
https://github.com/systemd/systemd
synced 2024-10-04 23:31:09 +00:00
udev: downgrade log level about style issues
And add --no-style switch that make style issues not critical.
This commit is contained in:
parent
2ef0959fbe
commit
1bf3dd4153
|
@ -788,6 +788,14 @@
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>--no-style</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Ignore style issues. When specified, even if style issues are found in udev rules files,
|
||||||
|
the exit status is <constant>0</constant> if no syntactic or semantic errors are found.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
<xi:include href="standard-options.xml" xpointer="help" />
|
<xi:include href="standard-options.xml" xpointer="help" />
|
||||||
</variablelist>
|
</variablelist>
|
||||||
</refsect2>
|
</refsect2>
|
||||||
|
|
|
@ -64,7 +64,7 @@ _udevadm() {
|
||||||
[MONITOR_ARG]='-s --subsystem-match -t --tag-match'
|
[MONITOR_ARG]='-s --subsystem-match -t --tag-match'
|
||||||
[TEST]='-a --action -N --resolve-names'
|
[TEST]='-a --action -N --resolve-names'
|
||||||
[TEST_BUILTIN]='-a --action'
|
[TEST_BUILTIN]='-a --action'
|
||||||
[VERIFY]='-N --resolve-names --root --no-summary'
|
[VERIFY]='-N --resolve-names --root --no-summary --no-style'
|
||||||
[WAIT]='-t --timeout --initialized=no --removed --settle'
|
[WAIT]='-t --timeout --initialized=no --removed --settle'
|
||||||
[LOCK]='-t --timeout -d --device -b --backing -p --print'
|
[LOCK]='-t --timeout -d --device -b --backing -p --print'
|
||||||
)
|
)
|
||||||
|
|
|
@ -110,6 +110,7 @@ _udevadm_verify(){
|
||||||
{-N+,--resolve-names=}'[When to resolve names.]:resolve:(early never)' \
|
{-N+,--resolve-names=}'[When to resolve names.]:resolve:(early never)' \
|
||||||
'--root=[Operate on catalog hierarchy under specified directory]:directories:_directories' \
|
'--root=[Operate on catalog hierarchy under specified directory]:directories:_directories' \
|
||||||
{--no-summary}'[Do not show summary.]' \
|
{--no-summary}'[Do not show summary.]' \
|
||||||
|
{--no-style}'[Ignore style issues.]' \
|
||||||
{-h,--help}'[Print help text.]' \
|
{-h,--help}'[Print help text.]' \
|
||||||
'*::files:_files'
|
'*::files:_files'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1091,26 +1091,26 @@ static void check_token_delimiters(UdevRuleLine *rule_line, const char *line) {
|
||||||
if (line == rule_line->line) {
|
if (line == rule_line->line) {
|
||||||
/* this is the first token of the rule */
|
/* this is the first token of the rule */
|
||||||
if (n_comma > 0)
|
if (n_comma > 0)
|
||||||
log_line_warning(rule_line, "Stray leading comma.");
|
log_line_notice(rule_line, "style: stray leading comma.");
|
||||||
} else if (isempty(p)) {
|
} else if (isempty(p)) {
|
||||||
/* there are no more tokens in the rule */
|
/* there are no more tokens in the rule */
|
||||||
if (n_comma > 0)
|
if (n_comma > 0)
|
||||||
log_line_warning(rule_line, "Stray trailing comma.");
|
log_line_notice(rule_line, "style: stray trailing comma.");
|
||||||
} else {
|
} else {
|
||||||
/* single comma is expected */
|
/* single comma is expected */
|
||||||
if (n_comma == 0)
|
if (n_comma == 0)
|
||||||
log_line_warning(rule_line, "A comma between tokens is expected.");
|
log_line_notice(rule_line, "style: a comma between tokens is expected.");
|
||||||
else if (n_comma > 1)
|
else if (n_comma > 1)
|
||||||
log_line_warning(rule_line, "More than one comma between tokens.");
|
log_line_notice(rule_line, "style: more than one comma between tokens.");
|
||||||
|
|
||||||
/* whitespace after comma is expected */
|
/* whitespace after comma is expected */
|
||||||
if (n_comma > 0) {
|
if (n_comma > 0) {
|
||||||
if (ws_before_comma)
|
if (ws_before_comma)
|
||||||
log_line_warning(rule_line, "Stray whitespace before comma.");
|
log_line_notice(rule_line, "style: stray whitespace before comma.");
|
||||||
if (!ws_after_comma)
|
if (!ws_after_comma)
|
||||||
log_line_warning(rule_line, "Whitespace after comma is expected.");
|
log_line_notice(rule_line, "style: whitespace after comma is expected.");
|
||||||
} else if (!ws_before_comma && !ws_after_comma)
|
} else if (!ws_before_comma && !ws_after_comma)
|
||||||
log_line_warning(rule_line, "Whitespace between tokens is expected.");
|
log_line_notice(rule_line, "style: whitespace between tokens is expected.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1281,7 +1281,7 @@ static void rule_resolve_goto(UdevRuleFile *rule_file) {
|
||||||
line->goto_label = NULL;
|
line->goto_label = NULL;
|
||||||
|
|
||||||
if ((line->type & ~(LINE_HAS_LABEL|LINE_IS_REFERENCED)) == 0) {
|
if ((line->type & ~(LINE_HAS_LABEL|LINE_IS_REFERENCED)) == 0) {
|
||||||
log_line_notice(line, "The line has no effect any more, dropping.");
|
log_line_warning(line, "The line has no effect any more, dropping.");
|
||||||
/* LINE_IS_REFERENCED implies LINE_HAS_LABEL */
|
/* LINE_IS_REFERENCED implies LINE_HAS_LABEL */
|
||||||
if (line->type & LINE_HAS_LABEL)
|
if (line->type & LINE_HAS_LABEL)
|
||||||
udev_rule_line_clear_tokens(line);
|
udev_rule_line_clear_tokens(line);
|
||||||
|
@ -1400,7 +1400,7 @@ static void udev_check_unused_labels(UdevRuleLine *line) {
|
||||||
|
|
||||||
if (FLAGS_SET(line->type, LINE_HAS_LABEL) &&
|
if (FLAGS_SET(line->type, LINE_HAS_LABEL) &&
|
||||||
!FLAGS_SET(line->type, LINE_IS_REFERENCED))
|
!FLAGS_SET(line->type, LINE_IS_REFERENCED))
|
||||||
log_line_warning(line, "LABEL=\"%s\" is unused.", line->label);
|
log_line_notice(line, "style: LABEL=\"%s\" is unused.", line->label);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void udev_check_conflicts_duplicates(UdevRuleLine *line) {
|
static void udev_check_conflicts_duplicates(UdevRuleLine *line) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
|
static ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
|
||||||
static char *arg_root = NULL;
|
static char *arg_root = NULL;
|
||||||
static bool arg_summary = true;
|
static bool arg_summary = true;
|
||||||
|
static bool arg_style = true;
|
||||||
|
|
||||||
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
|
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
|
||||||
|
|
||||||
|
@ -39,6 +40,7 @@ static int help(void) {
|
||||||
" -N --resolve-names=early|never When to resolve names\n"
|
" -N --resolve-names=early|never When to resolve names\n"
|
||||||
" --root=PATH Operate on an alternate filesystem root\n"
|
" --root=PATH Operate on an alternate filesystem root\n"
|
||||||
" --no-summary Do not show summary\n"
|
" --no-summary Do not show summary\n"
|
||||||
|
" --no-style Ignore style issues\n"
|
||||||
"\nSee the %s for details.\n",
|
"\nSee the %s for details.\n",
|
||||||
program_invocation_short_name,
|
program_invocation_short_name,
|
||||||
ansi_highlight(),
|
ansi_highlight(),
|
||||||
|
@ -52,6 +54,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
enum {
|
enum {
|
||||||
ARG_ROOT = 0x100,
|
ARG_ROOT = 0x100,
|
||||||
ARG_NO_SUMMARY,
|
ARG_NO_SUMMARY,
|
||||||
|
ARG_NO_STYLE,
|
||||||
};
|
};
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
|
@ -59,6 +62,7 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
{ "resolve-names", required_argument, NULL, 'N' },
|
{ "resolve-names", required_argument, NULL, 'N' },
|
||||||
{ "root", required_argument, NULL, ARG_ROOT },
|
{ "root", required_argument, NULL, ARG_ROOT },
|
||||||
{ "no-summary", no_argument, NULL, ARG_NO_SUMMARY },
|
{ "no-summary", no_argument, NULL, ARG_NO_SUMMARY },
|
||||||
|
{ "no-style", no_argument, NULL, ARG_NO_STYLE },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,6 +99,10 @@ static int parse_argv(int argc, char *argv[]) {
|
||||||
arg_summary = false;
|
arg_summary = false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ARG_NO_STYLE:
|
||||||
|
arg_style = false;
|
||||||
|
break;
|
||||||
|
|
||||||
case '?':
|
case '?':
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
default:
|
default:
|
||||||
|
@ -124,6 +132,10 @@ static int verify_rules_file(UdevRules *rules, const char *fname) {
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
"%s: udev rules check failed.", fname);
|
"%s: udev rules check failed.", fname);
|
||||||
|
|
||||||
|
if (arg_style && (issues & (1U << LOG_NOTICE)))
|
||||||
|
return log_warning_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
|
"%s: udev rules have style issues.", fname);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,18 +56,21 @@ next_test_number() {
|
||||||
out="sample-${num_str}.out"
|
out="sample-${num_str}.out"
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_0() {
|
assert_0_impl() {
|
||||||
udevadm verify "$@" >"${out}"
|
udevadm verify "$@" >"${out}"
|
||||||
if [ -f "${exo}" ]; then
|
if [ -f "${exo}" ]; then
|
||||||
diff -u "${exo}" "${out}"
|
diff -u "${exo}" "${out}"
|
||||||
elif [ -f "${rules}" ]; then
|
elif [ -f "${rules}" ]; then
|
||||||
diff -u "${workdir}/default_output_1_success" "${out}"
|
diff -u "${workdir}/default_output_1_success" "${out}"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_0() {
|
||||||
|
assert_0_impl "$@"
|
||||||
next_test_number
|
next_test_number
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_1() {
|
assert_1_impl() {
|
||||||
local rc
|
local rc
|
||||||
set +e
|
set +e
|
||||||
udevadm verify "$@" >"${out}" 2>"${err}"
|
udevadm verify "$@" >"${out}" 2>"${err}"
|
||||||
|
@ -84,7 +87,10 @@ assert_1() {
|
||||||
elif [ -f "${rules}" ]; then
|
elif [ -f "${rules}" ]; then
|
||||||
diff -u "${workdir}/default_output_1_fail" "${out}"
|
diff -u "${workdir}/default_output_1_fail" "${out}"
|
||||||
fi
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_1() {
|
||||||
|
assert_1_impl "$@"
|
||||||
next_test_number
|
next_test_number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +200,22 @@ EOF
|
||||||
assert_1 "${rules}"
|
assert_1 "${rules}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test_style_error() {
|
||||||
|
local rule msg
|
||||||
|
|
||||||
|
rule="$1"; shift
|
||||||
|
msg="$1"; shift
|
||||||
|
|
||||||
|
printf '%s\n' "${rule}" >"${rules}"
|
||||||
|
cat >"${exp}" <<EOF
|
||||||
|
${rules}:1 ${msg}
|
||||||
|
${rules}: udev rules have style issues.
|
||||||
|
EOF
|
||||||
|
assert_0_impl --no-style "${rules}"
|
||||||
|
assert_1_impl "${rules}"
|
||||||
|
next_test_number
|
||||||
|
}
|
||||||
|
|
||||||
test_syntax_error '=' 'Invalid key/value pair, ignoring.'
|
test_syntax_error '=' 'Invalid key/value pair, ignoring.'
|
||||||
test_syntax_error 'ACTION{a}=="b"' 'Invalid attribute for ACTION.'
|
test_syntax_error 'ACTION{a}=="b"' 'Invalid attribute for ACTION.'
|
||||||
test_syntax_error 'ACTION:="b"' 'Invalid operator for ACTION.'
|
test_syntax_error 'ACTION:="b"' 'Invalid operator for ACTION.'
|
||||||
|
@ -297,7 +319,7 @@ test_syntax_error 'GOTO="a", GOTO="b"
|
||||||
LABEL="a"' 'Contains multiple GOTO keys, ignoring GOTO="b".'
|
LABEL="a"' 'Contains multiple GOTO keys, ignoring GOTO="b".'
|
||||||
test_syntax_error 'LABEL{a}="b"' 'Invalid attribute for LABEL.'
|
test_syntax_error 'LABEL{a}="b"' 'Invalid attribute for LABEL.'
|
||||||
test_syntax_error 'LABEL=="b"' 'Invalid operator for LABEL.'
|
test_syntax_error 'LABEL=="b"' 'Invalid operator for LABEL.'
|
||||||
test_syntax_error 'LABEL="b"' 'LABEL="b" is unused.'
|
test_style_error 'LABEL="b"' 'style: LABEL="b" is unused.'
|
||||||
test_syntax_error 'a="b"' "Invalid key 'a'."
|
test_syntax_error 'a="b"' "Invalid key 'a'."
|
||||||
test_syntax_error 'KERNEL=="", KERNEL=="?*", NAME="a"' 'conflicting match expressions, the line has no effect.'
|
test_syntax_error 'KERNEL=="", KERNEL=="?*", NAME="a"' 'conflicting match expressions, the line has no effect.'
|
||||||
test_syntax_error 'KERNEL=="abc", KERNEL!="abc", NAME="b"' 'conflicting match expressions, the line has no effect.'
|
test_syntax_error 'KERNEL=="abc", KERNEL!="abc", NAME="b"' 'conflicting match expressions, the line has no effect.'
|
||||||
|
@ -313,18 +335,18 @@ test_syntax_error 'KERNEL=="|a|b", KERNEL=="b|a|", NAME="c"' 'duplicate expressi
|
||||||
# shellcheck disable=SC2016
|
# shellcheck disable=SC2016
|
||||||
test_syntax_error 'ENV{DISKSEQ}=="?*", ENV{DEVTYPE}!="partition", ENV{DISKSEQ}=="?*", ENV{ID_IGNORE_DISKSEQ}!="1", SYMLINK+="disk/by-diskseq/$env{DISKSEQ}"' \
|
test_syntax_error 'ENV{DISKSEQ}=="?*", ENV{DEVTYPE}!="partition", ENV{DISKSEQ}=="?*", ENV{ID_IGNORE_DISKSEQ}!="1", SYMLINK+="disk/by-diskseq/$env{DISKSEQ}"' \
|
||||||
'duplicate expressions.'
|
'duplicate expressions.'
|
||||||
test_syntax_error ',ACTION=="a", NAME="b"' 'Stray leading comma.'
|
test_style_error ',ACTION=="a", NAME="b"' 'style: stray leading comma.'
|
||||||
test_syntax_error ' ,ACTION=="a", NAME="b"' 'Stray leading comma.'
|
test_style_error ' ,ACTION=="a", NAME="b"' 'style: stray leading comma.'
|
||||||
test_syntax_error ', ACTION=="a", NAME="b"' 'Stray leading comma.'
|
test_style_error ', ACTION=="a", NAME="b"' 'style: stray leading comma.'
|
||||||
test_syntax_error 'ACTION=="a", NAME="b",' 'Stray trailing comma.'
|
test_style_error 'ACTION=="a", NAME="b",' 'style: stray trailing comma.'
|
||||||
test_syntax_error 'ACTION=="a", NAME="b", ' 'Stray trailing comma.'
|
test_style_error 'ACTION=="a", NAME="b", ' 'style: stray trailing comma.'
|
||||||
test_syntax_error 'ACTION=="a" NAME="b"' 'A comma between tokens is expected.'
|
test_style_error 'ACTION=="a" NAME="b"' 'style: a comma between tokens is expected.'
|
||||||
test_syntax_error 'ACTION=="a",, NAME="b"' 'More than one comma between tokens.'
|
test_style_error 'ACTION=="a",, NAME="b"' 'style: more than one comma between tokens.'
|
||||||
test_syntax_error 'ACTION=="a" , NAME="b"' 'Stray whitespace before comma.'
|
test_style_error 'ACTION=="a" , NAME="b"' 'style: stray whitespace before comma.'
|
||||||
test_syntax_error 'ACTION=="a",NAME="b"' 'Whitespace after comma is expected.'
|
test_style_error 'ACTION=="a",NAME="b"' 'style: whitespace after comma is expected.'
|
||||||
test_syntax_error 'RESULT=="a", PROGRAM="b"' 'Reordering RESULT check after PROGRAM assignment.'
|
test_syntax_error 'RESULT=="a", PROGRAM="b"' 'Reordering RESULT check after PROGRAM assignment.'
|
||||||
test_syntax_error 'RESULT=="a*", PROGRAM="b", RESULT=="*c", PROGRAM="d"' \
|
test_syntax_error 'RESULT=="a*", PROGRAM="b", RESULT=="*c", PROGRAM="d"' \
|
||||||
'Reordering RESULT check after PROGRAM assignment.'
|
'Reordering RESULT check after PROGRAM assignment.'
|
||||||
|
|
||||||
cat >"${rules}" <<'EOF'
|
cat >"${rules}" <<'EOF'
|
||||||
KERNEL=="a|b", KERNEL=="a|c", NAME="d"
|
KERNEL=="a|b", KERNEL=="a|c", NAME="d"
|
||||||
|
@ -357,10 +379,11 @@ LABEL="b"
|
||||||
LABEL="b"
|
LABEL="b"
|
||||||
EOF
|
EOF
|
||||||
cat >"${exp}" <<EOF
|
cat >"${exp}" <<EOF
|
||||||
${rules}:3 LABEL="b" is unused.
|
${rules}:3 style: LABEL="b" is unused.
|
||||||
${rules}: udev rules check failed.
|
${rules}: udev rules have style issues.
|
||||||
EOF
|
EOF
|
||||||
assert_1 "${rules}"
|
assert_0_impl --no-style "${rules}"
|
||||||
|
assert_1_impl "${rules}"
|
||||||
|
|
||||||
cat >"${rules}" <<'EOF'
|
cat >"${rules}" <<'EOF'
|
||||||
GOTO="a"
|
GOTO="a"
|
||||||
|
@ -370,7 +393,7 @@ cat >"${exp}" <<EOF
|
||||||
${rules}:2 Contains multiple LABEL keys, ignoring LABEL="a".
|
${rules}:2 Contains multiple LABEL keys, ignoring LABEL="a".
|
||||||
${rules}:1 GOTO="a" has no matching label, ignoring.
|
${rules}:1 GOTO="a" has no matching label, ignoring.
|
||||||
${rules}:1 The line has no effect any more, dropping.
|
${rules}:1 The line has no effect any more, dropping.
|
||||||
${rules}:2 LABEL="b" is unused.
|
${rules}:2 style: LABEL="b" is unused.
|
||||||
${rules}: udev rules check failed.
|
${rules}: udev rules check failed.
|
||||||
EOF
|
EOF
|
||||||
assert_1 "${rules}"
|
assert_1 "${rules}"
|
||||||
|
@ -389,21 +412,25 @@ cat >"${rules}" <<'EOF'
|
||||||
ACTION=="a"NAME="b"
|
ACTION=="a"NAME="b"
|
||||||
EOF
|
EOF
|
||||||
cat >"${exp}" <<EOF
|
cat >"${exp}" <<EOF
|
||||||
${rules}:1 A comma between tokens is expected.
|
${rules}:1 style: a comma between tokens is expected.
|
||||||
${rules}:1 Whitespace between tokens is expected.
|
${rules}:1 style: whitespace between tokens is expected.
|
||||||
${rules}: udev rules check failed.
|
${rules}: udev rules have style issues.
|
||||||
EOF
|
EOF
|
||||||
assert_1 "${rules}"
|
assert_0_impl --no-style "${rules}"
|
||||||
|
assert_1_impl "${rules}"
|
||||||
|
next_test_number
|
||||||
|
|
||||||
cat >"${rules}" <<'EOF'
|
cat >"${rules}" <<'EOF'
|
||||||
ACTION=="a" ,NAME="b"
|
ACTION=="a" ,NAME="b"
|
||||||
EOF
|
EOF
|
||||||
cat >"${exp}" <<EOF
|
cat >"${exp}" <<EOF
|
||||||
${rules}:1 Stray whitespace before comma.
|
${rules}:1 style: stray whitespace before comma.
|
||||||
${rules}:1 Whitespace after comma is expected.
|
${rules}:1 style: whitespace after comma is expected.
|
||||||
${rules}: udev rules check failed.
|
${rules}: udev rules have style issues.
|
||||||
EOF
|
EOF
|
||||||
assert_1 "${rules}"
|
assert_0_impl --no-style "${rules}"
|
||||||
|
assert_1_impl "${rules}"
|
||||||
|
next_test_number
|
||||||
|
|
||||||
# udevadm verify --root
|
# udevadm verify --root
|
||||||
sed "s|sample-[0-9]*.rules|${workdir}/${rules_dir}/&|" sample-*.exp >"${workdir}/${exp}"
|
sed "s|sample-[0-9]*.rules|${workdir}/${rules_dir}/&|" sample-*.exp >"${workdir}/${exp}"
|
||||||
|
|
Loading…
Reference in a new issue