You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2020/03/02 06:54:44 UTC
[maven-studies] 01/02: download reference buildinfo file
This is an automated email from the ASF dual-hosted git repository.
hboutemy pushed a commit to branch maven-buildinfo-plugin
in repository https://gitbox.apache.org/repos/asf/maven-studies.git
commit 4522f560e24dd4dc88718533be286a0974324246
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Sun Mar 1 18:04:24 2020 +0100
download reference buildinfo file
---
pom.xml | 12 +-
.../apache/maven/plugins/buildinfo/SaveMojo.java | 127 +++++++++++++++++++--
2 files changed, 124 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0b03588..d827f5e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -93,6 +93,12 @@
<scope>provided</scope>
</dependency>
<dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-compat</artifactId>
+ <version>${mavenVersion}</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.3.0</version>
@@ -103,12 +109,6 @@
<version>1.13</version>
</dependency>
<dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-compat</artifactId>
- <version>${mavenVersion}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<scope>provided</scope>
diff --git a/src/main/java/org/apache/maven/plugins/buildinfo/SaveMojo.java b/src/main/java/org/apache/maven/plugins/buildinfo/SaveMojo.java
index 5bbfa77..71056e1 100644
--- a/src/main/java/org/apache/maven/plugins/buildinfo/SaveMojo.java
+++ b/src/main/java/org/apache/maven/plugins/buildinfo/SaveMojo.java
@@ -20,6 +20,15 @@ package org.apache.maven.plugins.buildinfo;
*/
import org.apache.commons.codec.Charsets;
+import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.MavenArtifactRepository;
+import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
+import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
@@ -29,6 +38,7 @@ import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
+import org.codehaus.plexus.util.FileUtils;
import java.io.BufferedWriter;
import java.io.File;
@@ -36,6 +46,7 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
+import java.util.Collections;
import java.util.List;
/**
@@ -79,10 +90,17 @@ public class SaveMojo
//private String rebuildArgs;
/**
- * URL for reference build, containing either reference buildinfo file or reference artifacts.
+ * Repository for reference build, containing either reference buildinfo file or reference artifacts.<br/>
+ * Format: <code>id</code> or <code>url</code> or <code>id::url</code>
+ * <dl>
+ * <dt>id</dt>
+ * <dd>The id can be used to pick up the correct credentials from the settings.xml</dd>
+ * <dt>url</dt>
+ * <dd>The location of the repository</dd>
+ * </dl>
*/
- @Parameter( property = "reference.url" )
- private String referenceUrl;
+ @Parameter( property = "reference.repo" )
+ private String referenceRepo;
/**
* Directory of the downloaded reference files.
@@ -91,11 +109,32 @@ public class SaveMojo
private File referenceDir;
/**
+ * The local repository taken from Maven's runtime. Typically <code>$HOME/.m2/repository</code>.
+ */
+ @Parameter( defaultValue = "${localRepository}", readonly = true, required = true )
+ private ArtifactRepository localRepository;
+
+ /**
+ * List of Remote Repositories used by the resolver.
+ */
+ @Parameter( defaultValue = "${project.remoteArtifactRepositories}", readonly = true, required = true )
+ private List<ArtifactRepository> remoteArtifactRepositories;
+
+ /**
* Used for attaching the buildinfo file in the project.
*/
@Component
private MavenProjectHelper projectHelper;
+ /**
+ * Artifact Resolver, needed to resolve and download the {@code resourceBundles}.
+ */
+ @Component
+ private ArtifactResolver artifactResolver;
+
+ @Component
+ private ArtifactFactory artifactFactory;
+
public void execute()
throws MojoExecutionException
{
@@ -124,10 +163,12 @@ public class SaveMojo
getLog().info( "NOT adding buildinfo to the list of attached artifacts." );
}
- if ( referenceUrl != null )
+ if ( referenceRepo != null )
{
- getLog().info( "Checking against reference build from " + referenceUrl );
- checkAgainstReference();
+ ArtifactRepository repo = createReferenceRepo();
+
+ getLog().info( "Checking against reference build from " + referenceRepo + "..." );
+ checkAgainstReference( repo );
}
}
@@ -176,10 +217,78 @@ public class SaveMojo
return null;
}
- private void checkAgainstReference()
+ private void checkAgainstReference( ArtifactRepository repo )
+ throws MojoExecutionException
{
referenceDir.mkdirs();
- getLog().warn( "TODO try to download reference buildinfo and compare..." );
- getLog().warn( "TODO if no reference buildinfo, try to download reference artifacts and compare..." );
+
+ File referenceBuildinfo = downloadReferenceBuildinfo( repo );
+ }
+
+ private File downloadReferenceBuildinfo( ArtifactRepository repo )
+ throws MojoExecutionException
+ {
+ File referenceBuildinfo = new File( referenceDir, buildinfoFile.getName() );
+
+ Artifact buildinfo =
+ artifactFactory.createArtifactWithClassifier( project.getGroupId(), project.getArtifactId(),
+ project.getVersion(), "buildinfo", "" );
+ try
+ {
+ artifactResolver.resolve( buildinfo, Collections.singletonList( repo ), localRepository );
+
+ FileUtils.copyFile( buildinfo.getFile(), referenceBuildinfo );
+ getLog().info( "Reference buildinfo file found, copied to " + referenceBuildinfo );
+ }
+ catch ( ArtifactResolutionException are )
+ {
+ throw new MojoExecutionException( "Error resolving buildinfo artifact " + buildinfo, are );
+ }
+ catch ( ArtifactNotFoundException e )
+ {
+ getLog().warn( "Reference buildinfo file not found: "
+ + "it will be generated from downloaded reference artifacts" );
+ }
+ catch ( IOException ioe )
+ {
+ throw new MojoExecutionException( "Error copying buildinfo artifact " + buildinfo, ioe );
+ }
+
+ return referenceBuildinfo;
+ }
+
+ private ArtifactRepository createReferenceRepo()
+ throws MojoExecutionException
+ {
+ if ( referenceRepo.contains( "::" ) )
+ {
+ // id::url
+ int index = referenceRepo.indexOf( "::" );
+ String id = referenceRepo.substring( 0, index );
+ String url = referenceRepo.substring( index + 2 );
+ return createDeploymentArtifactRepository( id, url );
+ }
+ else if ( referenceRepo.contains( ":" ) )
+ {
+ // url, will use default "reference" id
+ return createDeploymentArtifactRepository( "reference", referenceRepo );
+ }
+
+ // id
+ for ( ArtifactRepository repo : remoteArtifactRepositories )
+ {
+ if ( referenceRepo.equals( repo.getId() ) )
+ {
+ return repo;
+ }
+ }
+ throw new MojoExecutionException( "Could not find repository with id = " + referenceRepo );
+ }
+
+ protected ArtifactRepository createDeploymentArtifactRepository( String id, String url )
+ {
+ return new MavenArtifactRepository( id, url, new DefaultRepositoryLayout(), new ArtifactRepositoryPolicy(),
+ new ArtifactRepositoryPolicy() );
}
+
}