aboutsummaryrefslogtreecommitdiff
path: root/mrlog
blob: e279939de0ce4c41457a196b7437267031f84420 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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