if (line == rule_line->line) {
/* this is the first token of the rule */
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)) {
/* there are no more tokens in the rule */
if (n_comma > 0)
- log_line_warning(rule_line, "Stray trailing comma.");
+ log_line_notice(rule_line, "style: stray trailing comma.");
} else {
/* single comma is expected */
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)
- 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 */
if (n_comma > 0) {
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)
- 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)
- log_line_warning(rule_line, "Whitespace between tokens is expected.");
+ log_line_notice(rule_line, "style: whitespace between tokens is expected.");
}
}
line->goto_label = NULL;
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 */
if (line->type & LINE_HAS_LABEL)
udev_rule_line_clear_tokens(line);
if (FLAGS_SET(line->type, LINE_HAS_LABEL) &&
!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 ResolveNameTiming arg_resolve_name_timing = RESOLVE_NAME_EARLY;
static char *arg_root = NULL;
static bool arg_summary = true;
+static bool arg_style = true;
STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
" -N --resolve-names=early|never When to resolve names\n"
" --root=PATH Operate on an alternate filesystem root\n"
" --no-summary Do not show summary\n"
+ " --no-style Ignore style issues\n"
"\nSee the %s for details.\n",
program_invocation_short_name,
ansi_highlight(),
enum {
ARG_ROOT = 0x100,
ARG_NO_SUMMARY,
+ ARG_NO_STYLE,
};
static const struct option options[] = {
{ "help", no_argument, NULL, 'h' },
{ "resolve-names", required_argument, NULL, 'N' },
{ "root", required_argument, NULL, ARG_ROOT },
{ "no-summary", no_argument, NULL, ARG_NO_SUMMARY },
+ { "no-style", no_argument, NULL, ARG_NO_STYLE },
{}
};
arg_summary = false;
break;
+ case ARG_NO_STYLE:
+ arg_style = false;
+ break;
+
case '?':
return -EINVAL;
default:
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
"%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;
}
out="sample-${num_str}.out"
}
-assert_0() {
+assert_0_impl() {
udevadm verify "$@" >"${out}"
if [ -f "${exo}" ]; then
diff -u "${exo}" "${out}"
elif [ -f "${rules}" ]; then
diff -u "${workdir}/default_output_1_success" "${out}"
fi
+}
+assert_0() {
+ assert_0_impl "$@"
next_test_number
}
-assert_1() {
+assert_1_impl() {
local rc
set +e
udevadm verify "$@" >"${out}" 2>"${err}"
elif [ -f "${rules}" ]; then
diff -u "${workdir}/default_output_1_fail" "${out}"
fi
+}
+assert_1() {
+ assert_1_impl "$@"
next_test_number
}
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 'ACTION{a}=="b"' 'Invalid attribute for ACTION.'
test_syntax_error 'ACTION:="b"' 'Invalid operator for ACTION.'
LABEL="a"' 'Contains multiple GOTO keys, ignoring GOTO="b".'
test_syntax_error 'LABEL{a}="b"' 'Invalid attribute 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 '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.'
# shellcheck disable=SC2016
test_syntax_error 'ENV{DISKSEQ}=="?*", ENV{DEVTYPE}!="partition", ENV{DISKSEQ}=="?*", ENV{ID_IGNORE_DISKSEQ}!="1", SYMLINK+="disk/by-diskseq/$env{DISKSEQ}"' \
'duplicate expressions.'
-test_syntax_error ',ACTION=="a", NAME="b"' 'Stray leading comma.'
-test_syntax_error ' ,ACTION=="a", NAME="b"' 'Stray leading comma.'
-test_syntax_error ', ACTION=="a", NAME="b"' 'Stray leading comma.'
-test_syntax_error 'ACTION=="a", NAME="b",' 'Stray trailing comma.'
-test_syntax_error 'ACTION=="a", NAME="b", ' 'Stray trailing comma.'
-test_syntax_error 'ACTION=="a" NAME="b"' 'A comma between tokens is expected.'
-test_syntax_error 'ACTION=="a",, NAME="b"' 'More than one comma between tokens.'
-test_syntax_error 'ACTION=="a" , NAME="b"' 'Stray whitespace before comma.'
-test_syntax_error 'ACTION=="a",NAME="b"' 'Whitespace after comma is expected.'
+test_style_error ',ACTION=="a", NAME="b"' 'style: stray leading comma.'
+test_style_error ' ,ACTION=="a", NAME="b"' 'style: stray leading comma.'
+test_style_error ', ACTION=="a", NAME="b"' 'style: stray leading comma.'
+test_style_error 'ACTION=="a", NAME="b",' 'style: stray trailing comma.'
+test_style_error 'ACTION=="a", NAME="b", ' 'style: stray trailing comma.'
+test_style_error 'ACTION=="a" NAME="b"' 'style: a comma between tokens is expected.'
+test_style_error 'ACTION=="a",, NAME="b"' 'style: more than one comma between tokens.'
+test_style_error 'ACTION=="a" , NAME="b"' 'style: stray whitespace before comma.'
+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", RESULT=="*c", PROGRAM="d"' \
- 'Reordering RESULT check after PROGRAM assignment.'
+ 'Reordering RESULT check after PROGRAM assignment.'
cat >"${rules}" <<'EOF'
KERNEL=="a|b", KERNEL=="a|c", NAME="d"
LABEL="b"
EOF
cat >"${exp}" <<EOF
-${rules}:3 LABEL="b" is unused.
-${rules}: udev rules check failed.
+${rules}:3 style: LABEL="b" is unused.
+${rules}: udev rules have style issues.
EOF
-assert_1 "${rules}"
+assert_0_impl --no-style "${rules}"
+assert_1_impl "${rules}"
cat >"${rules}" <<'EOF'
GOTO="a"
${rules}:2 Contains multiple LABEL keys, ignoring LABEL="a".
${rules}:1 GOTO="a" has no matching label, ignoring.
${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.
EOF
assert_1 "${rules}"
ACTION=="a"NAME="b"
EOF
cat >"${exp}" <<EOF
-${rules}:1 A comma between tokens is expected.
-${rules}:1 Whitespace between tokens is expected.
-${rules}: udev rules check failed.
+${rules}:1 style: a comma between tokens is expected.
+${rules}:1 style: whitespace between tokens is expected.
+${rules}: udev rules have style issues.
EOF
-assert_1 "${rules}"
+assert_0_impl --no-style "${rules}"
+assert_1_impl "${rules}"
+next_test_number
cat >"${rules}" <<'EOF'
ACTION=="a" ,NAME="b"
EOF
cat >"${exp}" <<EOF
-${rules}:1 Stray whitespace before comma.
-${rules}:1 Whitespace after comma is expected.
-${rules}: udev rules check failed.
+${rules}:1 style: stray whitespace before comma.
+${rules}:1 style: whitespace after comma is expected.
+${rules}: udev rules have style issues.
EOF
-assert_1 "${rules}"
+assert_0_impl --no-style "${rules}"
+assert_1_impl "${rules}"
+next_test_number
# udevadm verify --root
sed "s|sample-[0-9]*.rules|${workdir}/${rules_dir}/&|" sample-*.exp >"${workdir}/${exp}"