raindrops 0.4.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +2 -1
- data/.gitignore +4 -0
- data/.wrongdoc.yml +4 -0
- data/GIT-VERSION-GEN +1 -1
- data/GNUmakefile +2 -196
- data/Gemfile +7 -0
- data/LICENSE +1 -1
- data/README +17 -47
- data/Rakefile +0 -104
- data/examples/linux-listener-stats.rb +123 -0
- data/examples/{config.ru → middleware.ru} +1 -1
- data/examples/watcher.ru +4 -0
- data/examples/watcher_demo.ru +13 -0
- data/examples/zbatery.conf.rb +13 -0
- data/ext/raindrops/extconf.rb +5 -0
- data/ext/raindrops/linux_inet_diag.c +449 -151
- data/ext/raindrops/linux_tcp_info.c +170 -0
- data/ext/raindrops/my_fileno.h +36 -0
- data/ext/raindrops/raindrops.c +232 -20
- data/lib/raindrops.rb +20 -7
- data/lib/raindrops/aggregate.rb +8 -0
- data/lib/raindrops/aggregate/last_data_recv.rb +86 -0
- data/lib/raindrops/aggregate/pmq.rb +239 -0
- data/lib/raindrops/last_data_recv.rb +100 -0
- data/lib/raindrops/linux.rb +26 -16
- data/lib/raindrops/middleware.rb +112 -41
- data/lib/raindrops/middleware/proxy.rb +34 -0
- data/lib/raindrops/struct.rb +15 -0
- data/lib/raindrops/watcher.rb +362 -0
- data/pkg.mk +171 -0
- data/raindrops.gemspec +10 -20
- data/test/ipv6_enabled.rb +10 -0
- data/test/rack_unicorn.rb +12 -0
- data/test/test_aggregate_pmq.rb +65 -0
- data/test/test_inet_diag_socket.rb +13 -0
- data/test/test_last_data_recv_unicorn.rb +69 -0
- data/test/test_linux.rb +55 -57
- data/test/test_linux_all_tcp_listen_stats.rb +66 -0
- data/test/test_linux_all_tcp_listen_stats_leak.rb +43 -0
- data/test/test_linux_ipv6.rb +158 -0
- data/test/test_linux_tcp_info.rb +61 -0
- data/test/test_middleware.rb +15 -2
- data/test/test_middleware_unicorn.rb +37 -0
- data/test/test_middleware_unicorn_ipv6.rb +37 -0
- data/test/test_raindrops.rb +65 -1
- data/test/test_raindrops_gc.rb +23 -1
- data/test/test_watcher.rb +85 -0
- metadata +69 -22
- data/examples/linux-tcp-listener-stats.rb +0 -44
data/.document
CHANGED
data/.gitignore
CHANGED
data/.wrongdoc.yml
ADDED
data/GIT-VERSION-GEN
CHANGED
data/GNUmakefile
CHANGED
@@ -1,199 +1,5 @@
|
|
1
|
-
# use GNU Make to run tests in parallel, and without depending on RubyGems
|
2
1
|
all::
|
3
|
-
|
4
|
-
RAKE = rake
|
5
|
-
RSYNC = rsync
|
6
|
-
GIT_URL = git://git.bogomips.org/raindrops.git
|
7
|
-
|
8
|
-
GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE
|
9
|
-
@./GIT-VERSION-GEN
|
10
|
-
-include GIT-VERSION-FILE
|
11
|
-
-include local.mk
|
12
|
-
ifeq ($(DLEXT),) # "so" for Linux
|
13
|
-
DLEXT := $(shell $(RUBY) -rrbconfig -e 'puts Config::CONFIG["DLEXT"]')
|
14
|
-
endif
|
15
|
-
ifeq ($(RUBY_VERSION),)
|
16
|
-
RUBY_VERSION := $(shell $(RUBY) -e 'puts RUBY_VERSION')
|
17
|
-
endif
|
18
|
-
|
19
|
-
install: $(bins)
|
20
|
-
$(prep_setup_rb)
|
21
|
-
$(RM) -r .install-tmp
|
22
|
-
mkdir .install-tmp
|
23
|
-
cp -p bin/* .install-tmp
|
24
|
-
$(RUBY) setup.rb all
|
25
|
-
$(RM) $^
|
26
|
-
mv .install-tmp/* bin/
|
27
|
-
$(RM) -r .install-tmp
|
28
|
-
$(prep_setup_rb)
|
29
|
-
|
30
|
-
setup_rb_files := .config InstalledFiles
|
31
|
-
prep_setup_rb := @-$(RM) $(setup_rb_files);$(MAKE) -C $(ext) clean
|
32
|
-
|
33
|
-
clean:
|
34
|
-
-$(MAKE) -C ext/raindrops clean
|
35
|
-
$(RM) $(setup_rb_files) ext/raindrops/Makefile
|
36
|
-
|
37
|
-
pkg_extra := GIT-VERSION-FILE NEWS ChangeLog
|
38
|
-
manifest: $(pkg_extra)
|
39
|
-
$(RM) .manifest
|
40
|
-
$(MAKE) .manifest
|
41
|
-
|
42
|
-
.manifest:
|
43
|
-
(git ls-files && \
|
44
|
-
for i in $@ $(pkg_extra) $(man1_paths); \
|
45
|
-
do echo $$i; done) | LC_ALL=C sort > $@+
|
46
|
-
cmp $@+ $@ || mv $@+ $@
|
47
|
-
$(RM) $@+
|
48
|
-
|
49
|
-
NEWS: GIT-VERSION-FILE
|
50
|
-
$(RAKE) -s news_rdoc > $@+
|
51
|
-
mv $@+ $@
|
52
|
-
|
53
|
-
latest: NEWS
|
54
|
-
@awk 'BEGIN{RS="=== ";ORS=""}NR==2{sub(/\n$$/,"");print RS""$$0 }' $<
|
55
|
-
|
56
|
-
SINCE = 0.2.0
|
57
|
-
ChangeLog: LOG_VERSION = \
|
58
|
-
$(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \
|
59
|
-
echo $(GIT_VERSION) || git describe)
|
60
|
-
ifneq ($(SINCE),)
|
61
|
-
ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION)
|
62
|
-
endif
|
63
|
-
ChangeLog: GIT-VERSION-FILE
|
64
|
-
@echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+
|
65
|
-
@echo >> $@+
|
66
|
-
git log $(log_range) | sed -e 's/^/ /' >> $@+
|
67
|
-
mv $@+ $@
|
68
|
-
|
69
|
-
news_atom := http://raindrops.bogomips.org/NEWS.atom.xml
|
70
|
-
cgit_atom := http://git.bogomips.org/cgit/raindrops.git/atom/?h=master
|
71
|
-
atom = <link rel="alternate" title="Atom feed" href="$(1)" \
|
72
|
-
type="application/atom+xml"/>
|
73
|
-
|
74
|
-
# using rdoc 2.5.x
|
75
|
-
doc: .document NEWS ChangeLog
|
76
|
-
for i in $(man1_bins); do > $$i; done
|
77
|
-
rdoc -a -t "$(shell sed -ne '1s/^= //p' README)"
|
78
|
-
install -m644 COPYING doc/COPYING
|
79
|
-
install -m644 $(shell grep '^[A-Z]' .document) doc/
|
80
|
-
cd doc && for i in $(base_bins); do \
|
81
|
-
html=$$(echo $$i | sed 's/\.rb/_rb/')_1.html; \
|
82
|
-
sed -e '/"documentation">/r man1/'$$i'.1.html' \
|
83
|
-
< $$html > tmp && mv tmp $$html; done
|
84
|
-
$(RUBY) -i -p -e \
|
85
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(cgit_atom))})' \
|
86
|
-
doc/ChangeLog.html
|
87
|
-
$(RUBY) -i -p -e \
|
88
|
-
'$$_.gsub!("</title>",%q{\&$(call atom,$(news_atom))})' \
|
89
|
-
doc/NEWS.html doc/README.html
|
90
|
-
$(RAKE) -s news_atom > doc/NEWS.atom.xml
|
91
|
-
cd doc && ln README.html tmp && mv tmp index.html
|
92
|
-
$(RM) $(man1_bins)
|
93
|
-
|
94
|
-
ifneq ($(VERSION),)
|
2
|
+
RSYNC_DEST := bogomips.org:/srv/raindrops
|
95
3
|
rfproject := rainbows
|
96
4
|
rfpackage := raindrops
|
97
|
-
|
98
|
-
pkgtgz := pkg/$(rfpackage)-$(VERSION).tgz
|
99
|
-
release_notes := release_notes-$(VERSION)
|
100
|
-
release_changes := release_changes-$(VERSION)
|
101
|
-
|
102
|
-
release-notes: $(release_notes)
|
103
|
-
release-changes: $(release_changes)
|
104
|
-
$(release_changes):
|
105
|
-
$(RAKE) -s release_changes > $@+
|
106
|
-
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
107
|
-
$(release_notes):
|
108
|
-
GIT_URL=$(GIT_URL) $(RAKE) -s release_notes > $@+
|
109
|
-
$(VISUAL) $@+ && test -s $@+ && mv $@+ $@
|
110
|
-
|
111
|
-
# ensures we're actually on the tagged $(VERSION), only used for release
|
112
|
-
verify:
|
113
|
-
test x"$(shell umask)" = x0022
|
114
|
-
git rev-parse --verify refs/tags/v$(VERSION)^{}
|
115
|
-
git diff-index --quiet HEAD^0
|
116
|
-
test `git rev-parse --verify HEAD^0` = \
|
117
|
-
`git rev-parse --verify refs/tags/v$(VERSION)^{}`
|
118
|
-
|
119
|
-
fix-perms:
|
120
|
-
-git ls-tree -r HEAD | awk '/^100644 / {print $$NF}' | xargs chmod 644
|
121
|
-
-git ls-tree -r HEAD | awk '/^100755 / {print $$NF}' | xargs chmod 755
|
122
|
-
|
123
|
-
gem: $(pkggem)
|
124
|
-
|
125
|
-
install-gem: $(pkggem)
|
126
|
-
gem install $(CURDIR)/$<
|
127
|
-
|
128
|
-
$(pkggem): manifest fix-perms
|
129
|
-
gem build $(rfpackage).gemspec
|
130
|
-
mkdir -p pkg
|
131
|
-
mv $(@F) $@
|
132
|
-
|
133
|
-
$(pkgtgz): distdir = $(basename $@)
|
134
|
-
$(pkgtgz): HEAD = v$(VERSION)
|
135
|
-
$(pkgtgz): manifest fix-perms
|
136
|
-
@test -n "$(distdir)"
|
137
|
-
$(RM) -r $(distdir)
|
138
|
-
mkdir -p $(distdir)
|
139
|
-
tar c `cat .manifest` | (cd $(distdir) && tar x)
|
140
|
-
cd pkg && tar c $(basename $(@F)) | gzip -9 > $(@F)+
|
141
|
-
mv $@+ $@
|
142
|
-
|
143
|
-
package: $(pkgtgz) $(pkggem)
|
144
|
-
|
145
|
-
test-release: verify package $(release_notes) $(release_changes)
|
146
|
-
release: verify package $(release_notes) $(release_changes)
|
147
|
-
# make tgz release on RubyForge
|
148
|
-
rubyforge add_release -f -n $(release_notes) -a $(release_changes) \
|
149
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkgtgz)
|
150
|
-
# push gem to Gemcutter
|
151
|
-
gem push $(pkggem)
|
152
|
-
# in case of gem downloads from RubyForge releases page
|
153
|
-
-rubyforge add_file \
|
154
|
-
$(rfproject) $(rfpackage) $(VERSION) $(pkggem)
|
155
|
-
$(RAKE) publish_news VERSION=$(VERSION)
|
156
|
-
else
|
157
|
-
gem install-gem: GIT-VERSION-FILE
|
158
|
-
$(MAKE) $@ VERSION=$(GIT_VERSION)
|
159
|
-
endif
|
160
|
-
|
161
|
-
ext := ext/raindrops/raindrops_ext.$(DLEXT)
|
162
|
-
ext/raindrops/Makefile: ext/raindrops/extconf.rb
|
163
|
-
cd $(@D) && $(RUBY) extconf.rb
|
164
|
-
$(ext): $(wildcard $(addprefix ext/raindrops/,*.c *.h)) ext/raindrops/Makefile
|
165
|
-
$(MAKE) -C $(@D)
|
166
|
-
|
167
|
-
all:: test
|
168
|
-
|
169
|
-
export STRESS BENCHMARK
|
170
|
-
build: $(ext)
|
171
|
-
test_units := $(wildcard test/test_*.rb)
|
172
|
-
test: test-unit
|
173
|
-
test-unit: $(test_units)
|
174
|
-
$(test_units): build
|
175
|
-
$(RUBY) -I lib:ext/raindrops $@
|
176
|
-
|
177
|
-
# this requires GNU coreutils variants
|
178
|
-
publish_doc:
|
179
|
-
-git set-file-times
|
180
|
-
$(RM) -r doc ChangeLog NEWS
|
181
|
-
$(MAKE) doc LOG_VERSION=$(shell git tag -l | tail -1)
|
182
|
-
$(MAKE) -s latest > doc/LATEST
|
183
|
-
find doc/images doc/js -type f | \
|
184
|
-
TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css
|
185
|
-
tar cf - $$(git ls-files examples/) | (cd doc && tar xf -)
|
186
|
-
$(MAKE) doc_gz
|
187
|
-
chmod 644 $$(find doc -type f)
|
188
|
-
$(RSYNC) -av doc/ raindrops.bogomips.org:/srv/raindrops/
|
189
|
-
git ls-files | xargs touch
|
190
|
-
|
191
|
-
# Create gzip variants of the same timestamp as the original so nginx
|
192
|
-
# "gzip_static on" can serve the gzipped versions directly.
|
193
|
-
doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$')
|
194
|
-
doc_gz:
|
195
|
-
touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)"
|
196
|
-
for i in $(docs); do \
|
197
|
-
gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done
|
198
|
-
|
199
|
-
.PHONY: .FORCE-GIT-VERSION-FILE doc manifest man test $(test_units)
|
5
|
+
include pkg.mk
|
data/Gemfile
ADDED
data/LICENSE
CHANGED
@@ -14,5 +14,5 @@ FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
|
14
14
|
License for more details.
|
15
15
|
|
16
16
|
You should have received a copy of the GNU Lesser General Public License
|
17
|
-
along with the
|
17
|
+
along with the raindrops; if not, write to the Free Software
|
18
18
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
data/README
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
= raindrops - real-time stats for preforking Rack servers
|
2
2
|
|
3
|
-
Raindrops is a real
|
3
|
+
Raindrops is a real-time stats toolkit to show statistics for Rack HTTP
|
4
4
|
servers. It is designed for preforking servers such as Rainbows! and
|
5
5
|
Unicorn, but should support any Rack HTTP server under Ruby 1.9, 1.8 and
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
standalone to create atomic counters shared across any number of forked
|
10
|
-
processes under SMP.
|
6
|
+
Rubinius on platforms supporting POSIX shared memory. It may also be
|
7
|
+
used as a generic scoreboard for sharing atomic counters across multiple
|
8
|
+
processes.
|
11
9
|
|
12
10
|
== Features
|
13
11
|
|
@@ -32,6 +30,12 @@ processes under SMP.
|
|
32
30
|
instead of parsing /proc/net/tcp to minimize overhead.
|
33
31
|
This was fun to discover and write.
|
34
32
|
|
33
|
+
* TCP_Info reporting may be used to check stat for every accepted client
|
34
|
+
on TCP servers
|
35
|
+
|
36
|
+
Users of older Linux kernels need to ensure that the the "inet_diag"
|
37
|
+
and "tcp_diag" kernel modules are loaded as they do not autoload correctly
|
38
|
+
|
35
39
|
== Install
|
36
40
|
|
37
41
|
We recommend GCC 4+ (or compatible) to support the
|
@@ -54,58 +58,24 @@ http://raindrops.bogomips.org/files/
|
|
54
58
|
|
55
59
|
Unpack it, and run "ruby setup.rb"
|
56
60
|
|
57
|
-
== Usage
|
58
|
-
|
59
|
-
If you're using preload_app=false (the default) in your Rainbows!/Unicorn
|
60
|
-
config file, you'll need to create the global Stats object before
|
61
|
-
forking.
|
62
|
-
|
63
|
-
require 'raindrops'
|
64
|
-
$stats ||= Raindrops::Middleware::Stats.new
|
65
|
-
|
66
|
-
In your Rack config.ru:
|
67
|
-
|
68
|
-
use Raindrops::Middleware, :stats => $stats
|
69
|
-
|
70
|
-
== Usage (Rainbows!/Unicorn preload_app=true)
|
71
|
-
|
72
|
-
If you're using preload_app=true in your Rainbows!/Unicorn
|
73
|
-
config file, just add the middleware to your stack:
|
74
|
-
|
75
|
-
In your Rack config.ru:
|
76
|
-
|
77
|
-
use Raindrops::Middleware
|
78
|
-
|
79
|
-
== Usage (Linux-extras)
|
80
|
-
|
81
|
-
To get bound listener statistics under Linux, you need to specify the
|
82
|
-
listener names for your server. You can even include listen sockets for
|
83
|
-
*other* servers on the same machine. This can be handy for monitoring
|
84
|
-
your nginx proxy as well.
|
85
|
-
|
86
|
-
In your Rack config.ru, just pass the :listeners argument as an array of
|
87
|
-
strings (along with any other arguments). You can specify any
|
88
|
-
combination of TCP or Unix domain socket names:
|
89
|
-
|
90
|
-
use Raindrops::Middleware, :listeners => %w(0.0.0.0:80 /tmp/.sock)
|
91
|
-
|
92
|
-
See the tests/ and examples/ directory for more examples.
|
61
|
+
== Usage
|
93
62
|
|
94
|
-
|
95
|
-
|
96
|
-
|
63
|
+
See Raindrops::Middleware and Raindrops::LastDataRecv documentation for
|
64
|
+
use Rack servers. The entire library is fully-documented and we are
|
65
|
+
responsive on the mailing list (mailto:raindrops@librelist.com) if you
|
66
|
+
have any questions or comments.
|
97
67
|
|
98
68
|
== Development
|
99
69
|
|
100
70
|
You can get the latest source via git from the following locations:
|
101
71
|
|
102
|
-
git://
|
72
|
+
git://bogomips.org/raindrops.git
|
103
73
|
git://repo.or.cz/raindrops.git (mirror)
|
104
74
|
|
105
75
|
You may browse the code from the web and download the latest snapshot
|
106
76
|
tarballs here:
|
107
77
|
|
108
|
-
* http://
|
78
|
+
* http://bogomips.org/raindrops.git (cgit)
|
109
79
|
* http://repo.or.cz/w/raindrops.git (gitweb)
|
110
80
|
|
111
81
|
Inline patches (from "git format-patch") to the mailing list are
|
data/Rakefile
CHANGED
@@ -1,107 +1,3 @@
|
|
1
|
-
# -*- encoding: binary -*-
|
2
|
-
|
3
|
-
# most tasks are in the GNUmakefile which offers better parallelism
|
4
|
-
|
5
|
-
def tags
|
6
|
-
timefmt = '%Y-%m-%dT%H:%M:%SZ'
|
7
|
-
@tags ||= `git tag -l`.split(/\n/).map do |tag|
|
8
|
-
if %r{\Av[\d\.]+\z} =~ tag
|
9
|
-
header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3)
|
10
|
-
header = header.split(/\n/)
|
11
|
-
tagger = header.grep(/\Atagger /).first
|
12
|
-
body ||= "initial"
|
13
|
-
{
|
14
|
-
:time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt),
|
15
|
-
:tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip,
|
16
|
-
:tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip,
|
17
|
-
:id => `git rev-parse refs/tags/#{tag}`.chomp!,
|
18
|
-
:tag => tag,
|
19
|
-
:subject => subject,
|
20
|
-
:body => body,
|
21
|
-
}
|
22
|
-
end
|
23
|
-
end.compact.sort { |a,b| b[:time] <=> a[:time] }
|
24
|
-
end
|
25
|
-
|
26
|
-
cgit_url = "http://git.bogomips.org/cgit/raindrops.git"
|
27
|
-
git_url = ENV['GIT_URL'] || 'git://git.bogomips.org/raindrops.git'
|
28
|
-
web_url = "http://raindrops.bogomips.org/"
|
29
|
-
|
30
|
-
desc 'prints news as an Atom feed'
|
31
|
-
task :news_atom do
|
32
|
-
require 'nokogiri'
|
33
|
-
new_tags = tags[0,10]
|
34
|
-
puts(Nokogiri::XML::Builder.new do
|
35
|
-
feed :xmlns => "http://www.w3.org/2005/Atom" do
|
36
|
-
id! "#{web_url}NEWS.atom.xml"
|
37
|
-
title "Raindrops news"
|
38
|
-
subtitle "real-time stats for Rack servers"
|
39
|
-
link! :rel => "alternate", :type => "text/html",
|
40
|
-
:href => "#{web_url}NEWS.html"
|
41
|
-
updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time])
|
42
|
-
new_tags.each do |tag|
|
43
|
-
entry do
|
44
|
-
title tag[:subject]
|
45
|
-
updated tag[:time]
|
46
|
-
published tag[:time]
|
47
|
-
author {
|
48
|
-
name tag[:tagger_name]
|
49
|
-
email tag[:tagger_email]
|
50
|
-
}
|
51
|
-
url = "#{cgit_url}/tag/?id=#{tag[:tag]}"
|
52
|
-
link! :rel => "alternate", :type => "text/html", :href =>url
|
53
|
-
id! url
|
54
|
-
message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip
|
55
|
-
content({:type =>:text}, message_only)
|
56
|
-
content(:type =>:xhtml) { pre tag[:body] }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end.to_xml)
|
61
|
-
end
|
62
|
-
|
63
|
-
desc 'prints RDoc-formatted news'
|
64
|
-
task :news_rdoc do
|
65
|
-
tags.each do |tag|
|
66
|
-
time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC')
|
67
|
-
puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}"
|
68
|
-
puts ""
|
69
|
-
|
70
|
-
body = tag[:body]
|
71
|
-
puts tag[:body].gsub(/^/sm, " ").gsub(/[ \t]+$/sm, "")
|
72
|
-
puts ""
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
desc "print release changelog for Rubyforge"
|
77
|
-
task :release_changes do
|
78
|
-
version = ENV['VERSION'] or abort "VERSION= needed"
|
79
|
-
version = "v#{version}"
|
80
|
-
vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort
|
81
|
-
prev = vtags[vtags.index(version) - 1]
|
82
|
-
if prev
|
83
|
-
system('git', 'diff', '--stat', prev, version) or abort $?
|
84
|
-
puts ""
|
85
|
-
system('git', 'log', "#{prev}..#{version}") or abort $?
|
86
|
-
else
|
87
|
-
system('git', 'log', version) or abort $?
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
desc "print release notes for Rubyforge"
|
92
|
-
task :release_notes do
|
93
|
-
spec = Gem::Specification.load('raindrops.gemspec')
|
94
|
-
puts spec.description.strip
|
95
|
-
puts ""
|
96
|
-
puts "* #{spec.homepage}"
|
97
|
-
puts "* #{spec.email}"
|
98
|
-
puts "* #{git_url}"
|
99
|
-
|
100
|
-
_, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3)
|
101
|
-
print "\nChanges:\n\n"
|
102
|
-
puts body
|
103
|
-
end
|
104
|
-
|
105
1
|
desc "read news article from STDIN and post to rubyforge"
|
106
2
|
task :publish_news do
|
107
3
|
require 'rubyforge'
|