2018-09-24 23:41:27 +03:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
haskell_needs_rebuild=x
|
|
|
|
scala_needs_rebuild=x
|
2018-09-25 00:04:33 +03:00
|
|
|
sources_changed=
|
2018-09-24 23:41:27 +03:00
|
|
|
haskell_pid=
|
2018-09-25 04:54:40 +03:00
|
|
|
last_unison_source="$1"
|
2018-09-24 23:41:27 +03:00
|
|
|
|
|
|
|
function maybe_build_haskell {
|
|
|
|
if [ -n "$haskell_needs_rebuild" ]; then
|
|
|
|
echo "Building typechecker..."
|
2018-09-25 00:04:33 +03:00
|
|
|
stack build && haskell_needs_rebuild="" && echo "Typechecker built!"
|
2018-09-24 23:41:27 +03:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function maybe_build_scala {
|
|
|
|
if [ -n "$scala_needs_rebuild" ]; then
|
|
|
|
echo "Building runtime..."
|
2018-09-25 00:04:33 +03:00
|
|
|
(cd runtime-jvm; yes q | sbt main/compile) && scala_needs_rebuild="" && echo "Runtime built!"
|
2018-09-24 23:41:27 +03:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
function kill_watcher {
|
|
|
|
# echo "debug: kill $haskell_pid"
|
2018-09-25 00:04:33 +03:00
|
|
|
kill $haskell_pid 2>/dev/null
|
|
|
|
wait $haskell_pid 2>/dev/null
|
2018-09-24 23:41:27 +03:00
|
|
|
haskell_pid=
|
|
|
|
}
|
|
|
|
|
|
|
|
function start_watcher {
|
2018-09-25 04:54:40 +03:00
|
|
|
stack exec watcher "$last_unison_source" &
|
2018-09-24 23:41:27 +03:00
|
|
|
haskell_pid=$!
|
|
|
|
echo "Launched haskell watcher as pid $haskell_pid."
|
|
|
|
}
|
|
|
|
|
|
|
|
function go {
|
|
|
|
# echo "debug: haskell_needs_rebuild=$haskell_needs_rebuild"
|
|
|
|
if [ -n "$haskell_needs_rebuild" ] || [ -n "$scala_needs_rebuild" ]; then
|
|
|
|
kill_watcher
|
|
|
|
fi
|
2018-09-25 00:04:33 +03:00
|
|
|
maybe_build_haskell && maybe_build_scala
|
2018-09-24 23:41:27 +03:00
|
|
|
# echo "debug: haskell_needs_rebuild=$haskell_needs_rebuild, scala_needs_rebuild=$scala_needs_rebuild, haskell_pid=$haskell_pid"
|
|
|
|
if [ -z "$haskell_needs_rebuild" ] && [ -z "$scala_needs_rebuild" ] && [ -z "$haskell_pid" ]; then
|
|
|
|
start_watcher
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
trap kill_watcher EXIT
|
|
|
|
go
|
|
|
|
|
|
|
|
while IFS= read -r changed; do
|
|
|
|
# echo "debug: $changed"
|
2018-09-25 04:54:40 +03:00
|
|
|
case "$changed" in
|
2018-09-24 23:41:27 +03:00
|
|
|
NoOp)
|
2018-09-25 00:04:33 +03:00
|
|
|
if [ -n "$sources_changed" ]; then
|
|
|
|
sources_changed=
|
|
|
|
go
|
|
|
|
fi
|
2018-09-24 23:41:27 +03:00
|
|
|
;;
|
2018-09-25 04:54:40 +03:00
|
|
|
*.hs|*.cabal)
|
2018-09-24 23:41:27 +03:00
|
|
|
echo "detected change in $changed"
|
|
|
|
# hasktags -cx parser-typechecker
|
|
|
|
haskell_needs_rebuild=x
|
2018-09-25 00:04:33 +03:00
|
|
|
sources_changed=x
|
2018-09-24 23:41:27 +03:00
|
|
|
;;
|
2018-09-25 00:04:33 +03:00
|
|
|
*.scala|*.sbt)
|
2018-09-24 23:41:27 +03:00
|
|
|
echo "detected change in $changed"
|
|
|
|
scala_needs_rebuild=x
|
2018-09-25 00:04:33 +03:00
|
|
|
sources_changed=x
|
2018-09-24 23:41:27 +03:00
|
|
|
;;
|
2018-09-25 04:54:40 +03:00
|
|
|
*.u|*.uu)
|
|
|
|
last_unison_source="$changed"
|
2018-09-24 23:41:27 +03:00
|
|
|
esac
|
|
|
|
done
|