@@ -34,14 +34,12 @@ outdir=./
3434while case " $# " in 0) break ;; esac
3535do
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-
183174process_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
252259total=` wc -l < $series | tr -dc " [0-9]" `
0 commit comments