about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-01-18 12:50:59 +0000
committerEric Wong <e@80x24.org>2019-01-18 21:42:47 +0000
commitc22651c2da862ba829dc037e18d726193e4bcbcd (patch)
treeb882915fbe3122da723afa5dadcff1619833d827
parent743ac758eb34f18c7e2544cbc48299662074b1ef (diff)
downloadpublic-inbox-c22651c2da862ba829dc037e18d726193e4bcbcd.tar.gz
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.
-rw-r--r--lib/PublicInbox/Git.pm4
-rw-r--r--t/git.t2
2 files changed, 5 insertions, 1 deletions
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 4601f259..90b9214a 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -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 052e1cec..c642b8fe 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();