summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-04-22 19:35:22 +0200
committerMaxime Coste <frrrwww@gmail.com>2013-04-23 14:03:23 +0200
commitc844f6f5cfec29935099eb32ba284e574ec9723b (patch)
treee6dd48d1fc7e840832d1ddc21e07573e4e123365 /src
parent6df60f5d2ffcaa60e628e54b1df1a37dcf0bb6a2 (diff)
git-tools.kak: use a single git command with subcommands
Diffstat (limited to 'src')
-rw-r--r--src/rc/git-tools.kak113
1 files changed, 70 insertions, 43 deletions
diff --git a/src/rc/git-tools.kak b/src/rc/git-tools.kak
index 973988af..5266931a 100644
--- a/src/rc/git-tools.kak
+++ b/src/rc/git-tools.kak
@@ -1,36 +1,47 @@
-decl line-flag-list git_diff_flags
decl str docsclient
-def git-diff-update-buffer %{ %sh{
- added_lines=""
- removed_lines=""
- git diff -U0 $kak_bufname | {
- line=0
- flags="0|red|."
- while read; do
- if [[ $REPLY =~ ^---.* ]]; then
- continue
- elif [[ $REPLY =~ ^@@.-[0-9]+(,[0-9]+)?.\+([0-9]+)(,[0-9]+)?.@@.* ]]; then
- line=${BASH_REMATCH[2]}
- elif [[ $REPLY =~ ^\+ ]]; then
- flags="$flags;$line|green|+"
- ((line++))
- elif [[ $REPLY =~ ^\- ]]; then
- flags="$flags;$line|red|-"
- fi
- done
- echo "setb git_diff_flags '$flags'"
- }
-}}
+hook global WinSetOption filetype=git-log %{
+ addhl group git-log-highlight
+ addhl -group git-log-highlight regex '^(commit) ([0-9a-f]+)$' 1:yellow 2:red
+ addhl -group git-log-highlight regex '^([a-zA-Z_-]+:) (.*?)$' 1:green 2:magenta
+}
-def git-diff-show %{ addhl flag_lines black git_diff_flags; git-diff-update-buffer }
+hook global WinSetOption filetype=(?!git-log).* %{
+ rmhl git-log-highlight
+}
decl line-flag-list git_blame_flags
+decl line-flag-list git_diff_flags
+
+def -shell-params git %{ %sh{
+ show_git_cmd_output() {
+ local filetype
+ case "$1" in
+ show) filetype=diff ;;
+ log) filetype=git-log ;;
+ esac
+ tmpfile=$(mktemp /tmp/kak-git-XXXXXX)
+ if git "$@" > ${tmpfile}; then
+ [[ -n "$kak_opt_docsclient" ]] && echo "eval -client '$kak_opt_docsclient' %{"
-def git-blame %{
- try %{ addhl flag_lines magenta git_blame_flags } catch %{}
- setb git_blame_flags ''
- %sh{ (
+ echo "edit! -scratch *git*
+ exec |cat<space>${tmpfile}<ret>gk
+ nop %sh{rm ${tmpfile}}
+ setb filetype '${filetype}'"
+
+ [[ -n "$kak_opt_docsclient" ]] && echo "}"
+ else
+ echo "echo %{git $@ failed, see *debug* buffer}"
+ rm ${tmpfile}
+ fi
+ }
+
+ run_git_blame() {
+ (
+ echo "eval -client '$kak_client' %{
+ try %{ addhl flag_lines magenta git_blame_flags } catch %{}
+ setb -buffer '$kak_bufname' git_blame_flags ''
+ }" | socat -u stdin UNIX-CONNECT:${kak_socket}
declare -A authors
declare -A dates
send_flags() {
@@ -40,7 +51,7 @@ def git-blame %{
for (( i=1; $i < $count; i++ )); do
flag="$flag;$(($line+$i))|black|$text"
done
- echo "setb -add -buffer $kak_bufname git_blame_flags %{${flag}}" | socat -u stdin UNIX-CONNECT:${kak_socket}
+ echo "setb -add -buffer '$kak_bufname' git_blame_flags %{${flag}}" | socat -u stdin UNIX-CONNECT:${kak_socket}
}
git blame --incremental $kak_bufname | ( while read blame_line; do
if [[ $blame_line =~ ([0-9a-f]{40}).([0-9]+).([0-9]+).([0-9]+) ]]; then
@@ -54,22 +65,38 @@ def git-blame %{
dates[$sha]="$(date -d @${BASH_REMATCH[1]} +'%F %T')"
fi
done; send_flags )
- ) >& /dev/null < /dev/null & }
-}
+ ) >& /dev/null < /dev/null &
+ }
-def -shell-params git-show %{ %sh{
- tmpfile=$(mktemp /tmp/kak-git-show-XXXXXX)
- if git show "$@" > ${tmpfile}; then
- [[ -n "$kak_opt_docsclient" ]] && echo "eval -client '$kak_opt_docsclient' %{"
+ update_diff() {
+ git diff -U0 $kak_bufname | {
+ local line=0
+ local flags="0|red|."
+ while read; do
+ if [[ $REPLY =~ ^---.* ]]; then
+ continue
+ elif [[ $REPLY =~ ^@@.-[0-9]+(,[0-9]+)?.\+([0-9]+)(,[0-9]+)?.@@.* ]]; then
+ line=${BASH_REMATCH[2]}
+ elif [[ $REPLY =~ ^\+ ]]; then
+ flags="$flags;$line|green|+"
+ ((line++))
+ elif [[ $REPLY =~ ^\- ]]; then
+ flags="$flags;$line|red|-"
+ fi
+ done
+ echo "setb git_diff_flags '$flags'"
+ }
+ }
- echo "edit! -scratch *git-show*
- exec |cat<space>${tmpfile}<ret>gk
- nop %sh{rm ${tmpfile}}
- setb filetype diff"
+ case "$1" in
+ show|log) show_git_cmd_output "$@" ;;
+ blame) run_git_blame ;;
+ show-diff)
+ echo "try %{ addhl flag_lines black git_diff_flags } catch %{}"
+ update_diff
+ ;;
+ update-diff) update_diff ;;
+ *) echo "echo %{unknown git command '$1'}"; exit ;;
+ esac
- [[ -n "$kak_opt_docsclient" ]] && echo "}"
- else
- echo "echo %{git show '$@' failed, see *debug* buffer}"
- rm ${tmpfile}
- fi
}}