From 79054b7d2e1848d2a9bf96588a3d0d163880c47e Mon Sep 17 00:00:00 2001 From: Michael Osipov Date: Sun, 5 Mar 2023 19:05:11 +0100 Subject: [PATCH 01/22] [maven-release-plugin] prepare for next development iteration --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index ece1973..c8603dd 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ maven-artifact-plugin - 3.4.1 + 3.4.2-SNAPSHOT maven-plugin Apache Maven Artifact Plugin @@ -41,7 +41,7 @@ scm:git:https://gitbox.apache.org/repos/asf/maven-artifact-plugin.git scm:git:https://gitbox.apache.org/repos/asf/maven-artifact-plugin.git - maven-artifact-plugin-3.4.1 + master https://github.com/apache/maven-artifact-plugin/tree/${project.scm.tag} @@ -62,7 +62,7 @@ 3.2.5 8 - 2023-03-05T18:04:48Z + 2023-03-05T18:05:11Z From 1becb62ae429613011dad5901a38e9059632daba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 9 Apr 2023 23:43:29 +0200 Subject: [PATCH 02/22] [MARTIFACT-33] keep reference files in groupId dir --- pom.xml | 2 +- src/it/compare-mono/verify.groovy | 4 ++-- src/it/flatten/verify.groovy | 6 +++--- .../plugins/artifact/buildinfo/CompareMojo.java | 2 +- .../buildinfo/ReferenceBuildinfoUtil.java | 17 +++++++++++++---- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/pom.xml b/pom.xml index c8603dd..0fad70c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ maven-artifact-plugin - 3.4.2-SNAPSHOT + 3.5.0-SNAPSHOT maven-plugin Apache Maven Artifact Plugin diff --git a/src/it/compare-mono/verify.groovy b/src/it/compare-mono/verify.groovy index 89a233d..413d44b 100644 --- a/src/it/compare-mono/verify.groovy +++ b/src/it/compare-mono/verify.groovy @@ -31,7 +31,7 @@ assert compare.contains( "ko=1" ) assert compare.contains( 'okFiles="mono-1.0-SNAPSHOT.pom"' ) assert compare.contains( 'koFiles="mono-1.0-SNAPSHOT.jar"' ) if( File.separator == '/' ) { - assert compare.contains( '# diffoscope target/reference/mono-1.0-SNAPSHOT.jar target/mono-1.0-SNAPSHOT.jar' ) + assert compare.contains( '# diffoscope target/reference/org.apache.maven.plugins.it.compare/mono-1.0-SNAPSHOT.jar target/mono-1.0-SNAPSHOT.jar' ) } else { - assert compare.contains( '# diffoscope target\\reference\\mono-1.0-SNAPSHOT.jar target\\mono-1.0-SNAPSHOT.jar' ) + assert compare.contains( '# diffoscope target\\reference\\org.apache.maven.plugins.it.compare\\mono-1.0-SNAPSHOT.jar target\\mono-1.0-SNAPSHOT.jar' ) } diff --git a/src/it/flatten/verify.groovy b/src/it/flatten/verify.groovy index 7c3c393..1ce3451 100644 --- a/src/it/flatten/verify.groovy +++ b/src/it/flatten/verify.groovy @@ -21,9 +21,9 @@ String compare = new File( basedir, 'target/flatten-1.0-SNAPSHOT.buildcompare' ).text assert compare.contains( 'okFiles="flatten-1.0-SNAPSHOT.pom flatten-modB-1.0-SNAPSHOT.pom flatten-modA-1.0-SNAPSHOT.pom"' ) -assert new File( basedir, 'flattened-pom.xml' ).text == new File( basedir, 'target/reference/flatten-1.0-SNAPSHOT.pom' ).text -assert new File( basedir, 'modA/flattened-pom.xml' ).text == new File( basedir, 'target/reference/flatten-modA-1.0-SNAPSHOT.pom' ).text -assert new File( basedir, 'modB/pom.xml' ).text == new File( basedir, 'target/reference/flatten-modB-1.0-SNAPSHOT.pom' ).text +assert new File( basedir, 'flattened-pom.xml' ).text == new File( basedir, 'target/reference/org.apache.maven.plugins.it/flatten-1.0-SNAPSHOT.pom' ).text +assert new File( basedir, 'modA/flattened-pom.xml' ).text == new File( basedir, 'target/reference/org.apache.maven.plugins.it/flatten-modA-1.0-SNAPSHOT.pom' ).text +assert new File( basedir, 'modB/pom.xml' ).text == new File( basedir, 'target/reference/org.apache.maven.plugins.it/flatten-modB-1.0-SNAPSHOT.pom' ).text String buildinfo = new File( basedir, 'target/flatten-1.0-SNAPSHOT.buildinfo' ).text assert buildinfo.contains( "outputs.0.0.length=" + new File( basedir, 'flattened-pom.xml' ).size() ) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index 9e900b0..03df3ad 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -261,7 +261,7 @@ private String diffoscope(Artifact a, File referenceDir) { File actual = a.getFile(); // notice: actual file name may have been defined in pom // reference file name is taken from repository format - File reference = new File(referenceDir, getRepositoryFilename(a)); + File reference = new File(new File(referenceDir, a.getGroupId()), getRepositoryFilename(a)); if ((actual == null) || (reference == null)) { return "missing file for " + a.getId() + " reference = " + (reference == null ? "null" : relative(reference)) + " actual = " diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java index dcdb4cc..37aa2a0 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java @@ -153,7 +153,7 @@ File downloadOrCreateReferenceBuildinfo( } // generate buildinfo from reference artifacts - referenceBuildinfo = getReference(buildinfoFile); + referenceBuildinfo = getReference(null, buildinfoFile); try (PrintWriter p = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(referenceBuildinfo), StandardCharsets.UTF_8)))) { BuildInfoWriter bi = new BuildInfoWriter(log, p, mono, artifactHandlerManager, rtInformation); @@ -297,7 +297,7 @@ private File downloadReference(RemoteRepository repo, Artifact artifact) ArtifactResult result = repoSystem.resolveArtifact(new NoWorkspaceRepositorySystemSession(repoSession), request); File resultFile = result.getArtifact().getFile(); - File destFile = getReference(resultFile); + File destFile = getReference(artifact.getGroupId(), resultFile); FileUtils.copyFile(resultFile, destFile); @@ -312,8 +312,17 @@ private File downloadReference(RemoteRepository repo, Artifact artifact) } } - private File getReference(File file) { - return new File(referenceDir, file.getName()); + private File getReference(String groupId, File file) { + File dir; + if (groupId == null) { + dir = referenceDir; + } else { + dir = new File(referenceDir, groupId); + if (!dir.isDirectory()) { + dir.mkdir(); + } + } + return new File(dir, file.getName()); } private static class NoWorkspaceRepositorySystemSession extends AbstractForwardingRepositorySystemSession { From 0e9f9e448b1a8333584bbff95ac7f0dab92ec771 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Mon, 10 Apr 2023 00:48:37 +0200 Subject: [PATCH 03/22] [MARTIFACT-33] store groupId in buildinfo to compare --- .../artifact/buildinfo/BuildInfoWriter.java | 15 ++++++++++----- .../plugins/artifact/buildinfo/CompareMojo.java | 12 ++++++++---- .../buildinfo/ReferenceBuildinfoUtil.java | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java index 5fe3348..6c09395 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java @@ -174,7 +174,11 @@ void printArtifacts(MavenProject project) throws MojoExecutionException { pomArtifact.setFile(project.getFile()); artifacts.put(pomArtifact, prefix + n); - printFile(prefix + n++, project.getFile(), project.getArtifactId() + '-' + project.getVersion() + ".pom"); + printFile( + prefix + n++, + pomArtifact.getGroupId(), + project.getFile(), + project.getArtifactId() + '-' + project.getVersion() + ".pom"); if (project.getArtifact() == null) { return; @@ -218,7 +222,7 @@ private void printArtifact(String prefix, int i, Artifact artifact) throws MojoE return; } - printFile(prefix, artifact.getFile(), getArtifactFilename(artifact)); + printFile(prefix, artifact.getGroupId(), artifact.getFile(), getArtifactFilename(artifact)); artifacts.put(artifact, prefix); } @@ -241,12 +245,13 @@ private String getArtifactFilename(Artifact artifact) { return path.toString(); } - void printFile(String prefix, File file) throws MojoExecutionException { - printFile(prefix, file, file.getName()); + void printFile(String prefix, String groupId, File file) throws MojoExecutionException { + printFile(prefix, groupId, file, file.getName()); } - private void printFile(String prefix, File file, String filename) throws MojoExecutionException { + private void printFile(String prefix, String groupId, File file, String filename) throws MojoExecutionException { p.println(); + p.println(prefix + ".groupId=" + groupId); p.println(prefix + ".filename=" + filename); p.println(prefix + ".length=" + file.length()); try (InputStream is = Files.newInputStream(file.toPath())) { diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index 03df3ad..156e2d0 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -237,9 +237,10 @@ private String[] checkArtifact( String actualLength = (String) actual.remove(prefix + ".length"); String actualSha512 = (String) actual.remove(prefix + ".checksums.sha512"); - String referencePrefix = findPrefix(reference, actualFilename); + String referencePrefix = findPrefix(reference, artifact.getGroupId(), actualFilename); String referenceLength = (String) reference.remove(referencePrefix + ".length"); String referenceSha512 = (String) reference.remove(referencePrefix + ".checksums.sha512"); + reference.remove(referencePrefix + ".groupId"); String issue = null; if (!actualLength.equals(referenceLength)) { @@ -282,11 +283,14 @@ private String relative(File file) { return path.substring(length + 1); } - private static String findPrefix(Properties reference, String actualFilename) { + private static String findPrefix(Properties reference, String actualGroupId, String actualFilename) { for (String name : reference.stringPropertyNames()) { if (name.endsWith(".filename") && actualFilename.equals(reference.getProperty(name))) { - reference.remove(name); - return name.substring(0, name.length() - ".filename".length()); + String prefix = name.substring(0, name.length() - ".filename".length()); + if (actualGroupId.equals(reference.getProperty(prefix + ".groupId"))) { + reference.remove(name); + return prefix; + } } } return null; diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java index 37aa2a0..1f8776a 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java @@ -193,7 +193,7 @@ File downloadOrCreateReferenceBuildinfo( String prefix = entry.getValue(); File referenceFile = referenceArtifacts.get(artifact); if (referenceFile != null) { - bi.printFile(prefix, referenceFile); + bi.printFile(prefix, artifact.getGroupId(), referenceFile); } } From 26068db3af80240cbc64ea52c7d7fc5fdcff2f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Mon, 24 Apr 2023 11:13:46 +0200 Subject: [PATCH 04/22] auto-link MARTIFACT Jira --- .asf.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.asf.yaml b/.asf.yaml index f81ea26..1b170b3 100644 --- a/.asf.yaml +++ b/.asf.yaml @@ -24,3 +24,14 @@ github: - maven-plugins - maven-artifact-plugin - maven + enabled_merge_buttons: + squash: true + merge: false + rebase: true + autolink_jira: + - MARTIFACT +notifications: + commits: commits@maven.apache.org + issues: issues@maven.apache.org + pullrequests: issues@maven.apache.org + jira_options: link label comment From f457fe48ce426e664c0e81bc60da72a3d5703cca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Fri, 5 May 2023 09:47:58 +0200 Subject: [PATCH 05/22] add moditect-maven-plugin --- .../artifact/buildinfo/not-reproducible-plugins.properties | 4 ++++ src/site/apt/plugin-issues.apt | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties index 395755b..0b5a012 100644 --- a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties +++ b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties @@ -52,6 +52,7 @@ org.antlr+antlr3-maven-plugin=fail:https://github.com/antlr/antlr3/pull/195 org.apache.felix+maven-bundle-plugin=5.1.5 # https://issues.apache.org/jira/browse/FELIX-6495 # https://issues.apache.org/jira/browse/FELIX-6496 +# https://issues.apache.org/jira/browse/FELIX-6602 to be fixed in 5.1.9 org.apache.karaf.tooling+karaf-maven-plugin=4.3.7 # https://issues.apache.org/jira/browse/KARAF-7367 org.apache.nifi+nifi-nar-maven-plugin=1.3.4 @@ -72,6 +73,9 @@ org.eclipse.jetty+jetty-jspc-maven-plugin=fail:https://github.com/eclipse/jetty. org.jboss.jandex+jandex-maven-plugin=fail:https://github.com/wildfly/jandex-maven-plugin/pull/35 +org.moditect+moditect-maven-plugin=1.0.0.Final +# https://github.com/moditect/moditect/pull/189 + org.springframework.boot+spring-boot-maven-plugin=2.7.1 # https://github.com/spring-projects/spring-boot/issues/21005 diff --git a/src/site/apt/plugin-issues.apt b/src/site/apt/plugin-issues.apt index 87080ed..0f7173d 100644 --- a/src/site/apt/plugin-issues.apt +++ b/src/site/apt/plugin-issues.apt @@ -46,7 +46,7 @@ Usage *--------+--------------------------------------------------------------------+-------+--------------+ | org.apache.maven.plugins | {{{/plugins/maven-remote-resources-plugin/}maven-remote-resources-plugin}} | 1.7.0 | *--------+--------------------------------------------------------------------+-------+--------------+ -| org.apache.maven.plugins | {{{/plugins/maven-shade-plugin/}maven-shade-plugin}} | - | no fixed release available, see {{{https://issues.apache.org/jira/browse/MSHADE-420}reference}} +| org.apache.maven.plugins | {{{/plugins/maven-shade-plugin/}maven-shade-plugin}} | 3.2.3 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.apache.maven.plugins | {{{/plugins/maven-source-plugin/}maven-source-plugin}} | 3.2.1 | *--------+--------------------------------------------------------------------+-------+--------------+ @@ -82,6 +82,8 @@ Usage *--------+--------------------------------------------------------------------+-------+--------------+ | org.jboss.jandex | jandex-maven-plugin | - | no fixed release available, see {{{https://github.com/wildfly/jandex-maven-plugin/pull/35}reference}} *--------+--------------------------------------------------------------------+-------+--------------+ +| org.moditect | moditect-maven-plugin | 1.0.0.Final | +*--------+--------------------------------------------------------------------+-------+--------------+ | org.springframework.boot | spring-boot-maven-plugin | 2.7.1 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.vafer | jdeb | 1.10 | From 512423ee5802a3b5c0084d37f0942f16ef6b483b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Thu, 13 Jul 2023 01:14:13 +0200 Subject: [PATCH 06/22] depends-maven-plugin 1.5.0 released --- .../artifact/buildinfo/not-reproducible-plugins.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties index 0b5a012..d890027 100644 --- a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties +++ b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties @@ -57,7 +57,8 @@ org.apache.karaf.tooling+karaf-maven-plugin=4.3.7 # https://issues.apache.org/jira/browse/KARAF-7367 org.apache.nifi+nifi-nar-maven-plugin=1.3.4 # https://issues.apache.org/jira/browse/NIFI-9857 -org.apache.servicemix.tooling+depends-maven-plugin=fail:https://issues.apache.org/jira/browse/SM-5021 +org.apache.servicemix.tooling+depends-maven-plugin=1.5.0 +# https://issues.apache.org/jira/browse/SM-5021 org.codehaus.plexus+plexus-component-metadata=2.1.0 # https://github.com/codehaus-plexus/plexus-containers/issues/27 From a6f41b7481a36b9cf86ab2e746b48dc88ca8e259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Thu, 13 Jul 2023 01:15:10 +0200 Subject: [PATCH 07/22] Felix maven-bundle-plugin 5.1.9 released --- .../artifact/buildinfo/not-reproducible-plugins.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties index d890027..7b24f6f 100644 --- a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties +++ b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties @@ -49,10 +49,10 @@ maven-acr-plugin=3.2.0 org.antlr+antlr3-maven-plugin=fail:https://github.com/antlr/antlr3/pull/195 -org.apache.felix+maven-bundle-plugin=5.1.5 +org.apache.felix+maven-bundle-plugin=5.1.9 # https://issues.apache.org/jira/browse/FELIX-6495 # https://issues.apache.org/jira/browse/FELIX-6496 -# https://issues.apache.org/jira/browse/FELIX-6602 to be fixed in 5.1.9 +# https://issues.apache.org/jira/browse/FELIX-6602 org.apache.karaf.tooling+karaf-maven-plugin=4.3.7 # https://issues.apache.org/jira/browse/KARAF-7367 org.apache.nifi+nifi-nar-maven-plugin=1.3.4 From 84972f69f8411a933f217231de87badde0dc0014 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 17 Sep 2023 22:35:36 +0200 Subject: [PATCH 08/22] upgrade plexus-utils 3.x to 4 + plexus-xml 3 --- pgp-keys-map.list | 3 ++- pom.xml | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pgp-keys-map.list b/pgp-keys-map.list index bbcb2e8..fb9fa4d 100644 --- a/pgp-keys-map.list +++ b/pgp-keys-map.list @@ -21,8 +21,9 @@ javax.inject:javax.inject = noSig org.apache.maven.* = 0xB920D295BF0E61CB4CF0896C33CD6733AF5EC452 org.apache.maven:maven-archiver = 0x29BEA2A645F2D6CED7FB12E02B172E3E156466E8 org.apache.maven.shared:maven-shared-utils = 0x82C9EC0E52C47A936A849E0113D979595E6D01E1 -org.codehaus.plexus = 0x6A814B1F869C2BBEAB7CB7271A2A1C94BDE89688 org.codehaus.plexus:plexus-archiver = 0x29BEA2A645F2D6CED7FB12E02B172E3E156466E8 org.codehaus.plexus:plexus-interpolation = 0x47063E8BA7A6450E4A52E7AE466CAED6E0747D50 org.codehaus.plexus:plexus-io = 0xF254B35617DC255D9344BCFA873A8E86B4372146 +org.codehaus.plexus:plexus-utils = 0xEA23DB1360D9029481E7F2EFECDFEA3CB4493B94 +org.codehaus.plexus:plexus-xml = 0xFA77DCFEF2EE6EB2DEBEDD2C012579464D01C06A org.slf4j:slf4j-api = 0x475F3B8E59E6E63AA78067482C7B12F2A511E325 diff --git a/pom.xml b/pom.xml index 0fad70c..f46d44a 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,12 @@ org.codehaus.plexus plexus-utils - 3.5.0 + 4.0.0 + + + org.codehaus.plexus + plexus-xml + 3.0.0 org.apache.maven.shared From 5b24d2c57203605148b3bced9189372c6a6dd0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Mon, 18 Sep 2023 08:36:13 +0200 Subject: [PATCH 09/22] [MARTIFACT-47] add compare.fail property --- .../maven/plugins/artifact/buildinfo/CompareMojo.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index 156e2d0..df5f00c 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -95,6 +95,13 @@ public class CompareMojo extends AbstractBuildinfoMojo { @Parameter(defaultValue = "${project.remoteProjectRepositories}", readonly = true) private List remoteRepos; + /** + * Fail the build if differences are found against reference build. + * @since 3.5.0 + */ + @Parameter(property = "compare.fail", defaultValue = "true") + private boolean fail; + @Component private ArtifactRepositoryLayout artifactRepositoryLayout; @@ -225,7 +232,7 @@ private void compareWithReference(Map artifacts, File referenc copyAggregateToRoot(buildcompare); - if (ko + missing > 0) { + if (fail && (ko + missing > 0)) { throw new MojoExecutionException("Build artifacts are different from reference"); } } From 69db93e2a352dff6a1d98ed5b3710d3ffd8a0c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Tue, 19 Sep 2023 08:43:42 +0200 Subject: [PATCH 10/22] add goals list in left menu --- src/site/site.xml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/site/site.xml b/src/site/site.xml index 6118408..fe4f25c 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -24,7 +24,11 @@ under the License. - + + + + + From 90281bcb31465797b070651583b46f95554d7d33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Tue, 19 Sep 2023 08:38:39 +0200 Subject: [PATCH 11/22] [MARTIFACT-44] improve documentation --- src/it/{flatten => compare-flatten}/invoker.properties | 4 +++- src/it/{flatten => compare-flatten}/modA/pom.xml | 0 src/it/{flatten => compare-flatten}/modB/pom.xml | 0 src/it/{flatten => compare-flatten}/pom.xml | 0 src/it/{flatten => compare-flatten}/verify.groovy | 0 src/it/compare-mono/invoker.properties | 2 ++ .../maven/plugins/artifact/buildinfo/BuildinfoMojo.java | 2 +- .../maven/plugins/artifact/buildinfo/CompareMojo.java | 8 ++++---- src/site/apt/index.apt.vm | 6 +++--- 9 files changed, 13 insertions(+), 9 deletions(-) rename src/it/{flatten => compare-flatten}/invoker.properties (82%) rename src/it/{flatten => compare-flatten}/modA/pom.xml (100%) rename src/it/{flatten => compare-flatten}/modB/pom.xml (100%) rename src/it/{flatten => compare-flatten}/pom.xml (100%) rename src/it/{flatten => compare-flatten}/verify.groovy (100%) diff --git a/src/it/flatten/invoker.properties b/src/it/compare-flatten/invoker.properties similarity index 82% rename from src/it/flatten/invoker.properties rename to src/it/compare-flatten/invoker.properties index 339a145..6350e3b 100644 --- a/src/it/flatten/invoker.properties +++ b/src/it/compare-flatten/invoker.properties @@ -15,5 +15,7 @@ # specific language governing permissions and limitations # under the License. +# initial reference build: install invoker.goals.1=clean install -invoker.goals.2=clean package artifact:compare +# second build: verify (could be package, but not install to avoid overriding reference) +invoker.goals.2=clean verify artifact:compare diff --git a/src/it/flatten/modA/pom.xml b/src/it/compare-flatten/modA/pom.xml similarity index 100% rename from src/it/flatten/modA/pom.xml rename to src/it/compare-flatten/modA/pom.xml diff --git a/src/it/flatten/modB/pom.xml b/src/it/compare-flatten/modB/pom.xml similarity index 100% rename from src/it/flatten/modB/pom.xml rename to src/it/compare-flatten/modB/pom.xml diff --git a/src/it/flatten/pom.xml b/src/it/compare-flatten/pom.xml similarity index 100% rename from src/it/flatten/pom.xml rename to src/it/compare-flatten/pom.xml diff --git a/src/it/flatten/verify.groovy b/src/it/compare-flatten/verify.groovy similarity index 100% rename from src/it/flatten/verify.groovy rename to src/it/compare-flatten/verify.groovy diff --git a/src/it/compare-mono/invoker.properties b/src/it/compare-mono/invoker.properties index fe14eb3..8bd5fc5 100644 --- a/src/it/compare-mono/invoker.properties +++ b/src/it/compare-mono/invoker.properties @@ -15,6 +15,8 @@ # specific language governing permissions and limitations # under the License. +# initial reference build: install invoker.goals.1=clean install +# second build: package (could be verify, but not install to avoid overriding reference) invoker.goals.2=clean package artifact:compare invoker.buildResult.2=failure diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java index 2d478ae..77c6de0 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildinfoMojo.java @@ -29,7 +29,7 @@ import org.apache.maven.project.MavenProjectHelper; /** - * Creates a buildinfo file recording build environment and output, as specified in + * Creates a buildinfo file recording build environment and output (from {@code package}), as specified in * Reproducible Builds for the JVM * for mono-module build, and extended for multi-module build. */ diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index df5f00c..aa1880b 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -46,8 +46,8 @@ import org.eclipse.aether.repository.RemoteRepository; /** - * Compare current build output with reference either previously installed or downloaded from a remote repository: - * results go to {@code .buildcompare} file. + * Compare current build output (from {@code package}) against reference either previously {@code install}-ed or downloaded from a remote + * repository: comparison results go to {@code .buildcompare} file. * * @since 3.2.0 */ @@ -68,7 +68,7 @@ public class CompareMojo extends AbstractBuildinfoMojo { private String referenceRepo; /** - * Compare aggregate only (ie wait for the last module) or do buildcompare on each module. + * Compare aggregate only (ie wait for the last module) or also compare on each module. * @since 3.2.0 */ @Parameter(property = "compare.aggregate.only", defaultValue = "false") @@ -124,7 +124,7 @@ protected void skip(MavenProject last) throws MojoExecutionException { /** * Check current build result with reference. * - * @artifacts a Map of artifacts added to the build info with their associated property key prefix + * @param artifacts a Map of artifacts added to the build info with their associated property key prefix * (outputs.[#module.].#artifact) * @throws MojoExecutionException */ diff --git a/src/site/apt/index.apt.vm b/src/site/apt/index.apt.vm index f1ff625..f7b73a6 100644 --- a/src/site/apt/index.apt.vm +++ b/src/site/apt/index.apt.vm @@ -32,11 +32,11 @@ ${project.name} * Goals Overview - The Artifact Plugin only has 3 goals currently: + The Artifact Plugin has 3 goals currently: - * {{{./buildinfo-mojo.html}artifact:buildinfo}} records current build results in {{{https://reproducible-builds.org/docs/jvm/}Reproducible Builds buildinfo}} file, + * {{{./buildinfo-mojo.html}artifact:buildinfo}} records current build results (from <<>>) in {{{https://reproducible-builds.org/docs/jvm/}Reproducible Builds buildinfo}} file, - * {{{./compare-mojo.html}artifact:compare}} compares current build output against reference build previously published, + * {{{./compare-mojo.html}artifact:compare}} compares current build output (from <<>>) against reference build previously published, * {{{./check-buildplan-mojo.html}artifact:check-buildplan}} checks the project's buildplan to find if any used {{{./plugin-issues.html}plugin has a known Reproducible Builds issue}}. From e5b7f8c39383076a56063938479d823a456ad44e Mon Sep 17 00:00:00 2001 From: Guillaume Nodet Date: Fri, 9 Jun 2023 09:23:41 +0200 Subject: [PATCH 12/22] [MARTIFACT-49] Supports the build/consumer feature (#18) --- .../artifact/buildinfo/BuildInfoWriter.java | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java index 6c09395..cb3d46d 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java @@ -23,6 +23,9 @@ import java.io.InputStream; import java.io.PrintWriter; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; @@ -162,6 +165,12 @@ void printArtifacts(MavenProject project) throws MojoExecutionException { p.println(prefix + "coordinates=" + project.getGroupId() + ':' + project.getArtifactId()); } + // detect Maven 4 consumer POM transient attachment + Artifact consumerPom = project.getAttachedArtifacts().stream() + .filter(a -> "pom".equals(a.getType()) && "consumer".equals(a.getClassifier())) + .findAny() + .orElse(null); + int n = 0; Artifact pomArtifact = new DefaultArtifact( project.getGroupId(), @@ -171,13 +180,25 @@ void printArtifacts(MavenProject project) throws MojoExecutionException { "pom", "", artifactHandlerManager.getArtifactHandler("pom")); - pomArtifact.setFile(project.getFile()); + if (consumerPom != null) { + // Maven 4 transient consumer POM attachment is published as the POM, overrides build POM, see + // https://github.com/apache/maven/blob/c79a7a02721f0f9fd7e202e99f60b593461ba8cc/maven-core/src/main/java/org/apache/maven/internal/transformation/ConsumerPomArtifactTransformer.java#L130-L155 + try { + Path pomFile = Files.createTempFile(Paths.get(project.getBuild().getDirectory()), "consumer-", ".pom"); + Files.copy(consumerPom.getFile().toPath(), pomFile, StandardCopyOption.REPLACE_EXISTING); + pomArtifact.setFile(pomFile.toFile()); + } catch (IOException e) { + p.println("Error processing consumer POM: " + e); + } + } else { + pomArtifact.setFile(project.getFile()); + } artifacts.put(pomArtifact, prefix + n); printFile( prefix + n++, pomArtifact.getGroupId(), - project.getFile(), + pomArtifact.getFile(), project.getArtifactId() + '-' + project.getVersion() + ".pom"); if (project.getArtifact() == null) { @@ -189,6 +210,10 @@ void printArtifacts(MavenProject project) throws MojoExecutionException { } for (Artifact attached : project.getAttachedArtifacts()) { + if (attached == consumerPom) { + // ignore consumer pom + continue; + } if (attached.getType().endsWith(".asc")) { // ignore pgp signatures continue; From 4ee029980bf933d1816cb4f73ea1fd05323ecfc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Thu, 21 Sep 2023 19:13:21 +0200 Subject: [PATCH 13/22] use @Component when available --- .../plugins/artifact/buildinfo/AbstractBuildinfoMojo.java | 4 ++-- .../plugins/artifact/buildinfo/CheckBuildPlanMojo.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java index 7a0e91e..b7574dc 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java @@ -54,7 +54,7 @@ public abstract class AbstractBuildinfoMojo extends AbstractMojo { /** * The Maven project. */ - @Parameter(defaultValue = "${project}", readonly = true) + @Component protected MavenProject project; /** @@ -102,7 +102,7 @@ public abstract class AbstractBuildinfoMojo extends AbstractMojo { /** * The current build session instance. This is used for toolchain manager API calls. */ - @Parameter(defaultValue = "${session}", readonly = true, required = true) + @Component private MavenSession session; /** diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java index 93e4aa3..859345d 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java @@ -52,13 +52,13 @@ */ @Mojo(name = "check-buildplan", threadSafe = true, requiresProject = true) public class CheckBuildPlanMojo extends AbstractMojo { - @Parameter(defaultValue = "${reactorProjects}", required = true, readonly = true) + @Component private List reactorProjects; - @Parameter(defaultValue = "${project}", readonly = true) + @Component private MavenProject project; - @Parameter(defaultValue = "${session}", readonly = true) + @Component private MavenSession session; @Component From 83353106894a3cb39fcafccaf1246315120bad36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Fri, 22 Sep 2023 07:56:22 +0200 Subject: [PATCH 14/22] [MARTIFACT-26] clarify IT objective --- src/it/buildinfo-dir/pom.xml | 3 ++- src/it/buildinfo-dir/verify.groovy | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/it/buildinfo-dir/verify.groovy diff --git a/src/it/buildinfo-dir/pom.xml b/src/it/buildinfo-dir/pom.xml index 823b2de..c2b8632 100644 --- a/src/it/buildinfo-dir/pom.xml +++ b/src/it/buildinfo-dir/pom.xml @@ -27,8 +27,9 @@ org.apache.maven.plugins.artifact.its apache-karaf pom - 4.3.3 + 4.3.10 Maven Artifact Plugin buildinfo IT: Apache Karaf :: Assemblies :: Default Distribution + regression check for https://issues.apache.org/jira/browse/MARTIFACT-26 UTF-8 diff --git a/src/it/buildinfo-dir/verify.groovy b/src/it/buildinfo-dir/verify.groovy new file mode 100644 index 0000000..ec85fac --- /dev/null +++ b/src/it/buildinfo-dir/verify.groovy @@ -0,0 +1,24 @@ + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +def buildLog = new File(basedir, 'build.log').text + +// https://issues.apache.org/jira/browse/MARTIFACT-26 +assert buildLog.contains('[WARNING] Ignoring artifact org.apache.maven.plugins.artifact.its:apache-karaf:pom:4.3.10 because it points to inexistent ') \ No newline at end of file From 3f83ae17e47e133491f8637af501303b3942e3be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Fri, 22 Sep 2023 07:00:20 +0200 Subject: [PATCH 15/22] [MARTIFACT-48] ignore by glob on $groupId/$filename --- src/it/buildinfo-multi/pom.xml | 17 ++++++++++ src/it/buildinfo-multi/verify.groovy | 4 +++ src/it/compare-mono/invoker.properties | 4 +-- src/it/compare-mono/pom.xml | 14 ++++++++ src/it/compare-mono/verify.groovy | 2 ++ .../buildinfo/AbstractBuildinfoMojo.java | 8 ++--- .../artifact/buildinfo/BuildInfoWriter.java | 32 ++++++++----------- .../artifact/buildinfo/CompareMojo.java | 18 +++++++++-- 8 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/it/buildinfo-multi/pom.xml b/src/it/buildinfo-multi/pom.xml index 0bf5e32..3100ff9 100644 --- a/src/it/buildinfo-multi/pom.xml +++ b/src/it/buildinfo-multi/pom.xml @@ -56,6 +56,18 @@ + + org.spdx + spdx-maven-plugin + 0.6.3 + + + + createSPDX + + + + @project.groupId@ @project.artifactId@ @@ -65,6 +77,11 @@ buildinfo + + + */*.spdx.json + + diff --git a/src/it/buildinfo-multi/verify.groovy b/src/it/buildinfo-multi/verify.groovy index 81e47b1..be0f8e5 100644 --- a/src/it/buildinfo-multi/verify.groovy +++ b/src/it/buildinfo-multi/verify.groovy @@ -39,9 +39,13 @@ assert buildinfo.contains( "version=1.0-SNAPSHOT" ) assert buildinfo.contains( "outputs.1.coordinates=org.apache.maven.plugins.it:multi-modA" ) assert buildinfo.contains( "outputs.1.0.filename=multi-modA-1.0-SNAPSHOT.pom" ) assert buildinfo.contains( "outputs.1.1.filename=multi-modA-1.0-SNAPSHOT.jar" ) +assert !buildinfo.contains( "outputs.1.2.filename=" ) +assert buildinfo.contains( "# ignored multi-modA-1.0-SNAPSHOT.spdx.json" ) assert buildinfo.contains( "outputs.2.coordinates=org.apache.maven.plugins.it:multi-modB" ) assert buildinfo.contains( "outputs.2.0.filename=multi-modB-1.0-SNAPSHOT.pom" ) assert buildinfo.contains( "outputs.2.1.filename=multi-modB-1.0-SNAPSHOT.jar" ) +assert !buildinfo.contains( "outputs.2.2.filename=" ) +assert buildinfo.contains( "# ignored multi-modB-1.0-SNAPSHOT.spdx.json" ) assert !buildinfo.contains( ".buildinfo" ) assert buildinfo.contains( "mvn.aggregate.artifact-id=multi-modB" ) diff --git a/src/it/compare-mono/invoker.properties b/src/it/compare-mono/invoker.properties index 8bd5fc5..5606b12 100644 --- a/src/it/compare-mono/invoker.properties +++ b/src/it/compare-mono/invoker.properties @@ -17,6 +17,6 @@ # initial reference build: install invoker.goals.1=clean install -# second build: package (could be verify, but not install to avoid overriding reference) -invoker.goals.2=clean package artifact:compare +# second build: verify (could be package, but not install to avoid overriding reference) +invoker.goals.2=clean verify artifact:compare -Dbuildinfo.ignore=*/*.spdx.json invoker.buildResult.2=failure diff --git a/src/it/compare-mono/pom.xml b/src/it/compare-mono/pom.xml index 098b7c5..750703e 100644 --- a/src/it/compare-mono/pom.xml +++ b/src/it/compare-mono/pom.xml @@ -70,5 +70,19 @@ + + + org.spdx + spdx-maven-plugin + 0.6.3 + + + + createSPDX + + + + + diff --git a/src/it/compare-mono/verify.groovy b/src/it/compare-mono/verify.groovy index 413d44b..4fd75f0 100644 --- a/src/it/compare-mono/verify.groovy +++ b/src/it/compare-mono/verify.groovy @@ -28,8 +28,10 @@ String compare = compareFile.text assert compare.contains( "version=1.0-SNAPSHOT" ) assert compare.contains( "ok=1" ) assert compare.contains( "ko=1" ) +assert compare.contains( "ignored=1" ) assert compare.contains( 'okFiles="mono-1.0-SNAPSHOT.pom"' ) assert compare.contains( 'koFiles="mono-1.0-SNAPSHOT.jar"' ) +assert compare.contains( 'ignoredFiles="mono-1.0-SNAPSHOT.spdx.json"' ) if( File.separator == '/' ) { assert compare.contains( '# diffoscope target/reference/org.apache.maven.plugins.it.compare/mono-1.0-SNAPSHOT.jar target/mono-1.0-SNAPSHOT.jar' ) } else { diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java index b7574dc..4f20681 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java @@ -29,7 +29,6 @@ import java.util.Date; import java.util.List; import java.util.Map; -import java.util.Set; import org.apache.maven.archiver.MavenArchiver; import org.apache.maven.artifact.Artifact; @@ -79,10 +78,11 @@ public abstract class AbstractBuildinfoMojo extends AbstractMojo { private boolean ignoreJavadoc; /** - * Artifacts to ignore, specified as extension or classifier.extension. + * Artifacts to ignore, specified as a glob matching against ${groupId}/${filename}, for example + * */*.xml. */ @Parameter(property = "buildinfo.ignore", defaultValue = "") - private Set ignore; + private List ignore; /** * Detect projects/modules with install or deploy skipped: avoid taking fingerprints. @@ -216,7 +216,7 @@ protected void copyAggregateToRoot(File aggregate) throws MojoExecutionException * @param mono is it a mono-module build? * @return a Map of artifacts added to the build info with their associated property key prefix * (outputs.[#module.].#artifact) - * @throws MojoExecutionException + * @throws MojoExecutionException if anything goes wrong */ protected Map generateBuildinfo(boolean mono) throws MojoExecutionException { MavenProject root = mono ? project : getExecutionRoot(); diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java index cb3d46d..42d1dd2 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/BuildInfoWriter.java @@ -22,14 +22,9 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; -import java.util.Set; +import java.nio.file.*; +import java.util.*; +import java.util.stream.Collectors; import org.apache.commons.codec.digest.DigestUtils; import org.apache.maven.artifact.Artifact; @@ -41,6 +36,7 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.rtinfo.RuntimeInformation; import org.apache.maven.shared.utils.PropertyUtils; +import org.apache.maven.shared.utils.StringUtils; import org.apache.maven.toolchain.Toolchain; /** @@ -55,7 +51,7 @@ class BuildInfoWriter { private final Map artifacts = new LinkedHashMap<>(); private int projectCount = -1; private boolean ignoreJavadoc = true; - private Set ignore; + private List ignore; private Toolchain toolchain; BuildInfoWriter( @@ -223,6 +219,8 @@ void printArtifacts(MavenProject project) throws MojoExecutionException { continue; } if (isIgnore(attached)) { + p.println("# ignored " + getArtifactFilename(attached)); + artifacts.put(attached, null); continue; } printArtifact(prefix, n++, attached); @@ -251,7 +249,7 @@ private void printArtifact(String prefix, int i, Artifact artifact) throws MojoE artifacts.put(artifact, prefix); } - private String getArtifactFilename(Artifact artifact) { + static String getArtifactFilename(Artifact artifact) { StringBuilder path = new StringBuilder(128); path.append(artifact.getArtifactId()).append('-').append(artifact.getBaseVersion()); @@ -262,8 +260,7 @@ private String getArtifactFilename(Artifact artifact) { ArtifactHandler artifactHandler = artifact.getArtifactHandler(); - if (artifactHandler.getExtension() != null - && artifactHandler.getExtension().length() > 0) { + if (StringUtils.isNotEmpty(artifactHandler.getExtension())) { path.append('.').append(artifactHandler.getExtension()); } @@ -317,15 +314,14 @@ void setIgnoreJavadoc(boolean ignoreJavadoc) { this.ignoreJavadoc = ignoreJavadoc; } - void setIgnore(Set ignore) { - this.ignore = ignore; + void setIgnore(List ignore) { + FileSystem fs = FileSystems.getDefault(); + this.ignore = ignore.stream().map(i -> fs.getPathMatcher("glob:" + i)).collect(Collectors.toList()); } private boolean isIgnore(Artifact attached) { - String classifier = attached.getClassifier(); - String extension = attached.getType(); - String search = (classifier == null) ? "" : (classifier + '.') + extension; - return ignore.contains(search); + Path path = Paths.get(attached.getGroupId() + '/' + getArtifactFilename(attached)); + return ignore.stream().anyMatch(m -> m.matches(path)); } public void setToolchain(Toolchain toolchain) { diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index aa1880b..52d49d1 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -45,6 +45,8 @@ import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.repository.RemoteRepository; +import static org.apache.maven.plugins.artifact.buildinfo.BuildInfoWriter.getArtifactFilename; + /** * Compare current build output (from {@code package}) against reference either previously {@code install}-ed or downloaded from a remote * repository: comparison results go to {@code .buildcompare} file. @@ -166,10 +168,16 @@ private void compareWithReference(Map artifacts, File referenc List okFilenames = new ArrayList<>(); List koFilenames = new ArrayList<>(); List diffoscopes = new ArrayList<>(); + List ignored = new ArrayList<>(); File referenceDir = referenceBuildinfo.getParentFile(); for (Map.Entry entry : artifacts.entrySet()) { Artifact artifact = entry.getKey(); String prefix = entry.getValue(); + if (prefix == null) { + // ignored file + ignored.add(getArtifactFilename(artifact)); + continue; + } String[] checkResult = checkArtifact(artifact, prefix, reference, actual, referenceDir); String filename = checkResult[0]; @@ -184,14 +192,15 @@ private void compareWithReference(Map artifacts, File referenc } } - int ko = artifacts.size() - ok; + int ko = artifacts.size() - ok - ignored.size(); int missing = reference.size() / 3 /* 3 property keys par file: filename, length and checksums.sha512 */; if (ko + missing > 0) { getLog().error("Reproducible Build output summary: " + MessageUtils.buffer().success(ok + " files ok") + ", " + MessageUtils.buffer().failure(ko + " different") - + ((missing == 0) ? "" : (", " + MessageUtils.buffer().failure(missing + " missing")))); + + ((missing == 0) ? "" : (", " + MessageUtils.buffer().failure(missing + " missing"))) + + ((ignored.isEmpty()) ? "" : (", " + MessageUtils.buffer().warning(ignored.size() + " ignored")))); getLog().error("see " + MessageUtils.buffer() .project("diff " + relative(referenceBuildinfo) + " " + relative(buildinfoFile)) @@ -199,7 +208,8 @@ private void compareWithReference(Map artifacts, File referenc getLog().error("see also https://maven.apache.org/guides/mini/guide-reproducible-builds.html"); } else { getLog().info("Reproducible Build output summary: " - + MessageUtils.buffer().success(ok + " files ok")); + + MessageUtils.buffer().success(ok + " files ok") + + ((ignored.isEmpty()) ? "" : (", " + MessageUtils.buffer().warning(ignored.size() + " ignored")))); } // save .compare file @@ -210,8 +220,10 @@ private void compareWithReference(Map artifacts, File referenc p.println("version=" + project.getVersion()); p.println("ok=" + ok); p.println("ko=" + ko); + p.println("ignored=" + ignored.size()); p.println("okFiles=\"" + StringUtils.join(okFilenames.iterator(), " ") + '"'); p.println("koFiles=\"" + StringUtils.join(koFilenames.iterator(), " ") + '"'); + p.println("ignoredFiles=\"" + StringUtils.join(ignored.iterator(), " ") + '"'); Properties ref = PropertyUtils.loadOptionalProperties(referenceBuildinfo); String v = ref.getProperty("java.version"); if (v != null) { From b3e352994c6a914f7245343d261eb7e59dc0ecd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 24 Sep 2023 17:38:31 +0200 Subject: [PATCH 16/22] update issues --- .../buildinfo/not-reproducible-plugins.properties | 5 +++-- src/site/apt/plugin-issues.apt | 8 +++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties index 7b24f6f..4a0c833 100644 --- a/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties +++ b/src/main/resources/org/apache/maven/plugins/artifact/buildinfo/not-reproducible-plugins.properties @@ -47,7 +47,7 @@ maven-acr-plugin=3.2.0 # plugin-specific groupId -org.antlr+antlr3-maven-plugin=fail:https://github.com/antlr/antlr3/pull/195 +org.antlr+antlr3-maven-plugin=fail:https://github.com/antlr/antlr3/pull/209 org.apache.felix+maven-bundle-plugin=5.1.9 # https://issues.apache.org/jira/browse/FELIX-6495 @@ -66,7 +66,8 @@ org.codehaus.mojo+jaxb2-maven-plugin=fail:https://github.com/mojohaus/jaxb2-mave # org.codehaus.mojo+properties-maven-plugin=1.1.0 # https://github.com/mojohaus/properties-maven-plugin/pull/75 -org.codehaus.mojo+flatten-maven-plugin=fail:https://github.com/mojohaus/flatten-maven-plugin/issues/256 +#org.codehaus.mojo+flatten-maven-plugin=fail:https://github.com/mojohaus/flatten-maven-plugin/issues/256 +# no issue in flatten-maven-plugin: t's a question of choice of Maven version: with 3.8.2+, it writes groupId then artifactId, with 3.8.1- it writes artifactId then groupId org.eclipse.sisu+sisu-maven-plugin=0.3.4 # https://github.com/eclipse/sisu.inject/pull/5 diff --git a/src/site/apt/plugin-issues.apt b/src/site/apt/plugin-issues.apt index 0f7173d..b53abbd 100644 --- a/src/site/apt/plugin-issues.apt +++ b/src/site/apt/plugin-issues.apt @@ -58,15 +58,15 @@ Usage *--------+--------------------------------------------------------------------+-------+--------------+ | org.apache.maven.plugins | {{{/plugins/maven-acr-plugin/}maven-acr-plugin}} | 3.2.0 | *--------+--------------------------------------------------------------------+-------+--------------+ -| org.antlr | antlr3-maven-plugin | - | no fixed release available, see {{{https://github.com/antlr/antlr3/pull/195}reference}} +| org.antlr | antlr3-maven-plugin | - | no fixed release available, see {{{https://github.com/antlr/antlr3/pull/209}reference}} *--------+--------------------------------------------------------------------+-------+--------------+ -| org.apache.felix | maven-bundle-plugin | 5.1.5 | +| org.apache.felix | maven-bundle-plugin | 5.1.9 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.apache.karaf.tooling | karaf-maven-plugin | 4.3.7 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.apache.nifi | nifi-nar-maven-plugin | 1.3.4 | *--------+--------------------------------------------------------------------+-------+--------------+ -| org.apache.servicemix.tooling | depends-maven-plugin | - | no fixed release available, see {{{https://issues.apache.org/jira/browse/SM-5021}reference}} +| org.apache.servicemix.tooling | depends-maven-plugin | 1.5.0 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.codehaus.plexus | plexus-component-metadata | 2.1.0 | *--------+--------------------------------------------------------------------+-------+--------------+ @@ -74,8 +74,6 @@ Usage *--------+--------------------------------------------------------------------+-------+--------------+ | org.codehaus.mojo | properties-maven-plugin | 1.1.0 | *--------+--------------------------------------------------------------------+-------+--------------+ -| org.codehaus.mojo | flatten-maven-plugin | - | no fixed release available, see {{{https://github.com/mojohaus/flatten-maven-plugin/issues/256}reference}} -*--------+--------------------------------------------------------------------+-------+--------------+ | org.eclipse.sisu | sisu-maven-plugin | 0.3.4 | *--------+--------------------------------------------------------------------+-------+--------------+ | org.eclipse.jetty | jetty-jspc-maven-plugin | - | no fixed release available, see {{{https://github.com/eclipse/jetty.project/}reference}} From ccc42064225965fa8274dde606bcb1c1b0466174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 24 Sep 2023 18:29:41 +0200 Subject: [PATCH 17/22] add menu entry for plugins issues --- .../maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java | 2 +- src/site/site.xml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java index 859345d..9f5cc8a 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java @@ -46,7 +46,7 @@ import org.apache.maven.project.MavenProject; /** - * Check from buildplan that plugins used don't have known reproducible builds issues. + * Check from buildplan that plugins used don't have known Reproducible Builds issues. * * @since 3.3.0 */ diff --git a/src/site/site.xml b/src/site/site.xml index fe4f25c..f04668d 100644 --- a/src/site/site.xml +++ b/src/site/site.xml @@ -27,7 +27,9 @@ under the License. - + + + From 0acc794e9f7bd6744004c5fb2ae8e57165c4c66c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Sun, 24 Sep 2023 18:48:19 +0200 Subject: [PATCH 18/22] apply improvements proposed by IDE --- .../buildinfo/AbstractBuildinfoMojo.java | 4 +- .../buildinfo/CheckBuildPlanMojo.java | 4 +- .../artifact/buildinfo/CompareMojo.java | 12 +- .../artifact/buildinfo/JdkToolchainUtil.java | 4 +- .../artifact/buildinfo/PluginUtil.java | 2 +- .../buildinfo/ReferenceBuildinfoUtil.java | 140 +++++++++--------- 6 files changed, 81 insertions(+), 85 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java index 4f20681..c3a485f 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java @@ -20,11 +20,11 @@ import java.io.BufferedWriter; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @@ -224,7 +224,7 @@ protected Map generateBuildinfo(boolean mono) throws MojoExecu buildinfoFile.getParentFile().mkdirs(); try (PrintWriter p = new PrintWriter(new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(buildinfoFile), StandardCharsets.UTF_8)))) { + new OutputStreamWriter(Files.newOutputStream(buildinfoFile.toPath()), StandardCharsets.UTF_8)))) { BuildInfoWriter bi = new BuildInfoWriter(getLog(), p, mono, artifactHandlerManager, rtInformation); bi.setIgnoreJavadoc(ignoreJavadoc); bi.setIgnore(ignore); diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java index 9f5cc8a..f8fcf68 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CheckBuildPlanMojo.java @@ -19,9 +19,9 @@ package org.apache.maven.plugins.artifact.buildinfo; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashSet; @@ -194,7 +194,7 @@ private boolean hasBadOutputTimestamp() { private Properties loadIssues() throws MojoExecutionException { try (InputStream in = (pluginIssues == null) ? getClass().getResourceAsStream("not-reproducible-plugins.properties") - : new FileInputStream(pluginIssues)) { + : Files.newInputStream(pluginIssues.toPath())) { Properties prop = new Properties(); prop.load(in); diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java index 52d49d1..02a5cf8 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/CompareMojo.java @@ -20,11 +20,11 @@ import java.io.BufferedWriter; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -128,7 +128,7 @@ protected void skip(MavenProject last) throws MojoExecutionException { * * @param artifacts a Map of artifacts added to the build info with their associated property key prefix * (outputs.[#module.].#artifact) - * @throws MojoExecutionException + * @throws MojoExecutionException if anything goes wrong */ private void checkAgainstReference(Map artifacts, boolean mono) throws MojoExecutionException { MavenProject root = mono ? project : getExecutionRoot(); @@ -216,7 +216,7 @@ private void compareWithReference(Map artifacts, File referenc File buildcompare = new File( buildinfoFile.getParentFile(), buildinfoFile.getName().replaceFirst(".buildinfo$", ".buildcompare")); try (PrintWriter p = new PrintWriter(new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(buildcompare), StandardCharsets.UTF_8)))) { + new OutputStreamWriter(Files.newOutputStream(buildcompare.toPath()), StandardCharsets.UTF_8)))) { p.println("version=" + project.getVersion()); p.println("ok=" + ok); p.println("ko=" + ko); @@ -282,10 +282,8 @@ private String diffoscope(Artifact a, File referenceDir) { // notice: actual file name may have been defined in pom // reference file name is taken from repository format File reference = new File(new File(referenceDir, a.getGroupId()), getRepositoryFilename(a)); - if ((actual == null) || (reference == null)) { - return "missing file for " + a.getId() + " reference = " - + (reference == null ? "null" : relative(reference)) + " actual = " - + (actual == null ? "null" : relative(actual)); + if (actual == null) { + return "missing file for " + a.getId() + " reference = " + relative(reference) + " actual = null"; } return "diffoscope " + relative(reference) + " " + relative(actual); } diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/JdkToolchainUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/JdkToolchainUtil.java index de3919e..c6a044f 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/JdkToolchainUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/JdkToolchainUtil.java @@ -43,7 +43,7 @@ static String getJavaVersion(Toolchain toolchain) { LineConsumer err = new LineConsumer(); CommandLineUtils.executeCommandLine(cl, out, err); version = StringUtils.join(err.getLines().iterator(), ":"); - if (version == null) { + if (StringUtils.isEmpty(version)) { version = "unable to detect..."; } } catch (CommandLineException cle) { @@ -54,7 +54,7 @@ static String getJavaVersion(Toolchain toolchain) { } private static class LineConsumer implements StreamConsumer { - private List lines = new ArrayList<>(); + private final List lines = new ArrayList<>(); @Override public void consumeLine(String line) throws IOException { diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java index 606d3ad..58b126c 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java @@ -38,7 +38,7 @@ private static boolean isSkip(MavenProject project, String id) { if (skip == null) { skip = project.getProperties().getProperty("maven." + id + ".skip"); } - return Boolean.valueOf(skip); + return Boolean.parseBoolean(skip); } private static Plugin getPlugin(MavenProject project, String plugin) { diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java index 1f8776a..d14184c 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/ReferenceBuildinfoUtil.java @@ -20,12 +20,12 @@ import java.io.BufferedWriter; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -122,89 +122,87 @@ File downloadOrCreateReferenceBuildinfo( referenceBuildinfo = null; } - if (referenceBuildinfo == null) { - // download reference artifacts and guess Java version and OS - String javaVersion = null; - String osName = null; - String currentJavaVersion = null; - String currentOsName = null; - Map referenceArtifacts = new HashMap<>(); - for (Artifact artifact : artifacts.keySet()) { - try { - // download - File file = downloadReference(repo, artifact); - referenceArtifacts.put(artifact, file); - - // guess Java version and OS - if ((javaVersion == null) && JAR_TYPES.contains(artifact.getType())) { - ReproducibleEnv env = extractEnv(file, artifact); - if ((env != null) && (env.javaVersion != null)) { - javaVersion = env.javaVersion; - osName = env.osName; - - ReproducibleEnv currentEnv = extractEnv(artifact.getFile(), artifact); - currentJavaVersion = currentEnv.javaVersion; - currentOsName = currentEnv.osName; - } + // download reference artifacts and guess Java version and OS + String javaVersion = null; + String osName = null; + String currentJavaVersion = null; + String currentOsName = null; + Map referenceArtifacts = new HashMap<>(); + for (Artifact artifact : artifacts.keySet()) { + try { + // download + File file = downloadReference(repo, artifact); + referenceArtifacts.put(artifact, file); + + // guess Java version and OS + if ((javaVersion == null) && JAR_TYPES.contains(artifact.getType())) { + ReproducibleEnv env = extractEnv(file, artifact); + if ((env != null) && (env.javaVersion != null)) { + javaVersion = env.javaVersion; + osName = env.osName; + + ReproducibleEnv currentEnv = extractEnv(artifact.getFile(), artifact); + currentJavaVersion = currentEnv.javaVersion; + currentOsName = currentEnv.osName; } - } catch (ArtifactNotFoundException e) { - log.warn("Reference artifact not found " + artifact); } + } catch (ArtifactNotFoundException e) { + log.warn("Reference artifact not found " + artifact); } + } - // generate buildinfo from reference artifacts - referenceBuildinfo = getReference(null, buildinfoFile); - try (PrintWriter p = new PrintWriter(new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(referenceBuildinfo), StandardCharsets.UTF_8)))) { - BuildInfoWriter bi = new BuildInfoWriter(log, p, mono, artifactHandlerManager, rtInformation); - - if (javaVersion != null || osName != null) { - p.println("# effective build environment information"); - if (javaVersion != null) { - p.println("java.version=" + javaVersion); - log.info("Reference build java.version: " + javaVersion); - if (!javaVersion.equals(currentJavaVersion)) { - log.error("Current build java.version: " + currentJavaVersion); - } - } - if (osName != null) { - p.println("os.name=" + osName); - log.info("Reference build os.name: " + osName); - - // check against current line separator - if (!osName.equals(currentOsName)) { - log.error("Current build os.name: " + currentOsName); - } - String expectedLs = osName.startsWith("Windows") ? "\r\n" : "\n"; - if (!expectedLs.equals(System.lineSeparator())) { - log.warn("Current System.lineSeparator() does not match reference build OS"); - - String ls = System.getProperty("line.separator"); - if (!ls.equals(System.lineSeparator())) { - log.warn("System.lineSeparator() != System.getProperty( \"line.separator\" ): " - + "too late standard system property update..."); - } - } + // generate buildinfo from reference artifacts + referenceBuildinfo = getReference(null, buildinfoFile); + try (PrintWriter p = new PrintWriter(new BufferedWriter( + new OutputStreamWriter(Files.newOutputStream(referenceBuildinfo.toPath()), StandardCharsets.UTF_8)))) { + BuildInfoWriter bi = new BuildInfoWriter(log, p, mono, artifactHandlerManager, rtInformation); + + if (javaVersion != null || osName != null) { + p.println("# effective build environment information"); + if (javaVersion != null) { + p.println("java.version=" + javaVersion); + log.info("Reference build java.version: " + javaVersion); + if (!javaVersion.equals(currentJavaVersion)) { + log.error("Current build java.version: " + currentJavaVersion); } } + if (osName != null) { + p.println("os.name=" + osName); + log.info("Reference build os.name: " + osName); - for (Map.Entry entry : artifacts.entrySet()) { - Artifact artifact = entry.getKey(); - String prefix = entry.getValue(); - File referenceFile = referenceArtifacts.get(artifact); - if (referenceFile != null) { - bi.printFile(prefix, artifact.getGroupId(), referenceFile); + // check against current line separator + if (!osName.equals(currentOsName)) { + log.error("Current build os.name: " + currentOsName); + } + String expectedLs = osName.startsWith("Windows") ? "\r\n" : "\n"; + if (!expectedLs.equals(System.lineSeparator())) { + log.warn("Current System.lineSeparator() does not match reference build OS"); + + String ls = System.getProperty("line.separator"); + if (!ls.equals(System.lineSeparator())) { + log.warn("System.lineSeparator() != System.getProperty( \"line.separator\" ): " + + "too late standard system property update..."); + } } } + } - if (p.checkError()) { - throw new MojoExecutionException("Write error to " + referenceBuildinfo); + for (Map.Entry entry : artifacts.entrySet()) { + Artifact artifact = entry.getKey(); + String prefix = entry.getValue(); + File referenceFile = referenceArtifacts.get(artifact); + if (referenceFile != null) { + bi.printFile(prefix, artifact.getGroupId(), referenceFile); } + } - log.info("Minimal buildinfo generated from downloaded artifacts: " + referenceBuildinfo); - } catch (IOException e) { - throw new MojoExecutionException("Error creating file " + referenceBuildinfo, e); + if (p.checkError()) { + throw new MojoExecutionException("Write error to " + referenceBuildinfo); } + + log.info("Minimal buildinfo generated from downloaded artifacts: " + referenceBuildinfo); + } catch (IOException e) { + throw new MojoExecutionException("Error creating file " + referenceBuildinfo, e); } return referenceBuildinfo; From 73c17c397c666a11eb6e7f06a56a80f807cf1113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Thu, 28 Sep 2023 08:35:19 +0200 Subject: [PATCH 19/22] [MARTIFACT-34] add nexus-staging skip detection --- .../artifact/buildinfo/PluginUtil.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java index 58b126c..74c30b5 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/PluginUtil.java @@ -25,18 +25,35 @@ import org.codehaus.plexus.util.xml.Xpp3Dom; /** - * Plugin utility to detect if install or deploy is skipped in a build. + * Plugin utility to detect if install or deploy is skipped in a build, or even nexus-staging. + * It supports both disabling by parameter configuration or property. + * Known limitation: it does not look at configuration done more precisely at plugin execution level. */ class PluginUtil { + private static final String NEXUS_STAGING = "nexus-staging"; + static boolean isSkip(MavenProject project) { - return isSkip(project, "install") || isSkip(project, "deploy"); + return isSkip(project, "install") || isSkip(project, "deploy") || isSkip(project, NEXUS_STAGING); } private static boolean isSkip(MavenProject project, String id) { - Plugin plugin = getPlugin(project, "org.apache.maven.plugins:maven-" + id + "-plugin"); - String skip = getPluginParameter(plugin, "skip"); + String pluginGa; + String pluginParameter; + String pluginProperty; + if (id.equals(NEXUS_STAGING)) { + pluginGa = "org.sonatype.plugins:" + id + "-maven-plugin"; + pluginParameter = "skipNexusStagingDeployMojo"; + pluginProperty = "skipNexusStagingDeployMojo"; + } else { + pluginGa = "org.apache.maven.plugins:maven-" + id + "-plugin"; + pluginParameter = "skip"; + pluginProperty = "maven." + id + ".skip"; + } + + Plugin plugin = getPlugin(project, pluginGa); + String skip = getPluginParameter(plugin, pluginParameter); if (skip == null) { - skip = project.getProperties().getProperty("maven." + id + ".skip"); + skip = project.getProperties().getProperty(pluginProperty); } return Boolean.parseBoolean(skip); } From bd9212938774eb5217193956cef3acb4a0028946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Thu, 28 Sep 2023 09:39:15 +0200 Subject: [PATCH 20/22] [MARTIFACT-50] add skipModules parameter --- .../modSkipModule/pom.xml | 34 +++++++++++++++++++ src/it/buildinfo-skip-install-deploy/pom.xml | 6 ++++ .../buildinfo/AbstractBuildinfoMojo.java | 27 +++++++++++++-- 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/it/buildinfo-skip-install-deploy/modSkipModule/pom.xml diff --git a/src/it/buildinfo-skip-install-deploy/modSkipModule/pom.xml b/src/it/buildinfo-skip-install-deploy/modSkipModule/pom.xml new file mode 100644 index 0000000..4cf60b8 --- /dev/null +++ b/src/it/buildinfo-skip-install-deploy/modSkipModule/pom.xml @@ -0,0 +1,34 @@ + + + + + + 4.0.0 + + + org.apache.maven.plugins.it + multi + 1.0-SNAPSHOT + + multi-mod-skip-module + multi-module module that will be skipped by configuring artifact plugin with skipModules + then should not be added to buildinfo + diff --git a/src/it/buildinfo-skip-install-deploy/pom.xml b/src/it/buildinfo-skip-install-deploy/pom.xml index f0a1092..43108f7 100644 --- a/src/it/buildinfo-skip-install-deploy/pom.xml +++ b/src/it/buildinfo-skip-install-deploy/pom.xml @@ -50,6 +50,7 @@ modSkipInstall modSkipDeploy + modSkipModule modB modA modSkipAtEnd @@ -66,6 +67,11 @@ buildinfo + + + */*-module + + diff --git a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java index c3a485f..33c4b27 100644 --- a/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java +++ b/src/main/java/org/apache/maven/plugins/artifact/buildinfo/AbstractBuildinfoMojo.java @@ -24,11 +24,12 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; +import java.nio.file.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.apache.maven.archiver.MavenArchiver; import org.apache.maven.artifact.Artifact; @@ -90,6 +91,15 @@ public abstract class AbstractBuildinfoMojo extends AbstractMojo { @Parameter(property = "buildinfo.detect.skip", defaultValue = "true") private boolean detectSkip; + /** + * Avoid taking fingerprints for modules specified as glob matching against ${groupId}/${artifactId}. + * @since 3.5.0 + */ + @Parameter + private List skipModules; + + private List skipModulesMatcher = null; + /** * Makes the generated {@code .buildinfo} file reproducible, by dropping detailed environment recording: OS will be * recorded as "Windows" or "Unix", JVM version as major version only. @@ -274,7 +284,20 @@ private MavenProject getLastProject() { } private boolean isSkip(MavenProject project) { - return detectSkip && PluginUtil.isSkip(project); + // manual/configured module skip + boolean skipModule = false; + if (skipModules != null && !skipModules.isEmpty()) { + if (skipModulesMatcher == null) { + FileSystem fs = FileSystems.getDefault(); + skipModulesMatcher = skipModules.stream() + .map(i -> fs.getPathMatcher("glob:" + i)) + .collect(Collectors.toList()); + } + Path path = Paths.get(project.getGroupId() + '/' + project.getArtifactId()); + skipModule = skipModulesMatcher.stream().anyMatch(m -> m.matches(path)); + } + // detected skip + return skipModule || (detectSkip && PluginUtil.isSkip(project)); } private Toolchain getToolchain() { From c4d05b37cda1c464ac5732575504f4b6bd50f8a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Fri, 29 Sep 2023 07:48:01 +0200 Subject: [PATCH 21/22] upgrade parent POM --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f46d44a..cac5668 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ org.apache.maven.plugins maven-plugins - 39 + 40 From ff8247d355478ebd9aab863352eb099077812196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Boutemy?= Date: Fri, 29 Sep 2023 07:51:34 +0200 Subject: [PATCH 22/22] [maven-release-plugin] prepare release maven-artifact-plugin-3.5.0 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index cac5668..a2f378b 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ maven-artifact-plugin - 3.5.0-SNAPSHOT + 3.5.0 maven-plugin Apache Maven Artifact Plugin @@ -41,7 +41,7 @@ scm:git:https://gitbox.apache.org/repos/asf/maven-artifact-plugin.git scm:git:https://gitbox.apache.org/repos/asf/maven-artifact-plugin.git - master + maven-artifact-plugin-3.5.0 https://github.com/apache/maven-artifact-plugin/tree/${project.scm.tag} @@ -62,7 +62,7 @@ 3.2.5 8 - 2023-03-05T18:05:11Z + 2023-09-29T05:51:29Z