--- /dev/null
+#!/bin/bash
+# Copyright (C) 2019 Ian Kelling
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+if [ -z "$BASH_VERSION" ]; then echo "error: shell is not bash" >&2; exit 1; fi
+
+shopt -s inherit_errexit 2>/dev/null ||: # ignore fail in bash < 4.4
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+# alternatively, using https://iankelling.org/git/?p=errhandle;a=tree
+# source /path/errhandle/err
+# on my machine
+source /a/bin/errhandle/err
+
+# install rust.
+if type -t rustc &>/dev/null; then
+ rustup update
+else
+ curl https://sh.rustup.rs -sSf | bash -s -- -y
+fi
+# todo: update this. updates in rust are stupidly complicate
+if ! which rg &>/dev/null; then
+ cargo install ripgrep
+fi
+
+if ! type -t cargo-install-update &>/dev/null; then
+ cargo-install-update
+fi
+
+cargo install-update -a