[PATCH 01/16] email-lda: use cover letter subject if available

Keller, Jacob E jacob.e.keller at intel.com
Thu Feb 6 13:17:22 PST 2014


On Thu, 2014-02-06 at 18:30 +0200, Artem Bityutskiy wrote:
> From: Jacob Keller <jacob.e.keller at intel.com>
> 
> Often, a patch series will be sent with a cover letter which describes the
> series and is given the '0/n' patch number. Rather than dropping these
> patches, keep track of them in series. We do this by checking whether the 1/n
> patch has an "In-Reply-To" header. This usually means that their will be an
> associated cover letter. Once this is found, rather than sending the patch
> directly on to the test program, we use the cover letter's subject by using
> formail to add a special "Series-Subject". This makes it so that the
> aiaiai-email will end up as a reply to the cover letter which is a bit more
> aesthetically pleasing to users.
> 
> To help this process, a new "series_is_complete" function is added in place of
> the original series complete check. This function reports whether the series
> is completely queued, for both cases of cover letter and no cover letter.
> 
> Artem:
> 
> I've modified this patch.
> 
> 1. Removed a couple of '[[' bash constructs
> 2. Also preserved the Message ID of the cover letter to make the reply not only
>    have the subject of the cover letter, but also refer the cover letter
>    properly.
> 3. Use common prefix for the special cover letter e-mail headers that we add:
>    X-Aiaiai-Cover-Letter-Subject
>    X-Aiaiai-Cover-Letter-Message-Id
> 4. Dropped sponge dependency. Generally, this is a nice tool, and I did not
>    hear about it before. I'll definitely start using it when constructing pipes
>    in the console. But this tool is not that well-known, so it is not typically
>    present in systems. E.g., mine do not have it. And I decided to avoid adding
>    another dependency, we already require a lot of tools. Instead, I used
>    another trick, which is actual just as elegant as using sponge. Well, needs
>    more lines of code, but it is really nice trick anyway, I like it.
> 
>    I just open the mbox file, then unlink it, which means it won't be visible
>    in the file-system, but won't be deleted since we have the file descriptor
>    opened. Then I pipe the data from the file descriptor to 'formail', and
>    redirect the results to the mbox file. So a new mbox file will be created
>    and all the new contents will be there. I think this is elegant, and does
>    not add a new dependency.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller at intel.com>
> Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
> ---
>  email/aiaiai-email-lda           | 60 ++++++++++++++++++++++++++++++++++++----
>  email/aiaiai-email-test-patchset | 11 ++++++--
>  2 files changed, 63 insertions(+), 8 deletions(-)
> 
> diff --git a/email/aiaiai-email-lda b/email/aiaiai-email-lda
> index 336bd09..3b102be 100755
> --- a/email/aiaiai-email-lda
> +++ b/email/aiaiai-email-lda
> @@ -153,6 +153,28 @@ find_relatives()
>  	fi
>  }
>  
> +series_is_complete()
> +{
> +	local dir="$1"; shift
> +	local n="$1" ; shift
> +
> +	# First check if we have all the non-cover patches yet
> +	if [ "$(ls -1 --ignore=0 -- "$dir" | wc -l)" -eq "$n" ]; then
> +		local first_parent="$(fetch_header "In-Reply-To" < "$dir/1")"
> +		if [ -n "$first_parent" ] && ! [ -f "$dir/0" ]; then
> +			# Series is not complete, we are missing the cover
> +			# letter
> +			return 1
> +		else
> +			# Series is complete, no cover letter was sent
> +			return 0
> +		fi
> +	else
> +		# Don't have all the patches yet
> +		return 1
> +	fi
> +}
> +
>  move_to_series()
>  {
>  	local file="$1"; shift
> @@ -188,9 +210,9 @@ process_series_mbox()
>  	local fname
>  	local dir
>  
> -	# Only patch 1/n is allowed to have no parent
> +	# Only patch 0/n or 1/n is allowed to have no parent
>  	local parent_id="$(fetch_header "In-Reply-To" < "$mbox")"
> -	if [ -z "$parent_id" ] && [ "$m" != 1 ]; then
> +	if [ -z "$parent_id" ] && [ "$m" != 1 ] && [ "$m" != 0 ]; then
>  		reject_and_reply "$mbox" <<EOF
>  You sent a patch that does not conform to the requirements for Aiaiai's Local
>  Delivery Agent. This patch is part of a series as indicated by its subject
> @@ -252,12 +274,40 @@ EOF
>  	done
>  
>  	# If the series is complete - queue it
> -	if [ "$(ls -1 -- "$dir" | wc -l)" -eq "$n" ]; then
> +	if series_is_complete "$dir" "$n"; then
>  		message "Patch-set at \"$dir\" is complete, queue it"
> -		for fname in $(ls -A -- "$dir" | sort -n); do
> +		# Don't add the 0th patch to the final mbox, as it is just the
> +		# cover letter and does not contain any patch
> +		for fname in $(ls --ignore=0 -A -- "$dir" | sort -n); do
>  			cat -- "$dir/$fname" >> "$mbox"
>  			echo >> "$mbox"
>  		done
> +
> +		if [ -f "$dir/0" ]; then
> +			# Save the subject and message ID of the cover letter
> +			# in the final mbox in order to be able to reply to the
> +			# cover letter later.
> +			local subj="$(fetch_header "Subject" < "$dir/0")"
> +			subj="X-Aiaiai-Cover-Letter-Subject: $subj"
> +
> +			local id="$(fetch_header "Message-Id" < "$dir/0")"
> +			id="X-Aiaiai-Cover-Letter-Message-Id: $id"
> +
> +			# The below trick allows us to avoid creating a
> +			# separate temporary file: open the "$mbox" file,
> +			# unlink, use the open file descriptor for reading and
> +			# redirect the output to the new version of the "$mbox"
> +			# file. We could instead use the "sponge" tool, though.
> +			exec 3<$mbox
> +			rm $verbose "$mbox" >&2
> +			message "Adding \"$subj\""
> +			formail -s formail -I "$subj" <&3 > "$mbox"
> +
> +			exec 3<$mbox
> +			rm $verbose "$mbox" >&2
> +			message "Adding \"$id\""
> +			formail -s formail -I "$id" <&3 > "$mbox"
> +		fi
>  		queue_mboxfile
>  		rm $verbose -rf -- "$dir" >&2
>  	fi
> @@ -308,8 +358,6 @@ process_mbox()
>  		[ "$n" -ne 0 ] || \
>  			{ reject "$mbox" "Prefix \"$prefix_format\" cannot have n = 0";
>  			  return; }
> -		[ "$m" -ne 0 ] || \
> -			{ message "Dropping patch \"0/$n\""; return; }
>  		process_series_mbox "$id" "$m" "$n"
>  	fi
>  }
> diff --git a/email/aiaiai-email-test-patchset b/email/aiaiai-email-test-patchset
> index d9e768e..af38bb5 100755
> --- a/email/aiaiai-email-test-patchset
> +++ b/email/aiaiai-email-test-patchset
> @@ -259,9 +259,16 @@ if [ -z "$mbox" ]; then
>  	cat > "$mbox"
>  fi
>  
> -fetch_header_or_die subj "Subject" < "$mbox"
> +cat "$mbox"
> +# Use the cover letter subject and message ID if possible. If the cover letter
> +# was present, 'aiaiai-email-lda' would save them in special privat headers.
> +subj="$(fetch_header "X-Aiaiai-Cover-Letter-Subject" < "$mbox")"
> +[ -n "$subj" ] || fetch_header_or_die subj "Subject" < "$mbox"
> +
> +id="$(fetch_header "X-Aiaiai-Cover-Letter-Message-Id" < "$mbox")"
> +[ -n "$id" ] || fetch_header_or_die id "Message-Id" < "$mbox"
> +
>  fetch_header_or_die from "From" < "$mbox"
> -fetch_header_or_die id "Message-Id" < "$mbox"
>  to="$(fetch_header "To" < "$mbox")"
>  cc="$(fetch_header "Cc" < "$mbox")"
>  

Excellent. I didn't know of that trick. I use sponge quite often, but
it's better to find a trick that does this without sponge!

This looks quite good.

Regards,
Jake


More information about the aiaiai mailing list