Skip to content

Commit cdaf86c

Browse files
committed
[MNG-8229] Fix interpolation of CI friendly versions
1 parent c0813a2 commit cdaf86c

File tree

1 file changed

+62
-1
lines changed

1 file changed

+62
-1
lines changed

maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java

+62-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
import org.apache.maven.api.model.Plugin;
7272
import org.apache.maven.api.model.Profile;
7373
import org.apache.maven.api.model.ReportPlugin;
74+
import org.apache.maven.api.services.MavenException;
7475
import org.apache.maven.api.services.ModelBuilder;
7576
import org.apache.maven.api.services.ModelBuilderException;
7677
import org.apache.maven.api.services.ModelBuilderRequest;
@@ -101,6 +102,9 @@
101102
import org.apache.maven.model.root.RootLocator;
102103
import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
103104
import org.apache.maven.utils.Os;
105+
import org.codehaus.plexus.interpolation.AbstractValueSource;
106+
import org.codehaus.plexus.interpolation.InterpolationException;
107+
import org.codehaus.plexus.interpolation.StringSearchInterpolator;
104108
import org.eclipse.aether.RepositorySystem;
105109
import org.eclipse.aether.RepositorySystemSession;
106110
import org.eclipse.aether.RequestTrace;
@@ -308,6 +312,7 @@ class BuildSession implements AutoCloseable {
308312
private final ExecutorService executor;
309313
private final ModelCache modelCache;
310314
private final ModelResolver modelResolver;
315+
private final Map<String, String> ciFriendlyVersions = new ConcurrentHashMap<>();
311316

312317
BuildSession(ProjectBuildingRequest request, boolean localProjects) {
313318
this.request = request;
@@ -618,7 +623,10 @@ private InterimResult build(
618623

619624
Model model = result.getActivatedFileModel();
620625

621-
modelPool.put(model.getPomFile(), model);
626+
// In case the model is using CI friendly versions, at this point, it will contain uninterpolated version
627+
// such as ${revision}${changelist}, so we need to take care of it now
628+
Model modelWithVersion = getModelWithInterpolatedVersion(model, result.getProblems()::add);
629+
modelPool.put(model.getPomFile(), modelWithVersion);
622630

623631
InterimResult interimResult = new InterimResult(pomFile, modelBuildingRequest, result, project, isRoot);
624632

@@ -697,6 +705,59 @@ private InterimResult build(
697705
return interimResult;
698706
}
699707

708+
private Model getModelWithInterpolatedVersion(
709+
Model model, Consumer<org.apache.maven.api.services.ModelProblem> problems) {
710+
String version = model.getVersion();
711+
if (version == null && model.getParent() != null) {
712+
version = model.getParent().getVersion();
713+
}
714+
if (version != null && version.contains("${")) {
715+
try {
716+
StringSearchInterpolator interpolator = new StringSearchInterpolator();
717+
interpolator.addValueSource(new AbstractValueSource(false) {
718+
@Override
719+
public String getValue(String key) {
720+
String val = request.getUserProperties().getProperty(key);
721+
if (val == null) {
722+
val = model.getProperties().get(key);
723+
if (val == null) {
724+
val = request.getSystemProperties().getProperty(key);
725+
if (val == null) {
726+
val = ciFriendlyVersions.get(key);
727+
}
728+
}
729+
}
730+
if (val != null) {
731+
String oldVal = ciFriendlyVersions.put(key, val);
732+
if (oldVal != null && !val.equals(oldVal)) {
733+
throw new MavenException("Non unique property value detected for key '" + key
734+
+ "' which is bound to '" + oldVal + "' and '" + val + "'");
735+
}
736+
}
737+
return val;
738+
}
739+
});
740+
version = interpolator.interpolate(version);
741+
} catch (InterpolationException | MavenException e) {
742+
ModelProblem problem = new org.apache.maven.internal.impl.model.DefaultModelProblem(
743+
"Unable to interpolate ",
744+
ModelProblem.Severity.ERROR,
745+
ModelProblem.Version.BASE,
746+
model,
747+
-1,
748+
-1,
749+
null);
750+
problems.accept(problem);
751+
}
752+
if (model.getVersion() != null) {
753+
return model.withVersion(version);
754+
} else {
755+
return model.withParent(model.getParent().withVersion(version));
756+
}
757+
}
758+
return model;
759+
}
760+
700761
private List<ProjectBuildingResult> build(
701762
Map<File, MavenProject> projectIndex, List<InterimResult> interimResults) {
702763
// The transformation may need to access dependencies raw models,

0 commit comments

Comments
 (0)