1*d2656095SMauro Carvalho Chehab#!/usr/bin/env perl 2*d2656095SMauro Carvalho Chehab# SPDX-License-Identifier: GPL-2.0 3*d2656095SMauro Carvalho Chehab# 4e8939222SJani Nikula# Treewide grep for references to files under Documentation, and report 5e8939222SJani Nikula# non-existing files in stderr. 6e8939222SJani Nikula 7*d2656095SMauro Carvalho Chehabuse warnings; 8*d2656095SMauro Carvalho Chehabuse strict; 9*d2656095SMauro Carvalho Chehabuse Getopt::Long qw(:config no_auto_abbrev); 10e8939222SJani Nikula 11*d2656095SMauro Carvalho Chehabmy $scriptname = $0; 12*d2656095SMauro Carvalho Chehab$scriptname =~ s,.*/([^/]+/),$1,; 13*d2656095SMauro Carvalho Chehab 14*d2656095SMauro Carvalho Chehab# Parse arguments 15*d2656095SMauro Carvalho Chehabmy $help = 0; 16*d2656095SMauro Carvalho Chehabmy $fix = 0; 17*d2656095SMauro Carvalho Chehab 18*d2656095SMauro Carvalho ChehabGetOptions( 19*d2656095SMauro Carvalho Chehab 'fix' => \$fix, 20*d2656095SMauro Carvalho Chehab 'h|help|usage' => \$help, 21*d2656095SMauro Carvalho Chehab); 22*d2656095SMauro Carvalho Chehab 23*d2656095SMauro Carvalho Chehabif ($help != 0) { 24*d2656095SMauro Carvalho Chehab print "$scriptname [--help] [--fix-rst]\n"; 25*d2656095SMauro Carvalho Chehab exit -1; 26*d2656095SMauro Carvalho Chehab} 27*d2656095SMauro Carvalho Chehab 28*d2656095SMauro Carvalho Chehab# Step 1: find broken references 29*d2656095SMauro Carvalho Chehabprint "Finding broken references. This may take a while... " if ($fix); 30*d2656095SMauro Carvalho Chehab 31*d2656095SMauro Carvalho Chehabmy %broken_ref; 32*d2656095SMauro Carvalho Chehab 33*d2656095SMauro Carvalho Chehabopen IN, "git grep 'Documentation/'|" 34*d2656095SMauro Carvalho Chehab or die "Failed to run git grep"; 35*d2656095SMauro Carvalho Chehabwhile (<IN>) { 36*d2656095SMauro Carvalho Chehab next if (!m/^([^:]+):(.*)/); 37*d2656095SMauro Carvalho Chehab 38*d2656095SMauro Carvalho Chehab my $f = $1; 39*d2656095SMauro Carvalho Chehab my $ln = $2; 40*d2656095SMauro Carvalho Chehab 41*d2656095SMauro Carvalho Chehab # Makefiles contain nasty expressions to parse docs 42*d2656095SMauro Carvalho Chehab next if ($f =~ m/Makefile/); 43*d2656095SMauro Carvalho Chehab # Skip this script 44*d2656095SMauro Carvalho Chehab next if ($f eq $scriptname); 45*d2656095SMauro Carvalho Chehab 46*d2656095SMauro Carvalho Chehab if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*+-]*),) { 47*d2656095SMauro Carvalho Chehab my $prefix = $1; 48*d2656095SMauro Carvalho Chehab my $ref = $2; 49*d2656095SMauro Carvalho Chehab my $base = $2; 50*d2656095SMauro Carvalho Chehab 51*d2656095SMauro Carvalho Chehab $ref =~ s/[\,\.]+$//; 52*d2656095SMauro Carvalho Chehab 53*d2656095SMauro Carvalho Chehab my $fulref = "$prefix$ref"; 54*d2656095SMauro Carvalho Chehab 55*d2656095SMauro Carvalho Chehab $fulref =~ s/^(\<file|ref)://; 56*d2656095SMauro Carvalho Chehab $fulref =~ s/^[\'\`]+//; 57*d2656095SMauro Carvalho Chehab $fulref =~ s,^\$\(.*\)/,,; 58*d2656095SMauro Carvalho Chehab $base =~ s,.*/,,; 59*d2656095SMauro Carvalho Chehab 60*d2656095SMauro Carvalho Chehab # Remove URL false-positives 61*d2656095SMauro Carvalho Chehab next if ($fulref =~ m/^http/); 62*d2656095SMauro Carvalho Chehab 63*d2656095SMauro Carvalho Chehab # Check if exists, evaluating wildcards 64*d2656095SMauro Carvalho Chehab next if (grep -e, glob("$ref $fulref")); 65*d2656095SMauro Carvalho Chehab 66*d2656095SMauro Carvalho Chehab if ($fix) { 67*d2656095SMauro Carvalho Chehab if (!($ref =~ m/(devicetree|scripts|Kconfig|Kbuild)/)) { 68*d2656095SMauro Carvalho Chehab $broken_ref{$ref}++; 69*d2656095SMauro Carvalho Chehab } 70*d2656095SMauro Carvalho Chehab } else { 71*d2656095SMauro Carvalho Chehab print STDERR "$f: $fulref\n"; 72*d2656095SMauro Carvalho Chehab } 73*d2656095SMauro Carvalho Chehab } 74*d2656095SMauro Carvalho Chehab} 75*d2656095SMauro Carvalho Chehab 76*d2656095SMauro Carvalho Chehabexit 0 if (!$fix); 77*d2656095SMauro Carvalho Chehab 78*d2656095SMauro Carvalho Chehab# Step 2: Seek for file name alternatives 79*d2656095SMauro Carvalho Chehabprint "Auto-fixing broken references. Please double-check the results\n"; 80*d2656095SMauro Carvalho Chehab 81*d2656095SMauro Carvalho Chehabforeach my $ref (keys %broken_ref) { 82*d2656095SMauro Carvalho Chehab my $new =$ref; 83*d2656095SMauro Carvalho Chehab 84*d2656095SMauro Carvalho Chehab # get just the basename 85*d2656095SMauro Carvalho Chehab $new =~ s,.*/,,; 86*d2656095SMauro Carvalho Chehab 87*d2656095SMauro Carvalho Chehab # Seek for the same name on another place, as it may have been moved 88*d2656095SMauro Carvalho Chehab my $f=""; 89*d2656095SMauro Carvalho Chehab 90*d2656095SMauro Carvalho Chehab $f = qx(find . -iname $new) if ($new); 91*d2656095SMauro Carvalho Chehab 92*d2656095SMauro Carvalho Chehab # usual reason for breakage: file renamed to .rst 93*d2656095SMauro Carvalho Chehab if (!$f) { 94*d2656095SMauro Carvalho Chehab $new =~ s/\.txt$/.rst/; 95*d2656095SMauro Carvalho Chehab $f=qx(find . -iname $new) if ($new); 96*d2656095SMauro Carvalho Chehab } 97*d2656095SMauro Carvalho Chehab 98*d2656095SMauro Carvalho Chehab my @find = split /\s+/, $f; 99*d2656095SMauro Carvalho Chehab 100*d2656095SMauro Carvalho Chehab if (!$f) { 101*d2656095SMauro Carvalho Chehab print STDERR "ERROR: Didn't find a replacement for $ref\n"; 102*d2656095SMauro Carvalho Chehab } elsif (scalar(@find) > 1) { 103*d2656095SMauro Carvalho Chehab print STDERR "WARNING: Won't auto-replace, as found multiple files close to $ref:\n"; 104*d2656095SMauro Carvalho Chehab foreach my $j (@find) { 105*d2656095SMauro Carvalho Chehab $j =~ s,^./,,; 106*d2656095SMauro Carvalho Chehab print STDERR " $j\n"; 107*d2656095SMauro Carvalho Chehab } 108*d2656095SMauro Carvalho Chehab } else { 109*d2656095SMauro Carvalho Chehab $f = $find[0]; 110*d2656095SMauro Carvalho Chehab $f =~ s,^./,,; 111*d2656095SMauro Carvalho Chehab print "INFO: Replacing $ref to $f\n"; 112*d2656095SMauro Carvalho Chehab foreach my $j (qx(git grep -l $ref)) { 113*d2656095SMauro Carvalho Chehab qx(sed "s\@$ref\@$f\@g" -i $j); 114*d2656095SMauro Carvalho Chehab } 115*d2656095SMauro Carvalho Chehab } 116*d2656095SMauro Carvalho Chehab} 117