Skip to content

Commit 83a3854

Browse files
committed
keep duplicate -runbundles
this fixes the problem that in a RunResultion which suggested the same bundle but in different versions only one bundle (the highest) was kept. Now both suggestions are kept. The problem was that Parameters.toParameter() used parameters.put() instead of parameters.add(). .put() removes duplicate keys, .add() keeps duplicates by using the duplicate markers. Signed-off-by: Christoph Rueger <[email protected]>
1 parent f669efd commit 83a3854

File tree

7 files changed

+759
-283
lines changed

7 files changed

+759
-283
lines changed

biz.aQute.bndlib/src/aQute/bnd/build/model/clauses/HeaderClause.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ public String toString() {
184184
public static Parameters toParameters(List<? extends HeaderClause> l) {
185185
Parameters parameters = new Parameters();
186186

187-
l.forEach(hc -> parameters.put(hc.name, hc.attribs));
187+
l.forEach(hc -> parameters.add(hc.name, hc.attribs));
188188

189189
return parameters;
190190
}

biz.aQute.resolve/src/biz/aQute/resolve/RunResolution.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package biz.aQute.resolve;
22

3+
import static aQute.bnd.osgi.Processor.removeDuplicateMarker;
34
import static java.util.stream.Collectors.toList;
45

56
import java.io.File;
@@ -14,8 +15,6 @@
1415
import java.util.function.Predicate;
1516
import java.util.stream.Collectors;
1617

17-
import aQute.bnd.header.Parameters;
18-
import aQute.bnd.osgi.Instructions;
1918
import org.osgi.resource.Resource;
2019
import org.osgi.resource.Wire;
2120
import org.osgi.service.resolver.ResolutionException;
@@ -30,13 +29,15 @@
3029
import aQute.bnd.build.model.clauses.HeaderClause;
3130
import aQute.bnd.build.model.clauses.VersionedClause;
3231
import aQute.bnd.exceptions.Exceptions;
32+
import aQute.bnd.header.Parameters;
3333
import aQute.bnd.help.Syntax;
3434
import aQute.bnd.help.instructions.ResolutionInstructions;
3535
import aQute.bnd.help.instructions.ResolutionInstructions.ResolveMode;
3636
import aQute.bnd.help.instructions.ResolutionInstructions.RunStartLevel;
3737
import aQute.bnd.help.instructions.ResolutionInstructions.Runorder;
3838
import aQute.bnd.osgi.BundleId;
3939
import aQute.bnd.osgi.Constants;
40+
import aQute.bnd.osgi.Instructions;
4041
import aQute.bnd.osgi.Processor;
4142
import aQute.bnd.osgi.resource.ResourceUtils;
4243
import aQute.bnd.osgi.resource.ResourceUtils.IdentityCapability;
@@ -201,8 +202,10 @@ public boolean updateBundles(BndEditModel model) {
201202
Instructions decorator = new Instructions(project.mergeProperties(Constants.RUNBUNDLES_DECORATOR));
202203
decorator.decorate(bundles);
203204

205+
204206
newer = bundles.entrySet()
205-
.stream().map(entry -> new VersionedClause(entry.getKey(), entry.getValue()))
207+
.stream()
208+
.map(entry -> new VersionedClause(removeDuplicateMarker(entry.getKey()), entry.getValue()))
206209
.collect(Collectors.toList());
207210

208211
if (newer.equals(older))

biz.aQute.resolve/test/biz/aQute/resolve/RunResolutionTest.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import aQute.bnd.build.model.clauses.HeaderClause;
3535
import aQute.bnd.build.model.clauses.VersionedClause;
3636
import aQute.bnd.build.model.conversions.NoopConverter;
37+
import aQute.bnd.header.Parameters;
3738
import aQute.bnd.help.instructions.ResolutionInstructions.Runorder;
3839
import aQute.bnd.osgi.Constants;
3940
import aQute.bnd.result.Result;
@@ -517,24 +518,34 @@ public void testPrintHumanReadableDifference() throws Exception {
517518
}
518519

519520
@Test
520-
public void testStartLevelDecoration() throws Exception {
521-
Bndrun bndrun = Bndrun.createBndrun(workspace, IO.getFile(ws.toFile(), "test.simple/resolve.bndrun"));
521+
public void testStartLevelDecoration(SoftAssertions softly) throws Exception {
522+
Bndrun bndrun = Bndrun.createBndrun(workspace, IO.getFile(ws.toFile(), "test.simple/resolveduplicates.bndrun"));
522523
bndrun.setProperty("-runstartlevel", "order=leastdependenciesfirst,begin=100,step=10");
523524

524525
// Decorate test.simple to get startlevel 90 (which would otherwise be 110 within the assigned runstartlevel).
525526
bndrun.setProperty("-runbundles+", "test.simple;startlevel=90");
526527

527528
List<? extends HeaderClause> runBundles = List.copyOf(bndrun.resolve(false, false, new NoopConverter<>()));
528529

529-
assertThat(runBundles).hasSize(2);
530-
assertThat(runBundles.get(0)
531-
.getName()).isEqualTo("osgi.enroute.junit.wrapper");
532-
assertThat(runBundles.get(0)
533-
.getAttribs()).containsEntry(Constants.RUNBUNDLES_STARTLEVEL_ATTRIBUTE, "100");
534-
assertThat(runBundles.get(1)
535-
.getName()).isEqualTo("test.simple");
536-
assertThat(runBundles.get(1)
537-
.getAttribs()).containsEntry(Constants.RUNBUNDLES_STARTLEVEL_ATTRIBUTE, "90");
530+
softly.assertThat(runBundles).hasSize(4);
531+
softly.assertThat(runBundles.stream()
532+
.map(rb -> rb.toString())
533+
.toList())
534+
.containsExactlyInAnyOrder("org.apache.felix.gogo.runtime;version='[0.12.0,0.12.1)';startlevel=100",
535+
"org.apache.felix.gogo.runtime;version='[0.10.0,0.10.1)';startlevel=110",
536+
"osgi.enroute.junit.wrapper;version='[4.12.0,4.12.1)';startlevel=120",
537+
"test.simple;version=snapshot;startlevel=90");
538+
539+
// check that HeaderClause.toParameters does not remove duplicates
540+
// this kind of happens inside bndrun.resolve() let's test explicitly
541+
// again
542+
Parameters params = HeaderClause.toParameters(runBundles);
543+
softly.assertThat(params)
544+
.hasSize(4);
545+
softly.assertThat(params.toString())
546+
.isEqualTo(
547+
"org.apache.felix.gogo.runtime;version=\"[0.12.0,0.12.1)\";startlevel=100,org.apache.felix.gogo.runtime;version=\"[0.10.0,0.10.1)\";startlevel=110,osgi.enroute.junit.wrapper;version=\"[4.12.0,4.12.1)\";startlevel=120,test.simple;version=snapshot;startlevel=90");
548+
538549
}
539550

540551
@SuppressWarnings("resource")

0 commit comments

Comments
 (0)