volley 0.1.0.alpha4 → 0.1.0.alpha5

Sign up to get free protection for your applications and to get access to all the features.
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