On Feb 7, 2015, at 4:24 AM, Robert Scholte <[email protected]> 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 <[email protected]>: > >> 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 <[email protected]> >> >> >> 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 <[email protected]> >> Authored: Mon Jan 26 14:22:05 2015 -0500 >> Committer: Igor Fedorenko <[email protected]> >> 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: [email protected] > For additional commands, e-mail: [email protected] > 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: [email protected] For additional commands, e-mail: [email protected]
