From: Holger Weiss Date: Sat, 24 Oct 2009 20:55:44 +0000 (+0200) Subject: git-notify: Handle non-UTF-8 commits X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=85512d7f111e9b05446a012567f76472f5d5410c;p=nagiosplug.git git-notify: Handle non-UTF-8 commits Make sure that commit messages which use an encoding other than US-ASCII or UTF-8 are handled correctly. Also, assume that the diff contents use the same encoding as the commit message. This assumption may well be wrong, but that's the best we can do. --- diff --git a/tools/git-notify b/tools/git-notify index a89104a..b10b1bc 100755 --- a/tools/git-notify +++ b/tools/git-notify @@ -28,14 +28,10 @@ # use strict; -use open ':utf8'; use Fcntl ':flock'; -use Encode 'encode'; +use Encode qw(encode decode); use Cwd 'realpath'; -binmode STDIN, ':utf8'; -binmode STDOUT, ':utf8'; - sub git_config($); sub get_repos_name(); @@ -296,6 +292,7 @@ sub mail_notification($$$@) $subject = encode("MIME-Q",$subject); if ($debug) { + binmode STDOUT, ":utf8"; print "---------------------\n"; print "To: $name\n"; print "Subject: $subject\n"; @@ -310,6 +307,7 @@ sub mail_notification($$$@) { exec $mailer, "-s", $subject, "-a", "Content-Type: $content_type", $name or die "Cannot exec $mailer"; } + binmode MAIL, ":utf8"; print MAIL join("\n", @text), "\n"; close MAIL; } @@ -334,12 +332,15 @@ sub get_object_info($) my @log = (); my $do_log = 0; + $info{"encoding"} = "utf-8"; + open OBJ, "-|" or exec "git", "cat-file", "commit", $obj or die "cannot run git-cat-file"; while () { chomp; if ($do_log) { push @log, $_; } elsif (/^$/) { $do_log = 1; } + elsif (/^encoding (.+)/) { $info{"encoding"} = $1; } elsif (/^(author|committer) ((.*) (<.*>)) (\d+) ([+-]\d+)$/) { $info{$1} = $2; @@ -429,6 +430,8 @@ sub send_commit_notice($$) push @notice, "Diff: $gitweb_url/?a=commitdiff;h=$obj" if $gitweb_url; } + $_ = decode($info{"encoding"}, $_) for @notice; + mail_notification($commitlist_address, $info{"author_name"} . ": " . truncate_str(${$info{"log"}}[0], 50), "text/plain; charset=UTF-8", @notice);