#!/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= # --after= # # 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