6972 lines · 205.6 KB · Perl
RawDownload
			$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 include/asm-<architecture>\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/) {				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)$/) {				ERROR("EXECUTE_PERMISSIONS",				      "do not set execute permissions for source files\n" . $permhere);			}		} # Check the patch for a From:		if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {			$author = $1;			$author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);			$author =~ s/"//g;			$author = reformat_email($author);		} # Check the patch for a signoff:		if ($line =~ /^\s*signed-off-by:\s*(.*)/i) {			$signoff++;			$in_commit_log = 0;			if ($author ne '') {				if (same_email_addresses($1, $author)) {					$authorsignoff = 1;				}			}		} # Check for patch separator		if ($line =~ /^---$/) {			$has_patch_separator = 1;			$in_commit_log = 0;		} # Check if MAINTAINERS is being updated.  If so, there's probably no need to# emit the "does MAINTAINERS need updating?" message on file add/move/delete		if ($line =~ /^\s*MAINTAINERS\s*\|/) {			$reported_maintainer_file = 1;		} # Check signature styles		if (!$in_header_lines &&		    $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {			my $space_before = $1;			my $sign_off = $2;			my $space_after = $3;			my $email = $4;			my $ucfirst_sign_off = ucfirst(lc($sign_off)); 			if ($sign_off !~ /$signature_tags/) {				WARN("BAD_SIGN_OFF",				     "Non-standard signature: $sign_off\n" . $herecurr);			}			if (defined $space_before && $space_before ne "") {				if (WARN("BAD_SIGN_OFF",					 "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =					    "$ucfirst_sign_off $email";				}			}			if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {				if (WARN("BAD_SIGN_OFF",					 "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =					    "$ucfirst_sign_off $email";				} 			}			if (!defined $space_after || $space_after ne " ") {				if (WARN("BAD_SIGN_OFF",					 "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =					    "$ucfirst_sign_off $email";				}			} 			my ($email_name, $name_comment, $email_address, $comment) = parse_email($email);			my $suggested_email = format_email(($email_name, $email_address));			if ($suggested_email eq "") {				ERROR("BAD_SIGN_OFF",				      "Unrecognized email address: '$email'\n" . $herecurr);			} else {				my $dequoted = $suggested_email;				$dequoted =~ s/^"//;				$dequoted =~ s/" </ </;				# Don't force email to have quotes				# Allow just an angle bracketed address				if (!same_email_addresses($email, $suggested_email)) {					WARN("BAD_SIGN_OFF",					     "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);				}			} # Check for duplicate signatures			my $sig_nospace = $line;			$sig_nospace =~ s/\s//g;			$sig_nospace = lc($sig_nospace);			if (defined $signatures{$sig_nospace}) {				WARN("BAD_SIGN_OFF",				     "Duplicate signature\n" . $herecurr);			} else {				$signatures{$sig_nospace} = 1;			} # Check Co-developed-by: immediately followed by Signed-off-by: with same name and email			if ($sign_off =~ /^co-developed-by:$/i) {				if ($email eq $author) {					WARN("BAD_SIGN_OFF",					      "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline);				}				if (!defined $lines[$linenr]) {					WARN("BAD_SIGN_OFF",                                             "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline);				} elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {					WARN("BAD_SIGN_OFF",					     "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);				} elsif ($1 ne $email) {					WARN("BAD_SIGN_OFF",					     "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);				}			}		} # Check email subject for common tools that don't need to be mentioned		if ($in_header_lines &&		    $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {			WARN("EMAIL_SUBJECT",			     "A patch subject line should describe the change not the tool that found it\n" . $herecurr);		} # Check for Gerrit Change-Ids not in any patch context		if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {			ERROR("GERRIT_CHANGE_ID",			      "Remove Gerrit Change-Id's before submitting upstream\n" . $herecurr);		} # Check if the commit log is in a possible stack dump		if ($in_commit_log && !$commit_log_possible_stack_dump &&		    ($line =~ /^\s*(?:WARNING:|BUG:)/ ||		     $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||					# timestamp		     $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||		     $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||		     $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {					# stack dump address styles			$commit_log_possible_stack_dump = 1;		} # Check for line lengths > 75 in commit log, warn once		if ($in_commit_log && !$commit_log_long_line &&		    length($line) > 75 &&		    !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||					# file delta changes		      $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||					# filename then :		      $line =~ /^\s*(?:Fixes:|Link:)/i ||					# A Fixes: or Link: line		      $commit_log_possible_stack_dump)) {			WARN("COMMIT_LOG_LONG_LINE",			     "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);			$commit_log_long_line = 1;		} # Reset possible stack dump if a blank line is found		if ($in_commit_log && $commit_log_possible_stack_dump &&		    $line =~ /^\s*$/) {			$commit_log_possible_stack_dump = 0;		} # Check for git id commit length and improperly formed commit descriptions		if ($in_commit_log && !$commit_log_possible_stack_dump &&		    $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&		    $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&		    ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||		     ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&		      $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&		      $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {			my $init_char = "c";			my $orig_commit = "";			my $short = 1;			my $long = 0;			my $case = 1;			my $space = 1;			my $hasdesc = 0;			my $hasparens = 0;			my $id = '0123456789ab';			my $orig_desc = "commit description";			my $description = ""; 			if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {				$init_char = $1;				$orig_commit = lc($2);			} elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {				$orig_commit = lc($1);			} 			$short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);			$long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);			$space = 0 if ($line =~ /\bcommit [0-9a-f]/i);			$case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);			if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {				$orig_desc = $1;				$hasparens = 1;			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&				 defined $rawlines[$linenr] &&				 $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {				$orig_desc = $1;				$hasparens = 1;			} elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&				 defined $rawlines[$linenr] &&				 $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {				$line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;				$orig_desc = $1;				$rawlines[$linenr] =~ /^\s*([^"]+)"\)/;				$orig_desc .= " " . $1;				$hasparens = 1;			} 			($id, $description) = git_commit_info($orig_commit,							      $id, $orig_desc); 			if (defined($id) &&			   ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {				ERROR("GIT_COMMIT_ID",				      "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);			}		} # Check for added, moved or deleted files		if (!$reported_maintainer_file && !$in_commit_log &&		    ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||		     $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||		     ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&		      (defined($1) || defined($2))))) {			$is_patch = 1;			$reported_maintainer_file = 1;			WARN("FILE_PATH_CHANGES",			     "added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr);		} # Check for adding new DT bindings not in schema format		if (!$in_commit_log &&		    ($line =~ /^new file mode\s*\d+\s*$/) &&		    ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {			WARN("DT_SCHEMA_BINDING_PATCH",			     "DT bindings should be in DT schema format. See: Documentation/devicetree/writing-schema.rst\n");		} # Check for wrappage within a valid hunk of the file		if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {			ERROR("CORRUPTED_PATCH",			      "patch seems to be corrupt (line wrapped?)\n" .				$herecurr) if (!$emitted_corrupt++);		} # UTF-8 regex found at http://www.w3.org/International/questions/qa-forms-utf-8.en.php		if (($realfile =~ /^$/ || $line =~ /^\+/) &&		    $rawline !~ m/^$UTF8*$/) {			my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/); 			my $blank = copy_spacing($rawline);			my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";			my $hereptr = "$hereline$ptr\n"; 			CHK("INVALID_UTF8",			    "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);		} # Check if it's the start of a commit log# (not a header line and we haven't seen the patch filename)		if ($in_header_lines && $realfile =~ /^$/ &&		    !($rawline =~ /^\s+(?:\S|$)/ ||		      $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {			$in_header_lines = 0;			$in_commit_log = 1;			$has_commit_log = 1;		} # Check if there is UTF-8 in a commit log when a mail header has explicitly# declined it, i.e defined some charset where it is missing.		if ($in_header_lines &&		    $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&		    $1 !~ /utf-8/i) {			$non_utf8_charset = 1;		} 		if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&		    $rawline =~ /$NON_ASCII_UTF8/) {			WARN("UTF8_BEFORE_PATCH",			    "8-bit UTF-8 used in possible commit log\n" . $herecurr);		} # Check for absolute kernel paths in commit message		if ($tree && $in_commit_log) {			while ($line =~ m{(?:^|\s)(/\S*)}g) {				my $file = $1; 				if ($file =~ m{^(.*?)(?::\d+)+:?$} &&				    check_absolute_file($1, $herecurr)) {					#				} else {					check_absolute_file($file, $herecurr);				}			}		} # Check for various typo / spelling mistakes		if (defined($misspellings) &&		    ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {			while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {				my $typo = $1;				my $typo_fix = $spelling_fix{lc($typo)};				$typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);				$typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);				my $msg_level = \&WARN;				$msg_level = \&CHK if ($file);				if (&{$msg_level}("TYPO_SPELLING",						  "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&				    $fix) {					$fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;				}			}		} # check for invalid commit id		if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {			my $id;			my $description;			($id, $description) = git_commit_info($2, undef, undef);			if (!defined($id)) {				WARN("UNKNOWN_COMMIT_ID",				     "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);			}		} # ignore non-hunk lines and lines being removed		next if (!$hunk_line || $line =~ /^-/); #trailing whitespace		if ($line =~ /^\+.*\015/) {			my $herevet = "$here\n" . cat_vet($rawline) . "\n";			if (ERROR("DOS_LINE_ENDINGS",				  "DOS line endings\n" . $herevet) &&			    $fix) {				$fixed[$fixlinenr] =~ s/[\s\015]+$//;			}

Lines 2501–3000 of 6972. Previous lines