#!/bin/bash # Log output: # # * 51c333e (12 days) add vim-eunuch # # The time massaging regexes start with ^[^<]* because that ensures that they # only operate before the first "<". That "<" will be the beginning of the # author name, ensuring that we don't destroy anything in the commit message # that looks like time. # # The log format uses } characters between each field, and `column` is later # used to split on them. A } in the commit subject or any other field will # break this. HASH="%C(yellow)%h%Creset" RELATIVE_TIME="%Cgreen(%ar)%Creset" AUTHOR="%C(bold blue)<%an>%Creset" REFS="%C(red)%d%Creset" SUBJECT="%s" DEFAULT_REMOTE="upstream" ROOT_BRANCH="master" FORMAT="$HASH}$RELATIVE_TIME}$AUTHOR}$REFS $SUBJECT" show_git_head() { pretty_git_log -1 git show -p --pretty="tformat:" } pretty_git_log() { git log --graph --pretty="tformat:${FORMAT}" $* | # Replace (2 years ago) with (2 years) #sed -Ee 's/(^[^<]*) ago)/\1)/' | sed -e 's/ ago//' | # Replace (2 years, 5 months) with (2 years) #sed -Ee 's/(^[^<]*), [[:digit:]]+ .*months?)/\1)/' | sed -e 's/(^[^<]*), [[:digit:]]+ .*months?)/)/' | # Line columns up based on } delimiter column -s '}' -t | # Page only if we need to less -FXRS } sync_to_remote() { REMOTE=$1 : ${REMOTE:=$DEFAULT_REMOTE} BRANCH=`git rev-parse --abbrev-ref HEAD` echo "Synching with ${REMOTE}" git fetch ${REMOTE} && git rebase ${REMOTE}/${BRANCH}; } update_branch() { BRANCH=$1 : ${BRANCH:=$ROOT_BRANCH} REMOTE=$2 : ${REMOTE:=$DEFAULT_REMOTE} echo Updating ${BRANCH} from ${REMOTE} # check stash stack before and after old_stash=$(git rev-parse -q --verify refs/stash) git stash new_stash=$(git rev-parse -q --verify refs/stash) # checkout branch and sync to remote, then come back git checkout ${BRANCH} && git sync ${REMOTE} && git checkout - # if the stash added to the stack, pop it back off [ "$old_stash" != "$new_stash" ] && git stash pop } get_pr() { REMOTE=$2 : ${REMOTE:="upstream"} git fetch ${REMOTE} pull/${1}/head:pr/${1} git checkout pr/${1} } del_pr() { BRANCH=`git rev-parse --abbrev-ref HEAD` if [[ ! ${BRANCH} =~ ^pr\/ ]]; then echo "Not a PR branch, aborting!" exit 1 fi git checkout - && git branch -D ${BRANCH} } clean_branches() { BRANCHES=`git branch | grep -v 'master\|develop\|\*'` for i in ${BRANCHES}; do git branch -d $i done } backport_pr() { PR=$1 BRANCH=$2 [ -z "$BRANCH" ] && BRANCH=`git rev-parse --abbrev-ref HEAD` REMOTE=$3 : ${REMOTE:=$DEFAULT_REMOTE} THISBRANCH=`git rev-parse --abbrev-ref HEAD` if [ -z "$PR" ]; then echo "Please specify a PR to backport" exit 1 fi echo Backporting ${PR} to ${BRANCH} from ${REMOTE} git fetch ${REMOTE} pull/${1}/head:pr/${1} git checkout ${BRANCH} && curl -s "https://github.com/elastic/kibana/pull/${PR}.patch" | git am [ "$THISBRANCH" != "$BRANCH" ] && git checkout - }