bin/scripts/better-git-branch.sh (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
#!/bin/bash # Colors RED='\033[0;31m' GREEN='\033[0;32m' NO_COLOR='\033[0m' BLUE='\033[0;34m' YELLOW='\033[0;33m' NO_COLOR='\033[0m' width1=5 width2=6 width3=30 width4=20 width5=40 # Function to count commits count_commits() { local branch="$1" local base_branch="$2" local ahead_behind ahead_behind=$(git rev-list --left-right --count "$base_branch"..."$branch") echo "$ahead_behind" } # Main script main_branch=$(git rev-parse HEAD) printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" "Ahead" "Behind" "Branch" "Last Commit" " " # Separator line for clarity printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" "-----" "------" "------------------------------" "-------------------" " " format_string="%(objectname:short)@%(refname:short)@%(committerdate:relative)" IFS=$'\n' for branchdata in $(git for-each-ref --sort=-authordate --format="$format_string" refs/heads/ --no-merged); do sha=$(echo "$branchdata" | cut -d '@' -f1) branch=$(echo "$branchdata" | cut -d '@' -f2) time=$(echo "$branchdata" | cut -d '@' -f3) if [ "$branch" != "$main_branch" ]; then # Get branch description description=$(git config branch."$branch".description) # Count commits ahead and behind ahead_behind=$(count_commits "$sha" "$main_branch") ahead=$(echo "$ahead_behind" | cut -f2) behind=$(echo "$ahead_behind" | cut -f1) # Display branch info printf "${GREEN}%-${width1}s ${RED}%-${width2}s ${BLUE}%-${width3}s ${YELLOW}%-${width4}s ${NO_COLOR}%-${width5}s\n" $ahead $behind $branch "$time" "$description" fi done |