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.
- data/.gitignore +3 -1
- data/.rspec +1 -0
- data/Gemfile +4 -1
- data/Rakefile +34 -0
- data/bin/volley +88 -40
- data/conf/common.volleyfile +12 -29
- data/features/publisher.feature +45 -0
- data/features/step_definitions/common_steps.rb +9 -0
- data/features/step_definitions/publisher_steps.rb +92 -0
- data/features/support/env.rb +19 -0
- data/init/Volleyfile +1 -104
- data/lib/volley/descriptor.rb +28 -0
- data/lib/volley/dsl/action.rb +31 -0
- data/lib/volley/dsl/argument.rb +96 -0
- data/lib/volley/dsl/file.rb +70 -0
- data/lib/volley/dsl/plan.rb +110 -235
- data/lib/volley/dsl/project.rb +10 -2
- data/lib/volley/dsl/pull_action.rb +50 -0
- data/lib/volley/dsl/push_action.rb +101 -0
- data/lib/volley/dsl/stage.rb +40 -0
- data/lib/volley/dsl.rb +7 -0
- data/lib/volley/log.rb +22 -8
- data/lib/volley/meta.rb +24 -0
- data/lib/volley/publisher/amazons3.rb +67 -66
- data/lib/volley/publisher/base.rb +81 -42
- data/lib/volley/publisher/exceptions.rb +7 -0
- data/lib/volley/publisher/local.rb +41 -27
- data/lib/volley/scm/base.rb +10 -0
- data/lib/volley.rb +38 -12
- data/spec/descriptor_spec.rb +39 -0
- data/spec/dsl_plan_spec.rb +103 -0
- data/spec/dsl_project_spec.rb +36 -0
- data/spec/dsl_volleyfile_spec.rb +21 -0
- data/spec/meta_spec.rb +26 -0
- data/spec/publisher_spec.rb +92 -0
- data/test/dsl/amazons3_publisher.volleyfile +6 -0
- data/test/dsl/local_publisher.volleyfile +4 -0
- data/test/dsl/log_console.volleyfile +2 -0
- data/test/dsl/log_file.volleyfile +2 -0
- data/test/dsl/simple.volleyfile +17 -0
- data/test/meta.yml +3 -0
- data/test/project/Rakefile +13 -0
- data/test/project/Volleyfile +18 -0
- data/test/trunk-1.tgz +0 -0
- data/volley.gemspec +2 -1
- metadata +67 -5
- data/lib/volley/config.rb +0 -8
- data/lib/volley/volley_file.rb +0 -45
@@ -0,0 +1,101 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
module Dsl
|
4
|
+
class PushAction < Action
|
5
|
+
def initialize(name, options={}, &block)
|
6
|
+
@name = name.to_sym
|
7
|
+
@stage = options.delete(:stage)
|
8
|
+
@plan = options.delete(:plan)
|
9
|
+
@options = {
|
10
|
+
}.merge(options)
|
11
|
+
raise "stage instance must be set" unless @stage
|
12
|
+
raise "plan instance must be set" unless @plan
|
13
|
+
|
14
|
+
@plan.action :files, :post do
|
15
|
+
raise "branch(#{branch}) and version(#{version}) must be specified" unless branch && version
|
16
|
+
|
17
|
+
list = yield
|
18
|
+
list = [*list].flatten
|
19
|
+
# use #exists? so it can work for directories
|
20
|
+
notfound = list.reject { |f| File.exists?(f) }
|
21
|
+
raise "built files not found: #{notfound.join(",")}" unless notfound.count == 0
|
22
|
+
files list
|
23
|
+
file Volley.config.volleyfile if Volley.config.volleyfile
|
24
|
+
end
|
25
|
+
|
26
|
+
if attributes.pack
|
27
|
+
@plan.action :pack, :post do
|
28
|
+
raise "branch(#{branch}) and version(#{version}) must be specified" unless branch && version
|
29
|
+
|
30
|
+
path = attributes.pack_dir = "/var/tmp/volley-%d-%d-%05d" % [Time.now.to_i, $$, rand(99999)]
|
31
|
+
Dir.mkdir(path)
|
32
|
+
dir = Dir.pwd
|
33
|
+
|
34
|
+
files.each do |art|
|
35
|
+
Volley::Log.debug "art:#{art}"
|
36
|
+
next unless art
|
37
|
+
if art =~ /^\// && art !~ /^#{dir}/
|
38
|
+
# file is full path and not in current directory
|
39
|
+
source = art
|
40
|
+
dest = "#{path}/#{File.basename(art)}"
|
41
|
+
else
|
42
|
+
# file is relative path or in current directory
|
43
|
+
f = art.gsub(/^#{dir}/, "").gsub(/^\//, "")
|
44
|
+
source = "#{dir}/#{f}"
|
45
|
+
dest = "#{path}/#{f}"
|
46
|
+
end
|
47
|
+
|
48
|
+
begin
|
49
|
+
Volley::Log.debug "pack file: #{source} => #{dest}"
|
50
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
51
|
+
if File.directory?(source)
|
52
|
+
FileUtils.cp_r(source, dest)
|
53
|
+
else
|
54
|
+
FileUtils.copy(source, dest)
|
55
|
+
end
|
56
|
+
rescue => e
|
57
|
+
raise "could not copy file #{source}: #{e.message}"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
origpath = Dir.pwd
|
62
|
+
Dir.chdir(path)
|
63
|
+
case attributes.pack_type
|
64
|
+
when "tgz"
|
65
|
+
n = "#{branch}-#{version}.tgz"
|
66
|
+
c = "tar cvfz #{n} *"
|
67
|
+
Volley::Log.debug "command:#{c}"
|
68
|
+
command(c)
|
69
|
+
|
70
|
+
attributes.artifact = "#{path}/#{n}"
|
71
|
+
else
|
72
|
+
raise "unknown pack type '#{attributes.pack_type}'"
|
73
|
+
end
|
74
|
+
|
75
|
+
Dir.chdir(origpath)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
if attributes.encrypt
|
80
|
+
@plan.action :encrypt, :post do
|
81
|
+
art = attributes.artifact
|
82
|
+
key = attributes.encrypt_key
|
83
|
+
cpt = "#{art}.cpt"
|
84
|
+
|
85
|
+
raise "in action encrypt: artifact file does not exist: #{art}" unless File.file?(art)
|
86
|
+
raise "in action encrypt: encrypted file #{cpt} already exists" if File.file?(cpt) && !attributes.encrypt_overwrite
|
87
|
+
shellout("ccrypt -e --key '#{key}' #{art}")
|
88
|
+
|
89
|
+
attributes.artifact_unencrypted = art
|
90
|
+
attributes.artifact = cpt
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
@plan.action :push, :post do
|
95
|
+
publisher = Volley::Dsl.publisher
|
96
|
+
publisher.push(project.name, branch, version, attributes.artifact)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
module Dsl
|
4
|
+
class Stage
|
5
|
+
attr_reader :actions
|
6
|
+
def initialize(name, options={}, &block)
|
7
|
+
@name = name.to_sym
|
8
|
+
@plan = options.delete(:plan)
|
9
|
+
@options = {
|
10
|
+
}.merge(options)
|
11
|
+
@actions = []
|
12
|
+
raise "plan instance must be set" unless @plan
|
13
|
+
instance_eval &block if block_given?
|
14
|
+
end
|
15
|
+
|
16
|
+
def call
|
17
|
+
Volley::Log.debug ".. #@name"
|
18
|
+
@actions.each do |action|
|
19
|
+
action.call
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def add(action)
|
24
|
+
@actions << action
|
25
|
+
end
|
26
|
+
|
27
|
+
def count
|
28
|
+
@actions.count
|
29
|
+
end
|
30
|
+
|
31
|
+
def action(name, options={}, &block)
|
32
|
+
o = {
|
33
|
+
:stage => @name,
|
34
|
+
:plan => nil,
|
35
|
+
}.merge(options)
|
36
|
+
@actions << Volley::Dsl::Action.new(name, o, &block)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/volley/dsl.rb
CHANGED
@@ -11,11 +11,18 @@ module Volley
|
|
11
11
|
Volley::Dsl::Publisher.get
|
12
12
|
end
|
13
13
|
|
14
|
+
def file(name)
|
15
|
+
return false unless name
|
16
|
+
Volley::Dsl::VolleyFile.load(name)
|
17
|
+
end
|
18
|
+
|
14
19
|
def project(name)
|
20
|
+
return false unless name
|
15
21
|
Volley::Dsl::Project.get(name)
|
16
22
|
end
|
17
23
|
|
18
24
|
def project?(name)
|
25
|
+
return false unless name
|
19
26
|
Volley::Dsl::Project.exists?(name)
|
20
27
|
end
|
21
28
|
|
data/lib/volley/log.rb
CHANGED
@@ -4,24 +4,38 @@ module Volley
|
|
4
4
|
class Log
|
5
5
|
class << self
|
6
6
|
def init
|
7
|
-
@loggers
|
8
|
-
@loggers
|
9
|
-
@loggers
|
7
|
+
@loggers = { }
|
8
|
+
@loggers["STDOUT"] = Yell.new(STDOUT, :level => [:info, :warn], :format => Yell::NoFormat)
|
9
|
+
@loggers["STDERR"] = Yell.new(STDERR, :level => [:error, :fatal], :format => Yell::NoFormat)
|
10
10
|
end
|
11
11
|
|
12
12
|
def add(level, dest, format=Yell::DefaultFormat)
|
13
|
-
if [STDOUT,STDERR].include?(dest)
|
14
|
-
|
13
|
+
if [STDOUT, STDERR].include?(dest)
|
14
|
+
console_disable
|
15
|
+
@loggers["STDOUT"] = Yell.new(dest, :level => level, :format => format)
|
15
16
|
else
|
16
|
-
@loggers
|
17
|
-
|
17
|
+
@loggers.delete(dest) if @loggers[dest]
|
18
|
+
FileUtils.mkdir_p(File.dirname(dest))
|
19
|
+
@loggers[dest] = Yell.new(:datefile, dest,
|
20
|
+
:level => level, :format => format,
|
21
|
+
:keep => 7, :symlink_original_filename => true)
|
18
22
|
end
|
19
23
|
end
|
20
24
|
|
25
|
+
def console_disable
|
26
|
+
%w{STDOUT STDERR}.each { |s| @loggers.delete(s) }
|
27
|
+
end
|
28
|
+
|
29
|
+
def console_debug
|
30
|
+
console_disable
|
31
|
+
@loggers["STDOUT"] = Yell.new(STDOUT, :level => [:debug, :info, :warn], :format => Yell::NoFormat)
|
32
|
+
@loggers["STDERR"] = Yell.new(STDERR, :level => [:error, :fatal], :format => Yell::NoFormat)
|
33
|
+
end
|
34
|
+
|
21
35
|
%w{debug info warn error fatal}.each do |method_name|
|
22
36
|
class_eval(<<-METHOD_DEFN, __FILE__, __LINE__)
|
23
37
|
def #{method_name}(msg=nil, &block)
|
24
|
-
@loggers.each {|l| l.#{method_name}(msg, &block) }
|
38
|
+
@loggers.each {|k, l| l.#{method_name}(msg, &block) }
|
25
39
|
end
|
26
40
|
METHOD_DEFN
|
27
41
|
end
|
data/lib/volley/meta.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
class Meta
|
4
|
+
def initialize(file="#{Volley.config.directory}/meta.yaml")
|
5
|
+
Volley::Log.info "meta: #{file}"
|
6
|
+
@file = file
|
7
|
+
raise "file does not exist" unless File.file?(@file)
|
8
|
+
@data = YAML.load_file(@file)
|
9
|
+
Volley::Log.info "#{@data.inspect}"
|
10
|
+
end
|
11
|
+
|
12
|
+
def [](project)
|
13
|
+
@data[project.to_sym]
|
14
|
+
end
|
15
|
+
|
16
|
+
def []=(project, version)
|
17
|
+
@data[project.to_sym] = version
|
18
|
+
end
|
19
|
+
|
20
|
+
def save
|
21
|
+
File.open(@file, "w") {|f| f.write(@data.to_yaml)}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -5,112 +5,91 @@ module Volley
|
|
5
5
|
class Amazons3 < Base
|
6
6
|
attr_accessor :key, :secret
|
7
7
|
|
8
|
-
def files
|
9
|
-
hash = {:desc => {}, :all => {}, :latest => {}}
|
10
|
-
@connection.directories.get(@bucket).files.collect{|e| e.key}.each do |e|
|
11
|
-
(pr, br, vr) = e.split(/\//)
|
12
|
-
hash[:desc][pr] ||= {}
|
13
|
-
hash[:desc][pr][br] ||= {}
|
14
|
-
hash[:desc][pr][br][vr] ||= []
|
15
|
-
hash[:desc][pr][br][vr] << e
|
16
|
-
hash[:all] ||= {}
|
17
|
-
hash[:latest] ||= {}
|
18
|
-
v = "#{pr}/#{br}/#{vr}"
|
19
|
-
hash[:latest]["#{pr}/#{br}"] ||= latest(pr, br)
|
20
|
-
hash[:all][v] = hash["latest"] == v
|
21
|
-
end
|
22
|
-
#ap hash
|
23
|
-
hash
|
24
|
-
end
|
25
|
-
|
26
|
-
def all
|
27
|
-
files[:all]
|
28
|
-
end
|
29
|
-
|
30
8
|
def projects
|
31
|
-
|
32
|
-
data[:desc].keys
|
33
|
-
#files.collect{|e| e.split(/\//).first }.uniq
|
9
|
+
files[:desc].keys
|
34
10
|
rescue => e
|
35
11
|
Volley::Log.warn "error getting project list from publisher: #{e.message} at #{e.backtrace.first}"
|
36
12
|
[]
|
37
13
|
end
|
38
14
|
|
39
15
|
def branches(pr)
|
40
|
-
puts "branches for #{pr}"
|
41
16
|
files[:desc][pr].keys
|
42
|
-
#files.select{|e| e.split(/\//).first == pr}.collect{|e| e.split(/\//)[1]}
|
43
17
|
rescue => e
|
44
18
|
Volley::Log.warn "error getting branch list from publisher: #{e.message}"
|
45
19
|
[]
|
46
20
|
end
|
47
21
|
|
48
|
-
def versions(pr,br)
|
22
|
+
def versions(pr, br)
|
49
23
|
files[:desc][pr][br].keys
|
50
|
-
#raise "not implemented"
|
51
24
|
rescue => e
|
52
25
|
Volley::Log.warn "error getting version list from publisher: #{e.message}"
|
53
26
|
[]
|
54
27
|
end
|
55
28
|
|
56
29
|
def contents(pr, br, vr)
|
57
|
-
files[:desc][pr][br][vr]
|
30
|
+
files[:desc][pr][br][vr].map {|e| e.gsub("#{pr}/#{br}/#{vr}/","")}
|
31
|
+
rescue => e
|
32
|
+
Volley::Log.warn "error getting contents list from publisher: #{e.message}"
|
33
|
+
[]
|
58
34
|
end
|
59
35
|
|
60
|
-
def
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
36
|
+
def exists?(project, branch, version)
|
37
|
+
!files[:desc][project][branch][version].nil? rescue false
|
38
|
+
end
|
39
|
+
|
40
|
+
def delete_project(project)
|
41
|
+
Volley::Log.info "delete_project #{project}"
|
42
|
+
dir = @connection.directories.get(@bucket)
|
43
|
+
dir.files.select{|e| e.key =~ /^#{project}\//}.each do |f|
|
44
|
+
Volley::Log.info "- #{f.key}"
|
45
|
+
f.destroy
|
46
|
+
end
|
47
|
+
true
|
48
|
+
rescue => e
|
49
|
+
Volley::Log.error "error deleting project: #{e.message} at #{e.backtrace.first}"
|
50
|
+
Volley::Log.debug e
|
51
|
+
false
|
65
52
|
end
|
66
53
|
|
67
|
-
|
54
|
+
protected
|
68
55
|
|
69
56
|
def load_configuration
|
70
57
|
@key = requires(:aws_access_key_id)
|
71
58
|
@secret = requires(:aws_secret_access_key)
|
72
59
|
@bucket = requires(:bucket)
|
73
|
-
@local = requires(:local)
|
74
|
-
@debug = optional(:debug, false)
|
75
|
-
@encrypted = optional(:encrypted, false)
|
76
60
|
connect
|
77
61
|
end
|
78
62
|
|
79
|
-
def
|
80
|
-
|
63
|
+
def push_file(dir, file, contents)
|
64
|
+
file = File.basename(file)
|
65
|
+
dest = "#{dir}/#{file}"
|
66
|
+
#log "-> #@bucket/#{path}"
|
67
|
+
f = root.files.create(:key => dest, :body => contents, :public => true)
|
68
|
+
log "=> #{f.public_url.gsub("%2F", "/")}"
|
69
|
+
dest
|
81
70
|
end
|
82
71
|
|
83
|
-
def
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
Volley::Log.info ".. -> s3:#@bucket/#{path}"
|
88
|
-
@dir ||= @connection.directories.create({ :key => @bucket })
|
89
|
-
s3f = @dir.files.create(
|
90
|
-
:key => "#{path}",
|
91
|
-
:body => contents,
|
92
|
-
:public => true
|
93
|
-
)
|
94
|
-
Volley::Log.info ".. => #{s3f.public_url.gsub("%2F", "/")}"
|
95
|
-
"#{path}"
|
96
|
-
end
|
72
|
+
def pull_file(dir, file, localdir=nil)
|
73
|
+
remote = "#{dir}/#{file}"
|
74
|
+
f = root.files.get(remote)
|
75
|
+
raise ArtifactMissing, "missing: #{remote}" unless f
|
97
76
|
|
98
|
-
|
99
|
-
|
100
|
-
if
|
101
|
-
FileUtils.mkdir_p(
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
if ldir
|
106
|
-
lfile = "#{ldir}/#{name}"
|
107
|
-
File.open(lfile, "w") { |lf| lf.write(contents) }
|
108
|
-
Volley::Log.info ".. <= #{lfile}"
|
77
|
+
contents = f.body
|
78
|
+
|
79
|
+
if localdir
|
80
|
+
FileUtils.mkdir_p(localdir)
|
81
|
+
local = "#{localdir}/#{file}"
|
82
|
+
log "<= #{local}"
|
83
|
+
File.open(local, "w") { |lf| lf.write(contents) }
|
109
84
|
else
|
110
85
|
contents
|
111
86
|
end
|
112
87
|
end
|
113
88
|
|
89
|
+
def root
|
90
|
+
@root ||= @connection.directories.create({ :key => @bucket })
|
91
|
+
end
|
92
|
+
|
114
93
|
def connect
|
115
94
|
@connection ||= Fog::Storage.new(
|
116
95
|
:provider => "AWS",
|
@@ -118,6 +97,28 @@ module Volley
|
|
118
97
|
:aws_secret_access_key => @secret,
|
119
98
|
)
|
120
99
|
end
|
100
|
+
|
101
|
+
def files
|
102
|
+
hash = {:desc => {}, :all => {}, :latest => {}}
|
103
|
+
@connection.directories.get(@bucket).files.collect{|e| e.key}.each do |e|
|
104
|
+
(pr, br, vr) = e.split(/\//)
|
105
|
+
hash[:desc][pr] ||= {}
|
106
|
+
hash[:desc][pr][br] ||= {}
|
107
|
+
hash[:desc][pr][br][vr] ||= []
|
108
|
+
hash[:desc][pr][br][vr] << e
|
109
|
+
hash[:all] ||= {}
|
110
|
+
hash[:latest] ||= {}
|
111
|
+
v = "#{pr}/#{br}/#{vr}"
|
112
|
+
hash[:latest]["#{pr}/#{br}"] ||= latest(pr, br)
|
113
|
+
hash[:all][v] = hash["latest"] == v
|
114
|
+
end
|
115
|
+
#ap hash
|
116
|
+
hash
|
117
|
+
end
|
118
|
+
|
119
|
+
def all
|
120
|
+
files[:all]
|
121
|
+
end
|
121
122
|
end
|
122
123
|
end
|
123
124
|
end
|
@@ -5,6 +5,12 @@ module Volley
|
|
5
5
|
@options = {
|
6
6
|
:overwrite => false,
|
7
7
|
}.merge(options)
|
8
|
+
|
9
|
+
@debug = optional(:debug, false)
|
10
|
+
@encrypted = optional(:encrypted, false)
|
11
|
+
@local = optional(:local, Volley.config.directory)
|
12
|
+
@loglevel = @debug ? :info : :debug
|
13
|
+
|
8
14
|
load_configuration
|
9
15
|
end
|
10
16
|
|
@@ -12,73 +18,81 @@ module Volley
|
|
12
18
|
raise "not implemented"
|
13
19
|
end
|
14
20
|
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
+
def branches(project)
|
22
|
+
raise "not implemented"
|
23
|
+
end
|
24
|
+
|
25
|
+
def versions(project, branch)
|
26
|
+
raise "not implemented"
|
27
|
+
end
|
28
|
+
|
29
|
+
def exists?(project, branch, version)
|
30
|
+
raise "not implemented"
|
31
|
+
end
|
32
|
+
|
33
|
+
def contents(project, branch, version)
|
34
|
+
raise "not implemented"
|
35
|
+
end
|
36
|
+
|
37
|
+
def delete_project(project)
|
38
|
+
raise "not implemented"
|
39
|
+
end
|
40
|
+
|
41
|
+
def latest(project, branch)
|
42
|
+
v = pull_file(dir(project,branch), "latest")
|
43
|
+
"#{project}/#{branch}/#{v}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def volleyfile(project, branch, version="latest")
|
47
|
+
contents = pull_file(dir(project,branch,version), "Volleyfile")
|
48
|
+
|
49
|
+
dest = "#{@options[:local]}/Volleyfile-#{Time.now.to_i}-#{$$}"
|
21
50
|
raise "File #{dest} already exists" if File.exists?(dest)
|
22
|
-
|
51
|
+
|
52
|
+
log "saving Volleyfile: #{dest}"
|
23
53
|
File.open(dest, "w") { |f| f.write(contents) }
|
24
54
|
dest
|
25
55
|
end
|
26
56
|
|
27
|
-
def push(project,
|
28
|
-
|
29
|
-
@branch = br
|
30
|
-
@version = ver
|
57
|
+
def push(project, branch, version, localfiles)
|
58
|
+
raise ArtifactExists, "the artifact already exists" if exists?(project, branch, version)
|
31
59
|
|
32
60
|
localfiles = [*localfiles].flatten
|
33
|
-
|
61
|
+
log "^^ #{me}#push"
|
34
62
|
|
63
|
+
dir = dir(project, branch, version)
|
35
64
|
localfiles.each do |localfile|
|
36
|
-
|
37
|
-
push_file(localfile, version, File.open(localfile))
|
65
|
+
push_file(dir, localfile, File.open(localfile))
|
38
66
|
end
|
39
|
-
push_file("latest", branch, version)
|
40
|
-
push_file("Volleyfile", version, File.open(Volley.config.volleyfile))
|
41
|
-
end
|
42
|
-
|
43
|
-
def pull(project, branch, ver="latest")
|
44
|
-
@project = project
|
45
|
-
@branch = branch
|
46
|
-
@version = ver
|
47
67
|
|
48
|
-
if
|
49
|
-
|
68
|
+
if Volley.config.volleyfile && File.file?(Volley.config.volleyfile)
|
69
|
+
push_file(dir, "Volleyfile", File.open(Volley.config.volleyfile))
|
50
70
|
end
|
51
71
|
|
52
|
-
|
53
|
-
Volley::Log.info "remote_file: #{remote_file}" if @debug
|
54
|
-
pull_file(remote_file, version, "#@local/#{version}")
|
72
|
+
push_file(dir(project, branch), "latest", version)
|
55
73
|
|
56
|
-
|
74
|
+
true
|
57
75
|
end
|
58
76
|
|
59
|
-
def
|
60
|
-
|
61
|
-
|
62
|
-
v
|
63
|
-
end
|
77
|
+
def pull(project, branch, version="latest")
|
78
|
+
dir = dir(project, branch, version)
|
79
|
+
file = remote_file(branch, version)
|
64
80
|
|
65
|
-
|
66
|
-
|
67
|
-
self.class.name.split("::").last
|
68
|
-
end
|
81
|
+
log "vv #{me}#pull"
|
82
|
+
pull_file(dir, file, "#@local/#{dir}")
|
69
83
|
|
70
|
-
|
71
|
-
"#@project/#@branch"
|
84
|
+
"#@local/#{dir}/#{file}"
|
72
85
|
end
|
73
86
|
|
74
|
-
|
75
|
-
|
87
|
+
protected
|
88
|
+
|
89
|
+
def me
|
90
|
+
self.class.name.split("::").last
|
76
91
|
end
|
77
92
|
|
78
93
|
def requires(name)
|
79
94
|
v = get_option(name)
|
80
95
|
if v.nil?
|
81
|
-
#ap @options
|
82
96
|
raise "Publisher #{me} requires option #{name}"
|
83
97
|
end
|
84
98
|
v
|
@@ -97,6 +111,31 @@ module Volley
|
|
97
111
|
n = name.to_sym
|
98
112
|
Volley.config.send(n)
|
99
113
|
end
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
def push_file(dir, name, contents)
|
118
|
+
raise "not implemented"
|
119
|
+
end
|
120
|
+
|
121
|
+
def pull_file(dir, name, localdir=nil)
|
122
|
+
raise "not implemented"
|
123
|
+
end
|
124
|
+
|
125
|
+
def remote_file(branch, version)
|
126
|
+
version = version == 'latest' ? get_latest(project, branch) : version
|
127
|
+
"#{branch}-#{version}.tgz#{".cpt" if @encrypted}"
|
128
|
+
end
|
129
|
+
|
130
|
+
def dir(project, branch, version=nil)
|
131
|
+
version = version == 'latest' ? get_latest(project, branch) : version
|
132
|
+
[project, branch, version].compact.join("/")
|
133
|
+
end
|
134
|
+
|
135
|
+
def log(msg)
|
136
|
+
Volley::Log.send(@loglevel, msg)
|
137
|
+
end
|
138
|
+
|
100
139
|
end
|
101
140
|
end
|
102
141
|
end
|