Skip to content

Commit 36383a3

Browse files
author
Junio C Hamano
committed
[PATCH] format-patch: always --mbox and show sane Date:
Make --mbox, --author, and --date options a no-op, and always use --mbox output, and rewrite the commit log formatting in Perl. This makes it easier to output Date: header in RFC 2822 format, so do that as well. Inspiration for this patch came from Andreas Ericsson's earlier patch. Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent 9e9b267 commit 36383a3

File tree

1 file changed

+74
-67
lines changed

1 file changed

+74
-67
lines changed

git-format-patch.sh

Lines changed: 74 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,12 @@ outdir=./
3434
while case "$#" in 0) break;; esac
3535
do
3636
case "$1" in
37-
-a|--a|--au|--aut|--auth|--autho|--author)
38-
author=t ;;
3937
-c|--c|--ch|--che|--chec|--check)
4038
check=t ;;
41-
-d|--d|--da|--dat|--date)
42-
date=t ;;
43-
-m|--m|--mb|--mbo|--mbox)
44-
date=t author=t mbox=t ;;
39+
-a|--a|--au|--aut|--auth|--autho|--author|\
40+
-d|--d|--da|--dat|--date|\
41+
-m|--m|--mb|--mbo|--mbox) # now noop
42+
;;
4543
-k|--k|--ke|--kee|--keep|--keep-|--keep-s|--keep-su|--keep-sub|\
4644
--keep-subj|--keep-subje|--keep-subjec|--keep-subject)
4745
keep_subject=t ;;
@@ -173,80 +171,89 @@ titleScript='
173171
q
174172
'
175173

176-
whosepatchScript='
177-
/^author /{
178-
s/'\''/'\''\\'\'\''/g
179-
s/author \(.*>\) \(.*\)$/au='\''\1'\'' ad='\''\2'\''/p
180-
q
181-
}'
182-
183174
process_one () {
184-
mailScript='
185-
/./d
186-
/^$/n'
187-
case "$keep_subject" in
188-
t) ;;
189-
*)
190-
mailScript="$mailScript"'
191-
s|^\[PATCH[^]]*\] *||
192-
s|^|[PATCH'"$num"'] |'
193-
;;
194-
esac
195-
mailScript="$mailScript"'
196-
s|^|Subject: |'
197-
case "$mbox" in
198-
t)
199-
echo 'From nobody Mon Sep 17 00:00:00 2001' ;# UNIX "From" line
200-
;;
201-
esac
175+
perl -w -e '
176+
my ($keep_subject, $num, $signoff, $commsg) = @ARGV;
177+
my ($signoff_pattern, $done_header, $done_subject, $signoff_seen,
178+
$last_was_signoff);
202179
203-
eval "$(sed -ne "$whosepatchScript" $commsg)"
204-
test "$author,$au" = ",$me" || {
205-
mailScript="$mailScript"'
206-
a\
207-
From: '"$au"
208-
}
209-
test "$date,$au" = ",$me" || {
210-
mailScript="$mailScript"'
211-
a\
212-
Date: '"$ad"
213-
}
180+
if ($signoff) {
181+
$signoff = `git-var GIT_COMMITTER_IDENT`;
182+
$signoff =~ s/>.*/>/;
183+
$signoff_pattern = quotemeta($signoff);
184+
}
214185
215-
mailScript="$mailScript"'
216-
a\
186+
my @weekday_names = qw(Sun Mon Tue Wed Thu Fri Sat);
187+
my @month_names = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
217188
218-
: body
219-
p
220-
n
221-
b body'
189+
sub show_date {
190+
my ($time, $tz) = @_;
191+
my $minutes = abs($tz);
192+
$minutes = ($minutes / 100) * 60 + ($minutes % 100);
193+
if ($tz < 0) {
194+
$minutes = -$minutes;
195+
}
196+
my $t = $time + $minutes * 60;
197+
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($t);
198+
return sprintf("%s %s %d %02d:%02d:%02d %d %+05d",
199+
$weekday_names[$wday],
200+
$month_names[$mon],
201+
$mday, $hour, $min, $sec,
202+
$year+1900, $tz);
203+
}
222204
223-
(cat $commsg ; echo; echo) |
224-
sed -ne "$mailScript" |
225-
git-stripspace
205+
print "From nobody Mon Sep 17 00:00:00 2001\n";
206+
open FH, "git stripspace <$commsg |" or die "open $commsg pipe";
207+
while (<FH>) {
208+
unless ($done_header) {
209+
if (/^$/) {
210+
$done_header = 1;
211+
}
212+
elsif (/^author (.*>) (.*)$/) {
213+
my ($author_ident, $author_date) = ($1, $2);
214+
my ($utc, $off) = ($author_date =~ /^(\d+) ([-+]?\d+)$/);
215+
$author_date = show_date($utc, $off);
226216
227-
test "$signoff" = "t" && {
228-
offsigner=`git-var GIT_COMMITTER_IDENT | sed -e 's/>.*/>/'`
229-
line="Signed-off-by: $offsigner"
230-
grep -q "^$line\$" $commsg || {
231-
echo
232-
echo "$line"
233-
echo
234-
}
217+
print "From: $author_ident\n";
218+
print "Date: $author_date\n";
235219
}
236-
echo
237-
echo '---'
238-
echo
220+
next;
221+
}
222+
unless ($done_subject) {
223+
unless ($keep_subject) {
224+
s/^\[PATCH[^]]*\]\s*//;
225+
s/^/[PATCH$num] /;
226+
}
227+
print "Subject: $_";
228+
$done_subject = 1;
229+
next;
230+
}
231+
232+
$last_was_signoff = 0;
233+
if (/Signed-off-by:/i) {
234+
if ($signoff ne "" && /Signed-off-by:\s*$signoff_pattern$/i) {
235+
$signoff_seen = 1;
236+
}
237+
}
238+
print $_;
239+
}
240+
if (!$signoff_seen && $signoff ne "") {
241+
if (!$last_was_signoff) {
242+
print "\n";
243+
}
244+
print "$signoff\n";
245+
}
246+
print "\n---\n\n";
247+
close FH or die "close $commsg pipe";
248+
' "$keep_subject" "$num" "$signoff" $commsg
249+
239250
git-diff-tree -p $diff_opts "$commit" | git-apply --stat --summary
240251
echo
241252
git-diff-tree -p $diff_opts "$commit"
242253
echo "-- "
243254
echo "@@GIT_VERSION@@"
244255

245-
case "$mbox" in
246-
t)
247-
echo
248-
;;
249-
esac
256+
echo
250257
}
251258

252259
total=`wc -l <$series | tr -dc "[0-9]"`

0 commit comments

Comments
 (0)