Update AC_CONFIG_SRCDIR after scripts/vs removal
[hvutilities.git] / scripts / kernel-send-patches.sh
index 9b6f2c5..4e7688f 100755 (executable)
@@ -44,6 +44,7 @@ TO_CMD="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats -
 CC_CMD="`pwd`/scripts/get_maintainer.pl --nogit --nogit-fallback --norolestats --non --nom"
 
 # Set default values
+debug="0"
 commit_start=""
 commit_end=""
 DRY_RUN="--dry-run"
@@ -53,6 +54,11 @@ compile_cmd="make"
 compile_script=/tmp/kernel-compile-script.sh
 cover="no"
 series=""
+resend="no"
+GIT_FORMAT_PATCH_SUBJECT="PATCH"
+GIT_FORMAT_PATCH_OPTS="--histogram"
+skip_compile=0
+CHECKPATCH_OPS="--strict"
 
 print_usage()
 {
@@ -60,16 +66,22 @@ print_usage()
     echo "Usage: ${PROG_NAME} [OPTIONS...]"
     echo
     echo "Options:"
+    echo "  -d   debug mode"
     echo "  -e   end commit (string)"
     echo "  -f   folder containing patch infos"
     echo "  -h   display this help and exit"
+    echo "  -n   dot not compile patches"
+    echo "  -p   resend patch"
     echo "  -r   really send emails (default = dry-run)"
     echo "  -s   start commit (string)"
     echo
 }
 
-while getopts "e:f:hrs:" flag ;do
+while getopts "de:f:hnprs:" flag ;do
     case ${flag} in
+        d)
+            debug="1"
+            ;;
         e)
             commit_end="${OPTARG}"
             ;;
@@ -80,6 +92,12 @@ while getopts "e:f:hrs:" flag ;do
            print_usage
             exit 0
             ;;
+        n)
+            skip_compile=1
+            ;;
+        p)
+            resend="yes"
+            ;;
         r)
             DRY_RUN=""
             ;;
@@ -156,9 +174,11 @@ if [ x"${base_branch}" = x"" ]; then
     exit 1
 fi
 
-if [ x"${compile_branch}" = x"" ]; then
-    echo "Missing compile_branch shell variable"
-    exit 1
+if [ ${skip_compile} -eq 0 ]; then
+    if [ x"${compile_branch}" = x"" ]; then
+        echo "Missing compile_branch shell variable"
+        exit 1
+    fi
 fi
 
 if [ x"${base_commit}" = x"" ]; then
@@ -171,6 +191,16 @@ find_commit_by_log()
     echo $(git log --oneline HEAD~100..HEAD | grep "${1}" | awk {'print $1'})
 }
 
+# Find SHA1 of preceding commit:
+# First arg: commit message
+find_preceding_commit_by_log()
+{
+    local sha1_end
+
+    sha1_end="$(find_commit_by_log "${1}")"
+    echo $(git log --oneline ${sha1_end}~2..${sha1_end}~1 | awk {'print $1'})
+}
+
 # Remove "Name" if present in email address. Needed because of a bug in
 # get_maintainer.pl even if we specify the "--non" option.
 # Arg #1: "Name <email>" or "email"
@@ -232,6 +262,11 @@ if [ x"${COMMIT_END_SHA1}" = x"" ]; then
     exit 1
 fi
 
+if echo "${commit_end}" | grep -q "^end"; then
+    # Take commit just before end commit:
+    COMMIT_END_SHA1=$(find_preceding_commit_by_log "${commit_end}")
+fi
+
 rm -rf ${srcdir}/*.patch
 
 # If the cover letter is not between start and end commits, save a copy:
@@ -251,7 +286,12 @@ if [ x"${orig_branch}" = x"" ]; then
 fi
 
 if git branch | grep -q ${patches_branch}; then
-    git branch -D ${patches_branch}
+    git branch -D ${patches_branch} 1>/dev/null
+fi
+
+if [ "${debug}" = "1" ]; then
+    echo "start commit: ${COMMIT_START_SHA1}"
+    echo "end commit:   ${COMMIT_END_SHA1}"
 fi
 
 # Create new branch from base_branch, and apply all our patches onto it:
@@ -259,7 +299,7 @@ git checkout -b ${patches_branch} ${base_branch}
 git branch --set-upstream-to ${base_branch}
 git cherry-pick ${COMMIT_START_SHA1}..${COMMIT_END_SHA1}
 
-GIT_FORMAT_PATCH_OPTS="--base=${base_commit}"
+GIT_FORMAT_PATCH_OPTS="${GIT_FORMAT_PATCH_OPTS} --base=${base_commit}"
 
 if [ x"${cover}" = x"yes" ]; then
     GIT_FORMAT_PATCH_OPTS="${GIT_FORMAT_PATCH_OPTS} --cover-letter"
@@ -271,11 +311,16 @@ if [ x"${series}" != x"" -a x"${series}" != x"1" ]; then
     GIT_FORMAT_PATCH_OPTS="${GIT_FORMAT_PATCH_OPTS} -v ${series}"
 fi
 
-git format-patch ${GIT_FORMAT_PATCH_OPTS} --output-directory=${srcdir} ${base_branch}
+if [ x"${resend}" = x"yes" ]; then
+    GIT_FORMAT_PATCH_SUBJECT="RESEND ${GIT_FORMAT_PATCH_SUBJECT}"
+fi
+
+git format-patch --subject-prefix="${GIT_FORMAT_PATCH_SUBJECT}" \
+    ${GIT_FORMAT_PATCH_OPTS} --output-directory=${srcdir} ${base_branch}
 
 if [ x"${cover}" = x"yes" ]; then
     # Replace subject line in cover letter:
-    sed -i -e "s/\*\*\* SUB.*/${subject}/" ${srcdir}/${series_prefix}0000-cover-letter.patch
+    sed -i -e "s@\*\*\* SUB.*@${subject}@" ${srcdir}/${series_prefix}0000-cover-letter.patch
 
     # Replace blurb line in cover letter:
     sed -i -e "/.*BLURB.*/{r /tmp/cover-letter.txt" -e 'd}' ${srcdir}/${series_prefix}0000-cover-letter.patch
@@ -301,7 +346,8 @@ for p in ${srcdir}/*.patch; do
     fi
 done
 
-cat > ${compile_script} << "EOF"
+if [ ${skip_compile} -eq 0 ]; then
+    cat > ${compile_script} << "EOF"
 #!/bin/bash
 # Do not edit, auto-generated script
 echo
@@ -310,34 +356,34 @@ echo "Testing commit: $(git log --oneline | head -n 1)"
 COMPILE_CMD
 EOF
 
-if [ x"${init_cmd}" != x"" ]; then
-    sed -i -e "s@.*INIT_CMD@${init_cmd}@" ${compile_script}
-fi
-sed -i -e "s@COMPILE_CMD@${compile_cmd}@" ${compile_script}
-chmod u+x ${compile_script}
+    if [ x"${init_cmd}" != x"" ]; then
+        sed -i -e "s@.*INIT_CMD@${init_cmd}@" ${compile_script}
+    fi
+    sed -i -e "s@COMPILE_CMD@${compile_cmd}@" ${compile_script}
+    chmod u+x ${compile_script}
 
-# Create temporary branch for compilation, based on compile_branch:
-temp_compile_branch="${patches_branch}_compile"
+    # Create temporary branch for compilation, based on compile_branch:
+    temp_compile_branch="${patches_branch}_compile"
 
-if git branch | grep -q ${temp_compile_branch}; then
-    git branch -D ${temp_compile_branch}
-fi
-
-git checkout -b ${temp_compile_branch} ${compile_branch}
+    if git branch | grep -q ${temp_compile_branch}; then
+        git branch -D ${temp_compile_branch}
+    fi
 
-# Make sure temp_compile_branch is rebased on base_branch:
-git rebase ${base_branch}
+    git checkout -b ${temp_compile_branch} ${compile_branch}
 
-# Apply all of our commits to temp_compile_branch:
-git cherry-pick ${COMMIT_START_SHA1}..${COMMIT_END_SHA1}
+    # Apply all of our commits to temp_compile_branch:
+    git cherry-pick ${COMMIT_START_SHA1}..${COMMIT_END_SHA1}
 
-# Compile and test each commit:
-git rebase --exec=${compile_script} ${compile_branch}
+    # Compile and test each commit:
+    git rebase --exec=${compile_script} ${compile_branch}
+fi
 
 git checkout ${orig_branch}
 
-# Remove temporary branch:
-git branch -D ${temp_compile_branch}
+if [ ${skip_compile} -eq 0 ]; then
+    # Remove temporary branch:
+    git branch -D ${temp_compile_branch}
+fi
 
 # Send email(s)
 git send-email ${DRY_RUN} --annotate --thread --no-chain-reply-to \