aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Brewer <tomboy64@sina.cn>2016-05-28 00:43:58 +0200
committerMatthew Brewer <tomboy64@sina.cn>2016-05-28 14:01:59 +0200
commit446ee0a58356465f62f6f2c69ce86643fee8cc1f (patch)
tree55ac76bfa07b9cdd66ca14f8eb59ae57891d866a
parentpush my new perl6 ebuilds to the overlay (diff)
downloadtbc-446ee0a58356465f62f6f2c69ce86643fee8cc1f.tar.gz
tbc-446ee0a58356465f62f6f2c69ce86643fee8cc1f.tar.bz2
tbc-446ee0a58356465f62f6f2c69ce86643fee8cc1f.zip
new tool for git-edits step-by-step
-rwxr-xr-xtools/ortrta.sh107
1 files changed, 107 insertions, 0 deletions
diff --git a/tools/ortrta.sh b/tools/ortrta.sh
new file mode 100755
index 0000000..7b1d950
--- /dev/null
+++ b/tools/ortrta.sh
@@ -0,0 +1,107 @@
+#!/bin/bash
+
+# Shell script to perform `git rebase -i <argument>`
+# License: WTFPL2
+
+errorout() {
+ echo "Failed: $1"
+ exit 1
+}
+
+repoman_this() {
+ local ebuilds=( $(git diff --numstat HEAD^ | cut -f3 | grep '\.ebuild') )
+ local dirs=()
+ for i in ${ebuilds[@]}; do
+ local dir=$(dirname ${i})
+ local inIt=0
+ for j in ${dirs[@]}; do
+ if [[ "${j}" == "${dir}" ]]; then
+ inIt=1
+ break;
+ fi
+ done
+ if [[ ${inIt} -eq 0 ]]; then
+ dirs+="${dir}"
+ pushd ${dir}
+ repoman full
+ popd 2>&1 > /dev/null
+ fi
+ done
+ git add *
+ git commit --amend --no-edit
+ echo
+ git rebase --continue 2>&1 | head -n1
+}
+
+choose() {
+ while [[ true ]]; do
+ echo -n "(e)dit, (r)epoman full all ebuilds, (c)ontinue or e(x)it? "
+ read -n1 -r response
+
+ printf '\r'
+ tput el
+ echo
+
+ case ${response} in
+ e )
+ exit 0
+ ;;
+ c )
+ git rebase --continue 2>&1 | head -n1
+ return
+ ;;
+ r )
+ repoman_this
+ return
+ ;;
+ x )
+ echo "Aborting rebase..."
+ git rebase --abort
+ echo "Exiting."
+ exit 0
+ ;;
+ * )
+ echo "Wrong key. Try again."
+ ;;
+ esac
+ done
+}
+
+resume() {
+ count=$(GIT_EDITOR='cat' git rebase --edit-todo | grep -v '^#' | wc -l)
+ while [[ ${count} -ge 0 ]]; do
+ git diff --color --stat HEAD^ | cat
+ echo "left: ${count}"
+ count=$(( count - 1 ))
+ choose
+ done
+ if [[ $(LC_ALL=C git rebase --edit-todo 2>&1 | \
+ grep -v '^#\|No rebase in progress?' | \
+ wc -l) \
+ -eq 0 ]]; then
+ echo "Done."
+ else
+ echo "Something went wrong here, there's still commits to process."
+ fi
+}
+
+commence() {
+ input=$1
+ START=${input:=master}
+ GIT_EDITOR='vim -c "%s/pick/edit/g | wq"' git rebase -i ${START} || errorout "git rebase -i ${START}"
+ resume
+}
+
+STATUS=$(LC_ALL=C git status | head -n1 | grep -c 'interactive rebase in progress')
+
+case ${STATUS} in
+ 1)
+ resume
+ ;;
+ 0)
+ commence $1
+ ;;
+ *)
+ errorout "Invalid status \"${STATUS}\"."
+ ;;
+esac