blob: 98a95047db7fc861fbe678d6e7154bf555f274d6 [file] [log] [blame]
#!/usr/bin/env bash
# This script helps you check which branches are checked out on git and make
# sure they're coherent with the feature you're developing. For instance,
# if a feature spans across both LLVM and Clang, you could name the branch on
# each repo the same and use this script to seamlessly move between them.
# Syntax: llvm-branch [-d] [branch]
# -d: delete chosen branch
# branch: find on llvm and clang and check it out
# Without arguments, the script lists all branches and highlight the current one
. llvm-common
function print_branches() {
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 has() {
if [[ $1 = '' || $2 = '' ]]; then
echo no
return
fi
local item=$1
shift
for each in $*; do
if [[ $item = $each ]]; then
echo yes
return
fi
done
echo no
}
function switch() {
SRC=$1
branch=$2
in=$3
if [ -d $SRC ]; then
cd $SRC
pwd
if [[ $in = 'yes' ]]; then
if [[ $DEL = '' ]]; then
safe_run git checkout $branch
else
safe_run git checkout master
safe_run git branch $DEL $branch
fi
else
if [[ $DEL = '' ]]; then
safe_run git checkout master
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
CLANG_EXTRA_SRC=$LLVM_SRC/tools/clang/tools/extra
if [ -d $CLANG_EXTRA_SRC ]; then
cd $CLANG_EXTRA_SRC
clang_extra_branch=`get_branch`
clang_extra_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
DEL=''
if [[ $1 = '-d' || $1 = '-D' ]]; then
DEL=$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 $CLANG_EXTRA_SRC ]; then
echo -n "Clang tools extra branches: "
print_branches $clang_extra_branch $clang_extra_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 [[ $DEL = 1 && $branch = 'master' ]]; then
echo "Cannot delete the master branch"
exit 1
fi
# Check which projects the branch is
in_llvm=`has $branch $llvm_branches`
in_clang=`has $branch $clang_branches`
in_clang_extra=`has $branch $clang_extra_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 [[ $in_clang = 'no' && $in_clang_extra && $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"
exit 1
fi
# DO IT
switch $LLVM_SRC $branch $in_llvm
switch $CLANG_SRC $branch $in_clang
switch $CLANG_EXTRA_SRC $branch $in_clang_extra
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