From 18dac8819eeac014c28383604e8f7a400647fcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Thu, 19 Aug 2010 04:38:36 +0200 Subject: [PATCH] First version of the script. --- git-hist.sh | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 git-hist.sh diff --git a/git-hist.sh b/git-hist.sh new file mode 100755 index 0000000..7ce3031 --- /dev/null +++ b/git-hist.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# TODO : +# * use cursor keys +# * show also current (uncommited) version +# * syntax highlighting +# * process through nano (problem : nano's output is limited to one single screen, and puts some termcaps at the begining and end of output.) +# * use vim : http://machine-cycle.blogspot.com/2007/10/syntax-highlighting-pager.html +# * use highlight --ansi --force, or pygmentize -g : http://machine-cycle.blogspot.com/2008/02/syntax-highlighting-pager-reloaded.html +# * use emacs +# * choose from one of the above by guessing from $EDITOR and what's installed on the system. +# * doesn't seem to include pre-rename versions of a file that was renamed. +# * git log --follow --name-only --oneline galerie-index.php +# * git whatchanged --follow galerie-index.php | grep '^\(:\|commit \)' + +file="$1" +if [ -z $file ]; then + echo "Usage : $0 filename" + exit 1 +fi + +statusbar() { + echo -e "\e[47m\e[K[$i / $max] : ${rev[i]}\e[1000G\e[46D\e[1mh\e[47m : help \e[1mp\e[47m,\e[1m-\e[47m : previous \e[1mn\e[47m,\e[1m+\e[47m : next \e[1mq\e[47m : quit \e[m" +} + +page=0 +pager() { + termlines="$(tput lines)" + tail -n +$(($termlines*$page/2)) | head -n $(($termlines-2)) +} + +show() { + clear + statusbar + git show "${rev[i]}:$fullpath" | nl | pager +} + +help() { + clear + statusbar + echo -e "status line : [version i / of total] : sha1" + echo -e "\e[1mh\e[m : help" + echo -e "\e[1mp\e[m,\e[1m-\e[m : previous version" + echo -e "\e[1mn\e[m,\e[1m+\e[m : next version" + echo -e "\e[1mf\e[m : first version" + echo -e "\e[1ml\e[m : last version" + echo -e "\e[1md\e[m : scroll down" + echo -e "\e[1mu\e[m : scroll up" + echo -e "\e[1mt\e[m : scroll to top" + echo -e "\e[1mq\e[m : quit" +} + +fullpath="$(git ls-files --full-name "$file")" +i=0 +for ab in $(git log --oneline "$file" | cut -d ' ' -f 1 | tac); do + rev[i]="$ab" + i=$((i+1)) +done +max="$((i-1))" + +i="$max" +show +while read -n 1 ab; do + case "$ab" in + "") continue ;; + "p"|"+") i=$((i-1)); [ "$i" -lt 0 ] && i=0 ;; + "n"|"-") i=$((i+1)); [ "$i" -gt "$max" ] && i="$max" ;; + "f") i=0 ;; + "l") i="$max" ;; + "d") page=$((page+1)) ;; + "u") page=$((page-1)); [ "$i" -lt 0 ] && i=0 ;; + "t") page=0 ;; + "h") help; continue ;; + "q") break ;; + esac + show +done