root/lang/ruby/shipit/trunk/lib/shipit.rb @ 4073

Revision 4073, 4.5 kB (checked in by cho45, 5 years ago)

lang/ruby/shipit/trunk/lib/shipit.rb:

version のかきかえがうまくいかず、重複してリリースできない問題を修正

Line 
1require "rubygems"
2require "rake"
3require "rake/tasklib"
4
5class Rake::ShipitTask < Rake::TaskLib
6        attr_reader :name
7        attr_reader :steps
8
9        module Step; end
10
11        def initialize(name=:shipit, &block)
12                @name  = name
13                @block = block
14                define
15        end
16
17        def define
18                desc "Shipit: Automated Release"
19                task @name do
20                        puts "Preparing steps... "
21                        steps = []
22
23                        eigenclass = class <<steps; self; end
24                        plugins = self.class.const_get(:Step)
25                        plugins.constants.each do |i|
26                                eigenclass.__send__(:define_method, i) do |*args|
27                                        self << ret = plugins.const_get(i).new(*args)
28                                        ret
29                                end
30                        end
31                        @block.call(steps)
32                        steps.each do |s|
33                                s.prepare if s.respond_to? :prepare
34                        end
35                        puts "done."
36                        puts "Steps: #{steps.map{|i| i.class.name.sub(/.+::/, "")}.join(", ")}"
37                        steps.each do |s|
38                                puts "Running Step: #{s.class.name}"
39                                s.run
40                        end
41                        puts "done."
42                end
43        end
44end
45
46class Rake::ShipitTask::Step::Step
47        def new(&block)
48                @prepare = block
49                self
50        end
51
52        def and(&block)
53                @run = block
54        end
55
56        def prepare
57                @prepare.call
58        end
59
60        def run
61                @run.call
62        end
63end
64
65class Rake::ShipitTask::Step::Twitter
66        def initialize(msg=nil)
67                @msg = msg
68        end
69
70        def prepare
71                require "time"
72                require "rubygems"
73                gem "twitter4r"
74                require "twitter"
75                require "pit"
76                require "pathname"
77
78                @config = Pit.get("twitter.com", :require => {
79                                "login"    => "login name",
80                                "password" => "password"
81                })
82                @client = Twitter::Client.new(@config)
83                raise "Twitter::Client auth failed" unless @client.authenticate?(@config["login"], @config["password"])
84
85                @description = DESCRIPTION
86                @name        = NAME
87                @vers        = VERS
88        end
89
90        def run
91                @msg ||= "Released %s %s (%s)" % [@name, @vers, @description]
92                @client.status(:post, @msg)
93        end
94end
95
96class Rake::ShipitTask::Step::ChangeVersion
97        def initialize(file, name="VERSION", vers=VERS)
98                @file = file
99                @name = name
100                @vers = vers
101        end
102
103        def prepare
104                require "pathname"
105                @file     = Pathname.new(@file)
106                @content  = @file.read
107                @match    = @content.match(/#{@name}\s*=\s*['"](\d+\.\d+\.\d+)['"]/)
108                @new_version = @match[1].succ
109                raise "Can't find version string in #{@file}." if @match.nil?
110                puts "Find version string #{@match[1]} and will change to #{@new_version}"
111                @vers.replace @new_version
112        end
113
114        def run
115                puts "Changing version to #{@new_version}"
116                @file.open("w") do |f|
117                        f.print @content[0..@match.begin(1)-1]
118                        f.print @new_version
119                        f.print @content[@match.end(1)..-1]
120                end
121        end
122end
123
124class Rake::ShipitTask::Step::Commit
125        def initialize(msg=nil)
126                @msg = msg
127        end
128
129        def prepare
130                @vers = VERS
131                st = `svn st`
132                unless st.empty?
133                        puts "Any changes remain?"
134                        puts st
135                        exit
136                end
137        end
138
139        def run
140                system "svn", "ci", "-m", @msg || "Release #{@vers}"
141        end
142end
143
144class Rake::ShipitTask::Step::Task
145        def initialize(*names)
146                @names = names
147                @tasks = []
148        end
149
150        def prepare
151                @names.each do |name|
152                        @tasks << Rake.application[name.to_sym]
153                        raise "Unknown task: #{name}" if @tasks.last.nil?
154                end
155        end
156
157        def run
158                @tasks.each do |t|
159                        t.invoke
160                end
161        end
162end
163
164class Rake::ShipitTask::Step::RubyForge
165        def initialize(group_id=RUBYFORGE_PROJECT)
166                @group_id    = group_id
167                @description = DESCRIPTION
168                @name        = NAME
169                @vers        = VERS
170        end
171
172        def prepare
173                require 'rubyforge'
174
175                @rf = RubyForge.new
176                puts "Logging in"
177                @rf.login
178                @c = @rf.userconfig
179                @c["preformatted"] = true
180                unless @rf.autoconfig["group_ids"].keys.include?(@group_id)
181                        raise "Unknown group: #{@group_id}"
182                end
183                unless @rf.autoconfig["package_ids"].keys.include?(@name)
184                        @rf.create_package(@group_id, @name)
185                end
186        end
187
188        def run
189                pkg = "pkg/#{@name}-#{@vers}"
190                @files = [
191                        "#{pkg}.tgz",
192                        "#{pkg}.gem"
193                ].compact
194                puts "Releasing #{@name} #{@vers}"
195                @rf.add_release @group_id, @name, @vers, *@files
196                @rf.post_news @group_id, "#{@name} #{@vers} released.", "#{@description}"
197        end
198end
199
200class Rake::ShipitTask::Step::Ask
201        def run
202                puts "Really run? Cancel to press Ctrl+C."
203                $stdin.gets
204        end
205end
206
207class Rake::ShipitTask::Step::Tag
208        def initialize(format="release-%s")
209                @format = format
210        end
211
212        def prepare
213                require "uri"
214                ENV["LANG"] = "C"
215                url = `svn info`[/^URL: (.+)/, 1]
216                if url =~ /trunk$/
217                        @url = URI(url) + "."
218                        unless `svn info '#{(@url + "tags")}'`[/Node Kind: directory/]
219                                raise "tag directory is not found"
220                        end
221                else
222                        raise "Run at trunk!"
223                end
224                @vers = VERS
225        end
226
227        def run
228                trunk = @url + "trunk"
229                tag   = @url + ("tags/#{@format}" % @vers)
230                msg   = "Release %s" % @vers
231                command = ["svn", "cp", "-m", msg, trunk, tag].map {|i| i.to_s }
232                system(*command)
233        end
234end
235
Note: See TracBrowser for help on using the browser.