You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2022/07/27 06:38:18 UTC

[maven-compiler-plugin] 01/02: Display recompilation causes

This is an automated email from the ASF dual-hosted git repository.

olamy pushed a commit to branch MCOMPILER-499_display_recompilation_causes
in repository https://gitbox.apache.org/repos/asf/maven-compiler-plugin.git

commit 7a2bfef5620187a230cdf01b3999a4e927aadd0b
Author: Loïc Ledoyen <lo...@mirakl.com>
AuthorDate: Mon May 30 11:33:45 2022 +0200

    Display recompilation causes
---
 .../plugin/compiler/AbstractCompilerMojo.java      | 100 +++++++++++++++++++--
 1 file changed, 93 insertions(+), 7 deletions(-)

diff --git a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
index 6f27504..f2103a9 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
@@ -61,6 +61,8 @@ import org.apache.maven.shared.incremental.IncrementalBuildHelper;
 import org.apache.maven.shared.incremental.IncrementalBuildHelperRequest;
 import org.apache.maven.shared.utils.ReaderFactory;
 import org.apache.maven.shared.utils.StringUtils;
+import org.apache.maven.shared.utils.io.DirectoryScanResult;
+import org.apache.maven.shared.utils.io.DirectoryScanner;
 import org.apache.maven.shared.utils.io.FileUtils;
 import org.apache.maven.shared.utils.logging.MessageBuilder;
 import org.apache.maven.shared.utils.logging.MessageUtils;
@@ -101,6 +103,8 @@ public abstract class AbstractCompilerMojo
 {
     protected static final String PS = System.getProperty( "path.separator" );
 
+    private static final String INPUT_FILES_LST_FILENAME = "inputFiles.lst";
+
     static final String DEFAULT_SOURCE = "1.7";
     
     static final String DEFAULT_TARGET = "1.7";
@@ -561,6 +565,8 @@ public abstract class AbstractCompilerMojo
     @Parameter( defaultValue = "true", property = "maven.compiler.createMissingPackageInfoClass" )
     private boolean createMissingPackageInfoClass = true;
 
+    @Parameter( defaultValue = "false", property = "maven.compiler.showCompilationChanges" )
+    private boolean showCompilationChanges = false;
     /**
      * Resolves the artifacts needed.
      */
@@ -876,14 +882,34 @@ public abstract class AbstractCompilerMojo
 
                 incrementalBuildHelperRequest = new IncrementalBuildHelperRequest().inputFiles( sources );
 
+                DirectoryScanResult dsr = computeInputFileTreeChanges( incrementalBuildHelper, sources );
+
+                boolean idk = compiler.getCompilerOutputStyle()
+                        .equals( CompilerOutputStyle.ONE_OUTPUT_FILE_FOR_ALL_INPUT_FILES ) && !canUpdateTarget;
+                boolean dependencyChanged = isDependencyChanged();
+                boolean sourceChanged = isSourceChanged( compilerConfiguration, compiler );
+                boolean inputFileTreeChanged = hasInputFileTreeChanged( dsr );
                 // CHECKSTYLE_OFF: LineLength
-                if ( ( compiler.getCompilerOutputStyle().equals( CompilerOutputStyle.ONE_OUTPUT_FILE_FOR_ALL_INPUT_FILES ) && !canUpdateTarget )
-                    || isDependencyChanged()
-                    || isSourceChanged( compilerConfiguration, compiler )
-                    || incrementalBuildHelper.inputFileTreeChanged( incrementalBuildHelperRequest ) )
+                if ( idk
+                    || dependencyChanged
+                    || sourceChanged
+                    || inputFileTreeChanged )
                     // CHECKSTYLE_ON: LineLength
                 {
-                    getLog().info( "Changes detected - recompiling the module!" );
+                    String cause = idk ? "idk" : ( dependencyChanged ? "dependency"
+                            : ( sourceChanged ? "source" : "input tree" ) );
+                    getLog().info( "Changes detected - recompiling the module! :" + cause );
+                    if ( showCompilationChanges )
+                    {
+                        for ( String fileAdded : dsr.getFilesAdded() )
+                        {
+                            getLog().info( "\t+ " + fileAdded );
+                        }
+                        for ( String fileRemoved : dsr.getFilesRemoved() )
+                        {
+                            getLog().info( "\t- " + fileRemoved );
+                        }
+                    }
 
                     compilerConfiguration.setSourceFiles( sources );
                 }
@@ -1523,7 +1549,14 @@ public abstract class AbstractCompilerMojo
         {
             for ( File f : staleSources )
             {
-                getLog().debug( "Stale source detected: " + f.getAbsolutePath() );
+                if ( showCompilationChanges )
+                {
+                    getLog().info( "Stale source detected: " + f.getAbsolutePath() );
+                }
+                else
+                {
+                    getLog().debug( "Stale source detected: " + f.getAbsolutePath() );
+                }
             }
         }
         return !staleSources.isEmpty();
@@ -1740,7 +1773,14 @@ public abstract class AbstractCompilerMojo
             {
                 if ( hasNewFile( artifactPath, buildStartTime ) )
                 {
-                    getLog().debug( "New dependency detected: " + artifactPath.getAbsolutePath() );
+                    if ( showCompilationChanges )
+                    {
+                        getLog().info( "New dependency detected: " + artifactPath.getAbsolutePath() );
+                    }
+                    else
+                    {
+                        getLog().debug( "New dependency detected: " + artifactPath.getAbsolutePath() );
+                    }
                     return true;
                 }
             }
@@ -1889,6 +1929,52 @@ public abstract class AbstractCompilerMojo
         return pomProperties.getProperty( "version" );
     }
 
+    private DirectoryScanResult computeInputFileTreeChanges( IncrementalBuildHelper ibh, Set<File> inputFiles )
+            throws MojoExecutionException
+    {
+        File mojoConfigBase = ibh.getMojoStatusDirectory();
+        File mojoConfigFile = new File( mojoConfigBase, INPUT_FILES_LST_FILENAME );
+
+        String[] oldInputFiles = new String[0];
+
+        if ( mojoConfigFile.exists() )
+        {
+            try
+            {
+                oldInputFiles = FileUtils.fileReadArray( mojoConfigFile );
+            }
+            catch ( IOException e )
+            {
+                throw new MojoExecutionException( "Error reading old mojo status " + mojoConfigFile, e );
+            }
+        }
+
+        String[] inputFileNames = new String[ inputFiles.size() ];
+        int i = 0;
+        for ( File inputFile : inputFiles )
+        {
+            inputFileNames[ i++ ] = inputFile.getAbsolutePath();
+        }
+
+        DirectoryScanResult dsr = DirectoryScanner.diffFiles( oldInputFiles, inputFileNames );
+
+        try
+        {
+            FileUtils.fileWriteArray( mojoConfigFile, inputFileNames );
+        }
+        catch ( IOException e )
+        {
+            throw new MojoExecutionException( "Error while storing the mojo status", e );
+        }
+
+        return dsr;
+    }
+
+    private boolean hasInputFileTreeChanged( DirectoryScanResult dsr )
+    {
+        return ( dsr.getFilesAdded().length > 0 || dsr.getFilesRemoved().length > 0 );
+    }
+
     public void setTarget( String target )
     {
         this.target = target;