summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2010-01-28 11:10:52 -0800
committerRobin Rosenberg <robin.rosenberg@dewire.com>2010-01-29 05:48:31 +0100
commit48e9a010ae9cfee5cc2daae2bf20d510ab9c108f (patch)
tree35f60e6322516e0b1a4aa9aa50c523e2fff05f88 /org.eclipse.jgit
parentaa97c6e4499547c1e33b54a5630b03f2983828b4 (diff)
downloadjgit-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.java42
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;