-$out->close();
-if (defined $mail_to) {
- close STDIN;
- open STDIN, '<', $outname;
- system 'mutt',
- '-F/dev/null',
- '-x',
- '-e', 'set charset="utf-8"',
- '-e', 'set send_charset="us-ascii:iso-8859-2:utf-8"',
- '-e', "my_hdr X-Git-Repo: $repo",
- '-e', "my_hdr X-Git-Branch: $ref",
- '-e', "my_hdr X-Git-Old-SHA: $old",
- '-e', "my_hdr X-Git-New-SHA: $new",
- '-s', $subj,
- $mail_to;
-} else {
- open STDOUT, '>&', \*ORIG_STDOUT;
- print "Subject: $subj\n\n";
- system 'cat', $outname;
+sub update_ref($$$)
+{
+ my ($ref, $old, $new) = @_;
+ $old ne $new or return;
+ my ($type, $name) = ($ref =~ m{^refs/([^/]*)/(.*)}) or return;
+
+ my $out = File::Temp->new() or die;
+ my $outname = $out->filename;
+ $out->autoflush(1);
+ close STDOUT;
+ open STDOUT, '>&', $out or die;
+
+ my $headers = {
+ 'X-Git-Repo' => $repo,
+ 'X-Git-Old-SHA' => $old,
+ 'X-Git-New-SHA' => $new,
+ };
+
+ my $send;
+ if ($type eq 'heads') { $send = update_branch($name, $old, $new, $out, $headers); }
+ elsif ($type eq 'tags') { $send = update_tag($name, $old, $new, $out, $headers); }
+ $out->close();
+ $send or return;
+
+ if (defined $mail_to) {
+ close STDIN;
+ open STDIN, '<', $outname;
+ my @mutt = (
+ 'mutt',
+ '-F/dev/null',
+ '-x',
+ '-e', 'set charset="utf-8"',
+ '-e', 'set send_charset="us-ascii:iso-8859-2:utf-8"',
+ '-e', 'set record=',
+ '-s', $headers->{'Subject'},
+ );
+ delete $headers->{'Subject'};
+ push @mutt, map { ('-e', "my_hdr $_: " . $headers->{$_}) } keys %$headers;
+ system @mutt, $mail_to;
+ } else {
+ open STDOUT, '>&', \*ORIG_STDOUT;
+ print map { "$_: " . $headers->{$_} . "\n" } sort keys %$headers;
+ print "\n";
+ system 'cat', $outname;
+ print "\n";
+ }