[JGIT PATCH 1/2] Fix RepositoryConfig.setStringList to not corrupt internal state
From: Shawn O. Pearce <hidden>
Date: 2016-06-15 22:45:03
Calling setStringList was incorrectly storing the String objects directly in byName. The byName table should have either an Entry or a List<Entry> stored within its value position. Storing the String (or List<String>) directly confused our get code as it did not find the object type it expected. This caused the get code to fallback to the base configuration (e.g. ~/.gitconfig) or just return null (claiming the value was never set). A test case for this appears in the next commit. Noticed-by: Marek Zawirski [off-list ref] Signed-off-by: Shawn O. Pearce <redacted> --- .../src/org/spearce/jgit/lib/RepositoryConfig.java | 23 ++++++++++++++++--- 1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
index 1431f1f..d1cd5fc 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RepositoryConfig.java@@ -381,10 +381,25 @@ public class RepositoryConfig { key += "." + name.toLowerCase(); if (values.size() == 0) byName.remove(key); - else if (values.size() == 1) - byName.put(key, values.get(0)); - else - byName.put(key, new ArrayList<String>(values)); + else if (values.size() == 1) { + final Entry e = new Entry(); + e.base = section; + e.extendedBase = subsection; + e.name = name; + e.value = values.get(0); + byName.put(key, e); + } else { + final ArrayList<Entry> eList = new ArrayList<Entry>(values.size()); + for (final String v : values) { + final Entry e = new Entry(); + e.base = section; + e.extendedBase = subsection; + e.name = name; + e.value = v; + eList.add(e); + } + byName.put(key, eList); + } int entryIndex = 0; int valueIndex = 0;
--
1.6.0.rc0.182.gb96c7