forked from kstephens/cabar
-
Notifications
You must be signed in to change notification settings - Fork 1
/
rake_helper.rb
254 lines (196 loc) · 5.22 KB
/
rake_helper.rb
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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
# For release
"
rake make_manifest
rake update_version
svn status
rake package
rake release VERSION=x.x.x
rake svn_release
rake publish_docs
rake announce
"
#################################################################
require 'rubygems'
require 'hoe'
#################################################################
# Release notes
#
def get_release_notes(relfile = "Releases.txt")
release = nil
notes = [ ]
File.open(relfile) do |f|
while ! f.eof && line = f.readline
if md = /^== Release ([\d\.]+)/i.match(line)
release = md[1]
notes << line
break
end
end
while ! f.eof && line = f.readline
if md = /^== Release ([\d\.]+)/i.match(line)
break
end
notes << line
end
end
[ release, notes.join('') ]
end
#################################################################
PKG_NAME = PKG_Name.gsub(/[a-z][A-Z]/) {|x| "#{x[0,1]}_#{x[1,1]}"}.downcase
PKG_SVN_ROOT="svn+ssh://rubyforge.org/var/svn/#{PKG_NAME}/#{PKG_NAME}"
release, release_notes = get_release_notes
hoe = Hoe.new(PKG_Name.downcase, release) do |p|
p.author = PKG_Author
p.description = PKG_DESCRIPTION
p.email = PKG_Email
p.summary = p.description
p.changes = release_notes
p.url = "http://rubyforge.org/projects/#{PKG_NAME}"
p.remote_rdoc_dir = '.'
p.test_globs = ['test/**/*.rb']
end
PKG_VERSION = hoe.version
task :test => :test_specs
desc "Runs all spec test"
task :test_specs do
spec_files = Dir["test/**/*.spec"].sort
unless spec_files.empty?
ENV['RUBYLIB'] = ($:.dup << 'test/ruby').join(':')
sh "spec -b -f specdoc #{spec_files.join(' ')}"
end
end
#################################################################
# Version file
#
def announce(msg='')
STDERR.puts msg
end
PKG_lib_ruby_dir = "lib" unless defined? PKG_lib_ruby_dir
version_rb = "#{PKG_lib_ruby_dir}/#{PKG_NAME}/#{PKG_NAME}_version.rb"
task :update_version do
announce "Updating #{PKG_Name} version to #{PKG_VERSION}: #{version_rb}"
open(version_rb, "w") do |f|
f.puts "module #{PKG_Name}"
f.puts " #{PKG_Name}Version = '#{PKG_VERSION}'"
f.puts "end"
f.puts "# DO NOT EDIT"
f.puts "# This file is auto-generated by build scripts."
f.puts "# See: rake update_version"
end
if ENV['RELTEST']
announce "Release Task Testing, skipping commiting of new version"
else
sh %{svn commit -m "Updated to version #{PKG_VERSION}" #{version_rb} Releases.txt ChangeLog Rakefile Manifest.txt}
end
end
task version_rb => :update_version
#################################################################
# SVN
#
task :svn_release do
sh %{svn cp -m 'Release #{PKG_VERSION}' . #{PKG_SVN_ROOT}/release/#{PKG_VERSION}}
end
# task :test => :update_version
# Misc Tasks ---------------------------------------------------------
def egrep(pattern)
Dir['**/*.rb'].each do |fn|
count = 0
open(fn) do |f|
while line = f.gets
count += 1
if line =~ pattern
puts "#{fn}:#{count}:#{line}"
end
end
end
end
end
desc "Look for TODO and FIXME tags in the code"
task :todo do
egrep /#.*(FIXME|TODO|TBD)/
end
desc "Look for Debugging print lines"
task :dbg do
egrep /\bDBG|\bbreakpoint\b/
end
desc "List all ruby files"
task :rubyfiles do
puts Dir['**/*.rb'].reject { |fn| fn =~ /^pkg/ }
puts Dir['bin/*'].reject { |fn| fn =~ /CVS|.svn|(~$)|(\.rb$)/ }
end
PKG_manifest_reject = nil unless defined? PKG_manifest_reject
task :make_manifest do
files = Dir['**/*'].reject { |fn|
fn == 'email.txt' ||
! test(?f, fn) ||
fn =~ /CVS|.svn|([#~]$)|(\.gem$)|(^pkg\/)|(^doc\/)/ ||
(PKG_manifest_reject && (fn =~ PKG_manifest_reject))
}.sort.join("\n") + "\n"
open("Manifest.txt", "w") do |f|
f.puts files
end
puts files
end
USER = ENV['USER'] || `id -un`.chomp
HOSTNAME = `hostname`.chomp
def p4_pending_cl(name = PKG_NAME)
`p4 changelists -u '#{USER}' -s pending -c '#{USER}.#{HOSTNAME}' ...`.
split("\n").
map do | l |
l =~ /Change (\d+).* '#{name}: from SVN/
$1
end.
compact.
first
end
def svn_root
`svn info`.
split("\n").
map do | l |
l =~ /Repository Root: (.*)/
$1
end.
compact.
first
end
task :p4_pending_cl do
puts p4_pending_cl
end
task :svn_root do
puts svn_root
end
desc "p4 edit, svn update, p4 submit"
task :p4_submit do
m = ENV['m'] || "From #{USER}@#{HOSTNAME}"
c = ENV['c'] || p4_pending_cl
# Open everything for edit.
sh "p4 edit ..."
# Get latest Manifest.txt.
sh "svn update"
# FIXME: Delete any files not in Manifest.txt.
# Add any new files in Manifest.txt.
sh "xargs p4 add < Manifest.txt"
# Submit any pending changes.
sh "svn ci -m #{m.inspect}"
# Get the current svn rev.
m = "#{PKG_NAME}: from SVN #{`svn update`.chomp} of #{svn_root}"
# Revert any unchanged files.
sh "p4 revert -a ..."
# Move everything to default changelist.
sh "p4 reopen -c default ..."
# Submit everything under here.
sh "p4 submit -r -d #{m.inspect} ..."
# Edit everything under here.
sh "p4 edit ..."
# Reopen in the original changelist.
if c
sh "p4 reopen -c #{c} ..."
end
end
desc "p4 edit, svn ci"
task :p4_edit_svn_ci do
m = ENV['m'] || "From #{USER}@#{HOSTNAME}"
sh "p4 edit ..."
sh "svn ci -m #{m.inspect}"
sh "p4 revert -a ..."
end