Class: Fog::Rake::ChangelogTask

Inherits:
Rake::TaskLib
  • Object
show all
Defined in:
lib/tasks/changelog_task.rb

Instance Method Summary collapse

Constructor Details

#initializeChangelogTask

Returns a new instance of ChangelogTask.



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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/tasks/changelog_task.rb', line 8

def initialize
  desc "Update the changelog since the last release"
  task(:changelog) do
    timestamp = Time.now.utc.strftime('%m/%d/%Y')
    sha = `git log | head -1`.split(' ').last
    changelog = ["#{Fog::VERSION} #{timestamp} #{sha}"]
    changelog << ('=' * changelog[0].length)
    changelog << ''

    require 'multi_json'
    github_repo_data = Fog::JSON.decode(Excon.get('https://api.github.com/repos/fog/fog').body)
    data = github_repo_data.reject {|key, value| !['forks', 'open_issues', 'watchers'].include?(key)}
    github_collaborator_data = Fog::JSON.decode(Excon.get('https://api.github.com/repos/fog/fog/collaborators').body)
    data['collaborators'] = github_collaborator_data.length
    rubygems_data = Fog::JSON.decode(Excon.get('https://rubygems.org/api/v1/gems/fog.json').body)
    data['downloads'] = rubygems_data['downloads']
    stats = []
    for key in data.keys.sort
      stats << "'#{key}' => #{data[key]}"
    end
    changelog << "Stats! { #{stats.join(', ')} }"
    changelog << ''

    last_sha = `cat changelog.txt | head -1`.split(' ').last
    shortlog = `git shortlog #{last_sha}..HEAD`
    changes = {}
    committers = {}
    for line in shortlog.split("\n")
      if line =~ /^\S/
        committer = line.split(' (', 2).first
        committers[committer] = 0
      elsif line =~ /^\s*((Merge.*)|(Release.*))?$/
        # skip empty lines, Merge and Release commits
      else
        unless line[-1..-1] == '.'
          line << '.'
        end
        line.lstrip!
        line.gsub!(/^\[([^\]]*)\] /, '')
        tag = $1 || 'misc'
        changes[tag] ||= []
        changes[tag] << (line << ' thanks ' << committer)
        committers[committer] += 1
      end
    end

    for committer, commits in committers.to_a.sort {|x,y| y[1] <=> x[1]}
      if [
        'Aaron Suggs',
        'Brian Hartsock',
        'Christopher Oliver',
        'Decklin Foster',
        'Dylan Egan',
        'geemus',
        'Henry Addison',
        'Kevin Menard',
        'Lincoln Stoll',
        'Luqman Amjad',
        'Michael Zeng',
        'Nick Osborn',
        'nightshade427',
        'Patrick Debois',
        'Stepan G. Fedorov',
        'Wesley Beary'
      ].include?(committer)
      next
      end
      changelog << "MVP! #{committer}"
      changelog << ''
      break
    end

    for tag in changes.keys.sort
      changelog << ('[' << tag << ']')
      for commit in changes[tag]
        changelog << ('  ' << commit)
      end
      changelog << ''
    end

    old_changelog = File.read('changelog.txt')
    File.open('changelog.txt', 'w') do |file|
      file.write(changelog.join("\n"))
      file.write("\n\n")
      file.write(old_changelog)
    end
  end
end