#!/bin/bash # Log output: # # * 51c333e (12 days) add vim-eunuch # # The time massaging regexes start with ^[^<]* because that ensures that they # only operate before the first "<". That "<" will be the beginning of the # author name, ensuring that we don't destroy anything in the commit message # that looks like time. # # The log format uses } characters between each field, and `column` is later # used to split on them. A } in the commit subject or any other field will # break this. HASH="%C(12)%h%Creset" RELATIVE_TIME="%C(7)(%ar)%Creset" AUTHOR="%C(249)<%an>%Creset" REFS="%C(magenta)%d%Creset" SUBJECT="%C(245)%s" FORMAT="$HASH}$RELATIVE_TIME}$AUTHOR}$REFS $SUBJECT" ANSI_BLACK='\033[30m' ANSI_BLACK_BOLD='\033[0;30;1m' ANSI_RED='\033[31m' ANSI_RED_BOLD='\033[0;31;1m' ANSI_GREEN='\033[32m' ANSI_GREEN_BOLD='\033[0;32;1m' ANSI_YELLOW='\033[33m' ANSI_YELLOW_BOLD='\033[0;33;1m' ANSI_BLUE='\033[34m' ANSI_BLUE_BOLD='\033[0;34;1m' ANSI_MAGENTA='\033[35m' ANSI_MAGENTA_BOLD='\033[0;35;1m' ANSI_CYAN='\033[36m' ANSI_CYAN_BOLD='\033[0;36;1m' ANSI_WHITE='\033[37m' ANSI_WHITE_BOLD='\033[0;37;1m' ANSI_RESET='\033[0m' BLUE_GRAY='\033[0;38;5;12m' BR_YELLOW='\033[0;38;5;3m' show_git_head() { pretty_git_log -1 git show -p --pretty="tformat:" } pretty_git_log() { git log --graph --pretty="tformat:${FORMAT}" $* | # Replace (2 years ago) with (2 years) sed -Ee 's/(^[^<]*) ago\)/\1)/' | # Replace (2 years, 5 months) with (2 years) sed -Ee 's/(^[^<]*), [[:digit:]]+ .*months?\)/\1)/' | # Line columns up based on } delimiter column -s '}' -t | # Color merge commits specially sed -Ee "s/(Merge (branch|remote-tracking branch|pull request) .*$)/$(printf $BR_YELLOW)\1$(printf $ANSI_RESET)/" | # Page only if we're asked to. if [ -n "$GIT_NO_PAGER" ]; then cat else # Page only if needed. less --quit-if-one-screen --no-init --RAW-CONTROL-CHARS --chop-long-lines fi }