lib/PublicInbox/ViewVCS.pm | 8 +++++--- t/solver_git.t | 7 ++++++- diff --git a/lib/PublicInbox/ViewVCS.pm b/lib/PublicInbox/ViewVCS.pm index 96883f6ccbda5fe15c25b9e0463ae8bae7f3573d..19d34092a28fd3ecec3f66510069f7b92b4b88a9 100644 --- a/lib/PublicInbox/ViewVCS.pm +++ b/lib/PublicInbox/ViewVCS.pm @@ -144,7 +144,7 @@ $s\n EOM $ctx->zmore($bdy); - open $fh, '<', "$tmp/p" or die "open $tmp/p: $!"; + open $fh, '<:utf8', "$tmp/p" or die "open $tmp/p: $!"; if (-s $fh > $MAX_SIZE) { $ctx->zmore("---\n patch is too large to show\n"); } else { # prepare flush_diff: @@ -171,8 +171,10 @@ # patch-id needs two passes, and we use the initial show to ensure # a patch embedded inside the commit message body doesn't get fed # to patch-id: my $cmd = [ '/bin/sh', '-c', - "git show '$SHOW_FMT' -z --no-notes --no-patch $oid >h && ". - "git show --pretty=format:%n -M --stat -p $oid >p && ". + "git show --encoding=UTF-8 '$SHOW_FMT'". + " -z --no-notes --no-patch $oid >h && ". + 'git show --encoding=UTF-8 --pretty=format:%n -M'. + " --stat -p $oid >p && ". "git patch-id --stable $git->{git_dir} }; my $tmp = File::Temp->newdir("show-$oid-XXXX", TMPDIR => 1); diff --git a/t/solver_git.t b/t/solver_git.t index 1baa012b1abeb56a77c98519e8a27b08697aafe9..5c7bfa286c872dd7408c4cddfff780128fa1f500 100644 --- a/t/solver_git.t +++ b/t/solver_git.t @@ -1,5 +1,5 @@ #!perl -w -# Copyright (C) 2019-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ use strict; use v5.10.1; @@ -294,6 +294,11 @@ is($res->code, 200, "$label raw binary download"); is($res->content, "\0" x $size, "$label content matches"); } + my $utf8 = 'e022d3377fd2c50fd9931bf96394728958a90bf3'; + $res = $cb->(GET("/$name/$utf8/s/")); + is($res->code, 200, 'shows commit w/ utf8.eml'); + like($res->content, qr/Eléanor/, + 'UTF-8 commit shown properly'); }; test_psgi(sub { $www->call(@_) }, $client); SKIP: {