Merge "Add unsetSection to Config to remove an entire block"
This commit is contained in:
commit
baaa78f1f0
|
@ -271,6 +271,47 @@ public void testEmptyString() throws ConfigInvalidException {
|
||||||
assertEquals("[my]\n\tempty =\n", c.toText());
|
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 {
|
private void assertReadLong(long exp) throws ConfigInvalidException {
|
||||||
assertReadLong(exp, String.valueOf(exp));
|
assertReadLong(exp, String.valueOf(exp));
|
||||||
}
|
}
|
||||||
|
|
|
@ -576,6 +576,43 @@ public void unset(final String section, final String subsection,
|
||||||
.<String> emptyList());
|
.<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.
|
* Set a configuration value.
|
||||||
*
|
*
|
||||||
|
@ -1104,6 +1141,11 @@ && eqSameCase(subsection, aSubsection)
|
||||||
&& eqIgnoreCase(name, aKey);
|
&& 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) {
|
private static boolean eqIgnoreCase(final String a, final String b) {
|
||||||
if (a == null && b == null)
|
if (a == null && b == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue