Hi Igor,

I agree that something like MNG-5767 can indeed help with the experience.

Looking at the implementation I find the name projectBaseDirectory confusing, I would have thought that this is a per project(module) baseDirectory.
We already have things like project.basedir and project.executionRoot
Couldn't you (re)use the executionRoot, which seems to be exactly what you want. I just think that projectBaseDirectory is too abstract, I'd prefer a more concrete name.

How about using the script-name as basename for the config.
mvn.config (or mvn.opts) for mvn.sh/mvn.bat
mvndebug.config (or mvndebug.opts) for mvndebug.sh/mvndebug.bat
In the end you want override the "global" (i.e environment variable based) properties and with project specific values *for these scripts*, right?

thanks,
Robert

Op Fri, 20 Feb 2015 14:15:15 +0100 schreef <[email protected]>:

Repository: maven
Updated Branches:
  refs/heads/master ee7dbab69 -> 8ed9a1caa


MNG-5767 .mvn/ for project specific jvm options and maven parameters

Signed-off-by: Igor Fedorenko <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/8ed9a1ca
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/8ed9a1ca
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/8ed9a1ca

Branch: refs/heads/master
Commit: 8ed9a1caa8890773b45c6c408a4e40acf4f4b0fd
Parents: ee7dbab
Author: Igor Fedorenko <[email protected]>
Authored: Mon Jan 26 14:22:05 2015 -0500
Committer: Igor Fedorenko <[email protected]>
Committed: Fri Feb 20 08:14:08 2015 -0500

----------------------------------------------------------------------
 apache-maven/src/bin/mvn                        | 29 +++++++++-
 .../execution/DefaultMavenExecutionRequest.java | 14 +++++
 .../maven/execution/MavenExecutionRequest.java  |  9 +++
 .../java/org/apache/maven/cli/MavenCli.java     | 57 ++++++++++++++++++-
.../java/org/apache/maven/cli/MavenCliTest.java | 59 ++++++++++++++++++++
 .../projects/config-illegal/.mvn/maven.config   |  1 +
 .../src/test/projects/config/.mvn/maven.config  |  2 +
 7 files changed, 166 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/apache-maven/src/bin/mvn
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
index 1ed3024..26feda4 100755
--- a/apache-maven/src/bin/mvn
+++ b/apache-maven/src/bin/mvn
@@ -189,14 +189,39 @@ if $cygwin; then
     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
 fi
+# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+  local basedir=$(pwd)
+  local wdir=$(pwd)
+  while [ "$wdir" != '/' ] ; do
+    wdir=$(cd $wdir/..; pwd)
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
 # Provide a "standardized" way to retrieve the CLI args that will
 # work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$@"
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
 export MAVEN_CMD_LINE_ARGS
exec "$JAVACMD" \
   $MAVEN_OPTS \
   -classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
   "-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
-  "-Dmaven.home=${M2_HOME}"  \
+ "-Dmaven.home=${M2_HOME}" "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
   ${CLASSWORLDS_LAUNCHER} "$@"

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
index d88024d..f4439b1 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java +++ b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
@@ -93,6 +93,8 @@ public class DefaultMavenExecutionRequest
     // Request
// ----------------------------------------------------------------------------
+    private File projectBasedir;
+
     private File basedir;
    private List<String> goals;
@@ -1149,4 +1151,16 @@ public class DefaultMavenExecutionRequest
         this.toolchains = toolchains;
         return this;
     }
+
+    @Override
+    public void setProjectBaseDirectory( File directory )
+    {
+        this.projectBasedir = directory;
+    }
+
+    @Override
+    public File getProjectBaseDirectory()
+    {
+        return projectBasedir;
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
----------------------------------------------------------------------
diff --git a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
index 2b2a1d8..55d7ff2 100644
--- a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java +++ b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
@@ -415,4 +415,13 @@ public interface MavenExecutionRequest
      */
     Map<String, List<ToolchainModel>> getToolchains();
+    /**
+     * @since 3.2.6
+     */
+    void setProjectBaseDirectory( File file );
+
+    /**
+     * @since 3.2.6
+     */
+    File getProjectBaseDirectory();
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index 35ccbd2..238be22 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -23,8 +23,10 @@ import java.io.Console;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.PrintStream;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -92,6 +94,8 @@ import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
 import org.sonatype.plexus.components.sec.dispatcher.SecUtil;
import org.sonatype.plexus.components.sec.dispatcher.model.SettingsSecurity;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
 import com.google.inject.AbstractModule;
// TODO: push all common bits back to plexus cli and prepare for transition to Guice. We don't need 50 ways to make CLIs
@@ -106,6 +110,8 @@ public class MavenCli
public static final String THREADS_DEPRECATED = "maven.threads.experimental";
+    public static final String PROJECT_BASEDIR = "maven.projectBasedir";
+
     @SuppressWarnings( "checkstyle:constantname" )
public static final String userHome = System.getProperty( "user.home" );
@@ -257,13 +263,27 @@ public class MavenCli
         }
     }
-    private void initialize( CliRequest cliRequest )
+    void initialize( CliRequest cliRequest )
     {
         if ( cliRequest.workingDirectory == null )
         {
cliRequest.workingDirectory = System.getProperty( "user.dir" );
         }
+        if ( cliRequest.projectBaseDirectory == null )
+        {
+ String basedirProperty = System.getProperty( PROJECT_BASEDIR ); + File basedir = basedirProperty != null ? new File( basedirProperty ) : new File( "" );
+            try
+            {
+ cliRequest.projectBaseDirectory = basedir.getCanonicalFile();
+            }
+            catch ( IOException e )
+            {
+ cliRequest.projectBaseDirectory = basedir.getAbsoluteFile();
+            }
+        }
+
         //
// Make sure the Maven home directory is an absolute path to save us from confusion with say drive-relative
         // Windows paths.
@@ -276,7 +296,7 @@ public class MavenCli
         }
     }
-    private void cli( CliRequest cliRequest )
+    void cli( CliRequest cliRequest )
         throws Exception
     {
         //
@@ -287,9 +307,38 @@ public class MavenCli
        CLIManager cliManager = new CLIManager();
+        List<String> args = new ArrayList<String>();
+
+        try
+        {
+ File configFile = new File( cliRequest.projectBaseDirectory, ".mvn/maven.config" );
+
+            if ( configFile.isFile() )
+            {
+ for ( String arg : Files.toString( configFile, Charsets.UTF_8 ).split( "\\s+" ) )
+                {
+                    args.add( arg );
+                }
+
+ CommandLine config = cliManager.parse( args.toArray( new String[args.size()] ) );
+                List<?> unrecongized = config.getArgList();
+                if ( !unrecongized.isEmpty() )
+                {
+ throw new ParseException( "Unrecognized maven.config entries: " + unrecongized );
+                }
+            }
+        }
+        catch ( ParseException e )
+        {
+ System.err.println( "Unable to parse maven.config: " + e.getMessage() );
+            cliManager.displayHelp( System.out );
+            throw e;
+        }
+
         try
         {
- cliRequest.commandLine = cliManager.parse( cliRequest.args );
+            args.addAll( 0, Arrays.asList( cliRequest.args ) );
+ cliRequest.commandLine = cliManager.parse( args.toArray( new String[args.size()] ) );
         }
         catch ( ParseException e )
         {
@@ -1074,6 +1123,7 @@ public class MavenCli
             .setUpdateSnapshots( updateSnapshots ) // default: false
             .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
.setGlobalChecksumPolicy( globalChecksumPolicy ) // default: warn
+            .setProjectBaseDirectory( cliRequest.projectBaseDirectory )
             ;
        if ( alternatePomFile != null )
@@ -1322,6 +1372,7 @@ public class MavenCli
         CommandLine commandLine;
         ClassWorld classWorld;
         String workingDirectory;
+        File projectBaseDirectory;
         boolean debug;
         boolean quiet;
         boolean showErrors = true;

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
index 6e06cc5..628ef20 100644
--- a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
+++ b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
@@ -19,16 +19,39 @@ package org.apache.maven.cli;
  * under the License.
  */
+import java.io.File;
+
 import junit.framework.TestCase;
+import org.apache.commons.cli.ParseException;
+import org.apache.maven.cli.MavenCli.CliRequest;
+
 public class MavenCliTest
     extends TestCase
 {
     private MavenCli cli;
+    private String origBasedir;
+
     protected void setUp()
     {
         cli = new MavenCli();
+        origBasedir = System.getProperty( MavenCli.PROJECT_BASEDIR );
+    }
+
+    @Override
+    protected void tearDown()
+        throws Exception
+    {
+        if ( origBasedir != null )
+        {
+            System.setProperty( MavenCli.PROJECT_BASEDIR, origBasedir );
+        }
+        else
+        {
+            System.getProperties().remove( MavenCli.PROJECT_BASEDIR );
+        }
+        super.tearDown();
     }
    public void testCalculateDegreeOfConcurrencyWithCoreMultiplier()
@@ -49,4 +72,40 @@ public class MavenCliTest
             // carry on
         }
     }
+
+    public void testMavenConfig()
+        throws Exception
+    {
+ System.setProperty( MavenCli.PROJECT_BASEDIR, new File( "src/test/projects/config" ).getCanonicalPath() );
+        CliRequest request = new CliRequest( new String[0], null );
+
+        // read .mvn/maven.config
+        cli.initialize( request );
+        cli.cli( request );
+ assertEquals( "multithreaded", request.commandLine.getOptionValue( "builder" ) ); + assertEquals( "8", request.commandLine.getOptionValue( "threads" ) );
+
+        // override from command line
+ request = new CliRequest( new String[] { "--builder", "foobar" }, null );
+        cli.cli( request );
+ assertEquals( "foobar", request.commandLine.getOptionValue( "builder" ) );
+    }
+
+    public void testMavenConfigInvalid()
+        throws Exception
+    {
+ System.setProperty( MavenCli.PROJECT_BASEDIR, new File( "src/test/projects/config-illegal" ).getCanonicalPath() );
+        CliRequest request = new CliRequest( new String[0], null );
+
+        cli.initialize( request );
+        try
+        {
+            cli.cli( request );
+            fail();
+        }
+        catch ( ParseException expected )
+        {
+
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config b/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
new file mode 100644
index 0000000..8541464
--- /dev/null
+++ b/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
@@ -0,0 +1 @@
+deploy

http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/maven-embedder/src/test/projects/config/.mvn/maven.config
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/projects/config/.mvn/maven.config b/maven-embedder/src/test/projects/config/.mvn/maven.config
new file mode 100644
index 0000000..3d0f13b
--- /dev/null
+++ b/maven-embedder/src/test/projects/config/.mvn/maven.config
@@ -0,0 +1,2 @@
+-T8 --builder
+  multithreaded

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to