|
71 | 71 | import org.apache.maven.api.model.Plugin;
|
72 | 72 | import org.apache.maven.api.model.Profile;
|
73 | 73 | import org.apache.maven.api.model.ReportPlugin;
|
| 74 | +import org.apache.maven.api.services.MavenException; |
74 | 75 | import org.apache.maven.api.services.ModelBuilder;
|
75 | 76 | import org.apache.maven.api.services.ModelBuilderException;
|
76 | 77 | import org.apache.maven.api.services.ModelBuilderRequest;
|
|
101 | 102 | import org.apache.maven.model.root.RootLocator;
|
102 | 103 | import org.apache.maven.repository.internal.ArtifactDescriptorUtils;
|
103 | 104 | 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; |
104 | 108 | import org.eclipse.aether.RepositorySystem;
|
105 | 109 | import org.eclipse.aether.RepositorySystemSession;
|
106 | 110 | import org.eclipse.aether.RequestTrace;
|
@@ -308,6 +312,7 @@ class BuildSession implements AutoCloseable {
|
308 | 312 | private final ExecutorService executor;
|
309 | 313 | private final ModelCache modelCache;
|
310 | 314 | private final ModelResolver modelResolver;
|
| 315 | + private final Map<String, String> ciFriendlyVersions = new ConcurrentHashMap<>(); |
311 | 316 |
|
312 | 317 | BuildSession(ProjectBuildingRequest request, boolean localProjects) {
|
313 | 318 | this.request = request;
|
@@ -618,7 +623,10 @@ private InterimResult build(
|
618 | 623 |
|
619 | 624 | Model model = result.getActivatedFileModel();
|
620 | 625 |
|
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); |
622 | 630 |
|
623 | 631 | InterimResult interimResult = new InterimResult(pomFile, modelBuildingRequest, result, project, isRoot);
|
624 | 632 |
|
@@ -697,6 +705,59 @@ private InterimResult build(
|
697 | 705 | return interimResult;
|
698 | 706 | }
|
699 | 707 |
|
| 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 | + |
700 | 761 | private List<ProjectBuildingResult> build(
|
701 | 762 | Map<File, MavenProject> projectIndex, List<InterimResult> interimResults) {
|
702 | 763 | // The transformation may need to access dependencies raw models,
|
|
0 commit comments