ARM: dts: imx7d: recreate imx7d.dtsi with i.MX 7Dual specifics
[cascardo/linux.git] / scripts / checkpatch.pl
index 1048672..6750595 100755 (executable)
@@ -27,12 +27,15 @@ my $emacs = 0;
 my $terse = 0;
 my $showfile = 0;
 my $file = 0;
+my $git = 0;
+my %git_commits = ();
 my $check = 0;
 my $check_orig = 0;
 my $summary = 1;
 my $mailback = 0;
 my $summary_file = 0;
 my $show_types = 0;
+my $list_types = 0;
 my $fix = 0;
 my $fix_inplace = 0;
 my $root;
@@ -68,13 +71,24 @@ Options:
   --emacs                    emacs compile window format
   --terse                    one line per report
   --showfile                 emit diffed file position, not input file position
+  -g, --git                  treat FILE as a single commit or git revision range
+                             single git commit with:
+                               <rev>
+                               <rev>^
+                               <rev>~n
+                             multiple git commits with:
+                               <rev1>..<rev2>
+                               <rev1>...<rev2>
+                               <rev>-<count>
+                             git merges are ignored
   -f, --file                 treat FILE as regular source file
   --subjective, --strict     enable more subjective tests
+  --list-types               list the possible message types
   --types TYPE(,TYPE2...)    show only these comma separated message types
   --ignore TYPE(,TYPE2...)   ignore various comma separated message types
+  --show-types               show the specific message type in the output
   --max-line-length=n        set the maximum line length, if exceeded, warn
   --min-conf-desc-length=n   set the min description length, if shorter, warn
-  --show-types               show the message "types" in the output
   --root=PATH                PATH to the kernel tree root
   --no-summary               suppress the per-file summary
   --mailback                 only produce a report in case of warnings/errors
@@ -106,6 +120,37 @@ EOM
        exit($exitcode);
 }
 
+sub uniq {
+       my %seen;
+       return grep { !$seen{$_}++ } @_;
+}
+
+sub list_types {
+       my ($exitcode) = @_;
+
+       my $count = 0;
+
+       local $/ = undef;
+
+       open(my $script, '<', abs_path($P)) or
+           die "$P: Can't read '$P' $!\n";
+
+       my $text = <$script>;
+       close($script);
+
+       my @types = ();
+       for ($text =~ /\b(?:(?:CHK|WARN|ERROR)\s*\(\s*"([^"]+)")/g) {
+               push (@types, $_);
+       }
+       @types = sort(uniq(@types));
+       print("#\tMessage type\n\n");
+       foreach my $type (@types) {
+               print(++$count . "\t" . $type . "\n");
+       }
+
+       exit($exitcode);
+}
+
 my $conf = which_conf($configuration_file);
 if (-f $conf) {
        my @conf_args;
@@ -141,11 +186,13 @@ GetOptions(
        'terse!'        => \$terse,
        'showfile!'     => \$showfile,
        'f|file!'       => \$file,
+       'g|git!'        => \$git,
        'subjective!'   => \$check,
        'strict!'       => \$check,
        'ignore=s'      => \@ignore,
        'types=s'       => \@use,
        'show-types!'   => \$show_types,
+       'list-types!'   => \$list_types,
        'max-line-length=i' => \$max_line_length,
        'min-conf-desc-length=i' => \$min_conf_desc_length,
        'root=s'        => \$root,
@@ -166,6 +213,8 @@ GetOptions(
 
 help(0) if ($help);
 
+list_types(0) if ($list_types);
+
 $fix = 1 if ($fix_inplace);
 $check_orig = $check;
 
@@ -752,10 +801,42 @@ my @fixed_inserted = ();
 my @fixed_deleted = ();
 my $fixlinenr = -1;
 
+# If input is git commits, extract all commits from the commit expressions.
+# For example, HEAD-3 means we need check 'HEAD, HEAD~1, HEAD~2'.
+die "$P: No git repository found\n" if ($git && !-e ".git");
+
+if ($git) {
+       my @commits = ();
+       foreach my $commit_expr (@ARGV) {
+               my $git_range;
+               if ($commit_expr =~ m/^(.*)-(\d+)$/) {
+                       $git_range = "-$2 $1";
+               } elsif ($commit_expr =~ m/\.\./) {
+                       $git_range = "$commit_expr";
+               } else {
+                       $git_range = "-1 $commit_expr";
+               }
+               my $lines = `git log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
+               foreach my $line (split(/\n/, $lines)) {
+                       $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
+                       next if (!defined($1) || !defined($2));
+                       my $sha1 = $1;
+                       my $subject = $2;
+                       unshift(@commits, $sha1);
+                       $git_commits{$sha1} = $subject;
+               }
+       }
+       die "$P: no git commits after extraction!\n" if (@commits == 0);
+       @ARGV = @commits;
+}
+
 my $vname;
 for my $filename (@ARGV) {
        my $FILE;
-       if ($file) {
+       if ($git) {
+               open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
+                       die "$P: $filename: git format-patch failed - $!\n";
+       } elsif ($file) {
                open($FILE, '-|', "diff -u /dev/null $filename") ||
                        die "$P: $filename: diff failed - $!\n";
        } elsif ($filename eq '-') {
@@ -766,6 +847,8 @@ for my $filename (@ARGV) {
        }
        if ($filename eq '-') {
                $vname = 'Your patch';
+       } elsif ($git) {
+               $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
        } else {
                $vname = $filename;
        }
@@ -5975,6 +6058,14 @@ sub process {
        }
 
        if ($quiet == 0) {
+               # If there were any defects found and not already fixing them
+               if (!$clean and !$fix) {
+                       print << "EOM"
+
+NOTE: For some of the reported defects, checkpatch may be able to
+      mechanically convert to the typical style using --fix or --fix-inplace.
+EOM
+               }
                # If there were whitespace errors which cleanpatch can fix
                # then suggest that.
                if ($rpt_cleaners) {