#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby -w
require 'optparse'

PROGRAM_NAME = File.basename(__FILE__)

new_tag = nil

OptionParser.new do |opts|
  opts.banner = "Usage: #{PROGRAM_NAME} [options]"
  opts.on('-t', '--tag=name', 'Tag to use for next release.') { |value| new_tag = value }
  opts.on_tail('-h', '--help', 'Show this message.')          { puts opts; exit         }
end.parse!

abort "#{PROGRAM_NAME}: No release tag specified, use -t/--tag." if new_tag.nil?

did_output = false
ARGF.each do |line|
  if !did_output && line =~ %r{^#.*\b(v\d+(?:\.\d+)*(-\w+(?:\.\w+)*)?)}
    old_tag = $1
    abort "#{PROGRAM_NAME}: Changes already added for release tag ‘#{old_tag}’." if new_tag == old_tag
    changes = %x{git log --pretty=tformat:'* %s *[%an]*' --date=short --reverse #{old_tag}..}
    abort "#{PROGRAM_NAME}: Error calling ‘git log’: #{changes}" unless $? == 0

    changes.gsub!(/\.?( \*\[(?:Allan Odgaard|(.+?))\]\*)$/) do
      $2.nil? ? "." : ".#$1"
    end

    puts "## #{Time.now.strftime('%Y-%m-%d')} (#{new_tag})"
    puts ""
    puts changes
    puts "* See [all changes since #{old_tag}](https://github.com/textmate/textmate/compare/#{old_tag}...#{new_tag})"
    puts ""

    did_output = true
  end

  puts line
end
