You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
6.0 KiB
170 lines
6.0 KiB
#!/bin/bash
|
|
. ~/.bash_aliases-common
|
|
|
|
if [[ -f ~/.bash_tools ]]; then
|
|
. ~/.bash_tools
|
|
fi
|
|
|
|
auto_tmux
|
|
|
|
function wovn_start() {
|
|
(
|
|
# set -o errexit # Can't do this inside a function
|
|
set -o nounset
|
|
set -o pipefail
|
|
branch=${1:?}
|
|
branch=${branch#feature/}
|
|
tmux -2 new-window -t "Main Screen" -n "$branch" -c ~/equalizer -e BRANCH_NAME="$branch" 'bash -ic "_start_branch \"\$BRANCH_NAME\"; exec bash"'
|
|
)
|
|
}
|
|
|
|
function _start_branch() {
|
|
branch=${1:?}
|
|
branch=${branch#feature/}
|
|
(
|
|
# set -o errexit # Can't do this inside a function
|
|
set -o nounset
|
|
set -o pipefail
|
|
if [[ ! -d ~/equalizer/"$branch" ]]; then
|
|
printf "=== Setting up a branch named ${branch}...\n"
|
|
cd ~/equalizer/master || exit "$?"
|
|
wovn_pull
|
|
if git show-ref --verify --quiet "refs/heads/feature/${branch}"; then
|
|
# Local branch exists, but the directory doesn't
|
|
printf "=== Checking out the local branch named feature/${branch} in a new working tree at ~/equalizer/${branch}...\n"
|
|
elif git show-ref --verify --quiet "refs/remotes/origin/feature/${branch}"; then
|
|
# Remote branch exists, but no local branch or directory
|
|
printf "=== Checking out the remote branch named feature/${branch} in a new working tree at ~/equalizer/${branch}...\n"
|
|
git branch --track "feature/${branch}" "origin/feature/${branch}" || exit "$?"
|
|
else
|
|
# Neither local nor remote branch exists, so create one.
|
|
printf "=== Creating a local and remote branch pair named feature/${branch} and checking it out in a new working tree at ~/equalizer/${branch}...\n"
|
|
git branch --no-track "feature/${branch}" "origin/develop_front" || exit "$?"
|
|
git push --set-upstream origin "feature/${branch}"
|
|
fi
|
|
git worktree add ../"${branch}" "feature/${branch}" || exit "$?"
|
|
cd ~/equalizer/"${branch}" || exit "$?"
|
|
wovn_update || exit "$?"
|
|
printf "\a=== Your branch ${branch} is ready!\n"
|
|
else
|
|
printf "=== Accessing an existing branch named ${branch}...\n"
|
|
cd ~/equalizer/"${branch}" || exit "$?"
|
|
wovn_check_update || printf "=== Some updates are necessary.\n"
|
|
printf "=== Ready to start using branch ${branch}!\n"
|
|
fi
|
|
)
|
|
if [[ -d ~/equalizer/"$branch" ]]; then
|
|
cd ~/equalizer/"${branch}"
|
|
else
|
|
cd ~/equalizer/
|
|
fi
|
|
}
|
|
|
|
function get_current_branch_name() {
|
|
git symbolic-ref --quiet --short HEAD
|
|
}
|
|
|
|
function get_remote_branch_name() {
|
|
git rev-parse --quiet --abbrev-ref --symbolic-full-name '@{u}'
|
|
}
|
|
|
|
function wovn_pull() {
|
|
(
|
|
printf "=== Updating local tracking branches...\n"
|
|
cd ~/equalizer/master || exit "$?"
|
|
git pull || exit "$?"
|
|
cd ~/equalizer/develop || exit "$?"
|
|
git pull || exit "$?"
|
|
cd ~/equalizer/develop_front || exit "$?"
|
|
git pull || exit "$?"
|
|
)
|
|
}
|
|
|
|
function wovn_check_update() {
|
|
(
|
|
printf "=== Retrieving the latest data from the repository...\n"
|
|
cd "$(git rev-parse --show-toplevel)"
|
|
git fetch --all || exit "$?"
|
|
git log --graph --oneline --no-merges --simplify-by-decoration --decorate-refs=refs/{remotes/origin,heads}/{develop{,_front},master,$(get_current_branch_name)} "^$(git merge-base {master,develop{,_front}}^1)" origin/{develop{_front,},master} $(get_current_branch_name) $(get_remote_branch_name)
|
|
{ [[ "$(git rev-parse master)" == "$(git rev-parse origin/master)" ]] \
|
|
&& [[ "$(git rev-parse develop_front)" == "$(git rev-parse origin/develop_front)" ]] \
|
|
&& [[ "$(git rev-parse develop)" == "$(git rev-parse origin/develop)" ]] \
|
|
&& git merge-base --is-ancestor origin/develop_front $(get_current_branch_name); } || exit "$?"
|
|
)
|
|
}
|
|
|
|
function wovn_update() {
|
|
(
|
|
cd "$(git rev-parse --show-toplevel)"
|
|
# set -o errexit # Can't do this inside a function
|
|
set -o nounset
|
|
set -o pipefail
|
|
wovn_check_update || wovn_pull
|
|
printf "=== Updating the branch...\n"
|
|
git rebase develop_front || exit "$?"
|
|
printf "=== Checking dependencies...\n"
|
|
wovn_install
|
|
)
|
|
}
|
|
|
|
function wovn_install() {
|
|
(
|
|
cd "$(git rev-parse --show-toplevel)"
|
|
# set -o errexit # Can't do this inside a function
|
|
set -o nounset
|
|
set -o pipefail
|
|
if ! bundle check >&/dev/null; then
|
|
printf "=== Installing Ruby dependencies...\n"
|
|
bundle install || exit "$?"
|
|
fi
|
|
if ! yarn install --offline --check-files --no-progress --ignore-optional --non-interactive --silent >&/dev/null; then
|
|
printf "=== Installing Javascript dependencies in top level...\n"
|
|
yarn install || exit "$?"
|
|
fi
|
|
cd widget || exit "$?"
|
|
if ! yarn install --offline --check-files --no-progress --ignore-optional --non-interactive --silent >&/dev/null; then
|
|
printf "=== Installing Javascript dependencies in widget...\n"
|
|
yarn install || exit "$?"
|
|
yarn build || exit "$?"
|
|
fi
|
|
cd .. || exit "$?"
|
|
cd front || exit "$?"
|
|
if ! yarn install --offline --check-files --no-progress --ignore-optional --non-interactive --silent >&/dev/null; then
|
|
printf "=== Installing Javascript dependencies in front...\n"
|
|
yarn install
|
|
fi
|
|
)
|
|
}
|
|
|
|
function wovn_delete() {
|
|
(
|
|
# set -o errexit # Can't do this inside a function
|
|
set -o nounset
|
|
set -o pipefail
|
|
branch=${1:+feature/$1}
|
|
branch=${branch:-$(get_current_branch_name)} || exit "$?"
|
|
cd ~/equalizer/master
|
|
worktree="$(git worktree list --porcelain | grep -B2 ${branch} | cut -d' ' -f2 | head -n1)" || exit "$?"
|
|
git worktree remove "$worktree" || exit "$?"
|
|
git branch -d "$branch" || exit "$?"
|
|
); local lastexit="$?"
|
|
if [[ ! -d "$PWD" ]]; then
|
|
cd ~/equalizer
|
|
fi
|
|
return $lastexit
|
|
}
|
|
function _list_feature_branches() {
|
|
git --git-dir ~/equalizer/master/.git for-each-ref --format '%(refname:short)' refs/heads/ \
|
|
| grep -vF $'develop\ndevelop_front\nmaster' \
|
|
| sed 's#^feature/##'
|
|
}
|
|
|
|
function _branch_completions() {
|
|
if [[ $COMP_CWORD -ne 1 ]]; then
|
|
return
|
|
fi
|
|
COMPREPLY+=($(compgen -W "$(_list_feature_branches)" "${COMP_WORDS[1]}"))
|
|
}
|
|
|
|
complete -F _branch_completions wovn_start
|
|
complete -F _branch_completions wovn_delete
|
|
|