git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] git-format-patch-script and mailinfo updates.

From
Junio C Hamano <junkio@cox.net>
Date
Jul 22, 2005, 23:04 UTC
Message-ID
<7vackeigsd.fsf@assigned-by-dhcp.cox.net>
 - avoid duplicating [PATCH] in the commit message body if the
   original commit has it already (happens for commits done from
   mails via applymbox).
 - check if the commit author is different from the one who is
   running the script, and emit an appropriate "From:" and
   "Date: " lines to the output.
 - with '--date', emit "Date: " line to preserve the original
   author date even for the user's own commit.
 - teach mailinfo to grok not just "From: " but "Date: ".

The patch e-mail output by format-patch starts with the first line from the original commit message, prefixed with [PATCH], and optionally a From: line if you are reformatting a patch obtained from somebody else, a Date: line from the original commit if (1) --date is specified or (2) for somebody else's patch, and the rest of the commit message body.

Expected use of this is to move the title line from the commit to Subject: when sending it via an e-mail, and leave the From: and the Date: lines as the first lines of your message.

The mailinfo command has been changed to read Date: (in addition to From: it already understands) and do sensible things when running applymbox.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 git-format-patch-script |   38 +++++++++++++++++++++++++++++++-------
 tools/mailinfo.c        |   10 +++++++++-
 2 files changed, 40 insertions(+), 8 deletions(-)
70e9ebdaa9951183d2e4f9b569dafbc50012d8ec
diff --git a/git-format-patch-script b/git-format-patch-script
--- a/git-format-patch-script
+++ b/git-format-patch-script
@@ -30,6 +30,8 @@ outdir=./
 while case "$#" in 0) break;; esac
 do
     case "$1" in
+    -d|--d|--da|--dat|--date)
+    date=t ;;
     -n|--n|--nu|--num|--numb|--numbe|--number|--numbere|--numbered)
     numbered=t ;;
     -o=*|--o=*|--ou=*|--out=*|--outp=*|--outpu=*|--output=*|--output-=*|\
@@ -56,6 +58,8 @@ esac
 junio=`git-rev-parse --verify "$junio"`
 linus=`git-rev-parse --verify "$linus"`
 
+me=`git-var GIT_AUTHOR_IDENT | sed -e 's/>.*/>/'`
+
 case "$outdir" in
 */) ;;
 *) outdir="$outdir/" ;;
@@ -66,6 +70,7 @@ tmp=.tmp-series$$
 trap 'rm -f $tmp-*' 0 1 2 3 15
 
 series=$tmp-series
+commsg=$tmp-commsg
 
 titleScript='
 	/./d
@@ -82,6 +87,12 @@ titleScript='
 	q
 '
 
+whosepatchScript='
+/^author /{
+	s/author \(.*>\) \(.*\)$/au='\''\1'\'' ad='\''\2'\''/p
+	q
+}'
+
 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 stripCommitHead='/^'"$_x40"' (from '"$_x40"')$/d'
@@ -91,9 +102,8 @@ total=`wc -l <$series`
 i=$total
 while read commit
 do
-    title=`git-cat-file commit "$commit" |
-    git-stripspace |
-    sed -ne "$titleScript"`
+    git-cat-file commit "$commit" | git-stripspace >$commsg
+    title=`sed -ne "$titleScript" <$commsg`
     case "$numbered" in
     '') num= ;;
     *)
@@ -102,6 +112,7 @@ do
 	*) num=' '`printf "%d/%d" $i $total` ;;
 	esac
     esac
+
     file=`printf '%04d-%stxt' $i "$title"`
     i=`expr "$i" - 1`
     echo "$file"
@@ -109,15 +120,28 @@ do
 	mailScript='
 	/./d
 	/^$/n
-	s|^|[PATCH'"$num"'] |
+	s|^\[PATCH[^]]*\] *||
+	s|^|[PATCH'"$num"'] |'
+
+	eval "$(sed -ne "$whosepatchScript" $commsg)"
+	test "$au" = "$me" || {
+		mailScript="$mailScript"'
+	a\
+From: '"$au"
+	}
+	test "$date,$au" = ",$me" || {
+		mailScript="$mailScript"'
+	a\
+Date: '"$ad"
+	}
+
+	mailScript="$mailScript"'
 	: body
 	p
 	n
 	b body'
 
-	git-cat-file commit "$commit" |
-	git-stripspace |
-	sed -ne "$mailScript"
+	sed -ne "$mailScript" <$commsg
 	echo '---'
 	echo
 	git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary
diff --git a/tools/mailinfo.c b/tools/mailinfo.c
--- a/tools/mailinfo.c
+++ b/tools/mailinfo.c
@@ -220,8 +220,9 @@ static int eatspace(char *line)
 static void handle_body(void)
 {
 	int has_from = 0;
+	int has_date = 0;
 
-	/* First line of body can be a From: */
+	/* First lines of body can have From: and Date: */
 	while (fgets(line, sizeof(line), stdin) != NULL) {
 		int len = eatspace(line);
 		if (!len)
@@ -232,6 +233,13 @@ static void handle_body(void)
 				continue;
 			}
 		}
+		if (!memcmp("Date:", line, 5) && isspace(line[5])) {
+			if (!has_date) {
+				handle_date(line+6);
+				has_date = 1;
+				continue;
+			}
+		}
 		line[len] = '\n';
 		handle_rest();
 		break;
Message 1 of 1 in “git-format-patch-script and mailinfo updates.”
  1. git-format-patch-script and mailinfo updates.Junio C Hamano, Jul 22, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.