From 2b7975cab03ea76db412b9f8d35ef82286f25777 Mon Sep 17 00:00:00 2001 From: Julien Kauffmann Date: Wed, 8 Feb 2012 09:57:24 +0100 Subject: Fixed quotes and backslashes handling in GitConfigParser --- git/config.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'git/config.py') diff --git a/git/config.py b/git/config.py index c71bb8ca..64031fdb 100644 --- a/git/config.py +++ b/git/config.py @@ -245,8 +245,23 @@ class GitConfigParser(cp.RawConfigParser, object): if pos != -1 and optval[pos-1].isspace(): optval = optval[:pos] optval = optval.strip() - if optval == '""': - optval = '' + + # Remove paired unescaped-quotes + unquoted_optval = '' + escaped = False + in_quote = False + for c in optval: + if not escaped and c == '"': + in_quote = not in_quote + else: + escaped = (c == '\\') + unquoted_optval += c + + optval = unquoted_optval + + optval = optval.replace('\\\\', '\\') # Unescape backslashes + optval = optval.replace(r'\"', '"') # Unescape quotes + optname = self.optionxform(optname.rstrip()) cursect[optname] = optval else: @@ -303,7 +318,11 @@ class GitConfigParser(cp.RawConfigParser, object): fp.write("[%s]\n" % name) for (key, value) in section_dict.items(): if key != "__name__": - fp.write("\t%s = %s\n" % (key, str(value).replace('\n', '\n\t'))) + value = str(value) + value = value.replace('\\', '\\\\') # Escape backslashes + value = value.replace('"', r'\"') # Escape quotes + value = value.replace('\n', '\n\t') + fp.write("\t%s = %s\n" % (key, value)) # END if key is not __name__ # END section writing -- cgit v1.2.3 From 3cadd6f793f6c59fa3ad0d6e1a209d6b6b06b6da Mon Sep 17 00:00:00 2001 From: Julien Kauffmann Date: Wed, 8 Feb 2012 10:11:00 +0100 Subject: Fixed a case were values containing \\" were not properly escaped --- git/config.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'git/config.py') diff --git a/git/config.py b/git/config.py index 64031fdb..620f7b10 100644 --- a/git/config.py +++ b/git/config.py @@ -254,9 +254,14 @@ class GitConfigParser(cp.RawConfigParser, object): if not escaped and c == '"': in_quote = not in_quote else: - escaped = (c == '\\') + escaped = (c == '\\') and not escaped unquoted_optval += c + if in_quote: + if not e: + e = cp.ParsingError(fpname) + e.append(lineno, repr(line)) + optval = unquoted_optval optval = optval.replace('\\\\', '\\') # Unescape backslashes -- cgit v1.2.3