diff options
Diffstat (limited to 'mrlog')
| -rwxr-xr-x | mrlog | 70 |
1 files changed, 70 insertions, 0 deletions
@@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# Builds a unified list of commit logs from one or more Git repositories, using +# mr(1). +# +# Accepts git-log(1) parameters, like +# +# --since=<date> +# --after=<date> +# +# Examples: +# +# mrlog --since='1 day ago' --date=relative +# watch -n 120 "mrlog --since='1 week ago' --date=relative" +# + +# Parameters +DIRNAME="`dirname $0`" +BASENAME="`basename $0`" +MODE="$1" + +# Wrapper around git-log(1) to run in a single repository +function _git_log_wrapper { + # Repository check + if [ ! -e ".git" ]; then + echo "$BASENAME: not in a Git repository" + exit 1 + fi + + # Get the repository name + local repo="`git rev-parse --show-toplevel`" + local name="`basename $repo`" + + # Old command alternatives + #git log $* --format=format:"%aI REPO %h %s" | sed "s/ REPO / $name /" + #git log $* --format=format:"%aI REPO %h %s" | sed "s/ REPO / $name\t\t /" + #git log $* --format=format:"%aI REPO %<(8) %h %s" | sed "s/ REPO / $name /" + #git log $* --format=format:"%aI REPO %>(20) %h %s" | sed "s/ REPO / $name /" + #git log $* --format=format:"%aI|||REPO|||%h|||%>(100,trunc)%s" | sed "s/REPO/ $name /" + + # Command template + cmd='git log --format=format:%aI|||REPO|||%h|||%s' + + # Run depending on arguments + if [ ! -z "$1" ]; then + $cmd "$*" | sed "s/REPO/ $name /" + else + $cmd | sed "s/REPO/ $name /" + fi +} + +# Build the list of commits from a single or multiple repositories +function _logger { + # Check for config + if [ ! -e ".git" ] && [ ! -e ".mrconfig" ]; then + echo "$BASENAME: not in a Git repository or no .mrconfig available" + exit 1 + fi + + # Build the unified log + mr run $DIRNAME/mrlog --single-and-raw "$*" | grep -v "^mr run:" | sort -r | column -s '|||' -t -o ' ' | less +} + +# Dispatch +if [ "$1" != "--single-and-raw" ]; then + _logger "$*" +else + shift + _git_log_wrapper "$*" +fi |
