mirror of
https://github.com/wfxr/forgit.git
synced 2026-09-10 07:16:23 -04:00
Add function forgit::previous_commit
This commit is contained in:
parent
d343300625
commit
126772f08c
|
|
@ -21,6 +21,15 @@ function forgit::reverse_lines
|
|||
end
|
||||
end
|
||||
|
||||
function forgit::previous_commit
|
||||
# "SHA~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
if test (git rev-parse $argv) = (git rev-list --max-parents=0 HEAD)
|
||||
echo "--root"
|
||||
else
|
||||
echo "$argv~"
|
||||
end
|
||||
end
|
||||
|
||||
# extract the first git sha occuring in the input and strip trailing newline
|
||||
set -g forgit_extract_sha "grep -Eo '[a-f0-9]+' | head -1 | tr -d '[:space:]'"
|
||||
|
||||
|
|
@ -399,11 +408,7 @@ function forgit::fixup -d "git fixup"
|
|||
set target_commit (eval "$cmd" | FZF_DEFAULT_OPTS="$opts" fzf | eval "$forgit_extract_sha")
|
||||
|
||||
if test -n "$target_commit" && git commit --fixup "$target_commit"
|
||||
# "$target_commit~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
set prev_commit "$target_commit~"
|
||||
if test "(git rev-parse '$target_commit')" = "(git rev-list --max-parents=0 HEAD)"
|
||||
set prev_commit "--root"
|
||||
end
|
||||
set prev_commit (forgit::previous_commit $target_commit)
|
||||
|
||||
GIT_SEQUENCE_EDITOR=: git rebase --autostash -i --autosquash "$prev_commit"
|
||||
end
|
||||
|
|
@ -440,11 +445,7 @@ function forgit::rebase -d "git rebase"
|
|||
set target_commit (eval "$cmd" | FZF_DEFAULT_OPTS="$opts" fzf | eval "$forgit_extract_sha")
|
||||
|
||||
if test $target_commit
|
||||
# "$target_commit~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
set prev_commit "$target_commit~"
|
||||
if test "(git rev-parse '$target_commit')" = "(git rev-list --max-parents=0 HEAD)"
|
||||
set prev_commit "--root"
|
||||
end
|
||||
set prev_commit (forgit::previous_commit $target_commit)
|
||||
|
||||
git rebase -i "$prev_commit"
|
||||
end
|
||||
|
|
|
|||
|
|
@ -6,6 +6,15 @@ forgit::inside_work_tree() { git rev-parse --is-inside-work-tree >/dev/null; }
|
|||
# tac is not available on OSX, tail -r is not available on Linux, so we use either of them
|
||||
forgit::reverse_lines() { tac 2> /dev/null || tail -r; }
|
||||
|
||||
forgit::previous_commit() {
|
||||
# "SHA~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
if [[ "$(git rev-parse "$1")" == "$(git rev-list --max-parents=0 HEAD)" ]]; then
|
||||
echo "--root"
|
||||
else
|
||||
echo "$1~"
|
||||
fi
|
||||
}
|
||||
|
||||
# optional render emoji characters (https://github.com/wfxr/emoji-cli)
|
||||
hash emojify &>/dev/null && forgit_emojify='|emojify'
|
||||
|
||||
|
|
@ -192,12 +201,8 @@ forgit::rebase() {
|
|||
"
|
||||
target_commit=$(eval "$cmd" | FZF_DEFAULT_OPTS="$opts" fzf | eval "$forgit_extract_sha")
|
||||
if [[ -n "$target_commit" ]]; then
|
||||
# "$target_commit~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
if [[ "$(git rev-parse "$target_commit")" == "$(git rev-list --max-parents=0 HEAD)" ]]; then
|
||||
prev_commit="--root"
|
||||
else
|
||||
prev_commit="$target_commit~"
|
||||
fi
|
||||
prev_commit=$(forgit::previous_commit $target_commit)
|
||||
|
||||
git rebase -i "$prev_commit"
|
||||
fi
|
||||
}
|
||||
|
|
@ -220,12 +225,7 @@ forgit::fixup() {
|
|||
"
|
||||
target_commit=$(eval "$cmd" | FZF_DEFAULT_OPTS="$opts" fzf | eval "$forgit_extract_sha")
|
||||
if [[ -n "$target_commit" ]] && git commit --fixup "$target_commit"; then
|
||||
# "$target_commit~" is invalid when the commit is the first commit, but we can use "--root" instead
|
||||
if [[ "$(git rev-parse "$target_commit")" == "$(git rev-list --max-parents=0 HEAD)" ]]; then
|
||||
prev_commit="--root"
|
||||
else
|
||||
prev_commit="$target_commit~"
|
||||
fi
|
||||
prev_commit=$(forgit::previous_commit $target_commit)
|
||||
# rebase will fail if there are unstaged changes so --autostash is needed to temporarily stash them
|
||||
# GIT_SEQUENCE_EDITOR=: is needed to skip the editor
|
||||
GIT_SEQUENCE_EDITOR=: git rebase --autostash -i --autosquash "$prev_commit"
|
||||
|
|
|
|||
Loading…
Reference in a new issue