blob: 91c2b7b3e80895a5b7977340f503f9ec2125961e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
#! /bin/sh
set -euf
#
# usage: load-env [COMMAND [ARGS...]]
#
main() {
name=$(exeFrom "$PWD")
if test -z "$name"; then
die 'could not load environment'
else
init_env "${name%-*}" "${name##*-}"
exec "load-env-$name" "$@"
fi
}
# init_env PNAME VERSION
init_env() {
# Until https://ghc.haskell.org/trac/ghc/ticket/9089 is solved,
# For a local .ghc/ghci_history:
export OLDHOME="$HOME"
verbose export HOME="$HOME/.env-home/$1"
mkdir -p -m 0700 "$HOME"
verbose export HISTFILE="$HOME/histfile"
verbose export HISTSIZE=100000
if test -f "$HOME/profile"; then
verbose . "$HOME/profile"
fi
}
#
# exeFrom* functions
#
# Determine name (pname-version) of a directory.
#
# exeFrom DIR
# Prints PNAME-VERSION to stderr.
exeFrom () {
if test -e "$1/env.nix"; then
exeFromEnvNix "$1/env.nix"
else
echo2 "Warning: this is a legacy directory"
exeFromDirName "$1"
fi
}
# exeFromEnvNix expects that $1 (env.nix) contains:
# let
# pname = "example";
# version = "1";
exeFromEnvNix() {
envNix=$(tr -d '\n ' < "$1")
if ! echo "$envNix" | grep -q 'letpname'; then
echo2 "$0: warning: nix.env is using name instead of pname"
fi
echo "$envNix" |
sed -n '
s/.*letp\?name="\([0-9A-Za-z-]\+\)";version="\([0-9]\+\)";.*/\1-\2/p
'
}
exeFromDirName() {
case "$1" in
"$HOME/src/"[0-9A-Za-z-]*)
name=$(basename "$1")
basename $(findexe "$name" | highest_version) | sed s:^load-env-::
;;
"$HOME/src/"*) echo2 "bad basename: $(basename "$1")";;
*) echo2 "load-env only knows about stuff below ~/src";;
esac
}
#
# Utility Functions
#
die() {
echo2 "$0: $*"
exit 23
}
echo2() { echo "$*" >&2; }
verbose() {
echo2 "$@"
"$@"
}
findexe() {
( IFS=:
find $PATH \
-regextype posix-extended \
-regex ".*/load-env-$1(-[0-9.]+)?$" \
2>/dev/null )
}
highest_version() {
sort -V | tail -n 1
}
main "$@"
|