#!/bin/bash # Function to escape special characters for Mermaid escape_for_mermaid() { echo "$1" | sed 's/[^a-zA-Z0-9]/_/g' } # Output file output_file="branches_diagram.mmd" # Start the Mermaid diagram { echo "%%{init: { 'theme': 'base' } }%%" echo "gitGraph" # Set master as the main branch main_branch="master" # Start with the main branch echo " commit id: \"Initial commit\"" echo " branch $main_branch" echo " checkout $main_branch" # Keep track of declared branches declared_branches=("$main_branch") # Function to check if a branch is declared is_branch_declared() { local branch=$1 for declared_branch in "${declared_branches[@]}"; do if [[ "$declared_branch" == "$branch" ]]; then return 0 fi done return 1 } # Function to find the base branch find_base_branch() { local branch=$1 local base=$(git merge-base --fork-point "$branch" "$main_branch" || echo "$main_branch") if [[ -z "$base" ]]; then echo "$main_branch" else echo "$base" fi } # Function to declare a branch if not already declared declare_branch() { local branch=$1 if ! is_branch_declared "$branch"; then echo " branch $(escape_for_mermaid "$branch")" declared_branches+=("$branch") fi } # Function to recursively process merged branches process_merged_branches() { local branch=$1 local merged_branches=$(git branch --merged "$branch" | grep -v "\* $branch" | grep -v "$main_branch") if [ -n "$merged_branches" ]; then for merged_branch in $merged_branches; do declare_branch "$merged_branch" echo " checkout $(escape_for_mermaid "$branch")" echo " merge $(escape_for_mermaid "$merged_branch")" process_merged_branches "$merged_branch" done fi } # Process each branch for branch in $(git for-each-ref --sort=committerdate --format='%(refname:short)' refs/heads/); do base_branch=$(find_base_branch "$branch") declare_branch "$branch" echo " checkout $(escape_for_mermaid "$branch")" echo " commit id: \"$(git log -1 --pretty=format:%s "$branch")\"" process_merged_branches "$branch" done # Check for branches not yet merged into master not_merged=$(git branch --no-merged "$main_branch") if [ -n "$not_merged" ]; then echo " commit id: \"Branches not yet merged into master:\"" for branch in $not_merged; do echo " commit id: \"$branch\" - merged into: $(git branch --merged "$branch" | grep -v "\* $branch" | grep -v "$main_branch" | tr '\n' ' ')" done fi } > $output_file echo "Mermaid diagram saved to $output_file"