mini_portile2 2.4.0 → 2.8.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,6 @@
1
1
  require 'rbconfig'
2
2
  require 'net/http'
3
3
  require 'net/https'
4
- require 'net/ftp'
5
4
  require 'fileutils'
6
5
  require 'tempfile'
7
6
  require 'digest'
@@ -29,15 +28,27 @@ class Net::HTTP
29
28
  end
30
29
 
31
30
  class MiniPortile
31
+ DEFAULT_TIMEOUT = 10
32
+
32
33
  attr_reader :name, :version, :original_host
33
34
  attr_writer :configure_options
34
- attr_accessor :host, :files, :patch_files, :target, :logger
35
+ attr_accessor :host, :files, :patch_files, :target, :logger, :source_directory
35
36
 
36
37
  def self.windows?
37
- RbConfig::CONFIG['target_os'] =~ /mswin|mingw32/
38
+ RbConfig::CONFIG['target_os'] =~ /mswin|mingw/
39
+ end
40
+
41
+ # GNU MinGW compiled Ruby?
42
+ def self.mingw?
43
+ RbConfig::CONFIG['target_os'] =~ /mingw/
38
44
  end
39
45
 
40
- def initialize(name, version)
46
+ # MS Visual-C compiled Ruby?
47
+ def self.mswin?
48
+ RbConfig::CONFIG['target_os'] =~ /mswin/
49
+ end
50
+
51
+ def initialize(name, version, **kwargs)
41
52
  @name = name
42
53
  @version = version
43
54
  @target = 'ports'
@@ -45,8 +56,25 @@ class MiniPortile
45
56
  @patch_files = []
46
57
  @log_files = {}
47
58
  @logger = STDOUT
59
+ @source_directory = nil
48
60
 
49
61
  @original_host = @host = detect_host
62
+
63
+ @gcc_command = kwargs[:gcc_command]
64
+ @make_command = kwargs[:make_command]
65
+ @open_timeout = kwargs[:open_timeout] || DEFAULT_TIMEOUT
66
+ @read_timeout = kwargs[:read_timeout] || DEFAULT_TIMEOUT
67
+ end
68
+
69
+ def source_directory=(path)
70
+ @source_directory = posix_path(path)
71
+ end
72
+
73
+ def prepare_build_directory
74
+ raise "source_directory is not set" if source_directory.nil?
75
+ output "Building #{@name} from source at '#{source_directory}'"
76
+ FileUtils.mkdir_p(File.join(tmp_path, [name, version].join("-")))
77
+ FileUtils.rm_rf(port_path) # make sure we always re-install
50
78
  end
51
79
 
52
80
  def download
@@ -71,9 +99,9 @@ class MiniPortile
71
99
  when which('git')
72
100
  lambda { |file|
73
101
  message "Running git apply with #{file}... "
74
- # By --work-tree=. git-apply uses the current directory as
75
- # the project root and will not search upwards for .git.
76
- execute('patch', ["git", "--git-dir=.", "--work-tree=.", "apply", "--whitespace=warn", file], :initial_message => false)
102
+ Dir.mktmpdir do |tmp_git_dir|
103
+ execute('patch', ["git", "--git-dir=#{tmp_git_dir}", "--work-tree=.", "apply", "--whitespace=warn", file], :initial_message => false)
104
+ end
77
105
  }
78
106
  when which('patch')
79
107
  lambda { |file|
@@ -100,15 +128,16 @@ class MiniPortile
100
128
  def configure
101
129
  return if configured?
102
130
 
131
+ FileUtils.mkdir_p(tmp_path)
103
132
  cache_file = File.join(tmp_path, 'configure.options_cache')
104
133
  File.open(cache_file, "w") { |f| f.write computed_options.to_s }
105
134
 
135
+ command = Array(File.join((source_directory || "."), "configure"))
106
136
  if RUBY_PLATFORM=~/mingw|mswin/
107
137
  # Windows doesn't recognize the shebang.
108
- execute('configure', %w(sh ./configure) + computed_options)
109
- else
110
- execute('configure', %w(./configure) + computed_options)
138
+ command.unshift("sh")
111
139
  end
140
+ execute('configure', command + computed_options, altlog: "config.log")
112
141
  end
113
142
 
114
143
  def compile
@@ -129,7 +158,7 @@ class MiniPortile
129
158
  end
130
159
 
131
160
  def configured?
132
- configure = File.join(work_path, 'configure')
161
+ configure = File.join((source_directory || work_path), 'configure')
133
162
  makefile = File.join(work_path, 'Makefile')
134
163
  cache_file = File.join(tmp_path, 'configure.options_cache')
135
164
 
@@ -147,9 +176,13 @@ class MiniPortile
147
176
  end
148
177
 
149
178
  def cook
150
- download unless downloaded?
151
- extract
152
- patch
179
+ if source_directory
180
+ prepare_build_directory
181
+ else
182
+ download unless downloaded?
183
+ extract
184
+ patch
185
+ end
153
186
  configure unless configured?
154
187
  compile
155
188
  install unless installed?
@@ -167,10 +200,7 @@ class MiniPortile
167
200
 
168
201
  output "Activating #{@name} #{@version} (from #{port_path})..."
169
202
  vars.each do |var, path|
170
- full_path = File.expand_path(path)
171
-
172
- # turn into a valid Windows path (if required)
173
- full_path.gsub!(File::SEPARATOR, File::ALT_SEPARATOR) if File::ALT_SEPARATOR
203
+ full_path = native_path(path)
174
204
 
175
205
  # save current variable value
176
206
  old_value = ENV[var] || ''
@@ -196,7 +226,33 @@ class MiniPortile
196
226
  File.expand_path(port_path)
197
227
  end
198
228
 
199
- private
229
+ def gcc_cmd
230
+ (ENV["CC"] || @gcc_command || RbConfig::CONFIG["CC"] || "gcc").dup
231
+ end
232
+
233
+ def make_cmd
234
+ (ENV["MAKE"] || @make_command || ENV["make"] || "make").dup
235
+ end
236
+
237
+ private
238
+
239
+ def native_path(path)
240
+ path = File.expand_path(path)
241
+ if File::ALT_SEPARATOR
242
+ path.tr(File::SEPARATOR, File::ALT_SEPARATOR)
243
+ else
244
+ path
245
+ end
246
+ end
247
+
248
+ def posix_path(path)
249
+ path = File.expand_path(path)
250
+ if File::ALT_SEPARATOR
251
+ "/" + path.tr(File::ALT_SEPARATOR, File::SEPARATOR).tr(":", File::SEPARATOR)
252
+ else
253
+ path
254
+ end
255
+ end
200
256
 
201
257
  def tmp_path
202
258
  "tmp/#{@host}/ports/#{@name}/#{@version}"
@@ -270,15 +326,18 @@ private
270
326
  io.close_write
271
327
  io.read
272
328
  end
273
- raise "invalid gpg key provided" unless /\[GNUPG:\] IMPORT_OK \d+ (?<key_id>[0-9a-f]+)/i =~ gpg_status
329
+ key_ids = gpg_status.scan(/\[GNUPG:\] IMPORT_OK \d+ (?<key_id>[0-9a-f]+)/i).map(&:first)
330
+ raise "invalid gpg key provided" if key_ids.empty?
274
331
 
275
332
  # verify the signature against our keyring
276
333
  gpg_status = IO.popen([gpg_exe, "--status-fd", "1", "--no-default-keyring", "--keyring", KEYRING_NAME, "--verify", signature_file, file[:local_path]], &:read)
277
334
 
278
335
  # remove the key from our keyring
279
- IO.popen([gpg_exe, "--batch", "--yes", "--no-default-keyring", "--keyring", KEYRING_NAME, "--delete-keys", key_id], &:read)
336
+ key_ids.each do |key_id|
337
+ IO.popen([gpg_exe, "--batch", "--yes", "--no-default-keyring", "--keyring", KEYRING_NAME, "--delete-keys", key_id], &:read)
338
+ raise "unable to delete the imported key" unless $?.exitstatus==0
339
+ end
280
340
 
281
- raise "unable to delete the imported key" unless $?.exitstatus==0
282
341
  raise "signature mismatch" unless gpg_status.match(/^\[GNUPG:\] VALIDSIG/)
283
342
 
284
343
  else
@@ -318,6 +377,8 @@ private
318
377
  'z'
319
378
  when '.bz2', '.tbz2'
320
379
  'j'
380
+ when '.xz'
381
+ 'J'
321
382
  when '.Z'
322
383
  'Z'
323
384
  else
@@ -367,24 +428,37 @@ private
367
428
  execute('extract', [tar_exe, "#{tar_compression_switch(filename)}xf", file, "-C", target], {:cd => Dir.pwd, :initial_message => false})
368
429
  end
369
430
 
370
- def execute(action, command, options={})
371
- log_out = log_file(action)
431
+ # command could be an array of args, or one string containing a command passed to the shell. See
432
+ # Process.spawn for more information.
433
+ def execute(action, command, command_opts={})
434
+ opt_message = command_opts.fetch(:initial_message, true)
435
+ opt_debug = command_opts.fetch(:debug, false)
436
+ opt_cd = command_opts.fetch(:cd) { work_path }
437
+ opt_env = command_opts.fetch(:env) { Hash.new }
438
+ opt_altlog = command_opts.fetch(:altlog, nil)
372
439
 
373
- Dir.chdir (options.fetch(:cd){ work_path }) do
374
- if options.fetch(:initial_message){ true }
375
- message "Running '#{action}' for #{@name} #{@version}... "
376
- end
440
+ log_out = log_file(action)
441
+
442
+ Dir.chdir(opt_cd) do
443
+ output "DEBUG: env is #{opt_env.inspect}" if opt_debug
444
+ output "DEBUG: command is #{command.inspect}" if opt_debug
445
+ message "Running '#{action}' for #{@name} #{@version}... " if opt_message
377
446
 
378
447
  if Process.respond_to?(:spawn) && ! RbConfig.respond_to?(:java)
379
- args = [command].flatten + [{[:out, :err]=>[log_out, "a"]}]
448
+ options = {[:out, :err]=>[log_out, "a"]}
449
+ output "DEBUG: options are #{options.inspect}" if opt_debug
450
+ args = [opt_env, command, options].flatten
380
451
  pid = spawn(*args)
381
452
  Process.wait(pid)
382
453
  else
383
- redirected = if command.kind_of?(Array)
384
- %Q{#{command.map(&:shellescape).join(" ")} > #{log_out.shellescape} 2>&1}
385
- else
386
- %Q{#{command} > #{log_out.shellescape} 2>&1}
387
- end
454
+ env_args = opt_env.map { |k,v| "#{k}=#{v}".shellescape }.join(" ")
455
+ c = if command.kind_of?(Array)
456
+ command.map(&:shellescape).join(" ")
457
+ else
458
+ command
459
+ end
460
+ redirected = %Q{env #{env_args} #{c} > #{log_out.shellescape} 2>&1}
461
+ output "DEBUG: final command is #{redirected.inspect}" if opt_debug
388
462
  system redirected
389
463
  end
390
464
 
@@ -392,12 +466,12 @@ private
392
466
  output "OK"
393
467
  return true
394
468
  else
395
- if File.exist? log_out
396
- output "ERROR, review '#{log_out}' to see what happened. Last lines are:"
397
- output("=" * 72)
398
- log_lines = File.readlines(log_out)
399
- output(log_lines[-[log_lines.length, 20].min .. -1])
400
- output("=" * 72)
469
+ output "ERROR. Please review logs to see what happened:\n"
470
+ [log_out, opt_altlog].compact.each do |log|
471
+ next unless File.exist?(log)
472
+ output("----- contents of '#{log}' -----")
473
+ output(File.read(log))
474
+ output("----- end of file -----")
401
475
  end
402
476
  raise "Failed to complete #{action} task"
403
477
  end
@@ -448,7 +522,6 @@ private
448
522
  def download_file_http(url, full_path, count = 3)
449
523
  filename = File.basename(full_path)
450
524
  with_tempfile(filename, full_path) do |temp_file|
451
- progress = 0
452
525
  total = 0
453
526
  params = {
454
527
  "Accept-Encoding" => 'identity',
@@ -457,12 +530,13 @@ private
457
530
  if total
458
531
  new_progress = (bytes * 100) / total
459
532
  message "\rDownloading %s (%3d%%) " % [filename, new_progress]
460
- progress = new_progress
461
533
  else
462
534
  # Content-Length is unavailable because Transfer-Encoding is chunked
463
535
  message "\rDownloading %s " % [filename]
464
536
  end
465
- }
537
+ },
538
+ :open_timeout => @open_timeout,
539
+ :read_timeout => @read_timeout,
466
540
  }
467
541
  proxy_uri = URI.parse(url).scheme.downcase == 'https' ?
468
542
  ENV["https_proxy"] :
@@ -487,7 +561,7 @@ private
487
561
  return download_file(redirect.url, full_path, count-1)
488
562
  rescue => e
489
563
  count = count - 1
490
- puts "#{count} retrie(s) left for #{filename}"
564
+ puts "#{count} retrie(s) left for #{filename} (#{e.message})"
491
565
  if count > 0
492
566
  sleep 1
493
567
  return download_file_http(url, full_path, count)
@@ -505,17 +579,18 @@ private
505
579
  end
506
580
 
507
581
  def download_file_ftp(uri, full_path)
582
+ require "net/ftp"
508
583
  filename = File.basename(uri.path)
509
584
  with_tempfile(filename, full_path) do |temp_file|
510
- progress = 0
511
585
  total = 0
512
586
  params = {
513
587
  :content_length_proc => lambda{|length| total = length },
514
588
  :progress_proc => lambda{|bytes|
515
589
  new_progress = (bytes * 100) / total
516
590
  message "\rDownloading %s (%3d%%) " % [filename, new_progress]
517
- progress = new_progress
518
- }
591
+ },
592
+ :open_timeout => @open_timeout,
593
+ :read_timeout => @read_timeout,
519
594
  }
520
595
  if ENV["ftp_proxy"]
521
596
  _, userinfo, _p_host, _p_port = URI.split(ENV['ftp_proxy'])
@@ -530,6 +605,8 @@ private
530
605
  end
531
606
  output
532
607
  end
608
+ rescue LoadError
609
+ raise LoadError, "Ruby #{RUBY_VERSION} does not provide the net-ftp gem, please add it as a dependency if you need to use FTP"
533
610
  rescue Net::FTPError
534
611
  return false
535
612
  end
@@ -543,14 +620,4 @@ private
543
620
  FileUtils.mkdir_p File.dirname(full_path)
544
621
  FileUtils.mv temp_file.path, full_path, :force => true
545
622
  end
546
-
547
- def gcc_cmd
548
- cc = ENV["CC"] || RbConfig::CONFIG["CC"] || "gcc"
549
- return cc.dup
550
- end
551
-
552
- def make_cmd
553
- m = ENV['MAKE'] || ENV['make'] || 'make'
554
- return m.dup
555
- end
556
623
  end
@@ -5,9 +5,16 @@ class MiniPortileCMake < MiniPortile
5
5
  "-DCMAKE_INSTALL_PREFIX=#{File.expand_path(port_path)}"
6
6
  end
7
7
 
8
+ def initialize(name, version, **kwargs)
9
+ super(name, version, **kwargs)
10
+ @cmake_command = kwargs[:cmake_command]
11
+ end
12
+
8
13
  def configure_defaults
9
- if MiniPortile.windows?
10
- ['-G "NMake Makefiles"']
14
+ if MiniPortile.mswin?
15
+ ['-G', 'NMake Makefiles']
16
+ elsif MiniPortile.mingw?
17
+ ['-G', 'MSYS Makefiles']
11
18
  else
12
19
  []
13
20
  end
@@ -19,7 +26,7 @@ class MiniPortileCMake < MiniPortile
19
26
  cache_file = File.join(tmp_path, 'configure.options_cache')
20
27
  File.open(cache_file, "w") { |f| f.write computed_options.to_s }
21
28
 
22
- execute('configure', %w(cmake) + computed_options + ["."])
29
+ execute('configure', [cmake_cmd] + computed_options + ["."])
23
30
  end
24
31
 
25
32
  def configured?
@@ -34,7 +41,11 @@ class MiniPortileCMake < MiniPortile
34
41
  end
35
42
 
36
43
  def make_cmd
37
- return "nmake" if MiniPortile.windows?
44
+ return "nmake" if MiniPortile.mswin?
38
45
  super
39
46
  end
47
+
48
+ def cmake_cmd
49
+ (ENV["CMAKE"] || @cmake_command || "cmake").dup
50
+ end
40
51
  end
@@ -1,3 +1,3 @@
1
1
  class MiniPortile
2
- VERSION = "2.4.0"
2
+ VERSION = "2.8.2"
3
3
  end
@@ -1,42 +1,42 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'mini_portile2/version'
4
+ require "mini_portile2/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "mini_portile2"
8
- spec.version = MiniPortile::VERSION
7
+ spec.name = "mini_portile2"
8
+ spec.version = MiniPortile::VERSION
9
9
 
10
- spec.authors = ['Luis Lavena', 'Mike Dalessio', 'Lars Kanis']
11
- spec.email = 'mike.dalessio@gmail.com'
10
+ spec.authors = ["Luis Lavena", "Mike Dalessio", "Lars Kanis"]
11
+ spec.email = "mike.dalessio@gmail.com"
12
12
 
13
- spec.summary = "Simplistic port-like solution for developers"
14
- spec.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system."
13
+ spec.summary = "Simplistic port-like solution for developers"
14
+ spec.description = "Simplistic port-like solution for developers. It provides a standard and simplified way to compile against dependency libraries without messing up your system."
15
15
 
16
- spec.homepage = 'http://github.com/flavorjones/mini_portile'
17
- spec.licenses = ['MIT']
16
+ spec.homepage = "https://github.com/flavorjones/mini_portile"
17
+ spec.licenses = ["MIT"]
18
18
 
19
19
  begin
20
- spec.files = `git ls-files -z`.split("\x0")
20
+ spec.files = `git ls-files -z`.split("\x0")
21
21
  rescue Exception => e
22
22
  warn "WARNING: could not set spec.files: #{e.class}: #{e}"
23
23
  end
24
24
 
25
25
  # omit the `examples` directory from the gem, because it's large and
26
26
  # not necessary to be packaged in the gem.
27
- example_files = spec.files.grep(%r{^examples/})
27
+ example_files = spec.files.grep(%r{^examples/})
28
28
  spec.files -= example_files
29
29
 
30
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
- spec.test_files = spec.files.grep(%r{^(test|spec|features|examples)/})
30
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
31
+ spec.test_files = spec.files.grep(%r{^(test|spec|features|examples)/})
32
32
  spec.require_paths = ["lib"]
33
33
 
34
- spec.add_development_dependency "bundler", "~> 1.17"
35
- spec.add_development_dependency "rake", "~> 12.0"
36
- spec.add_development_dependency "minitest", "~> 5.11"
37
- spec.add_development_dependency "minitest-hooks", "~> 1.5.0"
38
- spec.add_development_dependency "minitar", "~> 0.7"
39
- spec.add_development_dependency "concourse", "~> 0.16"
34
+ spec.required_ruby_version = ">= 2.3.0"
40
35
 
41
- spec.required_ruby_version = ">= 1.9.2"
36
+ spec.add_development_dependency "bundler", "~> 2.2"
37
+ spec.add_development_dependency "minitar", "~> 0.9"
38
+ spec.add_development_dependency "minitest", "~> 5.15"
39
+ spec.add_development_dependency "minitest-hooks", "~> 1.5"
40
+ spec.add_development_dependency "rake", "~> 13.0"
41
+ spec.add_development_dependency "webrick", "~> 1.7"
42
42
  end
data/test/helper.rb CHANGED
@@ -57,4 +57,20 @@ class TestCase < Minitest::Test
57
57
  ensure
58
58
  ENV['GIT_DIR'] = old
59
59
  end
60
+
61
+ def with_env(env)
62
+ before = ENV.to_h.dup
63
+ env.each { |k, v| ENV[k] = v }
64
+ yield
65
+ ensure
66
+ ENV.replace(before)
67
+ end
68
+
69
+ def without_env(*keys, &blk)
70
+ before = ENV.to_h.dup
71
+ keys.flatten.each { |k| ENV.delete(k) }
72
+ yield
73
+ ensure
74
+ ENV.replace(before)
75
+ end
60
76
  end
data/test/test_cmake.rb CHANGED
@@ -5,8 +5,6 @@ class TestCMake < TestCase
5
5
 
6
6
  def before_all
7
7
  super
8
- return if MiniPortile.windows?
9
-
10
8
  @assets_path = File.expand_path("../assets", __FILE__)
11
9
  @tar_path = File.expand_path("../../tmp/test-cmake-1.0.tar.gz", __FILE__)
12
10
 
@@ -19,7 +17,6 @@ class TestCMake < TestCase
19
17
  @recipe = MiniPortileCMake.new("test-cmake", "1.0").tap do |recipe|
20
18
  recipe.files << "http://localhost:#{HTTP_PORT}/#{ERB::Util.url_encode(File.basename(@tar_path))}"
21
19
  recipe.patch_files << File.join(@assets_path, "patch 1.diff")
22
- recipe.configure_options << "--option=\"path with 'space'\""
23
20
  git_dir = File.join(@assets_path, "git")
24
21
  with_custom_git_dir(git_dir) do
25
22
  recipe.cook
@@ -29,19 +26,22 @@ class TestCMake < TestCase
29
26
 
30
27
  def after_all
31
28
  super
32
- return if MiniPortile.windows?
33
-
34
29
  stop_webrick
35
30
  # leave test files for inspection
36
31
  end
37
32
 
33
+ def exe_name
34
+ case
35
+ when MiniPortile.windows? then "hello.exe"
36
+ else "hello"
37
+ end
38
+ end
39
+
38
40
  def test_cmake_inherits_from_base
39
41
  assert(MiniPortileCMake <= MiniPortile)
40
42
  end
41
43
 
42
44
  def test_configure
43
- skip if MiniPortile.windows?
44
-
45
45
  cmakecache = File.join(work_dir, "CMakeCache.txt")
46
46
  assert File.exist?(cmakecache), cmakecache
47
47
 
@@ -49,16 +49,42 @@ class TestCMake < TestCase
49
49
  end
50
50
 
51
51
  def test_compile
52
- skip if MiniPortile.windows?
53
-
54
- binary = File.join(work_dir, "hello")
52
+ binary = File.join(work_dir, exe_name)
55
53
  assert File.exist?(binary), binary
56
54
  end
57
55
 
58
56
  def test_install
59
- skip if MiniPortile.windows?
60
-
61
- binary = File.join(recipe.path, "bin", "hello")
57
+ binary = File.join(recipe.path, "bin", exe_name)
62
58
  assert File.exist?(binary), binary
63
59
  end
64
60
  end
61
+
62
+ class TestCMakeConfig < TestCase
63
+ def test_make_command_configuration
64
+ MiniPortile.stub(:mswin?, false) do
65
+ without_env("MAKE") do
66
+ assert_equal("make", MiniPortileCMake.new("test", "1.0.0").make_cmd)
67
+ assert_equal("xyzzy", MiniPortileCMake.new("test", "1.0.0", make_command: "xyzzy").make_cmd)
68
+ end
69
+ with_env("MAKE"=>"asdf") do
70
+ assert_equal("asdf", MiniPortileCMake.new("test", "1.0.0").make_cmd)
71
+ assert_equal("asdf", MiniPortileCMake.new("test", "1.0.0", make_command: "xyzzy").make_cmd)
72
+ end
73
+ end
74
+
75
+ MiniPortile.stub(:mswin?, true) do
76
+ assert_equal("nmake", MiniPortileCMake.new("test", "1.0.0").make_cmd)
77
+ end
78
+ end
79
+
80
+ def test_cmake_command_configuration
81
+ without_env("CMAKE") do
82
+ assert_equal("cmake", MiniPortileCMake.new("test", "1.0.0").cmake_cmd)
83
+ assert_equal("xyzzy", MiniPortileCMake.new("test", "1.0.0", cmake_command: "xyzzy").cmake_cmd)
84
+ end
85
+ with_env("CMAKE"=>"asdf") do
86
+ assert_equal("asdf", MiniPortileCMake.new("test", "1.0.0").cmake_cmd)
87
+ assert_equal("asdf", MiniPortileCMake.new("test", "1.0.0", cmake_command: "xyzzy").cmake_cmd)
88
+ end
89
+ end
90
+ end
data/test/test_cook.rb CHANGED
@@ -67,6 +67,32 @@ class TestCook < TestCase
67
67
  end
68
68
  end
69
69
 
70
+ class TestCookConfiguration < TestCase
71
+ def test_make_command_configuration
72
+ without_env("MAKE") do
73
+ assert_equal("make", MiniPortile.new("test", "1.0.0").make_cmd)
74
+ assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", make_command: "xyzzy").make_cmd)
75
+ end
76
+ with_env("MAKE"=>"asdf") do
77
+ assert_equal("asdf", MiniPortile.new("test", "1.0.0").make_cmd)
78
+ assert_equal("asdf", MiniPortile.new("test", "1.0.0", make_command: "xyzzy").make_cmd)
79
+ end
80
+ end
81
+
82
+ def test_gcc_command_configuration
83
+ without_env("CC") do
84
+ expected_compiler = RbConfig::CONFIG["CC"] || "gcc"
85
+ assert_equal(expected_compiler, MiniPortile.new("test", "1.0.0").gcc_cmd)
86
+ assert_equal("xyzzy", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").gcc_cmd)
87
+ end
88
+ with_env("CC"=>"asdf") do
89
+ assert_equal("asdf", MiniPortile.new("test", "1.0.0").gcc_cmd)
90
+ assert_equal("asdf", MiniPortile.new("test", "1.0.0", gcc_command: "xyzzy").gcc_cmd)
91
+ end
92
+ end
93
+ end
94
+
95
+
70
96
  class TestCookWithBrokenGitDir < TestCase
71
97
  #
72
98
  # this is a test for #69
@@ -113,3 +139,32 @@ class TestCookWithBrokenGitDir < TestCase
113
139
  end
114
140
  end
115
141
  end
142
+
143
+ class TestCookAgainstSourceDirectory < TestCase
144
+ attr_accessor :recipe
145
+
146
+ def setup
147
+ super
148
+
149
+ @recipe ||= MiniPortile.new("test mini portile", "1.0.0").tap do |recipe|
150
+ recipe.source_directory = File.expand_path("../assets/test mini portile-1.0.0", __FILE__)
151
+ end
152
+ end
153
+
154
+ def test_source_directory
155
+ recipe.cook
156
+
157
+ path = File.join(work_dir, "configure.txt")
158
+ assert(File.exist?(path))
159
+ assert_equal((recipe.configure_options + ["--prefix=#{recipe.path}"]).inspect,
160
+ File.read(path).chomp);
161
+
162
+ path = File.join(work_dir, "compile.txt")
163
+ assert(File.exist?(path))
164
+ assert_equal("[\"all\"]", File.read(path).chomp);
165
+
166
+ path = File.join(work_dir, "install.txt")
167
+ assert(File.exist?(path))
168
+ assert_equal("[\"install\"]", File.read(path).chomp);
169
+ end
170
+ end
@@ -18,10 +18,12 @@ describe "recipe download" do
18
18
  end
19
19
  end
20
20
 
21
- block.call
22
-
23
- thread.kill
24
- server.close
21
+ begin
22
+ block.call
23
+ ensure
24
+ thread.kill
25
+ server.close
26
+ end
25
27
 
26
28
  request_count.must_be :>, 0
27
29
  end
@@ -60,7 +62,7 @@ describe "recipe download" do
60
62
  @recipe.files << "file://#{path}"
61
63
  @recipe.download
62
64
  assert File.exist?(dest)
63
- Digest::MD5.file(dest).hexdigest.must_equal "5deffb997041bbb5f11bdcafdbb47975"
65
+ Digest::MD5.file(dest).hexdigest.must_equal "ee0e9f44e72213015ef976d5ac23931d"
64
66
  end
65
67
 
66
68
  it "other" do