#!/usr/bin/env ruby
# Usage: git-push-log
# Show reflog information for all branch heads by date. This is useful on bare
# remotes to determine when / who pushed and when.
require 'time'

# change into git reflog dir to make everything easier
ENV['GIT_DIR'] ||= `git rev-parse --git-dir`.chomp
Dir.chdir(ENV['GIT_DIR'] + '/logs/refs/heads')

# find all reflog files
logs = Dir['**'].select { |f| File.file?(f) }

# build master list of all reflog entries for all refs
records = []
logs.each do |log|
  entries = File.read(log).split("\n")
  entries.each do |line|
    before, after, rest = line.split(' ', 3)
    push_info, message = rest.split("\t", 1)
    if push_info =~ /^(.*?) (<.*>) (\d+) ([0-9+-]+)/
      name, email, timestamp, offset = $1, $2, $3.to_i, $4
      date = Time.at(timestamp)
    end
    records << [log, before, after, name, email, date]
  end
end

# sort and output reflog entries with some formatting
begin
  records = records.sort_by { |r| r.last }.reverse
  records.each do |ref, before, after, name, email, date|
    printf "%-20s %7s:%7s %-30s %s\n",
      date.iso8601, before[0,7], after[0,7], ref, email
  end
rescue Errno::EPIPE
  exit 1
end