馃挘 Machine learning which might blow up in your face 馃挘
1#!/bin/sh -eu
2
3: ${MAFIA_HOME:=$HOME/.mafia}
4: ${MAFIA_VERSIONS:=$MAFIA_HOME/versions}
5
6latest_version () {
7 git ls-remote https://github.com/haskell-mafia/mafia | grep refs/heads/master | cut -f 1
8}
9
10build_version() {
11 MAFIA_VERSION="$1"
12 MAFIA_TEMP=$(mktemp -d 2>/dev/null || mktemp -d -t 'exec_mafia')
13 MAFIA_FILE=mafia-$MAFIA_VERSION
14 MAFIA_PATH=$MAFIA_VERSIONS/$MAFIA_FILE
15 mkdir -p $MAFIA_VERSIONS
16 echo "Building $MAFIA_FILE in $MAFIA_TEMP"
17 git clone https://github.com/haskell-mafia/mafia $MAFIA_TEMP
18 git --git-dir="$MAFIA_TEMP/.git" --work-tree="$MAFIA_TEMP" reset --hard $MAFIA_VERSION || {
19 echo "mafia version ($MAFIA_VERSION) could not be found." >&2
20 exit 1
21 }
22 (cd "$MAFIA_TEMP" && ./bin/bootstrap) || {
23 got=$?
24 echo "mafia version ($MAFIA_VERSION) could not be built." >&2
25 exit "$got"
26 }
27 chmod +x "$MAFIA_TEMP/.cabal-sandbox/bin/mafia"
28 # Ensure executable is on same file-system so final mv is atomic.
29 mv -f "$MAFIA_TEMP/.cabal-sandbox/bin/mafia" "$MAFIA_PATH.$$"
30 mv "$MAFIA_PATH.$$" "$MAFIA_PATH" || {
31 rm -f "$MAFIA_PATH.$$"
32 echo "INFO: mafia version ($MAFIA_VERSION) already exists not overiding," >&2
33 echo "INFO: this is expected if parallel builds of the same version of" >&2
34 echo "INFO: mafia occur, we are playing by first in, wins." >&2
35 exit 0
36 }
37}
38
39enable_version() {
40 if [ $# -eq 0 ]; then
41 MAFIA_VERSION="$(latest_version)"
42 echo "INFO: No explicit mafia version requested installing latest ($MAFIA_VERSION)." >&2
43 else
44 MAFIA_VERSION="$1"
45 fi
46 [ -x "$MAFIA_HOME/versions/mafia-$MAFIA_VERSION" ] || build_version "$MAFIA_VERSION"
47 ln -sf "$MAFIA_HOME/versions/mafia-$MAFIA_VERSION" "$MAFIA_HOME/versions/mafia"
48}
49
50exec_mafia () {
51 [ -x "$MAFIA_HOME/versions/mafia" ] || enable_version
52 "$MAFIA_HOME/versions/mafia" "$@"
53}
54
55#
56# The actual start of the script.....
57#
58
59case "${1:-}" in
60upgrade) shift; enable_version "$@" ;;
61*) exec_mafia "$@"
62esac