Speed up the "lint-docs" target by making it non-.PHONY. Similar to myc234e8a0ec(Makefile: make the "sparse" target non-.PHONY, 2021-09-23). We'll now create empty files corresponding to a dependency graph for each of these lint scripts. This speeds things up a bit[1], and makes the output correspond to any in-tree changes we have: $ touch git-add.txt; make lint-docs; make lint-docs GEN cmd-list.made GEN doc.dep LINT GITLINK git-add.txt LINT MAN END git-add.txt LINT MAN SEC git-add.txt make: Nothing to be done for 'lint-docs'. As with the "sparse" target changes this has a hard dependency on the use of ".DELETE_ON_ERROR" in the Makefile, added here indb10fc6c09(doc: simplify Makefile using .DELETE_ON_ERROR, 2021-05-21). This method also depends on the output for us emitting any errors on STDERR (fixed in a preceding commit), as well us these scripts exiting with non-zero on any errors (which they were already doing). 1. $ git show HEAD~:Documentation/Makefile >Makefile.old $ hyperfine --warmup 2 -L f ",.old" 'make -j1 -f Makefile{f} lint-docs' Benchmark #1: make -j1 -f Makefile lint-docs Time (mean ± σ): 60.8 ms ± 1.4 ms [User: 58.7 ms, System: 2.5 ms] Range (min … max): 58.9 ms … 64.0 ms 48 runs Benchmark #2: make -j1 -f Makefile.old lint-docs Time (mean ± σ): 84.0 ms ± 1.5 ms [User: 78.6 ms, System: 5.7 ms] Range (min … max): 81.8 ms … 87.8 ms 35 runs Summary 'make -j1 -f Makefile lint-docs' ran 1.38 ± 0.04 times faster than 'make -j1 -f Makefile.old lint-docs' Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/perl
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
 | 
						|
# Parse arguments, a simple state machine for input like:
 | 
						|
#
 | 
						|
# <file-to-check.txt> <valid-files-to-link-to> --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
 | 
						|
my %TXT;
 | 
						|
my %SECTION;
 | 
						|
my $section;
 | 
						|
my $lint_these = 0;
 | 
						|
my $to_check = shift @ARGV;
 | 
						|
for my $arg (@ARGV) {
 | 
						|
	if (my ($sec) = $arg =~ /^--section=(\d+)$/s) {
 | 
						|
		$section = $sec;
 | 
						|
		next;
 | 
						|
	}
 | 
						|
 | 
						|
	my ($name) = $arg =~ /^(.*?)\.txt$/s;
 | 
						|
	unless (defined $section) {
 | 
						|
		$TXT{$name} = $arg;
 | 
						|
		next;
 | 
						|
	}
 | 
						|
 | 
						|
	$SECTION{$name} = $section;
 | 
						|
}
 | 
						|
 | 
						|
my $exit_code = 0;
 | 
						|
sub report {
 | 
						|
	my ($pos, $line, $target, $msg) = @_;
 | 
						|
	substr($line, $pos) = "' <-- HERE";
 | 
						|
	$line =~ s/^\s+//;
 | 
						|
	print STDERR "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n";
 | 
						|
	print STDERR "$ARGV:$.:\t'$line\n";
 | 
						|
	$exit_code = 1;
 | 
						|
}
 | 
						|
 | 
						|
@ARGV = sort values %TXT;
 | 
						|
die "BUG: No list of valid linkgit:* files given" unless @ARGV;
 | 
						|
@ARGV = $to_check;
 | 
						|
while (<>) {
 | 
						|
	my $line = $_;
 | 
						|
	while ($line =~ m/linkgit:((.*?)\[(\d)\])/g) {
 | 
						|
		my $pos = pos $line;
 | 
						|
		my ($target, $page, $section) = ($1, $2, $3);
 | 
						|
 | 
						|
		# De-AsciiDoc
 | 
						|
		$page =~ s/{litdd}/--/g;
 | 
						|
 | 
						|
		if (!exists $TXT{$page}) {
 | 
						|
			report($pos, $line, $target, "link outside of our own docs");
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		if (!exists $SECTION{$page}) {
 | 
						|
			report($pos, $line, $target, "link outside of our sectioned docs");
 | 
						|
			next;
 | 
						|
		}
 | 
						|
		my $real_section = $SECTION{$page};
 | 
						|
		if ($section != $SECTION{$page}) {
 | 
						|
			report($pos, $line, $target, "wrong section (should be $real_section)");
 | 
						|
			next;
 | 
						|
		}
 | 
						|
	}
 | 
						|
	# this resets our $. for each file
 | 
						|
	close ARGV if eof;
 | 
						|
}
 | 
						|
 | 
						|
exit $exit_code;
 |