7976 lines · 239.6 KB · Perl
RawDownload
		LINENR => $linenr,		LINE => $line,	}; 	push(@fixed_deleted, $deleted);} sub ERROR {	my ($type, $msg) = @_; 	if (report("ERROR", $type, $msg)) {		our $clean = 0;		our $cnt_error++;		return 1;	}	return 0;}sub WARN {	my ($type, $msg) = @_; 	if (report("WARNING", $type, $msg)) {		our $clean = 0;		our $cnt_warn++;		return 1;	}	return 0;}sub CHK {	my ($type, $msg) = @_; 	if ($check && report("CHECK", $type, $msg)) {		our $clean = 0;		our $cnt_chk++;		return 1;	}	return 0;} sub check_absolute_file {	my ($absolute, $herecurr) = @_;	my $file = $absolute; 	##print "absolute<$absolute>\n"; 	# See if any suffix of this path is a path within the tree.	while ($file =~ s@^[^/]*/@@) {		if (-f "$root/$file") {			##print "file<$file>\n";			last;		}	}	if (! -f _)  {		return 0;	} 	# It is, so see if the prefix is acceptable.	my $prefix = $absolute;	substr($prefix, -length($file)) = ''; 	##print "prefix<$prefix>\n";	if ($prefix ne ".../") {		WARN("USE_RELATIVE_PATH",		     "use relative pathname instead of absolute in changelog text\n" . $herecurr);	}} sub trim {	my ($string) = @_; 	$string =~ s/^\s+|\s+$//g; 	return $string;} sub ltrim {	my ($string) = @_; 	$string =~ s/^\s+//; 	return $string;} sub rtrim {	my ($string) = @_; 	$string =~ s/\s+$//; 	return $string;} sub string_find_replace {	my ($string, $find, $replace) = @_; 	$string =~ s/$find/$replace/g; 	return $string;} sub tabify {	my ($leading) = @_; 	my $source_indent = $tabsize;	my $max_spaces_before_tab = $source_indent - 1;	my $spaces_to_tab = " " x $source_indent; 	#convert leading spaces to tabs	1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;	#Remove spaces before a tab	1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g; 	return "$leading";} sub pos_last_openparen {	my ($line) = @_; 	my $pos = 0; 	my $opens = $line =~ tr/\(/\(/;	my $closes = $line =~ tr/\)/\)/; 	my $last_openparen = 0; 	if (($opens == 0) || ($closes >= $opens)) {		return -1;	} 	my $len = length($line); 	for ($pos = 0; $pos < $len; $pos++) {		my $string = substr($line, $pos);		if ($string =~ /^($FuncArg|$balanced_parens)/) {			$pos += length($1) - 1;		} elsif (substr($line, $pos, 1) eq '(') {			$last_openparen = $pos;		} elsif (index($string, '(') == -1) {			last;		}	} 	return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;} sub get_raw_comment {	my ($line, $rawline) = @_;	my $comment = ''; 	for my $i (0 .. (length($line) - 1)) {		if (substr($line, $i, 1) eq "$;") {			$comment .= substr($rawline, $i, 1);		}	} 	return $comment;} sub exclude_global_initialisers {	my ($realfile) = @_; 	# Do not check for BPF programs (tools/testing/selftests/bpf/progs/*.c, samples/bpf/*_kern.c, *.bpf.c).	return $realfile =~ m@^tools/testing/selftests/bpf/progs/.*\.c$@ ||		$realfile =~ m@^samples/bpf/.*_kern\.c$@ ||		$realfile =~ m@/bpf/.*\.bpf\.c$@;} sub is_userspace {    my ($realfile) = @_;    return ($realfile =~ m@^tools/@ || $realfile =~ m@^scripts/@);} sub process {	my $filename = shift; 	my $linenr=0;	my $prevline="";	my $prevrawline="";	my $stashline="";	my $stashrawline=""; 	my $length;	my $indent;	my $previndent=0;	my $stashindent=0; 	our $clean = 1;	my $signoff = 0;	my $fixes_tag = 0;	my $is_revert = 0;	my $needs_fixes_tag = "";	my $author = '';	my $authorsignoff = 0;	my $author_sob = '';	my $is_patch = 0;	my $is_binding_patch = -1;	my $in_header_lines = $file ? 0 : 1;	my $in_commit_log = 0;		#Scanning lines before patch	my $has_patch_separator = 0;	#Found a --- line	my $has_commit_log = 0;		#Encountered lines before patch	my $commit_log_lines = 0;	#Number of commit log lines	my $commit_log_possible_stack_dump = 0;	my $commit_log_long_line = 0;	my $commit_log_has_diff = 0;	my $reported_maintainer_file = 0;	my $non_utf8_charset = 0; 	my $last_git_commit_id_linenr = -1; 	my $last_blank_line = 0;	my $last_coalesced_string_linenr = -1; 	our @report = ();	our $cnt_lines = 0;	our $cnt_error = 0;	our $cnt_warn = 0;	our $cnt_chk = 0; 	# Trace the real file/line as we go.	my $realfile = '';	my $realline = 0;	my $realcnt = 0;	my $here = '';	my $context_function;		#undef'd unless there's a known function	my $in_comment = 0;	my $comment_edge = 0;	my $first_line = 0;	my $p1_prefix = ''; 	my $prev_values = 'E'; 	# suppression flags	my %suppress_ifbraces;	my %suppress_whiletrailers;	my %suppress_export;	my $suppress_statement = 0; 	my %signatures = (); 	# Pre-scan the patch sanitizing the lines.	# Pre-scan the patch looking for any __setup documentation.	#	my @setup_docs = ();	my $setup_docs = 0; 	my $camelcase_file_seeded = 0; 	my $checklicenseline = 1; 	sanitise_line_reset();	my $line;	foreach my $rawline (@rawlines) {		$linenr++;		$line = $rawline; 		push(@fixed, $rawline) if ($fix); 		if ($rawline=~/^\+\+\+\s+(\S+)/) {			$setup_docs = 0;			if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) {				$setup_docs = 1;			}			#next;		}		if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {			$realline=$1-1;			if (defined $2) {				$realcnt=$3+1;			} else {				$realcnt=1+1;			}			$in_comment = 0; 			# Guestimate if this is a continuing comment.  Run			# the context looking for a comment "edge".  If this			# edge is a close comment then we must be in a comment			# at context start.			my $edge;			my $cnt = $realcnt;			for (my $ln = $linenr + 1; $cnt > 0; $ln++) {				next if (defined $rawlines[$ln - 1] &&					 $rawlines[$ln - 1] =~ /^-/);				$cnt--;				#print "RAW<$rawlines[$ln - 1]>\n";				last if (!defined $rawlines[$ln - 1]);				if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&				    $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {					($edge) = $1;					last;				}			}			if (defined $edge && $edge eq '*/') {				$in_comment = 1;			} 			# Guestimate if this is a continuing comment.  If this			# is the start of a diff block and this line starts			# ' *' then it is very likely a comment.			if (!defined $edge &&			    $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)			{				$in_comment = 1;			} 			##print "COMMENT:$in_comment edge<$edge> $rawline\n";			sanitise_line_reset($in_comment); 		} elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {			# Standardise the strings and chars within the input to			# simplify matching -- only bother with positive lines.			$line = sanitise_line($rawline);		}		push(@lines, $line); 		if ($realcnt > 1) {			$realcnt-- if ($line =~ /^(?:\+| |$)/);		} else {			$realcnt = 0;		} 		#print "==>$rawline\n";		#print "-->$line\n"; 		if ($setup_docs && $line =~ /^\+/) {			push(@setup_docs, $line);		}	} 	$prefix = ''; 	$realcnt = 0;	$linenr = 0;	$fixlinenr = -1;	foreach my $line (@lines) {		$linenr++;		$fixlinenr++;		my $sline = $line;	#copy of $line		$sline =~ s/$;/ /g;	#with comments as spaces 		my $rawline = $rawlines[$linenr - 1];		my $raw_comment = get_raw_comment($line, $rawline); # check if it's a mode change, rename or start of a patch		if (!$in_commit_log &&		    ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||		    ($line =~ /^rename (?:from|to) \S+\s*$/ ||		     $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {			$is_patch = 1;		} #extract the line range in the file after the patch is applied		if (!$in_commit_log &&		    $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {			my $context = $4;			$is_patch = 1;			$first_line = $linenr + 1;			$realline=$1-1;			if (defined $2) {				$realcnt=$3+1;			} else {				$realcnt=1+1;			}			annotate_reset();			$prev_values = 'E'; 			%suppress_ifbraces = ();			%suppress_whiletrailers = ();			%suppress_export = ();			$suppress_statement = 0;			if ($context =~ /\b(\w+)\s*\(/) {				$context_function = $1;			} else {				undef $context_function;			}			next; # track the line number as we move through the hunk, note that# new versions of GNU diff omit the leading space on completely# blank context lines so we need to count that too.		} elsif ($line =~ /^( |\+|$)/) {			$realline++;			$realcnt-- if ($realcnt != 0); 			# Measure the line length and indent.			($length, $indent) = line_stats($rawline); 			# Track the previous line.			($prevline, $stashline) = ($stashline, $line);			($previndent, $stashindent) = ($stashindent, $indent);			($prevrawline, $stashrawline) = ($stashrawline, $rawline); 			#warn "line<$line>\n"; 		} elsif ($realcnt == 1) {			$realcnt--;		} 		my $hunk_line = ($realcnt != 0); 		$here = "#$linenr: " if (!$file);		$here = "#$realline: " if ($file); 		my $found_file = 0;		# extract the filename as it passes		if ($line =~ /^diff --git.*?(\S+)$/) {			$realfile = $1;			$realfile =~ s@^([^/]*)/@@ if (!$file);			$in_commit_log = 0;			$found_file = 1;		} elsif ($line =~ /^\+\+\+\s+(\S+)/) {			$realfile = $1;			$realfile =~ s@^([^/]*)/@@ if (!$file);			$in_commit_log = 0; 			$p1_prefix = $1;			if (!$file && $tree && $p1_prefix ne '' &&			    -e "$root/$p1_prefix") {				WARN("PATCH_PREFIX",				     "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");			} 			if ($realfile =~ m@^include/asm/@) {				ERROR("MODIFIED_INCLUDE_ASM",				      "do not modify files in include/asm, change architecture specific files in arch/<architecture>/include/asm\n" . "$here$rawline\n");			}			$found_file = 1;		} #make up the handle for any error we report on this line		if ($showfile) {			$prefix = "$realfile:$realline: "		} elsif ($emacs) {			if ($file) {				$prefix = "$filename:$realline: ";			} else {				$prefix = "$filename:$linenr: ";			}		} 		if ($found_file) {			if (is_maintained_obsolete($realfile)) {				WARN("OBSOLETE",				     "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy.  No unnecessary modifications please.\n");			}			if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {				$check = 1;			} else {				$check = $check_orig;			}			$checklicenseline = 1; 			if ($realfile !~ /^(MAINTAINERS|dev\/null)/) {				my $last_binding_patch = $is_binding_patch; 				$is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@; 				if (($last_binding_patch != -1) &&				    ($last_binding_patch ^ $is_binding_patch)) {					WARN("DT_SPLIT_BINDING_PATCH",					     "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst\n");				}			} 			next;		} 		$here .= "FILE: $realfile:$realline:" if ($realcnt != 0); 		my $hereline = "$here\n$rawline\n";		my $herecurr = "$here\n$rawline\n";		my $hereprev = "$here\n$prevrawline\n$rawline\n"; 		$cnt_lines++ if ($realcnt != 0); # Verify the existence of a commit log if appropriate# 2 is used because a $signature is counted in $commit_log_lines		if ($in_commit_log) {			if ($line !~ /^\s*$/) {				$commit_log_lines++;	#could be a $signature			}		} elsif ($has_commit_log && $commit_log_lines < 2) {			WARN("COMMIT_MESSAGE",			     "Missing commit description - Add an appropriate one\n");			$commit_log_lines = 2;	#warn only once		} # Check if the commit log has what seems like a diff which can confuse patch		if ($in_commit_log && !$commit_log_has_diff &&		    (($line =~ m@^\s+diff\b.*a/([\w/]+)@ &&		      $line =~ m@^\s+diff\b.*a/[\w/]+\s+b/$1\b@) ||		     $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||		     $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {			ERROR("DIFF_IN_COMMIT_MSG",			      "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);			$commit_log_has_diff = 1;		} # Check for incorrect file permissions		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {			my $permhere = $here . "FILE: $realfile\n";			if ($realfile !~ m@scripts/@ &&			    $realfile !~ /\.(py|pl|awk|sh)$/) {

Lines 2501–3000 of 7976. Previous lines