mason 0.0.11 → 0.0.12

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/README.md CHANGED
@@ -52,16 +52,16 @@ You will need [VirtualBox](https://www.virtualbox.org/wiki/Downloads) for Vagran
52
52
 
53
53
  $ gem install vagrant
54
54
 
55
- $ vagrant box add cedar http://path/to/cedar.box
55
+ $ vagrant box add lucid64 http://files.vagrantup.com/lucid64.box
56
56
 
57
- $ mason stacks:create cedar
58
- * creating stack cedar... done
57
+ $ mason stacks:create lucid64
58
+ * creating stack lucid64... done
59
59
 
60
- $ mason stacks:up cedar
61
- * booting stack cedar (this may take a while)... done
60
+ $ mason stacks:up lucid64
61
+ * booting stack lucid64 (this may take a while)... done
62
62
 
63
- $ mason:build /tmp/app -t tgz -o /tmp/compiled.tgz -s cedar
64
- * booting stack cedar (this may take a while)... done
63
+ $ mason:build /tmp/app -t tgz -o /tmp/compiled.tgz -s lucid64
64
+ * booting stack lucid64 (this may take a while)... done
65
65
  * detecting buildpack... done
66
66
  = name: Baz
67
67
  = url: https://github.com/ddollar/buildpack-baz.git
@@ -1,5 +1,7 @@
1
1
  require "mason"
2
2
  require "tmpdir"
3
+ require "yaml"
4
+ require "foreman/engine"
3
5
 
4
6
  class Mason::Buildpack
5
7
 
@@ -24,31 +26,61 @@ class Mason::Buildpack
24
26
  end
25
27
  end
26
28
 
27
- def compile(app)
28
- mkchtmpdir do |cache_dir|
29
- compile_dir = Dir.mktmpdir
30
- FileUtils.rm_rf compile_dir
31
- FileUtils.cp_r app, compile_dir
32
- Dir.chdir(compile_dir) do
33
- IO.popen(%{ #{script("compile")} "#{compile_dir}" "#{cache_dir}" }) do |io|
34
- until io.eof?
35
- data = io.gets
36
- data.gsub!(/^-----> /, " + ")
37
- data.gsub!(/^ /, " ")
38
- data.gsub!(/^\s+\!\s+$/, "")
39
- data.gsub!(/^\s+\!\s+/, " ! ")
40
- data.gsub!(/^\s+$/, "")
41
- print data
42
- end
29
+ def compile(app, env_file=nil, cache=nil)
30
+ cache_dir = cache || "#{app}/.git/cache"
31
+ puts " caching in #{cache_dir}"
32
+ compile_dir = Dir.mktmpdir
33
+ FileUtils.rm_rf compile_dir
34
+ FileUtils.cp_r app, compile_dir, :preserve => true
35
+ FileUtils.mkdir_p cache_dir
36
+ Dir.chdir(compile_dir) do
37
+ IO.popen(%{ #{script("compile")} "#{compile_dir}" "#{cache_dir}" }) do |io|
38
+ until io.eof?
39
+ data = io.gets
40
+ data.gsub!(/^-----> /, " + ")
41
+ data.gsub!(/^ /, " ")
42
+ data.gsub!(/^\s+\!\s+$/, "")
43
+ data.gsub!(/^\s+\!\s+/, " ! ")
44
+ data.gsub!(/^\s+$/, "")
45
+ print data
43
46
  end
44
- raise "compile failed" unless $?.exitstatus.zero?
45
47
  end
46
- compile_dir
48
+ raise "compile failed" unless $?.exitstatus.zero?
47
49
  end
50
+ release = YAML.load(`#{script('release')}`)
51
+ write_env(compile_dir, release, env_file)
52
+ write_procfile(compile_dir, release)
53
+ compile_dir
48
54
  end
49
55
 
50
56
  private
51
57
 
58
+ def write_env(compile_dir, release, env_file)
59
+ env = env_file ? Foreman::Engine.read_environment(env_file) : {}
60
+ config = release["config_vars"].merge(env)
61
+
62
+ File.open(File.join(compile_dir, ".env"), "w") do |f|
63
+ f.puts config.map{|k, v| "#{k}=#{v}"}.join("\n")
64
+ end
65
+ end
66
+
67
+ def write_procfile(compile_dir, release)
68
+ filename = File.join(compile_dir, "Procfile")
69
+ process_types = release["default_process_types"] || {}
70
+
71
+ if File.exists? filename
72
+ Foreman::Procfile.new(filename).entries.each do |e|
73
+ process_types[e.name] = e.command
74
+ end
75
+ end
76
+
77
+ File.open(filename, "w") do |f|
78
+ process_types.each do |name, command|
79
+ f.puts "#{name}: #{command}"
80
+ end
81
+ end
82
+ end
83
+
52
84
  def mkchtmpdir
53
85
  ret = nil
54
86
  Dir.mktmpdir do |dir|
@@ -62,6 +94,5 @@ private
62
94
  def script(name)
63
95
  File.join(dir, "bin", name)
64
96
  end
65
-
66
97
  end
67
98
 
@@ -2,18 +2,31 @@ require "fileutils"
2
2
  require "mason"
3
3
  require "mason/buildpack"
4
4
  require "uri"
5
+ require "digest/sha1"
5
6
 
6
7
  class Mason::Buildpacks
7
8
 
8
- def self.install(url)
9
- FileUtils.mkdir_p root
9
+ def self.install(url, ad_hoc=false)
10
+ root_dir = ad_hoc ? ad_hoc_root : root
11
+ FileUtils.mkdir_p root_dir
10
12
 
11
- Dir.chdir(root) do
12
- if URI.parse(url).path =~ /buildpack-(\w+)/
13
+ Dir.chdir(root_dir) do
14
+ uri = URI.parse(url)
15
+ if uri.path =~ /buildpack-(\w+)/
13
16
  name = $1
14
- raise "#{name} buildpack already installed" if File.exists?(name)
15
- system "git clone #{url} #{name} >/dev/null 2>&1"
16
- raise "failed to clone buildpack" unless $?.exitstatus.zero?
17
+ name += "-#{Digest::SHA1.hexdigest(url).to_s[0 .. 8]}" if ad_hoc
18
+ branch = uri.fragment || "master"
19
+ if File.exists?(name)
20
+ # Can't do a fetch here as it won't update local branches
21
+ system "cd #{name} && git checkout master && git pull"
22
+ raise "failed to update buildpack checkout" unless $?.exitstatus.zero?
23
+ else
24
+ system "git clone #{url.split('#').first} #{name} >/dev/null 2>&1"
25
+ raise "failed to clone buildpack" unless $?.exitstatus.zero?
26
+ end
27
+ system "cd #{name} && git checkout #{branch} 2> /dev/null"
28
+ raise "failed to check out branch #{branch}" unless $?.exitstatus.zero?
29
+ File.expand_path(root_dir + "/" + name)
17
30
  else
18
31
  raise "BUILDPACK should be a url containing buildpack-NAME.git"
19
32
  end
@@ -27,11 +40,16 @@ class Mason::Buildpacks
27
40
  end
28
41
  end
29
42
 
30
- def self.root(expand=true)
43
+ def self.root(ad_hoc=false, expand=true)
31
44
  dir = "~/.mason/buildpacks"
32
45
  expand ? File.expand_path(dir) : dir
33
46
  end
34
47
 
48
+ def self.ad_hoc_root(expand=true)
49
+ dir = "~/.mason/buildpacks-ad-hoc"
50
+ expand ? File.expand_path(dir) : dir
51
+ end
52
+
35
53
  def self.buildpacks
36
54
  @buildpacks ||= begin
37
55
  Dir[File.join(root, "*")].map do |buildpack_dir|
@@ -40,10 +58,16 @@ class Mason::Buildpacks
40
58
  end
41
59
  end
42
60
 
43
- def self.detect(app)
44
- buildpacks.each do |buildpack|
45
- ret = buildpack.detect(app)
46
- return [buildpack, ret] if ret
61
+ def self.detect(app, buildpack_url)
62
+ if buildpack_url
63
+ puts "Using $BUILDPACK_URL: #{buildpack_url}"
64
+ buildpack_dir = install(buildpack_url, true)
65
+ return Mason::Buildpack.new(buildpack_dir)
66
+ else
67
+ buildpacks.each do |buildpack|
68
+ ret = buildpack.detect(app)
69
+ return [buildpack, ret] if ret
70
+ end
47
71
  end
48
72
  nil
49
73
  end
data/lib/mason/cli.rb CHANGED
@@ -25,6 +25,8 @@ class Mason::CLI < Thor
25
25
  method_option :quiet, :type => :boolean, :aliases => "-q", :desc => "quiet packaging output"
26
26
  method_option :stack, :type => :string, :aliases => "-s", :desc => "use a stack for building"
27
27
  method_option :type, :type => :string, :aliases => "-t", :desc => "output type (dir, img, tgz)"
28
+ method_option :env_file, :type => :string, :aliases => "-e", :desc => "config environment file"
29
+ method_option :cache, :type => :string, :aliases => "-c", :desc => "cache directory"
28
30
 
29
31
  def build(app)
30
32
  app = File.expand_path(app)
@@ -57,9 +59,11 @@ class Mason::CLI < Thor
57
59
  FileUtils.rm_rf compile_dir
58
60
  FileUtils.rm_rf mason_dir
59
61
 
60
- FileUtils.cp_r File.expand_path("~/.mason/buildpacks"), buildpacks_dir
61
- FileUtils.cp_r app, compile_dir
62
- FileUtils.cp_r File.expand_path("../../../", __FILE__), mason_dir
62
+ FileUtils.cp_r(File.expand_path("~/.mason/buildpacks"), buildpacks_dir,
63
+ :preserve => true)
64
+ FileUtils.cp_r(File.expand_path("../../../", __FILE__), mason_dir,
65
+ :preserve => true)
66
+ FileUtils.cp_r(app, compile_dir, :preserve => true)
63
67
 
64
68
  mason_args = %{ /share/app -q -o /share/output -t #{type} }
65
69
  mason_args += %{ -b "#{options[:buildpack]}" } if options[:buildpack]
@@ -70,7 +74,8 @@ class Mason::CLI < Thor
70
74
  COMMAND
71
75
 
72
76
  FileUrils.rm_rf output
73
- FileUtils.cp_r File.expand_path("~/.mason/share/#{stack}/output"), output
77
+ FileUtils.cp_r(File.expand_path("~/.mason/share/#{stack}/output"), output,
78
+ :preserve => true)
74
79
 
75
80
  puts "* packaging"
76
81
  puts " = type: #{type}"
@@ -78,7 +83,8 @@ class Mason::CLI < Thor
78
83
  else
79
84
  print "* detecting buildpack... "
80
85
 
81
- buildpack, ret = Mason::Buildpacks.detect(app)
86
+ buildpack_url = ENV["BUILDPACK_URL"] || options[:buildpack]
87
+ buildpack, ret = Mason::Buildpacks.detect(app, buildpack_url)
82
88
  raise "no valid buildpack detected" unless buildpack
83
89
 
84
90
  puts "done"
@@ -87,7 +93,7 @@ class Mason::CLI < Thor
87
93
  puts " = display: #{ret}"
88
94
 
89
95
  puts "* compiling..."
90
- compile_dir = buildpack.compile(app)
96
+ compile_dir = buildpack.compile(app, options[:env_file], options[:cache])
91
97
 
92
98
  print "* packaging... " unless options[:quiet]
93
99
  case type.to_sym
@@ -99,7 +105,7 @@ class Mason::CLI < Thor
99
105
  raise "img not supported yet"
100
106
  when :dir then
101
107
  FileUtils.rm_rf output
102
- FileUtils.cp_r compile_dir, output
108
+ FileUtils.cp_r compile_dir, output, :preserve => true
103
109
  else
104
110
  raise "no such output type: #{type}"
105
111
  end
data/lib/mason/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Mason
2
- VERSION = "0.0.11"
2
+ VERSION = "0.0.12"
3
3
  end
metadata CHANGED
@@ -1,65 +1,84 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: mason
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.11
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 12
9
+ version: 0.0.12
6
10
  platform: ruby
7
- authors:
11
+ authors:
8
12
  - David Dollar
9
13
  autorequire:
10
14
  bindir: bin
11
15
  cert_chain: []
12
- date: 2012-03-19 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
16
+
17
+ date: 2012-04-25 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
15
21
  name: thor
16
- requirement: &70257394090020 !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
22
31
  type: :runtime
23
- prerelease: false
24
- version_requirements: *70257394090020
32
+ version_requirements: *id001
25
33
  description: Build things
26
34
  email: ddollar@gmail.com
27
- executables:
35
+ executables:
28
36
  - mason
29
37
  extensions: []
38
+
30
39
  extra_rdoc_files: []
31
- files:
40
+
41
+ files:
42
+ - README.md
32
43
  - bin/mason
33
44
  - data/Vagrantfile.template
34
- - lib/mason/buildpack.rb
35
45
  - lib/mason/buildpacks.rb
46
+ - lib/mason/version.rb
36
47
  - lib/mason/cli.rb
48
+ - lib/mason/buildpack.rb
37
49
  - lib/mason/stacks.rb
38
- - lib/mason/version.rb
39
50
  - lib/mason.rb
40
- - README.md
51
+ has_rdoc: true
41
52
  homepage: http://github.com/ddollar/mason
42
53
  licenses: []
54
+
43
55
  post_install_message:
44
56
  rdoc_options: []
45
- require_paths:
57
+
58
+ require_paths:
46
59
  - lib
47
- required_ruby_version: !ruby/object:Gem::Requirement
60
+ required_ruby_version: !ruby/object:Gem::Requirement
48
61
  none: false
49
- requirements:
50
- - - ! '>='
51
- - !ruby/object:Gem::Version
52
- version: '0'
53
- required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ segments:
66
+ - 0
67
+ version: "0"
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
69
  none: false
55
- requirements:
56
- - - ! '>='
57
- - !ruby/object:Gem::Version
58
- version: '0'
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ version: "0"
59
76
  requirements: []
77
+
60
78
  rubyforge_project:
61
- rubygems_version: 1.8.11
79
+ rubygems_version: 1.3.7
62
80
  signing_key:
63
81
  specification_version: 3
64
82
  summary: Build things
65
83
  test_files: []
84
+