lib/PublicInbox/Git.pm | 4 +++- t/git.t | 2 ++ diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index 4601f2599ac674ae96d6bcb7ce2d7681f3b587f2..90b9214a422cec4f7e6ade5e591835c6bd5bb955 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -23,13 +23,15 @@ n => "\n", r => "\r", t => "\t", v => "\013", + '"' => '"', + '\\' => '\\', ); # unquote pathnames used by git, see quote.c::unquote_c_style.c in git.git sub git_unquote ($) { return $_[0] unless ($_[0] =~ /\A"(.*)"\z/); $_[0] = $1; - $_[0] =~ s/\\([abfnrtv])/$GIT_ESC{$1}/g; + $_[0] =~ s/\\([\\"abfnrtv])/$GIT_ESC{$1}/g; $_[0] =~ s/\\([0-7]{1,3})/chr(oct($1))/ge; $_[0]; } diff --git a/t/git.t b/t/git.t index 052e1cece4b63c32b960c5c334876dd39ab0e399..c642b8fe8bffc464da3a75b39b5a0b6111ccca5d 100644 --- a/t/git.t +++ b/t/git.t @@ -148,5 +148,7 @@ use_ok 'PublicInbox::Git', qw(git_unquote); my $s; is("foo\nbar", git_unquote($s = '"foo\\nbar"'), 'unquoted newline'); is("Eléanor", git_unquote($s = '"El\\303\\251anor"'), 'unquoted octal'); +is(git_unquote($s = '"I\"m"'), 'I"m', 'unquoted dq'); +is(git_unquote($s = '"I\\m"'), 'I\\m', 'unquoted backslash'); done_testing();