diff options
author | Shawn O. Pearce <spearce@spearce.org> | 2010-01-28 11:10:52 -0800 |
---|---|---|
committer | Robin Rosenberg <robin.rosenberg@dewire.com> | 2010-01-29 05:48:31 +0100 |
commit | 48e9a010ae9cfee5cc2daae2bf20d510ab9c108f (patch) | |
tree | 35f60e6322516e0b1a4aa9aa50c523e2fff05f88 /org.eclipse.jgit | |
parent | aa97c6e4499547c1e33b54a5630b03f2983828b4 (diff) | |
download | jgit-48e9a010ae9cfee5cc2daae2bf20d510ab9c108f.tar.gz jgit-48e9a010ae9cfee5cc2daae2bf20d510ab9c108f.zip |
Add unsetSection to Config to remove an entire block
The unsetSection method can be used to delete an entire configuration
block, such as a [branch ""] or [remote ""] section in a file.
Change-Id: I93390c9b2187eb1b0d51353518feaed83bed2aad
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java | 42 |
1 files changed, 42 insertions, 0 deletions
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 d66aa74c8e..0d0c377f8f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java @@ -577,6 +577,43 @@ public class Config { } /** + * Remove all configuration values under a single section. + * + * @param section + * section name, e.g "branch" + * @param subsection + * optional subsection value, e.g. a branch name + */ + public void unsetSection(String section, String subsection) { + State src, res; + do { + src = state.get(); + res = unsetSection(src, section, subsection); + } while (!state.compareAndSet(src, res)); + } + + private State unsetSection(final State srcState, final String section, + final String subsection) { + final int max = srcState.entryList.size(); + final ArrayList<Entry> r = new ArrayList<Entry>(max); + + boolean lastWasMatch = false; + for (Entry e : srcState.entryList) { + if (e.match(section, subsection)) { + // Skip this record, it's for the section we are removing. + lastWasMatch = true; + continue; + } + + if (lastWasMatch && e.section == null && e.subsection == null) + continue; // skip this padding line in the section. + r.add(e); + } + + return newState(r); + } + + /** * Set a configuration value. * * <pre> @@ -1104,6 +1141,11 @@ public class Config { && eqIgnoreCase(name, aKey); } + boolean match(final String aSection, final String aSubsection) { + return eqIgnoreCase(section, aSection) + && eqSameCase(subsection, aSubsection); + } + private static boolean eqIgnoreCase(final String a, final String b) { if (a == null && b == null) return true; |