README: update summary
[sleepy_penguin.git] / Rakefile
blob3ac61300eabb9f47db86eefebc90751151d1a566
1 # -*- encoding: binary -*-
2 # most tasks are in the GNUmakefile which offers better parallelism
3 def tags
4   timefmt = '%Y-%m-%dT%H:%M:%SZ'
5   @tags ||= `git tag -l`.split(/\n/).map do |tag|
6     if %r{\Av[\d\.]+\z} =~ tag
7       header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
8       header = header.split(/\n/)
9       tagger = header.grep(/\Atagger /).first
10       body ||= "initial"
11       {
12         :time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
13         :tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
14         :tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
15         :id => `git rev-parse refs/tags/#{tag}`.chomp!,
16         :tag => tag,
17         :subject => subject,
18         :body => body,
19       }
20     end
21   end.compact.sort { |a,b| b[:time] <=> a[:time] }
22 end
24 cgit_url = "http://git.bogomips.org/cgit/sleepy_penguin.git"
25 git_url = ENV['GIT_URL'] || 'git://git.bogomips.org/sleepy_penguin.git'
26 web_url = "http://bogomips.org/sleepy_penguin"
28 desc 'prints news as an Atom feed'
29 task :news_atom do
30   require 'nokogiri'
31   new_tags = tags[0,10]
32   puts(Nokogiri::XML::Builder.new do
33     feed :xmlns => "http://www.w3.org/2005/Atom" do
34       id! "#{web_url}NEWS.atom.xml"
35       title "sleepy_penguin news"
36       subtitle "epoll"
37       link! :rel => "alternate", :type => "text/html",
38             :href => "#{web_url}NEWS.html"
39       updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
40       new_tags.each do |tag|
41         entry do
42           title tag[:subject]
43           updated tag[:time]
44           published tag[:time]
45           author {
46             name tag[:tagger_name]
47             email tag[:tagger_email]
48           }
49           url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
50           link! :rel => "alternate", :type => "text/html", :href =>url
51           id! url
52           message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
53           content({:type =>:text}, message_only)
54           content(:type =>:xhtml) { pre tag[:body] }
55         end
56       end
57     end
58   end.to_xml)
59 end
61 desc 'prints RDoc-formatted news'
62 task :news_rdoc do
63   tags.each do |tag|
64     time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
65     puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
66     puts ""
68     body = tag[:body]
69     puts tag[:body].gsub(/^/sm, "  ").gsub(/[ \t]+$/sm, "")
70     puts ""
71   end
72 end
74 desc "print release changelog for Rubyforge"
75 task :release_changes do
76   version = ENV['VERSION'] or abort "VERSION= needed"
77   version = "v#{version}"
78   vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
79   prev = vtags[vtags.index(version) - 1]
80   if prev
81     system('git', 'diff', '--stat', prev, version) or abort $?
82     puts ""
83     system('git', 'log', "#{prev}..#{version}") or abort $?
84   else
85     system('git', 'log', version) or abort $?
86   end
87 end
89 desc "print release notes for Rubyforge"
90 task :release_notes do
91   spec = Gem::Specification.load('sleepy_penguin.gemspec')
92   puts spec.description.strip
93   puts ""
94   puts "* #{spec.homepage}"
95   puts "* #{spec.email}"
96   puts "* #{git_url}"
98   _, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
99   print "\nChanges:\n\n"
100   puts body
103 desc "read news article from STDIN and post to rubyforge"
104 task :publish_news do
105   require 'rubyforge'
106   spec = Gem::Specification.load('sleepy_penguin.gemspec')
107   tmp = Tempfile.new('rf-news')
108   _, subject, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
109   tmp.puts subject
110   tmp.puts
111   tmp.puts spec.description.strip
112   tmp.puts ""
113   tmp.puts "* #{spec.homepage}"
114   tmp.puts "* #{spec.email}"
115   tmp.puts "* #{git_url}"
116   tmp.print "\nChanges:\n\n"
117   tmp.puts body
118   tmp.flush
119   system(ENV["VISUAL"], tmp.path) or abort "#{ENV["VISUAL"]} failed: #$?"
120   msg = File.readlines(tmp.path)
121   subject = msg.shift
122   blank = msg.shift
123   blank == "\n" or abort "no newline after subject!"
124   subject.strip!
125   body = msg.join("").strip!
127   rf = RubyForge.new.configure
128   rf.login
129   rf.post_news('rainbows', subject, body)
132 desc "post to RAA"
133 task :raa_update do
134   require 'net/http'
135   require 'net/netrc'
136   rc = Net::Netrc.locate('sleepy_penguin-raa') or abort "~/.netrc not found"
137   password = rc.password
139   s = Gem::Specification.load('sleepy_penguin.gemspec')
140   desc = [ s.description.strip ]
141   desc << ""
142   desc << "* #{s.email}"
143   desc << "* #{git_url}"
144   desc << "* #{cgit_url}"
145   desc = desc.join("\n")
146   uri = URI.parse('http://raa.ruby-lang.org/regist.rhtml')
147   form = {
148     :name => s.name,
149     :short_description => s.summary,
150     :version => s.version.to_s,
151     :status => 'experimental',
152     :owner => s.authors.first,
153     :email => s.email,
154     :category_major => 'Library',
155     :category_minor => 'System',
156     :url => s.homepage,
157     :download => 'http://rubyforge.org/frs/?group_id=8977',
158     :license => "LGPL",
159     :description_style => 'Plain',
160     :description => desc,
161     :pass => password,
162     :submit => 'Update',
163   }
164   res = Net::HTTP.post_form(uri, form)
165   p res
166   puts res.body