#!/usr/bin/env bash # # bash completion for gitr # __gitr_list() { [ -z "${GITR_ROOT}" ] && GITR_ROOT=(~/.gitr) local root_dir dir for root_dir in "${GITR_ROOT[@]}" do [ -e "${root_dir}" ] || mkdir -p "${root_dir}" [ -d "${root_dir}" ] || echo "'${root_dir}' is not directory." >&2 while read -r LINE do rel="${LINE#"${root_dir}"/}" if [ "$1" == "--full-dir" ]; then printf '%s\n' "${root_dir}/${rel}" else printf '%s\n' "${rel}" fi done < <(find "${root_dir}" -mindepth 3 -maxdepth 3) done } __gitr_dir() { [ -z "$1" ] && return local dir while read -r LINE do dir="$(echo "$LINE" | grep "$1")" [ -n "$dir" ] && break done < <(__gitr_list --full-dir) echo "${dir:-$1}" } __gitr_clone() { [ -z "$1" ] && return local dir cloned_dir opts dir=$(dirname "$1") dir="${dir/git@/}" dir="${dir/git:\/\//}" dir="${dir/http:\/\//}" dir="${dir/https:\/\//}" dir="${dir/://}" dir="${GITR_ROOT[0]}/${dir}" opts=("$@") [ -d "${dir}" ] || mkdir -p "${dir}" || echo "[gitr] mkdir error." >&2 cd "${dir}" || echo "[gitr] change directory error." >&2 git clone "${opts[@]:1}" "$1" || echo "[gitr] clone error." >&2 cloned_dir="$(basename "$1")" cd "${cloned_dir%.*}" || echo "[gitr] clone error." >&2 } __gitr() { local cur prev _get_comp_words_by_ref -n : cur prev case "$prev" in gitr) local suggestions mapfile -t suggestions < <(__gitr_list) mapfile -t COMPREPLY < <(compgen -W "$(printf '%s\n' "${suggestions[@]}")" -- "${cur}") ;; *) ;; esac } && complete -F __gitr gitr