| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  | #!/usr/bin/perl | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-15 14:52:30 +01:00
										 |  |  | # Copyright (C) 2016 The Qt Company Ltd. | 
					
						
							| 
									
										
										
										
											2022-08-19 15:59:36 +02:00
										 |  |  | # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0 | 
					
						
							| 
									
										
										
										
											2016-01-15 14:52:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  | use strict; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $date = `date`; | 
					
						
							|  |  |  | print "# $date"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sub escape { | 
					
						
							|  |  |  |     my $text = shift; | 
					
						
							|  |  |  |     $text =~ s/\\/\\\\/g; | 
					
						
							|  |  |  |     $text =~ s/\n/\\n/g; | 
					
						
							|  |  |  |     $text =~ s/\t/\\t/g; | 
					
						
							|  |  |  |     return $text; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | sub checkLine { | 
					
						
							|  |  |  |     my $line = shift; | 
					
						
							|  |  |  |     my $file = shift; | 
					
						
							|  |  |  |     my $row = shift; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $file = escape($file); | 
					
						
							|  |  |  |     $row = escape($row); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /(FIXME|TODO)(.*)$/) { | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  |         print "$file\t$row\tWARNING\t$1$2\n"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /(qDebug|QDebug>|QtDebug>|<debug>)/) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tRemove debug code.\n"; | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     if ($line =~ /^(<<<<|====|>>>>)/) { | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |         print "$file\n$row\tERROR\tResolved conflict.\n"; | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /(Q_SIGNALS|Q_SLOTS)/) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tPrefer signals and slots over Q_SIGNALS and Q_SLOTS.\n"; | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |     if ($line =~ /^#\s*(warning|error) (.*)$/) { | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |         print "$file\t$row\t$1\tClean up preprocessor $1:$2.\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /\s+$/) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tTrailing whitespaces found.\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /^ *\t */) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tTabs used to indent.\n"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-04-16 18:38:10 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /^\s+{$/) { | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |         print "$file\t$row\tWARNING\tOpening bracket found all alone on a line.\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /{.*[^\s].*$/) { | 
					
						
							| 
									
										
										
										
											2012-04-16 18:38:10 +02:00
										 |  |  |         if ($line !~ /\{\s+\/\*/ && $line !~ /^\s*\{ \}$/ && $line !~ /^namespace .* \}$/) | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |         { print "$file\t$row\tWARNING\tText found after opening bracket.\n"; } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-04-16 18:38:10 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /[a-zA-Z0-9_]\*[^\/]/) { | 
					
						
							|  |  |  |         next if $line =~ /SIGNAL\(/; | 
					
						
							|  |  |  |         next if $line =~ /SLOT\(/; | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tUse \"TYPE *NAME\" (currently the space between TYPE and * is missing).\n"; | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-04-16 18:38:10 +02:00
										 |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /[a-zA-Z0-9_]&[^&]/) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tUse \"TYPE &NAME\" (currently the space between TYPE and & is missing).\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /\*\s+/) { | 
					
						
							|  |  |  |         next if ($line =~ /^\s*\*\*?\s+/); | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  |         next if ($line =~ /\/\*/); | 
					
						
							| 
									
										
										
										
											2012-04-16 18:38:10 +02:00
										 |  |  |         print "$file\t$row\tWARNING\tUse \"TYPE *NAME\" (currently there is a space between * and NAME).\n"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if ($file =~ /(.cpp|.c|.cxx|.h)$/ && $line =~ /[^&]&\s+/) { | 
					
						
							|  |  |  |         print "$file\t$row\tWARNING\tUse \"TYPE &NAME\" (currently there is a space between & and NAME).\n"; | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | my $filename = ""; | 
					
						
							|  |  |  | my $pos = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  | sub getDiffOrigin { | 
					
						
							|  |  |  |    my $currentBranch = `git branch | grep "^* "`; | 
					
						
							|  |  |  |    chop $currentBranch; | 
					
						
							| 
									
										
										
										
											2012-04-16 18:08:44 +02:00
										 |  |  |    $currentBranch =~ s/^\s*\* //; | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    my $remoteRepo = `git config --local --get branch.$currentBranch.remote`; | 
					
						
							|  |  |  |    chop $remoteRepo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    return "HEAD" if (!$remoteRepo); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    my $remoteBranch = `git config --local --get branch.$currentBranch.merge`; | 
					
						
							|  |  |  |    chop $remoteBranch; | 
					
						
							| 
									
										
										
										
											2012-04-16 18:08:44 +02:00
										 |  |  |    $remoteBranch =~ s!^refs/heads/!!; | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |    return "HEAD" if (!$remoteBranch); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    return "$remoteRepo/$remoteBranch"; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-19 13:54:27 +00:00
										 |  |  | my $origin = shift; | 
					
						
							|  |  |  | $origin = getDiffOrigin unless $origin; | 
					
						
							| 
									
										
										
										
											2010-10-15 11:37:37 +02:00
										 |  |  | print "# running: git diff $origin ...\n"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | open(PIPE, "git diff $origin|"); | 
					
						
							| 
									
										
										
										
											2010-08-27 17:10:40 +02:00
										 |  |  | while (<PIPE>) { | 
					
						
							|  |  |  |     chomp; | 
					
						
							|  |  |  |     my $line = $_; | 
					
						
							|  |  |  |     print "#$line\n"; | 
					
						
							|  |  |  |     next if ($line =~ /^-/); | 
					
						
							|  |  |  |     if ($line =~ /^\+\+\+ (.*)$/) { | 
					
						
							|  |  |  |         $filename = $1; | 
					
						
							|  |  |  |         $filename =~ s/^b\///; | 
					
						
							|  |  |  |         $pos = 0; | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     next if $filename =~ /^\/dev\/null$/; | 
					
						
							|  |  |  |     if ($line =~ /^@@ -\d+,\d+\s\+(\d+),\d+ @@$/) { | 
					
						
							|  |  |  |         $pos = $1 - 1; | 
					
						
							|  |  |  |         next; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     $pos = $pos + 1; | 
					
						
							|  |  |  |     if ($line =~ /^\+(.*)/) { | 
					
						
							|  |  |  |         checkLine($1, $filename, $pos); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2014-05-16 12:59:39 +03:00
										 |  |  | } | 
					
						
							|  |  |  | close(PIPE); |