From: Randy Dunlap <rdunlap@infradead.org>
To: simonsudarushkin@gmail.com, Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>,
linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] docs: kdoc_output: don't add a man page tail for filtered-out symbols
Date: Tue, 29 Sep 2026 17:29:20 -0700 [thread overview]
Message-ID: <ef6f0d64-fb3c-492e-a70f-ab97ff462969@infradead.org> (raw)
In-Reply-To: <20260929-kdoc-man-filter-v1-1-5f70268885d1@gmail.com>
Hi Simon,
On 9/29/26 6:36 AM, Simon Sudarushkin via B4 Relay wrote:
> From: Simon Sudarushkin <simonsudarushkin@gmail.com>
>
> ManFormat.msg() appends the "SEE ALSO" tail after every call to the base
> class msg(), even when the -e, -i, -s or --nosymbol filters dropped the
> symbol and nothing was written for it. With -s, every other symbol in
> the file leaves a stray "SEE ALSO" block behind the requested page. With
> -e on a file that exports nothing, the output is only such blocks, with
> no .TH header at all:
>
> $ tools/docs/kernel-doc -man -s string_get_size lib/string_helpers.c \
> | grep -c 'SEE ALSO'
> 13
> $ tools/docs/kernel-doc -man -e include/rdma/ib_mad.h | grep -c '^\.TH'
> 0
>
> Only add the tail when the base class produced a page, and add unit
> tests for both cases.
>
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Closes: https://lore.kernel.org/all/fc7978bb-a71f-456d-84bb-670c8f0426ed@infradead.org/
> Fixes: 104e0a682e12 ("tools: kernel-doc: add a see also section at man pages")
> Assisted-by: LLM
> Signed-off-by: Simon Sudarushkin <simonsudarushkin@gmail.com>
> ---
> Randy, this takes a different route from your patch in August [1]: the
> out_tail() call stays in ManFormat.msg() and is skipped when the base
> class produced no page, so OutputFormat does not need to know about it.
> DOC blocks that are shown keep their tail, since they get their own .TH.
Yes, I had already abandoned that patch and its approach. I was (slowly)
looking at doing something like this, although probably not as succinct
as this.
Tested-by: Randy Dunlap <rdunlap@infradead.org>
Acked-by: Randy Dunlap <rdunlap@infradead.org>
Thanks.
>
> [1] https://lore.kernel.org/all/20260816054826.3988516-1-rdunlap@infradead.org/
> ---
> tools/lib/python/kdoc/kdoc_output.py | 5 +++-
> tools/unittests/test_kdoc_parser.py | 52 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 56 insertions(+), 1 deletion(-)
>
> diff --git a/tools/lib/python/kdoc/kdoc_output.py b/tools/lib/python/kdoc/kdoc_output.py
> index 618b0d765ef5..659a2c6fb6be 100644
> --- a/tools/lib/python/kdoc/kdoc_output.py
> +++ b/tools/lib/python/kdoc/kdoc_output.py
> @@ -763,7 +763,10 @@ class ManFormat(OutputFormat):
> Add a tail at the end of man pages output.
> """
> super().msg(fname, name, args)
> - self.out_tail(fname, name, args)
> +
> + # Symbols dropped by the output filters produce no page
> + if self.data:
> + self.out_tail(fname, name, args)
>
> return self.data
>
> diff --git a/tools/unittests/test_kdoc_parser.py b/tools/unittests/test_kdoc_parser.py
> index c4a76ed13dbc..bcb1b1a5ccc6 100755
> --- a/tools/unittests/test_kdoc_parser.py
> +++ b/tools/unittests/test_kdoc_parser.py
> @@ -301,6 +301,58 @@ class CToMan(unittest.TestCase):
> self.assertEqual(result, expected)
>
>
> +class ManFilterTail(unittest.TestCase):
> + """
> + Symbols dropped by the output filters must not leave a man page tail.
> + """
> +
> + source = dedent("""
> + /**
> + * foo - First function
> + * @a: an argument
> + */
> + int foo(int a) { return 0; };
> +
> + /**
> + * bar - Second function
> + * @b: an argument
> + */
> + int bar(int b) { return 0; };
> + """)
> +
> + def setUp(self):
> + config = MockKdocConfig()
> + kernel_doc = KernelDoc(config, "mock.c", CTransforms())
> +
> + with patch('builtins.open', new_callable=mock_open,
> + read_data=self.source):
> + _, self.entries = kernel_doc.parse_kdoc()
> +
> + self.out_style = ManFormat()
> + self.out_style.set_config(config)
> +
> + def run_filter(self, **kwargs):
> + args = {"export": False, "internal": False, "symbol": None,
> + "nosymbol": None, "function_table": set(),
> + "enable_lineno": False, "no_doc_sections": False}
> + args.update(kwargs)
> +
> + self.out_style.set_filter(**args)
> +
> + return self.out_style.output_symbols("mock.c", self.entries)
> +
> + def test_symbol_filter(self):
> + """Only the selected symbol gets a page, with a single tail."""
> + result = self.run_filter(symbol=["foo"], function_table={"foo"})
> +
> + self.assertEqual(result.count(".TH "), 1)
> + self.assertEqual(result.count('.SH "SEE ALSO"'), 1)
> +
> + def test_all_filtered_out(self):
> + """No exported symbols: no output at all."""
> + self.assertEqual(self.run_filter(export=True), "")
> +
> +
> class CToRest(unittest.TestCase):
> out_style = RestFormat()
> config = MockKdocConfig()
>
> ---
> base-commit: 4f041d7b65b8007403cce30ecf69ad42d48ec315
> change-id: 20260929-kdoc-man-filter-eba1ff857dad
>
> Best regards,
> --
> Simon Sudarushkin <simonsudarushkin@gmail.com>
--
~Randy
prev parent reply other threads:[~2026-09-30 0:29 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-29 13:36 Simon Sudarushkin via B4 Relay
2026-09-30 0:29 ` Randy Dunlap [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ef6f0d64-fb3c-492e-a70f-ab97ff462969@infradead.org \
--to=rdunlap@infradead.org \
--cc=corbet@lwn.net \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mchehab+huawei@kernel.org \
--cc=mchehab@kernel.org \
--cc=simonsudarushkin@gmail.com \
--cc=skhan@linuxfoundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®