]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
docs: move scripts/documentation-file-ref-check to tools/docs
authorJonathan Corbet <corbet@lwn.net>
Wed, 13 Aug 2025 17:16:28 +0000 (11:16 -0600)
committerJonathan Corbet <corbet@lwn.net>
Tue, 28 Oct 2025 22:01:17 +0000 (16:01 -0600)
Add this script to the growing collection of documentation tools.

Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Acked-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Documentation/Makefile
MAINTAINERS
scripts/documentation-file-ref-check [deleted file]
tools/docs/documentation-file-ref-check [new file with mode: 0755]
tools/docs/sphinx-pre-install

index 65d184eab739479a05770b32054ed9376656deaa..1476aa1701ce8993c976d1a59440c9bece77fa34 100644 (file)
@@ -8,7 +8,7 @@ subdir- := devicetree/bindings
 ifneq ($(MAKECMDGOALS),cleandocs)
 # Check for broken documentation file references
 ifeq ($(CONFIG_WARN_MISSING_DOCUMENTS),y)
-$(shell $(srctree)/scripts/documentation-file-ref-check --warn)
+$(shell $(srctree)/tools/docs/documentation-file-ref-check --warn)
 endif
 
 # Check for broken ABI files
@@ -78,7 +78,7 @@ htmldocs-redirects: $(srctree)/Documentation/.renames.txt
        @tools/docs/gen-redirects.py --output $(BUILDDIR) < $<
 
 refcheckdocs:
-       $(Q)cd $(srctree);scripts/documentation-file-ref-check
+       $(Q)cd $(srctree); tools/docs/documentation-file-ref-check
 
 cleandocs:
        $(Q)rm -rf $(BUILDDIR)
index cd187b9f1dc2c68ebd64a09d01ebe7d67b428524..fc1da52433b6afd0bd153306040ca3a5d1307175 100644 (file)
@@ -7411,7 +7411,6 @@ S:        Maintained
 P:     Documentation/doc-guide/maintainer-profile.rst
 T:     git git://git.lwn.net/linux.git docs-next
 F:     Documentation/
-F:     scripts/documentation-file-ref-check
 F:     scripts/get_abi.py
 F:     scripts/kernel-doc*
 F:     scripts/lib/abi/*
@@ -7451,7 +7450,6 @@ M:        Mauro Carvalho Chehab <mchehab@kernel.org>
 L:     linux-doc@vger.kernel.org
 S:     Maintained
 F:     Documentation/sphinx/parse-headers.pl
-F:     scripts/documentation-file-ref-check
 F:     tools/docs/sphinx-pre-install
 
 DOCUMENTATION/ITALIAN
diff --git a/scripts/documentation-file-ref-check b/scripts/documentation-file-ref-check
deleted file mode 100755 (executable)
index 408b1db..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-#!/usr/bin/env perl
-# SPDX-License-Identifier: GPL-2.0
-#
-# Treewide grep for references to files under Documentation, and report
-# non-existing files in stderr.
-
-use warnings;
-use strict;
-use Getopt::Long qw(:config no_auto_abbrev);
-
-# NOTE: only add things here when the file was gone, but the text wants
-# to mention a past documentation file, for example, to give credits for
-# the original work.
-my %false_positives = (
-       "Documentation/scsi/scsi_mid_low_api.rst" => "Documentation/Configure.help",
-       "drivers/vhost/vhost.c" => "Documentation/virtual/lguest/lguest.c",
-);
-
-my $scriptname = $0;
-$scriptname =~ s,.*/([^/]+/),$1,;
-
-# Parse arguments
-my $help = 0;
-my $fix = 0;
-my $warn = 0;
-
-if (! -e ".git") {
-       printf "Warning: can't check if file exists, as this is not a git tree\n";
-       exit 0;
-}
-
-GetOptions(
-       'fix' => \$fix,
-       'warn' => \$warn,
-       'h|help|usage' => \$help,
-);
-
-if ($help != 0) {
-    print "$scriptname [--help] [--fix]\n";
-    exit -1;
-}
-
-# Step 1: find broken references
-print "Finding broken references. This may take a while...  " if ($fix);
-
-my %broken_ref;
-
-my $doc_fix = 0;
-
-open IN, "git grep ':doc:\`' Documentation/|"
-     or die "Failed to run git grep";
-while (<IN>) {
-       next if (!m,^([^:]+):.*\:doc\:\`([^\`]+)\`,);
-       next if (m,sphinx/,);
-
-       my $file = $1;
-       my $d = $1;
-       my $doc_ref = $2;
-
-       my $f = $doc_ref;
-
-       $d =~ s,(.*/).*,$1,;
-       $f =~ s,.*\<([^\>]+)\>,$1,;
-
-       if ($f =~ m,^/,) {
-               $f = "$f.rst";
-               $f =~ s,^/,Documentation/,;
-       } else {
-               $f = "$d$f.rst";
-       }
-
-       next if (grep -e, glob("$f"));
-
-       if ($fix && !$doc_fix) {
-               print STDERR "\nWARNING: Currently, can't fix broken :doc:`` fields\n";
-       }
-       $doc_fix++;
-
-       print STDERR "$file: :doc:`$doc_ref`\n";
-}
-close IN;
-
-open IN, "git grep 'Documentation/'|"
-     or die "Failed to run git grep";
-while (<IN>) {
-       next if (!m/^([^:]+):(.*)/);
-
-       my $f = $1;
-       my $ln = $2;
-
-       # On linux-next, discard the Next/ directory
-       next if ($f =~ m,^Next/,);
-
-       # Makefiles and scripts contain nasty expressions to parse docs
-       next if ($f =~ m/Makefile/ || $f =~ m/\.(sh|py|pl|~|rej|org|orig)$/);
-
-       # It doesn't make sense to parse hidden files
-       next if ($f =~ m#/\.#);
-
-       # Skip this script
-       next if ($f eq $scriptname);
-
-       # Ignore the dir where documentation will be built
-       next if ($ln =~ m,\b(\S*)Documentation/output,);
-
-       if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*\[\]\?+-]*)(.*),) {
-               my $prefix = $1;
-               my $ref = $2;
-               my $base = $2;
-               my $extra = $3;
-
-               # some file references are like:
-               # /usr/src/linux/Documentation/DMA-{API,mapping}.txt
-               # For now, ignore them
-               next if ($extra =~ m/^{/);
-
-               # Remove footnotes at the end like:
-               # Documentation/devicetree/dt-object-internal.txt[1]
-               $ref =~ s/(txt|rst)\[\d+]$/$1/;
-
-               # Remove ending ']' without any '['
-               $ref =~ s/\].*// if (!($ref =~ m/\[/));
-
-               # Remove puntuation marks at the end
-               $ref =~ s/[\,\.]+$//;
-
-               my $fulref = "$prefix$ref";
-
-               $fulref =~ s/^(\<file|ref)://;
-               $fulref =~ s/^[\'\`]+//;
-               $fulref =~ s,^\$\(.*\)/,,;
-               $base =~ s,.*/,,;
-
-               # Remove URL false-positives
-               next if ($fulref =~ m/^http/);
-
-               # Remove sched-pelt false-positive
-               next if ($fulref =~ m,^Documentation/scheduler/sched-pelt$,);
-
-               # Discard some build examples from Documentation/target/tcm_mod_builder.rst
-               next if ($fulref =~ m,mnt/sdb/lio-core-2.6.git/Documentation/target,);
-
-               # Check if exists, evaluating wildcards
-               next if (grep -e, glob("$ref $fulref"));
-
-               # Accept relative Documentation patches for tools/
-               if ($f =~ m/tools/) {
-                       my $path = $f;
-                       $path =~ s,(.*)/.*,$1,;
-                       $path =~ s,testing/selftests/bpf,bpf/bpftool,;
-                       next if (grep -e, glob("$path/$ref $path/../$ref $path/$fulref"));
-               }
-
-               # Discard known false-positives
-               if (defined($false_positives{$f})) {
-                       next if ($false_positives{$f} eq $fulref);
-               }
-
-               if ($fix) {
-                       if (!($ref =~ m/(scripts|Kconfig|Kbuild)/)) {
-                               $broken_ref{$ref}++;
-                       }
-               } elsif ($warn) {
-                       print STDERR "Warning: $f references a file that doesn't exist: $fulref\n";
-               } else {
-                       print STDERR "$f: $fulref\n";
-               }
-       }
-}
-close IN;
-
-exit 0 if (!$fix);
-
-# Step 2: Seek for file name alternatives
-print "Auto-fixing broken references. Please double-check the results\n";
-
-foreach my $ref (keys %broken_ref) {
-       my $new =$ref;
-
-       my $basedir = ".";
-       # On translations, only seek inside the translations directory
-       $basedir  = $1 if ($ref =~ m,(Documentation/translations/[^/]+),);
-
-       # get just the basename
-       $new =~ s,.*/,,;
-
-       my $f="";
-
-       # usual reason for breakage: DT file moved around
-       if ($ref =~ /devicetree/) {
-               # usual reason for breakage: DT file renamed to .yaml
-               if (!$f) {
-                       my $new_ref = $ref;
-                       $new_ref =~ s/\.txt$/.yaml/;
-                       $f=$new_ref if (-f $new_ref);
-               }
-
-               if (!$f) {
-                       my $search = $new;
-                       $search =~ s,^.*/,,;
-                       $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
-                       if (!$f) {
-                               # Manufacturer name may have changed
-                               $search =~ s/^.*,//;
-                               $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
-                       }
-               }
-       }
-
-       # usual reason for breakage: file renamed to .rst
-       if (!$f) {
-               $new =~ s/\.txt$/.rst/;
-               $f=qx(find $basedir -iname $new) if ($new);
-       }
-
-       # usual reason for breakage: use dash or underline
-       if (!$f) {
-               $new =~ s/[-_]/[-_]/g;
-               $f=qx(find $basedir -iname $new) if ($new);
-       }
-
-       # Wild guess: seek for the same name on another place
-       if (!$f) {
-               $f = qx(find $basedir -iname $new) if ($new);
-       }
-
-       my @find = split /\s+/, $f;
-
-       if (!$f) {
-               print STDERR "ERROR: Didn't find a replacement for $ref\n";
-       } elsif (scalar(@find) > 1) {
-               print STDERR "WARNING: Won't auto-replace, as found multiple files close to $ref:\n";
-               foreach my $j (@find) {
-                       $j =~ s,^./,,;
-                       print STDERR "    $j\n";
-               }
-       } else {
-               $f = $find[0];
-               $f =~ s,^./,,;
-               print "INFO: Replacing $ref to $f\n";
-               foreach my $j (qx(git grep -l $ref)) {
-                       qx(sed "s\@$ref\@$f\@g" -i $j);
-               }
-       }
-}
diff --git a/tools/docs/documentation-file-ref-check b/tools/docs/documentation-file-ref-check
new file mode 100755 (executable)
index 0000000..0cad42f
--- /dev/null
@@ -0,0 +1,245 @@
+#!/usr/bin/env perl
+# SPDX-License-Identifier: GPL-2.0
+#
+# Treewide grep for references to files under Documentation, and report
+# non-existing files in stderr.
+
+use warnings;
+use strict;
+use Getopt::Long qw(:config no_auto_abbrev);
+
+# NOTE: only add things here when the file was gone, but the text wants
+# to mention a past documentation file, for example, to give credits for
+# the original work.
+my %false_positives = (
+       "Documentation/scsi/scsi_mid_low_api.rst" => "Documentation/Configure.help",
+       "drivers/vhost/vhost.c" => "Documentation/virtual/lguest/lguest.c",
+);
+
+my $scriptname = $0;
+$scriptname =~ s,tools/docs/([^/]+/),$1,;
+
+# Parse arguments
+my $help = 0;
+my $fix = 0;
+my $warn = 0;
+
+if (! -e ".git") {
+       printf "Warning: can't check if file exists, as this is not a git tree\n";
+       exit 0;
+}
+
+GetOptions(
+       'fix' => \$fix,
+       'warn' => \$warn,
+       'h|help|usage' => \$help,
+);
+
+if ($help != 0) {
+    print "$scriptname [--help] [--fix]\n";
+    exit -1;
+}
+
+# Step 1: find broken references
+print "Finding broken references. This may take a while...  " if ($fix);
+
+my %broken_ref;
+
+my $doc_fix = 0;
+
+open IN, "git grep ':doc:\`' Documentation/|"
+     or die "Failed to run git grep";
+while (<IN>) {
+       next if (!m,^([^:]+):.*\:doc\:\`([^\`]+)\`,);
+       next if (m,sphinx/,);
+
+       my $file = $1;
+       my $d = $1;
+       my $doc_ref = $2;
+
+       my $f = $doc_ref;
+
+       $d =~ s,(.*/).*,$1,;
+       $f =~ s,.*\<([^\>]+)\>,$1,;
+
+       if ($f =~ m,^/,) {
+               $f = "$f.rst";
+               $f =~ s,^/,Documentation/,;
+       } else {
+               $f = "$d$f.rst";
+       }
+
+       next if (grep -e, glob("$f"));
+
+       if ($fix && !$doc_fix) {
+               print STDERR "\nWARNING: Currently, can't fix broken :doc:`` fields\n";
+       }
+       $doc_fix++;
+
+       print STDERR "$file: :doc:`$doc_ref`\n";
+}
+close IN;
+
+open IN, "git grep 'Documentation/'|"
+     or die "Failed to run git grep";
+while (<IN>) {
+       next if (!m/^([^:]+):(.*)/);
+
+       my $f = $1;
+       my $ln = $2;
+
+       # On linux-next, discard the Next/ directory
+       next if ($f =~ m,^Next/,);
+
+       # Makefiles and scripts contain nasty expressions to parse docs
+       next if ($f =~ m/Makefile/ || $f =~ m/\.(sh|py|pl|~|rej|org|orig)$/);
+
+       # It doesn't make sense to parse hidden files
+       next if ($f =~ m#/\.#);
+
+       # Skip this script
+       next if ($f eq $scriptname);
+
+       # Ignore the dir where documentation will be built
+       next if ($ln =~ m,\b(\S*)Documentation/output,);
+
+       if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*\[\]\?+-]*)(.*),) {
+               my $prefix = $1;
+               my $ref = $2;
+               my $base = $2;
+               my $extra = $3;
+
+               # some file references are like:
+               # /usr/src/linux/Documentation/DMA-{API,mapping}.txt
+               # For now, ignore them
+               next if ($extra =~ m/^{/);
+
+               # Remove footnotes at the end like:
+               # Documentation/devicetree/dt-object-internal.txt[1]
+               $ref =~ s/(txt|rst)\[\d+]$/$1/;
+
+               # Remove ending ']' without any '['
+               $ref =~ s/\].*// if (!($ref =~ m/\[/));
+
+               # Remove puntuation marks at the end
+               $ref =~ s/[\,\.]+$//;
+
+               my $fulref = "$prefix$ref";
+
+               $fulref =~ s/^(\<file|ref)://;
+               $fulref =~ s/^[\'\`]+//;
+               $fulref =~ s,^\$\(.*\)/,,;
+               $base =~ s,.*/,,;
+
+               # Remove URL false-positives
+               next if ($fulref =~ m/^http/);
+
+               # Remove sched-pelt false-positive
+               next if ($fulref =~ m,^Documentation/scheduler/sched-pelt$,);
+
+               # Discard some build examples from Documentation/target/tcm_mod_builder.rst
+               next if ($fulref =~ m,mnt/sdb/lio-core-2.6.git/Documentation/target,);
+
+               # Check if exists, evaluating wildcards
+               next if (grep -e, glob("$ref $fulref"));
+
+               # Accept relative Documentation patches for tools/
+               if ($f =~ m/tools/) {
+                       my $path = $f;
+                       $path =~ s,(.*)/.*,$1,;
+                       $path =~ s,testing/selftests/bpf,bpf/bpftool,;
+                       next if (grep -e, glob("$path/$ref $path/../$ref $path/$fulref"));
+               }
+
+               # Discard known false-positives
+               if (defined($false_positives{$f})) {
+                       next if ($false_positives{$f} eq $fulref);
+               }
+
+               if ($fix) {
+                       if (!($ref =~ m/(scripts|Kconfig|Kbuild)/)) {
+                               $broken_ref{$ref}++;
+                       }
+               } elsif ($warn) {
+                       print STDERR "Warning: $f references a file that doesn't exist: $fulref\n";
+               } else {
+                       print STDERR "$f: $fulref\n";
+               }
+       }
+}
+close IN;
+
+exit 0 if (!$fix);
+
+# Step 2: Seek for file name alternatives
+print "Auto-fixing broken references. Please double-check the results\n";
+
+foreach my $ref (keys %broken_ref) {
+       my $new =$ref;
+
+       my $basedir = ".";
+       # On translations, only seek inside the translations directory
+       $basedir  = $1 if ($ref =~ m,(Documentation/translations/[^/]+),);
+
+       # get just the basename
+       $new =~ s,.*/,,;
+
+       my $f="";
+
+       # usual reason for breakage: DT file moved around
+       if ($ref =~ /devicetree/) {
+               # usual reason for breakage: DT file renamed to .yaml
+               if (!$f) {
+                       my $new_ref = $ref;
+                       $new_ref =~ s/\.txt$/.yaml/;
+                       $f=$new_ref if (-f $new_ref);
+               }
+
+               if (!$f) {
+                       my $search = $new;
+                       $search =~ s,^.*/,,;
+                       $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
+                       if (!$f) {
+                               # Manufacturer name may have changed
+                               $search =~ s/^.*,//;
+                               $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
+                       }
+               }
+       }
+
+       # usual reason for breakage: file renamed to .rst
+       if (!$f) {
+               $new =~ s/\.txt$/.rst/;
+               $f=qx(find $basedir -iname $new) if ($new);
+       }
+
+       # usual reason for breakage: use dash or underline
+       if (!$f) {
+               $new =~ s/[-_]/[-_]/g;
+               $f=qx(find $basedir -iname $new) if ($new);
+       }
+
+       # Wild guess: seek for the same name on another place
+       if (!$f) {
+               $f = qx(find $basedir -iname $new) if ($new);
+       }
+
+       my @find = split /\s+/, $f;
+
+       if (!$f) {
+               print STDERR "ERROR: Didn't find a replacement for $ref\n";
+       } elsif (scalar(@find) > 1) {
+               print STDERR "WARNING: Won't auto-replace, as found multiple files close to $ref:\n";
+               foreach my $j (@find) {
+                       $j =~ s,^./,,;
+                       print STDERR "    $j\n";
+               }
+       } else {
+               $f = $find[0];
+               $f =~ s,^./,,;
+               print "INFO: Replacing $ref to $f\n";
+               foreach my $j (qx(git grep -l $ref)) {
+                       qx(sed "s\@$ref\@$f\@g" -i $j);
+               }
+       }
+}
index 698989584b6af91959bcdeb4401462485384b6bb..647e1f60357f1e6ad256d71be2d82fbe45ffb3a6 100755 (executable)
@@ -313,7 +313,7 @@ class MissingCheckers(AncillaryMethods):
         Right now, we still need Perl for doc build, as it is required
         by some tools called at docs or kernel build time, like:
 
-            scripts/documentation-file-ref-check
+            tools/docs/documentation-file-ref-check
 
         Also, checkpatch is on Perl.
         """