#!/usr/bin/env bash # # checkout files/commit/branches using fzf # # @params # Globals # ${mydir}: current directory of the script, used for imports # ${action_type}: what type of git commands to use, branch, commit files, modified files # ${selected_branch}: selected_branch to switch # ${selected_files}: selected_files to checkout to the version in HEAD # ${selected_commit}: selected commit to checkout # ${confirm}: confirm status of the user # Arguments # -h: show help message # -a: search all files instead of just the modified files # -b: search branch and checkout branch # -c: search commit and checkout commit set -e set -f mydir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source "${mydir}"/../helper/set_variable.sh source "${mydir}"/../helper/get_confirmation.sh source "${mydir}"/../helper/git_query.sh function usage() { echo -e "Usage: dotbare fcheckout [-h] [-a] [-b] [-c] ...\n" echo -e "Checkout files/commit/branch using fzf\n" echo -e "Default: checkout files back to HEAD (Reset changes back to HEAD)\n" echo -e "optional arguments:" echo -e " -h\t\tshow this help message and exit" echo -e " -a\t\tsearch all files and select a commit to checkout for selected files" echo -e " -b\t\tlist all branch and checkout/switch the selected branch" echo -e " -c\t\tlist all commits and checkout selected commit" } action_type="modified" while getopts ":habcy" opt do case "$opt" in a) action_type="allfiles" ;; b) action_type="branch" ;; c) action_type="commit" ;; y) confirm="y" ;; h) usage exit 0 ;; *) echo "Invalid option: ${OPTARG}" >&2 usage exit 1 ;; esac done if [[ "${action_type}" == "branch" ]]; then # checkout branch selected_branch=$(get_branch 'Select a branch to checkout') [[ -z "${selected_branch}" ]] && exit 0 /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" checkout "${selected_branch}" exit 0 elif [[ "${action_type}" == "commit" ]]; then # checkout commit selected_commit=$(get_commit 'Select a commit to checkout') [[ -z "${selected_commit}" ]] && exit 0 /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" checkout "${selected_commit}" exit 0 else # checkout files (reset file changes back to HEAD) if [[ "${action_type}" == "modified" ]]; then selected_files=$(get_modified_file 'select a file to checkout version in HEAD' | tr '\n' ' ') [[ -z "${selected_files}" ]] && exit 0 echo "(dryrun) dotbare checkout -- ${selected_files}" [[ -z "${confirm}" ]] && confirm=$(get_confirmation "Confirm?") [[ "${confirm}" != 'y' ]] && exit 1 # shellcheck disable=SC2086 /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" checkout -- ${selected_files} elif [[ "${action_type}" == "allfiles" ]]; then selected_files=$(get_git_file 'select a file to checkout' | tr '\n' ' ') [[ -z "${selected_files}" ]] && exit 0 # continue select a commit and then checkout the file back to the selected commit selected_commit=$(get_commit 'select the target commit' "${selected_files}") [[ -z "${selected_commit}" ]] && exit 0 echo "(dryrun) dotbare checkout ${selected_commit} -- ${selected_files}" [[ -z "${confirm}" ]] && confirm=$(get_confirmation "Confirm?") [[ "${confirm}" != 'y' ]] && exit 0 # shellcheck disable=SC2086 /usr/bin/git --git-dir="${DOTBARE_DIR}" --work-tree="${DOTBARE_TREE}" checkout "${selected_commit}" ${selected_files} fi fi