Patchwork [09/15] send-pull-request: don't send all patches to everyone even with -a

login
register
mail settings
Submitter Darren Hart
Date May 18, 2011, 5:18 p.m.
Message ID <15e64ac760b5d68d64e266f00b7481a0ea191e26.1305738598.git.dvhart@linux.intel.com>
Download mbox | patch
Permalink /patch/4383/
State New, archived
Headers show

Comments

Darren Hart - May 18, 2011, 5:18 p.m.
Rather than sending every patch to every recipient of the entire series when
-a is used, only send the cover letter to everyone and use git's
--signed-off-by-cc feature to generate an auto cc list for the individual
patches.

Add a -c option to use --signed-off-by-cc to auto cc recipeients at the
individual patch level. This is implied by -a.

Using git to harvest the Cc list means only collecting Signed-off-by and Cc
lines, rather than the more generic *-by lines previously. This is a fair
trade-off for significantly reduced complexity. If users want to add Acked-by
and Tested-by lines and want to use the -a feature, they should include those
recipients as Cc lines as well.

Now that we rely on git for auto-cc for the individual patches,
make sure the user is prompted before sending each patch by forcing
--confirm=always.

Signed-off-by: Darren Hart <dvhart@linux.intel.com>
Acked-by: Otavio Salvador <otavio@ossystems.com.br>
Cc: Khem Raj <raj.khem@gmail.com>
Cc: Koen Kooi <koen@dominion.thruhere.net>
Cc: Otavio Salvador <otavio@ossystems.com.br>
---
 scripts/send-pull-request |   75 ++++++++++++++++++++++++++++-----------------
 1 files changed, 47 insertions(+), 28 deletions(-)
Khem Raj - May 18, 2011, 5:54 p.m.
On Wed, May 18, 2011 at 10:18 AM, Darren Hart <dvhart@linux.intel.com> wrote:
> Rather than sending every patch to every recipient of the entire series when
> -a is used, only send the cover letter to everyone and use git's
> --signed-off-by-cc feature to generate an auto cc list for the individual
> patches.
>
> Add a -c option to use --signed-off-by-cc to auto cc recipeients at the
> individual patch level. This is implied by -a.
>
> Using git to harvest the Cc list means only collecting Signed-off-by and Cc
> lines, rather than the more generic *-by lines previously. This is a fair
> trade-off for significantly reduced complexity. If users want to add Acked-by
> and Tested-by lines and want to use the -a feature, they should include those
> recipients as Cc lines as well.
>
> Now that we rely on git for auto-cc for the individual patches,
> make sure the user is prompted before sending each patch by forcing
> --confirm=always.
>
> Signed-off-by: Darren Hart <dvhart@linux.intel.com>
> Acked-by: Otavio Salvador <otavio@ossystems.com.br>
> Cc: Khem Raj <raj.khem@gmail.com>
> Cc: Koen Kooi <koen@dominion.thruhere.net>
> Cc: Otavio Salvador <otavio@ossystems.com.br>

looks good

Acked-by: Khem Raj <raj.khem@gmail.com>

> ---
>  scripts/send-pull-request |   75 ++++++++++++++++++++++++++++-----------------
>  1 files changed, 47 insertions(+), 28 deletions(-)
>
> diff --git a/scripts/send-pull-request b/scripts/send-pull-request
> index b294d35..5a11d1f 100755
> --- a/scripts/send-pull-request
> +++ b/scripts/send-pull-request
> @@ -1,36 +1,40 @@
>  #!/bin/bash
>  AUTO=0
> +AUTO_CL=0
>
>  # Prevent environment leakage to these vars.
>  unset TO
>  unset CC
> +unset AUTO_CC
>
>  usage()
>  {
>  cat <<EOM
> -Usage: $(basename $0) [-h] [-a] [[-t email]...] -p pull-dir
> -  -t email     Explicitly add email to the recipients
> -  -a           Automatically harvest recipients from "*-by: email" lines
> -               in the patches in the pull-dir
> +Usage: $(basename $0) [-h] [-a] [-c] [[-t email]...] -p pull-dir
> +  -a           Send the cover letter to every recipient listed in Cc and
> +               Signed-off-by lines found in the cover letter and the patches.
> +              This option implies -c.
> +  -c           Expand the Cc list for the individual patches using the Cc and
> +               Signed-off-by lines from the same patch.
>   -p pull-dir  Directory containing summary and patch files
> +  -t email     Explicitly add email to the recipients
>  EOM
>  }
>
> -# Collect To and CC addresses from the patch files if they exist
> -# $1: Which header to add the recipients to, "TO" or "CC"
> -# $2: The regex to match and strip from the line with email addresses
> +# Collect addresses from a patch into AUTO_CC
> +# $1: a patch file
>  harvest_recipients()
>  {
> -       TO_CC=$1
> -       REGX=$2
> +       PATCH=$1
>        export IFS=$',\n'
> -       for PATCH in $PDIR/*.patch; do
> -               # Grab To addresses
> +       for REGX in "^[Cc][Cc]: *" "^[Ss]igned-[Oo]ff-[Bb]y: *"; do
>                for EMAIL in $(sed '/^---$/q' $PATCH | grep -e "$REGX" | sed "s/$REGX//"); do
> -                       if [ "$TO_CC" == "TO" ] && [ "${TO/$EMAIL/}" == "$TO" ] && [ -n "$EMAIL" ]; then
> -                               if [ -z "$TO" ]; then TO=$EMAIL; else TO="$TO,$EMAIL"; fi
> -                       elif [ "$TO_CC" == "CC" ] && [ "${CC/$EMAIL/}" == "$CC" ] && [ -n "$EMAIL" ]; then
> -                               if [ -z "$CC" ]; then CC=$EMAIL; else CC="$CC,$EMAIL"; fi
> +                       if [ "${AUTO_CC/$EMAIL/}" == "$AUTO_CC" ] && [ -n "$EMAIL" ]; then
> +                               if [ -z "$AUTO_CC" ]; then
> +                                       AUTO_CC=$EMAIL;
> +                               else
> +                                       AUTO_CC="$AUTO_CC,$EMAIL";
> +                               fi
>                        fi
>                done
>        done
> @@ -39,9 +43,13 @@ harvest_recipients()
>
>
>  # Parse and verify arguments
> -while getopts "ahp:t:" OPT; do
> +while getopts "achp:t:" OPT; do
>        case $OPT in
>        a)
> +               AUTO_CL=1
> +               AUTO=1
> +               ;;
> +       c)
>                AUTO=1
>                ;;
>        h)
> @@ -84,13 +92,11 @@ for TOKEN in SUBJECT BLURB; do
>  done
>
>
> -# Harvest emails from the generated patches and populate the TO and CC variables
> -# In addition to To and CC headers/lines, the common Signed-off-by, Tested-by,
> -# etc. (*-by) will be added to CC.
> -if [ $AUTO -eq 1 ]; then
> -       harvest_recipients TO "^[Tt][Oo]: *"
> -       harvest_recipients CC "^[Cc][Cc]: *"
> -       harvest_recipients CC "^[A-Z][A-Za-z-]*-[Bb][Yy]: *"
> +# Harvest emails from the generated patches and populate AUTO_CC.
> +if [ $AUTO_CL -eq 1 ]; then
> +       for PATCH in $PDIR/*.patch; do
> +               harvest_recipients $PATCH
> +       done
>  fi
>
>  AUTO_TO="$(git config sendemail.to)"
> @@ -102,7 +108,7 @@ if [ -n "$AUTO_TO" ]; then
>        fi
>  fi
>
> -if [ -z "$TO" ] && [ -z "$CC" ]; then
> +if [ -z "$TO" ] && [ -z "$AUTO_CC" ]; then
>        echo "ERROR: you have not specified any recipients."
>        usage
>        exit 1
> @@ -114,7 +120,8 @@ cat <<EOM
>  The following patches:
>  $(for PATCH in $PDIR/*.patch; do echo "    $PATCH"; done)
>
> -will now be sent via the git send-email command.
> +will now be sent via the git send-email command. Git will prompt you before
> +sending any email.
>
>  EOM
>  echo "Continue? [y/N] "
> @@ -124,11 +131,23 @@ if [ "$cont" == "y" ] || [ "$cont" == "Y" ]; then
>        ERROR=0
>        export IFS=$','
>        GIT_TO=$(for R in $TO; do echo -n "--to='$R' "; done)
> -       GIT_CC=$(for R in $CC; do echo -n "--cc='$R' "; done)
> +       GIT_CC=$(for R in $AUTO_CC; do echo -n "--cc='$R' "; done)
>        unset IFS
>        for PATCH in $PDIR/*patch; do
> -               # We harvest the emails manually, so force git not to.
> -               eval "git send-email $GIT_TO $GIT_CC --no-chain-reply-to --suppress-cc=all $PATCH"
> +               if [ $AUTO -eq 1 ]; then
> +                       if [ $PATCH == "$CL" ] && [ $AUTO_CL -eq 1 ]; then
> +                               # Send the cover letter to every recipient, both
> +                               # specified as well as harvested.
> +                               eval "git send-email $GIT_TO $GIT_CC --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
> +                       else
> +                               # Send the patch to the specified recipients and
> +                               # those git finds in this specific patch.
> +                               eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --signed-off-by-cc $PATCH"
> +                       fi
> +               else
> +                       # Only send to the explicitly specified recipients
> +                       eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
> +               fi
>                if [ $? -eq 1 ]; then
>                        ERROR=1
>                fi
> --
> 1.7.1
>
>

Patch

diff --git a/scripts/send-pull-request b/scripts/send-pull-request
index b294d35..5a11d1f 100755
--- a/scripts/send-pull-request
+++ b/scripts/send-pull-request
@@ -1,36 +1,40 @@ 
 #!/bin/bash
 AUTO=0
+AUTO_CL=0
 
 # Prevent environment leakage to these vars.
 unset TO
 unset CC
+unset AUTO_CC
 
 usage()
 {
 cat <<EOM
-Usage: $(basename $0) [-h] [-a] [[-t email]...] -p pull-dir 
-  -t email     Explicitly add email to the recipients
-  -a           Automatically harvest recipients from "*-by: email" lines
-               in the patches in the pull-dir
+Usage: $(basename $0) [-h] [-a] [-c] [[-t email]...] -p pull-dir 
+  -a           Send the cover letter to every recipient listed in Cc and
+               Signed-off-by lines found in the cover letter and the patches.
+	       This option implies -c.
+  -c           Expand the Cc list for the individual patches using the Cc and
+               Signed-off-by lines from the same patch.
   -p pull-dir  Directory containing summary and patch files
+  -t email     Explicitly add email to the recipients
 EOM
 }
 
-# Collect To and CC addresses from the patch files if they exist
-# $1: Which header to add the recipients to, "TO" or "CC"
-# $2: The regex to match and strip from the line with email addresses
+# Collect addresses from a patch into AUTO_CC
+# $1: a patch file
 harvest_recipients()
 {
-	TO_CC=$1
-	REGX=$2
+	PATCH=$1
 	export IFS=$',\n'
-	for PATCH in $PDIR/*.patch; do
-		# Grab To addresses
+	for REGX in "^[Cc][Cc]: *" "^[Ss]igned-[Oo]ff-[Bb]y: *"; do
 		for EMAIL in $(sed '/^---$/q' $PATCH | grep -e "$REGX" | sed "s/$REGX//"); do
-			if [ "$TO_CC" == "TO" ] && [ "${TO/$EMAIL/}" == "$TO" ] && [ -n "$EMAIL" ]; then
-				if [ -z "$TO" ]; then TO=$EMAIL; else TO="$TO,$EMAIL"; fi
-			elif [ "$TO_CC" == "CC" ] && [ "${CC/$EMAIL/}" == "$CC" ] && [ -n "$EMAIL" ]; then
-				if [ -z "$CC" ]; then CC=$EMAIL; else CC="$CC,$EMAIL"; fi
+			if [ "${AUTO_CC/$EMAIL/}" == "$AUTO_CC" ] && [ -n "$EMAIL" ]; then
+				if [ -z "$AUTO_CC" ]; then
+					AUTO_CC=$EMAIL;
+				else
+					AUTO_CC="$AUTO_CC,$EMAIL";
+				fi
 			fi
 		done
 	done
@@ -39,9 +43,13 @@  harvest_recipients()
 
 
 # Parse and verify arguments
-while getopts "ahp:t:" OPT; do
+while getopts "achp:t:" OPT; do
 	case $OPT in
 	a)
+		AUTO_CL=1
+		AUTO=1
+		;;
+	c)
 		AUTO=1
 		;;
 	h)
@@ -84,13 +92,11 @@  for TOKEN in SUBJECT BLURB; do
 done
 
 
-# Harvest emails from the generated patches and populate the TO and CC variables
-# In addition to To and CC headers/lines, the common Signed-off-by, Tested-by,
-# etc. (*-by) will be added to CC.
-if [ $AUTO -eq 1 ]; then
-	harvest_recipients TO "^[Tt][Oo]: *"
-	harvest_recipients CC "^[Cc][Cc]: *"
-	harvest_recipients CC "^[A-Z][A-Za-z-]*-[Bb][Yy]: *"
+# Harvest emails from the generated patches and populate AUTO_CC.
+if [ $AUTO_CL -eq 1 ]; then
+	for PATCH in $PDIR/*.patch; do
+		harvest_recipients $PATCH
+	done
 fi
 
 AUTO_TO="$(git config sendemail.to)"
@@ -102,7 +108,7 @@  if [ -n "$AUTO_TO" ]; then
 	fi
 fi
 
-if [ -z "$TO" ] && [ -z "$CC" ]; then
+if [ -z "$TO" ] && [ -z "$AUTO_CC" ]; then
 	echo "ERROR: you have not specified any recipients."
 	usage
 	exit 1
@@ -114,7 +120,8 @@  cat <<EOM
 The following patches:
 $(for PATCH in $PDIR/*.patch; do echo "    $PATCH"; done)
 
-will now be sent via the git send-email command.
+will now be sent via the git send-email command. Git will prompt you before
+sending any email.
 
 EOM
 echo "Continue? [y/N] "
@@ -124,11 +131,23 @@  if [ "$cont" == "y" ] || [ "$cont" == "Y" ]; then
 	ERROR=0
 	export IFS=$','
 	GIT_TO=$(for R in $TO; do echo -n "--to='$R' "; done)
-	GIT_CC=$(for R in $CC; do echo -n "--cc='$R' "; done)
+	GIT_CC=$(for R in $AUTO_CC; do echo -n "--cc='$R' "; done)
 	unset IFS
 	for PATCH in $PDIR/*patch; do
-		# We harvest the emails manually, so force git not to.
-		eval "git send-email $GIT_TO $GIT_CC --no-chain-reply-to --suppress-cc=all $PATCH"
+		if [ $AUTO -eq 1 ]; then
+			if [ $PATCH == "$CL" ] && [ $AUTO_CL -eq 1 ]; then
+				# Send the cover letter to every recipient, both
+				# specified as well as harvested.
+				eval "git send-email $GIT_TO $GIT_CC --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
+			else
+				# Send the patch to the specified recipients and
+				# those git finds in this specific patch.
+				eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --signed-off-by-cc $PATCH"
+			fi
+		else
+			# Only send to the explicitly specified recipients
+			eval "git send-email $GIT_TO --confirm=always --no-chain-reply-to --suppress-cc=all $PATCH"
+		fi
 		if [ $? -eq 1 ]; then
 			ERROR=1
 		fi