]> Sergey Matveev's repositories - public-inbox.git/commitdiff
git: git_unquote handles double-quote and backslash
authorEric Wong <e@80x24.org>
Fri, 18 Jan 2019 12:50:59 +0000 (12:50 +0000)
committerEric Wong <e@80x24.org>
Fri, 18 Jan 2019 21:42:47 +0000 (21:42 +0000)
We need to work with 0x22 (double-quote) and 0x5c (backslash);
even if they're oddball characters in filenames which wouldn't
be used by projects I'd want to work on.

lib/PublicInbox/Git.pm
t/git.t

index 4601f2599ac674ae96d6bcb7ce2d7681f3b587f2..90b9214a422cec4f7e6ade5e591835c6bd5bb955 100644 (file)
@@ -23,13 +23,15 @@ my %GIT_ESC = (
        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 (file)
--- 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();