Skip to content

Commit c59f4fc

Browse files
committed
melting-pot: cache previously successful dep sets
1 parent 6952ca7 commit c59f4fc

1 file changed

Lines changed: 105 additions & 16 deletions

File tree

melting-pot.sh

Lines changed: 105 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)