Browse Source

Avoid double quotes in Git Config

Currently, if a branch is created that has special chars ('#' in the bug),
Config will surround the subsection name with double quotes during
it's toText method which will result in an invalid file after saving the
Config.

Bug: 318249
Change-Id: I0a642f52def42d936869e4aaaeb6999567901001
Signed-off-by: Mathias Kinzler <mathias.kinzler@sap.com>
stable-0.9
Mathias Kinzler 14 years ago
parent
commit
2941d23e7e
  1. 26
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java
  2. 8
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java

26
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/RepositoryConfigTest.java → org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java

@ -4,6 +4,7 @@
* Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com> * Copyright (C) 2008, Marek Zawirski <marek.zawirski@gmail.com>
* Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
* and other copyright owners as documented in the project's IP log. * and other copyright owners as documented in the project's IP log.
* *
* This program and the accompanying materials are made available * This program and the accompanying materials are made available
@ -47,6 +48,7 @@
package org.eclipse.jgit.lib; package org.eclipse.jgit.lib;
import java.text.MessageFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Set; import java.util.Set;
@ -61,7 +63,7 @@ import org.eclipse.jgit.util.SystemReader;
/** /**
* Test reading of git config * Test reading of git config
*/ */
public class RepositoryConfigTest extends TestCase { public class ConfigTest extends TestCase {
public void test001_ReadBareKey() throws ConfigInvalidException { public void test001_ReadBareKey() throws ConfigInvalidException {
final Config c = parse("[foo]\nbar\n"); final Config c = parse("[foo]\nbar\n");
assertEquals(true, c.getBoolean("foo", null, "bar", false)); assertEquals(true, c.getBoolean("foo", null, "bar", false));
@ -351,6 +353,28 @@ public class RepositoryConfigTest extends TestCase {
assertTrue("Subsection should contain \"b\"", names.contains("b")); assertTrue("Subsection should contain \"b\"", names.contains("b"));
} }
public void testQuotingForSubSectionNames() {
String resultPattern = "[testsection \"{0}\"]\n\ttestname = testvalue\n";
String result;
Config config = new Config();
config.setString("testsection", "testsubsection", "testname",
"testvalue");
result = MessageFormat.format(resultPattern, "testsubsection");
assertEquals(result, config.toText());
config.clear();
config.setString("testsection", "#quotable", "testname", "testvalue");
result = MessageFormat.format(resultPattern, "#quotable");
assertEquals(result, config.toText());
config.clear();
config.setString("testsection", "with\"quote", "testname", "testvalue");
result = MessageFormat.format(resultPattern, "with\\\"quote");
assertEquals(result, config.toText());
}
private void assertReadLong(long exp) throws ConfigInvalidException { private void assertReadLong(long exp) throws ConfigInvalidException {
assertReadLong(exp, String.valueOf(exp)); assertReadLong(exp, String.valueOf(exp));
} }

8
org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java

@ -834,8 +834,14 @@ public class Config {
out.append(e.section); out.append(e.section);
if (e.subsection != null) { if (e.subsection != null) {
out.append(' '); out.append(' ');
String escaped = escapeValue(e.subsection);
// make sure to avoid double quotes here
boolean quoted = escaped.startsWith("\"")
&& escaped.endsWith("\"");
if (!quoted)
out.append('"'); out.append('"');
out.append(escapeValue(e.subsection)); out.append(escaped);
if (!quoted)
out.append('"'); out.append('"');
} }
out.append(']'); out.append(']');

Loading…
Cancel
Save