X-Git-Url: http://git.pld-linux.org/?p=packages%2Frpm.git;a=blobdiff_plain;f=rpm-java-requires;h=8bbac6f2e53e91ded3f1eb08f3bf49a791ea269c;hp=2dfb0d5c60636421c560be1be5fcf2410f08e351;hb=8817aca0949eeb1c64426e90d905a705653989c5;hpb=382c903067596ddac095be44cf15b3c97ee9ee15 diff --git a/rpm-java-requires b/rpm-java-requires old mode 100644 new mode 100755 index 2dfb0d5..8bbac6f --- a/rpm-java-requires +++ b/rpm-java-requires @@ -7,24 +7,56 @@ export PATH="/sbin:/usr/sbin:/bin:/usr/bin" +# Set the prefix, unless it is overriden +: ${RPM_LIBDIR=/usr/lib/rpm} + +# Enable debug: JAVADEPS_DEBUG=true +: ${JAVADEPS_DEBUG=false} + +# xsltproc for eclipse feature.xml +: ${xsltproc=/usr/bin/xsltproc} + +# "%define java_min_classdataversion 51.0" in spec to minimum version to be 51.0 +: ${MIN_CLASSDATAVERSION=} + +# save $- state, to enable in functions +debug=$- + +javaclassversionfilter() { + if [ "$MIN_CLASSDATAVERSION" ]; then + set -- $* "$MIN_CLASSDATAVERSION" + fi + + local v + for v in $*; do + echo "java(ClassDataVersion) >= $v" + done | sort -V | tail -n 1 +} + javaclassversion() { + set -$debug + local mode=$1; shift [ $# -gt 0 ] || return 1 + $JAVADEPS_DEBUG && echo >&2 ">> javaclassversion($mode): $*" + + # process only requires + [ "$mode" = requires ] || return $ret local classver=$(echo "$@" | xargs -r file | grep -o 'compiled Java class data, version [0-9.]*' | awk '{print $NF}' | sort -u) if [ -z "$classver" ]; then return 1 fi - local v - for v in $classver; do - echo "java(ClassDataVersion) >= $v" - done + javaclassversionfilter $classver return 0 } javajarversion() { - local jar="$1" - local ret=0 + set -$debug + local mode=$1; shift + local jar=$1 + local tmp ret=0 + $JAVADEPS_DEBUG && echo >&2 ">> javajarversion($mode): $jar" # check only files, symlinks could point outside buildroot [ -f "$jar" -a ! -L "$jar" ] || return $ret @@ -33,38 +65,73 @@ javajarversion() { unzip -q -d $tmp $jar >&2 # workaround for .jar files with stupid permissions chmod -R u+rwX $tmp - javaclassversion $(find $tmp -type f -name '*.class') || { - echo >&2 "ERROR: Class version could not be extracted from $jar" - ret=1 - } - rm -rf $tmp + # find .jar and .class files + find_javadeps $mode $(find $tmp -type f -regextype posix-extended -regex '^.+\.(class|jar)$') || ret=1 + rm -rf $tmp return $ret } -find_requires() { +eclipse_feature() { + set -$debug + local mode=$1; shift + local file=$1 local ret=0 - for file in $FILES; do + + $JAVADEPS_DEBUG && echo >&2 ">> eclipse_feature($mode): $file" + + if [ ! -x $xsltproc ]; then + return 0 + fi + + $xsltproc --stringparam mode $mode ${RPM_LIBDIR}/eclipse-feature.xslt $file +} + +find_javadeps() { + set -$debug + local mode=$1; shift + local ret=0 + + $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): $*" + for file in $@; do case $file in *.jar) - javajarversion "$file" || ret=1 + javajarversion $mode "$file" || ret=1 ;; *.class) - javaclassversion "$file" || { + javaclassversion $mode "$file" || { echo >&2 "ERROR: Class version could not be extracted from $file" ret=1 } ;; + */feature.xml) + eclipse_feature $mode "$file" || ret=1 + ;; + *) + $JAVADEPS_DEBUG && echo >&2 ">> find_javadeps($mode): no handle: $file" + ;; esac done return $ret } -FILES=$(cat -) +ret=0 +# default mode to requires for backward compat +mode=requires +case $1 in +-P|--provides) + mode=provides + shift + ;; +-R|--requires) + mode=requires + shift + ;; +esac t=$(mktemp) -ret=0 -find_requires > $t || ret=1 -cat $t +find_javadeps $mode $(cat -) > $t || ret=1 +sort -u $t rm -f $t + exit $ret