@@ -600,12 +600,12 @@ generatePOM() {
600600 echo ' </project>' >> pom.xml
601601}
602602
603- # Generates melt.sh script for all modules in the current directory.
604- generateScript () {
603+ # Generates melt.sh and helper scripts for all modules in the current directory.
604+ generateScripts () {
605605 echo ' #!/bin/sh' > melt.sh
606606 echo ' trap "exit" INT' >> melt.sh
607607 echo ' echo "Melting the pot..."' >> melt.sh
608- echo ' dir=$(pwd) ' >> melt.sh
608+ echo ' dir=$(cd "$(dirname "$0")" && pwd) ' >> melt.sh
609609 echo ' failCount=0' >> melt.sh
610610 echo ' for f in \' >> melt.sh
611611 local dir
@@ -623,22 +623,109 @@ generateScript() {
623623 done
624624 echo >> melt.sh
625625 echo ' do' >> melt.sh
626- echo ' # If the build passed previously, don' \' ' t repeat it.' >> melt.sh
627- echo ' test -f "$f/build.log" &&' >> melt.sh
628- echo ' tail -n6 "$f/build.log" |' >> melt.sh
629- echo ' grep -qF ' \' ' [INFO] BUILD SUCCESS' \' ' &&' >> melt.sh
630- echo ' echo "[SKIPPED] $f (already succeeded)" && continue' >> melt.sh
631- echo >> melt.sh
626+ echo ' if [ "$("$dir/prior-success.sh" "$f")" ]' >> melt.sh
627+ echo ' then' >> melt.sh
628+ echo ' echo "[SKIPPED] $f (prior success)"' >> melt.sh
629+ echo ' continue' >> melt.sh
630+ echo ' fi' >> melt.sh
632631 echo ' cd "$f"' >> melt.sh
633- echo ' sh "$dir/build.sh" >build.log 2>&1 &&' >> melt.sh
634- echo ' echo "[SUCCESS] $f" || {' >> melt.sh
635- echo ' echo "[FAILURE] $f"' >> melt.sh
636- echo ' failCount=$((failCount+1))' >> melt.sh
637- echo ' }' >> melt.sh
632+ echo ' "$dir/build.sh" >build.log 2>&1 && {' >> melt.sh
633+ echo ' echo "[SUCCESS] $f"' >> melt.sh
634+ echo ' "$dir/record-success.sh" "$f"' >> melt.sh
635+ echo ' } || {' >> melt.sh
636+ echo ' echo "[FAILURE] $f"' >> melt.sh
637+ echo ' failCount=$((failCount+1))' >> melt.sh
638+ echo ' }' >> melt.sh
638639 echo ' cd - >/dev/null' >> melt.sh
639640 echo ' done' >> melt.sh
640641 echo ' test "$failCount" -gt 255 && failCount=255' >> melt.sh
641642 echo ' exit "$failCount"' >> melt.sh
643+ chmod +x melt.sh
644+
645+ cat << \PRIOR > prior-success.sh
646+ #!/bin/sh
647+ test "$1 " || { echo "[ERROR] Please specify project to check."; exit 1; }
648+
649+ stderr() { >&2 echo "$@ "; }
650+ debug() { test "$DEBUG " && stderr "[DEBUG] $@ "; }
651+ warn() { stderr "[WARNING] $@ "; }
652+
653+ dir=$( cd " $( dirname " $0 " ) " && pwd)
654+
655+ # Check build.log for BUILD SUCCESS.
656+ buildLog="$dir /$1 /build.log"
657+ test -f "$buildLog " && tail -n6 "$buildLog " | grep -qF '[INFO] BUILD SUCCESS' && {
658+ echo "build.log"
659+ exit 0
660+ }
661+
662+ # Check success.log for matching dependency configuration.
663+ successLog="$HOME /.cache/scijava/melting-pot/$1 .success.log"
664+ test -f "$successLog " || exit 0
665+ success=
666+ for deps in $( cat " $successLog " )
667+ do
668+ debug "Checking dep config: $deps "
669+ mismatch=
670+ for dep in $( echo " $deps " | tr ' ,' ' \n' )
671+ do
672+ # g:a:p:v:s -> -Dg.a.version=v
673+ s=${dep##*: }
674+ case "$s " in
675+ test) continue ;; # skip test dependencies
676+ esac
677+ gapv=${dep%:* }
678+ g=${gapv%%:* }
679+ apv=${gapv#*: }
680+ a=${apv%%:* }
681+ v=${apv##*: }
682+ arg=" -D$g .$a .version=$v "
683+ if ! grep -Fq "$arg " "$dir /build.sh"
684+ then
685+ # G:A property is not set to this V.
686+ # Now check if the property is even declared.
687+ if grep -Fq " -D$g .$a .version=" "$dir /build.sh"
688+ then
689+ # G:A version is mismatched.
690+ debug "$dep [MISMATCH]"
691+ mismatch=1
692+ break
693+ else
694+ # G:A version is not managed.
695+ warn "Unmanaged dependency: $dep "
696+ fi
697+ fi
698+ done
699+ test "$mismatch " || {
700+ success=$deps
701+ break
702+ }
703+ done
704+ echo "$success "
705+ PRIOR
706+ chmod +x prior-success.sh
707+
708+ cat << \RECORD > record-success.sh
709+ #!/bin/sh
710+ test "$1 " || { echo "[ERROR] Please specify project to update."; exit 1; }
711+
712+ dir=$( cd " $( dirname " $0 " ) " && pwd)
713+ buildLog="$dir /$1 /build.log"
714+ test -f "$buildLog " || exit 1
715+ successLog="$HOME /.cache/scijava/melting-pot/$1 .success.log"
716+ mkdir -p "$( dirname " $successLog " ) "
717+
718+ # Record dependency configuration of successful build.
719+ deps=$( grep " ^\[INFO\] " " $buildLog " |
720+ sed -e " s/^.\{10\}//" -e " s/ -- .*//" |
721+ sort | tr ' \n' ' ,' )
722+ test -f "$successLog " && grep -Fxq "$deps " "$successLog " || {
723+ echo "$deps " > "$successLog ".new
724+ test -f "$successLog " && cat "$successLog " >> "$successLog ".new
725+ mv -f "$successLog ".new "$successLog "
726+ }
727+ RECORD
728+ chmod +x record-success.sh
642729}
643730
644731# Creates and tests an appropriate multi-module reactor for the given project.
@@ -710,8 +797,10 @@ meltDown() {
710797 # Generate build scripts.
711798 info " Generating build scripts"
712799 generatePOM
713- echo " mvn $args \\\\ \n dependency:list test \$ @" > build.sh
714- generateScript
800+ echo " #!/bin/sh" > build.sh
801+ echo " mvn $args \\\\ \n dependency:list test \$ @" >> build.sh
802+ chmod +x build.sh
803+ generateScripts
715804
716805 # Build everything.
717806 if [ " $skipBuild " ]
0 commit comments