mirror of https://github.com/openssl/openssl.git
				
				
				
			Add a check-format-commit.sh script
Add a wrapper script to check-format.pl, which is capable of analyzing
commits rather than just a file.  for a provided commit this script:
1) runs check-format.pl on the files changed in the provided commit
2) filters the output of check-format.pl, only producing lines that
   match ranges of changed lines in those files
Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Tom Cosgrove <tom.cosgrove@arm.com>
(Merged from https://github.com/openssl/openssl/pull/24806)
(cherry picked from commit acae12eb78)
			
			
This commit is contained in:
		
							parent
							
								
									dc38fc542b
								
							
						
					
					
						commit
						ab0c60df1f
					
				|  | @ -0,0 +1,171 @@ | |||
| #!/bin/bash | ||||
| # Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. | ||||
| # | ||||
| # Licensed under the Apache License 2.0 (the "License"). | ||||
| # You may not use this file except in compliance with the License. | ||||
| # You can obtain a copy in the file LICENSE in the source distribution | ||||
| # or at https://www.openssl.org/source/license.html | ||||
| # | ||||
| # This script is a wrapper around check-format.pl.  It accepts a commit sha | ||||
| # value as input, and uses it to identify the files and ranges that were | ||||
| # changed in that commit, filtering check-format.pl output only to lines that | ||||
| # fall into the commits change ranges. | ||||
| # | ||||
| 
 | ||||
| 
 | ||||
| # List of Regexes to use when running check-format.pl. | ||||
| # Style checks don't apply to any of these | ||||
| EXCLUDED_FILE_REGEX=("\.pod" \ | ||||
|                      "\.pl"  \ | ||||
|                      "\.pm"  \ | ||||
|                      "\.t"   \ | ||||
|                      "\.yml" \ | ||||
|                      "\.sh") | ||||
| 
 | ||||
| # Exit code for the script | ||||
| EXIT_CODE=0 | ||||
| 
 | ||||
| # Global vars | ||||
| 
 | ||||
| # TEMPDIR is used to hold any files this script creates | ||||
| # And is cleaned on EXIT with a trap function | ||||
| TEMPDIR=$(mktemp -d /tmp/checkformat.XXXXXX) | ||||
| 
 | ||||
| # TOPDIR always points to the root of the git tree we are working in | ||||
| # used to locate the check-format.pl script | ||||
| TOPDIR=$(git rev-parse --show-toplevel) | ||||
| 
 | ||||
| 
 | ||||
| # cleanup handler function, returns us to the root of the git tree | ||||
| # and erases our temp directory | ||||
| cleanup() { | ||||
|     rm -rf $TEMPDIR | ||||
|     cd $TOPDIR | ||||
| } | ||||
| 
 | ||||
| trap cleanup EXIT | ||||
| 
 | ||||
| # Get the canonical sha256 sum for the commit we are checking | ||||
| # This lets us pass in symbolic ref names like master/etc and  | ||||
| # resolve them to sha256 sums easily | ||||
| COMMIT=$(git rev-parse $1) | ||||
| 
 | ||||
| # Fail gracefully if git rev-parse doesn't produce a valid | ||||
| # commit | ||||
| if [ $? -ne 0 ] | ||||
| then | ||||
|     echo "$1 is not a valid revision" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # Create a iteratable list of files to check for a | ||||
| # given commit. It produces output of the format | ||||
| # <commit id> <file name> <change start line>, <change line count> | ||||
| touch $TEMPDIR/ranges.txt | ||||
| git show $COMMIT | awk -v mycmt=$COMMIT ' | ||||
|     BEGIN {myfile=""}  | ||||
|     /+{3}/ { | ||||
|         gsub(/b\//,"",$2); | ||||
|         myfile=$2 | ||||
|     } | ||||
|     /@@/ { | ||||
|         gsub(/+/,"",$3); | ||||
|         printf mycmt " " myfile " " $3 "\n" | ||||
|     }' >> $TEMPDIR/ranges.txt || true | ||||
| 
 | ||||
| # filter out anything that matches on a filter regex | ||||
| for i in ${EXCLUDED_FILE_REGEX[@]} | ||||
| do | ||||
|     touch $TEMPDIR/ranges.filter | ||||
|     grep -v "$i" $TEMPDIR/ranges.txt >> $TEMPDIR/ranges.filter || true | ||||
|     REMAINING_FILES=$(wc -l $TEMPDIR/ranges.filter | awk '{print $1}') | ||||
|     if [ $REMAINING_FILES -eq 0 ] | ||||
|     then | ||||
|         echo "This commit has no files that require checking" | ||||
|         exit 0 | ||||
|     fi | ||||
|     mv $TEMPDIR/ranges.filter $TEMPDIR/ranges.txt | ||||
| done | ||||
| 
 | ||||
| # check out the files from the commit level. | ||||
| # For each file name in ranges, we show that file at the commit | ||||
| # level we are checking, and redirect it to the same path, relative | ||||
| # to $TEMPDIR/check-format.  This give us the full file to run | ||||
| # check-format.pl on with line numbers matching the ranges in the | ||||
| # $TEMPDIR/ranges.txt file | ||||
| for j in $(grep $COMMIT $TEMPDIR/ranges.txt | awk '{print $2}') | ||||
| do | ||||
|     FDIR=$(dirname $j) | ||||
|     mkdir -p $TEMPDIR/check-format/$FDIR | ||||
|     git show $COMMIT:$j > $TEMPDIR/check-format/$j | ||||
| done | ||||
| 
 | ||||
| # Now for each file in $TEMPDIR/check-format run check-format.pl | ||||
| # Note that we use the %P formatter in the find utilty.  This strips | ||||
| # off the $TEMPDIR/check-format path prefix, leaving $j with the | ||||
| # path to the file relative to the root of the source dir, so that  | ||||
| # output from check-format.pl looks correct, relative to the root | ||||
| # of the git tree. | ||||
| for j in $(find $TEMPDIR/check-format -type f -printf "%P\n") | ||||
| do | ||||
|     range_start=() | ||||
|     range_end=() | ||||
| 
 | ||||
|     # Get the ranges for this file. Create 2 arrays.  range_start contains | ||||
|     # the start lines for valid ranges from the commit.  the range_end array | ||||
|     # contains the corresponding end line (note, since diff output gives us | ||||
|     # a line count for a change, the range_end[k] entry is actually | ||||
|     # range_start[k]+line count | ||||
|     for k in $(grep $COMMIT $TEMPDIR/ranges.txt | grep $j | awk '{print $3}') | ||||
|     do | ||||
|         RANGE=$k | ||||
|         RSTART=$(echo $RANGE | awk -F',' '{print $1}') | ||||
|         RLEN=$(echo $RANGE | awk -F',' '{print $2}') | ||||
|         let REND=$RSTART+$RLEN | ||||
|         range_start+=($RSTART) | ||||
|         range_end+=($REND) | ||||
|     done | ||||
| 
 | ||||
|     # Go to our checked out tree | ||||
|     cd $TEMPDIR/check-format | ||||
| 
 | ||||
|     # Actually run check-format.pl on the file, capturing the output | ||||
|     # in a temporary file.  Note the format of check-patch.pl output is | ||||
|     # <file name>:<line number>:<error text>:<offending line contents> | ||||
|     $TOPDIR/util/check-format.pl $j > $TEMPDIR/format-results.txt | ||||
| 
 | ||||
|     # Now we filter the check-format.pl output based on the changed lines | ||||
|     # captured in the range_start/end arrays | ||||
|     let maxidx=${#range_start[@]}-1 | ||||
|     for k in $(seq 0 1 $maxidx) | ||||
|     do | ||||
|         RSTART=${range_start[$k]} | ||||
|         REND=${range_end[$k]} | ||||
| 
 | ||||
|         # field 2 of check-format.pl output is the offending line number | ||||
|         # Check here if any line in that output falls between any of the  | ||||
|         # start/end ranges defined in the range_start/range_end array. | ||||
|         # If it does fall in that range, print the entire line to stdout | ||||
|         # If anything is printed, have awk exit with a non-zero exit code | ||||
|         awk -v rstart=$RSTART -v rend=$REND -F':' ' | ||||
|                 BEGIN {rc=0} | ||||
|                 /:/ { | ||||
|                     if (($2 >= rstart) && ($2 <= rend)) { | ||||
|                         print $0; | ||||
|                         rc=1 | ||||
|                     } | ||||
|                 } | ||||
|                 END {exit rc;} | ||||
|             ' $TEMPDIR/format-results.txt | ||||
| 
 | ||||
|         # If awk exited with a non-zero code, this script will also exit | ||||
|         # with a non-zero code | ||||
|         if [ $? -ne 0 ] | ||||
|         then | ||||
|             EXIT_CODE=1 | ||||
|         fi | ||||
|     done | ||||
| done | ||||
| 
 | ||||
| # Exit with the recorded exit code above | ||||
| exit $EXIT_CODE | ||||
		Loading…
	
		Reference in New Issue