diff options
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java | 17 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java | 63 |
2 files changed, 64 insertions, 16 deletions
diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java index 8737b697cc..d5da16ad80 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java @@ -58,6 +58,7 @@ import static org.junit.Assert.fail; import java.text.MessageFormat; import java.util.Arrays; +import java.util.Iterator; import java.util.LinkedList; import java.util.Set; @@ -386,13 +387,25 @@ public class ConfigTest { @Test public void test009_readNamesInSection() throws ConfigInvalidException { - String configString = "[core]\n" + "repositoryformatversion = 0\n" - + "filemode = false\n" + "logallrefupdates = true\n"; + String configString = "[core]\n" + "repositoryFormatVersion = 0\n" + + "filemode = false\n" + "logAllRefUpdates = true\n"; final Config c = parse(configString); Set<String> names = c.getNames("core"); assertEquals("Core section size", 3, names.size()); assertTrue("Core section should contain \"filemode\"", names .contains("filemode")); + + assertTrue("Core section should contain \"repositoryFormatVersion\"", + names.contains("repositoryFormatVersion")); + + assertTrue("Core section should contain \"repositoryformatversion\"", + names.contains("repositoryformatversion")); + + Iterator<String> itr = names.iterator(); + assertEquals("repositoryFormatVersion", itr.next()); + assertEquals("filemode", itr.next()); + assertEquals("logAllRefUpdates", itr.next()); + assertFalse(itr.hasNext()); } @Test diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java index daad67e29c..ce86dc20f9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java @@ -52,9 +52,12 @@ package org.eclipse.jgit.lib; import java.text.MessageFormat; +import java.util.AbstractSet; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -1327,39 +1330,71 @@ public class Config { } public Set<String> parse(Config cfg) { - final Set<String> result = new HashSet<String>(); + final Map<String, String> m = new LinkedHashMap<String, String>(); while (cfg != null) { for (final Entry e : cfg.state.get().entryList) { - if (e.name != null - && StringUtils.equalsIgnoreCase(e.section, section)) { - if (subsection == null && e.subsection == null) - result.add(StringUtils.toLowerCase(e.name)); - else if (e.subsection != null - && e.subsection.equals(subsection)) - result.add(StringUtils.toLowerCase(e.name)); - + if (e.name == null) + continue; + if (!StringUtils.equalsIgnoreCase(section, e.section)) + continue; + if ((subsection == null && e.subsection == null) + || (subsection != null && subsection + .equals(e.subsection))) { + String lc = StringUtils.toLowerCase(e.name); + if (!m.containsKey(lc)) + m.put(lc, e.name); } } cfg = cfg.baseConfig; } - return Collections.unmodifiableSet(result); + return new CaseFoldingSet(m); } } private static class SectionNames implements SectionParser<Set<String>> { public Set<String> parse(Config cfg) { - final Set<String> result = new HashSet<String>(); + final Map<String, String> m = new LinkedHashMap<String, String>(); while (cfg != null) { for (final Entry e : cfg.state.get().entryList) { - if (e.section != null) - result.add(StringUtils.toLowerCase(e.section)); + if (e.section != null) { + String lc = StringUtils.toLowerCase(e.section); + if (!m.containsKey(lc)) + m.put(lc, e.section); + } } cfg = cfg.baseConfig; } - return Collections.unmodifiableSet(result); + return new CaseFoldingSet(m); } } + private static class CaseFoldingSet extends AbstractSet<String> { + private final Map<String, String> names; + + CaseFoldingSet(Map<String, String> names) { + this.names = Collections.unmodifiableMap(names); + } + + @Override + public boolean contains(Object needle) { + if (!(needle instanceof String)) + return false; + + String n = (String) needle; + return names.containsKey(n) + || names.containsKey(StringUtils.toLowerCase(n)); + } + + @Override + public Iterator<String> iterator() { + return names.values().iterator(); + } + + @Override + public int size() { + return names.size(); + } + } private static class State { final List<Entry> entryList; |