annotate repoint @ 56:5e9027b32179 tip master

Fixes for updated subrepos
author Chris Cannam <cannam@all-day-breakfast.com>
date Wed, 16 May 2018 15:51:14 +0100
parents bbcce33e758d
children
rev   line source
cannam@54 1 #!/bin/bash
cannam@54 2
cannam@54 3 # Disable shellcheck warnings for useless-use-of-cat. UUOC is good
cannam@54 4 # practice, not bad: clearer, safer, less error-prone.
cannam@54 5 # shellcheck disable=SC2002
cannam@54 6
cannam@55 7 sml="$REPOINT_SML"
cannam@54 8
cannam@54 9 set -eu
cannam@54 10
cannam@55 11 # avoid gussying up output
cannam@55 12 export HGPLAIN=true
cannam@55 13
cannam@54 14 mydir=$(dirname "$0")
cannam@55 15 program="$mydir/repoint.sml"
cannam@54 16
cannam@54 17 hasher=
cannam@54 18 local_install=
cannam@54 19 if [ -w "$mydir" ]; then
cannam@54 20 if echo | sha256sum >/dev/null 2>&1 ; then
cannam@54 21 hasher=sha256sum
cannam@54 22 local_install=true
cannam@54 23 elif echo | shasum >/dev/null 2>&1 ; then
cannam@54 24 hasher=shasum
cannam@54 25 local_install=true
cannam@54 26 else
cannam@54 27 echo "WARNING: sha256sum or shasum program not found" 1>&2
cannam@54 28 fi
cannam@54 29 fi
cannam@54 30
cannam@54 31 if [ -n "$local_install" ]; then
cannam@54 32 hash=$(echo "$sml" | cat "$program" - | $hasher | cut -c1-16)
cannam@55 33 gen_sml=$mydir/.repoint-$hash.sml
cannam@55 34 gen_out=$mydir/.repoint-$hash.bin
cannam@54 35 trap 'rm -f $gen_sml' 0
cannam@54 36 else
cannam@55 37 gen_sml=$(mktemp /tmp/repoint-XXXXXXXX.sml)
cannam@55 38 gen_out=$(mktemp /tmp/repoint-XXXXXXXX.bin)
cannam@54 39 trap 'rm -f $gen_sml $gen_out' 0
cannam@54 40 fi
cannam@54 41
cannam@54 42 if [ -x "$gen_out" ]; then
cannam@54 43 exec "$gen_out" "$@"
cannam@54 44 fi
cannam@54 45
cannam@55 46 # We need one of Poly/ML, SML/NJ, MLton, or MLKit. Since we're running
cannam@55 47 # a single-file SML program as if it were a script, our order of
cannam@55 48 # preference is usually based on startup speed. An exception is the
cannam@55 49 # local_install case, where we retain a persistent binary
cannam@54 50
cannam@54 51 if [ -z "$sml" ]; then
cannam@54 52 if [ -n "$local_install" ] && mlton 2>&1 | grep -q 'MLton'; then
cannam@54 53 sml="mlton"
cannam@54 54 elif sml -h 2>&1 | grep -q 'Standard ML of New Jersey'; then
cannam@54 55 sml="smlnj"
cannam@54 56 # We would prefer Poly/ML to SML/NJ, except that Poly v5.7 has a
cannam@54 57 # nasty bug that occasionally causes it to deadlock on startup.
cannam@55 58 # That is fixed in v5.7.1, so we could promote it up the order
cannam@55 59 # again at some point in future
cannam@54 60 elif echo | poly -v 2>/dev/null | grep -q 'Poly/ML'; then
cannam@54 61 sml="poly"
cannam@54 62 elif mlton 2>&1 | grep -q 'MLton'; then
cannam@54 63 sml="mlton"
cannam@55 64 # MLKit is at the bottom because it leaves compiled files around
cannam@55 65 # in an MLB subdir in the current directory
cannam@55 66 elif mlkit 2>&1 | grep -q 'MLKit'; then
cannam@55 67 sml="mlkit"
cannam@54 68 else cat 1>&2 <<EOF
cannam@54 69
cannam@54 70 ERROR: No supported SML compiler or interpreter found
cannam@54 71 EOF
cannam@55 72 cat 1>&2 <<EOF
cannam@54 73
cannam@55 74 The Repoint external source code manager needs a Standard ML (SML)
cannam@54 75 compiler or interpreter to run.
cannam@54 76
cannam@54 77 Please ensure you have one of the following SML implementations
cannam@54 78 installed and present in your PATH, and try again.
cannam@54 79
cannam@54 80 1. Standard ML of New Jersey
cannam@55 81 - may be found in a distribution package called: smlnj
cannam@54 82 - executable name: sml
cannam@54 83
cannam@54 84 2. Poly/ML
cannam@55 85 - may be found in a distribution package called: polyml
cannam@54 86 - executable name: poly
cannam@54 87
cannam@54 88 3. MLton
cannam@55 89 - may be found in a distribution package called: mlton
cannam@54 90 - executable name: mlton
cannam@54 91
cannam@55 92 4. MLKit
cannam@55 93 - may be found in a distribution package called: mlkit
cannam@55 94 - executable name: mlkit
cannam@55 95
cannam@54 96 EOF
cannam@54 97 exit 2
cannam@54 98 fi
cannam@54 99 fi
cannam@54 100
cannam@54 101 arglist=""
cannam@54 102 for arg in "$@"; do
cannam@54 103 if [ -n "$arglist" ]; then arglist="$arglist,"; fi
cannam@55 104 if echo "$arg" | grep -q '["'"'"']' ; then
cannam@54 105 arglist="$arglist\"usage\""
cannam@54 106 else
cannam@54 107 arglist="$arglist\"$arg\""
cannam@54 108 fi
cannam@54 109 done
cannam@54 110
cannam@54 111 case "$sml" in
cannam@54 112 poly)
cannam@54 113 if [ -n "$local_install" ] && polyc --help >/dev/null 2>&1 ; then
cannam@54 114 if [ ! -x "$gen_out" ]; then
cannam@54 115 polyc -o "$gen_out" "$program"
cannam@54 116 fi
cannam@54 117 "$gen_out" "$@"
cannam@54 118 else
cannam@55 119 echo 'use "'"$program"'"; repoint ['"$arglist"'];' |
cannam@54 120 poly -q --error-exit
cannam@54 121 fi ;;
cannam@54 122 mlton)
cannam@54 123 if [ ! -x "$gen_out" ]; then
cannam@55 124 echo "[Precompiling Repoint binary...]" 1>&2
cannam@54 125 echo "val _ = main ()" | cat "$program" - > "$gen_sml"
cannam@54 126 mlton -output "$gen_out" "$gen_sml"
cannam@54 127 fi
cannam@54 128 "$gen_out" "$@" ;;
cannam@55 129 mlkit)
cannam@55 130 if [ ! -x "$gen_out" ]; then
cannam@55 131 echo "[Precompiling Repoint binary...]" 1>&2
cannam@55 132 echo "val _ = main ()" | cat "$program" - > "$gen_sml"
cannam@55 133 mlkit -output "$gen_out" "$gen_sml"
cannam@55 134 fi
cannam@55 135 "$gen_out" "$@" ;;
cannam@54 136 smlnj)
cannam@54 137 cat "$program" | (
cannam@54 138 cat <<EOF
cannam@54 139 val smlrun__cp =
cannam@54 140 let val x = !Control.Print.out in
cannam@54 141 Control.Print.out := { say = fn _ => (), flush = fn () => () };
cannam@54 142 x
cannam@54 143 end;
cannam@54 144 val smlrun__prev = ref "";
cannam@54 145 Control.Print.out := {
cannam@54 146 say = fn s =>
cannam@54 147 (if String.isSubstring " Error" s
cannam@54 148 then (Control.Print.out := smlrun__cp;
cannam@54 149 (#say smlrun__cp) (!smlrun__prev);
cannam@54 150 (#say smlrun__cp) s)
cannam@54 151 else (smlrun__prev := s; ())),
cannam@54 152 flush = fn s => ()
cannam@54 153 };
cannam@54 154 EOF
cannam@54 155 cat -
cannam@54 156 cat <<EOF
cannam@55 157 val _ = repoint [$arglist];
cannam@54 158 val _ = OS.Process.exit (OS.Process.success);
cannam@54 159 EOF
cannam@54 160 ) > "$gen_sml"
cannam@54 161 CM_VERBOSE=false sml "$gen_sml" ;;
cannam@54 162 *)
cannam@55 163 echo "ERROR: Unknown SML implementation name: $sml" 1>&2;
cannam@54 164 exit 2 ;;
cannam@54 165 esac
cannam@54 166