Merge branch 'release/1.14.0' into develop

* release/1.14.0:
  update manual release instructions
  port steps 10 & 11 to the ATR
  docs: adapt artifact checks to new ATR tool
  improve svn release staging/release instructions
  exclude jquery-1.7.min.js from source release
  ignore .swp files when building src release
  add license to .mailmap
  add RAT excludes for ATR
  add license to scripts/*.sh
  fix both NOTICE files for ATR
  doc: remove errant config
  improve start release notes wording in step 3
This commit is contained in:
Adam Monsen
2025-12-22 12:54:17 -08:00
26 changed files with 197 additions and 259 deletions
+27
View File
@@ -0,0 +1,27 @@
# 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.
# See comment below license in .atr-rat-excludes-src.txt for an explanation of
# what this is.
# if you make changes here, sort this list before committing asciibetically
# with en_US.UTF-8 lang/locale
.rat-excludes
README.md
fineract-documentation.pdf
# vim:ft=conf
+54
View File
@@ -0,0 +1,54 @@
# 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.
# Path patterns to exclude from RAT checks run by ATR.
#
# RAT = Release Audit Tool (https://creadur.apache.org/rat/)
# ATR = ASF Trusted Releases (https://release-test.apache.org , https://github.com/apache/tooling-trusted-releases/)
#
# This duplicates exclusions in build.gradle.
# This is probably only necessary until both RAT and org.nosphere.apache.rat plugin are using 0.17.
# See https://github.com/eskatos/creadur-rat-gradle/issues/28 .
# Once both are on 0.17, we should be able to move the RAT excludes used during
# the build from build.gradle into a .rat-excludes file shared by both our
# build and ATR.
# Right now ATR does something custom, see
# https://github.com/apache/tooling-trusted-releases/issues/312 .
# If we get tired of waiting for the RAT gradle plugin or the ATR to upgrade to
# 0.17, we could write our own exclusion lists generator.
# if you make changes here, sort this list before committing asciibetically
# with en_US.UTF-8 lang/locale
**/META-INF/fineract-test.config
**/legacy-docs/
*.adoc
*.avsc
*.feature
*.html
*.md
*.mustache
*.puml
*.txt
.openapi-generator-ignore
/.asf.yaml
/.rat-excludes
/config/fineractdev-eclipse-preferences.epf
/fineract-provider/src/test/resources/results/xbrl.xml
/gradle/wrapper/gradle-wrapper.properties
org.springframework.boot.autoconfigure.AutoConfiguration.imports
# vim:ft=conf
+17
View File
@@ -1,3 +1,20 @@
# 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.
# .mailmap unifies differences in commit names and emails, and shortens committers' names.
# .mailmap format is a bit weird, e.g. https://github.com/sympy/sympy/wiki/Using-.mailmap explains it.
# .mailmap official doc is on https://git-scm.com/docs/git-shortlog#_mapping_authors
+2 -2
View File
@@ -1,8 +1,8 @@
Apache Fineract
Copyright 2008-2025 The Apache Software Foundation
This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
This product includes third party libraries and resource files from
different providers. The details of the different packages and their
+2 -2
View File
@@ -1,5 +1,5 @@
Apache Fineract
Copyright 2008-2025 The Apache Software Foundation
This product includes software developed by The Apache Software
Foundation (http://www.apache.org/).
This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).
+1 -2
View File
@@ -353,8 +353,7 @@ allprojects {
"**/generated/**/*MapperImpl.java",
'**/META-INF/fineract-test.config',
// Apache-specific GitHub metadata settings file
'/.asf.yaml',
'**/*.sh'
'/.asf.yaml'
]
}
}
@@ -196,36 +196,10 @@ fineract {
step10: [
order: 10,
description: 'Start voting on the dev mailing list',
email: [
from: "${findProperty('fineract.config.email')}",
name: "${findProperty('fineract.config.name')}",
to: "${findProperty('fineract.config.email')}",
// to: 'dev@fineract.apache.org',
mime: 'text/plain',
subjectTemplate: [
templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl"
],
messageTemplate: [
templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step10.vote.message.ftl"
]
]
],
step11: [
order: 11,
description: 'Conclude the vote and announce results',
email: [
from: "${findProperty('fineract.config.email')}",
name: "${findProperty('fineract.config.name')}",
to: "${findProperty('fineract.config.email')}",
// to: 'dev@fineract.apache.org',
mime: 'text/plain',
subjectTemplate: [
templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl"
],
messageTemplate: [
templateFile: "${projectDir}/buildSrc/src/main/resources/email/release.step11.vote.message.ftl"
]
]
],
step12: [
order: 12,
@@ -18,7 +18,6 @@
*/
package org.apache.fineract.gradle
import groovy.json.JsonSlurper
import org.apache.commons.io.FileUtils
import org.apache.commons.io.filefilter.NotFileFilter
import org.apache.commons.io.filefilter.PrefixFileFilter
@@ -384,23 +383,7 @@ class FineractPlugin implements Plugin<Project> {
doFirst {
FineractPluginExtension.FineractPluginStep step = step(extension, "step10")
String version = project.properties?['fineract.release.version']
if(!version) {
TextIO textIO = TextIoFactory.getTextIO();
version = textIO.newStringInputReader()
.withPattern("\\d+.\\d+.\\d+")
.read("Release Version");
}
// TODO: input validation, see FINERACT-1610
this.context?.project?['fineract.release.version'] = version
if(step.email) {
emailService.send( processEmailParams(step.email, this.context) )
}
printInstructions(project, "step10")
}
}
@@ -409,28 +392,7 @@ class FineractPlugin implements Plugin<Project> {
doFirst {
FineractPluginExtension.FineractPluginStep step = step(extension, "step11")
String version = project.properties?['fineract.release.version']
if(!version) {
TextIO textIO = TextIoFactory.getTextIO()
version = textIO.newStringInputReader()
.withPattern("\\d+.\\d+.\\d+")
.read("Release Version");
}
// TODO: input validation, see FINERACT-1610
this.context?.project?['fineract.release.version'] = version
def jsonSlurper = new JsonSlurper()
def data = jsonSlurper.parse(new File("buildSrc/src/main/resources/vote/result.${version}.json"))
this.context?.project?['fineract.vote'] = data
if(step.email) {
emailService.send( processEmailParams(step.email, this.context) )
}
printInstructions(project, "step11")
}
}
@@ -1,51 +0,0 @@
<#--
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.
-->
Hello everyone,
We are proud to present Apache Fineract ${project['fineract.release.version']}, with the artifacts below up for a vote. Releases are important for a number of reasons: They put a stamp of approval on a set of code changes and they build momentum for future improvements.
Release notes and ChangeLog: https://cwiki.apache.org/confluence/display/FINERACT/${project['fineract.release.version']}+-+Apache+Fineract
Source and binary artifacts: https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']}/
Tagged as ${project['fineract.release.version']}
Committer PGP keys, including the release signing key: https://dist.apache.org/repos/dist/dev/fineract/KEYS
Note that this release candidate contains source and binary artifacts.
This vote will be open for 72 hours:
[ ] +1 approve
[ ] +0 no opinion
[ ] -1 disapprove (and reason why)
Please indicate if yours is a binding vote, and "Verified: YES/NO/PARTIAL".
Verified: YES ... Verified integrity and signatures of release artifacts locally, built from source, ran jar/war: Did everything mentioned in the current release candidate verification guidance ( https://fineract.apache.org/docs/rc/#_artifact_verification ). If you did more than that, please specify. "Verified: YES" is required for binding votes.
Verified: NO ... No testing performed on release candidate, e.g. relying on testing performed by other contributors and/or output of GitHub Actions, while exercising your right to vote.
Verified: PARTIAL ... Please specify.
Cheers,
${project['fineract.config.name']}
@@ -1,89 +0,0 @@
<#--
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.
-->
<#if (project['fineract.vote'].approve.binding?size + project['fineract.vote'].approve.nonBinding?size > project['fineract.vote'].disapprove.binding?size + project['fineract.vote'].disapprove.nonBinding?size)>
Voting is now closed and has passed with the following tally,
Binding +1s: ${project['fineract.vote'].approve.binding?size}
Non binding +1s: ${project['fineract.vote'].approve.nonBinding?size}
<#else>
Voting is now closed and has not passed with the following tally,
Binding +1s: ${project['fineract.vote'].approve.binding?size}
Non binding +1s: ${project['fineract.vote'].approve.nonBinding?size}
Binding -1s: ${project['fineract.vote'].disapprove.binding?size}
Non binding -1s: ${project['fineract.vote'].disapprove.nonBinding?size}
</#if>
Here are the detailed results:
<#list project['fineract.vote'].approve.binding>
Binding +1s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#list project['fineract.vote'].approve.nonBinding>
Non binding +1s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#list project['fineract.vote'].disapprove.binding>
Binding -1s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#list project['fineract.vote'].disapprove.nonBinding>
Non binding -1s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#list project['fineract.vote'].noOpinion.binding>
Binding +0s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#list project['fineract.vote'].noOpinion.nonBinding>
Non binding +0s:
<#items as item>
- ${item.name}
</#items>
</#list>
<#if (project['fineract.vote'].approve.binding?size + project['fineract.vote'].approve.nonBinding?size > project['fineract.vote'].disapprove.binding?size + project['fineract.vote'].disapprove.nonBinding?size)>
Thanks to everyone who voted! I'll now continue with the rest of the release process.
<#else>
Thanks to everyone who voted! Looks like we have to repeat the vote.
</#if>
${project['fineract.config.name']}
@@ -18,4 +18,12 @@
under the License.
-->
[FINERACT] [VOTE] 🗳️ ${project['fineract.release.version']} for release
[INSTRUCTIONS:START]
Initiate voting with the ATR (ASF Trusted Releases) tool.
https://release-test.apache.org
[INSTRUCTIONS:END]
@@ -18,4 +18,12 @@
under the License.
-->
[FINERACT] [VOTE] [RESULT] 🧾️ ${project['fineract.release.version']} for release
[INSTRUCTIONS:START]
Conclude voting with the ATR (ASF Trusted Releases) tool.
https://release-test.apache.org
[INSTRUCTIONS:END]
@@ -24,6 +24,7 @@
Move the release candidate from the dev area to the release area using a Subversion server-side copy:
svn mv https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']} https://dist.apache.org/repos/dist/release /fineract/
# this is a remote operation
svn mv -m "Release Fineract 1.14.0 🚢" https://dist.apache.org/repos/dist/dev/fineract/${project['fineract.release.version']} https://dist.apache.org/repos/dist/release/fineract/
[INSTRUCTIONS:END]
@@ -30,5 +30,6 @@ and make sure that everything on the release tag is merged to develop and that e
>> git push origin develop
>> git branch -D release/${project['fineract.release.version']}
>> git push origin :release/${project['fineract.release.version']}
>> git describe
[INSTRUCTIONS:END]
@@ -22,17 +22,6 @@
[INSTRUCTIONS:START]
Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote.
Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev/fineract
* Release candidates should be in format apache-fineract-bin-${project['fineract.release.version']}.tar.gz
* Verify signatures and hashes. You may have to import the public key of the release manager to verify the signatures. (gpg --import KEYS or gpg --recv-key <key id>)
* Git tag matches the released bits (diff -rf)
* Can compile docs and code successfully from source
* Verify DISCLAIMER, NOTICE and LICENSE (year etc)
* All files have correct headers (Rat check should be clean - gradlew rat)
* No jar files in the source artifacts
* Integration tests should work
See https://fineract.apache.org/docs/current/#_step_9_verify_distribution_staging
[INSTRUCTIONS:END]
@@ -1,9 +1,4 @@
= Loan Re-Aging
:doctype: book
:icons: font
:toc: left
:toclevels: 3
:sectnums:
== Overview
@@ -4,6 +4,8 @@
The RM should, if one doesn't already exist, first create a new release umbrella issue in JIRA. This issue is dedicated to tracking (a summary of) any discussion related to the planned new release. An example of such an issue is https://issues.apache.org/jira/browse/FINERACT-873[FINERACT-873].
Next, the RM logs in to https://release-test.apache.org[the ATR (ASF Trusted Releases)] tool and clicks "+ Start a new release", naming the release `{revnumber}`.
The RM then creates a list of resolved issues & features through an initial check in JIRA for already resolved issues for the release, and then setup a timeline for release branch point. The time for the day the issue list is created to the release branch point must be at least two weeks in order to give the community a chance to prioritize and commit any last minute features and issues they would like to see in the upcoming release.
The RM must then send the pointer to the umbrella issue along with the tentative timeline for branch point to the developer lists. Any work identified as release related that needs to be completed should be added as a sub tasks of the umbrella issue to allow all developers and users to see the overall release progress in one place. The umbrella issue shall also link to any issues still requiring clarification whether or not they will make it into the release.
@@ -36,7 +36,7 @@ git checkout -b release/{revnumber}
git push origin release/{revnumber}
----
5. Add new release notes in Release Folders. The change list can be swiped from the JIRA release note tool (use the "text" format for the change log). See JIRA Cleanup above to ensure that the release notes generated by this tool are what you are expecting.
5. Start new release notes page under https://cwiki.apache.org/confluence/display/FINERACT/Fineract+Releases[Fineract Releases]. The change list can be swiped from the JIRA release note tool (use the "text" format for the change log). See JIRA Cleanup above to ensure that the release notes generated by this tool are what you are expecting.
6. Send en email announcing the new release branch on the earlier email thread
+
@@ -11,19 +11,27 @@ Next we'll stage the release candidate. Create a new folder and add these files:
* apache-fineract-src-{revnumber}.tar.gz.sha512
* apache-fineract-src-{revnumber}.tar.gz.asc
These files (or "artifacts") comprise the release candidate. Upload these files to https://www.apache.org/legal/release-policy.html#stage[ASF's distribution dev/staging area] like so:
These files (or "artifacts") comprise the release candidate.
First, upload these files to https://release-test.apache.org/compose/fineract/{revnumber}. This tool will initiate automated checks on the files. We'll come back to those in next step and ensure they pass.
Next, upload these files to https://www.apache.org/legal/release-policy.html#stage[ASF's distribution dev/staging area] like so:
[source,bash,subs="attributes+"]
----
# this is a remote operation
svn mkdir https://dist.apache.org/repos/dist/dev/fineract/{revnumber}
svn mkdir -m "Create Fineract {revnumber} staging area 🏗️" \
https://dist.apache.org/repos/dist/dev/fineract/{revnumber}
# create local svn-tracked folder "{revnumber}"
svn checkout https://dist.apache.org/repos/dist/dev/fineract/{revnumber}
# prepare to upload
cp path/to/new/folder/* {revnumber}/
cd {revnumber}/
# actual upload occurs here
svn add * && svn commit
svn add * && svn commit -m "Stage Fineract {revnumber} 🎭"
----
NOTE: You will need your ASF Committer credentials to be able to access the Subversion host at `dist.apache.org`.
@@ -36,4 +44,4 @@ NOTE: You will need your ASF Committer credentials to be able to access the Subv
./gradlew fineractReleaseStep8 -Pfineract.release.version={revnumber}
----
CAUTION: This task is inefficient. Follow `svn mkdir` and other manual steps above.
CAUTION: Gradle task 8 is inefficient. We recommend `svn mkdir` and other manual steps above.
@@ -2,9 +2,9 @@
== Description
Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote.
Following are the typical things we need to verify before voting on a release candidate. And the release manager should verify them too before calling out a vote. Some of these checks are duplicated by https://release-test.apache.org[the ATR (ASF Trusted Releases) tool], and will need to continue to be duplicated until we get more comfortable with that tool.
Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev/fineract
Make sure release artifacts are hosted at both https://release-test.apache.org/compose/fineract/{revnumber} AND https://dist.apache.org/repos/dist/dev/fineract
* Release candidate files should match filenames mentioned earlier, and will be moved without renaming if/when the release vote passes.
* Verify signatures and hashes. You may have to import the public key of the release manager to verify the signatures. (`gpg --import KEYS` or `gpg --recv-key <key id>`)
@@ -14,6 +14,7 @@ Make sure release artifacts are hosted at https://dist.apache.org/repos/dist/dev
* All files have correct headers (Rat check should be clean - `./gradlew rat`)
* No jar files in the source artifacts
* All tests pass both in CI and locally
* All ATR checks pass
=== Artifact verification
@@ -2,19 +2,14 @@
== Description
Voting has to be done on dev@fineract.apache.org. You can close the vote after voting period expires (72 hours) and you accumulate sufficient votes (minimum 3 x +1 PMC votes).
[source,text]
----
include::{rootdir}/buildSrc/src/main/resources/email/release.step10.vote.subject.ftl[lines=21..]
include::{rootdir}/buildSrc/src/main/resources/email/release.step10.vote.message.ftl[lines=21..]
----
Initiate voting with https://release-test.apache.org[the ATR (ASF Trusted Releases) tool].
== Gradle Task
.Command
[source,bash,subs="attributes+,+macros"]
----
./gradlew fineractReleaseStep10 -Pfineract.release.version={revnumber}
./gradlew fineractReleaseStep10
----
INFO: Use the ATR for this task.
@@ -2,19 +2,14 @@
== Description
Upon receiving 3 x +1 from the PMC, or after 72 hours (whichever one comes first), reply to the voting thread and add the prefix "[RESULT]" to the subject line with the results, as follows:
[source,text]
----
include::{rootdir}/buildSrc/src/main/resources/email/release.step11.vote.subject.ftl[lines=21..]
include::{rootdir}/buildSrc/src/main/resources/email/release.step11.vote.message.ftl[lines=21..]
----
Conclude voting with https://release-test.apache.org[the ATR (ASF Trusted Releases) tool].
== Gradle Task
.Command
[source,text,subs="attributes+,+macros"]
----
./gradlew fineractReleaseStep11 -Pfineract.release.version={revnumber}
./gradlew fineractReleaseStep11
----
INFO: Use the ATR for this task.
@@ -6,7 +6,10 @@ Move the release candidate from the dev area to the release area using a Subvers
[source,bash,subs="attributes+"]
----
svn mv https://dist.apache.org/repos/dist/dev/fineract/{revnumber} https://dist.apache.org/repos/dist/release/fineract/
# this is a remote operation
svn mv -m "Release Fineract {revnumber} 🚢" \
https://dist.apache.org/repos/dist/dev/fineract/{revnumber} \
https://dist.apache.org/repos/dist/release/fineract/
----
NOTE: https://www.apache.org/legal/release-policy.html#upload-ci[This must be done by a Fineract PMC member].
+5 -1
View File
@@ -136,6 +136,9 @@ distributions {
from "$rootDir/fineract-doc/build/docs/pdf/en/index.pdf"
rename ('index.pdf', 'fineract-documentation.pdf')
from "$rootDir/.atr-rat-excludes-bin.txt"
rename ('.atr-rat-excludes-bin.txt', '.rat-excludes')
}
}
src {
@@ -147,7 +150,7 @@ distributions {
'**/.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent',
'**/.externalToolbuilders', '.theia', 'LICENSE_RELEASE',
'NOTICE_RELEASE', '**/licenses', '*.class', '**/bin', '*.log', '.dockerignore',
'**/.gitkeep'
'**/.gitkeep', '*.swp', '.atr-rat-excludes-bin.txt', '**/jquery-1.7.min.js'
// Ensure consistent file paths for caching
eachFile { details ->
@@ -156,6 +159,7 @@ distributions {
}
rename ('LICENSE_SOURCE', 'LICENSE')
rename ('NOTICE_SOURCE', 'NOTICE')
rename ('.atr-rat-excludes-src.txt', '.rat-excludes')
}
}
}
+17
View File
@@ -1,5 +1,22 @@
#!/bin/bash
# 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.
# Exit on any error
set -e
+18
View File
@@ -1,4 +1,22 @@
#!/bin/bash
# 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.
# Usage: ./split-tests.sh <total-shards> <shard-index>
set -e