volley 0.1.0.alpha4 → 0.1.0.alpha5

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.
Files changed (48) hide show
  1. data/.gitignore +3 -1
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -1
  4. data/Rakefile +34 -0
  5. data/bin/volley +88 -40
  6. data/conf/common.volleyfile +12 -29
  7. data/features/publisher.feature +45 -0
  8. data/features/step_definitions/common_steps.rb +9 -0
  9. data/features/step_definitions/publisher_steps.rb +92 -0
  10. data/features/support/env.rb +19 -0
  11. data/init/Volleyfile +1 -104
  12. data/lib/volley/descriptor.rb +28 -0
  13. data/lib/volley/dsl/action.rb +31 -0
  14. data/lib/volley/dsl/argument.rb +96 -0
  15. data/lib/volley/dsl/file.rb +70 -0
  16. data/lib/volley/dsl/plan.rb +110 -235
  17. data/lib/volley/dsl/project.rb +10 -2
  18. data/lib/volley/dsl/pull_action.rb +50 -0
  19. data/lib/volley/dsl/push_action.rb +101 -0
  20. data/lib/volley/dsl/stage.rb +40 -0
  21. data/lib/volley/dsl.rb +7 -0
  22. data/lib/volley/log.rb +22 -8
  23. data/lib/volley/meta.rb +24 -0
  24. data/lib/volley/publisher/amazons3.rb +67 -66
  25. data/lib/volley/publisher/base.rb +81 -42
  26. data/lib/volley/publisher/exceptions.rb +7 -0
  27. data/lib/volley/publisher/local.rb +41 -27
  28. data/lib/volley/scm/base.rb +10 -0
  29. data/lib/volley.rb +38 -12
  30. data/spec/descriptor_spec.rb +39 -0
  31. data/spec/dsl_plan_spec.rb +103 -0
  32. data/spec/dsl_project_spec.rb +36 -0
  33. data/spec/dsl_volleyfile_spec.rb +21 -0
  34. data/spec/meta_spec.rb +26 -0
  35. data/spec/publisher_spec.rb +92 -0
  36. data/test/dsl/amazons3_publisher.volleyfile +6 -0
  37. data/test/dsl/local_publisher.volleyfile +4 -0
  38. data/test/dsl/log_console.volleyfile +2 -0
  39. data/test/dsl/log_file.volleyfile +2 -0
  40. data/test/dsl/simple.volleyfile +17 -0
  41. data/test/meta.yml +3 -0
  42. data/test/project/Rakefile +13 -0
  43. data/test/project/Volleyfile +18 -0
  44. data/test/trunk-1.tgz +0 -0
  45. data/volley.gemspec +2 -1
  46. metadata +67 -5
  47. data/lib/volley/config.rb +0 -8
  48. data/lib/volley/volley_file.rb +0 -45
@@ -0,0 +1,96 @@
1
+ module Volley
2
+ module Dsl
3
+ class Argument
4
+ attr_accessor :name
5
+ attr_accessor :value
6
+ attr_reader :default
7
+ attr_reader :convert
8
+ attr_reader :required
9
+
10
+ def initialize(name, options={ }, &block)
11
+ @name = name.to_sym
12
+ @block = block
13
+ @plan = options.delete(:plan)
14
+ @required = options.delete(:required)
15
+ @default = options.delete(:default)
16
+ @convert = options.delete(:convert)
17
+ @convopt = options.delete(:convert_opts) || {}
18
+ @choices = options.delete(:choices)
19
+
20
+ @value = @required ? nil : (@default || nil)
21
+
22
+ raise "plan instance must be set" unless @plan
23
+
24
+ #@plan.action "argument-#{name}", :pre do
25
+ # arguments[name.to_sym].handler
26
+ #end
27
+ end
28
+
29
+ def value=(value)
30
+ @value = value
31
+ @value ||= @default unless @default.nil?
32
+ raise "arg '#@name' is required, but not set" if @required && @value.nil?
33
+ if @convert.nil?
34
+ if block_given?
35
+ @value = yield @value
36
+ end
37
+ else
38
+ case @convert
39
+ when :boolean
40
+ @value = boolean(@value)
41
+ when :descriptor
42
+ @value = Volley::Descriptor.new(@value, @convopt)
43
+ else
44
+ @value = @value.send(@convert)
45
+ end
46
+ end
47
+ raise "arg '#@name' is required, but not set (after convert)" if @required && @value.nil?
48
+ raise "arg '#@name' should be one of #{@choices.inspect}" if @choices && !@choices.include?(@value)
49
+ end
50
+
51
+ def check
52
+ raise "arg '#@name' is required, but not set (in check)" if @required && @value.nil?
53
+ end
54
+
55
+ #def handler
56
+ # @value ||= @default unless @default.nil?
57
+ # raise "arg '#{@name}' is required, but not set" if @required && @value.nil?
58
+ # if @convert.nil?
59
+ # if block_given?
60
+ # @value = yield @value
61
+ # end
62
+ # else
63
+ # case @convert
64
+ # when :boolean
65
+ # @value = boolean(@value)
66
+ # when :descriptor
67
+ # opts = @convopt || {}
68
+ # @value = Volley::Descriptor.new(@value, @convopt)
69
+ # else
70
+ # @value = @value.send(@convert)
71
+ # end
72
+ # end
73
+ # raise "arg '#{name}' is required, but not set (after convert)" if @required && @value.nil?
74
+ # raise "arg '#{name}' should be one of #{@choices.inspect}" if @choices && !@choices.include?(@value)
75
+ #end
76
+
77
+ def usage
78
+ v = @choices || @convert || "string"
79
+ r = @required ? "*" : ""
80
+ d = @default ? "(#@default)" : ""
81
+ "#@name:#{v}#{r}#{d}"
82
+ end
83
+
84
+ def boolean(value)
85
+ case value.class
86
+ when TrueClass, FalseClass
87
+ return value
88
+ else
89
+ return true if value.to_s =~ /^(1|t|true|y|yes)$/
90
+ return false if value.to_s =~ /^(0|f|false|n|no)$/
91
+ end
92
+ nil
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,70 @@
1
+ module Volley
2
+ module Dsl
3
+ module VolleyFile
4
+ class << self
5
+ def init
6
+ @loaded ||= { }
7
+
8
+ ["/etc/Volleyfile", "~/.Volleyfile", "../../../../conf/common.volleyfile"].each do |f|
9
+ load(f, :optional => true)
10
+ end
11
+ end
12
+
13
+ def load(filename, options={ })
14
+ file = load_file(filename)
15
+ raise "cannot read file #{file}" unless file || options[:optional]
16
+ config.volleyfile = file if options[:primary]
17
+ true
18
+ end
19
+
20
+ def unload
21
+ @loaded = nil
22
+ end
23
+
24
+ # TOP LEVEL DSL METHODS
25
+
26
+ def config
27
+ Volley.config
28
+ end
29
+
30
+ def project(name, o={ }, &block)
31
+ Volley::Log.debug "project: #{name}"
32
+ Volley::Dsl::Project.project(name, o, &block)
33
+ end
34
+
35
+ def publisher(name, o={ }, &block)
36
+ Volley::Dsl::Publisher.publisher(name, o, &block)
37
+ end
38
+
39
+ def log(level, dest)
40
+ Volley::Log.add(level, dest)
41
+ end
42
+
43
+ def directory(dir)
44
+ Volley.config.directory = dir
45
+ end
46
+
47
+ private
48
+
49
+ def load_file(filename)
50
+ @loaded ||= { }
51
+ @projects ||= { }
52
+
53
+ file = find_file(filename)
54
+ exists = file && File.file?(file)
55
+ Volley::Log.debug "LOAD: [#{exists}] #{filename} (#{file})"
56
+ return unless exists
57
+ @loaded[file] ||= instance_eval(File.read(file), file)
58
+ file
59
+ end
60
+
61
+ def find_file(filename)
62
+ [filename, File.expand_path(filename), File.expand_path(filename, __FILE__)].each do |f|
63
+ return f if File.file?(f)
64
+ end
65
+ nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -3,78 +3,73 @@ require 'tempfile'
3
3
  module Volley
4
4
  module Dsl
5
5
  class Plan
6
- attr_accessor :rawargs
6
+ attr_accessor :argv
7
+ attr_reader :project
8
+ attr_reader :stages
9
+ attr_reader :arguments
10
+ attr_reader :attributes
7
11
 
8
12
  def initialize(name, o={ }, &block)
9
- options = {
13
+ options = {
10
14
  :name => name,
11
- :output => false,
12
15
  :project => nil,
16
+ :output => false,
13
17
  :encrypt => false,
18
+ :remote => true,
14
19
  :pack => true,
15
20
  :pack_type => "tgz",
16
21
  }.merge(o)
17
- raise "project instance must be set" if options[:project].nil?
18
- @project = options[:project]
19
- @block = block
20
22
  @attributes = OpenStruct.new(options)
21
- @args = OpenStruct.new
22
- @argdefs = {}
23
- @argdata = {}
24
- @actions = {:pre => [], :main => [], :post => []}
23
+ raise "project instance must be set" if @attributes.project.nil?
24
+
25
+ @name = name.to_sym
26
+ @project = options[:project]
27
+ @block = block
28
+ @files = []
29
+ @arguments = { }
30
+ @argv = []
31
+ @stages = {
32
+ :pre => Volley::Dsl::Stage.new(:pre, :plan => self),
33
+ :main => Volley::Dsl::Stage.new(:main, :plan => self),
34
+ :post => Volley::Dsl::Stage.new(:post, :plan => self),
35
+ }
36
+ @stage_order = [:pre, :main, :post]
37
+
25
38
  instance_eval &block if block_given?
26
39
 
27
- argument :branch, :required => true
28
- argument :version, :default => "latest"
40
+ if @attributes.remote
41
+ argument :descriptor, :required => true, :convert => :descriptor
42
+ else
43
+ argument :descriptor, :convert => :descriptor, :convert_opts => { :partial => true }
44
+ end
29
45
  end
30
46
 
31
- def call(options={})
32
- @origargs = options[:rawargs]
33
- process_arguments(options[:rawargs])
34
- #instance_eval &@block
35
- run_actions
36
- end
47
+ def call(options={ })
48
+ Volley::Log.debug "## #{@project.name} : #@name"
49
+ @origargs = options[:args]
50
+ data = @origargs
37
51
 
38
- def full_usage
39
- out = []
40
- @argdefs.each do |n, arg|
41
- t = arg[:convert] || "string"
42
- r = arg[:required]
43
- #o = "#{n}:#{t}"
44
- #o = "[#{o}]" unless r
45
- d = arg[:default] ? "default: #{arg[:default]}" : ""
46
- o = "%15s %15s %1s %s" % [n, t, (r ? '*' : ''), d]
47
- out << "#{o}"
48
- end
49
- out
52
+ process_arguments(data)
53
+
54
+ raise "descriptor must be specified" if @attributes.remote && !args.descriptor
55
+ #raise "cannot determine branch" unless branch
56
+ #raise "cannot determine version" unless version
57
+
58
+ run_actions
59
+ [branch, version].join(":")
50
60
  end
51
61
 
52
62
  def usage
53
63
  out = []
54
- @argdefs.each do |n, arg|
55
- t = arg[:convert] || "string"
56
- r = arg[:required]
57
- d = arg[:default] ? "#{arg[:default]}" : ""
58
- v = arg[:choices] ? "[#{arg[:choices].join(",")}]" : "<#{n}>"
59
- out << "#{n}:#{v}#{"*" if r}"
64
+ @arguments.each do |n, arg|
65
+ out << arg.usage
60
66
  end
61
67
  out.join(" ")
62
68
  end
63
69
 
64
70
  def run_actions(*stages)
65
- stages = [*stages].flatten
66
- stages = [:pre, :main, :post] if stages.count == 0
67
- stages.each do |stage|
68
- Volley::Log.debug "running actions[:#{stage}]:" if @actions[stage].count > 0
69
- @actions[stage].each do |act|
70
- Volley::Log.debug "running action: #{act[:name]}"
71
- begin
72
- self.instance_eval(&act[:block])
73
- rescue => e
74
- Volley::Log.info "error running action: #{act[:name]}: #{e.message} at #{e.backtrace.first}"
75
- Volley::Log.debug e
76
- end
77
- end
71
+ @stage_order.each do |stage|
72
+ @stages[stage].call
78
73
  end
79
74
  end
80
75
 
@@ -84,51 +79,47 @@ module Volley
84
79
  end
85
80
 
86
81
  def args
87
- @args
82
+ @args = OpenStruct.new(@arguments.inject({ }) { |h, e| (k, v)=e; h[k] = v.value; h })
88
83
  end
89
84
 
90
85
  def source
91
86
  @project.source or raise "SCM not configured"
92
87
  end
93
88
 
89
+ def remote(tf)
90
+ raise "remote can only be set to true or false" unless [true,false].include?(tf)
91
+ @attributes.remote = tf
92
+ end
93
+
94
+ def branch
95
+ (args.descriptor ? args.descriptor.branch : nil) || source.branch || nil
96
+ end
97
+
98
+ def version
99
+ v = args.descriptor ? args.descriptor.version : nil
100
+ if v == "latest"
101
+ v = source.revision || nil
102
+ end
103
+ v
104
+ end
105
+
106
+ def log(msg)
107
+ Volley::Log.info msg
108
+ end
109
+
94
110
  def load(file)
95
- real = File.expand_path(file)
96
- Volley::VolleyFile.load(real)
111
+ Volley::Dsl.file(file)
97
112
  rescue => e
98
113
  Volley::Log.error "failed to load file: #{e.message}: #{file} (#{real})"
99
114
  Volley::Log.debug e
100
115
  end
101
116
 
102
- def argument(name, opts={ })
103
- @argdefs[name] = opts
104
- action "argument-#{name}", :pre do
105
- n = name.to_sym
106
- # had to make this more complex to handle valid "false" values
107
- v = begin
108
- if @argdata[n].nil?
109
- if opts[:default].nil?
110
- nil
111
- else
112
- opts[:default]
113
- end
114
- else
115
- @argdata[n]
116
- end
117
- end
118
- raise "arg '#{name}' is required, but not set" if opts[:required] && v.nil?
119
- if opts[:convert]
120
- if opts[:convert] == :boolean
121
- v = boolean(v)
122
- else
123
- v = v.send(opts[:convert])
124
- end
125
- elsif block_given?
126
- v = yield v
127
- end
128
- raise "arg '#{name}' is required, but not set (after convert)" if opts[:required] && v.nil?
129
- @args.send("#{n}=", v)
130
- @attributes.send("#{n}=", v) if opts[:attr]
131
- end
117
+ def config
118
+ Volley.config
119
+ end
120
+
121
+ def argument(name, opts={ }, &block)
122
+ @arguments[name.to_sym] = Volley::Dsl::Argument.new(name, opts.merge(:plan => self), &block)
132
123
  end
133
124
 
134
125
  def output(tf=true)
@@ -141,145 +132,33 @@ module Volley
141
132
  end
142
133
 
143
134
  def action(name, stage=:main, &block)
144
- n = name.to_sym
145
- @actions[stage] << { :name => n, :stage => stage, :block => block }
135
+ @stages[stage].action(name, :plan => self, :stage => stage, &block)
136
+ #n = name.to_sym
137
+ #@actions[stage] << { :name => n, :stage => stage, :block => block }
146
138
  end
147
139
 
148
- def push(&block)
149
- action :files, :post do
150
- list = begin
151
- case block.arity
152
- when 1
153
- yield @attributes.dup
154
- else
155
- yield
156
- end
157
- end
158
- list = [*list].flatten
159
- notfound = list.reject { |f| File.exists?(f) }
160
- raise "built files not found: #{notfound.join(",")}" unless notfound.count == 0
161
- @attributes.artifact_list = list
162
- @attributes.artifact_list << Volley.config.volleyfile
163
- end
164
-
165
- if @attributes.pack
166
- action :pack, :post do
167
- path = @attributes.pack_dir = "/var/tmp/volley-#{Time.now.to_i}-#{$$}"
168
- Dir.mkdir(path)
169
- dir = Dir.pwd
170
-
171
- @attributes.artifact_list.each do |art|
172
- if art =~ /^\// && art !~ /^#{dir}/
173
- # file is full path and not in current directory
174
- source = art
175
- dest = "#{path}/#{File.basename(art)}"
176
- else
177
- # file is relative path or in current directory
178
- f = art.gsub(/^#{dir}/, "").gsub(/^\//, "")
179
- source = "#{dir}/#{f}"
180
- dest = "#{path}/#{f}"
181
- end
182
-
183
- begin
184
- Volley::Log.debug "pack file: #{source} => #{dest}"
185
- FileUtils.mkdir_p(File.dirname(dest))
186
- if File.directory?(source)
187
- FileUtils.cp_r(source, dest)
188
- else
189
- FileUtils.copy(source, dest)
190
- end
191
- rescue => e
192
- raise "could not copy file #{source}: #{e.message}"
193
- end
194
- end
195
-
196
- origpath = Dir.pwd
197
- Dir.chdir(path)
198
- case @attributes.pack_type
199
- when "tgz"
200
- n = "#{args.branch}-#{args.version}.tgz"
201
- c = "tar cvfz #{n} *"
202
- Volley::Log.debug "command:#{c}"
203
- shellout(c)
204
-
205
- @attributes.artifact = "#{path}/#{n}"
206
- else
207
- raise "unknown pack type '#{@attributes.pack_type}'"
208
- end
209
-
210
- Dir.chdir(origpath)
211
- end
212
- end
213
-
214
- if @attributes.encrypt
215
- action :encrypt, :post do
216
- art = @attributes.artifact
217
- key = @attributes.encrypt_key
218
- cpt = "#{art}.cpt"
219
-
220
- raise "in action encrypt: artifact file does not exist: #{art}" unless File.file?(art)
221
- raise "in action encrypt: encrypted file #{cpt} already exists" if File.file?(cpt) && !@attributes.encrypt_overwrite
222
- shellout("ccrypt -e --key '#{key}' #{art}")
223
-
224
- @attributes.artifact_unencrypted = art
225
- @attributes.artifact = cpt
226
- end
227
- end
228
-
229
- action :push, :post do
230
- publisher = Volley::Dsl.publisher
231
- publisher.push(@project.name, args.branch, args.version, @attributes.artifact)
232
- end
140
+ def file(file)
141
+ @files << file
233
142
  end
234
143
 
235
- def pull
236
-
237
- dir = nil
238
- pub = nil
239
- file = nil
240
- tgz = nil
241
-
242
- action :download do
243
- pr = @project.name
244
- br = args.branch
245
- ve = args.version
246
-
247
- pub = Volley::Dsl.publisher
248
- file = pub.pull(pr, br, ve)
249
-
250
- dir = File.dirname(file)
251
- Volley::Log.info "changing directory: #{dir} (#{file})"
252
- end
253
-
254
- action :unpack do
255
- FileUtils.mkdir_p("#{dir}/unpack")
256
- Dir.chdir("#{dir}/unpack")
257
- tgz = %x{tar xvfz #{file} 2>/dev/null}
258
- File.open("#{dir}/tgz.log", "w") {|f| f.write(tgz)}
144
+ def files(*list)
145
+ list = [*list].flatten
146
+ if @files.count > 0 && list.count > 0
147
+ Volley::Log.warn "overriding file list"
148
+ Volley::Log.debug "files: #{@files.inspect}"
149
+ Volley::Log.debug "new: #{list.inspect}"
259
150
  end
151
+ @files = list if list.count > 0
152
+ @files
153
+ end
260
154
 
261
- action :run do
262
- yield "#{dir}/unpack" if dir && File.directory?("#{dir}/unpack")
263
- end
155
+ def push(&block)
156
+ Volley::Dsl::PushAction.new(:push_dummy, :plan => self, :stage => :main, &block)
264
157
  end
265
158
 
266
- #def volley(opts={ })
267
- # o = {
268
- # :project => @project.name,
269
- # :branch => args.branch,
270
- # :version => "latest",
271
- # :plan => "pull",
272
- # }.merge(opts)
273
- #
274
- # desc = [o[:project], o[:branch], o[:version], o[:plan]].compact.join(":")
275
- # actionname = "volley-#{desc}"
276
- # action actionname do
277
- # Volley::Log.info "VOLLEY: #{desc}"
278
- # cmd = ["volley"]
279
- # cmd << desc
280
- # shellout(cmd.join(" "), :output => true)
281
- # end
282
- #end
159
+ def pull(&block)
160
+ Volley::Dsl::PullAction.new(:pull_dummy, :plan => self, :stage => :main, &block)
161
+ end
283
162
 
284
163
  def volley(opts={ })
285
164
  o = {
@@ -288,7 +167,8 @@ module Volley
288
167
  }.merge(opts)
289
168
 
290
169
  action "volley-#{o[:project]}-#{o[:plan]}" do
291
- Volley.process(o.merge(:branch => args.branch, :version => args.version, :args => @origargs))
170
+ options = { :plan => "#{project}:#{plan}", :descriptor => "#{project}@#{branch}:#{version}", :args => @origargs }.merge(o)
171
+ Volley.process(options)
292
172
  end
293
173
  end
294
174
 
@@ -301,9 +181,9 @@ module Volley
301
181
 
302
182
  def shellout(*args)
303
183
  require "mixlib/shellout"
304
- opts = args.last.is_a?(Hash) ? args.pop : {}
184
+ opts = args.last.is_a?(Hash) ? args.pop : { }
305
185
  options = {
306
- :output => @attributes.output,
186
+ :output => @attributes.output,
307
187
  :prepend => ">> ",
308
188
  }.merge(opts)
309
189
  command = ::Mixlib::ShellOut.new(*args)
@@ -315,27 +195,22 @@ module Volley
315
195
  end
316
196
 
317
197
  private
318
-
319
- def boolean(value)
320
- case value.class
321
- when TrueClass, FalseClass
322
- return value
323
- else
324
- return true if value =~ /^(1|t|true|y|yes)$/
325
- return false if value =~ /^(0|f|false|n|no)$/
326
- end
327
- nil
328
- end
329
-
330
198
  def process_arguments(raw)
331
- Volley::Log.debug "process arguments: #{raw.inspect}"
199
+ Volley::Log.debug ".. process arguments: #{raw.inspect}"
332
200
  if raw
333
- kvs = raw.select{|e| e =~ /\:/}
334
- raw = raw.reject{|e| e =~ /\:/}
335
- Volley::Log.debug "KVS: #{kvs.inspect}"
336
- Volley::Log.debug "RAW: #{raw.inspect}"
337
- @rawargs = raw
338
- @argdata = kvs.inject({ }) { |h, a| (k, v) = a.split(/:/); h[k.to_sym]= v; h }
201
+ kvs = raw.select { |e| e =~ /\=/ }
202
+ raw = raw.reject { |e| e =~ /\=/ }
203
+ @argv = raw
204
+ kvs.each do |a|
205
+ (k, v) = a.split(/\=/)
206
+ if @arguments[k.to_sym]
207
+ Volley::Log.debug ".. .. setting argument: #{k} = #{v}"
208
+ @arguments[k.to_sym].value = v
209
+ end
210
+ end
211
+ end
212
+ @arguments.each do |k, v|
213
+ v.check
339
214
  end
340
215
  end
341
216
  end
@@ -8,7 +8,7 @@ module Volley
8
8
  n = name.to_sym
9
9
  @projects ||= {}
10
10
  if @projects[n]
11
- #raise "defining project #{name} more than once"
11
+ raise "defining project #{name} more than once"
12
12
  else
13
13
  @projects[n] = new(n)
14
14
  @projects[n].instance_eval &block if block_given?
@@ -28,6 +28,10 @@ module Volley
28
28
  n = name.to_sym
29
29
  @projects.keys.include?(n)
30
30
  end
31
+
32
+ def unload
33
+ @projects = nil
34
+ end
31
35
  end
32
36
 
33
37
  attr_reader :plans
@@ -40,7 +44,11 @@ module Volley
40
44
  end
41
45
 
42
46
  def config
43
- @config ||= OpenStruct.new
47
+ Volley.config
48
+ end
49
+
50
+ def log(msg)
51
+ Volley::Log.info msg
44
52
  end
45
53
 
46
54
  def plan(name, o={}, &block)
@@ -0,0 +1,50 @@
1
+
2
+ module Volley
3
+ module Dsl
4
+ class PullAction < Action
5
+ def initialize(name, options={}, &block)
6
+ @name = name.to_sym
7
+ @stage = options.delete(:stage)
8
+ @plan = options.delete(:plan)
9
+ #@block = block
10
+ @options = {
11
+ }.merge(options)
12
+ raise "stage instance must be set" unless @stage
13
+ raise "plan instance must be set" unless @plan
14
+
15
+ dir = nil
16
+ file = nil
17
+
18
+ @plan.action :download do
19
+ pr = project.name
20
+ br = branch
21
+ ve = version
22
+
23
+ pub = Volley::Dsl.publisher
24
+ raise "publisher must be defined" unless pub
25
+ file = pub.pull(pr, br, ve)
26
+
27
+ dir = File.dirname(file)
28
+ end
29
+
30
+ @plan.action :unpack do
31
+ FileUtils.mkdir_p("#{dir}/unpack")
32
+ Volley::Log.info "changing directory: #{dir} (#{file})"
33
+ Dir.chdir("#{dir}/unpack")
34
+ tgz = %x{tar xvfz #{file} 2>/dev/null}
35
+ File.open("#{dir}/tgz.log", "w") { |f| f.write(tgz) }
36
+ end
37
+
38
+ @plan.action :run do
39
+ raise "failed to unpack: #{dir}/unpack" unless dir && File.directory?("#{dir}/unpack")
40
+ yield "#{dir}/unpack"
41
+ end
42
+
43
+ @plan.action :meta do
44
+ Volley.meta[project.name] = "#{args.descriptor.branch}:#{args.descriptor.version}"
45
+ Volley.meta.save
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end