aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorEgor Tensin <Egor.Tensin@gmail.com>2018-05-13 22:22:15 +0300
committerEgor Tensin <Egor.Tensin@gmail.com>2018-05-13 22:22:28 +0300
commit358b3a68c11c6f54332674abf62a1c7fcb61d917 (patch)
tree52da8919c30d19bf6c8fe2792bdc6568fa660fe7
parentadd Apport settings (diff)
downloadlinux-home-358b3a68c11c6f54332674abf62a1c7fcb61d917.tar.gz
linux-home-358b3a68c11c6f54332674abf62a1c7fcb61d917.zip
.gitconfig: even smarter alias.fixup
-rw-r--r--%HOME%/.gitconfig43
1 files changed, 34 insertions, 9 deletions
diff --git a/%HOME%/.gitconfig b/%HOME%/.gitconfig
index 8e60aa8..6ad8097 100644
--- a/%HOME%/.gitconfig
+++ b/%HOME%/.gitconfig
@@ -31,32 +31,57 @@
# I heard git might use sh for aliases, so I tried to keep that in
# mind. Didn't want to bother with an external script.
fixup = "! \
-f() { \
- if ! git rev-parse --is-inside-work-tree >/dev/null ; then \
+__git_fixup() { \
+ if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1 ; then \
+ echo 'Not inside a Git repository.' >&2 ; \
return 1 ; \
fi ; \
\
- add=-a ; \
- git diff --cached --quiet --exit-code || add= ; \
+ if ! git rev-parse HEAD >/dev/null 2>&1 ; then \
+ echo \"Where's your HEAD?\" >&2 ; \
+ return 1 ; \
+ fi ; \
+\
+ has_staged_changes= ; \
+ git diff --cached --ignore-submodules --quiet || has_staged_changes=1 ; \
\
- if [ -z \"${add}\" ] ; then \
- echo \"There're unstaged changes, can't rebase.\" >&2 ; \
+ 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 ; \
return 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 ; \
+ echo 'Sure you want to fixup a merge commit?' >&2 ; \
return 1 ; \
fi ; \
\
- git commit $add --fixup=HEAD && GIT_EDITOR=true git rebase -i --autosquash \"$dest_ref\" ; \
+ git commit $add --fixup=HEAD || return $? ; \
+\
+ stash= ; \
+ [ -n \"$has_staged_changes\" ] && [ -n \"$has_unstaged_changes\" ] && stash=1 ; \
+\
+ if [ -n \"$stash\" ]; then \
+ git stash push --quiet || return $? ; \
+ fi ; \
+\
+ GIT_EDITOR=true git rebase -i --autosquash \"$dest_ref\" || return $? ; \
+\
+ if [ -n \"$stash\" ]; then \
+ git stash pop --quiet || return $? ; \
+ fi ; \
} ; \
-f ; \
+__git_fixup ; \
"
[fetch]
prune = true