1 #!/bin/bash -e
   2 
   3 TMP_DIR=/tmp
   4 
   5 help()
   6 {
   7     echo "Usage: $0 [--no-compile|--amend] <filename>"
   8     echo "You must be at the base of the kernel tree to run this."
   9     exit 1
  10 }
  11 
  12 continue_yn()
  13 {
  14     echo -n "Do you want to fix these issues now? "
  15     read ans
  16     if ! echo $ans | grep -iq ^n ; then
  17         exit 1;
  18     fi
  19 }
  20 
  21 qc()
  22 {
  23     local msg=$1
  24     local ans
  25 
  26     echo -n "$msg:  "
  27     read ans
  28     if ! echo $ans | grep -qi ^y ; then
  29         exit 1
  30     fi
  31 }
  32 
  33 NO_COMPILE=false
  34 AMEND=""
  35 
  36 while true ; do
  37     if [[ "$1" == "--no-compile" ]] ; then
  38         NO_COMPILE=true
  39         shift
  40     elif [[ "$1" == "--amend" ]] ; then
  41         AMEND="--amend"
  42         shift
  43     else
  44         break
  45     fi
  46 done
  47 
  48 if [ ! -f $1 ] ; then
  49     help
  50 fi
  51 
  52 fullname=$1
  53 filename=$(basename $fullname)
  54 oname=$(echo ${fullname/.c/.o})
  55 
  56 MSG_FILE=$TMP_DIR/${filename}.msg
  57 MAIL_FILE=$TMP_DIR/${filename}.mail
  58 
  59 # heat up the disk cache
  60 #git log --oneline $fullname | head -n 10 > /dev/null &
  61 
  62 echo "QC checklist"
  63 qc "Have you handled all the errors properly?"
  64 if git diff $fullname | grep ^+ | grep -qi alloc ; then
  65     qc "Have you freed all your mallocs?"
  66 fi
  67 if git diff $fullname | grep ^+ | grep -qi alloc ; then
  68     qc "Have you check all your mallocs for NULL returns?"
  69 fi
  70 
  71 if [ "$NO_COMPILE" != "true" ] ; then
  72     kchecker --spammy $fullname
  73     kchecker --sparse --endian $fullname
  74 #    rm $oname
  75 #    make C=1 CHECK="scripts/coccicheck" $oname
  76 fi
  77 
  78 for file in $(grep -l $fullname ~/var/mail/sent-*) ; do
  79     grepmail $fullname $file | grep -i ^subject || echo -n ""
  80 done
  81 qc "Looks OK?"
  82 
  83 git add $fullname
  84 
  85 cat /dev/null > $MSG_FILE
  86 if [ "$AMEND" != "" ] ; then
  87     git format-patch HEAD^ --stdout >> $MSG_FILE
  88 else
  89     echo "" >> $MSG_FILE
  90     echo "Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>" >> $MSG_FILE
  91     echo "" >> $MSG_FILE
  92     echo "# $sm_err" >> $MSG_FILE
  93 fi
  94 git log -10 --oneline $fullname | sed -e 's/^/# /' >> $MSG_FILE
  95 vim $MSG_FILE
  96 
  97 grep -v '^#' $MSG_FILE > $MSG_FILE.1
  98 mv $MSG_FILE.1 $MSG_FILE
  99 
 100 git commit $AMEND -F $MSG_FILE
 101 
 102 git format-patch HEAD^ --stdout >> $MSG_FILE
 103 
 104 to_addr=$(./scripts/get_maintainer.pl --noroles --norolestats $MSG_FILE | head -n 1)
 105 cc_addr=$(./scripts/get_maintainer.pl --noroles --norolestats $MSG_FILE | tail -n +2 | \
 106     perl -ne 's/\n$/, /; print')
 107 cc_addr="$cc_addr, kernel-janitors@vger.kernel.org"
 108 
 109 echo -n "To:  "  > $MAIL_FILE
 110 echo "$to_addr" >> $MAIL_FILE
 111 echo -n "CC:  " >> $MAIL_FILE
 112 echo "$cc_addr" >> $MAIL_FILE
 113 echo "X-Mailer: git-send-email haha only kidding" >> $MAIL_FILE
 114 
 115 git format-patch HEAD^ --stdout >> $MAIL_FILE
 116 
 117 ./scripts/checkpatch.pl $MAIL_FILE || continue_yn
 118 
 119 echo "Press ENTER to continue"
 120 read unused
 121 
 122 mutt -H $MAIL_FILE
 123 rm -f $MSG_FILE