Skip to content
Snippets Groups Projects
Commit baaa78f1 authored by Robin Rosenberg's avatar Robin Rosenberg Committed by Code Review
Browse files

Merge "Add unsetSection to Config to remove an entire block"

parents 94599930 48e9a010
No related branches found
No related tags found
No related merge requests found
......@@ -271,6 +271,47 @@ public void testEmptyString() throws ConfigInvalidException {
assertEquals("[my]\n\tempty =\n", c.toText());
}
public void testUnsetBranchSection() throws ConfigInvalidException {
Config c = parse("" //
+ "[branch \"keep\"]\n"
+ " merge = master.branch.to.keep.in.the.file\n"
+ "\n"
+ "[branch \"remove\"]\n"
+ " merge = this.will.get.deleted\n"
+ " remote = origin-for-some-long-gone-place\n"
+ "\n"
+ "[core-section-not-to-remove-in-test]\n"
+ " packedGitLimit = 14\n");
c.unsetSection("branch", "does.not.exist");
c.unsetSection("branch", "remove");
assertEquals("" //
+ "[branch \"keep\"]\n"
+ " merge = master.branch.to.keep.in.the.file\n"
+ "\n"
+ "[core-section-not-to-remove-in-test]\n"
+ " packedGitLimit = 14\n", c.toText());
}
public void testUnsetSingleSection() throws ConfigInvalidException {
Config c = parse("" //
+ "[branch \"keep\"]\n"
+ " merge = master.branch.to.keep.in.the.file\n"
+ "\n"
+ "[single]\n"
+ " merge = this.will.get.deleted\n"
+ " remote = origin-for-some-long-gone-place\n"
+ "\n"
+ "[core-section-not-to-remove-in-test]\n"
+ " packedGitLimit = 14\n");
c.unsetSection("single", null);
assertEquals("" //
+ "[branch \"keep\"]\n"
+ " merge = master.branch.to.keep.in.the.file\n"
+ "\n"
+ "[core-section-not-to-remove-in-test]\n"
+ " packedGitLimit = 14\n", c.toText());
}
private void assertReadLong(long exp) throws ConfigInvalidException {
assertReadLong(exp, String.valueOf(exp));
}
......
......@@ -576,6 +576,43 @@ public void unset(final String section, final String subsection,
.<String> emptyList());
}
/**
* 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.
*
......@@ -1104,6 +1141,11 @@ && eqSameCase(subsection, aSubsection)
&& 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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment