| #!/usr/bin/perl -W |
| # SPDX-License-Identifier: (GPL-2.0+ OR MIT) |
| # |
| # Copyright (c) 2019 Amlogic, Inc. All rights reserved. |
| # |
| my $top = "."; |
| my $err_cnt = 0; |
| my $k_v = 4; |
| my $exit = 0; |
| my $git_format_link="http://wiki-china.amlogic.com/Platform/Bootloader/Bootloader_commit_message_format"; |
| my $config1 = "arch/arm64/configs/meson64_a64_defconfig"; |
| my $config2 = "arch/arm/configs/meson64_a32_defconfig"; |
| my $skip = 0; |
| |
| #Check mesonxx_defconfig |
| sub check_defconfig |
| { |
| my $err = 0; |
| #print "2. Check meson_defconfig: "; |
| if( -e $config1) |
| { |
| `make ARCH=arm64 meson64_a64_defconfig 1> /dev/null 2>&1`; |
| `make ARCH=arm64 savedefconfig 1> /dev/null 2>&1`; |
| `rm -fr .config`; |
| my $diff = `diff defconfig ./arch/arm64/configs/meson64_a64_defconfig`; |
| if(length($diff)) |
| { |
| $err_cnt += 1; |
| $err = 1; |
| $err_msg .= " $err_cnt: meson64_a64_defconfig not generated by savedefconfig\n"; |
| } |
| } |
| if( -e $config2) |
| { |
| `make ARCH=arm meson64_a32_defconfig 1> /dev/null 2>&1`; |
| `make ARCH=arm savedefconfig 1> /dev/null 2>&1`; |
| `rm -fr .config`; |
| $diff = `diff defconfig ./arch/arm/configs/meson64_a32_defconfig`; |
| if(length($diff)) |
| { |
| $err_cnt += 1; |
| $err = 1; |
| $err_msg .= " $err_cnt: meson32_defconfig not generated by savedefconfig\n"; |
| } |
| } |
| #print $err ? "fail\n" : "success\n"; |
| } |
| |
| # check module_param number |
| sub check_module_param |
| { |
| my $num = `git format-patch -1 --stdout | grep -c "module_param("`; |
| my $MAX_NUM = 5; |
| |
| if( $num > $MAX_NUM ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: the number of module_param too much\n"; |
| } |
| } |
| |
| my $MAX_LEN = 80; |
| |
| sub check_msg_common |
| { |
| my $line = pop(@_); |
| my $lnum = pop(@_); |
| |
| if( (length($line) > ($MAX_LEN + 4) ) && ($lnum > 4) ) |
| { #Line over 80 characters is not allowed. |
| $line =~ s/^(\s){4}//; |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Line over $MAX_LEN characters: <$line>\n"; |
| } |
| |
| if ( ($line =~ /\s+$/) && $line !~/^(\s){4}$/ ) |
| { #No space at the end of line |
| $err_cnt += 1; |
| $line =~ s/^(\s){4}//; |
| $err_msg .= " $err_cnt: No space at the end of line: <$line>\n"; |
| } |
| } |
| |
| |
| sub check_msg_49_2 |
| { |
| my $msg = `git cat-file commit HEAD~0 | sed '1,/\^\$/d'`; |
| my @str = split /[\n][\n]/, $msg; |
| my $i = 0; |
| my $len = @str; |
| |
| if( $msg =~ /^Revert/ ) |
| { |
| return 0; |
| } |
| |
| if( $len < 4 ) |
| { |
| $err_cnt += 5; |
| $err_msg .= " module: message [n/m]\n\n"; |
| $err_msg .= " PD#SWPL-XXXX\n\n"; |
| $err_msg .= " Problem:\n detailed description\n\n"; |
| $err_msg .= " Solution:\n detailed description\n\n"; |
| $err_msg .= " Verify:\n detailed description\n\n"; |
| return -1; |
| } |
| |
| if( $msg !~ /Merge\s/ && $msg =~ /4\.19/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: this branch is 4.19, all changes here are for 4.19. No「4.19」in commit message please\n"; |
| } |
| |
| if( $str[$i] !~ /^([\w-]+:\s){1,2}.+(\s)\[[\d]+\/[\d]+\]$/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: module: message\n"; |
| } |
| elsif( $str[$i] =~ /(kernel)/i ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Should be no 'kernel' in kernel commit message\n"; |
| } |
| |
| if( $str[++ $i] !~ /^PD\#SWPL-.+(\d)$/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: PD#SWPL-XXXX\n"; |
| |
| } |
| |
| if( $str[++ $i] !~ /^Problem:[\n].+/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Problem:\n detailed description\n"; |
| } |
| |
| $i += 1; |
| while( $str[$i] !~ /^Solution:[\n].+/ && $str[$i] !~ /^Change-Id:/ && $str[$i] !~ /^Verify:[\n].+/ ) |
| { |
| $i = $i + 1; |
| } |
| |
| if( $str[$i] !~ /^Solution:[\n].+/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Solution:\n detailed description\n"; |
| } |
| |
| if( $str[$i] =~ /^Change-Id:/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Verify:\n detailed description\n"; |
| return -1; |
| } |
| |
| while( $str[$i] !~ /^Verify:[\n].+/ && $str[$i] !~ /^Change-Id:/ ) |
| { |
| $i += 1; |
| } |
| |
| if( $str[$i] !~ /^Verify:[\n].+/ ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: Verify:\n detailed description\n"; |
| } |
| } |
| |
| sub sync_arm64_arm_diff |
| { |
| my $file = `git diff --name-only HEAD HEAD^`; |
| my $arm_dts_num = () = ($file =~ /arch\/arm\/boot\/dts\/amlogic/g); |
| my $arm64_dts_num = () = ($file =~ /arch\/arm64\/boot\/dts\/amlogic/g); |
| my $arm_config_num = () = ($file =~ /arch\/arm\/config/g); |
| my $arm64_config_num = () = ($file =~ /arch\/arm64\/config/g); |
| |
| if( $arm_config_num != $arm64_config_num ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: maybe should modify the config in both arm and arm64\n"; |
| } |
| if( $arm_dts_num != $arm64_dts_num ) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $err_cnt: maybe should modify the dts in both arm and arm64\n"; |
| } |
| } |
| |
| sub check_nonascii_character |
| { |
| my $add_msg = `git format-patch -1 --stdout`; |
| my @add_str = split /[\n]/, $add_msg; |
| my $i = 0; |
| my $len = @add_str; |
| |
| for ($i = 0; $i < $len; $i = $i + 1) |
| { |
| if ($add_str[$i] =~ m/[^\x00-\x7f]/) |
| { |
| $err_cnt += 1; |
| $err_msg .= " $add_str[$i]\n"; |
| } |
| } |
| } |
| |
| |
| sub check_commit_msg |
| { |
| |
| my $lnum = 0; |
| my $err = 0; |
| my $result = 0; |
| my $commit; |
| my $FILE; |
| |
| open($FILE, '<&STDIN'); |
| |
| while (<$FILE>) { |
| chomp; |
| my $line = $_; |
| |
| |
| if( $line =~ /^commit\s([0-9a-z])+$/) |
| { |
| $lnum = 0; |
| $commit = $line; |
| $skip = 0; |
| } |
| $lnum ++; |
| |
| |
| if( ($lnum ==2) && ($line =~ /^Merge: /)) |
| { |
| #$skip =1; #Don't Check branch merge |
| } |
| if( ($lnum==2) && ($line !~ /^Author: .*\@amlogic\.com\>$/)) |
| { |
| #$skip =1; #Don't Check commit which is not from amlogic |
| } |
| |
| if( $err == 1) |
| { |
| $skip = 1; |
| $err = 0; |
| $result = 1; |
| } |
| if( $skip ==1) |
| { |
| next; |
| } |
| |
| check_msg_common($lnum, $line); |
| } |
| close $FILE; |
| if ($k_v >= 4) |
| { |
| check_msg_49_2; |
| } |
| } |
| |
| sub out_review |
| { |
| my $out_msg = ""; |
| my $out_file = "../output/review.txt"; |
| |
| if ($err_cnt) |
| { |
| $out_msg = <<END; |
| \$ git log -1 | ./scripts/amlogic/merge_pre_check.pl -; total $err_cnt errors. |
| ${err_msg} |
| |
| END |
| |
| #open O, "> $out_file" or die "Can't Open $out_file For Write \n"; |
| #print O $out_msg; |
| #close O; |
| $exit = 1; |
| print $out_msg; |
| print "Please refer to:\n $git_format_link\n"; |
| } |
| else |
| { |
| print ""; |
| } |
| } |
| |
| #start |
| |
| my $err_msg_p = "\nCommit Pre check failed. Total $err_cnt errors.\n"; |
| |
| |
| #Check meson_defconfig |
| check_defconfig(); |
| |
| #check_module_param |
| check_module_param(); |
| |
| #Check commit message |
| check_commit_msg(); |
| |
| #check config and dts in arm and arm64 |
| sync_arm64_arm_diff(); |
| |
| check_nonascii_character(); |
| |
| out_review(); |
| #out |
| exit $exit; |