@@ -517,128 +517,177 @@ private void rewriteArtifactVersions(
517
517
if (elements == null ) {
518
518
return ;
519
519
}
520
- String projectId = ArtifactUtils .versionlessKey (projectModel .getGroupId (), projectModel .getArtifactId ());
521
520
for (MavenCoordinate coordinate : elements ) {
522
- String rawVersion = coordinate .getVersion ();
523
- if (rawVersion == null ) {
524
- // managed dependency or unversioned plugin
525
- continue ;
526
- }
521
+ rewriteArtifactVersion (coordinate , projectModel , properties , result , releaseDescriptor , simulate );
522
+ }
523
+ }
527
524
528
- String rawGroupId = coordinate .getGroupId ();
529
- if (rawGroupId == null ) {
530
- if ("plugin" .equals (coordinate .getName ())) {
531
- rawGroupId = "org.apache.maven.plugins" ;
532
- } else {
533
- // incomplete dependency
534
- continue ;
535
- }
536
- }
537
- String groupId = ReleaseUtil .interpolate (rawGroupId , projectModel );
525
+ private void rewriteArtifactVersion (
526
+ MavenCoordinate artifact ,
527
+ Model projectModel ,
528
+ Properties properties ,
529
+ ReleaseResult result ,
530
+ ReleaseDescriptor releaseDescriptor ,
531
+ boolean simulate )
532
+ throws ReleaseExecutionException , ReleaseFailureException {
533
+ String projectId = ArtifactUtils .versionlessKey (projectModel .getGroupId (), projectModel .getArtifactId ());
534
+ String rawVersion = artifact .getVersion ();
535
+ if (rawVersion == null ) {
536
+ // managed dependency or unversioned plugin
537
+ return ;
538
+ }
538
539
539
- String rawArtifactId = coordinate .getArtifactId ();
540
- if (rawArtifactId == null ) {
541
- // incomplete element
542
- continue ;
543
- }
544
- String artifactId = ReleaseUtil .interpolate (rawArtifactId , projectModel );
545
-
546
- String key = ArtifactUtils .versionlessKey (groupId , artifactId );
547
- String resolvedSnapshotVersion = getResolvedSnapshotVersion (key , releaseDescriptor );
548
- String mappedVersion = getNextVersion (releaseDescriptor , key );
549
- String originalVersion = getOriginalVersion (releaseDescriptor , key , simulate );
550
- if (originalVersion == null ) {
551
- originalVersion = getOriginalResolvedSnapshotVersion (key , releaseDescriptor );
540
+ String rawGroupId = artifact .getGroupId ();
541
+ if (rawGroupId == null ) {
542
+ if ("plugin" .equals (artifact .getName ())) {
543
+ rawGroupId = "org.apache.maven.plugins" ;
544
+ } else {
545
+ // incomplete dependency
546
+ return ;
552
547
}
548
+ }
549
+ String groupId = ReleaseUtil .interpolate (rawGroupId , projectModel );
553
550
554
- // MRELEASE-220
555
- if (mappedVersion != null
556
- && mappedVersion .endsWith (Artifact .SNAPSHOT_VERSION )
557
- && !rawVersion .endsWith (Artifact .SNAPSHOT_VERSION )
558
- && !releaseDescriptor .isUpdateDependencies ()) {
559
- continue ;
560
- }
551
+ String rawArtifactId = artifact .getArtifactId ();
552
+ if (rawArtifactId == null ) {
553
+ // incomplete element
554
+ return ;
555
+ }
556
+ String artifactId = ReleaseUtil .interpolate (rawArtifactId , projectModel );
557
+
558
+ String key = ArtifactUtils .versionlessKey (groupId , artifactId );
559
+ String resolvedSnapshotVersion = getResolvedSnapshotVersion (key , releaseDescriptor );
560
+ String mappedVersion = getNextVersion (releaseDescriptor , key );
561
+ String originalVersion = getOriginalVersion (releaseDescriptor , key , simulate );
562
+ if (originalVersion == null ) {
563
+ originalVersion = getOriginalResolvedSnapshotVersion (key , releaseDescriptor );
564
+ }
561
565
562
- if (mappedVersion != null ) {
563
- if (rawVersion .equals (originalVersion )) {
564
- logInfo (result , " Updating " + artifactId + " to " + mappedVersion );
565
- coordinate .setVersion (mappedVersion );
566
- } else {
567
- String property = extractPropertyFromExpression (rawVersion );
568
- if (property != null ) {
569
- if (property .startsWith ("project." )
570
- || property .startsWith ("pom." )
571
- || "version" .equals (property )) {
572
- if (!mappedVersion .equals (getNextVersion (releaseDescriptor , projectId ))) {
573
- logInfo (result , " Updating " + artifactId + " to " + mappedVersion );
574
- coordinate .setVersion (mappedVersion );
575
- } else {
576
- logInfo (result , " Ignoring artifact version update for expression " + rawVersion );
577
- }
578
- } else if (properties != null ) {
579
- // version is an expression, check for properties to update instead
580
- String propertyValue = properties .getProperty (property );
581
- if (propertyValue != null ) {
582
- if (propertyValue .equals (originalVersion )) {
583
- logInfo (result , " Updating " + rawVersion + " to " + mappedVersion );
584
- // change the property only if the property is the same as what's in the reactor
585
- properties .setProperty (property , mappedVersion );
586
- } else if (mappedVersion .equals (propertyValue )) {
587
- // this property may have been updated during processing a sibling.
588
- logInfo (
589
- result ,
590
- " Ignoring artifact version update for expression " + rawVersion
591
- + " because it is already updated" );
592
- } else if (!mappedVersion .equals (rawVersion )) {
593
- // WARNING: ${pom.*} prefix support and ${version} is about to be dropped in mvn4!
594
- // https://issues.apache.org/jira/browse/MNG-7404
595
- // https://issues.apache.org/jira/browse/MNG-7244
596
- if (mappedVersion .matches ("\\ $\\ {project.+\\ }" )
597
- || mappedVersion .matches ("\\ $\\ {pom.+\\ }" )
598
- || "${version}" .equals (mappedVersion )) {
599
- logInfo (
600
- result ,
601
- " Ignoring artifact version update for expression " + mappedVersion );
602
- // ignore... we cannot update this expression
603
- } else {
604
- // the value of the expression conflicts with what the user wanted to release
605
- throw new ReleaseFailureException ("The artifact (" + key + ") requires a "
606
- + "different version (" + mappedVersion + ") than what is found ("
607
- + propertyValue + ") for the expression (" + rawVersion + ") in the "
608
- + "project (" + projectId + ")." );
609
- }
610
- }
611
- } else {
612
- if (CI_FRIENDLY_PROPERTIES .contains (property )) {
613
- logInfo (
614
- result ,
615
- " Ignoring artifact version update for CI friendly expression "
616
- + rawVersion );
617
- } else {
618
- // the expression used to define the version of this artifact may be inherited
619
- // TODO needs a better error message, what pom? what dependency?
620
- throw new ReleaseFailureException (
621
- "Could not find property resolving version expression: " + rawVersion );
622
- }
623
- }
566
+ // MRELEASE-220
567
+ if (mappedVersion != null
568
+ && mappedVersion .endsWith (Artifact .SNAPSHOT_VERSION )
569
+ && !rawVersion .endsWith (Artifact .SNAPSHOT_VERSION )
570
+ && !releaseDescriptor .isUpdateDependencies ()) {
571
+ return ;
572
+ }
573
+
574
+ if (mappedVersion != null ) {
575
+ if (rawVersion .equals (originalVersion )) {
576
+ logInfo (result , " Updating " + key + " to " + mappedVersion );
577
+ artifact .setVersion (mappedVersion );
578
+ } else {
579
+ String property = extractPropertyFromExpression (rawVersion );
580
+ if (property != null ) {
581
+ if (property .startsWith ("project." ) || property .startsWith ("pom." ) || "version" .equals (property )) {
582
+ // those properties are read-only, replace with literal version in case it is supposed to be
583
+ // different from the project's version
584
+ if (!mappedVersion .equals (getNextVersion (releaseDescriptor , projectId ))) {
585
+ logInfo (result , " Updating " + key + " to " + mappedVersion );
586
+ artifact .setVersion (mappedVersion );
624
587
} else {
625
- // the expression used to define the version of this artifact may be inherited
626
- // TODO needs a better error message, what pom? what dependency?
627
- throw new ReleaseFailureException (
628
- "Could not find properties resolving version expression : " + rawVersion );
588
+ logInfo (result , " Ignoring artifact version update for expression " + rawVersion );
629
589
}
630
590
} else {
631
- // different/previous version not related to current release
591
+ rewritePropertyUsedInVersionExpression (
592
+ projectId ,
593
+ key ,
594
+ rawVersion ,
595
+ mappedVersion ,
596
+ originalVersion ,
597
+ property ,
598
+ properties ,
599
+ result ,
600
+ releaseDescriptor );
632
601
}
633
602
}
634
- } else if (resolvedSnapshotVersion != null ) {
635
- logInfo (result , " Updating " + artifactId + " to " + resolvedSnapshotVersion );
603
+ }
604
+ } else if (resolvedSnapshotVersion != null ) {
605
+ logInfo (result , " Updating " + key + " to " + resolvedSnapshotVersion );
636
606
637
- coordinate .setVersion (resolvedSnapshotVersion );
607
+ artifact .setVersion (resolvedSnapshotVersion );
608
+ } else {
609
+ // artifact not related to current release
610
+ }
611
+ }
612
+
613
+ /**
614
+ * This is a best-effort implementation for adjusting property values used in versions to be adjusted.
615
+ * It only ever rewrites properties in the non-effective local POM.
616
+ * If the property used in the version expression cannot be rewritten this is just logged for informational purposes.
617
+ *
618
+ * @param projectKey the key of the project where to rewrite
619
+ * @param artifactKey the key of the artifact whose version is changed
620
+ * @param rawVersion the non interpolated version of the artifact
621
+ * @param mappedVersion the new version of the artifact
622
+ * @param originalVersion the original version (prior modification) of the artifact in the reactor
623
+ * @param property the property referenced in the version expression
624
+ * @param properties the local properties of the project (may be {@code null})
625
+ * @param result
626
+ * @param releaseDescriptor
627
+ * @return {@code true} if the property was rewritten, otherwise {@code false}
628
+ */
629
+ boolean rewritePropertyUsedInVersionExpression (
630
+ String projectKey ,
631
+ String artifactKey ,
632
+ String rawVersion ,
633
+ String mappedVersion ,
634
+ String originalVersion ,
635
+ String property ,
636
+ Properties properties ,
637
+ ReleaseResult result ,
638
+ ReleaseDescriptor releaseDescriptor )
639
+ throws ReleaseFailureException {
640
+ if (properties == null ) {
641
+ logInfo (
642
+ result ,
643
+ " Ignoring artifact version update for " + artifactKey + " as expression " + rawVersion
644
+ + " cannot be locally resolved" );
645
+ return false ;
646
+ }
647
+ // check for value of property
648
+ boolean isUpdated = false ;
649
+ String propertyValue = properties .getProperty (property );
650
+ if (propertyValue != null ) {
651
+ if (propertyValue .equals (originalVersion )) {
652
+ logInfo (result , " Updating " + rawVersion + " to " + mappedVersion );
653
+ // change the property only if the property is the same as what's in the reactor
654
+ properties .setProperty (property , mappedVersion );
655
+ isUpdated = true ;
656
+ } else if (mappedVersion .equals (propertyValue )) {
657
+ // this property may have been updated during processing a sibling.
658
+ logInfo (
659
+ result ,
660
+ " Ignoring artifact version update for expression " + rawVersion
661
+ + " because it is already updated" );
662
+ } else if (!mappedVersion .equals (rawVersion )) {
663
+ // WARNING: ${pom.*} prefix support and ${version} is about to be dropped in mvn4!
664
+ // https://issues.apache.org/jira/browse/MNG-7404
665
+ // https://issues.apache.org/jira/browse/MNG-7244
666
+ if (mappedVersion .matches ("\\ $\\ {project.+\\ }" )
667
+ || mappedVersion .matches ("\\ $\\ {pom.+\\ }" )
668
+ || "${version}" .equals (mappedVersion )) {
669
+ logInfo (result , " Ignoring artifact version update for expression " + mappedVersion );
670
+ // ignore... we cannot update this expression
671
+ } else {
672
+ // the value of the expression conflicts with what the user wanted to release
673
+ throw new ReleaseFailureException ("The artifact (" + artifactKey + ") requires a "
674
+ + "different version (" + mappedVersion + ") than what is found ("
675
+ + propertyValue + ") for the expression (" + rawVersion + ") in the "
676
+ + "project (" + projectKey + ")." );
677
+ }
678
+ }
679
+ } else {
680
+ if (CI_FRIENDLY_PROPERTIES .contains (property )) {
681
+ logInfo (result , " Ignoring artifact version update for CI friendly expression " + rawVersion );
638
682
} else {
639
- // artifact not related to current release
683
+ // the expression used to define the version of this artifact may be inherited
684
+ logInfo (
685
+ result ,
686
+ " Ignoring artifact version update for " + artifactKey + " as expression " + rawVersion
687
+ + " cannot be locally resolved" );
640
688
}
641
689
}
690
+ return isUpdated ;
642
691
}
643
692
644
693
private void prepareScm (
0 commit comments