rake-dotnet 0.1.15 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +22 -0
- data/Manifest.txt +39 -1
- data/Rakefile.rb +44 -14
- data/coverage/index.html +576 -0
- data/coverage/lib-assemblyinfo_rb.html +716 -0
- data/coverage/lib-bcpcmd_rb.html +704 -0
- data/coverage/lib-cli_rb.html +646 -0
- data/coverage/lib-fxcop_rb.html +723 -0
- data/coverage/lib-harvester_rb.html +741 -0
- data/coverage/lib-iisappcmd_rb.html +657 -0
- data/coverage/lib-msbuild_rb.html +713 -0
- data/coverage/lib-ncover_rb.html +773 -0
- data/coverage/lib-package_rb.html +691 -0
- data/coverage/lib-sevenzip_rb.html +665 -0
- data/coverage/lib-sqlcmd_rb.html +680 -0
- data/coverage/lib-svn_rb.html +671 -0
- data/coverage/lib-version_rb.html +651 -0
- data/coverage/lib-xunit_rb.html +727 -0
- data/doc/examples.html +482 -0
- data/lib/rake_dotnet.rb +826 -616
- data/lib/rake_dotnet/default_rakefile.rb +16 -0
- data/spec/assemblyinfotask_spec.rb +8 -0
- data/spec/bcpcmd_spec.rb +81 -0
- data/spec/cli_spec.rb +48 -0
- data/spec/constants_spec.rb +6 -0
- data/spec/fxcopcmd_spec.rb +8 -0
- data/spec/fxcoptask_spec.rb +7 -0
- data/spec/harvester_spec.rb +6 -0
- data/spec/harvestoutputtask_spec.rb +6 -0
- data/spec/harvestwebapplicationtask_spec.rb +6 -0
- data/spec/iisappcmd_spec.rb +15 -0
- data/spec/msbuildcmd_spec.rb +7 -0
- data/spec/msbuildtask_spec.rb +7 -0
- data/spec/ncoverconsolecmd_spec.rb +12 -0
- data/spec/ncoverreportingcmd_spec.rb +14 -0
- data/spec/ncovertask_spec.rb +24 -0
- data/spec/rdnpackagetask_spec.rb +6 -0
- data/spec/sevenzipcmd_spec.rb +7 -0
- data/spec/sqlcmd_spec.rb +52 -0
- data/spec/svncmd_spec.rb +45 -0
- data/spec/versioner_spec.rb +6 -0
- data/spec/xunitcmd_spec.rb +10 -0
- data/spec/xunittask_spec.rb +7 -0
- metadata +77 -9
- data/test/test_rake_dotnet.rb +0 -16
data/lib/rake_dotnet.rb
CHANGED
@@ -35,34 +35,36 @@ require 'rake/tasklib'
|
|
35
35
|
require 'rake/clean'
|
36
36
|
require 'pathname'
|
37
37
|
|
38
|
-
|
39
38
|
desc "Displays this message; a list of tasks"
|
40
39
|
task :help do
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
40
|
+
taskHash = Hash[*(`rake.cmd -T`.split(/\n/).collect { |l| l.match(/rake (\S+)\s+\#\s(.+)/).to_a }.collect { |l| [l[1], l[2]] }).flatten]
|
41
|
+
|
42
|
+
indent = " "
|
43
|
+
|
44
|
+
puts "rake #{indent}#Runs the 'default' task"
|
45
|
+
|
46
|
+
taskHash.each_pair do |key, value|
|
47
|
+
if key.nil?
|
48
|
+
next
|
49
|
+
end
|
50
|
+
puts "rake #{key}#{indent.slice(0, indent.length - key.length)}##{value}"
|
51
|
+
end
|
53
52
|
end
|
54
53
|
|
55
|
-
|
54
|
+
module RakeDotNet
|
55
|
+
|
56
|
+
|
57
|
+
def RakeDotNet::regexify(path)
|
56
58
|
path.gsub('/', '\/').gsub('.', '\.')
|
57
59
|
end
|
58
60
|
|
59
|
-
def find_tools_dir
|
61
|
+
def RakeDotNet::find_tools_dir
|
60
62
|
shared = File.join(PRODUCT_ROOT, '..', '3rdparty')
|
61
63
|
owned = File.join(PRODUCT_ROOT, '3rdparty')
|
62
|
-
if File.exist?(shared)
|
64
|
+
if File.exist?(shared)
|
63
65
|
return shared
|
64
66
|
end
|
65
|
-
if File.exist?(owned)
|
67
|
+
if File.exist?(owned)
|
66
68
|
return owned
|
67
69
|
end
|
68
70
|
end
|
@@ -89,172 +91,380 @@ CLOBBER.include(OUT_DIR)
|
|
89
91
|
VERBOSE = ENV['VERBOSE'] ? ENV['VERBOSE'] : false
|
90
92
|
verbose(VERBOSE)
|
91
93
|
|
94
|
+
Bin_out = File.join(RakeDotNet::OUT_DIR, 'bin')
|
92
95
|
|
93
|
-
module Rake
|
94
|
-
class AssemblyInfoTask < Rake::TaskLib
|
95
|
-
attr_accessor :product_name, :configuration, :company_name, :version
|
96
|
-
|
97
|
-
def initialize(params={})
|
98
|
-
@src_dir = params[:src_dir] || SRC_DIR
|
99
|
-
yield self if block_given?
|
100
|
-
define
|
101
|
-
end
|
102
|
-
|
103
|
-
def define
|
104
|
-
src_dir_regex = regexify(@src_dir)
|
105
|
-
rule(/#{src_dir_regex}\/[\w\.\d]+\/Properties\/AssemblyInfo.cs/) do |r|
|
106
|
-
dir = Pathname.new(r.name).dirname
|
107
|
-
mkdir_p dir
|
108
|
-
nextdoor = Pathname.new(r.name + '.template')
|
109
|
-
common = Pathname.new(File.join(@src_dir, 'AssemblyInfo.cs.template'))
|
110
|
-
if (nextdoor.exist?)
|
111
|
-
generate(nextdoor, r.name)
|
112
|
-
elsif (common.exist?)
|
113
|
-
generate(common, r.name)
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
rule(/#{src_dir_regex}\/[\w\.\d]+\/My Project\/AssemblyInfo.vb/) do |r|
|
118
|
-
dir = Pathname.new(r.name).dirname
|
119
|
-
mkdir_p dir
|
120
|
-
nextdoor = Pathname.new(r.name + '.template')
|
121
|
-
common = Pathname.new(File.join(@src_dir, 'AssemblyInfo.vb.template'))
|
122
|
-
if (nextdoor.exist?)
|
123
|
-
generate(nextdoor, r.name)
|
124
|
-
elsif (common.exist?)
|
125
|
-
generate(common, r.name)
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
desc 'Generate the AssemblyInfo.cs file from the template closest'
|
130
|
-
task :assembly_info do |t|
|
131
|
-
Pathname.new(@src_dir).entries.each do |e|
|
132
|
-
asm_info = asm_info_to_generate(e)
|
133
|
-
Rake::FileTask[asm_info].invoke unless asm_info.nil?
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
self
|
138
|
-
end
|
139
|
-
|
140
|
-
def generate(template_file, destination)
|
141
|
-
content = template_file.read
|
142
|
-
token_replacements.each do |key, value|
|
143
|
-
content = content.gsub(/(\$\{#{key}\})/, value.to_s)
|
144
|
-
end
|
145
|
-
of = Pathname.new(destination)
|
146
|
-
of.delete if of.exist?
|
147
|
-
of.open('w') { |f| f.puts content }
|
148
|
-
end
|
149
|
-
|
150
|
-
def asm_info_to_generate pn_entry
|
151
|
-
if (pn_entry == '.' || pn_entry == '..' || pn_entry == '.svn')
|
152
|
-
return nil
|
153
|
-
end
|
154
|
-
if (pn_entry == 'AssemblyInfo.cs.template' || pn_entry == 'AssemblyInfo.vb.template')
|
155
|
-
return nil
|
156
|
-
end
|
157
|
-
|
158
|
-
proj = FileList.new("#{@src_dir}/#{pn_entry}/*.*proj").first
|
159
|
-
return nil if proj.nil?
|
160
|
-
|
161
|
-
proj_ext = Pathname.new(proj).extname
|
162
|
-
path = case proj_ext
|
163
|
-
when '.csproj' then File.join(@src_dir, pn_entry, 'Properties', 'AssemblyInfo.cs')
|
164
|
-
when '.vbproj' then File.join(@src_dir, pn_entry, 'My Project', 'AssemblyInfo.vb')
|
165
|
-
else nil
|
166
|
-
end
|
167
|
-
return path
|
168
|
-
end
|
169
|
-
|
170
|
-
def token_replacements
|
171
|
-
r = {}
|
172
|
-
r[:built_on] = Time.now
|
173
|
-
r[:product] = product_name
|
174
|
-
r[:configuration] = configuration
|
175
|
-
r[:company] = company_name
|
176
|
-
r[:version] = version
|
177
|
-
return r
|
178
|
-
end
|
179
|
-
|
180
|
-
def product_name
|
181
|
-
@product_name ||= PRODUCT_NAME
|
182
|
-
end
|
183
|
-
|
184
|
-
def configuration
|
185
|
-
@configuration ||= CONFIGURATION
|
186
|
-
end
|
187
|
-
|
188
|
-
def company_name
|
189
|
-
@company_name ||= COMPANY_NAME
|
190
|
-
end
|
191
|
-
|
192
|
-
def version
|
193
|
-
@version ||= Versioner.new.get
|
194
|
-
end
|
195
|
-
end
|
196
|
-
end
|
197
96
|
|
97
|
+
class Cli
|
98
|
+
attr_accessor :bin, :search_paths
|
198
99
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
100
|
+
def initialize(params={})
|
101
|
+
@bin = params[:exe] || nil
|
102
|
+
@exe_name = params[:exe_name] #required for inferring path
|
103
|
+
|
104
|
+
# guessable / defaultable
|
105
|
+
@search_paths = params[:search_paths] || []
|
106
|
+
@search_paths << nil # use the one that will be found in %PATH%
|
107
|
+
end
|
108
|
+
|
109
|
+
def exe
|
110
|
+
return @bin unless @bin.nil?
|
111
|
+
|
112
|
+
@bin = "#{search_for_exe}"
|
113
|
+
|
114
|
+
return @bin
|
115
|
+
end
|
116
|
+
|
117
|
+
def cmd
|
118
|
+
return "\"#{exe}\""
|
119
|
+
end
|
120
|
+
|
121
|
+
def search_for_exe
|
122
|
+
@search_paths.each do |sp|
|
123
|
+
if sp.nil?
|
124
|
+
return @exe_name #because we add bare exe as last element in array
|
213
125
|
else
|
214
|
-
|
126
|
+
path = File.join(sp, @exe_name)
|
127
|
+
return File.expand_path(path) if File.exist? path
|
215
128
|
end
|
216
|
-
@fxcop_options[:out_file] = @name if @fxcop_options[:out_file].nil?
|
217
|
-
|
218
|
-
yield self if block_given?
|
219
|
-
define
|
220
129
|
end
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
130
|
+
raise(ArgumentError, "No executable found in search-paths or system-PATH", caller)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
class BcpCmd < Cli
|
136
|
+
attr_accessor :keep_identity_values, :keep_null_values, :wide_character_type, :field_terminator, :native_type
|
137
|
+
attr_accessor :direction, :database, :table, :schema, :file
|
138
|
+
|
139
|
+
def initialize(params={})
|
140
|
+
sps = params[:search_paths] || []
|
141
|
+
sps << File.join(TOOLS_DIR, 'sql')
|
142
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '100', 'tools', 'binn')
|
143
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '90', 'tools', 'binn')
|
144
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '80', 'tools', 'binn')
|
145
|
+
super(params.merge({:exe_name=>'bcp.exe', :search_paths=>sps}))
|
146
|
+
|
147
|
+
unless params[:trusted].nil?
|
148
|
+
@trusted = params[:trusted]
|
149
|
+
else
|
150
|
+
@trusted = true
|
151
|
+
end
|
152
|
+
unless @trusted
|
153
|
+
@user = params[:user] || DB_USER
|
154
|
+
@password = params[:password] || DB_PASSWORD
|
155
|
+
end
|
156
|
+
|
157
|
+
@server = params[:server] || DB_SERVER
|
158
|
+
|
159
|
+
@database = params[:database] unless params[:database].nil?
|
160
|
+
@schema = params[:schema] || 'dbo'
|
161
|
+
@table = params[:table] unless params[:table].nil?
|
162
|
+
@direction = params[:direction] unless params[:direction].nil?
|
163
|
+
@file = params[:file] unless params[:file].nil?
|
164
|
+
end
|
165
|
+
|
166
|
+
def credentials
|
167
|
+
if @trusted
|
168
|
+
return '-T'
|
169
|
+
else
|
170
|
+
return "-U \"#{@user}\" -P \"#{@password}\""
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def server
|
175
|
+
return "-S \"#{@server}\""
|
176
|
+
end
|
177
|
+
|
178
|
+
def direction
|
179
|
+
return @direction.to_s
|
180
|
+
end
|
181
|
+
|
182
|
+
def db_object
|
183
|
+
return "[#{@database}].[#{@schema}].[#{@table}]"
|
184
|
+
end
|
185
|
+
|
186
|
+
def path
|
187
|
+
return '"' + File.expand_path(@file).gsub('/', '\\') + '"'
|
188
|
+
end
|
189
|
+
|
190
|
+
def keep_identity_values
|
191
|
+
return '-E' unless @keep_identity_values.nil?
|
192
|
+
end
|
193
|
+
|
194
|
+
def keep_null_values
|
195
|
+
return '-k' unless @keep_null_values.nil?
|
196
|
+
end
|
197
|
+
|
198
|
+
def wide_character_type
|
199
|
+
return '-w' unless @wide_character_type.nil?
|
200
|
+
end
|
201
|
+
|
202
|
+
def field_terminator
|
203
|
+
return "-t '#{@field_terminator}'" unless @field_terminator.nil?
|
204
|
+
end
|
205
|
+
|
206
|
+
def native_type
|
207
|
+
return '-n' unless @native_type.nil?
|
208
|
+
end
|
209
|
+
|
210
|
+
def cmd
|
211
|
+
return "#{exe} #{db_object} #{direction} #{path} #{server} #{credentials} #{keep_identity_values} #{keep_null_values} #{wide_character_type} #{field_terminator} #{native_type}"
|
212
|
+
end
|
213
|
+
|
214
|
+
def revert_optionals
|
215
|
+
@keep_identity_values = nil
|
216
|
+
@keep_null_values = nil
|
217
|
+
@wide_character_type = nil
|
218
|
+
@field_terminator = nil
|
219
|
+
@native_type = nil
|
220
|
+
@direction = nil
|
221
|
+
end
|
222
|
+
|
223
|
+
def run
|
224
|
+
puts cmd if VERBOSE == true
|
225
|
+
sh cmd
|
226
|
+
revert_optionals
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
|
231
|
+
class SqlCmd < Cli
|
232
|
+
attr_accessor :input_file, :query, :database
|
233
|
+
|
234
|
+
def initialize(params={})
|
235
|
+
sps = params[:search_paths] || []
|
236
|
+
sps << File.join(TOOLS_DIR, 'sql')
|
237
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '100', 'tools', 'binn')
|
238
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '90', 'tools', 'binn')
|
239
|
+
sps << File.join(ENV['PROGRAMFILES'], 'Microsoft SQL Server', '80', 'tools', 'binn')
|
240
|
+
super(params.merge({:exe_name=>'sqlcmd.exe', :search_paths=>sps}))
|
241
|
+
|
242
|
+
unless params[:trusted].nil?
|
243
|
+
@trusted = params[:trusted]
|
244
|
+
else
|
245
|
+
@trusted = true
|
246
|
+
end
|
247
|
+
unless @trusted
|
248
|
+
@user = params[:user] || DB_USER
|
249
|
+
@password = params[:password] || DB_PASSWORD
|
250
|
+
end
|
251
|
+
@server = params[:server] || DB_SERVER
|
252
|
+
|
253
|
+
#optionals and runtime settable
|
254
|
+
@input_file = params[:input_file]
|
255
|
+
@query = params[:query]
|
256
|
+
end
|
257
|
+
|
258
|
+
def credentials
|
259
|
+
if @trusted
|
260
|
+
return '-E'
|
261
|
+
else
|
262
|
+
return "-U \"#{@user}\" -P \"#{@password}\""
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
def server
|
267
|
+
return "-S \"#{@server}\""
|
268
|
+
end
|
269
|
+
|
270
|
+
def database
|
271
|
+
return "-d \"#{@database}\"" unless @database.nil?
|
272
|
+
end
|
273
|
+
|
274
|
+
def input_file
|
275
|
+
unless @input_file.nil?
|
276
|
+
path = File.expand_path(@input_file).gsub('/', "\\")
|
277
|
+
return "-i \"#{path}\""
|
278
|
+
end
|
279
|
+
return ''
|
280
|
+
end
|
281
|
+
|
282
|
+
def query
|
283
|
+
return "-Q \"#{@query}\"" unless @query.nil?
|
284
|
+
end
|
285
|
+
|
286
|
+
def cmd
|
287
|
+
return "#{exe} #{server} #{credentials} #{database} #{input_file} #{query}"
|
288
|
+
end
|
289
|
+
|
290
|
+
def run
|
291
|
+
puts cmd if VERBOSE == true
|
292
|
+
sh cmd
|
293
|
+
revert_optionals
|
294
|
+
end
|
295
|
+
|
296
|
+
def revert_optionals
|
297
|
+
@query = nil
|
298
|
+
@input_file = nil
|
299
|
+
end
|
300
|
+
end
|
301
|
+
|
302
|
+
|
303
|
+
class AssemblyInfoTask < Rake::TaskLib
|
304
|
+
attr_accessor :product_name, :configuration, :company_name, :version
|
305
|
+
|
306
|
+
def initialize(params={})
|
307
|
+
@src_dir = params[:src_dir] || SRC_DIR
|
308
|
+
yield self if block_given?
|
309
|
+
define
|
310
|
+
end
|
311
|
+
|
312
|
+
def define
|
313
|
+
src_dir_regex = RakeDotNet::regexify(@src_dir)
|
314
|
+
rule(/#{src_dir_regex}\/[\w\.\d]+\/Properties\/AssemblyInfo.cs/) do |r|
|
315
|
+
dir = Pathname.new(r.name).dirname
|
316
|
+
mkdir_p dir
|
317
|
+
nextdoor = Pathname.new(r.name + '.template')
|
318
|
+
common = Pathname.new(File.join(@src_dir, 'AssemblyInfo.cs.template'))
|
319
|
+
if (nextdoor.exist?)
|
320
|
+
generate(nextdoor, r.name)
|
321
|
+
elsif (common.exist?)
|
322
|
+
generate(common, r.name)
|
225
323
|
end
|
226
|
-
|
227
|
-
directory @report_dir
|
324
|
+
end
|
228
325
|
|
229
|
-
|
230
|
-
|
231
|
-
|
326
|
+
rule(/#{src_dir_regex}\/[\w\.\d]+\/My Project\/AssemblyInfo.vb/) do |r|
|
327
|
+
dir = Pathname.new(r.name).dirname
|
328
|
+
mkdir_p dir
|
329
|
+
nextdoor = Pathname.new(r.name + '.template')
|
330
|
+
common = Pathname.new(File.join(@src_dir, 'AssemblyInfo.vb.template'))
|
331
|
+
if (nextdoor.exist?)
|
332
|
+
generate(nextdoor, r.name)
|
333
|
+
elsif (common.exist?)
|
334
|
+
generate(common, r.name)
|
232
335
|
end
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
336
|
+
end
|
337
|
+
|
338
|
+
desc 'Generate the AssemblyInfo.cs file from the template closest'
|
339
|
+
task :assembly_info do |t|
|
340
|
+
Pathname.new(@src_dir).entries.each do |e|
|
341
|
+
asm_info = asm_info_to_generate(e)
|
342
|
+
Rake::FileTask[asm_info].invoke unless asm_info.nil?
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
self
|
347
|
+
end
|
348
|
+
|
349
|
+
def generate(template_file, destination)
|
350
|
+
content = template_file.read
|
351
|
+
token_replacements.each do |key, value|
|
352
|
+
content = content.gsub(/(\$\{#{key}\})/, value.to_s)
|
353
|
+
end
|
354
|
+
of = Pathname.new(destination)
|
355
|
+
of.delete if of.exist?
|
356
|
+
of.open('w') { |f| f.puts content }
|
357
|
+
end
|
358
|
+
|
359
|
+
def asm_info_to_generate pn_entry
|
360
|
+
if (pn_entry == '.' || pn_entry == '..' || pn_entry == '.svn')
|
361
|
+
return nil
|
362
|
+
end
|
363
|
+
if (pn_entry == 'AssemblyInfo.cs.template' || pn_entry == 'AssemblyInfo.vb.template')
|
364
|
+
return nil
|
365
|
+
end
|
366
|
+
|
367
|
+
proj = FileList.new("#{@src_dir}/#{pn_entry}/*.*proj").first
|
368
|
+
return nil if proj.nil?
|
369
|
+
|
370
|
+
proj_ext = Pathname.new(proj).extname
|
371
|
+
path =
|
372
|
+
case proj_ext
|
373
|
+
when '.csproj' then
|
374
|
+
File.join(@src_dir, pn_entry, 'Properties', 'AssemblyInfo.cs')
|
375
|
+
when '.vbproj' then
|
376
|
+
File.join(@src_dir, pn_entry, 'My Project', 'AssemblyInfo.vb')
|
377
|
+
else
|
378
|
+
nil
|
242
379
|
end
|
243
|
-
|
380
|
+
return path
|
381
|
+
end
|
382
|
+
|
383
|
+
def token_replacements
|
384
|
+
r = {}
|
385
|
+
r[:built_on] = Time.now
|
386
|
+
r[:product] = product_name
|
387
|
+
r[:configuration] = configuration
|
388
|
+
r[:company] = company_name
|
389
|
+
r[:version] = version
|
390
|
+
return r
|
391
|
+
end
|
392
|
+
|
393
|
+
def product_name
|
394
|
+
@product_name ||= PRODUCT_NAME
|
395
|
+
end
|
396
|
+
|
397
|
+
def configuration
|
398
|
+
@configuration ||= CONFIGURATION
|
399
|
+
end
|
400
|
+
|
401
|
+
def company_name
|
402
|
+
@company_name ||= COMPANY_NAME
|
403
|
+
end
|
404
|
+
|
405
|
+
def version
|
406
|
+
@version ||= Versioner.new.get
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
|
411
|
+
class FxCopTask < Rake::TaskLib
|
412
|
+
attr_accessor :dll_list, :suites_dir
|
413
|
+
|
414
|
+
def initialize(params={})
|
415
|
+
@product_name = params[:product_name] || PRODUCT_NAME
|
416
|
+
@report_dir = params[:report_dir] || File.join(OUT_DIR, 'reports')
|
417
|
+
@name = params[:name] || File.join(@report_dir, @product_name + '.fxcop')
|
418
|
+
@suites_dir = params[:suites_dir] || File.join(OUT_DIR, 'bin')
|
419
|
+
@dll_list = FileList.new
|
420
|
+
@deps = params[:deps] || []
|
421
|
+
@fxcop_options = params[:fxcop_options] || {}
|
422
|
+
if @fxcop_options[:apply_out_xsl].nil? || @fxcop_options[:apply_out_xsl] == false
|
423
|
+
@name += '.xml'
|
424
|
+
else
|
425
|
+
@name += '.html'
|
426
|
+
end
|
427
|
+
@fxcop_options[:out_file] = @name if @fxcop_options[:out_file].nil?
|
428
|
+
|
429
|
+
yield self if block_given?
|
430
|
+
define
|
431
|
+
end
|
432
|
+
|
433
|
+
def define
|
434
|
+
@deps.each do |d|
|
435
|
+
task :fxcop => d
|
436
|
+
end
|
437
|
+
|
438
|
+
directory @report_dir
|
439
|
+
|
440
|
+
file @name => [@report_dir] do |f|
|
441
|
+
runner = FxCop.new(@dll_list, @fxcop_options)
|
442
|
+
runner.run
|
443
|
+
end
|
444
|
+
|
445
|
+
task :fxcop, [:include_globs, :exclude_globs] do |t, args|
|
446
|
+
args.with_defaults(:include_globs => ["#{@suites_dir}/**/*#{@product_name}*.dll", "#{@suites_dir}/**/*#{@product_name}*.exe"])
|
447
|
+
args.include_globs.each do |g|
|
448
|
+
@dll_list.include g
|
244
449
|
end
|
245
|
-
|
246
|
-
|
247
|
-
|
450
|
+
args.with_defaults(:exclude_globs => ["#{@suites_dir}/*Tests*.dll", "#{@suites_dir}/*.vshost.exe"])
|
451
|
+
args.exclude_globs.each do |g|
|
452
|
+
@dll_list.exclude g
|
248
453
|
end
|
249
|
-
|
250
|
-
self
|
454
|
+
Rake::FileTask[@name].invoke
|
251
455
|
end
|
252
|
-
|
456
|
+
|
457
|
+
task :clobber_fxcop, [:globs] do |t, args|
|
458
|
+
rm_rf @report_dir
|
459
|
+
end
|
460
|
+
|
253
461
|
self
|
254
462
|
end
|
463
|
+
|
464
|
+
self
|
255
465
|
end
|
256
466
|
|
257
|
-
class
|
467
|
+
class FxCopCmd
|
258
468
|
attr_accessor :dlls, :out_file, :out_xsl, :apply_out_xsl, :dependencies_path, :summary, :verbose, :echo_to_console, :xsl_echo_to_console, :ignore_autogen, :culture
|
259
469
|
|
260
470
|
def initialize(dlls, params={})
|
@@ -273,10 +483,10 @@ class FxCop
|
|
273
483
|
@summary = params[:summary]
|
274
484
|
@verbose = params[:verbose]
|
275
485
|
@xsl_echo_to_console = params[:xsl_echo_to_console]
|
276
|
-
|
486
|
+
|
277
487
|
yield self if block_given?
|
278
488
|
end
|
279
|
-
|
489
|
+
|
280
490
|
def console
|
281
491
|
'/console' if @echo_to_console || @out_file.nil?
|
282
492
|
end
|
@@ -300,7 +510,7 @@ class FxCop
|
|
300
510
|
def apply_out_xsl
|
301
511
|
"/applyoutxsl" if @apply_out_xsl
|
302
512
|
end
|
303
|
-
|
513
|
+
|
304
514
|
def cmd
|
305
515
|
"\"#{@exe}\" #{files_to_analyse} #{console} #{out_file} #{out_xsl} #{apply_out_xsl}"
|
306
516
|
end
|
@@ -313,122 +523,116 @@ class FxCop
|
|
313
523
|
end
|
314
524
|
|
315
525
|
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
list
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
to_pn
|
350
|
-
|
351
|
-
|
352
|
-
else
|
353
|
-
cp(o, to_pn)
|
354
|
-
end
|
526
|
+
class HarvestOutputTask < Rake::TaskLib
|
527
|
+
def initialize(params={})
|
528
|
+
@src_path = params[:src_path] || File.join(PRODUCT_ROOT, 'src')
|
529
|
+
@target_path = params[:target_path] || Bin_out
|
530
|
+
@deps = params[:deps] || []
|
531
|
+
@configuration = params[:configuration] || CONFIGURATION
|
532
|
+
@glob = params[:glob] || "#{@src_path}/*"
|
533
|
+
|
534
|
+
yield self if block_given?
|
535
|
+
define
|
536
|
+
end
|
537
|
+
|
538
|
+
def define
|
539
|
+
directory @target_path
|
540
|
+
|
541
|
+
desc "Harvest specified libraries (or all matching #{@glob}) to #{@target_path}"
|
542
|
+
task :harvest_output, [:to_harvest_list] => @target_path do |t, args|
|
543
|
+
list = FileList.new
|
544
|
+
@glob.each do |g|
|
545
|
+
list.include(g)
|
546
|
+
end
|
547
|
+
args.with_defaults(:to_harvest_list => list)
|
548
|
+
args.to_harvest_list.each do |entry|
|
549
|
+
pn = Pathname.new(entry)
|
550
|
+
if pn.directory?
|
551
|
+
output = FileList.new
|
552
|
+
#TODO: distinguish between web and class and console output
|
553
|
+
output.include("#{entry}/bin/#{@configuration}/*")
|
554
|
+
output.include("#{entry}/bin/*")
|
555
|
+
output.each do |o|
|
556
|
+
o_pn = Pathname.new(o)
|
557
|
+
to_pn = Pathname.new("#{@target_path}")
|
558
|
+
if (o_pn.directory?)
|
559
|
+
cp_r(o, to_pn) unless o_pn.to_s.match(/#{@configuration}$/)
|
560
|
+
else
|
561
|
+
cp(o, to_pn)
|
355
562
|
end
|
356
563
|
end
|
357
564
|
end
|
358
565
|
end
|
359
|
-
|
360
|
-
@deps.each do |d|
|
361
|
-
task :harvest => d
|
362
|
-
end
|
363
|
-
|
364
|
-
self
|
365
566
|
end
|
567
|
+
|
568
|
+
@deps.each do |d|
|
569
|
+
task :harvest => d
|
570
|
+
end
|
571
|
+
|
572
|
+
self
|
573
|
+
end
|
574
|
+
end
|
575
|
+
|
576
|
+
class HarvestWebApplicationTask < Rake::TaskLib
|
577
|
+
def initialize(params={})
|
578
|
+
@src_path = params[:src_path] || File.join(PRODUCT_ROOT, 'src')
|
579
|
+
@target_path = params[:target_path] || OUT_DIR
|
580
|
+
@deps = params[:deps] || []
|
581
|
+
@glob = params[:glob] || "**/*.Site"
|
582
|
+
|
583
|
+
yield self if block_given?
|
584
|
+
define
|
366
585
|
end
|
367
586
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
@version = params[:version] || Versioner.new.get
|
375
|
-
@glob = params[:glob] || "**/*.Site"
|
376
|
-
|
377
|
-
yield self if block_given?
|
378
|
-
define
|
587
|
+
def define
|
588
|
+
out_dir_regex = RakeDotNet::regexify(@target_path)
|
589
|
+
|
590
|
+
odr = /#{out_dir_regex}\/([\w\.-_ ]*Site)\//
|
591
|
+
rule(odr) do |r|
|
592
|
+
harvest(r.name, odr)
|
379
593
|
end
|
380
594
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
desc "Harvest specified web-applications (or all matching #{@src_path}/#{@glob}) to #{@target_path}"
|
391
|
-
task :harvest_webapps,[:web_app_list] => @target_path do |t, args|
|
392
|
-
list = FileList.new("#{@src_path}/#{@glob}")
|
393
|
-
args.with_defaults(:web_app_list => list)
|
394
|
-
args.web_app_list.each do |w|
|
395
|
-
pn = Pathname.new(w)
|
396
|
-
out = File.join(@target_path, "#{pn.basename}-#{@configuration}-v#{@version}") + '/'
|
397
|
-
Rake::FileTask[out].invoke
|
398
|
-
end
|
399
|
-
end
|
400
|
-
|
401
|
-
@deps.each do |d|
|
402
|
-
task :harvest_webapps => d
|
595
|
+
desc "Harvest specified web-applications (or all matching #{@src_path}/#{@glob}) to #{@target_path}"
|
596
|
+
task :harvest_webapps, [:web_app_list] => @target_path do |t, args|
|
597
|
+
list = FileList.new("#{@src_path}/#{@glob}")
|
598
|
+
args.with_defaults(:web_app_list => list)
|
599
|
+
args.web_app_list.each do |w|
|
600
|
+
pn = Pathname.new(w)
|
601
|
+
out = File.join(@target_path, pn.basename) + '/'
|
602
|
+
Rake::FileTask[out].invoke
|
403
603
|
end
|
404
|
-
|
405
|
-
self
|
406
604
|
end
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
605
|
+
|
606
|
+
@deps.each do |d|
|
607
|
+
task :harvest_webapps => d
|
608
|
+
end
|
609
|
+
|
610
|
+
self
|
611
|
+
end
|
612
|
+
|
613
|
+
def harvest(path, regex)
|
614
|
+
web_app_name = path.match(regex)[1]
|
615
|
+
src = File.join(@src_path, web_app_name)
|
616
|
+
if (File.exist?("#{src}/.svn"))
|
617
|
+
svn = SvnExport.new({:src=>src, :dest=>path})
|
618
|
+
svn.run
|
619
|
+
cp_r(File.join(src, 'bin'), path)
|
620
|
+
else
|
621
|
+
cp_r src, path
|
622
|
+
end
|
623
|
+
FileList.new("#{path}**/obj").each do |e|
|
624
|
+
rm_rf e if File.exist? e
|
421
625
|
end
|
422
626
|
end
|
423
627
|
end
|
424
628
|
|
425
629
|
class Harvester
|
426
630
|
attr_accessor :files, :target
|
427
|
-
|
631
|
+
|
428
632
|
def initialize
|
429
633
|
@files = Hash.new
|
430
634
|
end
|
431
|
-
|
635
|
+
|
432
636
|
def add(glob)
|
433
637
|
toAdd = Dir.glob(glob)
|
434
638
|
toAdd.each do |a|
|
@@ -436,91 +640,89 @@ class Harvester
|
|
436
640
|
@files[pn.basename.to_s] = pn
|
437
641
|
end
|
438
642
|
end
|
439
|
-
|
643
|
+
|
440
644
|
def harvest(target)
|
441
645
|
mkdir_p(target) unless File.exist?(target)
|
442
646
|
@files.sort.each do |k, v|
|
443
647
|
cp(v, target)
|
444
648
|
end
|
445
649
|
end
|
446
|
-
|
650
|
+
|
447
651
|
def list
|
448
|
-
@files.sort.each do |k, v|
|
652
|
+
@files.sort.each do |k, v|
|
449
653
|
puts k + ' -> ' + v
|
450
654
|
end
|
451
655
|
end
|
452
656
|
end
|
453
657
|
|
454
658
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
659
|
+
class MsBuildTask < Rake::TaskLib
|
660
|
+
attr_accessor :src_dir, :verbosity, :working_dir
|
661
|
+
|
662
|
+
def initialize(params={})
|
663
|
+
#TODO: Support for arbitrary properties, not just configuration. For example, TreatWarningsAsErrors, WarningLevel.
|
664
|
+
@configuration = params[:configuration] || CONFIGURATION
|
665
|
+
@src_dir = params[:src_dir] || SRC_DIR
|
666
|
+
@verbosity = params[:verbosity] || MSBUILD_VERBOSITY || 'm'
|
667
|
+
@working_dir = params[:working_dir] || '.'
|
668
|
+
@deps = params[:deps] || [Bin_out]
|
669
|
+
@buildable_projects = ['.csproj', '.vbproj', '.wixproj']
|
670
|
+
@properties = {:Configuration => @configuration, :TreatWarningsAsErrors => true, :WarningLevel => 4, :BuildInParallel => true}.merge(params[:properties] || {})
|
671
|
+
|
672
|
+
yield self if block_given?
|
673
|
+
define
|
674
|
+
end
|
675
|
+
|
676
|
+
def define
|
677
|
+
# most project types put output into bin/{configuration}
|
678
|
+
rule(/#{src_dir_regex}\/[\w\.]+\/bin\/#{@configuration}\/[\w\.]+\.(?:dll|exe)/) do |r|
|
679
|
+
pn = Pathname.new(r.name)
|
680
|
+
name = pn.basename.to_s.sub('.dll', '')
|
681
|
+
project = FileList.new("#{@src_dir}/#{name}/#{name}.*proj").first
|
682
|
+
mb = MsBuildCmd.new(project, @properties, ['Build'], verbosity, @working_dir)
|
683
|
+
mb.run
|
471
684
|
end
|
472
|
-
|
473
|
-
def define
|
474
|
-
# most project types put output into bin/{configuration}
|
475
|
-
rule(/#{src_dir_regex}\/[\w\.]+\/bin\/#{@configuration}\/[\w\.]+\.(?:dll|exe)/) do |r|
|
476
|
-
pn = Pathname.new(r.name)
|
477
|
-
name = pn.basename.to_s.sub('.dll', '')
|
478
|
-
project = FileList.new("#{@src_dir}/#{name}/#{name}.*proj").first
|
479
|
-
mb = MsBuild.new(project, @properties, ['Build'], verbosity, @working_dir)
|
480
|
-
mb.run
|
481
|
-
end
|
482
|
-
|
483
|
-
# web application projects put output into /bin
|
484
|
-
rule(/#{src_dir_regex}\/[\w\.]+\/bin\/[\w\.]+\.dll/) do |r|
|
485
|
-
pn = Pathname.new(r.name)
|
486
|
-
name = pn.basename.to_s.sub('.dll', '')
|
487
|
-
project = FileList.new("#{@src_dir}/#{name}/#{name}.*proj").first
|
488
|
-
mb = MsBuild.new(project, @properties, ['Build'], verbosity, @working_dir)
|
489
|
-
mb.run
|
490
|
-
end
|
491
685
|
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
Rake::FileTask[dll].invoke if @buildable_projects.include?(pn.extname)
|
501
|
-
end
|
502
|
-
end
|
686
|
+
# web application projects put output into /bin
|
687
|
+
rule(/#{src_dir_regex}\/[\w\.]+\/bin\/[\w\.]+\.dll/) do |r|
|
688
|
+
pn = Pathname.new(r.name)
|
689
|
+
name = pn.basename.to_s.sub('.dll', '')
|
690
|
+
project = FileList.new("#{@src_dir}/#{name}/#{name}.*proj").first
|
691
|
+
mb = MsBuildCmd.new(project, @properties, ['Build'], verbosity, @working_dir)
|
692
|
+
mb.run
|
693
|
+
end
|
503
694
|
|
504
|
-
|
505
|
-
|
695
|
+
desc "Compile the specified projects (give relative paths) (otherwise, all matching src/**/*.*proj)"
|
696
|
+
task :compile, [:projects] do |t, args|
|
697
|
+
project_list = FileList.new("#{src_dir}/**/*.*proj")
|
698
|
+
args.with_defaults(:projects => project_list)
|
699
|
+
args.projects.each do |p|
|
700
|
+
pn = Pathname.new(p)
|
701
|
+
# TODO: Figure out which type of project we are so we can invoke the correct rule, with the correct output extension
|
702
|
+
dll = File.join(pn.dirname, 'bin', @configuration, pn.basename.sub(pn.extname, '.dll'))
|
703
|
+
Rake::FileTask[dll].invoke if @buildable_projects.include?(pn.extname)
|
506
704
|
end
|
507
|
-
|
508
|
-
self
|
509
|
-
end
|
510
|
-
|
511
|
-
def src_dir_regex
|
512
|
-
regexify(@src_dir)
|
513
705
|
end
|
514
|
-
|
515
|
-
|
516
|
-
|
706
|
+
|
707
|
+
@deps.each do |d|
|
708
|
+
task :compile => d
|
517
709
|
end
|
710
|
+
|
711
|
+
self
|
712
|
+
end
|
713
|
+
|
714
|
+
def src_dir_regex
|
715
|
+
RakeDotNet::regexify(@src_dir)
|
716
|
+
end
|
717
|
+
|
718
|
+
def figure_out_project_type(project_pathname)
|
719
|
+
# TODO.
|
518
720
|
end
|
519
721
|
end
|
520
722
|
|
521
|
-
class
|
723
|
+
class MsBuildCmd
|
522
724
|
attr_accessor :project, :properties, :targets, :verbosity
|
523
|
-
|
725
|
+
|
524
726
|
def initialize(project='default.proj', properties={}, targets=[], verbosity='n', working_dir=nil)
|
525
727
|
@project = project
|
526
728
|
@properties = properties
|
@@ -529,11 +731,11 @@ class MsBuild
|
|
529
731
|
@working_dir = working_dir
|
530
732
|
@exe = '"' + File.join(ENV['windir'].dup, 'Microsoft.NET', 'Framework', 'v3.5', 'msbuild.exe') + '"'
|
531
733
|
end
|
532
|
-
|
734
|
+
|
533
735
|
def cmd
|
534
736
|
"#{@exe} #{project} /maxcpucount /v:#{@verbosity} /p:#{properties} /t:#{targets}"
|
535
737
|
end
|
536
|
-
|
738
|
+
|
537
739
|
def run
|
538
740
|
if @working_dir
|
539
741
|
chdir(@working_dir) do
|
@@ -542,15 +744,15 @@ class MsBuild
|
|
542
744
|
end
|
543
745
|
end
|
544
746
|
end
|
545
|
-
|
747
|
+
|
546
748
|
def project
|
547
749
|
"\"#{@project}\""
|
548
750
|
end
|
549
|
-
|
751
|
+
|
550
752
|
def targets
|
551
753
|
@targets.join(';')
|
552
754
|
end
|
553
|
-
|
755
|
+
|
554
756
|
def properties
|
555
757
|
p = []
|
556
758
|
@properties.each {|key, value| p.push("#{key}=#{value}") }
|
@@ -559,70 +761,69 @@ class MsBuild
|
|
559
761
|
end
|
560
762
|
|
561
763
|
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
764
|
+
class NCoverTask < Rake::TaskLib
|
765
|
+
attr_accessor :profile_options, :reporting_options
|
766
|
+
|
767
|
+
def initialize(params={})
|
768
|
+
@product_name = params[:product_name] || PRODUCT_NAME
|
769
|
+
@bin_dir = params[:bin_dir] || File.join(OUT_DIR, 'bin')
|
770
|
+
@report_dir = params[:report_dir] || File.join(OUT_DIR, 'reports', 'ncover')
|
771
|
+
@deps = params[:deps] || []
|
772
|
+
tool_defaults = {:arch => ENV['PROCESSOR_ARCHITECTURE']}
|
773
|
+
@profile_options = tool_defaults.merge(params[:profile_options] || {})
|
774
|
+
@reporting_options = tool_defaults.merge(params[:reporting_options] || {})
|
775
|
+
|
776
|
+
yield self if block_given?
|
777
|
+
define
|
778
|
+
end
|
779
|
+
|
780
|
+
def define
|
781
|
+
@deps.each do |d|
|
782
|
+
task :ncover_profile => d
|
783
|
+
end
|
784
|
+
|
785
|
+
directory @report_dir
|
786
|
+
|
787
|
+
reports_dir_regex = RakeDotNet::regexify(@report_dir)
|
788
|
+
rule(/#{reports_dir_regex}\/.*\.coverage\.xml/) do |r|
|
789
|
+
dll_to_execute = r.name.sub(/#{@report_dir}\/(.*)\.coverage\.xml/, "#{@bin_dir}/\\1.dll")
|
790
|
+
nc = NCoverConsoleCmd.new(@report_dir, dll_to_execute, @profile_options)
|
791
|
+
nc.run
|
576
792
|
end
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
nc.run
|
590
|
-
end
|
591
|
-
|
592
|
-
desc "Generate ncover coverage XML, one file per test-suite that exercises your product"
|
593
|
-
task :ncover_profile,[:dlls_to_run] => [@report_dir] do |t, args|
|
594
|
-
dlls_to_run_list = FileList.new
|
595
|
-
dlls_to_run_list.include("#{@bin_dir}/**/*#{@product_name}*Tests*.dll")
|
596
|
-
dlls_to_run_list.include("#{@bin_dir}/**/*#{@product_name}*Tests*.exe")
|
597
|
-
args.with_defaults(:dlls_to_run => dlls_to_run_list)
|
598
|
-
args.dlls_to_run.each do |d|
|
599
|
-
dll_to_run = Pathname.new(d)
|
600
|
-
cf_name = dll_to_run.basename.sub(dll_to_run.extname, '.coverage.xml')
|
601
|
-
coverage_file = File.join(@report_dir, cf_name)
|
602
|
-
Rake::FileTask[coverage_file].invoke
|
603
|
-
end
|
604
|
-
|
605
|
-
end
|
606
|
-
|
607
|
-
desc "Generate ncover coverage report(s), on all coverage files, merged together"
|
608
|
-
task :ncover_reports => [:ncover_profile] do
|
609
|
-
# ncover lets us use *.coverage.xml to merge together files
|
610
|
-
include = [File.join(@report_dir, '*.coverage.xml')]
|
611
|
-
@reporting_options[:name] = 'merged'
|
612
|
-
ncr = NCoverReporting.new(@report_dir, include, @reporting_options)
|
613
|
-
ncr.run
|
614
|
-
end
|
615
|
-
|
616
|
-
task :clobber_ncover do
|
617
|
-
rm_rf @report_dir
|
793
|
+
|
794
|
+
desc "Generate ncover coverage XML, one file per test-suite that exercises your product"
|
795
|
+
task :ncover_profile, [:dlls_to_run] => [@report_dir] do |t, args|
|
796
|
+
dlls_to_run_list = FileList.new
|
797
|
+
dlls_to_run_list.include("#{@bin_dir}/**/*#{@product_name}*Tests*.dll")
|
798
|
+
dlls_to_run_list.include("#{@bin_dir}/**/*#{@product_name}*Tests*.exe")
|
799
|
+
args.with_defaults(:dlls_to_run => dlls_to_run_list)
|
800
|
+
args.dlls_to_run.each do |d|
|
801
|
+
dll_to_run = Pathname.new(d)
|
802
|
+
cf_name = dll_to_run.basename.sub(dll_to_run.extname, '.coverage.xml')
|
803
|
+
coverage_file = File.join(@report_dir, cf_name)
|
804
|
+
Rake::FileTask[coverage_file].invoke
|
618
805
|
end
|
619
|
-
|
620
|
-
|
806
|
+
|
807
|
+
end
|
808
|
+
|
809
|
+
desc "Generate ncover coverage report(s), on all coverage files, merged together"
|
810
|
+
task :ncover_reports => [:ncover_profile] do
|
811
|
+
# ncover lets us use *.coverage.xml to merge together files
|
812
|
+
include = [File.join(@report_dir, '*.coverage.xml')]
|
813
|
+
@reporting_options[:name] = 'merged'
|
814
|
+
ncr = NCoverReportingCmd.new(@report_dir, include, @reporting_options)
|
815
|
+
ncr.run
|
816
|
+
end
|
817
|
+
|
818
|
+
task :clobber_ncover do
|
819
|
+
rm_rf @report_dir
|
621
820
|
end
|
821
|
+
|
822
|
+
self
|
622
823
|
end
|
623
824
|
end
|
624
825
|
|
625
|
-
class
|
826
|
+
class NCoverConsoleCmd
|
626
827
|
def initialize(report_dir, dll_to_execute, params)
|
627
828
|
params ||= {}
|
628
829
|
arch = params[:arch] || ENV['PROCESSOR_ARCHITECTURE']
|
@@ -632,23 +833,22 @@ class NCover
|
|
632
833
|
@output_file = File.join(report_dir, ofname)
|
633
834
|
@exclude_assemblies_regex = params[:exclude_assemblies_regex] || ['.*Tests.*']
|
634
835
|
@exclude_assemblies_regex.push('ISymWrapper')
|
635
|
-
@build_id = params[:build_id] || Versioner.new.get
|
636
836
|
@working_dir = params[:working_dir] || Pathname.new(@dll_to_execute).dirname
|
637
837
|
end
|
638
|
-
|
838
|
+
|
639
839
|
def cmdToRun
|
640
|
-
x =
|
840
|
+
x = XUnitConsoleCmd.new(@dll_to_execute, '', nil, {})
|
641
841
|
x.cmd
|
642
842
|
end
|
643
|
-
|
843
|
+
|
644
844
|
def bi
|
645
|
-
"//bi #{
|
845
|
+
"//bi #{Versioner.new.get.to_s}"
|
646
846
|
end
|
647
|
-
|
847
|
+
|
648
848
|
def working_dir
|
649
849
|
"//w #{@working_dir}"
|
650
850
|
end
|
651
|
-
|
851
|
+
|
652
852
|
def exclude_assemblies
|
653
853
|
if @exclude_assemblies_regex.instance_of?(Array)
|
654
854
|
return '//eas ' + @exclude_assemblies_regex.join(';')
|
@@ -659,14 +859,14 @@ class NCover
|
|
659
859
|
def cmd
|
660
860
|
"\"#{@exe}\" #{cmdToRun} //x #{@output_file} #{exclude_assemblies} #{bi} #{working_dir}"
|
661
861
|
end
|
662
|
-
|
862
|
+
|
663
863
|
def run
|
664
864
|
puts cmd if VERBOSE
|
665
865
|
sh cmd
|
666
866
|
end
|
667
867
|
end
|
668
868
|
|
669
|
-
class
|
869
|
+
class NCoverReportingCmd
|
670
870
|
def initialize(report_dir, coverage_files, params)
|
671
871
|
@report_dir = report_dir
|
672
872
|
@coverage_files = coverage_files || []
|
@@ -678,13 +878,12 @@ class NCoverReporting
|
|
678
878
|
# required
|
679
879
|
@reports = params[:reports] || ['Summary', 'UncoveredCodeSections', 'FullCoverageReport']
|
680
880
|
@output_path = File.join(@report_dir)
|
681
|
-
|
881
|
+
|
682
882
|
# optional
|
683
|
-
@build_id = params[:build_id] || Versioner.new.get
|
684
883
|
@sort_order = params[:sort] || 'CoveragePercentageAscending'
|
685
884
|
@project_name = params[:project_name] || PRODUCT_NAME
|
686
885
|
end
|
687
|
-
|
886
|
+
|
688
887
|
def coverage_files
|
689
888
|
list = ''
|
690
889
|
@coverage_files.each do |cf|
|
@@ -692,11 +891,11 @@ class NCoverReporting
|
|
692
891
|
end
|
693
892
|
list
|
694
893
|
end
|
695
|
-
|
894
|
+
|
696
895
|
def build_id
|
697
|
-
"//bi #{
|
896
|
+
"//bi #{Versioner.new.get.to_s}"
|
698
897
|
end
|
699
|
-
|
898
|
+
|
700
899
|
def output_reports
|
701
900
|
cmd = ''
|
702
901
|
@reports.each do |r|
|
@@ -704,143 +903,150 @@ class NCoverReporting
|
|
704
903
|
end
|
705
904
|
return cmd
|
706
905
|
end
|
707
|
-
|
906
|
+
|
708
907
|
def output_path
|
709
908
|
"//op \"#{@output_path}\""
|
710
909
|
end
|
711
|
-
|
910
|
+
|
712
911
|
def sort_order
|
713
912
|
"//so #{@sort_order}"
|
714
913
|
end
|
715
|
-
|
914
|
+
|
716
915
|
def project_name
|
717
916
|
"//p #{@project_name}" unless @project_name.nil?
|
718
917
|
end
|
719
|
-
|
918
|
+
|
720
919
|
def cmd
|
721
920
|
"\"#{@exe}\" #{coverage_files} #{build_id} #{output_reports} #{output_path} #{sort_order} #{project_name}"
|
722
921
|
end
|
723
|
-
|
922
|
+
|
724
923
|
def run
|
725
924
|
sh cmd
|
726
925
|
end
|
727
926
|
end
|
728
927
|
|
729
928
|
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
929
|
+
class RDNPackageTask < Rake::TaskLib
|
930
|
+
attr_accessor :targets
|
931
|
+
|
932
|
+
def initialize(name, params={})
|
933
|
+
@name = name
|
934
|
+
@out_dir = params[:out_dir] || OUT_DIR
|
935
|
+
@deps = params[:deps] || []
|
936
|
+
@configuration = params[:configuration] || CONFIGURATION
|
937
|
+
globs = params[:globs] || []
|
938
|
+
@targets = FileList.new globs
|
939
|
+
|
940
|
+
yield self if block_given?
|
941
|
+
define
|
942
|
+
end
|
943
|
+
|
944
|
+
def define
|
945
|
+
out_pkg = File.join(@out_dir, 'pkg')
|
946
|
+
out_pkg_name = File.join(out_pkg, @name)
|
947
|
+
|
948
|
+
directory out_pkg
|
949
|
+
directory out_pkg_name
|
950
|
+
|
951
|
+
@deps.each do |d|
|
952
|
+
task :package => d
|
745
953
|
end
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
954
|
+
|
955
|
+
out_pkg_name_regex = RakeDotNet::regexify(out_pkg_name)
|
956
|
+
|
957
|
+
rule(/#{out_pkg_name_regex}-#{@configuration}-v\d+\.\d+\.\d+\.\d+\.zip/) do |r|
|
958
|
+
file_name = r.name.match(/(#{out_pkg_name_regex}).*/)[1].sub(out_pkg, '').sub('/','')
|
959
|
+
version = r.name.match(/.*v(\d+\.\d+\.\d+\.\d+)\.zip/)[1]
|
960
|
+
run_package(out_pkg, file_name, version)
|
961
|
+
end
|
962
|
+
|
963
|
+
directory @out_dir
|
964
|
+
|
965
|
+
desc "Generate zip'd packages for all package-tasks"
|
966
|
+
task :package => [@out_dir, out_pkg, out_pkg_name] do
|
967
|
+
version = Versioner.new.get
|
968
|
+
Rake::Task["#{out_pkg_name}-#{@configuration}-v#{version}.zip"].invoke
|
969
|
+
end
|
970
|
+
|
971
|
+
desc "Generate zip'd package for #{@name}"
|
972
|
+
task "package_#{@name}".to_sym => [@out_dir, out_pkg, out_pkg_name] do
|
973
|
+
version = Versioner.new.get
|
974
|
+
Rake::Task["#{out_pkg_name}-#{@configuration}-v#{version}.zip"].invoke
|
975
|
+
end
|
976
|
+
|
977
|
+
desc "Delete all packages"
|
978
|
+
task :clobber_package do
|
979
|
+
rm_rf out_pkg
|
980
|
+
end
|
981
|
+
|
982
|
+
task :clobber => :clobber_package
|
983
|
+
|
984
|
+
desc "Delete all packages and recreate them"
|
985
|
+
task :repackage => [:clobber_package, :package]
|
986
|
+
|
987
|
+
self
|
988
|
+
end
|
989
|
+
|
990
|
+
def run_package(root_dir, package_name, version)
|
991
|
+
assembly_dir = File.join(root_dir, package_name)
|
992
|
+
mkdir_p assembly_dir
|
993
|
+
@targets.each do |t|
|
994
|
+
f = Pathname.new(t)
|
995
|
+
if f.directory?
|
996
|
+
cp_r f, File.join(assembly_dir, "#{f.basename}-#{@configuration}-v#{version}")
|
997
|
+
else
|
998
|
+
cp f, assembly_dir
|
789
999
|
end
|
790
|
-
|
791
|
-
task :clobber => :clobber_package
|
792
|
-
|
793
|
-
desc "Delete all packages and recreate them"
|
794
|
-
task :repackage => [:clobber_package, :package]
|
795
|
-
|
796
|
-
self
|
797
1000
|
end
|
798
|
-
|
799
|
-
|
800
|
-
|
1001
|
+
versioned_assembly_dir = File.join(root_dir, "#{package_name}-#{@configuration}-v#{version}")
|
1002
|
+
mv assembly_dir, versioned_assembly_dir
|
1003
|
+
vzip = versioned_assembly_dir + '.zip'
|
1004
|
+
sz = SevenZipCmd.new(vzip)
|
1005
|
+
chdir versioned_assembly_dir do
|
1006
|
+
sz.run_add
|
801
1007
|
end
|
802
1008
|
end
|
803
1009
|
end
|
804
1010
|
|
805
1011
|
|
806
|
-
class
|
1012
|
+
class SevenZipCmd
|
807
1013
|
def initialize(archive_name, opts={})
|
808
1014
|
arch = ENV['PROCESSOR_ARCHITECTURE'] || 'AMD64'
|
809
1015
|
bin = arch == 'x86' ? '7za.exe' : '7z.exe'
|
810
1016
|
@exe = opts[:sevenzip] || File.expand_path(File.join(TOOLS_DIR, '7zip', arch, bin))
|
811
1017
|
@archive_name = File.expand_path(archive_name)
|
812
1018
|
@params = opts
|
813
|
-
|
1019
|
+
|
814
1020
|
yield self if block_given?
|
815
1021
|
end
|
816
|
-
|
1022
|
+
|
817
1023
|
def cmd_add
|
818
1024
|
"#{exe} a #{archive_name} #{file_names}"
|
819
1025
|
end
|
820
|
-
|
1026
|
+
|
821
1027
|
def run_add
|
822
1028
|
puts cmd_add if VERBOSE
|
823
1029
|
sh cmd_add
|
824
1030
|
end
|
825
|
-
|
1031
|
+
|
826
1032
|
def cmd_extract
|
827
1033
|
"#{exe} x -y #{out_dir} #{archive_name} #{file_names}"
|
828
1034
|
end
|
829
|
-
|
1035
|
+
|
830
1036
|
def run_extract
|
831
1037
|
puts cmd_extract if VERBOSE
|
832
1038
|
sh cmd_extract
|
833
1039
|
end
|
834
|
-
|
1040
|
+
|
835
1041
|
def out_dir
|
836
1042
|
od = @params[:out_dir]
|
837
1043
|
"-o#{File.expand_path(od)}" unless @params[:out_dir].nil?
|
838
1044
|
end
|
839
|
-
|
1045
|
+
|
840
1046
|
def archive_name
|
841
1047
|
"\"#{@archive_name}\""
|
842
1048
|
end
|
843
|
-
|
1049
|
+
|
844
1050
|
def file_names
|
845
1051
|
fns = @params[:file_names]
|
846
1052
|
if fns.is_a? String
|
@@ -849,66 +1055,66 @@ class SevenZip
|
|
849
1055
|
list = ''
|
850
1056
|
fns.each do |fn|
|
851
1057
|
list += "\"#{File.expand_path(fn)}\" "
|
852
|
-
end
|
1058
|
+
end
|
853
1059
|
list.chop
|
854
1060
|
end
|
855
1061
|
end
|
856
|
-
|
1062
|
+
|
857
1063
|
def exe
|
858
1064
|
"\"#{@exe}\""
|
859
1065
|
end
|
860
1066
|
end
|
861
1067
|
|
862
1068
|
|
863
|
-
class
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
1069
|
+
class SvnCmd < Cli
|
1070
|
+
def initialize(params={})
|
1071
|
+
sps = params[:search_paths] || []
|
1072
|
+
sps << File.join(TOOLS_DIR, 'svn', 'bin')
|
1073
|
+
sps << File.join(ENV['PROGRAMFILES'], 'subversion', 'bin')
|
1074
|
+
sps << File.join(ENV['PROGRAMFILES'], 'svn', 'bin')
|
1075
|
+
super(params.merge({:exe_name=>'svn.exe',:search_paths=>sps}))
|
869
1076
|
end
|
870
|
-
|
871
|
-
def
|
872
|
-
|
1077
|
+
|
1078
|
+
def cmd
|
1079
|
+
return super
|
873
1080
|
end
|
874
1081
|
end
|
875
1082
|
|
876
|
-
class SvnExport <
|
877
|
-
def initialize(
|
878
|
-
super
|
879
|
-
|
880
|
-
|
1083
|
+
class SvnExport < SvnCmd
|
1084
|
+
def initialize(params={})
|
1085
|
+
super
|
1086
|
+
raise(ArgumentError, "src parameter was missing", caller) if params[:src].nil?
|
1087
|
+
raise(ArgumentError, "dest parameter was missing", caller) if params[:dest].nil?
|
1088
|
+
@src = params[:src]
|
1089
|
+
@dest = params[:dest]
|
881
1090
|
end
|
882
|
-
|
1091
|
+
|
1092
|
+
def src
|
1093
|
+
return "\"#{File.expand_path(@src)}\""
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
def dest
|
1097
|
+
return "\"#{File.expand_path(@dest)}\""
|
1098
|
+
end
|
1099
|
+
|
883
1100
|
def cmd
|
884
|
-
"#{
|
1101
|
+
return "#{super} export #{src} #{dest}"
|
885
1102
|
end
|
886
|
-
|
887
|
-
def
|
888
|
-
puts cmd if VERBOSE
|
1103
|
+
|
1104
|
+
def run
|
1105
|
+
puts cmd if VERBOSE==true
|
889
1106
|
sh cmd
|
890
1107
|
end
|
891
|
-
|
892
|
-
def src
|
893
|
-
"\"#{@src}\""
|
894
|
-
end
|
895
|
-
|
896
|
-
def dest
|
897
|
-
"\"#{@dest}\""
|
898
|
-
end
|
899
1108
|
end
|
900
1109
|
|
901
|
-
class SvnInfo <
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
super(opts)
|
906
|
-
@path = opts[:path] || '.'
|
907
|
-
yield self if block_given?
|
1110
|
+
class SvnInfo < SvnCmd
|
1111
|
+
def initialize(params={})
|
1112
|
+
super
|
1113
|
+
@path = params[:path] || '.'
|
908
1114
|
end
|
909
|
-
|
1115
|
+
|
910
1116
|
def cmd
|
911
|
-
"#{
|
1117
|
+
"#{super} info #{path}"
|
912
1118
|
end
|
913
1119
|
|
914
1120
|
def revision
|
@@ -916,7 +1122,7 @@ class SvnInfo < Svn
|
|
916
1122
|
out = `#{cmd}`
|
917
1123
|
out.match(/Revision: (\d+)/)[1]
|
918
1124
|
end
|
919
|
-
|
1125
|
+
|
920
1126
|
def path
|
921
1127
|
"\"#{@path}\""
|
922
1128
|
end
|
@@ -924,38 +1130,38 @@ end
|
|
924
1130
|
|
925
1131
|
|
926
1132
|
class Versioner
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
943
|
-
|
944
|
-
|
945
|
-
|
946
|
-
|
947
|
-
|
948
|
-
|
949
|
-
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
1133
|
+
def initialize(template_file=nil, opts={})
|
1134
|
+
tf_path = template_file || 'version.template.txt'
|
1135
|
+
@tf = Pathname.new(tf_path)
|
1136
|
+
@vf = Pathname.new(tf_path.sub('.template', ''))
|
1137
|
+
end
|
1138
|
+
|
1139
|
+
def get
|
1140
|
+
return @vf.read.chomp if @vf.exist?
|
1141
|
+
|
1142
|
+
v = "#{maj_min}.#{build}.#{revision}"
|
1143
|
+
@vf.open('w') {|f| f.write(v) }
|
1144
|
+
return v
|
1145
|
+
end
|
1146
|
+
|
1147
|
+
def maj_min
|
1148
|
+
return @tf.read.chomp
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
def build
|
1152
|
+
bn = ENV['BUILD_NUMBER']
|
1153
|
+
return 0 if bn == nil || !bn.match(/\d+/)
|
1154
|
+
return bn
|
1155
|
+
end
|
1156
|
+
|
1157
|
+
def revision
|
1158
|
+
if (Pathname.new('.svn').exist?)
|
1159
|
+
return SvnInfo.new(:path => '.').revision
|
1160
|
+
else
|
1161
|
+
# TODO: return something numeric but sane for non-numeric revision numbers (eg DVCSs)
|
1162
|
+
return '0' # YYYYMMDD is actually invalid for a {revision} number.
|
1163
|
+
end
|
1164
|
+
end
|
959
1165
|
end
|
960
1166
|
|
961
1167
|
Version_txt = 'version.txt'
|
@@ -966,65 +1172,63 @@ task :version => Version_txt
|
|
966
1172
|
task :assembly_info => Version_txt
|
967
1173
|
|
968
1174
|
|
969
|
-
|
970
|
-
|
971
|
-
|
1175
|
+
class XUnitTask < Rake::TaskLib
|
1176
|
+
attr_accessor :suites_dir, :reports_dir, :options
|
1177
|
+
|
1178
|
+
def initialize(params={}) # :yield: self
|
1179
|
+
@suites_dir = params[:suites_dir] || File.join(OUT_DIR, 'bin')
|
1180
|
+
@reports_dir = params[:reports_dir] || File.join(OUT_DIR, 'reports')
|
1181
|
+
@options = params[:options] || {}
|
1182
|
+
@deps = params[:deps] || []
|
972
1183
|
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
1184
|
+
yield self if block_given?
|
1185
|
+
define
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
# Create the tasks defined by this task lib.
|
1189
|
+
def define
|
1190
|
+
@deps.each do |d|
|
1191
|
+
task :xunit => d
|
981
1192
|
end
|
982
1193
|
|
983
|
-
|
984
|
-
|
985
|
-
@
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
testsDll = File.join(@suites_dir, suite + '.dll')
|
992
|
-
out_dir = File.join(@reports_dir, suite)
|
993
|
-
unless File.exist?(out_dir) && uptodate?(testsDll, out_dir)
|
994
|
-
mkdir_p(out_dir) unless File.exist?(out_dir)
|
995
|
-
x = XUnit.new(testsDll, out_dir, nil, options=@options)
|
996
|
-
x.run
|
997
|
-
end
|
1194
|
+
rule(/#{@reports_dir}\/.*Tests.*\//) do |r|
|
1195
|
+
suite = r.name.match(/.*\/(.*Tests)\//)[1]
|
1196
|
+
testsDll = File.join(@suites_dir, suite + '.dll')
|
1197
|
+
out_dir = File.join(@reports_dir, suite)
|
1198
|
+
unless File.exist?(out_dir) && uptodate?(testsDll, out_dir)
|
1199
|
+
mkdir_p(out_dir) unless File.exist?(out_dir)
|
1200
|
+
x = XUnitConsoleCmd.new(testsDll, out_dir, nil, options=@options)
|
1201
|
+
x.run
|
998
1202
|
end
|
1203
|
+
end
|
999
1204
|
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
end
|
1009
|
-
end
|
1010
|
-
|
1011
|
-
task :xunit_clobber do
|
1012
|
-
rm_rf(@reports_dir)
|
1205
|
+
directory @reports_dir
|
1206
|
+
|
1207
|
+
desc "Generate test reports (which ones, depends on the content of XUNIT_OPTS) inside of each directory specified, where each directory matches a test-suite name (give relative paths) (otherwise, all matching #{@suites_dir}/*Tests.*.dll) and write reports to #{@reports_dir}"
|
1208
|
+
task :xunit, [:reports] => [@reports_dir] do |t, args|
|
1209
|
+
reports_list = FileList.new("#{@suites_dir}/**/*Tests*.dll").pathmap("#{@reports_dir}/%n/")
|
1210
|
+
args.with_defaults(:reports => reports_list)
|
1211
|
+
args.reports.each do |r|
|
1212
|
+
Rake::FileTask[r].invoke
|
1013
1213
|
end
|
1014
|
-
|
1015
|
-
self
|
1016
1214
|
end
|
1215
|
+
|
1216
|
+
task :xunit_clobber do
|
1217
|
+
rm_rf(@reports_dir)
|
1218
|
+
end
|
1219
|
+
|
1220
|
+
self
|
1017
1221
|
end
|
1018
1222
|
end
|
1019
1223
|
|
1020
|
-
class
|
1224
|
+
class XUnitConsoleCmd
|
1021
1225
|
attr_accessor :xunit, :test_dll, :reports_dir, :options
|
1022
|
-
|
1226
|
+
|
1023
1227
|
def initialize(test_dll, reports_dir, xunit=nil, options={})
|
1024
1228
|
x86exe = File.join(TOOLS_DIR, 'xunit', 'xunit.console.x86.exe')
|
1025
1229
|
x64exe = File.join(TOOLS_DIR, 'xunit', 'xunit.console.exe')
|
1026
1230
|
path_to_xunit = x64exe
|
1027
|
-
if File.exist? x86exe
|
1231
|
+
if File.exist? x86exe
|
1028
1232
|
path_to_xunit = x86exe
|
1029
1233
|
end
|
1030
1234
|
@xunit = xunit || path_to_xunit
|
@@ -1033,7 +1237,7 @@ class XUnit
|
|
1033
1237
|
@reports_dir = File.expand_path(reports_dir)
|
1034
1238
|
@options = options
|
1035
1239
|
end
|
1036
|
-
|
1240
|
+
|
1037
1241
|
def run
|
1038
1242
|
test_dir = Pathname.new(test_dll).dirname
|
1039
1243
|
chdir test_dir do
|
@@ -1041,46 +1245,52 @@ class XUnit
|
|
1041
1245
|
sh cmd
|
1042
1246
|
end
|
1043
1247
|
end
|
1044
|
-
|
1248
|
+
|
1045
1249
|
def cmd
|
1046
1250
|
cmd = "#{exe} #{test_dll} #{html} #{xml} #{nunit} #{wait} #{noshadow} #{teamcity}"
|
1047
1251
|
end
|
1048
|
-
|
1252
|
+
|
1049
1253
|
def exe
|
1050
1254
|
"\"#{@xunit}\""
|
1051
1255
|
end
|
1052
|
-
|
1256
|
+
|
1053
1257
|
def suite
|
1054
1258
|
@test_dll.match(/.*\/([\w\.]+)\.dll/)[1]
|
1055
1259
|
end
|
1056
|
-
|
1260
|
+
|
1057
1261
|
def test_dll
|
1058
|
-
"\"#{@test_dll}\""
|
1262
|
+
"\"#{@test_dll}\"".gsub('/', '\\')
|
1059
1263
|
end
|
1060
|
-
|
1264
|
+
|
1061
1265
|
def html
|
1062
|
-
"
|
1266
|
+
path = "#{@reports_dir}/#{suite}.test-results.html".gsub('/', '\\')
|
1267
|
+
"/html \"#{path}\"" if @options.has_key?(:html)
|
1063
1268
|
end
|
1064
|
-
|
1269
|
+
|
1065
1270
|
def xml
|
1066
|
-
"
|
1271
|
+
path = "#{@reports_dir}/#{suite}.test-results.xml".gsub('/', '\\')
|
1272
|
+
"/xml \"#{path}\"" if @options.has_key?(:xml)
|
1067
1273
|
end
|
1068
|
-
|
1274
|
+
|
1069
1275
|
def nunit
|
1070
|
-
"
|
1276
|
+
path = "#{@reports_dir}/#{suite}.test-results.nunit.xml".gsub('/', '\\')
|
1277
|
+
"/nunit \"#{path}\"" if @options.has_key?(:nunit)
|
1071
1278
|
end
|
1072
1279
|
|
1073
1280
|
def wait
|
1074
1281
|
'/wait' if @options.has_key?(:wait)
|
1075
1282
|
end
|
1076
|
-
|
1283
|
+
|
1077
1284
|
def noshadow
|
1078
1285
|
'/noshadow' if @options.has_key?(:noshadow)
|
1079
1286
|
end
|
1080
|
-
|
1287
|
+
|
1081
1288
|
def teamcity
|
1082
1289
|
'/teamcity' if @options.has_key?(:teamcity)
|
1083
1290
|
end
|
1084
1291
|
end
|
1085
1292
|
|
1086
1293
|
|
1294
|
+
end
|
1295
|
+
|
1296
|
+
|