diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn index 2a88df23eae2..39672f8e3442 100755 --- a/apache-maven/src/bin/mvn +++ b/apache-maven/src/bin/mvn @@ -121,7 +121,7 @@ fi # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { ( - basedir="`pwd`" + basedir=`find_file_argument_basedir "$@"` wdir="`pwd`" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then @@ -134,6 +134,33 @@ find_maven_basedir() { ) } +find_file_argument_basedir() { +( + basedir="`pwd`" + + found_file_switch=0 + for arg in "$@"; do + if [ ${found_file_switch} -eq 1 ]; then + if [ -f ${arg} ]; then + basedir=$(dirname $(readlink -f "${arg}")) + if [ ! -d ${basedir} ]; then + echo "Directory ${basedir} extracted from the -f/--file command-line argument ${arg} does not exist" >&2 + exit 1 + fi + else + echo "POM file ${arg} specified with the -f/--file command line argument does not exist" >&2 + exit 1 + fi + break + fi + if [ "$arg" == "-f" -o "$arg" == "--file" ]; then + found_file_switch=1 + fi + done + echo "${basedir}" +) +} + # concatenates all lines of a file concat_lines() { if [ -f "$1" ]; then @@ -141,7 +168,7 @@ concat_lines() { fi } -MAVEN_PROJECTBASEDIR="${MAVEN_BASEDIR:-`find_maven_basedir`}" +MAVEN_PROJECTBASEDIR="${MAVEN_BASEDIR:-`find_maven_basedir "$@"`}" MAVEN_OPTS="`concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config"` $MAVEN_OPTS" # For Cygwin, switch project base directory path to Windows format before diff --git a/apache-maven/src/bin/mvn.cmd b/apache-maven/src/bin/mvn.cmd index c8ad237ef614..ff8d6f56e94d 100644 --- a/apache-maven/src/bin/mvn.cmd +++ b/apache-maven/src/bin/mvn.cmd @@ -86,19 +86,69 @@ set MAVEN_CMD_LINE_ARGS=%* set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% if not "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir -set "EXEC_DIR=%CD%" -set "WDIR=%EXEC_DIR%" +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% + +@REM Look for the --file switch and start the search for the .mvn directory from the specified +@REM POM location, if supplied. + +set FILE_ARG= +:arg_loop +if "%1" == "-f" ( + set "FILE_ARG=%2" + shift + goto process_file_arg +) +if "%1" == "--file" ( + set "FILE_ARG=%2" + shift + goto process_file_arg +) +@REM If none of the above, skip the argument +shift +if not "%~1" == "" ( + goto arg_loop +) else ( + goto findBaseDir +) + +:process_file_arg +if "%FILE_ARG%" == "" ( + goto findBaseDir +) +if not exist "%FILE_ARG%" ( + echo POM file %FILE_ARG% specified the -f/--file command-line argument does not exist >&2 + goto error +) +call :get_directory_from_file %FILE_ARG% +if not exist "%POM_DIR%" ( + echo Directory %POM_DIR% extracted from the -f/--file command-line argument %FILE_ARG% does not exist >&2 + goto error +) +set WDIR=%POM_DIR% +goto findBaseDir + +:get_directory_from_file +set "POM_DIR=%~dp1" +:stripPomDir +if not "_%POM_DIR:~-1%"=="_\" goto pomDirStripped +set "POM_DIR=%POM_DIR:~0,-1%" +goto stripPomDir +:pomDirStripped +exit /b :findBaseDir +cd /d %WDIR% +:findBaseDirLoop if exist "%WDIR%\.mvn" goto baseDirFound cd .. if "%WDIR%"=="%CD%" goto baseDirNotFound set "WDIR=%CD%" -goto findBaseDir +goto findBaseDirLoop :baseDirFound set "MAVEN_PROJECTBASEDIR=%WDIR%" -cd "%EXEC_DIR%" +cd /d "%EXEC_DIR%" goto endDetectBaseDir :baseDirNotFound