aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/%HOME%/.local/bin/git-fixup-old
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2020-01-24 17:14:45 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2020-01-24 17:14:45 +0300
commit347a68546c0d7df97000bc2a80ebd1d5ceb39e40 (patch)
tree92f621dbd04547c0a1fcc8044332393bea6dda1e /%HOME%/.local/bin/git-fixup-old
parent.bashrc_work -> .bashrc_local (diff)
downloadlinux-home-347a68546c0d7df97000bc2a80ebd1d5ceb39e40.tar.gz
linux-home-347a68546c0d7df97000bc2a80ebd1d5ceb39e40.zip
.gitconfig: no more external scripts
Diffstat (limited to '%HOME%/.local/bin/git-fixup-old')
-rw-r--r--%HOME%/.local/bin/git-fixup-old58
1 files changed, 58 insertions, 0 deletions
diff --git a/%HOME%/.local/bin/git-fixup-old b/%HOME%/.local/bin/git-fixup-old
new file mode 100644
index 0000000..3883f10
--- /dev/null
+++ b/%HOME%/.local/bin/git-fixup-old
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+
+# Copyright (c) 2018 Egor Tensin <Egor.Tensin@gmail.com>
+# This file is part of the "Linux/Cygwin environment" project.
+# For details, see https://github.com/egor-tensin/linux-home.
+# Distributed under the MIT License.
+
+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"