perf test: Skip shebang and SPDX comments in shell test descriptions

When extracting shell test descriptions in tests-scripts.c, the parser
skipped the first line assuming it was the shebang (#!/bin/sh) and then
read the first comment line on line 2 as the test description.

However, checkpatch.pl expects shell scripts to declare their SPDX
license identifier on line 2 (# SPDX-License-Identifier: ...). This
caused the test harness to extract the SPDX license string as the test
description.

Refactor shell_test__description to use io__getline, skipping both
shebang and SPDX comment lines. This allows shell tests to include
standard SPDX headers without breaking test suite description
extraction.

Assisted-by: Gemini-CLI:Google Gemini 3
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Ian Rogers 2026-06-02 10:41:23 -07:00 committed by Arnaldo Carvalho de Melo
parent 94ac3ce427
commit 85fe2fdb27

View File

@ -31,6 +31,7 @@ static int shell_tests__dir_fd(void)
{
struct stat st;
char path[PATH_MAX], path2[PATH_MAX], *exec_path;
ssize_t len;
static const char * const devel_dirs[] = {
"./tools/perf/tests/shell",
"./tests/shell",
@ -47,13 +48,17 @@ static int shell_tests__dir_fd(void)
}
/* Use directory of executable */
if (readlink("/proc/self/exe", path2, sizeof path2) < 0)
len = readlink("/proc/self/exe", path2, sizeof(path2) - 1);
if (len < 0)
return -1;
path2[len] = '\0';
/* Follow another level of symlink if there */
if (lstat(path2, &st) == 0 && (st.st_mode & S_IFMT) == S_IFLNK) {
scnprintf(path, sizeof(path), path2);
if (readlink(path, path2, sizeof path2) < 0)
scnprintf(path, sizeof(path), "%s", path2);
len = readlink(path, path2, sizeof(path2) - 1);
if (len < 0)
return -1;
path2[len] = '\0';
}
/* Get directory */
p = strrchr(path2, '/');
@ -78,43 +83,50 @@ static int shell_tests__dir_fd(void)
static char *shell_test__description(int dir_fd, const char *name)
{
struct io io;
char buf[128], desc[256];
int ch, pos = 0;
char buf[128], *line = NULL;
size_t line_len = 0;
ssize_t len;
char *desc = NULL;
const char *spdx = "SPDX-License";
io__init(&io, openat(dir_fd, name, O_RDONLY), buf, sizeof(buf));
if (io.fd < 0)
return NULL;
/* Skip first line - should be #!/bin/bash Shebang */
if (io__get_char(&io) != '#')
goto err_out;
if (io__get_char(&io) != '!')
goto err_out;
do {
ch = io__get_char(&io);
if (ch < 0)
goto err_out;
} while (ch != '\n');
while ((len = io__getline(&io, &line, &line_len)) > 0) {
char *p = line;
do {
ch = io__get_char(&io);
if (ch < 0)
goto err_out;
} while (ch == '#' || isspace(ch));
while (ch > 0 && ch != '\n') {
desc[pos++] = ch;
if (pos >= (int)sizeof(desc) - 1)
/* Skip leading whitespace */
while (*p && isspace(*p))
p++;
/* Must be a comment */
if (*p != '#')
continue;
p++;
/* Skip shebang or SPDX lines */
if (*p == '!' || (strstr(p, spdx) && strstr(p, "-Identifier:")))
continue;
/* Skip whitespace after # */
while (*p && isspace(*p))
p++;
/* If we found non-empty text, this is the description! */
if (*p && *p != '\n') {
char *end = p + strlen(p);
while (end > p && isspace(end[-1]))
end--;
*end = '\0';
desc = strdup(p);
break;
ch = io__get_char(&io);
}
}
while (pos > 0 && isspace(desc[--pos]))
;
desc[++pos] = '\0';
free(line);
close(io.fd);
return strdup(desc);
err_out:
close(io.fd);
return NULL;
return desc;
}
/* Is this full file path a shell script */
@ -178,9 +190,9 @@ static void append_script(int dir_fd, const char *name, char *desc,
char *exclusive;
snprintf(link, sizeof(link), "/proc/%d/fd/%d", getpid(), dir_fd);
len = readlink(link, filename, sizeof(filename));
if (len < 0) {
pr_err("Failed to readlink %s", link);
len = readlink(link, filename, sizeof(filename) - 1);
if (len < 0 || (size_t)len > sizeof(filename) - strlen(name) - 2) {
pr_err("Failed to readlink %s or path too long", link);
return;
}
filename[len++] = '/';