#!/usr/bin/env dash # shellcheck source=/dev/null SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH help() { cat <<EOF Automatically remove merged branches (remote and local) USAGE: git-cleanup [OPTIONS] OPTIONS: --remote | -r Act on remote branches --help | -h Display this help and exit. --version | -v Display version and copyright information and exit. EOF } # This should always be the correct answer. get_default_branch() { # source: https://stackoverflow.com/a/50056710 # We assume, that 'origin' is the remote in use git remote show origin | sed -n '/HEAD branch/s|.*: ||p' } cleanup() { default_branch="$(get_default_branch)" merged_branches="$(git branch --merged "$default_branch" --no-contains "$default_branch" --format='%(refname:short)')" # shellcheck disable=2086 # We expect the branches to not contain spaces and want git to deal with them # separately [ "$merged_branches" ] && git branch --delete $merged_branches } cleanup_remote() { default_branch="$(get_default_branch)" merged_branches="$(git branch --remotes --merged "$default_branch" --no-contains "$default_branch" --format='%(refname:short)' | sed 's|origin/||')" # shellcheck disable=2086 # We expect the branches to not contain spaces and want git to deal with them # separately [ "$merged_branches" ] && git push --delete origin $merged_branches } remote=false for arg in "$@"; do case "$arg" in "--help" | "-h") help exit 0 ;; "--version" | "-v") version exit 0 ;; "--remote" | "-r") remote=true ;; esac done if [ "$remote" = "true" ]; then cleanup_remote elif [ "$remote" = "false" ]; then cleanup else die "BUG: 'remote' is not true or false but: '$remote'" fi # vim: ft=sh