#!/usr/bin/env bash

# This script helps you check which branches are checked out on git and make
# sure all repos linked in the current worktree are on the same branch (either
# by checking it out, or by creating it if it doesn't exist). The branch must
# exist in at least one of the repos. If it doesn't you can force its creation
# with -b.

# Syntax: llvm-branch [-d|-b] [branch]
#   -d: delete chosen branch
#   -b: create branch in all repos
#   branch: checkout or create branch on all repos linked in the current tree
# Without arguments, the script lists all branches and highlights the current one

. llvm-common

safe_run verify_env

function print_branches() {
  # TODO: put a star or something next to branches that exist in other
  # worktrees? (can be found by iterating through LLVM_ROOT)
  local current=$1
  shift
  local space=0
  for each in $*; do
    if [[ $space = 1 ]]; then
      echo -n " "
    fi
    if [[ $each = $current ]]; then
      echo -n "[$each]"
    else
      echo -n $each
    fi
    space=1
  done
}

function switch() {
  SRC=$1
  branch=$2
  in=$3
  if [ -d $SRC ]; then
    cd $SRC
    pwd
    if [[ $in = 'yes' ]]; then
      if [[ $DELETE = '' ]]; then
        echo " + Checking out $branch in $SRC"
        safe_run git checkout $branch
      else
        echo " + Deleting $branch in $SRC"
        safe_run git branch $DELETE $branch
      fi
    else
      if [[ $DELETE = '' ]]; then
        echo " + Creating $branch in $SRC"
        safe_run git checkout -b $branch
      fi
    fi
  fi
}

# Gather info
cd $LLVM_SRC
llvm_branch=`get_branch`
llvm_branches=`get_branches`

CLANG_SRC=$LLVM_SRC/tools/clang
if [ -d $CLANG_SRC ]; then
  cd $CLANG_SRC
  clang_branch=`get_branch`
  clang_branches=`get_branches`
fi

RT_SRC=$LLVM_SRC/projects/compiler-rt
if [ -d $RT_SRC ]; then
  cd $RT_SRC
  rt_branch=`get_branch`
  rt_branches=`get_branches`
fi

CXX_SRC=$LLVM_SRC/projects/libcxx
if [ -d $CXX_SRC ]; then
  cd $CXX_SRC
  cxx_branch=`get_branch`
  cxx_branches=`get_branches`
fi

CXXABI_SRC=$LLVM_SRC/projects/libcxxabi
if [ -d $CXXABI_SRC ]; then
  cd $CXXABI_SRC
  cxxabi_branch=`get_branch`
  cxxabi_branches=`get_branches`
fi

UNW_SRC=$LLVM_SRC/projects/libunwind
if [ -d $UNW_SRC ]; then
  cd $UNW_SRC
  unw_branch=`get_branch`
  unw_branches=`get_branches`
fi

LLD_SRC=$LLVM_SRC/tools/lld
if [ -d $LLD_SRC ]; then
  cd $LLD_SRC
  lld_branch=`get_branch`
  lld_branches=`get_branches`
fi

LLDB_SRC=$LLVM_SRC/tools/lldb
if [ -d $LLDB_SRC ]; then
  cd $LLDB_SRC
  lldb_branch=`get_branch`
  lldb_branches=`get_branches`
fi

# Delete chosen branch
DELETE=''
if [[ $1 = '-d' || $1 = '-D' ]]; then
  DELETE=$1
  shift
fi

# Force creation
CREATE=''
if [[ $1 = '-b' ]]; then
  if [[ $DELETE != '' ]]; then
    echo "Can't create and delete branch at the same time"
    exit 1
  fi

  CREATE=$1
  shift
fi

# No branch chosen, list all
if [[ $1 = '' ]]; then
  echo -n "LLVM branches: "
  print_branches $llvm_branch $llvm_branches
  echo
  if [ -d $CLANG_SRC ]; then
    echo -n "Clang branches: "
    print_branches $clang_branch $clang_branches
    echo
  fi
  if [ -d $RT_SRC ]; then
    echo -n "Compiler-RT branches: "
    print_branches $rt_branch $rt_branches
    echo
  fi
  if [ -d $CXX_SRC ]; then
    echo -n "LibC++ branches: "
    print_branches $cxx_branch $cxx_branches
    echo
  fi
  if [ -d $CXXABI_SRC ]; then
    echo -n "LibC++ABI branches: "
    print_branches $cxxabi_branch $cxxabi_branches
    echo
  fi
  if [ -d $UNW_SRC ]; then
    echo -n "LibUnwind branches: "
    print_branches $unw_branch $unw_branches
    echo
  fi
  if [ -d $LLD_SRC ]; then
    echo -n "LLD branches: "
    print_branches $lld_branch $lld_branches
    echo
  fi
  if [ -d $LLDB_SRC ]; then
    echo -n "LLDB branches: "
    print_branches $lldb_branch $lldb_branches
    echo
  fi
  exit
fi

# Search for branch name
branch=$1

if [[ $DELETE != '' ]]; then
  if [[ $branch = 'master' ]]; then
    echo "Cannot delete the master branch"
    exit 1
  fi
  if [[ $branch = $llvm_branch ]]; then
    echo "Cannot delete $branch - it is checked out in llvm"
    exit 2
  fi
  if [[ $branch = $clang_branch ]]; then
    echo "Cannot delete $branch - it is checked out in clang"
    exit 2
  fi
  if [[ $branch = $rt_branch ]]; then
    echo "Cannot delete $branch - it is checked out in compiler rt"
    exit 2
  fi
  if [[ $branch = $cxx_branch ]]; then
    echo "Cannot delete $branch - it is checked out in libcxx"
    exit 2
  fi
  if [[ $branch = $cxxabi_branch ]]; then
    echo "Cannot delete $branch - it is checked out in libcxxabi"
    exit 2
  fi
  if [[ $branch = $unw_branch ]]; then
    echo "Cannot delete $branch - it is checked out in libunwind"
    exit 2
  fi
  if [[ $branch = $lld_branch ]]; then
    echo "Cannot delete $branch - it is checked out in lld"
    exit 2
  fi
  if [[ $branch = $lldb_branch ]]; then
    echo "Cannot delete $branch - it is checked out in lldb"
    exit 2
  fi
fi

# Check which projects have the branch
in_llvm=`has $branch $llvm_branches`
in_clang=`has $branch $clang_branches`
in_rt=`has $branch $rt_branches`
in_cxx=`has $branch $cxx_branches`
in_cxxabi=`has $branch $cxxabi_branches`
in_unw=`has $branch $unw_branches`
in_lld=`has $branch $lld_branches`
in_lldb=`has $branch $lldb_branches`
if [[ $CREATE = '' ]]; then
  if [[ $in_clang = 'no' && $in_llvm = 'no' && \
        $in_rt = 'no' && $in_cxx = 'no' && $in_cxxabi = 'no' && \
        $in_unw = 'no' && $in_lld = 'no' && $in_lldb = 'no' ]]; then
    echo "Branch $branch doesn't exist on any repository"
    echo "Force its creation with -b"
    exit 1
  fi
fi

# DO IT
switch $LLVM_SRC $branch $in_llvm
switch $CLANG_SRC $branch $in_clang
switch $RT_SRC $branch $in_rt
switch $CXX_SRC $branch $in_cxx
switch $CXXABI_SRC $branch $in_cxxabi
switch $UNW_SRC $branch $in_unw
switch $LLD_SRC $branch $in_lld
switch $LLDB_SRC $branch $in_lldb
