summaryrefslogtreecommitdiffstats
path: root/load-env
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 "$@"