aboutsummaryrefslogtreecommitdiffstats
path: root/.envrc
diff options
context:
space:
mode:
authorYann Herklotz <git@yannherklotz.com>2019-07-23 01:38:23 +0200
committerYann Herklotz <git@yannherklotz.com>2019-07-23 01:38:23 +0200
commit89821f1837d34f3f8e66370a4e5638629015306c (patch)
tree1721197e06ee0ba2999927fee456bfee1108cd4b /.envrc
parent58c0c75859a63bc60064a265eb3ea0ae669b4137 (diff)
downloadverismith-89821f1837d34f3f8e66370a4e5638629015306c.tar.gz
verismith-89821f1837d34f3f8e66370a4e5638629015306c.zip
Remove stack and format fuzz
Diffstat (limited to '.envrc')
-rw-r--r--.envrc83
1 files changed, 83 insertions, 0 deletions
diff --git a/.envrc b/.envrc
index 1d953f4..e2e9592 100644
--- a/.envrc
+++ b/.envrc
@@ -1 +1,84 @@
+####################################
+# Environment setup for Nix shells #
+####################################
+
+# From https://github.com/direnv/direnv/wiki/Nix#persistent-cached-shell
+#
+# Usage: use_nix [...]
+#
+# Load environment variables from `nix-shell`.
+# If you have a `default.nix` or `shell.nix` one of these will be used and
+# the derived environment will be stored at ./.direnv/env-<hash>
+# and symlink to it will be created at ./.direnv/default.
+# Dependencies are added to the GC roots, such that the environment remains persistent.
+#
+# Packages can also be specified directly via e.g `use nix -p ocaml`,
+# however those will not be added to the GC roots.
+#
+# The resulting environment is cached for better performance.
+#
+# To trigger switch to a different environment:
+# `rm -f .direnv/default`
+#
+# To derive a new environment:
+# `rm -rf .direnv/env-$(md5sum {shell,default}.nix 2> /dev/null | cut -c -32)`
+#
+# To remove cache:
+# `rm -f .direnv/dump-*`
+#
+# To remove all environments:
+# `rm -rf .direnv/env-*`
+#
+# To remove only old environments:
+# `find .direnv -name 'env-*' -and -not -name `readlink .direnv/default` -exec rm -rf {} +`
+#
+use_nix() {
+ set -e
+
+ local shell="shell.nix"
+ if [[ ! -f "${shell}" ]]; then
+ shell="default.nix"
+ fi
+
+ if [[ ! -f "${shell}" ]]; then
+ fail "use nix: shell.nix or default.nix not found in the folder"
+ fi
+
+ local dir="${PWD}"/.direnv
+ local default="${dir}/default"
+ if [[ ! -L "${default}" ]] || [[ ! -d `readlink "${default}"` ]]; then
+ local wd="${dir}/env-`md5sum "${shell}" | cut -c -32`" # TODO: Hash also the nixpkgs version?
+ mkdir -p "${wd}"
+
+ local drv="${wd}/env.drv"
+ if [[ ! -f "${drv}" ]]; then
+ log_status "use nix: deriving new environment"
+ IN_NIX_SHELL=1 nix-instantiate --add-root "${drv}" --indirect "${shell}" > /dev/null
+ nix-store -r `nix-store --query --references "${drv}"` --add-root "${wd}/dep" --indirect > /dev/null
+ fi
+
+ rm -f "${default}"
+ ln -s `basename "${wd}"` "${default}"
+ fi
+
+ local drv=`readlink -f "${default}/env.drv"`
+ local dump="${dir}/dump-`md5sum ".envrc" | cut -c -32`-`md5sum ${drv} | cut -c -32`"
+
+ if [[ ! -f "${dump}" ]] || [[ "${XDG_CONFIG_DIR}/direnv/direnvrc" -nt "${dump}" ]]; then
+ log_status "use nix: updating cache"
+
+ old=`find ${dir} -name 'dump-*'`
+ nix-shell "${drv}" --show-trace "$@" --run 'direnv dump' > "${dump}"
+ rm -f ${old}
+ fi
+
+ direnv_load cat "${dump}"
+
+ watch_file "${default}"
+ watch_file shell.nix
+ if [[ ${shell} == "default.nix" ]]; then
+ watch_file default.nix
+ fi
+}
+
use nix