You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by Robert Scholte <rf...@apache.org> on 2015/02/07 10:24:43 UTC

Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Igor,

how about generating these scripts?
I'd prefer to have only useful scripts for the users in the bin directory.
IIUC the mvn-common.sh is just used by all other scripts and shouldn't be  
called by users.
So instead I'd like to see the other scripts being generated, all  
including this common script.

thanks,
Robert

Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:

> Repository: maven
> Updated Branches:
>   refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>
>
> .mvn/ for project specific jvm options and maven parameters
>
> Signed-off-by: Igor Fedorenko <if...@apache.org>
>
>
> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>
> Branch: refs/heads/project-basedir
> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
> Parents: d745f8c
> Author: Igor Fedorenko <if...@apache.org>
> Authored: Mon Jan 26 14:22:05 2015 -0500
> Committer: Igor Fedorenko <if...@apache.org>
> Committed: Fri Feb 6 15:43:40 2015 -0500
>
> ----------------------------------------------------------------------
>  apache-maven/src/bin/.gitattributes             |  1 +
>  apache-maven/src/bin/mvn                        |  8 ++-
>  apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>  apache-maven/src/bin/mvnDebug                   |  8 ++-
>  apache-maven/src/bin/mvnyjp                     | 23 ++++----
>  apache-maven/src/main/assembly/bin.xml          |  1 +
>  .../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 +
>  12 files changed, 207 insertions(+), 19 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/bin/.gitattributes  
> b/apache-maven/src/bin/.gitattributes
> index cc7533f..90eeece 100644
> --- a/apache-maven/src/bin/.gitattributes
> +++ b/apache-maven/src/bin/.gitattributes
> @@ -1,3 +1,4 @@
>  mvn                eol=lf crlf=input
>  mvnDebug           eol=lf crlf=input
>  mvnyjp             eol=lf crlf=input
> +mvn-common.sh      eol=lf crlf=input
>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
> index 1ed3024..f745f4e 100755
> --- a/apache-maven/src/bin/mvn
> +++ b/apache-maven/src/bin/mvn
> @@ -189,14 +189,18 @@ if $cygwin; then
>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>  fi
> +. "$M2_HOME/bin/mvn-common.sh"
> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/bin/mvn-common.sh  
> b/apache-maven/src/bin/mvn-common.sh
> new file mode 100755
> index 0000000..b39741b
> --- /dev/null
> +++ b/apache-maven/src/bin/mvn-common.sh
> @@ -0,0 +1,43 @@
> +#!/bin/sh
> +#  
> ----------------------------------------------------------------------------
> +# 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.
> +#  
> ----------------------------------------------------------------------------
> +
> +# TODO ideally, this should contain all logic common to mvn* shell  
> scripts
> +
> +# 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
> +}
>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/bin/mvnDebug  
> b/apache-maven/src/bin/mvnDebug
> index 291f81f..287d20b 100755
> --- a/apache-maven/src/bin/mvnDebug
> +++ b/apache-maven/src/bin/mvnDebug
> @@ -193,9 +193,13 @@ if $cygwin; then
>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>  fi
> +. "$M2_HOME/bin/mvn-common.sh"
> +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" \
> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>    $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
> index faf3412..6d5f555 100755
> --- a/apache-maven/src/bin/mvnyjp
> +++ b/apache-maven/src/bin/mvnyjp
> @@ -34,14 +34,6 @@
>  #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>  #  
> ----------------------------------------------------------------------------
> -QUOTED_ARGS=""
> -while [ "$1" != "" ] ; do
> -
> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
> -  shift
> -
> -done
> -
>  if [ -z "$MAVEN_SKIP_RC" ] ; then
>   if [ -f /etc/mavenrc ] ; then
> @@ -204,11 +196,18 @@ fi
> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal  
> $MAVEN_OPTS"
> +. "$M2_HOME/bin/mvn-common.sh"
> +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_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}"  \
> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
> -
> -
> +  "-Dmaven.home=${M2_HOME}"  
> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
> +  ${CLASSWORLDS_LAUNCHER} "$@"
>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
> ----------------------------------------------------------------------
> diff --git a/apache-maven/src/main/assembly/bin.xml  
> b/apache-maven/src/main/assembly/bin.xml
> index b2aa900..6b862f8 100644
> --- a/apache-maven/src/main/assembly/bin.xml
> +++ b/apache-maven/src/main/assembly/bin.xml
> @@ -74,6 +74,7 @@ under the License.
>        <outputDirectory>bin</outputDirectory>
>        <includes>
>          <include>m2</include>
> +        <include>mvn-common.sh</include>
>          <include>mvn</include>
>          <include>mvnDebug</include>
>          <!-- This is so that CI systems can periodically run the  
> profiler -->
>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
> @@ -91,6 +93,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
> @@ -105,6 +109,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" );
> @@ -256,13 +262,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.
> @@ -275,7 +295,7 @@ public class MavenCli
>          }
>      }
> -    private void cli( CliRequest cliRequest )
> +    void cli( CliRequest cliRequest )
>          throws Exception
>      {
>          //
> @@ -286,9 +306,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 )
>          {
> @@ -1070,6 +1119,7 @@ public class MavenCli
>              .setUpdateSnapshots( updateSnapshots ) // default: false
>              .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
>              .setGlobalChecksumPolicy( globalChecksumPolicy ) //  
> default: warn
> +            .setProjectBaseDirectory( cliRequest.projectBaseDirectory )
>              ;
>         if ( alternatePomFile != null )
> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Jason van Zyl <ja...@takari.io>.
+1

Solves everyone's concerns and is a nice solution.

On Feb 9, 2015, at 3:31 PM, Igor Fedorenko <ig...@ifedorenko.com> wrote:

> Well, calling mvn from mvnDebug/mvnyjp was an excellent idea, I wish I
> thought of it myself.
> 
> https://git1-us-west.apache.org/repos/asf?p=maven.git;a=commit;h=7c7bf4dfef1b465196233bf35e520fdde4fd5b49
> 
> --
> Regards,
> Igor
> 
> 
> On 2015-02-08 10:11, Bernd Eckenfels wrote:
>> Am Sun, 08 Feb 2015 07:57:03 -0500
>> schrieb Igor Fedorenko <ig...@ifedorenko.com>:
>> 
>>> What if there was single "real" mvn script and mvnDebug/mvnyjp were
>>> just symlinks pointing back to it? The script will behave differently
>>> based on the script name. Any objections to this plan?
>> 
>> I am all for having only one script. They have diverged too much
>> anyway (the java_home fix I did for Max OS was missing in two of them
>> for example). Not sure how common the old names are used (never
>> encountered them, at least not for normal usage), so having them as
>> wrappers (or symlinks) calling the common script is optional. But
>> having the logic only in one place is a big win.
>> 
>> Gruss
>> Bernd
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>> For additional commands, e-mail: dev-help@maven.apache.org
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
> 

Thanks,

Jason

----------------------------------------------------------
Jason van Zyl
Founder, Takari and Apache Maven
http://twitter.com/jvanzyl
http://twitter.com/takari_io
---------------------------------------------------------

To do two things at once is to do neither.
 
 -- Publilius Syrus, Roman slave, first century B.C.













---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Igor Fedorenko <ig...@ifedorenko.com>.
Well, calling mvn from mvnDebug/mvnyjp was an excellent idea, I wish I
thought of it myself.

https://git1-us-west.apache.org/repos/asf?p=maven.git;a=commit;h=7c7bf4dfef1b465196233bf35e520fdde4fd5b49

--
Regards,
Igor


On 2015-02-08 10:11, Bernd Eckenfels wrote:
> Am Sun, 08 Feb 2015 07:57:03 -0500
> schrieb Igor Fedorenko <ig...@ifedorenko.com>:
>
>> What if there was single "real" mvn script and mvnDebug/mvnyjp were
>> just symlinks pointing back to it? The script will behave differently
>> based on the script name. Any objections to this plan?
>
> I am all for having only one script. They have diverged too much
> anyway (the java_home fix I did for Max OS was missing in two of them
> for example). Not sure how common the old names are used (never
> encountered them, at least not for normal usage), so having them as
> wrappers (or symlinks) calling the common script is optional. But
> having the logic only in one place is a big win.
>
> Gruss
> Bernd
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Bernd Eckenfels <ec...@zusammenkunft.net>.
Am Sun, 08 Feb 2015 07:57:03 -0500
schrieb Igor Fedorenko <ig...@ifedorenko.com>:

> What if there was single "real" mvn script and mvnDebug/mvnyjp were
> just symlinks pointing back to it? The script will behave differently
> based on the script name. Any objections to this plan?

I am all for having only one script. They have diverged too much
anyway (the java_home fix I did for Max OS was missing in two of them
for example). Not sure how common the old names are used (never
encountered them, at least not for normal usage), so having them as
wrappers (or symlinks) calling the common script is optional. But
having the logic only in one place is a big win.

Gruss
Bernd

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Igor Fedorenko <ig...@ifedorenko.com>.
Yes, I agree not supporting this feature on windows is not desirable,
but I don't know enough about windows scripting to implement this myself
and until somebody helps with the implementation we won't support this
feature on windows.

--
Regards,
Igor

On 2015-02-08 9:44, Arnaud Héritier wrote:
> And what about our dear windows users ?
> Don't forget that they are very numerous.
> Sadly Linux shell is many many far more powerful than windows .bat files
> and often we have to reduce features to keep the compatibility with windows.
> I wouldn't like to have different features for linux and for windows ...
>
>
> On Sun, Feb 8, 2015 at 3:04 PM, Jason van Zyl <ja...@takari.io> wrote:
>
>> I think that also works. But I think the script not being executable it
>> makes it clear it's not a script. Whatever we decide I'm again filtering
>> it, just makes debugging painful.
>>
>> On Feb 8, 2015, at 7:57 AM, Igor Fedorenko <ig...@ifedorenko.com> wrote:
>>
>>> I think maintenance overhead and code duplication concerns outweigh
>>> possible confusion an extra file might cause, but I think I have a
>>> better solution.
>>>
>>> What if there was single "real" mvn script and mvnDebug/mvnyjp were just
>>> symlinks pointing back to it? The script will behave differently based
>>> on the script name. Any objections to this plan?
>>>
>>> --
>>> Regards,
>>> Igor
>>>
>>> On 2015-02-08 6:23, Robert Scholte wrote:
>>>> Igor, Jason,
>>>>
>>>> my concern is not about having shared scripting. If that works, that'll
>>>> be great.
>>>> But from a user perspective I'd like to have a clean bin-folder. Only
>>>> have useful scripts here.
>>>> So my idea would be: when generating the distribution, just merge these
>>>> files to the ones we now have.
>>>> I understand Jasons concern regarding it a bit being less obvious when
>>>> patching, but that assumes there's still some patching to do every now
>>>> and then.
>>>> It shouldn't be too hard to do some filtering and only have useful
>>>> scripts (and disable it if you want to patch/test)
>>>>
>>>> thanks,
>>>> Robert
>>>>
>>>> Op Sat, 07 Feb 2015 15:12:17 +0100 schreef Igor Fedorenko
>>>> <ig...@ifedorenko.com>:
>>>>
>>>>> Robert,
>>>>>
>>>>> Can you explain your concerns? I believe it is a common practice to use
>>>>> separate "include" file to keep logic shared by multiple scripts, why
>> do
>>>>> you think we need do it differently?
>>>>>
>>>>> --
>>>>> Regards,
>>>>> Igor
>>>>>
>>>>> On 2015-02-07 4:24, Robert Scholte wrote:
>>>>>> Igor,
>>>>>>
>>>>>> how about generating these scripts?
>>>>>> I'd prefer to have only useful scripts for the users in the bin
>>>>>> directory.
>>>>>> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
>>>>>> be called by users.
>>>>>> So instead I'd like to see the other scripts being generated, all
>>>>>> including this common script.
>>>>>>
>>>>>> thanks,
>>>>>> Robert
>>>>>>
>>>>>> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
>>>>>>
>>>>>>> Repository: maven
>>>>>>> Updated Branches:
>>>>>>>   refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>>>>>>>
>>>>>>>
>>>>>>> .mvn/ for project specific jvm options and maven parameters
>>>>>>>
>>>>>>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>>>>>>>
>>>>>>>
>>>>>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>>>>>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>>>>>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>>>>>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>>>>>>>
>>>>>>> Branch: refs/heads/project-basedir
>>>>>>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>>>>>>> Parents: d745f8c
>>>>>>> Author: Igor Fedorenko <if...@apache.org>
>>>>>>> Authored: Mon Jan 26 14:22:05 2015 -0500
>>>>>>> Committer: Igor Fedorenko <if...@apache.org>
>>>>>>> Committed: Fri Feb 6 15:43:40 2015 -0500
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> apache-maven/src/bin/.gitattributes             |  1 +
>>>>>>> apache-maven/src/bin/mvn                        |  8 ++-
>>>>>>> apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>>>>>>> apache-maven/src/bin/mvnDebug                   |  8 ++-
>>>>>>> apache-maven/src/bin/mvnyjp                     | 23 ++++----
>>>>>>> apache-maven/src/main/assembly/bin.xml          |  1 +
>>>>>>> .../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 +
>>>>>>> 12 files changed, 207 insertions(+), 19 deletions(-)
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>>
>>>>>>>
>>>>>>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/bin/.gitattributes
>>>>>>> b/apache-maven/src/bin/.gitattributes
>>>>>>> index cc7533f..90eeece 100644
>>>>>>> --- a/apache-maven/src/bin/.gitattributes
>>>>>>> +++ b/apache-maven/src/bin/.gitattributes
>>>>>>> @@ -1,3 +1,4 @@
>>>>>>> mvn                eol=lf crlf=input
>>>>>>> mvnDebug           eol=lf crlf=input
>>>>>>> mvnyjp             eol=lf crlf=input
>>>>>>> +mvn-common.sh      eol=lf crlf=input
>>>>>>>
>>>>>>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>>>>>>> index 1ed3024..f745f4e 100755
>>>>>>> --- a/apache-maven/src/bin/mvn
>>>>>>> +++ b/apache-maven/src/bin/mvn
>>>>>>> @@ -189,14 +189,18 @@ if $cygwin; then
>>>>>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>>>> fi
>>>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>>>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/bin/mvn-common.sh
>>>>>>> b/apache-maven/src/bin/mvn-common.sh
>>>>>>> new file mode 100755
>>>>>>> index 0000000..b39741b
>>>>>>> --- /dev/null
>>>>>>> +++ b/apache-maven/src/bin/mvn-common.sh
>>>>>>> @@ -0,0 +1,43 @@
>>>>>>> +#!/bin/sh
>>>>>>> +#
>>>>>>>
>> ----------------------------------------------------------------------------
>>>>>>>
>>>>>>>
>>>>>>> +# 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.
>>>>>>> +#
>>>>>>>
>> ----------------------------------------------------------------------------
>>>>>>>
>>>>>>>
>>>>>>> +
>>>>>>> +# TODO ideally, this should contain all logic common to mvn* shell
>>>>>>> scripts
>>>>>>> +
>>>>>>> +# 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
>>>>>>> +}
>>>>>>>
>>>>>>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/bin/mvnDebug
>>>>>>> b/apache-maven/src/bin/mvnDebug
>>>>>>> index 291f81f..287d20b 100755
>>>>>>> --- a/apache-maven/src/bin/mvnDebug
>>>>>>> +++ b/apache-maven/src/bin/mvnDebug
>>>>>>> @@ -193,9 +193,13 @@ if $cygwin; then
>>>>>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>>>> fi
>>>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>>>> +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" \
>>>>>>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>>>>>>    $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/bin/mvnyjp
>> b/apache-maven/src/bin/mvnyjp
>>>>>>> index faf3412..6d5f555 100755
>>>>>>> --- a/apache-maven/src/bin/mvnyjp
>>>>>>> +++ b/apache-maven/src/bin/mvnyjp
>>>>>>> @@ -34,14 +34,6 @@
>>>>>>> #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>>>>>>> #
>>>>>>>
>> ----------------------------------------------------------------------------
>>>>>>>
>>>>>>>
>>>>>>> -QUOTED_ARGS=""
>>>>>>> -while [ "$1" != "" ] ; do
>>>>>>> -
>>>>>>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>>>>>>> -  shift
>>>>>>> -
>>>>>>> -done
>>>>>>> -
>>>>>>> if [ -z "$MAVEN_SKIP_RC" ] ; then
>>>>>>>   if [ -f /etc/mavenrc ] ; then
>>>>>>> @@ -204,11 +196,18 @@ fi
>>>>>>>
>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
>>>>>>>
>>>>>>> $MAVEN_OPTS"
>>>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>>>> +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_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}"  \
>>>>>>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>>>>>>> -
>>>>>>> -
>>>>>>> +  "-Dmaven.home=${M2_HOME}"
>>>>>>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>>>>>>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>>>>>>>
>>>>>>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>>>>>>>
>>>>>>>
>>>>>>>
>> ----------------------------------------------------------------------
>>>>>>> diff --git a/apache-maven/src/main/assembly/bin.xml
>>>>>>> b/apache-maven/src/main/assembly/bin.xml
>>>>>>> index b2aa900..6b862f8 100644
>>>>>>> --- a/apache-maven/src/main/assembly/bin.xml
>>>>>>> +++ b/apache-maven/src/main/assembly/bin.xml
>>>>>>> @@ -74,6 +74,7 @@ under the License.
>>>>>>>        <outputDirectory>bin</outputDirectory>
>>>>>>>        <includes>
>>>>>>>          <include>m2</include>
>>>>>>> +        <include>mvn-common.sh</include>
>>>>>>>          <include>mvn</include>
>>>>>>>          <include>mvnDebug</include>
>>>>>>>          <!-- This is so that CI systems can periodically run the
>>>>>>> profiler -->
>>>>>>>
>>>>>>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>>>>>>>
>>>>>>>
>>>>>>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>>>>>>> @@ -91,6 +93,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
>>>>>>> @@ -105,6 +109,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" );
>>>>>>> @@ -256,13 +262,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.
>>>>>>> @@ -275,7 +295,7 @@ public class MavenCli
>>>>>>>          }
>>>>>>>      }
>>>>>>> -    private void cli( CliRequest cliRequest )
>>>>>>> +    void cli( CliRequest cliRequest )
>>>>>>>          throws Exception
>>>>>>>      {
>>>>>>>          //
>>>>>>> @@ -286,9 +306,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 )
>>>>>>>          {
>>>>>>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>>>>>>              .setUpdateSnapshots( updateSnapshots ) // default: false
>>>>>>>              .setNoSnapshotUpdates( noSnapshotUpdates ) // default:
>>>>>>> false
>>>>>>>              .setGlobalChecksumPolicy( globalChecksumPolicy ) //
>>>>>>> default: warn
>>>>>>> +            .setProjectBaseDirectory(
>>>>>>> cliRequest.projectBaseDirectory )
>>>>>>>              ;
>>>>>>>         if ( alternatePomFile != null )
>>>>>>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
>>>>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>
>>
>> Thanks,
>>
>> Jason
>>
>> ----------------------------------------------------------
>> Jason van Zyl
>> Founder, Takari and Apache Maven
>> http://twitter.com/jvanzyl
>> http://twitter.com/takari_io
>> ---------------------------------------------------------
>>
>> A language that doesn’t affect the way you think about programming is not
>> worth knowing.
>>
>>   -- Alan Perlis
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>> For additional commands, e-mail: dev-help@maven.apache.org
>>
>>
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Arnaud Héritier <ah...@gmail.com>.
And what about our dear windows users ?
Don't forget that they are very numerous.
Sadly Linux shell is many many far more powerful than windows .bat files
and often we have to reduce features to keep the compatibility with windows.
I wouldn't like to have different features for linux and for windows ...


On Sun, Feb 8, 2015 at 3:04 PM, Jason van Zyl <ja...@takari.io> wrote:

> I think that also works. But I think the script not being executable it
> makes it clear it's not a script. Whatever we decide I'm again filtering
> it, just makes debugging painful.
>
> On Feb 8, 2015, at 7:57 AM, Igor Fedorenko <ig...@ifedorenko.com> wrote:
>
> > I think maintenance overhead and code duplication concerns outweigh
> > possible confusion an extra file might cause, but I think I have a
> > better solution.
> >
> > What if there was single "real" mvn script and mvnDebug/mvnyjp were just
> > symlinks pointing back to it? The script will behave differently based
> > on the script name. Any objections to this plan?
> >
> > --
> > Regards,
> > Igor
> >
> > On 2015-02-08 6:23, Robert Scholte wrote:
> >> Igor, Jason,
> >>
> >> my concern is not about having shared scripting. If that works, that'll
> >> be great.
> >> But from a user perspective I'd like to have a clean bin-folder. Only
> >> have useful scripts here.
> >> So my idea would be: when generating the distribution, just merge these
> >> files to the ones we now have.
> >> I understand Jasons concern regarding it a bit being less obvious when
> >> patching, but that assumes there's still some patching to do every now
> >> and then.
> >> It shouldn't be too hard to do some filtering and only have useful
> >> scripts (and disable it if you want to patch/test)
> >>
> >> thanks,
> >> Robert
> >>
> >> Op Sat, 07 Feb 2015 15:12:17 +0100 schreef Igor Fedorenko
> >> <ig...@ifedorenko.com>:
> >>
> >>> Robert,
> >>>
> >>> Can you explain your concerns? I believe it is a common practice to use
> >>> separate "include" file to keep logic shared by multiple scripts, why
> do
> >>> you think we need do it differently?
> >>>
> >>> --
> >>> Regards,
> >>> Igor
> >>>
> >>> On 2015-02-07 4:24, Robert Scholte wrote:
> >>>> Igor,
> >>>>
> >>>> how about generating these scripts?
> >>>> I'd prefer to have only useful scripts for the users in the bin
> >>>> directory.
> >>>> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
> >>>> be called by users.
> >>>> So instead I'd like to see the other scripts being generated, all
> >>>> including this common script.
> >>>>
> >>>> thanks,
> >>>> Robert
> >>>>
> >>>> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
> >>>>
> >>>>> Repository: maven
> >>>>> Updated Branches:
> >>>>>  refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
> >>>>>
> >>>>>
> >>>>> .mvn/ for project specific jvm options and maven parameters
> >>>>>
> >>>>> Signed-off-by: Igor Fedorenko <if...@apache.org>
> >>>>>
> >>>>>
> >>>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
> >>>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
> >>>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
> >>>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
> >>>>>
> >>>>> Branch: refs/heads/project-basedir
> >>>>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
> >>>>> Parents: d745f8c
> >>>>> Author: Igor Fedorenko <if...@apache.org>
> >>>>> Authored: Mon Jan 26 14:22:05 2015 -0500
> >>>>> Committer: Igor Fedorenko <if...@apache.org>
> >>>>> Committed: Fri Feb 6 15:43:40 2015 -0500
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> apache-maven/src/bin/.gitattributes             |  1 +
> >>>>> apache-maven/src/bin/mvn                        |  8 ++-
> >>>>> apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
> >>>>> apache-maven/src/bin/mvnDebug                   |  8 ++-
> >>>>> apache-maven/src/bin/mvnyjp                     | 23 ++++----
> >>>>> apache-maven/src/main/assembly/bin.xml          |  1 +
> >>>>> .../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 +
> >>>>> 12 files changed, 207 insertions(+), 19 deletions(-)
> >>>>>
> ----------------------------------------------------------------------
> >>>>>
> >>>>>
> >>>>>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/bin/.gitattributes
> >>>>> b/apache-maven/src/bin/.gitattributes
> >>>>> index cc7533f..90eeece 100644
> >>>>> --- a/apache-maven/src/bin/.gitattributes
> >>>>> +++ b/apache-maven/src/bin/.gitattributes
> >>>>> @@ -1,3 +1,4 @@
> >>>>> mvn                eol=lf crlf=input
> >>>>> mvnDebug           eol=lf crlf=input
> >>>>> mvnyjp             eol=lf crlf=input
> >>>>> +mvn-common.sh      eol=lf crlf=input
> >>>>>
> >>>>>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
> >>>>> index 1ed3024..f745f4e 100755
> >>>>> --- a/apache-maven/src/bin/mvn
> >>>>> +++ b/apache-maven/src/bin/mvn
> >>>>> @@ -189,14 +189,18 @@ if $cygwin; then
> >>>>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
> >>>>> fi
> >>>>> +. "$M2_HOME/bin/mvn-common.sh"
> >>>>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/bin/mvn-common.sh
> >>>>> b/apache-maven/src/bin/mvn-common.sh
> >>>>> new file mode 100755
> >>>>> index 0000000..b39741b
> >>>>> --- /dev/null
> >>>>> +++ b/apache-maven/src/bin/mvn-common.sh
> >>>>> @@ -0,0 +1,43 @@
> >>>>> +#!/bin/sh
> >>>>> +#
> >>>>>
> ----------------------------------------------------------------------------
> >>>>>
> >>>>>
> >>>>> +# 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.
> >>>>> +#
> >>>>>
> ----------------------------------------------------------------------------
> >>>>>
> >>>>>
> >>>>> +
> >>>>> +# TODO ideally, this should contain all logic common to mvn* shell
> >>>>> scripts
> >>>>> +
> >>>>> +# 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
> >>>>> +}
> >>>>>
> >>>>>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/bin/mvnDebug
> >>>>> b/apache-maven/src/bin/mvnDebug
> >>>>> index 291f81f..287d20b 100755
> >>>>> --- a/apache-maven/src/bin/mvnDebug
> >>>>> +++ b/apache-maven/src/bin/mvnDebug
> >>>>> @@ -193,9 +193,13 @@ if $cygwin; then
> >>>>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
> >>>>> fi
> >>>>> +. "$M2_HOME/bin/mvn-common.sh"
> >>>>> +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" \
> >>>>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
> >>>>>   $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/bin/mvnyjp
> b/apache-maven/src/bin/mvnyjp
> >>>>> index faf3412..6d5f555 100755
> >>>>> --- a/apache-maven/src/bin/mvnyjp
> >>>>> +++ b/apache-maven/src/bin/mvnyjp
> >>>>> @@ -34,14 +34,6 @@
> >>>>> #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
> >>>>> #
> >>>>>
> ----------------------------------------------------------------------------
> >>>>>
> >>>>>
> >>>>> -QUOTED_ARGS=""
> >>>>> -while [ "$1" != "" ] ; do
> >>>>> -
> >>>>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
> >>>>> -  shift
> >>>>> -
> >>>>> -done
> >>>>> -
> >>>>> if [ -z "$MAVEN_SKIP_RC" ] ; then
> >>>>>  if [ -f /etc/mavenrc ] ; then
> >>>>> @@ -204,11 +196,18 @@ fi
> >>>>>
> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
> >>>>>
> >>>>> $MAVEN_OPTS"
> >>>>> +. "$M2_HOME/bin/mvn-common.sh"
> >>>>> +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_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}"  \
> >>>>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
> >>>>> -
> >>>>> -
> >>>>> +  "-Dmaven.home=${M2_HOME}"
> >>>>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
> >>>>> +  ${CLASSWORLDS_LAUNCHER} "$@"
> >>>>>
> >>>>>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
> >>>>>
> >>>>>
> >>>>>
> ----------------------------------------------------------------------
> >>>>> diff --git a/apache-maven/src/main/assembly/bin.xml
> >>>>> b/apache-maven/src/main/assembly/bin.xml
> >>>>> index b2aa900..6b862f8 100644
> >>>>> --- a/apache-maven/src/main/assembly/bin.xml
> >>>>> +++ b/apache-maven/src/main/assembly/bin.xml
> >>>>> @@ -74,6 +74,7 @@ under the License.
> >>>>>       <outputDirectory>bin</outputDirectory>
> >>>>>       <includes>
> >>>>>         <include>m2</include>
> >>>>> +        <include>mvn-common.sh</include>
> >>>>>         <include>mvn</include>
> >>>>>         <include>mvnDebug</include>
> >>>>>         <!-- This is so that CI systems can periodically run the
> >>>>> profiler -->
> >>>>>
> >>>>>
> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
> >>>>>
> >>>>>
> >>>>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
> >>>>> @@ -91,6 +93,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
> >>>>> @@ -105,6 +109,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" );
> >>>>> @@ -256,13 +262,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.
> >>>>> @@ -275,7 +295,7 @@ public class MavenCli
> >>>>>         }
> >>>>>     }
> >>>>> -    private void cli( CliRequest cliRequest )
> >>>>> +    void cli( CliRequest cliRequest )
> >>>>>         throws Exception
> >>>>>     {
> >>>>>         //
> >>>>> @@ -286,9 +306,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 )
> >>>>>         {
> >>>>> @@ -1070,6 +1119,7 @@ public class MavenCli
> >>>>>             .setUpdateSnapshots( updateSnapshots ) // default: false
> >>>>>             .setNoSnapshotUpdates( noSnapshotUpdates ) // default:
> >>>>> false
> >>>>>             .setGlobalChecksumPolicy( globalChecksumPolicy ) //
> >>>>> default: warn
> >>>>> +            .setProjectBaseDirectory(
> >>>>> cliRequest.projectBaseDirectory )
> >>>>>             ;
> >>>>>        if ( alternatePomFile != null )
> >>>>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
> >>>> For additional commands, e-mail: dev-help@maven.apache.org
> >>>>
> >>>
> >>> ---------------------------------------------------------------------
> >>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> >>> For additional commands, e-mail: dev-help@maven.apache.org
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> >> For additional commands, e-mail: dev-help@maven.apache.org
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> > For additional commands, e-mail: dev-help@maven.apache.org
> >
>
> Thanks,
>
> Jason
>
> ----------------------------------------------------------
> Jason van Zyl
> Founder, Takari and Apache Maven
> http://twitter.com/jvanzyl
> http://twitter.com/takari_io
> ---------------------------------------------------------
>
> A language that doesn’t affect the way you think about programming is not
> worth knowing.
>
>  -- Alan Perlis
>
>
>
>
>
>
>
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>
>


-- 
-----
Arnaud Héritier
http://aheritier.net
Mail/GTalk: aheritier AT gmail DOT com
Twitter/Skype : aheritier

Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Jason van Zyl <ja...@takari.io>.
I think that also works. But I think the script not being executable it makes it clear it's not a script. Whatever we decide I'm again filtering it, just makes debugging painful.

On Feb 8, 2015, at 7:57 AM, Igor Fedorenko <ig...@ifedorenko.com> wrote:

> I think maintenance overhead and code duplication concerns outweigh
> possible confusion an extra file might cause, but I think I have a
> better solution.
> 
> What if there was single "real" mvn script and mvnDebug/mvnyjp were just
> symlinks pointing back to it? The script will behave differently based
> on the script name. Any objections to this plan?
> 
> --
> Regards,
> Igor
> 
> On 2015-02-08 6:23, Robert Scholte wrote:
>> Igor, Jason,
>> 
>> my concern is not about having shared scripting. If that works, that'll
>> be great.
>> But from a user perspective I'd like to have a clean bin-folder. Only
>> have useful scripts here.
>> So my idea would be: when generating the distribution, just merge these
>> files to the ones we now have.
>> I understand Jasons concern regarding it a bit being less obvious when
>> patching, but that assumes there's still some patching to do every now
>> and then.
>> It shouldn't be too hard to do some filtering and only have useful
>> scripts (and disable it if you want to patch/test)
>> 
>> thanks,
>> Robert
>> 
>> Op Sat, 07 Feb 2015 15:12:17 +0100 schreef Igor Fedorenko
>> <ig...@ifedorenko.com>:
>> 
>>> Robert,
>>> 
>>> Can you explain your concerns? I believe it is a common practice to use
>>> separate "include" file to keep logic shared by multiple scripts, why do
>>> you think we need do it differently?
>>> 
>>> --
>>> Regards,
>>> Igor
>>> 
>>> On 2015-02-07 4:24, Robert Scholte wrote:
>>>> Igor,
>>>> 
>>>> how about generating these scripts?
>>>> I'd prefer to have only useful scripts for the users in the bin
>>>> directory.
>>>> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
>>>> be called by users.
>>>> So instead I'd like to see the other scripts being generated, all
>>>> including this common script.
>>>> 
>>>> thanks,
>>>> Robert
>>>> 
>>>> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
>>>> 
>>>>> Repository: maven
>>>>> Updated Branches:
>>>>>  refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>>>>> 
>>>>> 
>>>>> .mvn/ for project specific jvm options and maven parameters
>>>>> 
>>>>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>>>>> 
>>>>> 
>>>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>>>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>>>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>>>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>>>>> 
>>>>> Branch: refs/heads/project-basedir
>>>>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>>>>> Parents: d745f8c
>>>>> Author: Igor Fedorenko <if...@apache.org>
>>>>> Authored: Mon Jan 26 14:22:05 2015 -0500
>>>>> Committer: Igor Fedorenko <if...@apache.org>
>>>>> Committed: Fri Feb 6 15:43:40 2015 -0500
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> apache-maven/src/bin/.gitattributes             |  1 +
>>>>> apache-maven/src/bin/mvn                        |  8 ++-
>>>>> apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>>>>> apache-maven/src/bin/mvnDebug                   |  8 ++-
>>>>> apache-maven/src/bin/mvnyjp                     | 23 ++++----
>>>>> apache-maven/src/main/assembly/bin.xml          |  1 +
>>>>> .../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 +
>>>>> 12 files changed, 207 insertions(+), 19 deletions(-)
>>>>> ----------------------------------------------------------------------
>>>>> 
>>>>> 
>>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/bin/.gitattributes
>>>>> b/apache-maven/src/bin/.gitattributes
>>>>> index cc7533f..90eeece 100644
>>>>> --- a/apache-maven/src/bin/.gitattributes
>>>>> +++ b/apache-maven/src/bin/.gitattributes
>>>>> @@ -1,3 +1,4 @@
>>>>> mvn                eol=lf crlf=input
>>>>> mvnDebug           eol=lf crlf=input
>>>>> mvnyjp             eol=lf crlf=input
>>>>> +mvn-common.sh      eol=lf crlf=input
>>>>> 
>>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>>>>> index 1ed3024..f745f4e 100755
>>>>> --- a/apache-maven/src/bin/mvn
>>>>> +++ b/apache-maven/src/bin/mvn
>>>>> @@ -189,14 +189,18 @@ if $cygwin; then
>>>>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>> fi
>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/bin/mvn-common.sh
>>>>> b/apache-maven/src/bin/mvn-common.sh
>>>>> new file mode 100755
>>>>> index 0000000..b39741b
>>>>> --- /dev/null
>>>>> +++ b/apache-maven/src/bin/mvn-common.sh
>>>>> @@ -0,0 +1,43 @@
>>>>> +#!/bin/sh
>>>>> +#
>>>>> ----------------------------------------------------------------------------
>>>>> 
>>>>> 
>>>>> +# 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.
>>>>> +#
>>>>> ----------------------------------------------------------------------------
>>>>> 
>>>>> 
>>>>> +
>>>>> +# TODO ideally, this should contain all logic common to mvn* shell
>>>>> scripts
>>>>> +
>>>>> +# 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
>>>>> +}
>>>>> 
>>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/bin/mvnDebug
>>>>> b/apache-maven/src/bin/mvnDebug
>>>>> index 291f81f..287d20b 100755
>>>>> --- a/apache-maven/src/bin/mvnDebug
>>>>> +++ b/apache-maven/src/bin/mvnDebug
>>>>> @@ -193,9 +193,13 @@ if $cygwin; then
>>>>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>> fi
>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>> +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" \
>>>>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>>>>   $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
>>>>> index faf3412..6d5f555 100755
>>>>> --- a/apache-maven/src/bin/mvnyjp
>>>>> +++ b/apache-maven/src/bin/mvnyjp
>>>>> @@ -34,14 +34,6 @@
>>>>> #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>>>>> #
>>>>> ----------------------------------------------------------------------------
>>>>> 
>>>>> 
>>>>> -QUOTED_ARGS=""
>>>>> -while [ "$1" != "" ] ; do
>>>>> -
>>>>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>>>>> -  shift
>>>>> -
>>>>> -done
>>>>> -
>>>>> if [ -z "$MAVEN_SKIP_RC" ] ; then
>>>>>  if [ -f /etc/mavenrc ] ; then
>>>>> @@ -204,11 +196,18 @@ fi
>>>>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
>>>>> 
>>>>> $MAVEN_OPTS"
>>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>>> +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_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}"  \
>>>>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>>>>> -
>>>>> -
>>>>> +  "-Dmaven.home=${M2_HOME}"
>>>>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>>>>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>>>>> 
>>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>>>>> 
>>>>> 
>>>>> ----------------------------------------------------------------------
>>>>> diff --git a/apache-maven/src/main/assembly/bin.xml
>>>>> b/apache-maven/src/main/assembly/bin.xml
>>>>> index b2aa900..6b862f8 100644
>>>>> --- a/apache-maven/src/main/assembly/bin.xml
>>>>> +++ b/apache-maven/src/main/assembly/bin.xml
>>>>> @@ -74,6 +74,7 @@ under the License.
>>>>>       <outputDirectory>bin</outputDirectory>
>>>>>       <includes>
>>>>>         <include>m2</include>
>>>>> +        <include>mvn-common.sh</include>
>>>>>         <include>mvn</include>
>>>>>         <include>mvnDebug</include>
>>>>>         <!-- This is so that CI systems can periodically run the
>>>>> profiler -->
>>>>> 
>>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>>>>> 
>>>>> 
>>>>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>>>>> @@ -91,6 +93,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
>>>>> @@ -105,6 +109,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" );
>>>>> @@ -256,13 +262,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.
>>>>> @@ -275,7 +295,7 @@ public class MavenCli
>>>>>         }
>>>>>     }
>>>>> -    private void cli( CliRequest cliRequest )
>>>>> +    void cli( CliRequest cliRequest )
>>>>>         throws Exception
>>>>>     {
>>>>>         //
>>>>> @@ -286,9 +306,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 )
>>>>>         {
>>>>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>>>>             .setUpdateSnapshots( updateSnapshots ) // default: false
>>>>>             .setNoSnapshotUpdates( noSnapshotUpdates ) // default:
>>>>> false
>>>>>             .setGlobalChecksumPolicy( globalChecksumPolicy ) //
>>>>> default: warn
>>>>> +            .setProjectBaseDirectory(
>>>>> cliRequest.projectBaseDirectory )
>>>>>             ;
>>>>>        if ( alternatePomFile != null )
>>>>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
>>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>> 
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>>> For additional commands, e-mail: dev-help@maven.apache.org
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>> For additional commands, e-mail: dev-help@maven.apache.org
>> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
> 

Thanks,

Jason

----------------------------------------------------------
Jason van Zyl
Founder, Takari and Apache Maven
http://twitter.com/jvanzyl
http://twitter.com/takari_io
---------------------------------------------------------

A language that doesn’t affect the way you think about programming is not worth knowing. 
 
 -- Alan Perlis













---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Igor Fedorenko <ig...@ifedorenko.com>.
I think maintenance overhead and code duplication concerns outweigh
possible confusion an extra file might cause, but I think I have a
better solution.

What if there was single "real" mvn script and mvnDebug/mvnyjp were just
symlinks pointing back to it? The script will behave differently based
on the script name. Any objections to this plan?

--
Regards,
Igor

On 2015-02-08 6:23, Robert Scholte wrote:
> Igor, Jason,
>
> my concern is not about having shared scripting. If that works, that'll
> be great.
> But from a user perspective I'd like to have a clean bin-folder. Only
> have useful scripts here.
> So my idea would be: when generating the distribution, just merge these
> files to the ones we now have.
> I understand Jasons concern regarding it a bit being less obvious when
> patching, but that assumes there's still some patching to do every now
> and then.
> It shouldn't be too hard to do some filtering and only have useful
> scripts (and disable it if you want to patch/test)
>
> thanks,
> Robert
>
> Op Sat, 07 Feb 2015 15:12:17 +0100 schreef Igor Fedorenko
> <ig...@ifedorenko.com>:
>
>> Robert,
>>
>> Can you explain your concerns? I believe it is a common practice to use
>> separate "include" file to keep logic shared by multiple scripts, why do
>> you think we need do it differently?
>>
>> --
>> Regards,
>> Igor
>>
>> On 2015-02-07 4:24, Robert Scholte wrote:
>>> Igor,
>>>
>>> how about generating these scripts?
>>> I'd prefer to have only useful scripts for the users in the bin
>>> directory.
>>> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
>>> be called by users.
>>> So instead I'd like to see the other scripts being generated, all
>>> including this common script.
>>>
>>> thanks,
>>> Robert
>>>
>>> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
>>>
>>>> Repository: maven
>>>> Updated Branches:
>>>>   refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>>>>
>>>>
>>>> .mvn/ for project specific jvm options and maven parameters
>>>>
>>>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>>>>
>>>>
>>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>>>>
>>>> Branch: refs/heads/project-basedir
>>>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>>>> Parents: d745f8c
>>>> Author: Igor Fedorenko <if...@apache.org>
>>>> Authored: Mon Jan 26 14:22:05 2015 -0500
>>>> Committer: Igor Fedorenko <if...@apache.org>
>>>> Committed: Fri Feb 6 15:43:40 2015 -0500
>>>>
>>>> ----------------------------------------------------------------------
>>>>  apache-maven/src/bin/.gitattributes             |  1 +
>>>>  apache-maven/src/bin/mvn                        |  8 ++-
>>>>  apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>>>>  apache-maven/src/bin/mvnDebug                   |  8 ++-
>>>>  apache-maven/src/bin/mvnyjp                     | 23 ++++----
>>>>  apache-maven/src/main/assembly/bin.xml          |  1 +
>>>>  .../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 +
>>>>  12 files changed, 207 insertions(+), 19 deletions(-)
>>>> ----------------------------------------------------------------------
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/bin/.gitattributes
>>>> b/apache-maven/src/bin/.gitattributes
>>>> index cc7533f..90eeece 100644
>>>> --- a/apache-maven/src/bin/.gitattributes
>>>> +++ b/apache-maven/src/bin/.gitattributes
>>>> @@ -1,3 +1,4 @@
>>>>  mvn                eol=lf crlf=input
>>>>  mvnDebug           eol=lf crlf=input
>>>>  mvnyjp             eol=lf crlf=input
>>>> +mvn-common.sh      eol=lf crlf=input
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>>>> index 1ed3024..f745f4e 100755
>>>> --- a/apache-maven/src/bin/mvn
>>>> +++ b/apache-maven/src/bin/mvn
>>>> @@ -189,14 +189,18 @@ if $cygwin; then
>>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>  fi
>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/bin/mvn-common.sh
>>>> b/apache-maven/src/bin/mvn-common.sh
>>>> new file mode 100755
>>>> index 0000000..b39741b
>>>> --- /dev/null
>>>> +++ b/apache-maven/src/bin/mvn-common.sh
>>>> @@ -0,0 +1,43 @@
>>>> +#!/bin/sh
>>>> +#
>>>> ----------------------------------------------------------------------------
>>>>
>>>>
>>>> +# 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.
>>>> +#
>>>> ----------------------------------------------------------------------------
>>>>
>>>>
>>>> +
>>>> +# TODO ideally, this should contain all logic common to mvn* shell
>>>> scripts
>>>> +
>>>> +# 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
>>>> +}
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/bin/mvnDebug
>>>> b/apache-maven/src/bin/mvnDebug
>>>> index 291f81f..287d20b 100755
>>>> --- a/apache-maven/src/bin/mvnDebug
>>>> +++ b/apache-maven/src/bin/mvnDebug
>>>> @@ -193,9 +193,13 @@ if $cygwin; then
>>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>>  fi
>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>> +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" \
>>>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>>>    $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
>>>> index faf3412..6d5f555 100755
>>>> --- a/apache-maven/src/bin/mvnyjp
>>>> +++ b/apache-maven/src/bin/mvnyjp
>>>> @@ -34,14 +34,6 @@
>>>>  #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>>>>  #
>>>> ----------------------------------------------------------------------------
>>>>
>>>>
>>>> -QUOTED_ARGS=""
>>>> -while [ "$1" != "" ] ; do
>>>> -
>>>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>>>> -  shift
>>>> -
>>>> -done
>>>> -
>>>>  if [ -z "$MAVEN_SKIP_RC" ] ; then
>>>>   if [ -f /etc/mavenrc ] ; then
>>>> @@ -204,11 +196,18 @@ fi
>>>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
>>>>
>>>> $MAVEN_OPTS"
>>>> +. "$M2_HOME/bin/mvn-common.sh"
>>>> +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_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}"  \
>>>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>>>> -
>>>> -
>>>> +  "-Dmaven.home=${M2_HOME}"
>>>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>>>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> diff --git a/apache-maven/src/main/assembly/bin.xml
>>>> b/apache-maven/src/main/assembly/bin.xml
>>>> index b2aa900..6b862f8 100644
>>>> --- a/apache-maven/src/main/assembly/bin.xml
>>>> +++ b/apache-maven/src/main/assembly/bin.xml
>>>> @@ -74,6 +74,7 @@ under the License.
>>>>        <outputDirectory>bin</outputDirectory>
>>>>        <includes>
>>>>          <include>m2</include>
>>>> +        <include>mvn-common.sh</include>
>>>>          <include>mvn</include>
>>>>          <include>mvnDebug</include>
>>>>          <!-- This is so that CI systems can periodically run the
>>>> profiler -->
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>>>>
>>>>
>>>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>>>> @@ -91,6 +93,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
>>>> @@ -105,6 +109,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" );
>>>> @@ -256,13 +262,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.
>>>> @@ -275,7 +295,7 @@ public class MavenCli
>>>>          }
>>>>      }
>>>> -    private void cli( CliRequest cliRequest )
>>>> +    void cli( CliRequest cliRequest )
>>>>          throws Exception
>>>>      {
>>>>          //
>>>> @@ -286,9 +306,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 )
>>>>          {
>>>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>>>              .setUpdateSnapshots( updateSnapshots ) // default: false
>>>>              .setNoSnapshotUpdates( noSnapshotUpdates ) // default:
>>>> false
>>>>              .setGlobalChecksumPolicy( globalChecksumPolicy ) //
>>>> default: warn
>>>> +            .setProjectBaseDirectory(
>>>> cliRequest.projectBaseDirectory )
>>>>              ;
>>>>         if ( alternatePomFile != null )
>>>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
>>> For additional commands, e-mail: dev-help@maven.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
>> For additional commands, e-mail: dev-help@maven.apache.org
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Robert Scholte <rf...@apache.org>.
Igor, Jason,

my concern is not about having shared scripting. If that works, that'll be  
great.
But from a user perspective I'd like to have a clean bin-folder. Only have  
useful scripts here.
So my idea would be: when generating the distribution, just merge these  
files to the ones we now have.
I understand Jasons concern regarding it a bit being less obvious when  
patching, but that assumes there's still some patching to do every now and  
then.
It shouldn't be too hard to do some filtering and only have useful scripts  
(and disable it if you want to patch/test)

thanks,
Robert

Op Sat, 07 Feb 2015 15:12:17 +0100 schreef Igor Fedorenko  
<ig...@ifedorenko.com>:

> Robert,
>
> Can you explain your concerns? I believe it is a common practice to use
> separate "include" file to keep logic shared by multiple scripts, why do
> you think we need do it differently?
>
> --
> Regards,
> Igor
>
> On 2015-02-07 4:24, Robert Scholte wrote:
>> Igor,
>>
>> how about generating these scripts?
>> I'd prefer to have only useful scripts for the users in the bin  
>> directory.
>> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
>> be called by users.
>> So instead I'd like to see the other scripts being generated, all
>> including this common script.
>>
>> thanks,
>> Robert
>>
>> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
>>
>>> Repository: maven
>>> Updated Branches:
>>>   refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>>>
>>>
>>> .mvn/ for project specific jvm options and maven parameters
>>>
>>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>>>
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>>>
>>> Branch: refs/heads/project-basedir
>>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>>> Parents: d745f8c
>>> Author: Igor Fedorenko <if...@apache.org>
>>> Authored: Mon Jan 26 14:22:05 2015 -0500
>>> Committer: Igor Fedorenko <if...@apache.org>
>>> Committed: Fri Feb 6 15:43:40 2015 -0500
>>>
>>> ----------------------------------------------------------------------
>>>  apache-maven/src/bin/.gitattributes             |  1 +
>>>  apache-maven/src/bin/mvn                        |  8 ++-
>>>  apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>>>  apache-maven/src/bin/mvnDebug                   |  8 ++-
>>>  apache-maven/src/bin/mvnyjp                     | 23 ++++----
>>>  apache-maven/src/main/assembly/bin.xml          |  1 +
>>>  .../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 +
>>>  12 files changed, 207 insertions(+), 19 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/bin/.gitattributes
>>> b/apache-maven/src/bin/.gitattributes
>>> index cc7533f..90eeece 100644
>>> --- a/apache-maven/src/bin/.gitattributes
>>> +++ b/apache-maven/src/bin/.gitattributes
>>> @@ -1,3 +1,4 @@
>>>  mvn                eol=lf crlf=input
>>>  mvnDebug           eol=lf crlf=input
>>>  mvnyjp             eol=lf crlf=input
>>> +mvn-common.sh      eol=lf crlf=input
>>>
>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>>> index 1ed3024..f745f4e 100755
>>> --- a/apache-maven/src/bin/mvn
>>> +++ b/apache-maven/src/bin/mvn
>>> @@ -189,14 +189,18 @@ if $cygwin; then
>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>  fi
>>> +. "$M2_HOME/bin/mvn-common.sh"
>>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/bin/mvn-common.sh
>>> b/apache-maven/src/bin/mvn-common.sh
>>> new file mode 100755
>>> index 0000000..b39741b
>>> --- /dev/null
>>> +++ b/apache-maven/src/bin/mvn-common.sh
>>> @@ -0,0 +1,43 @@
>>> +#!/bin/sh
>>> +#
>>> ----------------------------------------------------------------------------
>>>
>>> +# 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.
>>> +#
>>> ----------------------------------------------------------------------------
>>>
>>> +
>>> +# TODO ideally, this should contain all logic common to mvn* shell
>>> scripts
>>> +
>>> +# 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
>>> +}
>>>
>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/bin/mvnDebug
>>> b/apache-maven/src/bin/mvnDebug
>>> index 291f81f..287d20b 100755
>>> --- a/apache-maven/src/bin/mvnDebug
>>> +++ b/apache-maven/src/bin/mvnDebug
>>> @@ -193,9 +193,13 @@ if $cygwin; then
>>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>>  fi
>>> +. "$M2_HOME/bin/mvn-common.sh"
>>> +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" \
>>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>>    $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
>>> index faf3412..6d5f555 100755
>>> --- a/apache-maven/src/bin/mvnyjp
>>> +++ b/apache-maven/src/bin/mvnyjp
>>> @@ -34,14 +34,6 @@
>>>  #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>>>  #
>>> ----------------------------------------------------------------------------
>>>
>>> -QUOTED_ARGS=""
>>> -while [ "$1" != "" ] ; do
>>> -
>>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>>> -  shift
>>> -
>>> -done
>>> -
>>>  if [ -z "$MAVEN_SKIP_RC" ] ; then
>>>   if [ -f /etc/mavenrc ] ; then
>>> @@ -204,11 +196,18 @@ fi
>>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
>>> $MAVEN_OPTS"
>>> +. "$M2_HOME/bin/mvn-common.sh"
>>> +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_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}"  \
>>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>>> -
>>> -
>>> +  "-Dmaven.home=${M2_HOME}"
>>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>>>
>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>>>
>>> ----------------------------------------------------------------------
>>> diff --git a/apache-maven/src/main/assembly/bin.xml
>>> b/apache-maven/src/main/assembly/bin.xml
>>> index b2aa900..6b862f8 100644
>>> --- a/apache-maven/src/main/assembly/bin.xml
>>> +++ b/apache-maven/src/main/assembly/bin.xml
>>> @@ -74,6 +74,7 @@ under the License.
>>>        <outputDirectory>bin</outputDirectory>
>>>        <includes>
>>>          <include>m2</include>
>>> +        <include>mvn-common.sh</include>
>>>          <include>mvn</include>
>>>          <include>mvnDebug</include>
>>>          <!-- This is so that CI systems can periodically run the
>>> profiler -->
>>>
>>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>>>
>>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>>> @@ -91,6 +93,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
>>> @@ -105,6 +109,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" );
>>> @@ -256,13 +262,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.
>>> @@ -275,7 +295,7 @@ public class MavenCli
>>>          }
>>>      }
>>> -    private void cli( CliRequest cliRequest )
>>> +    void cli( CliRequest cliRequest )
>>>          throws Exception
>>>      {
>>>          //
>>> @@ -286,9 +306,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 )
>>>          {
>>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>>              .setUpdateSnapshots( updateSnapshots ) // default: false
>>>              .setNoSnapshotUpdates( noSnapshotUpdates ) // default:  
>>> false
>>>              .setGlobalChecksumPolicy( globalChecksumPolicy ) //
>>> default: warn
>>> +            .setProjectBaseDirectory( cliRequest.projectBaseDirectory  
>>> )
>>>              ;
>>>         if ( alternatePomFile != null )
>>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
>> For additional commands, e-mail: dev-help@maven.apache.org
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Igor Fedorenko <ig...@ifedorenko.com>.
Robert,

Can you explain your concerns? I believe it is a common practice to use
separate "include" file to keep logic shared by multiple scripts, why do
you think we need do it differently?

--
Regards,
Igor

On 2015-02-07 4:24, Robert Scholte wrote:
> Igor,
>
> how about generating these scripts?
> I'd prefer to have only useful scripts for the users in the bin directory.
> IIUC the mvn-common.sh is just used by all other scripts and shouldn't
> be called by users.
> So instead I'd like to see the other scripts being generated, all
> including this common script.
>
> thanks,
> Robert
>
> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
>
>> Repository: maven
>> Updated Branches:
>>   refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>>
>>
>> .mvn/ for project specific jvm options and maven parameters
>>
>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>>
>> Branch: refs/heads/project-basedir
>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>> Parents: d745f8c
>> Author: Igor Fedorenko <if...@apache.org>
>> Authored: Mon Jan 26 14:22:05 2015 -0500
>> Committer: Igor Fedorenko <if...@apache.org>
>> Committed: Fri Feb 6 15:43:40 2015 -0500
>>
>> ----------------------------------------------------------------------
>>  apache-maven/src/bin/.gitattributes             |  1 +
>>  apache-maven/src/bin/mvn                        |  8 ++-
>>  apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>>  apache-maven/src/bin/mvnDebug                   |  8 ++-
>>  apache-maven/src/bin/mvnyjp                     | 23 ++++----
>>  apache-maven/src/main/assembly/bin.xml          |  1 +
>>  .../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 +
>>  12 files changed, 207 insertions(+), 19 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/.gitattributes
>> b/apache-maven/src/bin/.gitattributes
>> index cc7533f..90eeece 100644
>> --- a/apache-maven/src/bin/.gitattributes
>> +++ b/apache-maven/src/bin/.gitattributes
>> @@ -1,3 +1,4 @@
>>  mvn                eol=lf crlf=input
>>  mvnDebug           eol=lf crlf=input
>>  mvnyjp             eol=lf crlf=input
>> +mvn-common.sh      eol=lf crlf=input
>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>> index 1ed3024..f745f4e 100755
>> --- a/apache-maven/src/bin/mvn
>> +++ b/apache-maven/src/bin/mvn
>> @@ -189,14 +189,18 @@ if $cygwin; then
>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>  fi
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvn-common.sh
>> b/apache-maven/src/bin/mvn-common.sh
>> new file mode 100755
>> index 0000000..b39741b
>> --- /dev/null
>> +++ b/apache-maven/src/bin/mvn-common.sh
>> @@ -0,0 +1,43 @@
>> +#!/bin/sh
>> +#
>> ----------------------------------------------------------------------------
>>
>> +# 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.
>> +#
>> ----------------------------------------------------------------------------
>>
>> +
>> +# TODO ideally, this should contain all logic common to mvn* shell
>> scripts
>> +
>> +# 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
>> +}
>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvnDebug
>> b/apache-maven/src/bin/mvnDebug
>> index 291f81f..287d20b 100755
>> --- a/apache-maven/src/bin/mvnDebug
>> +++ b/apache-maven/src/bin/mvnDebug
>> @@ -193,9 +193,13 @@ if $cygwin; then
>>      CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>>  fi
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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" \
>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>    $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
>> index faf3412..6d5f555 100755
>> --- a/apache-maven/src/bin/mvnyjp
>> +++ b/apache-maven/src/bin/mvnyjp
>> @@ -34,14 +34,6 @@
>>  #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>>  #
>> ----------------------------------------------------------------------------
>>
>> -QUOTED_ARGS=""
>> -while [ "$1" != "" ] ; do
>> -
>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>> -  shift
>> -
>> -done
>> -
>>  if [ -z "$MAVEN_SKIP_RC" ] ; then
>>   if [ -f /etc/mavenrc ] ; then
>> @@ -204,11 +196,18 @@ fi
>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
>> $MAVEN_OPTS"
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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_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}"  \
>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>> -
>> -
>> +  "-Dmaven.home=${M2_HOME}"
>> "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>>
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/main/assembly/bin.xml
>> b/apache-maven/src/main/assembly/bin.xml
>> index b2aa900..6b862f8 100644
>> --- a/apache-maven/src/main/assembly/bin.xml
>> +++ b/apache-maven/src/main/assembly/bin.xml
>> @@ -74,6 +74,7 @@ under the License.
>>        <outputDirectory>bin</outputDirectory>
>>        <includes>
>>          <include>m2</include>
>> +        <include>mvn-common.sh</include>
>>          <include>mvn</include>
>>          <include>mvnDebug</include>
>>          <!-- This is so that CI systems can periodically run the
>> profiler -->
>>
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>>
>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>> @@ -91,6 +93,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
>> @@ -105,6 +109,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" );
>> @@ -256,13 +262,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.
>> @@ -275,7 +295,7 @@ public class MavenCli
>>          }
>>      }
>> -    private void cli( CliRequest cliRequest )
>> +    void cli( CliRequest cliRequest )
>>          throws Exception
>>      {
>>          //
>> @@ -286,9 +306,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 )
>>          {
>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>              .setUpdateSnapshots( updateSnapshots ) // default: false
>>              .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
>>              .setGlobalChecksumPolicy( globalChecksumPolicy ) //
>> default: warn
>> +            .setProjectBaseDirectory( cliRequest.projectBaseDirectory )
>>              ;
>>         if ( alternatePomFile != null )
>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


Re: maven git commit: .mvn/ for project specific jvm options and maven parameters

Posted by Jason van Zyl <ja...@takari.io>.
On Feb 7, 2015, at 4:24 AM, Robert Scholte <rf...@apache.org> wrote:

> Igor,
> 
> how about generating these scripts?

I don't think generating them is a good idea. Primarily because it makes it far more difficult for anyone to patch the script and try. If someone has to run a build to generate a script to test it, I know personally I will find that very annoying.

> I'd prefer to have only useful scripts for the users in the bin directory.

The common file doesn't need to be executable or a .sh file and can just be a .mvn-common that makes it clear it's not a stand-alone script to run (and it can't be run if not executable), but just a file to be sourced.

> IIUC the mvn-common.sh is just used by all other scripts and shouldn't be called by users.
> So instead I'd like to see the other scripts being generated, all including this common script.

I don't agree for the reasons cited above, and it's easy to make it obvious it's not to be used alone.

> 
> thanks,
> Robert
> 
> Op Fri, 06 Feb 2015 22:31:47 +0100 schreef <if...@apache.org>:
> 
>> Repository: maven
>> Updated Branches:
>>  refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
>> 
>> 
>> .mvn/ for project specific jvm options and maven parameters
>> 
>> Signed-off-by: Igor Fedorenko <if...@apache.org>
>> 
>> 
>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo
>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
>> 
>> Branch: refs/heads/project-basedir
>> Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
>> Parents: d745f8c
>> Author: Igor Fedorenko <if...@apache.org>
>> Authored: Mon Jan 26 14:22:05 2015 -0500
>> Committer: Igor Fedorenko <if...@apache.org>
>> Committed: Fri Feb 6 15:43:40 2015 -0500
>> 
>> ----------------------------------------------------------------------
>> apache-maven/src/bin/.gitattributes             |  1 +
>> apache-maven/src/bin/mvn                        |  8 ++-
>> apache-maven/src/bin/mvn-common.sh              | 43 ++++++++++++++
>> apache-maven/src/bin/mvnDebug                   |  8 ++-
>> apache-maven/src/bin/mvnyjp                     | 23 ++++----
>> apache-maven/src/main/assembly/bin.xml          |  1 +
>> .../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 +
>> 12 files changed, 207 insertions(+), 19 deletions(-)
>> ----------------------------------------------------------------------
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/.gitattributes b/apache-maven/src/bin/.gitattributes
>> index cc7533f..90eeece 100644
>> --- a/apache-maven/src/bin/.gitattributes
>> +++ b/apache-maven/src/bin/.gitattributes
>> @@ -1,3 +1,4 @@
>> mvn                eol=lf crlf=input
>> mvnDebug           eol=lf crlf=input
>> mvnyjp             eol=lf crlf=input
>> +mvn-common.sh      eol=lf crlf=input
>> 
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
>> index 1ed3024..f745f4e 100755
>> --- a/apache-maven/src/bin/mvn
>> +++ b/apache-maven/src/bin/mvn
>> @@ -189,14 +189,18 @@ if $cygwin; then
>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>> fi
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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/e91144fb/apache-maven/src/bin/mvn-common.sh
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvn-common.sh b/apache-maven/src/bin/mvn-common.sh
>> new file mode 100755
>> index 0000000..b39741b
>> --- /dev/null
>> +++ b/apache-maven/src/bin/mvn-common.sh
>> @@ -0,0 +1,43 @@
>> +#!/bin/sh
>> +# ----------------------------------------------------------------------------
>> +# 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.
>> +# ----------------------------------------------------------------------------
>> +
>> +# TODO ideally, this should contain all logic common to mvn* shell scripts
>> +
>> +# 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
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvnDebug b/apache-maven/src/bin/mvnDebug
>> index 291f81f..287d20b 100755
>> --- a/apache-maven/src/bin/mvnDebug
>> +++ b/apache-maven/src/bin/mvnDebug
>> @@ -193,9 +193,13 @@ if $cygwin; then
>>     CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
>> fi
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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" \
>> @@ -203,5 +207,5 @@ exec "$JAVACMD" \
>>   $MAVEN_DEBUG_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/e91144fb/apache-maven/src/bin/mvnyjp
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
>> index faf3412..6d5f555 100755
>> --- a/apache-maven/src/bin/mvnyjp
>> +++ b/apache-maven/src/bin/mvnyjp
>> @@ -34,14 +34,6 @@
>> #   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
>> # ----------------------------------------------------------------------------
>> -QUOTED_ARGS=""
>> -while [ "$1" != "" ] ; do
>> -
>> -  QUOTED_ARGS="$QUOTED_ARGS \"$1\""
>> -  shift
>> -
>> -done
>> -
>> if [ -z "$MAVEN_SKIP_RC" ] ; then
>>  if [ -f /etc/mavenrc ] ; then
>> @@ -204,11 +196,18 @@ fi
>> MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal $MAVEN_OPTS"
>> +. "$M2_HOME/bin/mvn-common.sh"
>> +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_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}"  \
>> -  ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
>> -
>> -
>> +  "-Dmaven.home=${M2_HOME}" "-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
>> +  ${CLASSWORLDS_LAUNCHER} "$@"
>> 
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
>> ----------------------------------------------------------------------
>> diff --git a/apache-maven/src/main/assembly/bin.xml b/apache-maven/src/main/assembly/bin.xml
>> index b2aa900..6b862f8 100644
>> --- a/apache-maven/src/main/assembly/bin.xml
>> +++ b/apache-maven/src/main/assembly/bin.xml
>> @@ -74,6 +74,7 @@ under the License.
>>       <outputDirectory>bin</outputDirectory>
>>       <includes>
>>         <include>m2</include>
>> +        <include>mvn-common.sh</include>
>>         <include>mvn</include>
>>         <include>mvnDebug</include>
>>         <!-- This is so that CI systems can periodically run the profiler -->
>> 
>> http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/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/e91144fb/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 15e2082..0591440 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
>> @@ -411,4 +411,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/e91144fb/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 5b7bd7f..d04cbe0 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;
>> @@ -91,6 +93,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
>> @@ -105,6 +109,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" );
>> @@ -256,13 +262,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.
>> @@ -275,7 +295,7 @@ public class MavenCli
>>         }
>>     }
>> -    private void cli( CliRequest cliRequest )
>> +    void cli( CliRequest cliRequest )
>>         throws Exception
>>     {
>>         //
>> @@ -286,9 +306,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 )
>>         {
>> @@ -1070,6 +1119,7 @@ public class MavenCli
>>             .setUpdateSnapshots( updateSnapshots ) // default: false
>>             .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
>>             .setGlobalChecksumPolicy( globalChecksumPolicy ) // default: warn
>> +            .setProjectBaseDirectory( cliRequest.projectBaseDirectory )
>>             ;
>>        if ( alternatePomFile != null )
>> @@ -1319,6 +1369,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/e91144fb/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/e91144fb/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/e91144fb/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: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
> 

Thanks,

Jason

----------------------------------------------------------
Jason van Zyl
Founder, Takari and Apache Maven
http://twitter.com/jvanzyl
http://twitter.com/takari_io
---------------------------------------------------------

Simplex sigillum veri. (Simplicity is the seal of truth.)













---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org