-
Notifications
You must be signed in to change notification settings - Fork 443
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Wip/cleanup for play #18
Merged
Merged
Changes from 8 commits
Commits
Show all changes
10 commits
Select commit
Hold shift + click to select a range
461969b
Add version to the default name of universal packages.
jsuereth 5a72fd2
Add test for gneeric mappings.
jsuereth 69c3bd5
Adding `makeBashScript` key and tests.
jsuereth 4a06ae9
Add windows bat file generation (at least a start). Still need to te…
jsuereth 1aceb68
Bump documentation for archetypes.
jsuereth 7610b9f
Fix bat template to work in windows.
jsuereth 3f18381
Fix bad escaping of identifiers in wix generation.
jsuereth e6696d7
Fix lib filenames to match Play conventions.
jsuereth f3772f4
Added some configuration of how template start scripts are generated.
jsuereth bd83f04
Fixes from @huntc review.
jsuereth File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
285 changes: 285 additions & 0 deletions
285
src/main/resources/com/typesafe/sbt/packager/archetypes/bash-template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,285 @@ | ||
#!/bin/bash | ||
|
||
### ------------------------------- ### | ||
### Helper methods for BASH scripts ### | ||
### ------------------------------- ### | ||
|
||
realpath () { | ||
( | ||
TARGET_FILE="$1" | ||
|
||
cd $(dirname "$TARGET_FILE") | ||
TARGET_FILE=$(basename "$TARGET_FILE") | ||
|
||
COUNT=0 | ||
while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] | ||
do | ||
TARGET_FILE=$(readlink "$TARGET_FILE") | ||
cd $(dirname "$TARGET_FILE") | ||
TARGET_FILE=$(basename "$TARGET_FILE") | ||
COUNT=$(($COUNT + 1)) | ||
done | ||
|
||
# make sure we grab the actual windows path, instead of cygwin's path. | ||
echo $(cygwinpath "$(pwd -P)/$TARGET_FILE") | ||
) | ||
} | ||
|
||
# TODO - Do we need to detect msys? | ||
|
||
# Uses uname to detect if we're in the odd cygwin environment. | ||
is_cygwin() { | ||
local os=$(uname -s) | ||
case "$os" in | ||
CYGWIN*) return 0 ;; | ||
*) return 1 ;; | ||
esac | ||
} | ||
|
||
# This can fix cygwin style /cygdrive paths so we get the | ||
# windows style paths. | ||
cygwinpath() { | ||
local file="$1" | ||
if is_cygwin; then | ||
echo $(cygpath -w $file) | ||
else | ||
echo $file | ||
fi | ||
} | ||
|
||
# Make something URI friendly | ||
make_url() { | ||
url="$1" | ||
local nospaces=${url// /%20} | ||
if is_cygwin; then | ||
echo "/${nospaces//\\//}" | ||
else | ||
echo "$nospaces" | ||
fi | ||
} | ||
|
||
# Detect if we should use JAVA_HOME or just try PATH. | ||
get_java_cmd() { | ||
if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then | ||
echo "$JAVA_HOME/bin/java" | ||
else | ||
echo "java" | ||
fi | ||
} | ||
|
||
echoerr () { | ||
echo 1>&2 "$@" | ||
} | ||
vlog () { | ||
[[ $verbose || $debug ]] && echoerr "$@" | ||
} | ||
dlog () { | ||
[[ $debug ]] && echoerr "$@" | ||
} | ||
execRunner () { | ||
# print the arguments one to a line, quoting any containing spaces | ||
[[ $verbose || $debug ]] && echo "# Executing command line:" && { | ||
for arg; do | ||
if printf "%s\n" "$arg" | grep -q ' '; then | ||
printf "\"%s\"\n" "$arg" | ||
else | ||
printf "%s\n" "$arg" | ||
fi | ||
done | ||
echo "" | ||
} | ||
|
||
exec "$@" | ||
} | ||
addJava () { | ||
dlog "[addJava] arg = '$1'" | ||
java_args=( "${java_args[@]}" "$1" ) | ||
} | ||
addApp () { | ||
dlog "[addApp] arg = '$1'" | ||
sbt_commands=( "${app_commands[@]}" "$1" ) | ||
} | ||
addResidual () { | ||
dlog "[residual] arg = '$1'" | ||
residual_args=( "${residual_args[@]}" "$1" ) | ||
} | ||
addDebugger () { | ||
addJava "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=$1" | ||
} | ||
# a ham-fisted attempt to move some memory settings in concert | ||
# so they need not be messed around with individually. | ||
get_mem_opts () { | ||
local mem=${1:-1024} | ||
local perm=$(( $mem / 4 )) | ||
(( $perm > 256 )) || perm=256 | ||
(( $perm < 1024 )) || perm=1024 | ||
local codecache=$(( $perm / 2 )) | ||
|
||
echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m" | ||
} | ||
require_arg () { | ||
local type="$1" | ||
local opt="$2" | ||
local arg="$3" | ||
if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then | ||
die "$opt requires <$type> argument" | ||
fi | ||
} | ||
require_arg () { | ||
local type="$1" | ||
local opt="$2" | ||
local arg="$3" | ||
if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then | ||
die "$opt requires <$type> argument" | ||
fi | ||
} | ||
is_function_defined() { | ||
declare -f "$1" > /dev/null | ||
} | ||
|
||
# If we're *not* running in a terminal, and we don't have any arguments, then we need to add the 'ui' parameter | ||
detect_terminal_for_ui() { | ||
[[ ! -t 0 ]] && [[ "${#residual_args}" == "0" ]] && { | ||
addResidual "ui" | ||
} | ||
# SPECIAL TEST FOR MAC | ||
[[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]] && [[ "${#residual_args}" == "0" ]] && { | ||
echo "Detected MAC OSX launched script...." | ||
echo "Swapping to UI" | ||
addResidual "ui" | ||
} | ||
} | ||
|
||
# Processes incoming arguments and places them in appropriate global variables. called by the run method. | ||
process_args () { | ||
while [[ $# -gt 0 ]]; do | ||
case "$1" in | ||
-h|-help) usage; exit 1 ;; | ||
-v|-verbose) verbose=1 && shift ;; | ||
-d|-debug) debug=1 && shift ;; | ||
|
||
-mem) require_arg integer "$1" "$2" && app_mem="$2" && shift 2 ;; | ||
-jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; | ||
|
||
-java-home) require_arg path "$1" "$2" && java_cmd="$2/bin/java" && shift 2 ;; | ||
|
||
-D*) addJava "$1" && shift ;; | ||
-J*) addJava "${1:2}" && shift ;; | ||
*) addResidual "$1" && shift ;; | ||
esac | ||
done | ||
|
||
is_function_defined process_my_args && { | ||
myargs=("${residual_args[@]}") | ||
residual_args=() | ||
process_my_args "${myargs[@]}" | ||
} | ||
} | ||
|
||
# Actually runs the script. | ||
run() { | ||
# TODO - check for sane environment | ||
|
||
# process the combined args, then reset "$@" to the residuals | ||
process_args "$@" | ||
detect_terminal_for_ui | ||
set -- "${residual_args[@]}" | ||
argumentCount=$# | ||
|
||
#check for jline terminal fixes on cygwin | ||
if is_cygwin; then | ||
stty -icanon min 1 -echo > /dev/null 2>&1 | ||
addJava "-Djline.terminal=jline.UnixTerminal" | ||
addJava "-Dsbt.cygwin=true" | ||
fi | ||
# run sbt | ||
execRunner "$java_cmd" \ | ||
$(get_mem_opts $app_mem) \ | ||
${java_opts} \ | ||
${java_args[@]} \ | ||
-cp "$app_classpath" \ | ||
$app_mainclass \ | ||
"${app_commands[@]}" \ | ||
"${residual_args[@]}" | ||
|
||
local exit_code=$? | ||
if is_cygwin; then | ||
stty icanon echo > /dev/null 2>&1 | ||
fi | ||
exit $exit_code | ||
} | ||
|
||
# Loads a configuration file full of default command line options for this script. | ||
loadConfigFile() { | ||
cat "$1" | sed '/^\#/d' | ||
} | ||
|
||
### ------------------------------- ### | ||
### Start of customized settings ### | ||
### ------------------------------- ### | ||
usage() { | ||
cat <<EOM | ||
Usage: $script_name [ui] [options] | ||
|
||
ui starts the Activator UI | ||
new Create a new project from a template | ||
-h | -help print this message | ||
-v | -verbose this runner is chattier | ||
-d | -debug set sbt log level to debug | ||
-mem <integer> set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) | ||
-jvm-debug <port> Turn on JVM debugging, open at the given port. | ||
|
||
# java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) | ||
-java-home <path> alternate JAVA_HOME | ||
|
||
# jvm options and output control | ||
JAVA_OPTS environment variable, if unset uses "$java_opts" | ||
-Dkey=val pass -Dkey=val directly to the java runtime | ||
-J-X pass option -X directly to the java runtime | ||
(-J is stripped) | ||
|
||
In the case of duplicated or conflicting options, the order above | ||
shows precedence: JAVA_OPTS lowest, command line options highest. | ||
EOM | ||
} | ||
|
||
### ------------------------------- ### | ||
### Main script ### | ||
### ------------------------------- ### | ||
|
||
declare -a residual_args | ||
declare -a java_args | ||
declare -a app_commands | ||
declare -r app_home="$(realpath "$(dirname "$0")")" | ||
${{template_declares}} | ||
declare -r java_cmd=$(get_java_cmd) | ||
# TODO - Check whether this is ok in cygwin... | ||
declare -r lib_dir="${app_home}/../lib" | ||
declare -r app_classpath="$lib_dir/*" | ||
|
||
# Now check to see if it's a good enough version | ||
# TODO - Check to see if we have a configured default java version, otherwise use 1.6 | ||
declare -r java_version=$("$java_cmd" -version 2>&1 | awk -F '"' '/version/ {print $2}') | ||
if [[ "$java_version" == "" ]]; then | ||
echo | ||
echo No java installations was detected. | ||
echo Please go to http://www.java.com/getjava/ and download | ||
echo | ||
exit 1 | ||
elif [[ ! "$java_version" > "1.6" ]]; then | ||
echo | ||
echo The java installation you have is not up to date | ||
echo $app_name requires at least version 1.6+, you have | ||
echo version $java_version | ||
echo | ||
echo Please go to http://www.java.com/getjava/ and download | ||
echo a valid Java Runtime and install before running $app_name. | ||
echo | ||
exit 1 | ||
fi | ||
|
||
|
||
# if configuration files exist, prepend their contents to $@ so it can be processed by this runner | ||
[[ -f "$script_conf_file" ]] && set -- $(loadConfigFile "$script_conf_file") "$@" | ||
|
||
run "$@" |
101 changes: 101 additions & 0 deletions
101
src/main/resources/com/typesafe/sbt/packager/archetypes/bat-template
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
@REM @@APP_NAME@@ launcher script | ||
@REM | ||
@REM Envioronment: | ||
@REM JAVA_HOME - location of a JDK home dir (optional if java on path) | ||
@REM CFG_OPTS - JVM options (optional) | ||
@REM Configuration: | ||
@REM @@APP_ENV_NAME@@_config.txt found in the @@APP_ENV_NAME@@_HOME. | ||
@setlocal enabledelayedexpansion | ||
|
||
@echo off | ||
if "%@@APP_ENV_NAME@@_HOME%"=="" set "@@APP_ENV_NAME@@_HOME=%~dp0\\.." | ||
set ERROR_CODE=0 | ||
|
||
rem Detect if we were double clicked, although theoretically A user could | ||
rem manually run cmd /c | ||
for %%x in (%cmdcmdline%) do if %%~x==/c set DOUBLECLICKED=1 | ||
|
||
rem FIRST we load the config file of extra options. | ||
set "CFG_FILE=%@@APP_ENV_NAME@@_HOME%\@@APP_ENV_NAME@@_config.txt" | ||
set CFG_OPTS= | ||
if exist %CFG_FILE% ( | ||
FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%CFG_FILE%") DO ( | ||
set DO_NOT_REUSE_ME=%%i | ||
rem ZOMG (Part #2) WE use !! here to delay the expansion of | ||
rem CFG_OPTS, otherwise it remains "" for this loop. | ||
set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME! | ||
) | ||
) | ||
|
||
rem We use the value of the JAVACMD environment variable if defined | ||
set _JAVACMD=%JAVACMD% | ||
|
||
if "%_JAVACMD%"=="" ( | ||
if not "%JAVA_HOME%"=="" ( | ||
if exist "%JAVA_HOME%\bin\java.exe" set "_JAVACMD=%JAVA_HOME%\bin\java.exe" | ||
) | ||
) | ||
|
||
if "%_JAVACMD%"=="" set _JAVACMD=java | ||
|
||
rem Detect if this java is ok to use. | ||
for /F %%j in ('"%_JAVACMD%" -version 2^>^&1') do ( | ||
if %%~j==Java set JAVAINSTALLED=1 | ||
) | ||
|
||
rem Detect the same thing about javac | ||
if "%_JAVACCMD%"=="" ( | ||
if not "%JAVA_HOME%"=="" ( | ||
if exist "%JAVA_HOME%\bin\javac.exe" set "_JAVACCMD=%JAVA_HOME%\bin\javac.exe" | ||
) | ||
) | ||
if "%_JAVACCMD%"=="" set _JAVACCMD=javac | ||
for /F %%j in ('"%_JAVACCMD%" -version 2^>^&1') do ( | ||
if %%~j==javac set JAVACINSTALLED=1 | ||
) | ||
|
||
rem BAT has no logical or, so we do it OLD SCHOOL! Oppan Redmond Style | ||
set JAVAOK=true | ||
if not defined JAVAINSTALLED set JAVAOK=false | ||
rem TODO - JAVAC is an optional requirement. | ||
if not defined JAVACINSTALLED set JAVAOK=false | ||
|
||
if "%JAVAOK%"=="false" ( | ||
echo. | ||
echo A Java JDK is not installed or can't be found. | ||
if not "%JAVA_HOME%"=="" ( | ||
echo JAVA_HOME = "%JAVA_HOME%" | ||
) | ||
echo. | ||
echo Please go to | ||
echo http://www.oracle.com/technetwork/java/javase/downloads/index.html | ||
echo and download a valid Java JDK and install before running @@APP_NAME@@. | ||
echo. | ||
echo If you think this message is in error, please check | ||
echo your environment variables to see if "java.exe" and "javac.exe" are | ||
echo available via JAVA_HOME or PATH. | ||
echo. | ||
if defined DOUBLECLICKED pause | ||
exit /B 1 | ||
) | ||
|
||
|
||
rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. | ||
set _JAVA_OPTS=%JAVA_OPTS% | ||
if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% | ||
|
||
:run | ||
|
||
rem TODO - figure out how to pass arguments.... | ||
"%_JAVACMD%" %_JAVA_OPTS% %@@APP_ENV_NAME@@_OPTS% -cp "%@@APP_ENV_NAME@@_HOME%\lib\*" @@APP_MAIN_CLASS@@ %CMDS% | ||
if ERRORLEVEL 1 goto error | ||
goto end | ||
|
||
:error | ||
set ERROR_CODE=1 | ||
|
||
:end | ||
|
||
@endlocal | ||
|
||
exit /B %ERROR_CODE% |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to be able to express the classpath as a parameter to the template. The order of things on the classpath is significant to Play as we try to be compatible with the order of things in the classpath during dev mode.
I've defined a taskkey named "playDistLibs" that yields a Seq(File, String). If the product of something like that can be fed to the template then that'd be great.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hmm, actually enforcing is order may be something more than just play specific. Let me think about a good way to resolve the general case, and I'll add a quick hook for you now.