From 0486fbefdb3a7de50b3da9bf73365653092cf3f3 Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Sat, 11 May 2024 11:58:13 +0900 Subject: [PATCH 1/5] Upgrade the Gradle wrapper to 8.7 --- gradle/wrapper/gradle-wrapper.jar | Bin 51018 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 311 +++++++++++++++-------- gradlew.bat | 86 ++++--- 4 files changed, 244 insertions(+), 157 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c97a8bdb9088d370da7e88784a7a093b971aa23a..fd7e590e5154e82211909581e71018372134fb27 100644 GIT binary patch delta 25692 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 LI5 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -82,83 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec9973..7101f8e 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -8,26 +24,30 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -35,54 +55,36 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal From 807e38a8b0094ed93330f42f6975fd9446615d28 Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Sat, 11 May 2024 12:16:44 +0900 Subject: [PATCH 2/5] Use LICENSE file instead of COPYING --- COPYING | 14 ---- LICENSE | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+), 14 deletions(-) delete mode 100644 COPYING create mode 100644 LICENSE diff --git a/COPYING b/COPYING deleted file mode 100644 index 4d2477f..0000000 --- a/COPYING +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (C) 2015 Sadayuki Furuhashi - - Licensed 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. - diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. From 3dbd171367396bbdf4b2c6bb0988514c98e89a25 Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Sat, 11 May 2024 22:28:32 +0900 Subject: [PATCH 3/5] Upgrade the Gradle plugin to 0.7.0 --- build.gradle | 201 +++++++++++++++++++++++++++++++++++++----------- gradle.lockfile | 15 ++++ 2 files changed, 171 insertions(+), 45 deletions(-) create mode 100644 gradle.lockfile diff --git a/build.gradle b/build.gradle index 49089fd..e52b4d3 100644 --- a/build.gradle +++ b/build.gradle @@ -1,58 +1,169 @@ plugins { - id "com.jfrog.bintray" version "1.1" - id "com.github.jruby-gradle.base" version "0.1.5" id "java" + id "maven-publish" + id "signing" + id "org.embulk.embulk-plugins" version "0.7.0" } -import com.github.jrubygradle.JRubyExec repositories { mavenCentral() - jcenter() } + +group = "org.embulk" +version = "0.2.0-SNAPSHOT" +description = "Executes commands and writes files to STDIN." + configurations { - provided + compileClasspath.resolutionStrategy.activateDependencyLocking() + runtimeClasspath.resolutionStrategy.activateDependencyLocking() } -version = "0.2.0-SNAPSHOT" +tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:deprecation" << "-Xlint:unchecked" + options.encoding = "UTF-8" +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(8) + } + + withJavadocJar() + withSourcesJar() +} dependencies { - compile "org.embulk:embulk-core:0.7.0" - provided "org.embulk:embulk-core:0.7.0" + compileOnly "org.embulk:embulk-spi:0.11" + implementation "org.embulk:embulk-util-config:0.5.0" + implementation "org.embulk:embulk-util-file:0.2.0" // compile "YOUR_JAR_DEPENDENCY_GROUP:YOUR_JAR_DEPENDENCY_MODULE:YOUR_JAR_DEPENDENCY_VERSION" - testCompile "junit:junit:4.+" - testCompile 'org.embulk:embulk-core:0.7.+:tests' -} - -task classpath(type: Copy, dependsOn: ["jar"]) { - doFirst { file("classpath").deleteDir() } - from (configurations.runtime - configurations.provided + files(jar.archivePath)) - into "classpath" -} -clean { delete 'classpath' } - -task gem(type: JRubyExec, dependsOn: ["build", "gemspec", "classpath"]) { - jrubyArgs "-rrubygems/gem_runner", "-eGem::GemRunner.new.run(ARGV)", "build" - script "build/gemspec" - doLast { ant.move(file: "${project.name}-${project.version}.gem", todir: "pkg") } -} - -task gemspec << { file("build/gemspec").write($/ -Gem::Specification.new do |spec| - spec.name = "${project.name}" - spec.version = "${project.version}" - spec.authors = ["Sadayuki Furuhashi"] - spec.summary = %[Command file output plugin for Embulk] - spec.description = %[Executes commands and writes files to STDIN.] - spec.email = ["frsyuki@gmail.com"] - spec.licenses = ["Apache 2.0"] - spec.homepage = "https://github.com/embulk/embulk-output-command" - - spec.files = `git ls-files`.split("\n") + Dir["classpath/*.jar"] - spec.test_files = spec.files.grep(%r"^(test|spec)/") - spec.require_paths = ["lib"] - - #spec.add_dependency 'YOUR_GEM_DEPENDENCY', ['~> YOUR_GEM_DEPENDENCY_VERSION'] - spec.add_development_dependency 'bundler', ['~> 1.0'] - spec.add_development_dependency 'rake', ['>= 10.0'] -end -/$) + + testImplementation "junit:junit:4.13.2" + testImplementation "org.embulk:embulk-core:0.11.3" + testImplementation "org.embulk:embulk-deps:0.11.3" + testImplementation "org.embulk:embulk-junit4:0.11.3" +} + +embulkPlugin { + mainClass = "org.embulk.output.CommandFileOutputPlugin" + category = "output" + type = "command" +} + +gem { + authors = [ "Sadayuki Furuhashi" ] + email = [ "frsyuki@gmail.com" ] + // "description" of the gem is copied from "description" of your Gradle project. + summary = "Command file output plugin for Embulk" + homepage = "https://github.com/embulk/embulk-output-command" + licenses = [ "Apache-2.0" ] + + from rootProject.file("LICENSE") +} + +gemPush { + host = "https://rubygems.org" +} + +jar { + metaInf { + from rootProject.file("LICENSE") + } +} + +sourcesJar { + metaInf { + from rootProject.file("LICENSE") + } +} + +// A safer and strict alternative to: "dependencies" (and "dependencies --write-locks") +// +// This task fails explicitly when the specified dependency is not available. +// In contrast, "dependencies (--write-locks)" does not fail even when a part the dependencies are unavailable. +// +// https://docs.gradle.org/8.7/userguide/dependency_locking.html#generating_and_updating_dependency_locks +task checkDependencies { + notCompatibleWithConfigurationCache("The task \"checkDependencies\" filters configurations at execution time.") + doLast { + configurations.findAll { it.canBeResolved }.each { it.resolve() } + } +} + +publishing { + publications { + maven(MavenPublication) { + groupId = project.group + artifactId = project.name + + from components.java + // javadocJar and sourcesJar are added by java.withJavadocJar() and java.withSourcesJar() above. + // See: https://docs.gradle.org/current/javadoc/org/gradle/api/plugins/JavaPluginExtension.html + + pom { // https://central.sonatype.org/pages/requirements.html + packaging "jar" + + name = project.name + description = project.description + url = "https://www.embulk.org/" + + licenses { + license { + // http://central.sonatype.org/pages/requirements.html#license-information + name = "The Apache License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0.txt" + distribution = "repo" + } + } + + developers { + developer { + name = "Sadayuki Furuhashi" + email = "frsyuki@gmail.com" + } + } + + scm { + connection = "scm:git:git://github.com/embulk/embulk-output-command.git" + developerConnection = "scm:git:git@github.com:embulk/embulk-output-command.git" + url = "https://github.com/embulk/embulk-output-command" + } + } + } + } + + repositories { + maven { // publishMavenPublicationToMavenCentralRepository + name = "mavenCentral" + if (project.version.endsWith("-SNAPSHOT")) { + url "https://oss.sonatype.org/content/repositories/snapshots" + } else { + url "https://oss.sonatype.org/service/local/staging/deploy/maven2" + } + + credentials { + username = project.hasProperty("ossrhUsername") ? ossrhUsername : "" + password = project.hasProperty("ossrhPassword") ? ossrhPassword : "" + } + } + } +} + +signing { + if (project.hasProperty("signingKey") && project.hasProperty("signingPassword")) { + logger.lifecycle("Signing with an in-memory key.") + useInMemoryPgpKeys(signingKey, signingPassword) + } + sign publishing.publications.maven +} + +test { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL + showCauses = true + showExceptions = true + showStackTraces = true + showStandardStreams = true + outputs.upToDateWhen { false } + } } diff --git a/gradle.lockfile b/gradle.lockfile new file mode 100644 index 0000000..4c3b846 --- /dev/null +++ b/gradle.lockfile @@ -0,0 +1,15 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +com.fasterxml.jackson.core:jackson-annotations:2.15.4=compileClasspath,runtimeClasspath +com.fasterxml.jackson.core:jackson-core:2.15.4=compileClasspath,runtimeClasspath +com.fasterxml.jackson.core:jackson-databind:2.15.4=compileClasspath,runtimeClasspath +com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.4=compileClasspath,runtimeClasspath +com.fasterxml.jackson:jackson-bom:2.15.4=compileClasspath,runtimeClasspath +javax.validation:validation-api:2.0.1.Final=compileClasspath,runtimeClasspath +org.embulk:embulk-spi:0.11=compileClasspath +org.embulk:embulk-util-config:0.5.0=compileClasspath,runtimeClasspath +org.embulk:embulk-util-file:0.2.0=compileClasspath,runtimeClasspath +org.msgpack:msgpack-core:0.8.24=compileClasspath +org.slf4j:slf4j-api:2.0.7=compileClasspath +empty= From 29cc987cbe6991904d8c3d408c1c8d39bf8679fb Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Sat, 11 May 2024 23:48:18 +0900 Subject: [PATCH 4/5] Use embulk-spi v0.11 --- .../output/CommandFileOutputPlugin.java | 42 ++++++++++--------- .../output/TestCommandFileOutputPlugin.java | 13 +++--- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/embulk/output/CommandFileOutputPlugin.java b/src/main/java/org/embulk/output/CommandFileOutputPlugin.java index 7909f8b..f98293e 100644 --- a/src/main/java/org/embulk/output/CommandFileOutputPlugin.java +++ b/src/main/java/org/embulk/output/CommandFileOutputPlugin.java @@ -2,30 +2,28 @@ import java.util.List; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.io.OutputStream; import java.io.FilterOutputStream; import java.io.IOException; -import com.google.common.annotations.VisibleForTesting; import org.slf4j.Logger; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; import org.embulk.config.TaskReport; -import org.embulk.config.Config; -import org.embulk.config.ConfigDefault; +import org.embulk.util.config.Config; import org.embulk.config.ConfigDiff; import org.embulk.config.ConfigSource; -import org.embulk.config.Task; +import org.embulk.util.config.ConfigMapper; +import org.embulk.util.config.ConfigMapperFactory; +import org.embulk.util.config.Task; +import org.embulk.util.config.TaskMapper; import org.embulk.config.TaskSource; import org.embulk.spi.Buffer; -import org.embulk.spi.Exec; import org.embulk.spi.FileOutputPlugin; import org.embulk.spi.TransactionalFileOutput; public class CommandFileOutputPlugin implements FileOutputPlugin { - private final Logger logger = Exec.getLogger(getClass()); - public interface PluginTask extends Task { @@ -37,10 +35,11 @@ public interface PluginTask public ConfigDiff transaction(ConfigSource config, int taskCount, FileOutputPlugin.Control control) { - PluginTask task = config.loadConfig(PluginTask.class); + final ConfigMapper configMapper = CONFIG_MAPPER_FACTORY.createConfigMapper(); + final PluginTask task = configMapper.map(config, PluginTask.class); // retryable (idempotent) output: - return resume(task.dump(), taskCount, control); + return resume(task.toTaskSource(), taskCount, control); } @Override @@ -49,7 +48,7 @@ public ConfigDiff resume(TaskSource taskSource, FileOutputPlugin.Control control) { control.run(taskSource); - return Exec.newConfigDiff(); + return CONFIG_MAPPER_FACTORY.newConfigDiff(); } @Override @@ -62,7 +61,8 @@ public void cleanup(TaskSource taskSource, @Override public TransactionalFileOutput open(TaskSource taskSource, final int taskIndex) { - PluginTask task = taskSource.loadTask(PluginTask.class); + final TaskMapper taskMapper = CONFIG_MAPPER_FACTORY.createTaskMapper(); + final PluginTask task = taskMapper.map(taskSource, PluginTask.class); List cmdline = new ArrayList(); cmdline.addAll(buildShell()); @@ -73,14 +73,13 @@ public TransactionalFileOutput open(TaskSource taskSource, final int taskIndex) return new PluginFileOutput(cmdline, taskIndex); } - @VisibleForTesting static List buildShell() { String osName = System.getProperty("os.name"); if(osName.indexOf("Windows") >= 0) { - return ImmutableList.of("PowerShell.exe", "-Command"); + return Collections.unmodifiableList(Arrays.asList("PowerShell.exe", "-Command")); } else { - return ImmutableList.of("sh", "-c"); + return Collections.unmodifiableList(Arrays.asList("sh", "-c")); } } @@ -109,7 +108,7 @@ private synchronized void waitFor() throws IOException try { code = process.waitFor(); } catch (InterruptedException ex) { - throw Throwables.propagate(ex); + throw new RuntimeException(ex); } process = null; if (code != 0) { @@ -171,7 +170,7 @@ public void abort() public TaskReport commit() { - return Exec.newTaskReport(); + return CONFIG_MAPPER_FACTORY.newTaskReport(); } private void closeCurrentProcess() @@ -182,7 +181,7 @@ private void closeCurrentProcess() currentProcess = null; } } catch (IOException ex) { - throw Throwables.propagate(ex); + throw new RuntimeException(ex); } } @@ -198,8 +197,11 @@ private Process startProcess(List cmdline, int taskIndex, int seqId) try { return builder.start(); } catch (IOException ex) { - throw Throwables.propagate(ex); + throw new RuntimeException(ex); } } } + private static final Logger logger = org.slf4j.LoggerFactory.getLogger(CommandFileOutputPlugin.class); + + private static final ConfigMapperFactory CONFIG_MAPPER_FACTORY = ConfigMapperFactory.builder().addDefaultModules().build(); } diff --git a/src/test/java/org/embulk/output/TestCommandFileOutputPlugin.java b/src/test/java/org/embulk/output/TestCommandFileOutputPlugin.java index a1e373e..4cfc9d9 100644 --- a/src/test/java/org/embulk/output/TestCommandFileOutputPlugin.java +++ b/src/test/java/org/embulk/output/TestCommandFileOutputPlugin.java @@ -1,14 +1,12 @@ package org.embulk.output; -import com.google.common.collect.ImmutableList; -import org.junit.Before; +import java.util.Arrays; +import java.util.Collections; import org.junit.Rule; import org.junit.Test; -import org.embulk.EmbulkTestRuntime; +import org.embulk.test.EmbulkTestRuntime; import static org.embulk.output.CommandFileOutputPlugin.buildShell; -import java.util.List; - import static org.junit.Assert.assertEquals; public class TestCommandFileOutputPlugin @@ -19,10 +17,11 @@ public class TestCommandFileOutputPlugin @Test public void testShell() { if (System.getProperty("os.name").indexOf("Windows") >= 0) { - assertEquals(ImmutableList.of("PowerShell.exe", "-Command"), buildShell()); + assertEquals(Collections.unmodifiableList(Arrays.asList("PowerShell.exe", "-Command")) +, buildShell()); } else { - assertEquals(ImmutableList.of("sh", "-c"), buildShell()); + assertEquals(Collections.unmodifiableList(Arrays.asList("sh", "-c")), buildShell()); } } } From 7f3bcedc83318a5886268b5a2ccf7ac3723d3d96 Mon Sep 17 00:00:00 2001 From: Hiroyuki Sato Date: Mon, 13 May 2024 11:11:01 +0900 Subject: [PATCH 5/5] Fix review comment --- build.gradle | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build.gradle b/build.gradle index e52b4d3..55d9563 100644 --- a/build.gradle +++ b/build.gradle @@ -76,6 +76,12 @@ sourcesJar { } } +javadocJar { + metaInf { + from rootProject.file("LICENSE") + } +} + // A safer and strict alternative to: "dependencies" (and "dependencies --write-locks") // // This task fails explicitly when the specified dependency is not available.