aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/dev-cmd/release-notes.rb
blob: 4960239565de4c5f3f981c8efbd11f38caf90590 (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
#:  * `release-notes` [`--markdown`] [<previous_tag>] [<end_ref>]:
#:    Output the merged pull requests on Homebrew/brew between two Git refs.
#:    If no <previous_tag> is provided it defaults to the newest tag.
#:    If no <end_ref> is provided it defaults to `origin/master`.
#:
#:    If `--markdown` is passed, output as a Markdown list.

module Homebrew
  module_function

  def release_notes
    previous_tag = ARGV.named.first
    previous_tag ||= Utils.popen_read("git tag --list --sort=-version:refname")
                          .lines.first.chomp
    odie "Could not find any previous tags!" unless previous_tag

    end_ref = ARGV.named[1] || "origin/master"

    [previous_tag, end_ref].each do |ref|
      next if quiet_system "git", "rev-parse", "--verify", "--quiet", ref
      odie "Ref #{ref} does not exist!"
    end

    output = Utils.popen_read("git log --pretty=format:'%s >> - %b%n' '#{previous_tag}'..'#{end_ref}'")
                  .lines.grep(/Merge pull request/)

    output.map! do |s|
      s.gsub(%r{.*Merge pull request #(\d+) from ([^/]+)/[^>]*(>>)*},
             "https://github.com/Homebrew/brew/pull/\\1 (@\\2)")
    end
    if ARGV.include?("--markdown")
      output.map! do |s|
        /(.*\d)+ \(@(.+)\) - (.*)/ =~ s
        "- [#{Regexp.last_match(3)}](#{Regexp.last_match(1)}) (@#{Regexp.last_match(2)})"
      end
    end

    puts "Release notes between #{previous_tag} and #{end_ref}:"
    puts output
  end
end