mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	scripts: get_feat.pl: reduce table width for all features output
Auto-adjust the table columns width to better fit under terminals, by breaking the description on multiple lines and auto-estimating the minimal size for the per-architecture status. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Link: https://lore.kernel.org/r/9d39ac3fd51f1360aecc328c01558be88a1d6930.1607095090.git.mchehab+huawei@kernel.org Signed-off-by: Jonathan Corbet <corbet@lwn.net>
This commit is contained in:
		
							parent
							
								
									4fa32f8702
								
							
						
					
					
						commit
						f5889e70b9
					
				
					 1 changed files with 59 additions and 12 deletions
				
			
		|  | @ -19,6 +19,11 @@ $basename =~ s,/[^/]+$,/,; | ||||||
| 
 | 
 | ||||||
| my $prefix=$basename . "../Documentation/features"; | my $prefix=$basename . "../Documentation/features"; | ||||||
| 
 | 
 | ||||||
|  | # Used only at for full features output. The script will auto-adjust | ||||||
|  | # such values for the minimal possible values | ||||||
|  | my $status_size = 1; | ||||||
|  | my $description_size = 1; | ||||||
|  | 
 | ||||||
| GetOptions( | GetOptions( | ||||||
| 	"debug|d+" => \$debug, | 	"debug|d+" => \$debug, | ||||||
| 	"dir=s" => \$prefix, | 	"dir=s" => \$prefix, | ||||||
|  | @ -77,7 +82,10 @@ my $max_size_kconfig = length($h_kconfig); | ||||||
| my $max_size_description = length($h_description); | my $max_size_description = length($h_description); | ||||||
| my $max_size_subsys = length($h_subsys); | my $max_size_subsys = length($h_subsys); | ||||||
| my $max_size_status = length($h_status); | my $max_size_status = length($h_status); | ||||||
| my $max_size_arch = length($h_arch); | 
 | ||||||
|  | my $max_size_arch = 0; | ||||||
|  | my $max_size_arch_with_header; | ||||||
|  | my $max_description_word = 0; | ||||||
| 
 | 
 | ||||||
| sub parse_feat { | sub parse_feat { | ||||||
| 	my $file = $File::Find::name; | 	my $file = $File::Find::name; | ||||||
|  | @ -127,6 +135,13 @@ sub parse_feat { | ||||||
| 			if (length($description) > $max_size_description) { | 			if (length($description) > $max_size_description) { | ||||||
| 				$max_size_description = length($description); | 				$max_size_description = length($description); | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			foreach my $word (split /\s+/, $description) { | ||||||
|  | 				if (length($word) > $max_description_word) { | ||||||
|  | 					$max_description_word = length($word); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			next; | 			next; | ||||||
| 		} | 		} | ||||||
| 		next if (m/^\\s*$/); | 		next if (m/^\\s*$/); | ||||||
|  | @ -180,6 +195,8 @@ sub parse_feat { | ||||||
| 	$data{$name}->{description} = $description; | 	$data{$name}->{description} = $description; | ||||||
| 	$data{$name}->{comments} = $comments; | 	$data{$name}->{comments} = $comments; | ||||||
| 	$data{$name}->{table} = \%arch_table; | 	$data{$name}->{table} = \%arch_table; | ||||||
|  | 
 | ||||||
|  | 	$max_size_arch_with_header = $max_size_arch + length($h_arch); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # | # | ||||||
|  | @ -296,7 +313,7 @@ sub output_feature { | ||||||
| 		print "$com\n\n"; | 		print "$com\n\n"; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	print "=" x $max_size_arch; | 	print "=" x $max_size_arch_with_header; | ||||||
| 	print "  "; | 	print "  "; | ||||||
| 	print "=" x $max_size_status; | 	print "=" x $max_size_status; | ||||||
| 	print "\n"; | 	print "\n"; | ||||||
|  | @ -304,7 +321,7 @@ sub output_feature { | ||||||
| 	printf "%-${max_size_arch}s  ", $h_arch; | 	printf "%-${max_size_arch}s  ", $h_arch; | ||||||
| 	printf "%-${max_size_status}s", $h_status . "\n"; | 	printf "%-${max_size_status}s", $h_status . "\n"; | ||||||
| 
 | 
 | ||||||
| 	print "=" x $max_size_arch; | 	print "=" x $max_size_arch_with_header; | ||||||
| 	print "  "; | 	print "  "; | ||||||
| 	print "=" x $max_size_status; | 	print "=" x $max_size_status; | ||||||
| 	print "\n"; | 	print "\n"; | ||||||
|  | @ -315,7 +332,7 @@ sub output_feature { | ||||||
| 		printf "%-${max_size_status}s\n", $arch_table{$arch}; | 		printf "%-${max_size_status}s\n", $arch_table{$arch}; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	print "=" x $max_size_arch; | 	print "=" x $max_size_arch_with_header; | ||||||
| 	print "  "; | 	print "  "; | ||||||
| 	print "=" x $max_size_status; | 	print "=" x $max_size_status; | ||||||
| 	print "\n"; | 	print "\n"; | ||||||
|  | @ -351,6 +368,7 @@ sub matrix_lines($$$) { | ||||||
| 
 | 
 | ||||||
| sub output_matrix { | sub output_matrix { | ||||||
| 	my $title = "Feature status on all architectures"; | 	my $title = "Feature status on all architectures"; | ||||||
|  | 	my $notcompat = "Not compatible"; | ||||||
| 
 | 
 | ||||||
| 	print "=" x length($title) . "\n"; | 	print "=" x length($title) . "\n"; | ||||||
| 	print "$title\n"; | 	print "$title\n"; | ||||||
|  | @ -359,10 +377,21 @@ sub output_matrix { | ||||||
| 	my $desc_title = "$h_kconfig / $h_description"; | 	my $desc_title = "$h_kconfig / $h_description"; | ||||||
| 
 | 
 | ||||||
| 	my $desc_size = $max_size_kconfig + 4; | 	my $desc_size = $max_size_kconfig + 4; | ||||||
| 	$desc_size = $max_size_description if ($max_size_description > $desc_size); | 	if (!$description_size) { | ||||||
|  | 		$desc_size = $max_size_description if ($max_size_description > $desc_size); | ||||||
|  | 	} else { | ||||||
|  | 		$desc_size = $description_size if ($description_size > $desc_size); | ||||||
|  | 	} | ||||||
|  | 	$desc_size = $max_description_word if ($max_description_word > $desc_size); | ||||||
|  | 
 | ||||||
| 	$desc_size = length($desc_title) if (length($desc_title) > $desc_size); | 	$desc_size = length($desc_title) if (length($desc_title) > $desc_size); | ||||||
| 
 | 
 | ||||||
| 	my $status_size = 60; | 	$max_size_status = length($notcompat) if (length($notcompat) > $max_size_status); | ||||||
|  | 
 | ||||||
|  | 	# Ensure that the status will fit | ||||||
|  | 	my $min_status_size = $max_size_status + $max_size_arch + 6; | ||||||
|  | 	$status_size = $min_status_size if ($status_size < $min_status_size); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 	my $cur_subsys = ""; | 	my $cur_subsys = ""; | ||||||
| 	foreach my $name (sort { | 	foreach my $name (sort { | ||||||
|  | @ -394,7 +423,7 @@ sub output_matrix { | ||||||
| 		my %arch_table = %{$data{$name}->{table}}; | 		my %arch_table = %{$data{$name}->{table}}; | ||||||
| 		my $cur_status = ""; | 		my $cur_status = ""; | ||||||
| 
 | 
 | ||||||
| 		my @lines; | 		my (@lines, @descs); | ||||||
| 		my $line = ""; | 		my $line = ""; | ||||||
| 		foreach my $arch (sort { | 		foreach my $arch (sort { | ||||||
| 					($arch_table{$b} cmp $arch_table{$a}) or | 					($arch_table{$b} cmp $arch_table{$a}) or | ||||||
|  | @ -404,7 +433,7 @@ sub output_matrix { | ||||||
| 			my $status = $arch_table{$arch}; | 			my $status = $arch_table{$arch}; | ||||||
| 
 | 
 | ||||||
| 			if ($status eq "---") { | 			if ($status eq "---") { | ||||||
| 				$status = "Not compatible"; | 				$status = $notcompat; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			if ($status ne $cur_status) { | 			if ($status ne $cur_status) { | ||||||
|  | @ -423,17 +452,35 @@ sub output_matrix { | ||||||
| 		} | 		} | ||||||
| 		push @lines, $line if ($line ne ""); | 		push @lines, $line if ($line ne ""); | ||||||
| 
 | 
 | ||||||
| 		# Ensure that description will be printed | 		my $description = $data{$name}->{description}; | ||||||
| 		push @lines, "" while (scalar(@lines) < 2); | 		while (length($description) > $desc_size) { | ||||||
|  | 			my $d = substr $description, 0, $desc_size; | ||||||
|  | 
 | ||||||
|  | 			# Ensure that it will end on a space | ||||||
|  | 			# if it can't, it means that the size is too small | ||||||
|  | 			# Instead of aborting it, let's print what we have | ||||||
|  | 			if (!($d =~ s/^(.*)\s+.*/$1/)) { | ||||||
|  | 				$d = substr $d, 0, -1; | ||||||
|  | 				push @descs, "$d\\"; | ||||||
|  | 				$description =~ s/^\Q$d\E//; | ||||||
|  | 			} else { | ||||||
|  | 				push @descs, $d; | ||||||
|  | 				$description =~ s/^\Q$d\E\s+//; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		push @descs, $description; | ||||||
|  | 
 | ||||||
|  | 		# Ensure that the full description will be printed | ||||||
|  | 		push @lines, "" while (scalar(@lines) < 2 + scalar(@descs)); | ||||||
| 
 | 
 | ||||||
| 		my $ln = 0; | 		my $ln = 0; | ||||||
| 		for my $line(@lines) { | 		for my $line(@lines) { | ||||||
| 			if (!$ln) { | 			if (!$ln) { | ||||||
| 				printf "|%-${max_size_name}s", $name; | 				printf "|%-${max_size_name}s", $name; | ||||||
| 				printf "|%-${desc_size}s", "``" . $data{$name}->{kconfig} . "``"; | 				printf "|%-${desc_size}s", "``" . $data{$name}->{kconfig} . "``"; | ||||||
| 			} elsif ($ln == 2) { | 			} elsif ($ln >= 2 && scalar(@descs)) { | ||||||
| 				printf "|%-${max_size_name}s", ""; | 				printf "|%-${max_size_name}s", ""; | ||||||
| 				printf "|%-${desc_size}s", $data{$name}->{description}; | 				printf "|%-${desc_size}s", shift @descs; | ||||||
| 			} else { | 			} else { | ||||||
| 				printf "|%-${max_size_name}s", ""; | 				printf "|%-${max_size_name}s", ""; | ||||||
| 				printf "|%-${desc_size}s", ""; | 				printf "|%-${desc_size}s", ""; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue