]> git.proxmox.com Git - mirror_frr.git/blobdiff - tools/checkpatch.sh
zebra: Convert socket interface to use `union sockunion`
[mirror_frr.git] / tools / checkpatch.sh
index 42ea8dbb3819b96efa93f7117840dfcb78432ab3..6071f4804d9ef7e445be063cbd0e7711180b9e14 100755 (executable)
@@ -7,6 +7,9 @@ checkpatch="$tree/tools/checkpatch.pl --no-tree -f"
 ignore="ldpd\|babeld"
 cwd=${PWD##*/}
 dirty=0
+stat=0
+tmp1=/tmp/f1-$$
+tmp2=/tmp/f2-$$
 
 if [[ -z "$1" || -z "$2" ]]; then
   echo "$usage"
@@ -14,7 +17,7 @@ if [[ -z "$1" || -z "$2" ]]; then
 fi
 
 # remove temp directories
-rm -rf /tmp/f1 /tmp/f2
+rm -rf ${tmp1} ${tmp2}
 
 # save working tree
 if git -C $tree status --porcelain | egrep --silent '^(\?\?|.[DM])'; then
@@ -37,34 +40,52 @@ fi
 
 git -C $tree reset --hard
 git -C $tree apply < $patch
-mkdir -p /tmp/f1 /tmp/f2
+mkdir -p ${tmp1} ${tmp2}
 mod=$(git -C $tree ls-files -m | grep ".*\.[ch]" | grep -v $ignore)
 mod+=" $(git -C $tree ls-files --others --exclude-standard | grep '.*\.[ch]' | grep -v $ignore)"
 echo $mod
 if [ -z "$mod" ]; then
   echo "There doesn't seem to be any changes."
 else
-  cp $tree/$mod /tmp/f1/
+  echo "Copying source to temp directory..."
+  for file in $mod; do
+    echo "$tree/$file --> ${tmp1}/$file"
+    cp $tree/$file ${tmp1}/
+  done
   git -C $tree reset --hard
   git -C $tree clean -fd
-  cp $tree/$mod /tmp/f2/
+  for file in $mod; do
+    if [ -f $tree/$file ]; then
+      echo "$tree/$file --> ${tmp2}/$file"
+      cp $tree/$file ${tmp2}/
+    fi
+  done
   echo "Running style checks..."
-  for file in /tmp/f1/*; do
+  for file in ${tmp1}/*; do
     echo "$checkpatch $file > $file _cp"
     $checkpatch $file > "$file"_cp 2> /dev/null
   done
-  for file in /tmp/f2/*; do
+  for file in ${tmp2}/*; do
     echo "$checkpatch $file > $file _cp"
     $checkpatch $file > "$file"_cp 2> /dev/null
   done
   echo "Done."
-  for file in /tmp/f1/*_cp; do
-    echo "Report for $(basename $file _cp)"
-    echo "==============================================="
-    if [ -a /tmp/f2/$(basename $file) ]; then
-      diff $file /tmp/f2/$(basename $file) | grep -v "normally be const" | grep -A3 "ERROR\|WARNING"
+  for file in ${tmp1}/*_cp; do
+    if [ -a ${tmp2}/$(basename $file) ]; then
+      result=$(diff $file ${tmp2}/$(basename $file) | awk '/< ERROR|< WARNING/,/^< $|^< #|^<[^ ]/ { print $0; ++n }; END { exit n }')
     else
-      cat $file | grep -v "normally be const" | grep -A3 "ERROR\|WARNING"
+      result=$(cat $file | awk '/ERROR|WARNING/,/^$/ { print $0; ++n }; END { exit n }')
+    fi
+    ni="$?"
+    if [ "$ni" -ne "0" ]; then
+      echo "Report for $(basename $file _cp) | $ni issues" 1>&2
+      echo "===============================================" 1>&2
+      echo "$result" 1>&2
+      if echo $result | grep -q "ERROR"; then
+        stat=2
+      elif [ "$stat" -eq "0" ]; then
+        stat=1
+      fi
     fi
   done
 fi
@@ -79,3 +100,8 @@ if [ $dirty -eq 1 ]; then
   fi
   git -C $tree config --unset gc.auto;
 fi
+
+# remove temp directories
+rm -rf ${tmp1} ${tmp2}
+
+exit $stat