blob: 0f3bbcfd606bc6b5848be6c7c39d77c5f1d80488 [file] [log] [blame]
#!/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.
#
set -e
usage() {
cat >&2 << EOF
Usage: generate-license-and-notice.sh [-o <output-dir>] [-s <suffix>]
[ --license <license-file>]+
[ [--notice <header-file>]
[--notice-compute-with-flags <flags>]* ]+
[--libraries <search-dir> [<seach-dir>]+]
[--keep-metadata-file <filename>]
Generates LICENSE and NOTICE files based on dependencies.
Required parameters:
* -o <output-dir> is where the files are written, defaulting to current working directory
* -s <suffix> specifies a suffix to add to the names of the files generated
* --license <license-file> causes the given license file to be written to the LICENSE file
prior to licenses inferred from notices; the last entry is only written if there are licenses
in the NOTICE file
* --notice <header-file> causes the contents of <header-file> to be written to the NOTICE file
* --notice-compute-with-flags <flags> passes the given flags to the maven license-audit-plugin
to generate the YAML data for the NOTICE and LICENSE files
* --libraries <search-dir> [<search-dir>]+ supplies one or more directories to scan for
reference files, of the form license-metadata-*.yaml, containing a list of items each
with an id and various other metadata fields; these items are used to populate the
section reports described above by passing to the maven license-audit-plugin, or to
look for a directories called license-text which are searched for the names of licenses
as declared in the generated NOTICE file
The generated LICENSE file contains the indicated license sections followed by other licenses
referenced by the dependencies.
The NOTICE file contains the output as per --notice and --notice-compute-with-flags in the order specified.
Typical usage is to have one root --notice then one or more -notice ... --notice-compute-with-flags ... blocks.
EOF
}
OUTPUT_DIR=.
SUFFIX=""
LICENSES=()
NOTICE_SECTION_TYPE=()
NOTICE_SECTION_ARG=()
LIBRARIES=()
while [ ! -z "$*" ] ; do
if [ "$1" == "--help" ]; then usage ; exit 0; fi
if [ "$1" == "-o" ]; then OUTPUT_DIR=$2 ; shift 2 ; continue ; fi
if [ "$1" == "-s" ]; then SUFFIX=$2 ; shift 2 ; continue ; fi
if [ "$1" == "--license" ]; then LICENSES[${#LICENSES[*]}]=$2 ; shift 2 ; continue ; fi
if [[ "$1" == "--notice" || "$1" == "--notice-compute-with-flags" ]]; then
I=${#NOTICE_SECTION_TYPE[*]}
NOTICE_SECTION_TYPE[$I]=${1:2}
NOTICE_SECTION_ARG[$I]=$2
shift 2
continue
fi
if [ "$1" == "--libraries" ] ; then
shift
LIBRARIES=(${LIBRARIES[@]} $@)
shift $#
continue
fi
if [ "$1" == "--keep-metadata-file" ] ; then
shift
KEEP_METADATA_FILE=$1
shift
continue
fi
usage
echo Unexpected argument: $1
exit 1
done
NOTICE_FILE=${OUTPUT_DIR}/NOTICE${SUFFIX}
LICENSE_FILE=${OUTPUT_DIR}/LICENSE${SUFFIX}
echo Writing to $NOTICE_FILE and $LICENSE_FILE...
error() {
echo "*** This file is incomplete. ***" >> $NOTICE_FILE
echo "*** This file is incomplete. ***" >> $LICENSE_FILE
echo ""
echo "" >&2
echo "ERROR - "$2 >&2
echo "" >&2
exit $1
}
onTrappedError() {
error 9 "Execution aborted"
}
trap onTrappedError ERR
rm -f $NOTICE_FILE $LICENSE_FILE
if [ "${#NOTICE_SECTION_TYPE[@]}" == "0" ] ; then echo "\nNo sections included for NOTICE. No point in proceeing." ; exit 1 ; fi
TEMP_METADATA_FILE=`pwd -P`/temp.license-metadata.yaml
TEMP_NOTICE_DATA_FILE=`pwd -P`/temp.license-notice-data.yaml
TEMP_LICENSES_=`pwd -P`/temp.license-list-
TEMP_MVN_OUT=`pwd -P`/temp.license-maven-output.log
echo > $TEMP_METADATA_FILE
if [ ! -z "$LIBRARIES" ] ; then
echo Using metadata libraries from "${LIBRARIES[@]}": $(find -L "${LIBRARIES[@]}" -name "license-metadata-*")
# sort by filename first, then by path, with later ones alpha being the ones that are ultimately used
for x in $(find -L "${LIBRARIES[@]}" -name "license-metadata-*" | sed 's/\(.*\/\)\(.*\)/\2 --- \1\2/' | sort | sed 's/.* --- //') ; do
cat $x >> $TEMP_METADATA_FILE
done
fi
process_dependencies() {
echo running mvn license-audit-maven-plugin:notices
echo mvn -X org.heneveld.maven:license-audit-maven-plugin:notices \
-DlicensesPreferred=Apache-2.0,Apache,EPL-1.0,BSD-2-Clause,BSD-3-Clause,CDDL-1.1,CDDL-1.0,CDDL \
-DoverridesFile=$TEMP_METADATA_FILE \
-DoutputYaml=true \
-DoutputFile=$TEMP_NOTICE_DATA_FILE \
$@
echo writing to $TEMP_MVN_OUT
mvn -X org.heneveld.maven:license-audit-maven-plugin:notices \
-DlicensesPreferred=Apache-2.0,Apache,EPL-1.0,BSD-2-Clause,BSD-3-Clause,CDDL-1.1,CDDL-1.0,CDDL \
-DoverridesFile=$TEMP_METADATA_FILE \
-DoutputYaml=true \
-DoutputFile=$TEMP_NOTICE_DATA_FILE \
$@ > $TEMP_MVN_OUT || (cat $TEMP_MVN_OUT && error 2 "mvn error")
sed "s/^/ /" < $TEMP_NOTICE_DATA_FILE >> $NOTICE_FILE
if [ ! -s "$TEMP_NOTICE_DATA_FILE" ] ; then
echo " # No such dependencies" >> $NOTICE_FILE
echo "" >> $NOTICE_FILE
fi
}
for ((I=0; I<${#NOTICE_SECTION_TYPE[@]}; I++)); do
echo Adding ${NOTICE_SECTION_TYPE[$I]} section ${NOTICE_SECTION_ARG[$I]} to $NOTICE_FILE
if [ "${NOTICE_SECTION_TYPE[$I]}" == "notice" ] ; then
cat ${NOTICE_SECTION_ARG[$I]} >> $NOTICE_FILE
continue
fi
if [ "${NOTICE_SECTION_TYPE[$I]}" == "notice-compute-with-flags" ] ; then
process_dependencies "${NOTICE_SECTION_ARG[$I]}"
continue
fi
error "Unknown notice section type ${NOTICE_SECTION_TYPE[$I]}"
done
for (( I=0; I<${#LICENSES[@]}-1; I++ )) ; do
echo Adding ${LICENSES[$I]} to $LICENSE_FILE
cat ${LICENSES[$I]} >> $LICENSE_FILE
done
grep "License name:" $NOTICE_FILE | sed "s/.*://" > ${TEMP_LICENSES_}1
cat ${TEMP_LICENSES_}1 | while read x ; do echo $x ; done | sort | uniq > ${TEMP_LICENSES_}2
MISSING=()
if [ -s ${TEMP_LICENSES_}2 ] ; then
echo Adding ${LICENSES[$I]} to $LICENSE_FILE and `cat ${TEMP_LICENSES_}2 | wc -l` licenses:`cat ${TEMP_LICENSES_}2 | sed 's/^/ /' | paste -sd ';' -`
cat ${LICENSES[${#LICENSES[@]}-1]} >> $LICENSE_FILE
LICENSE_TEXT_PATHS=$(find -L ${LIBRARIES[@]} -name license-text)
while read x ; do
echo " "$x": |" >> $LICENSE_FILE
unset FOUND
for lp in ${LICENSE_TEXT_PATHS} ; do
if [ -f "$lp/$x" ] ; then
if [ -z "$FOUND" ]; then
cat "$lp/$x" | sed "s/^/ /" >> $LICENSE_FILE
echo "" >> $LICENSE_FILE
FOUND=true
fi
fi
done
if [ -z "$FOUND" ]; then
echo Missing license "$x".
echo " MISSING LICENSE: "$x >> $LICENSE_FILE
echo "" >> $LICENSE_FILE
MISSING=("${MISSING[@]}" "$x")
fi
done < ${TEMP_LICENSES_}2
fi
if [ ! -z "$MISSING" ] ; then
echo ""
echo License files missing in license-text/ in ${LIBRARIES[@]}
for x in "${MISSING[@]}" ; do
grep -A1 ": $x\$" $NOTICE_FILE | head -2
done
error 3 "Missing license text files"
fi
cp $NOTICE_FILE $NOTICE_FILE.tmp
grep -v "License URL:" $NOTICE_FILE.tmp > $NOTICE_FILE
if [ ! -z "$KEEP_METADATA_FILE" ] ; then
cp $TEMP_METADATA_FILE $KEEP_METADATA_FILE
fi
rm -f $NOTICE_FILE.tmp $TEMP_METADATA_FILE $TEMP_NOTICE_DATA_FILE $TEMP_MVN_OUT ${TEMP_LICENSES_}*
exit 0