From nobody Sat May 4 17:06:53 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505294029386381.6564868409803; Wed, 13 Sep 2017 02:13:49 -0700 (PDT) Received: from localhost ([::1]:41089 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ds3jw-0001je-I2 for importer@patchew.org; Wed, 13 Sep 2017 05:13:48 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37010) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ds3gR-0006Aa-5h for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:10:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ds3gM-00038Z-Sr for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:10:11 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42776) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ds3gM-00037J-Jh for qemu-devel@nongnu.org; Wed, 13 Sep 2017 05:10:06 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 176934ACCA for ; Wed, 13 Sep 2017 09:10:05 +0000 (UTC) Received: from t460.redhat.com (unknown [10.33.36.24]) by smtp.corp.redhat.com (Postfix) with ESMTP id BC5742C6C0; Wed, 13 Sep 2017 09:10:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 176934ACCA Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=berrange@redhat.com From: "Daniel P. Berrange" To: qemu-devel@nongnu.org Date: Wed, 13 Sep 2017 10:10:00 +0100 Message-Id: <20170913091000.9005-1-berrange@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 13 Sep 2017 09:10:05 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v3] scripts: let checkpatch.pl process an entire GIT branch X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Paolo Bonzini , Markus Armbruster Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Currently before submitting a series, devs should run checkpatch.pl across each patch to be submitted. This can be automated using a command such as: git rebase -i master -x 'git show | ./scripts/checkpatch.pl -' This is rather long winded to type, so this patch introduces a way to tell checkpatch.pl to validate a series of GIT revisions. There are now three modes it can operate in 1) check a patch 2) check a sou= rce file, or 3) check a git branch. If no flags are given, the mode is determined by checking the args passed to the command. If the args contain a literal ".." it is treated as a GIT revi= sion list. If the args end in ".patch" or equal "-" it is treated as a patch fil= e. Otherwise it is treated as a source file. This automatic guessing can be overridden using --[no-]patch --[no-]file or --[no-]branch For example to check a GIT revision list: $ ./scripts/checkpatch.pl master.. total: 0 errors, 0 warnings, 297 lines checked b886d352a2bf58f0996471fb3991a138373a2957 has no obvious style problems = and is ready for submission. total: 0 errors, 0 warnings, 182 lines checked 2a731f9a9ce145e0e0df6d42dd2a3ce4dfc543fa has no obvious style problems = and is ready for submission. total: 0 errors, 0 warnings, 102 lines checked 11844169bcc0c8ed4449eb3744a69877ed329dd7 has no obvious style problems = and is ready for submission. If a genuine patch filename contains the characters '..' it is possible to force interpretation of the arg as a patch $ ./scripts/checkpatch.pl --patch master.. will force it to load a patch file called "master..", or equivalently $ ./scripts/checkpatch.pl --no-branch master.. will simply turn off guessing of GIT revision lists. Signed-off-by: Daniel P. Berrange --- Changed in v3: - Re-add --branch/--no-branch arg - Refactor default arg type guessing to fully consider the matrix of possible --[no-]branch, --[no-]patch, --[no-]file arg values scripts/checkpatch.pl | 138 ++++++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 111 insertions(+), 27 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index fa478074b8..28d71b3733 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -18,11 +18,12 @@ use Getopt::Long qw(:config no_auto_abbrev); my $quiet =3D 0; my $tree =3D 1; my $chk_signoff =3D 1; -my $chk_patch =3D 1; +my $chk_patch =3D undef; +my $chk_branch =3D undef; my $tst_only; my $emacs =3D 0; my $terse =3D 0; -my $file =3D 0; +my $file =3D undef; my $no_warnings =3D 0; my $summary =3D 1; my $mailback =3D 0; @@ -35,14 +36,19 @@ sub help { my ($exitcode) =3D @_; =20 print << "EOM"; -Usage: $P [OPTION]... [FILE]... +Usage: + + $P [OPTION]... [FILE]... + $P [OPTION]... [GIT-REV-LIST] + Version: $V =20 Options: -q, --quiet quiet --no-tree run without a kernel tree --no-signoff do not check for 'Signed-off-by' line - --patch treat FILE as patchfile (default) + --patch treat FILE as patchfile + --branch treat args as GIT revision list --emacs emacs compile window format --terse one line per report -f, --file treat FILE as regular source file @@ -69,6 +75,7 @@ GetOptions( 'tree!' =3D> \$tree, 'signoff!' =3D> \$chk_signoff, 'patch!' =3D> \$chk_patch, + 'branch!' =3D> \$chk_branch, 'emacs!' =3D> \$emacs, 'terse!' =3D> \$terse, 'f|file!' =3D> \$file, @@ -93,6 +100,49 @@ if ($#ARGV < 0) { exit(1); } =20 +if (!defined $chk_branch && !defined $chk_patch && !defined $file) { + $chk_branch =3D $ARGV[0] =3D~ /\.\./ ? 1 : 0; + $chk_patch =3D $chk_branch ? 0 : + $ARGV[0] =3D~ /\.patch$/ || $ARGV[0] eq "-" ? 1 : 0; + $file =3D $chk_branch || $chk_patch ? 0 : 1; +} elsif (!defined $chk_branch && !defined $chk_patch) { + if ($file) { + $chk_branch =3D $chk_patch =3D 0; + } else { + $chk_branch =3D $ARGV[0] =3D~ /\.\./ ? 1 : 0; + $chk_patch =3D $chk_branch ? 0 : 1; + } +} elsif (!defined $chk_branch && !defined $file) { + if ($chk_patch) { + $chk_branch =3D $file =3D 0; + } else { + $chk_branch =3D $ARGV[0] =3D~ /\.\./ ? 1 : 0; + $file =3D $chk_branch ? 0 : 1; + } +} elsif (!defined $chk_patch && !defined $file) { + if ($chk_branch) { + $chk_patch =3D $file =3D 0; + } else { + $chk_patch =3D $ARGV[0] =3D~ /\.patch$/ || $ARGV[0] eq "-" ? 1 : 0; + $file =3D $chk_patch ? 0 : 1; + } +} elsif (!defined $chk_branch) { + $chk_branch =3D $chk_patch || $file ? 0 : 1; +} elsif (!defined $chk_patch) { + $chk_patch =3D $chk_branch || $file ? 0 : 1; +} elsif (!defined $file) { + $file =3D $chk_patch || $chk_branch ? 0 : 1; +} + +if (($chk_patch && $chk_branch) || + ($chk_patch && $file) || + ($chk_branch && $file)) { + die "Only one of --file, --branch, --patch is permitted\n"; +} +if (!$chk_patch && !$chk_branch && !$file) { + die "One of --file, --branch, --patch is required\n"; +} + my $dbg_values =3D 0; my $dbg_possible =3D 0; my $dbg_type =3D 0; @@ -251,32 +301,66 @@ $chk_signoff =3D 0 if ($file); my @rawlines =3D (); my @lines =3D (); my $vname; -for my $filename (@ARGV) { - my $FILE; - if ($file) { - open($FILE, '-|', "diff -u /dev/null $filename") || - die "$P: $filename: diff failed - $!\n"; - } elsif ($filename eq '-') { - open($FILE, '<&STDIN'); - } else { - open($FILE, '<', "$filename") || - die "$P: $filename: open failed - $!\n"; - } - if ($filename eq '-') { - $vname =3D 'Your patch'; - } else { - $vname =3D $filename; - } - while (<$FILE>) { +if ($chk_branch) { + my @patches; + my $HASH; + open($HASH, "-|", "git", "log", "--format=3D%H", $ARGV[0]) || + die "$P: git log --format=3D%H $ARGV[0] failed - $!\n"; + + while (<$HASH>) { chomp; - push(@rawlines, $_); + push @patches, $_; + } + + close $HASH; + + die "$P: no revisions returned for revlist '$chk_branch'\n" + unless @patches; + + for my $hash (@patches) { + my $FILE; + open($FILE, '-|', "git", "show", $hash) || + die "$P: git show $hash - $!\n"; + $vname =3D $hash; + while (<$FILE>) { + chomp; + push(@rawlines, $_); + } + close($FILE); + if (!process($hash)) { + $exit =3D 1; + } + @rawlines =3D (); + @lines =3D (); } - close($FILE); - if (!process($filename)) { - $exit =3D 1; +} else { + for my $filename (@ARGV) { + my $FILE; + if ($file) { + open($FILE, '-|', "diff -u /dev/null $filename") || + die "$P: $filename: diff failed - $!\n"; + } elsif ($filename eq '-') { + open($FILE, '<&STDIN'); + } else { + open($FILE, '<', "$filename") || + die "$P: $filename: open failed - $!\n"; + } + if ($filename eq '-') { + $vname =3D 'Your patch'; + } else { + $vname =3D $filename; + } + while (<$FILE>) { + chomp; + push(@rawlines, $_); + } + close($FILE); + if (!process($filename)) { + $exit =3D 1; + } + @rawlines =3D (); + @lines =3D (); } - @rawlines =3D (); - @lines =3D (); } =20 exit($exit); --=20 2.13.5