aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/%HOME%/.local/bin
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-x%HOME%/.local/bin/git-fixup53
1 files changed, 53 insertions, 0 deletions
diff --git a/%HOME%/.local/bin/git-fixup b/%HOME%/.local/bin/git-fixup
new file mode 100755
index 0000000..b721ffe
--- /dev/null
+++ b/%HOME%/.local/bin/git-fixup
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+
+set -o errexit -o nounset -o pipefail
+
+if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1 ; then
+ echo 'Not inside a Git repository.' >&2
+ exit 1
+fi
+
+if ! git rev-parse HEAD > /dev/null 2>&1 ; then
+ echo "Where's your HEAD?" >&2
+ exit 1
+fi
+
+has_staged_changes=
+git diff --cached --ignore-submodules --quiet || has_staged_changes=1
+
+has_unstaged_changes=
+git diff --ignore-submodules --quiet || has_unstaged_changes=1
+
+if [ -z "$has_staged_changes" ] && [ -z "$has_unstaged_changes" ]; then
+ echo 'No staged or unstaged changes, seemingly?' >&2
+ exit 1
+fi
+
+add=-a
+[ -n "$has_staged_changes" ] && add=
+
+numof_parents="$( git rev-list --parents -n 1 HEAD | wc --words )"
+if [ "$numof_parents" -eq 1 ]; then
+ dest_ref=--root
+elif [ "$numof_parents" -eq 2 ]; then
+ dest_ref='HEAD^^'
+else
+ echo 'Sure you want to fixup a merge commit?' >&2
+ exit 1
+fi
+
+git commit $add --fixup=HEAD
+
+stash=
+[ -n "$has_staged_changes" ] && [ -n "$has_unstaged_changes" ] && stash=1
+
+unstash() {
+ git stash pop --quiet
+}
+
+if [ -n "$stash" ]; then
+ git stash push --quiet
+ trap unstash EXIT
+fi
+
+GIT_EDITOR=true git rebase -i --autosquash "$dest_ref"