volley 0.1.0.alpha1
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/.gitignore +16 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/bin/volley +55 -0
- data/conf/common.volleyfile +106 -0
- data/init/Volleyfile +104 -0
- data/lib/volley/config.rb +8 -0
- data/lib/volley/dsl/plan.rb +339 -0
- data/lib/volley/dsl/project.rb +94 -0
- data/lib/volley/dsl/publisher.rb +25 -0
- data/lib/volley/dsl.rb +27 -0
- data/lib/volley/log.rb +31 -0
- data/lib/volley/publisher/amazons3.rb +123 -0
- data/lib/volley/publisher/base.rb +102 -0
- data/lib/volley/publisher/local.rb +61 -0
- data/lib/volley/scm/base.rb +8 -0
- data/lib/volley/scm/git.rb +31 -0
- data/lib/volley/scm/subversion.rb +45 -0
- data/lib/volley/version.rb +10 -0
- data/lib/volley/volley_file.rb +45 -0
- data/lib/volley.rb +58 -0
- data/volley.gemspec +23 -0
- metadata +151 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
module Dsl
|
4
|
+
class Project
|
5
|
+
class << self
|
6
|
+
attr_reader :projects
|
7
|
+
def project(name, o={}, &block)
|
8
|
+
n = name.to_sym
|
9
|
+
@projects ||= {}
|
10
|
+
if @projects[n]
|
11
|
+
#raise "defining project #{name} more than once"
|
12
|
+
else
|
13
|
+
@projects[n] = new(n)
|
14
|
+
@projects[n].instance_eval &block if block_given?
|
15
|
+
end
|
16
|
+
@projects[n]
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(name)
|
20
|
+
@projects[name.to_sym]
|
21
|
+
end
|
22
|
+
|
23
|
+
def config
|
24
|
+
Volley.config
|
25
|
+
end
|
26
|
+
|
27
|
+
def exists?(name)
|
28
|
+
n = name.to_sym
|
29
|
+
@projects.keys.include?(n)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
attr_reader :plans
|
34
|
+
attr_reader :name
|
35
|
+
attr_reader :source
|
36
|
+
|
37
|
+
def initialize(name)
|
38
|
+
@name = name
|
39
|
+
@plans = {}
|
40
|
+
end
|
41
|
+
|
42
|
+
def config
|
43
|
+
@config ||= OpenStruct.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def plan(name, o={}, &block)
|
47
|
+
n = name.to_sym
|
48
|
+
options = {
|
49
|
+
:project => self
|
50
|
+
}.merge(o)
|
51
|
+
if block_given?
|
52
|
+
@plans[n] ||= Volley::Dsl::Plan.new(name, options, &block)
|
53
|
+
end
|
54
|
+
@plans[n]
|
55
|
+
end
|
56
|
+
|
57
|
+
def plan?(name)
|
58
|
+
n = name.to_sym
|
59
|
+
@plans.keys.include?(n)
|
60
|
+
end
|
61
|
+
|
62
|
+
def scm(name, o={}, &block)
|
63
|
+
n = name.to_s
|
64
|
+
require "volley/scm/#{n}"
|
65
|
+
klass = "Volley::Scm::#{n.camelize}".constantize
|
66
|
+
@source = klass.new(o)
|
67
|
+
end
|
68
|
+
|
69
|
+
#def encrypt(tf, o={})
|
70
|
+
# options = {
|
71
|
+
# :enabled => tf,
|
72
|
+
# :overwrite => false,
|
73
|
+
# :key => "",
|
74
|
+
# }.merge(o)
|
75
|
+
# config.encrypt = OpenStruct.new(options)
|
76
|
+
#
|
77
|
+
# key = config.encrypt.key
|
78
|
+
# if File.file?(key)
|
79
|
+
# key = File.read(key).chomp
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# config.encrypt.key = key
|
83
|
+
#end
|
84
|
+
#
|
85
|
+
#def pack(tf, o={})
|
86
|
+
# options = {
|
87
|
+
# :enabled => tf,
|
88
|
+
# :type => "tgz",
|
89
|
+
# }.merge(o)
|
90
|
+
# config.pack = OpenStruct.new(options)
|
91
|
+
#end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
|
2
|
+
module Volley
|
3
|
+
module Dsl
|
4
|
+
class Publisher
|
5
|
+
class << self
|
6
|
+
def publisher(name, o={}, &block)
|
7
|
+
n = name.to_sym
|
8
|
+
|
9
|
+
if @publisher
|
10
|
+
raise "only one publisher can be defined at a time"
|
11
|
+
else
|
12
|
+
klass = "Volley::Publisher::#{name.to_s.camelize}"
|
13
|
+
Volley::Log.info "loading publisher: #{name} (#{klass})" if Volley.config.debug
|
14
|
+
require "volley/publisher/#{name}"
|
15
|
+
@publisher = klass.constantize.new(o)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def get
|
20
|
+
@publisher
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/volley/dsl.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
d = "#{File.dirname(__FILE__)}/dsl/*"
|
2
|
+
Dir[d].select{|e| e =~ /\.rb$/}.each do |file|
|
3
|
+
f = file.gsub(/\.rb$/, '')
|
4
|
+
require f
|
5
|
+
end
|
6
|
+
|
7
|
+
module Volley
|
8
|
+
module Dsl
|
9
|
+
class << self
|
10
|
+
def publisher
|
11
|
+
Volley::Dsl::Publisher.get
|
12
|
+
end
|
13
|
+
|
14
|
+
def project(name)
|
15
|
+
Volley::Dsl::Project.get(name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def project?(name)
|
19
|
+
Volley::Dsl::Project.exists?(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
def projects
|
23
|
+
Volley::Dsl::Project.projects
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/volley/log.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "yell"
|
2
|
+
|
3
|
+
module Volley
|
4
|
+
class Log
|
5
|
+
class << self
|
6
|
+
def init
|
7
|
+
@loggers = []
|
8
|
+
@loggers << Yell.new(STDOUT, :level => [:info,:warn], :format => Yell::NoFormat)
|
9
|
+
@loggers << Yell.new(STDERR, :level => [:error,:fatal], :format => Yell::NoFormat)
|
10
|
+
end
|
11
|
+
|
12
|
+
def add(level, dest, format=Yell::DefaultFormat)
|
13
|
+
if [STDOUT,STDERR].include?(dest)
|
14
|
+
@loggers << Yell.new(dest, :level => level, :format => format)
|
15
|
+
else
|
16
|
+
@loggers << Yell.new(:datefile, dest, :level => level, :format => format,
|
17
|
+
:keep => 7, :symlink_original_filename => true)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
%w{debug info warn error fatal}.each do |method_name|
|
22
|
+
class_eval(<<-METHOD_DEFN, __FILE__, __LINE__)
|
23
|
+
def #{method_name}(msg=nil, &block)
|
24
|
+
@loggers.each {|l| l.#{method_name}(msg, &block) }
|
25
|
+
end
|
26
|
+
METHOD_DEFN
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
Volley::Log.init
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'fog'
|
2
|
+
|
3
|
+
module Volley
|
4
|
+
module Publisher
|
5
|
+
class Amazons3 < Base
|
6
|
+
attr_accessor :key, :secret
|
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
|
+
def projects
|
31
|
+
data = files
|
32
|
+
data[:desc].keys
|
33
|
+
#files.collect{|e| e.split(/\//).first }.uniq
|
34
|
+
rescue => e
|
35
|
+
Volley::Log.warn "error getting project list from publisher: #{e.message} at #{e.backtrace.first}"
|
36
|
+
[]
|
37
|
+
end
|
38
|
+
|
39
|
+
def branches(pr)
|
40
|
+
puts "branches for #{pr}"
|
41
|
+
files[:desc][pr].keys
|
42
|
+
#files.select{|e| e.split(/\//).first == pr}.collect{|e| e.split(/\//)[1]}
|
43
|
+
rescue => e
|
44
|
+
Volley::Log.warn "error getting branch list from publisher: #{e.message}"
|
45
|
+
[]
|
46
|
+
end
|
47
|
+
|
48
|
+
def versions(pr,br)
|
49
|
+
files[:desc][pr][br].keys
|
50
|
+
#raise "not implemented"
|
51
|
+
rescue => e
|
52
|
+
Volley::Log.warn "error getting version list from publisher: #{e.message}"
|
53
|
+
[]
|
54
|
+
end
|
55
|
+
|
56
|
+
def contents(pr, br, vr)
|
57
|
+
files[:desc][pr][br][vr]
|
58
|
+
end
|
59
|
+
|
60
|
+
def latest(pr, br)
|
61
|
+
@project = pr
|
62
|
+
@branch = br
|
63
|
+
f = @connection.directories.get(@bucket).files.get("#{branch}/latest")
|
64
|
+
f.body
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def load_configuration
|
70
|
+
@key = requires(:aws_access_key_id)
|
71
|
+
@secret = requires(:aws_secret_access_key)
|
72
|
+
@bucket = requires(:bucket)
|
73
|
+
@local = requires(:local)
|
74
|
+
@debug = optional(:debug, false)
|
75
|
+
@encrypted = optional(:encrypted, false)
|
76
|
+
connect
|
77
|
+
end
|
78
|
+
|
79
|
+
def remote_file
|
80
|
+
"#@branch-#@version.tgz#{".cpt" if @encrypted}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def push_file(name, dir, contents)
|
84
|
+
Volley::Log.info ".. #{name}"
|
85
|
+
file = File.basename(name)
|
86
|
+
path = "#{dir}/#{file}"
|
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
|
97
|
+
|
98
|
+
def pull_file(name, dir, ldir=nil)
|
99
|
+
Volley::Log.info ".. <- s3:#@bucket/#{dir}/#{name}"
|
100
|
+
if ldir
|
101
|
+
FileUtils.mkdir_p(ldir)
|
102
|
+
end
|
103
|
+
f = @connection.directories.get(@bucket).files.get("#{dir}/#{name}")
|
104
|
+
contents = f.body
|
105
|
+
if ldir
|
106
|
+
lfile = "#{ldir}/#{name}"
|
107
|
+
File.open(lfile, "w") { |lf| lf.write(contents) }
|
108
|
+
Volley::Log.info ".. <= #{lfile}"
|
109
|
+
else
|
110
|
+
contents
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def connect
|
115
|
+
@connection ||= Fog::Storage.new(
|
116
|
+
:provider => "AWS",
|
117
|
+
:aws_access_key_id => @key,
|
118
|
+
:aws_secret_access_key => @secret,
|
119
|
+
)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Volley
|
2
|
+
module Publisher
|
3
|
+
class Base
|
4
|
+
def initialize(options={ })
|
5
|
+
@options = {
|
6
|
+
:overwrite => false,
|
7
|
+
}.merge(options)
|
8
|
+
load_configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
def projects
|
12
|
+
raise "not implemented"
|
13
|
+
end
|
14
|
+
|
15
|
+
def volleyfile(desc={ })
|
16
|
+
@project = desc[:project]
|
17
|
+
@branch = desc[:branch]
|
18
|
+
@version = desc[:version] && desc[:version] != 'latest' ? desc[:version] : get_latest(@project, @branch)
|
19
|
+
contents = pull_file("Volleyfile", version)
|
20
|
+
dest = @options[:destination] || "/tmp/Volleyfile-#{Time.now.to_i}-#{$$}"
|
21
|
+
raise "File #{dest} already exists" if File.exists?(dest)
|
22
|
+
Volley::Log.debug("saving Volleyfile: #{dest}")
|
23
|
+
File.open(dest, "w") { |f| f.write(contents) }
|
24
|
+
dest
|
25
|
+
end
|
26
|
+
|
27
|
+
def push(project, br, ver, localfiles)
|
28
|
+
@project = project
|
29
|
+
@branch = br
|
30
|
+
@version = ver
|
31
|
+
|
32
|
+
localfiles = [*localfiles].flatten
|
33
|
+
Volley::Log.info ".. pushing:" if @debug
|
34
|
+
|
35
|
+
localfiles.each do |localfile|
|
36
|
+
Volley::Log.info ".. .. #{localfile}" if @debug
|
37
|
+
push_file(localfile, version, File.open(localfile))
|
38
|
+
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
|
+
|
48
|
+
if @version == "latest"
|
49
|
+
@version = get_latest(@project, @branch)
|
50
|
+
end
|
51
|
+
|
52
|
+
Volley::Log.info "remote: #{version}" if @debug
|
53
|
+
Volley::Log.info "remote_file: #{remote_file}" if @debug
|
54
|
+
pull_file(remote_file, version, "#@local/#{version}")
|
55
|
+
|
56
|
+
"#@local/#{version}/#{remote_file}"
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_latest(project, branch)
|
60
|
+
cur = pull_file("latest", "#{project}/#{branch}")
|
61
|
+
(p, n, v) = cur.split(/\//)
|
62
|
+
v
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
def me
|
67
|
+
self.class.name.split("::").last
|
68
|
+
end
|
69
|
+
|
70
|
+
def branch
|
71
|
+
"#@project/#@branch"
|
72
|
+
end
|
73
|
+
|
74
|
+
def version
|
75
|
+
"#{branch}/#@version"
|
76
|
+
end
|
77
|
+
|
78
|
+
def requires(name)
|
79
|
+
v = get_option(name)
|
80
|
+
if v.nil?
|
81
|
+
#ap @options
|
82
|
+
raise "Publisher #{me} requires option #{name}"
|
83
|
+
end
|
84
|
+
v
|
85
|
+
end
|
86
|
+
|
87
|
+
def optional(name, default)
|
88
|
+
get_option(name) || default
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_option(name)
|
92
|
+
n = name.to_sym
|
93
|
+
@options[n]
|
94
|
+
end
|
95
|
+
|
96
|
+
def get_config(name)
|
97
|
+
n = name.to_sym
|
98
|
+
Volley.config.send(n)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Volley
|
2
|
+
module Publisher
|
3
|
+
class Local < Base
|
4
|
+
|
5
|
+
def projects
|
6
|
+
puts "#@directory"
|
7
|
+
Dir["#@directory/*"].map {|e| e.gsub(/#@directory\//,"")}
|
8
|
+
end
|
9
|
+
|
10
|
+
def branches(pr)
|
11
|
+
Dir["#@directory/#{pr}/*"].map {|e| e.gsub(/#@directory\/#{pr}\//,"")}
|
12
|
+
end
|
13
|
+
|
14
|
+
def versions(pr, br)
|
15
|
+
Dir["#@directory/#{pr}/#{br}/*"].map {|e| e.gsub(/#@directory\/#{pr}\/#{br}\//,"")}
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def load_configuration
|
21
|
+
@directory = requires(:directory)
|
22
|
+
@local = requires(:local)
|
23
|
+
@debug = optional(:debug, false)
|
24
|
+
end
|
25
|
+
|
26
|
+
def remote_file
|
27
|
+
"#@branch-#@version.tgz#{".cpt" if @encrypted}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def push_file(local, path, content = nil)
|
31
|
+
Volley::Log.debug "content=#{content.inspect}"
|
32
|
+
local = File.basename(local) if local =~ /^\//
|
33
|
+
dest = "#@directory/#{path}"
|
34
|
+
file = "#{dest}/#{local}"
|
35
|
+
Volley::Log.info".. -> #{dest}"
|
36
|
+
FileUtils.mkdir_p(File.dirname(file))
|
37
|
+
content = content.read if content.is_a?(File)
|
38
|
+
if content
|
39
|
+
File.open(file, "w") { |f| f.write(content) }
|
40
|
+
else
|
41
|
+
FileUtils.copy(local, file)
|
42
|
+
end
|
43
|
+
Volley::Log.info".. => #{file}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def pull_file(file, path, ldir=nil)
|
47
|
+
remote = "#@directory/#{path}"
|
48
|
+
Volley::Log.info".. <- #{remote}/#{file}"
|
49
|
+
if ldir
|
50
|
+
FileUtils.mkdir_p(ldir)
|
51
|
+
end
|
52
|
+
if ldir
|
53
|
+
Volley::Log.info".. <= #@local/#{path}/#{file}"
|
54
|
+
FileUtils.copy("#{remote}/#{file}", "#@local/#{path}")
|
55
|
+
else
|
56
|
+
File.open("#{remote}/#{file}") { |f| f.read }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'volley/scm/base'
|
2
|
+
|
3
|
+
module Volley
|
4
|
+
module Scm
|
5
|
+
class Git < Base
|
6
|
+
def initialize(opt={ })
|
7
|
+
@options = {
|
8
|
+
:update => false
|
9
|
+
}.merge(opt)
|
10
|
+
end
|
11
|
+
|
12
|
+
def branch
|
13
|
+
@branch ||= `git branch`.lines.select {|e| e =~ /^\*/}.first.chomp.split[1]
|
14
|
+
rescue => e
|
15
|
+
Volley::Log.error "git: could not get branch: #{e.message}"
|
16
|
+
Volley::Log.debug e
|
17
|
+
end
|
18
|
+
|
19
|
+
def revision
|
20
|
+
@revision ||= `git log --format='%h' --max-count=1`.chomp
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
@options.delete(:update)
|
25
|
+
up = %x{git pull --rebase}
|
26
|
+
@branch = nil
|
27
|
+
@revision = nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'volley/scm/base'
|
2
|
+
|
3
|
+
module Volley
|
4
|
+
module Scm
|
5
|
+
class Subversion < Base
|
6
|
+
def initialize(opt={ })
|
7
|
+
@options = {
|
8
|
+
:update => false
|
9
|
+
}.merge(opt)
|
10
|
+
end
|
11
|
+
|
12
|
+
def data
|
13
|
+
@data ||= begin
|
14
|
+
update if @options[:update]
|
15
|
+
YAML::load(%x{svn info})
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def branch
|
20
|
+
@branch ||= begin
|
21
|
+
if data["URL"] =~ /\/trunk/
|
22
|
+
"trunk"
|
23
|
+
elsif data["URL"] =~ /\/branches\//
|
24
|
+
m = data["URL"].match(/\/branches\/([^\/]+)\/*/)
|
25
|
+
m[1]
|
26
|
+
else
|
27
|
+
nil
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def revision
|
33
|
+
@revision ||= begin
|
34
|
+
data["Revision"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def update
|
39
|
+
@options.delete(:update)
|
40
|
+
up = %x{svn update}
|
41
|
+
@data = nil
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Volley
|
2
|
+
module VolleyFile
|
3
|
+
class << self
|
4
|
+
def init
|
5
|
+
@loaded = {}
|
6
|
+
["~/.Volleyfile", "/etc/Volleyfile", "../../../conf/common.volleyfile"].each do |f|
|
7
|
+
file = File.expand_path(f, __FILE__)
|
8
|
+
@loaded[file] ||= load(file, :optional => true)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def load(filename, options={ })
|
13
|
+
Volley::Log.debug "LOAD: #{filename} #{options.inspect}"
|
14
|
+
@projects ||= { }
|
15
|
+
file = File.expand_path(filename)
|
16
|
+
config.volleyfile = file if options[:primary]
|
17
|
+
|
18
|
+
if File.file?(file)
|
19
|
+
@loaded[file] ||= instance_eval(File.read(file), file)
|
20
|
+
else
|
21
|
+
raise "cannot read file" unless options[:optional]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def config
|
26
|
+
Volley.config
|
27
|
+
end
|
28
|
+
|
29
|
+
# TOP LEVEL DSL METHODS
|
30
|
+
|
31
|
+
def project(name, o={}, &block)
|
32
|
+
Volley::Log.debug "project: #{name}"
|
33
|
+
Volley::Dsl::Project.project(name, o, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
def publisher(name, o={}, &block)
|
37
|
+
Volley::Dsl::Publisher.publisher(name, o, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
def log(level, dest)
|
41
|
+
Volley::Log.add(level, dest)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/volley.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require "awesome_print"
|
2
|
+
require "ostruct"
|
3
|
+
require "active_support/all"
|
4
|
+
|
5
|
+
require "volley/version"
|
6
|
+
require "volley/config"
|
7
|
+
require "volley/log"
|
8
|
+
require "volley/volley_file"
|
9
|
+
require "volley/publisher/base"
|
10
|
+
|
11
|
+
require "volley/dsl"
|
12
|
+
|
13
|
+
module Volley
|
14
|
+
class << self
|
15
|
+
def process(opts)
|
16
|
+
project = opts[:project]
|
17
|
+
plan = opts[:plan]
|
18
|
+
branch = opts[:branch]
|
19
|
+
version = opts[:version]
|
20
|
+
args = opts[:args]
|
21
|
+
|
22
|
+
begin
|
23
|
+
if Volley::Dsl.project?(project)
|
24
|
+
# we have the project locally
|
25
|
+
pr = Volley::Dsl.project(project)
|
26
|
+
if pr.plan?(plan)
|
27
|
+
# plan is defined
|
28
|
+
pl = pr.plan(plan)
|
29
|
+
pl.call(:rawargs => args)
|
30
|
+
else
|
31
|
+
# plan is not defined
|
32
|
+
raise "could not find plan #{plan} in project #{project}"
|
33
|
+
end
|
34
|
+
else
|
35
|
+
# we dont have the project locally, search the publisher
|
36
|
+
pub = Volley::Dsl.publisher
|
37
|
+
if pub
|
38
|
+
if pub.projects.include?(project)
|
39
|
+
vf = pub.volleyfile(opts)
|
40
|
+
puts "VF:#{vf}"
|
41
|
+
else
|
42
|
+
raise "project #{project} does not exist in configured publisher #{pub.class}"
|
43
|
+
end
|
44
|
+
else
|
45
|
+
raise "project #{project} does not exist locally, and no publisher is configured."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
rescue => e
|
49
|
+
Volley::Log.error "error while processing: #{e.message}"
|
50
|
+
Volley::Log.debug e
|
51
|
+
end
|
52
|
+
|
53
|
+
#if Volley.config.debug
|
54
|
+
# ap Volley::Dsl::Project.projects
|
55
|
+
#end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/volley.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/volley/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Shawn Catanzarite"]
|
6
|
+
gem.email = ["scatanzarite@gmail.com"]
|
7
|
+
gem.description = %q{PubSub Deployment tool}
|
8
|
+
gem.summary = %q{PubSub Deployment tool}
|
9
|
+
gem.homepage = "http://github.com/shawncatz/volley"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "volley"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = "#{Volley::Version::STRING}.alpha1"
|
17
|
+
|
18
|
+
gem.add_dependency "clamp"
|
19
|
+
gem.add_dependency "fog"
|
20
|
+
gem.add_dependency "activesupport"
|
21
|
+
gem.add_dependency "mixlib-shellout"
|
22
|
+
gem.add_dependency "yell"
|
23
|
+
end
|