#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: gc [TYPE] gc -h EOF } help() { cat <<-'EOF' Options: -h, --help show this message TYPE what to do GC on (default: all): - guix - nix - trash - tmpdir - docker - vcs Free disk space system-wide. Examples: Just run it, for all: $ gc Cleanup tmpdir: $ gc tmpdir EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done while getopts 'h' flag; do case "$flag" in h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) disk() { df -h . | awk 'NR == 2 { printf "%s - %s/%s\n", $4, $3, $2 }' } gc_guix() { if [ ! -e /gnu/ ]; then return fi guix home delete-generations 1m guix gc -d 1m if [ -e /var/guix/profiles/system ]; then pass show "$(hostname)"/andreh | head -n1 | sudo -iS guix system delete-generations 1m pass show "$(hostname)"/andreh | head -n1 | sudo -iS guix gc -d 1m fi } gc_nix() { if [ ! -e /nix/ ]; then return fi PROFILES=' /nix/var/nix/profiles/per-user/root/channels /nix/var/nix/profiles/system ' for p in $PROFILES; do pass show "$(hostname)"/andreh | head -n1 | sudo -iS nix-env --delete-generations old -p "$p" done nix-env --delete-generations old nix-store --gc nix-collect-garbage -d } gc_trash() { yes | trash-empty } gc_tmpdir() { find "${TMPDIR:-/tmp}" -atime +10 -exec rm -vf "{}" \; ||: } gc_docker() { if ! command -v docker; then return fi yes | docker system prune -a docker rmi "$(docker images -a -q)" ||: docker rm "$(docker ps -a -f status=exited -q)" ||: docker stop "$(docker ps -a -q)" ||: docker rm "$(docker ps -a -q)" ||: yes | docker volume prune yes | docker container prune } gc_vcs() { repos -e ~/dev/go/ -e ~/dev/quicklisp/ -e ~/dev/archive/ ~/dev/ | xargs -I% -P4 x vcs -C% gc OR true } gc_all() { set -x gc_guix gc_nix gc_trash gc_tmpdir gc_docker gc_vcs set +x } TYPE="${1:-all}" CMD=gc_"$TYPE" if ! command -v "$CMD" >/dev/null; then printf 'Invalid TYPE: "%s".\n\n' "$TYPE" >&2 usage >&2 exit 2 fi BEFORE="$(disk)" "$CMD" AFTER="$(disk)" cat <<-EOF Disk space: before: $BEFORE after: $AFTER EOF