Source file opamScript.ml
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
let bwrap =
"#!/usr/bin/env bash\n\nset -ue\n\n# Used to make /* match all files (even those beginning with a '.')\nshopt -s dotglob\n\nif ! command -v bwrap >/dev/null; then\n echo \"The 'bwrap' command was not found. Install 'bubblewrap' on your system, or\" >&2\n echo \"disable sandboxing in ${OPAMROOT:-~/.opam}/config at your own risk.\" >&2\n echo \"See https://github.com/projectatomic/bubblewrap for bwrap details.\" >&2\n echo \"For 'bwrap' use in opam, see the FAQ:\" >&2\n echo \" https://opam.ocaml.org/doc/FAQ.html#Why-does-opam-require-bwrap\" >&2\n exit 10\nfi\n\n# --new-session requires bubblewrap 0.1.7\n# --die-with-parent requires bubblewrap 0.1.8\nARGS=(--unshare-net --new-session --die-with-parent)\nARGS=(\"${ARGS[@]}\" --proc /proc --dev /dev)\nARGS=(\"${ARGS[@]}\" --setenv TMPDIR /opam-tmp --setenv TMP /opam-tmp --setenv TEMPDIR /opam-tmp --setenv TEMP /opam-tmp)\nARGS=(\"${ARGS[@]}\" --bind /tmp /tmp)\nARGS=(\"${ARGS[@]}\" --tmpfs /opam-tmp)\nARGS=(\"${ARGS[@]}\" --tmpfs /run)\n# NOTE: When adding a new mount-point please sync with the loop below to avoid overriding the mount point\n\nadd_mount() {\n if [ -d \"$dir\" ]; then\n case \"$1\" in\n ro) B=\"--ro-bind\";;\n rw) B=\"--bind\";;\n sym) B=\"--symlink\";;\n esac\n ARGS=(\"${ARGS[@]}\" \"$B\" \"$2\" \"$3\")\n fi\n}\n\nadd_mounts() {\n local flag=\"$1\"; shift\n for dir in \"$@\"; do\n add_mount \"$flag\" \"$dir\" \"$dir\"\n done\n}\n\n# Mounts the standard system paths. Maintains symlinks, to handle cases\n# like `/bin` -> `usr/bin`, where `/bin/../foo` resolves to `/usr/foo`,\n# not `/foo`. We handle symlinks here but not in `add_mounts` because\n# system paths are pretty much guaranteed not to accidentally escape into\n# off-limits directories.\nadd_sys_mounts() {\n for dir in \"$@\"; do\n if [ -L \"$dir\" ]; then\n local src=$(readlink -f \"$dir\")\n add_mount sym \"$src\" \"$dir\"\n else\n add_mounts ro \"$dir\"\n fi\n done\n}\n\n# NOTE: The list of moint-points to avoid is always to be sync'd with the list at the top of the file\n# It is due to a limitation of bubblewrap that we have to mount the directories one by one\n# See https://github.com/containers/bubblewrap/issues/413\nfor dir in /*; do\n case \"$dir\" in\n \"/proc\" | \"/dev\" | \"/run\" | \"/tmp\" | \"/opam-tmp\") ;;\n \"/sys\") ;; # Disabled without a corresponding bind, due to security concerns\n *) add_sys_mounts \"$dir\";;\n esac\ndone\n# NOTE: This is required for NixOS (see https://github.com/NixOS/nixpkgs/pull/363770)\nif [ -d /run/current-system/sw ]; then\n add_sys_mounts /run/current-system/sw\nfi\n\nmount_linked_cache() {\n local l_cache=$1\n local cache=$(readlink -m \"$l_cache\")\n mkdir -p \"$cache\"\n add_mount rw \"$l_cache\" \"$cache\"\n}\n\n# C compilers using `ccache` will write to a shared cache directory\n# that remain writeable. ccache seems widespread in some Fedora systems.\nadd_ccache_mount() {\n if command -v ccache > /dev/null; then\n ccache_dir_regex='cache_dir = (.*)$'\n local IFS=$'\\n'\n for f in $(ccache -p 2>/dev/null); do\n if [[ $f =~ $ccache_dir_regex ]]; then\n ccache_dir=${BASH_REMATCH[1]}\n break\n fi\n done\n CCACHE_DIR=${CCACHE_DIR-$HOME/.ccache}\n ccache_dir=${ccache_dir-$CCACHE_DIR}\n mount_linked_cache \"$ccache_dir\"\n fi\n}\n\nadd_dune_cache_mount() {\n local dune_cache=${DUNE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/dune}\n mount_linked_cache \"$dune_cache\"\n}\n\n# In case OPAMROOT happens to be in one of the writeable directories we\n# need to make sure it is read-only\nif [ -n \"${OPAMROOT:-}\" ]; then\n add_mounts ro \"$OPAMROOT\"\nfi\n\n# When using opam variable that must be defined at action time, add them also\n# at init check in OpamAuxCommands.check_and_revert_sandboxing (like\n# OPAM_SWITCH_PREFIX).\n# This case-switch should remain identical between the different sandbox implems\nCOMMAND=\"$1\"; shift\ncase \"$COMMAND\" in\n build)\n add_mounts ro \"$OPAM_SWITCH_PREFIX\"\n add_mounts rw \"$PWD\"\n add_ccache_mount\n add_dune_cache_mount\n ;;\n install)\n add_mounts rw \"$OPAM_SWITCH_PREFIX\"\n add_mounts ro \"$OPAM_SWITCH_PREFIX/.opam-switch\"\n add_mounts rw \"$PWD\"\n ;;\n remove)\n add_mounts rw \"$OPAM_SWITCH_PREFIX\"\n add_mounts ro \"$OPAM_SWITCH_PREFIX/.opam-switch\"\n if [ \"X${PWD#$OPAM_SWITCH_PREFIX/.opam-switch/}\" != \"X${PWD}\" ]; then\n add_mounts rw \"$PWD\"\n fi\n ;;\n *)\n echo \"$0: unknown command $COMMAND, must be one of 'build', 'install' or 'remove'\" >&2\n exit 2\nesac\n\nif ! command -v \"$1\" >/dev/null; then\n echo \"[ERROR] Command not found: $1\" >&2\n exit 10\nfi\n\n# Note: we assume $1 can be trusted, see https://github.com/projectatomic/bubblewrap/issues/259\n# As of now we are compatible up to 0.1.8, '--' can be added here when we require >= 0.3.0\nexec bwrap \"${ARGS[@]}\" \"$@\"\n"
let complete =
"if [ -z \"$BASH_VERSION\" ]; then return 0; fi\n\n_opam_add()\n{\n IFS=$'\\n' _opam_reply+=(\"$@\")\n}\n\n_opam_add_f()\n{\n local cmd\n cmd=$1; shift\n _opam_add \"$($cmd \"$@\" 2>/dev/null)\"\n}\n\n_opam_flags()\n{\n opam \"$@\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e 's%, \\\\fB%\\n\\\\fB%g' \\\n -e '/^\\\\fB-/p' | \\\n sed -e 's%^\\\\fB\\(-[^\\\\]*\\).*%\\1%'\n}\n\n_opam_commands()\n{\n opam \"$@\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e '/^\\.SH COMMANDS$/,/^\\.SH/ s%^\\\\fB\\([^,= ]*\\)\\\\fR.*%\\1%p'\n echo '--help'\n}\n\n_opam_vars()\n{\n opam var --safe 2>/dev/null | \\\n sed -n \\\n -e '/^PKG:/d' \\\n -e 's%^\\([^#= ][^ ]*\\).*%\\1%p'\n}\n\n_opam_argtype()\n{\n local cmd flag\n cmd=\"$1\"; shift\n flag=\"$1\"; shift\n case \"$flag\" in\n -*)\n opam \"$cmd\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e 's%.*\\\\fB'\"$flag\"'\\\\fR[= ]\\\\fI\\([^, ]*\\)\\\\fR.*%\\1%p'\n ;;\n esac\n}\n\n_opam()\n{\n local IFS cmd subcmd cur prev compgen_opt\n\n COMPREPLY=()\n cmd=${COMP_WORDS[1]}\n subcmd=${COMP_WORDS[2]}\n cur=${COMP_WORDS[COMP_CWORD]}\n prev=${COMP_WORDS[COMP_CWORD-1]}\n compgen_opt=()\n _opam_reply=()\n\n if [ $COMP_CWORD -eq 1 ]; then\n _opam_add_f opam help topics\n COMPREPLY=( $(compgen -W \"${_opam_reply[*]}\" -- $cur) )\n unset _opam_reply\n return 0\n fi\n\n case \"$(_opam_argtype $cmd $prev)\" in\n LEVEL|JOBS|RANK) _opam_add 1 2 3 4 5 6 7 8 9;;\n FILE|FILENAME) compgen_opt+=(-o filenames -f);;\n DIR|ROOT) compgen_opt+=(-o filenames -d);;\n MAKE|CMD) compgen_opt+=(-c);;\n KIND) _opam_add http local git darcs hg;;\n WHEN) _opam_add always never auto;;\n SWITCH|SWITCHES) _opam_add_f opam switch list --safe -s;;\n COLUMNS|FIELDS)\n _opam_add name version package synopsis synopsis-or-target \\\n description installed-version pin source-hash \\\n opam-file all-installed-versions available-versions \\\n all-versions repository installed-files vc-ref depexts;;\n PACKAGE|PACKAGES|PKG|PATTERN|PATTERNS)\n _opam_add_f opam list --safe -A -s;;\n FLAG) _opam_add light-uninstall verbose plugin compiler conf;;\n REPOS) _opam_add_f opam repository list --safe -s -a;;\n SHELL) _opam_add bash sh csh zsh fish;;\n TAGS) ;;\n CRITERIA) ;;\n STRING) ;;\n URL)\n compgen_opt+=(-o filenames -d)\n _opam_add \"https://\" \"http://\" \"file://\" \\\n \"git://\" \"git+file://\" \"git+ssh://\" \"git+https://\" \\\n \"hg+file://\" \"hg+ssh://\" \"hg+https://\" \\\n \"darcs+file://\" \"darcs+ssh://\" \"darcs+https://\";;\n \"\")\n case \"$cmd\" in\n install|show|info|inst|ins|in|i|inf|sh)\n _opam_add_f opam list --safe -a -s\n if [ $COMP_CWORD -gt 2 ]; then\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n reinstall|remove|uninstall|reinst|remov|uninst|unins)\n _opam_add_f opam list --safe -i -s\n if [ $COMP_CWORD -gt 2 ]; then\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n upgrade|upg)\n _opam_add_f opam list --safe -i -s\n _opam_add_f _opam_flags \"$cmd\"\n ;;\n switch|sw)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\"\n _opam_add_f opam switch list --safe -s;;\n 3)\n case \"$subcmd\" in\n create|install)\n _opam_add_f opam switch list-available --safe -s -a;;\n set|remove|reinstall)\n _opam_add_f opam switch list --safe -s;;\n import|export)\n compgen_opt+=(-o filenames -f);;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n config|conf|c)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n var) _opam_add_f _opam_vars;;\n exec) compgen_opt+=(-c);;\n *) _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n repository|remote|repos|repo)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n list)\n _opam_add_f _opam_flags \"$cmd\";;\n *)\n _opam_add_f opam repository list --safe -a -s\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n case \"$subcmd\" in\n set-url|add) compgen_opt+=(-o filenames -f);;\n set-repos) _opam_add_f opam repository list --safe -a -s;;\n esac;;\n esac;;\n update|upd)\n _opam_add_f opam repository list --safe -s\n _opam_add_f opam pin list --safe -s\n _opam_add_f _opam_flags \"$cmd\"\n ;;\n source|so)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f opam list --safe -A -s\n else\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n pin)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n add)\n compgen_opt+=(-o filenames -d)\n _opam_add_f opam list --safe -A -s;;\n remove|edit)\n _opam_add_f opam pin list --safe -s;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n case \"$subcmd\" in\n add)\n compgen_opt+=(-o filenames -d);;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac\n esac;;\n unpin)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f opam pin list --safe -s\n else\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n var|v)\n if [ $COMP_CWORD -eq 2 ]; then _opam_add_f _opam_vars\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n exec|e)\n if [ $COMP_CWORD -eq 2 ]; then compgen_opt+=(-c)\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n lint|build)\n if [ $COMP_CWORD -eq 2 ]; then\n compgen_opt+=(-f -X '!*opam' -o plusdirs)\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n admin)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f _opam_commands \"$cmd\"\n else _opam_add_f _opam_flags \"$cmd\" \"$subcmd\"; fi;;\n *)\n _opam_add_f _opam_commands \"$cmd\"\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n esac\n\n COMPREPLY=($(compgen -W \"${_opam_reply[*]}\" \"${compgen_opt[@]}\" -- \"$cur\"))\n unset _opam_reply\n return 0\n}\n\ncomplete -F _opam opam\n"
let complete_zsh =
"#compdef opam\n\nif [ -z \"$ZSH_VERSION\" ]; then return 0; fi\n\n_opam_add()\n{\n IFS=$'\\n' _opam_reply+=(\"$@\")\n}\n\n_opam_add_f()\n{\n local cmd\n cmd=$1; shift\n _opam_add \"$($cmd \"$@\" 2>/dev/null)\"\n}\n\n_opam_flags()\n{\n opam \"$@\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e 's%, \\\\fB%\\n\\\\fB%g' \\\n -e '/^\\\\fB-/p' | \\\n sed -e 's%^\\\\fB\\(-[^\\\\]*\\).*%\\1%'\n}\n\n_opam_commands()\n{\n opam \"$@\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e '/^\\.SH COMMANDS$/,/^\\.SH/ s%^\\\\fB\\([^,= ]*\\)\\\\fR.*%\\1%p'\n echo '--help'\n}\n\n_opam_vars()\n{\n opam var -safe 2>/dev/null | \\\n sed -n \\\n -e '/^PKG:/d' \\\n -e 's%^\\([^#= ][^ ]*\\).*%\\1%p'\n}\n\n_opam_argtype()\n{\n local cmd flag\n cmd=\"$1\"; shift\n flag=\"$1\"; shift\n case \"$flag\" in\n -*)\n opam \"$cmd\" --help=groff 2>/dev/null | \\\n sed -n \\\n -e 's%\\\\-\\|\\\\N'\"'45'\"'%-%g' \\\n -e 's%.*\\\\fB'\"$flag\"'\\\\fR[= ]\\\\fI\\([^, ]*\\)\\\\fR.*%\\1%p'\n ;;\n esac\n}\n\n_opam()\n{\n local IFS cmd subcmd cur prev compgen_opt\n\n COMPREPLY=()\n cmd=${COMP_WORDS[1]}\n subcmd=${COMP_WORDS[2]}\n cur=${COMP_WORDS[COMP_CWORD]}\n prev=${COMP_WORDS[COMP_CWORD-1]}\n compgen_opt=()\n _opam_reply=()\n\n if [ $COMP_CWORD -eq 1 ]; then\n _opam_add_f opam help topics\n COMPREPLY=( $(compgen -W \"${_opam_reply[*]}\" -- $cur) )\n unset _opam_reply\n return 0\n fi\n\n case \"$(_opam_argtype $cmd $prev)\" in\n LEVEL|JOBS|RANK) _opam_add 1 2 3 4 5 6 7 8 9;;\n FILE|FILENAME) compgen_opt+=(-o filenames -f);;\n DIR|ROOT) compgen_opt+=(-o filenames -d);;\n MAKE|CMD) compgen_opt+=(-c);;\n KIND) _opam_add http local git darcs hg;;\n WHEN) _opam_add always never auto;;\n SWITCH|SWITCHES) _opam_add_f opam switch list --safe -s;;\n COLUMNS|FIELDS)\n _opam_add name version package synopsis synopsis-or-target \\\n description installed-version pin source-hash \\\n opam-file all-installed-versions available-versions \\\n all-versions repository installed-files vc-ref depexts;;\n PACKAGE|PACKAGES|PKG|PATTERN|PATTERNS)\n _opam_add_f opam list --safe -A -s;;\n FLAG) _opam_add light-uninstall verbose plugin compiler conf;;\n REPOS) _opam_add_f opam repository list --safe -s -a;;\n SHELL) _opam_add bash sh csh zsh fish;;\n TAGS) ;;\n CRITERIA) ;;\n STRING) ;;\n URL)\n compgen_opt+=(-o filenames -d)\n _opam_add \"https://\" \"http://\" \"file://\" \\\n \"git://\" \"git+file://\" \"git+ssh://\" \"git+https://\" \\\n \"hg+file://\" \"hg+ssh://\" \"hg+https://\" \\\n \"darcs+file://\" \"darcs+ssh://\" \"darcs+https://\";;\n \"\")\n case \"$cmd\" in\n install|show|info|inst|ins|in|i|inf|sh)\n _opam_add_f opam list --safe -a -s\n if [ $COMP_CWORD -gt 2 ]; then\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n reinstall|remove|uninstall|reinst|remov|uninst|unins)\n _opam_add_f opam list --safe -i -s\n if [ $COMP_CWORD -gt 2 ]; then\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n upgrade|upg)\n _opam_add_f opam list --safe -i -s\n _opam_add_f _opam_flags \"$cmd\"\n ;;\n switch|sw)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\"\n _opam_add_f opam switch list --safe -s;;\n 3)\n case \"$subcmd\" in\n create|install)\n _opam_add_f opam switch list-available --safe -s -a;;\n set|remove|reinstall)\n _opam_add_f opam switch list --safe -s;;\n import|export)\n compgen_opt+=(-o filenames -f);;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n config|conf|c)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n var) _opam_add_f _opam_vars;;\n exec) compgen_opt+=(-c);;\n *) _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n repository|remote|repos|repo)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n list)\n _opam_add_f _opam_flags \"$cmd\";;\n *)\n _opam_add_f opam repository list --safe -a -s\n esac;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n case \"$subcmd\" in\n set-url|add) compgen_opt+=(-o filenames -f);;\n set-repos) _opam_add_f opam repository list --safe -a -s;;\n esac;;\n esac;;\n update|upd)\n _opam_add_f opam repository list --safe -s\n _opam_add_f opam pin list --safe -s\n _opam_add_f _opam_flags \"$cmd\"\n ;;\n source|so)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f opam list --safe -A -s\n else\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n pin)\n case $COMP_CWORD in\n 2)\n _opam_add_f _opam_commands \"$cmd\";;\n 3)\n case \"$subcmd\" in\n add)\n compgen_opt+=(-o filenames -d)\n _opam_add_f opam list --safe -A -s;;\n remove|edit)\n _opam_add_f opam pin list --safe -s;;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n *)\n case \"$subcmd\" in\n add)\n compgen_opt+=(-o filenames -d);;\n *)\n _opam_add_f _opam_flags \"$cmd\"\n esac\n esac;;\n unpin)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f opam pin list --safe -s\n else\n _opam_add_f _opam_flags \"$cmd\"\n fi;;\n var|v)\n if [ $COMP_CWORD -eq 2 ]; then _opam_add_f _opam_vars\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n exec|e)\n if [ $COMP_CWORD -eq 2 ]; then compgen_opt+=(-c)\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n lint|build)\n if [ $COMP_CWORD -eq 2 ]; then\n compgen_opt+=(-f -X '!*opam' -o plusdirs)\n else _opam_add_f _opam_flags \"$cmd\"; fi;;\n admin)\n if [ $COMP_CWORD -eq 2 ]; then\n _opam_add_f _opam_commands \"$cmd\"\n else _opam_add_f _opam_flags \"$cmd\" \"$subcmd\"; fi;;\n *)\n _opam_add_f _opam_commands \"$cmd\"\n _opam_add_f _opam_flags \"$cmd\"\n esac;;\n esac\n\n COMPREPLY=($(compgen -W \"${_opam_reply[*]}\" \"${compgen_opt[@]}\" -- \"$cur\"))\n unset _opam_reply\n return 0\n}\n\nautoload bashcompinit\nbashcompinit\ncomplete -F _opam opam\n"
let env_hook_csh =
"alias precmd 'eval `opam env --shell=csh --readonly`'\n"
let env_hook_fish =
"function __opam_env_export_eval --on-event fish_prompt\n eval (opam env --shell=fish --readonly 2> /dev/null)\nend\n"
let env_hook =
"_opam_env_hook() {\n local previous_exit_status=$?;\n eval $(opam env --shell=bash --readonly 2> /dev/null <&- );\n return $previous_exit_status;\n};\nif ! [[ \"$PROMPT_COMMAND\" =~ _opam_env_hook ]]; then\n PROMPT_COMMAND=\"_opam_env_hook;$PROMPT_COMMAND\";\nfi\n"
let env_hook_zsh =
"_opam_env_hook() {\n eval $(opam env --shell=zsh --readonly 2> /dev/null <&-);\n}\ntypeset -ag precmd_functions;\nif [[ -z ${precmd_functions[(r)_opam_env_hook]} ]]; then\n precmd_functions+=_opam_env_hook;\nfi\n"
let prompt =
"# This script allows you to see the active opam switch in your prompt. It\n# should be portable across all shells in common use.\n#\n# To enable, change your PS1 to call _opam_ps1 using command substitution. For\n# example, in bash:\n#\n# PS1=\"$(__opam_ps1 \"(%s)\")\\u@\\h:\\w\\$ \"\n#\n\n__opam_ps1()\n{\n local exit=$?\n local printf_format='(%s)'\n\n case \"$#\" in\n 0|1) printf_format=\"${1:-$printf_format}\"\n ;;\n *) return $exit\n ;;\n esac\n\n local switch_name=\"$(opam switch show --safe 2>/dev/null)\"\n if [ -z \"$switch_name\" ]; then\n return $exit\n fi\n printf -- \"$printf_format\" \"$switch_name\"\n return $exit\n}\n"
let sandbox_exec =
"#!/bin/bash\n# This script is only used on macOS, where /bin/bash is both guaranteed to exist\n# and to be for the native architecture, which is why /usr/bin/env bash is not used.\n# See https://github.com/ocaml/opam/issues/5450\nset -ue\n\nPOL='(version 1)(allow default)(deny network*)(deny file-write*)'\nPOL=\"$POL\"'(allow network* (remote unix))'\nPOL=\"$POL\"'(allow file-write* (literal \"/dev/null\") (literal \"/dev/dtracehelper\"))'\nPOL=\"$POL\"'(allow file-write* (regex #\"^(/private)?(/var)?/tmp/\"))'\n\nadd_mounts() {\n if [ -d \"$2\" ]; then\n local DIR=\"$(cd \"$2\" && pwd -P)\"\n case \"$1\" in\n ro) POL=\"$POL\"'(deny file-write* (subpath \"'\"$DIR\"'\"))';;\n rw) POL=\"$POL\"'(allow file-write* (subpath \"'\"$DIR\"'\"))';;\n esac\n fi\n}\n\nif [ -z ${TMPDIR+x} ]; then\n # Other applications obtain the per-user temporary\n # directory differently; the latter should be made readable/writable\n # too and getconf seems to be a robust way to get it\n if command -v getconf > /dev/null ; then\n TMPDIR=$(getconf DARWIN_USER_TEMP_DIR)\n add_mounts rw \"$TMPDIR\"\n export TMPDIR\n fi\nelse\n add_mounts rw \"$TMPDIR\"\nfi\n\n# C compilers using `ccache` will write to a shared cache directory\n# that remain writeable. ccache seems widespread in some Fedora systems.\nadd_ccache_mount() {\n if command -v ccache > /dev/null; then\n ccache_dir_regex='cache_dir = (.*)$'\n local IFS=$'\\n'\n for f in $(ccache -p 2>/dev/null); do\n if [[ $f =~ $ccache_dir_regex ]]; then\n ccache_dir=${BASH_REMATCH[1]}\n break\n fi\n done\n CCACHE_DIR=${CCACHE_DIR-$HOME/.ccache}\n ccache_dir=${ccache_dir-$CCACHE_DIR}\n add_mounts rw \"$ccache_dir\"\n fi\n}\n\nadd_dune_cache_mount() {\n local dune_cache=${DUNE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/dune}\n mkdir -p \"${dune_cache}\"\n add_mounts rw \"$dune_cache\"\n}\n\n# In case OPAMROOT happens to be in one of the writeable directories we\n# need to make sure it is read-only\nif [ -n \"${OPAMROOT:-}\" ]; then\n add_mounts ro \"$OPAMROOT\"\nfi\n\n# When using opam variable that must be defined at action time, add them also\n# at init check in OpamAuxCommands.check_and_revert_sandboxing (like\n# OPAM_SWITCH_PREFIX).\n# This case-switch should remain identical between the different sandbox implems\nCOMMAND=\"$1\"; shift\ncase \"$COMMAND\" in\n build)\n add_mounts ro \"$OPAM_SWITCH_PREFIX\"\n add_mounts rw \"$PWD\"\n add_ccache_mount\n add_dune_cache_mount\n ;;\n install)\n add_mounts rw \"$OPAM_SWITCH_PREFIX\"\n add_mounts ro \"$OPAM_SWITCH_PREFIX/.opam-switch\"\n add_mounts rw \"$PWD\"\n ;;\n remove)\n add_mounts rw \"$OPAM_SWITCH_PREFIX\"\n add_mounts ro \"$OPAM_SWITCH_PREFIX/.opam-switch\"\n if [ \"X${PWD#$OPAM_SWITCH_PREFIX/.opam-switch/}\" != \"X${PWD}\" ]; then\n add_mounts rw \"$PWD\"\n fi\n ;;\n *)\n echo \"$0: unknown command $COMMAND, must be one of 'build', 'install' or 'remove'\" >&2\n exit 2\nesac\n\nif ! command -v \"$1\" >/dev/null; then\n echo \"[ERROR] Command not found: $1\" >&2\n exit 10\nfi\n\nexec sandbox-exec -p \"$POL\" \"$@\"\n"