From 09976595be77a4d9871caba8fbcb30b6cf0c5be2 Mon Sep 17 00:00:00 2001 From: Adam Sir Date: Wed, 1 Nov 2023 12:37:17 +0100 Subject: [PATCH] feat(plugin): git checkout interactive --- plugins/git-checkout-interactive/README.md | 15 +++++ .../git-checkout-interactive.plugin.zsh | 56 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 plugins/git-checkout-interactive/README.md create mode 100644 plugins/git-checkout-interactive/git-checkout-interactive.plugin.zsh diff --git a/plugins/git-checkout-interactive/README.md b/plugins/git-checkout-interactive/README.md new file mode 100644 index 000000000..845d4c8bf --- /dev/null +++ b/plugins/git-checkout-interactive/README.md @@ -0,0 +1,15 @@ +# lol + +This plugin adds quick switch between your branches. + +To use it, add `git-checkout-interactive` to the plugins array in your `.zshrc` file: + +```zsh +plugins=(... git-checkout-interactive) +``` + +## Usage Examples + +```sh +gci +``` diff --git a/plugins/git-checkout-interactive/git-checkout-interactive.plugin.zsh b/plugins/git-checkout-interactive/git-checkout-interactive.plugin.zsh new file mode 100644 index 000000000..9d99ce71c --- /dev/null +++ b/plugins/git-checkout-interactive/git-checkout-interactive.plugin.zsh @@ -0,0 +1,56 @@ +####################################### +# git checkout interactive # +####################################### + +function git-checkout-interactive() { + # Get all branches sorted by committer date, along with their last commit hash + local branches + branches=$(git for-each-ref --sort=-committerdate --format='%(refname:short) %(objectname:short)' refs/heads/) + + # Parse branches + local branch_list=() + local current_branch + current_branch=$(git rev-parse --abbrev-ref HEAD) + if [[ "$current_branch" == "" ]]; then + return 0 + fi + while read -r branch hash; do + if [[ "$branch" == "$current_branch" ]]; then + echo "On branch $branch \n" + else + branch_list+=("$branch ($hash)") + fi + done <<< "$branches" + + if (( ${#branch_list} == 0 )); then + echo "No other branches available." + return 0 + else + echo "Select a branch to switch to:\n" + fi + + # Display menu + local i=1 + for branch in "${branch_list[@]}"; do + echo "($i) $branch" + ((i++)) + done + echo -n "\nPlease enter your choice: " + + # Handle user input + while :; do + local choice + read -r choice + if (( choice > 0 && choice <= ${#branch_list[@]} )); then + local selected_branch="${branch_list[$((choice))]}" + local target_branch="${selected_branch//->}" + target_branch="${target_branch%% *}" + git checkout "$target_branch" + break + else + break + fi + done +} + +alias gci="git-checkout-interactive || return 0"