releasy 0.2.0rc1 → 0.2.0rc2
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/CHANGELOG.md +1 -1
- data/README.md +79 -65
- data/Rakefile +1 -1
- data/lib/releasy/builders.rb +1 -1
- data/lib/releasy/builders/builder.rb +6 -4
- data/lib/releasy/builders/osx_app.rb +49 -27
- data/lib/releasy/builders/source.rb +1 -3
- data/lib/releasy/builders/windows_builder.rb +3 -10
- data/lib/releasy/builders/windows_folder.rb +4 -6
- data/lib/releasy/builders/windows_installer.rb +3 -5
- data/lib/releasy/builders/windows_standalone.rb +1 -3
- data/lib/releasy/builders/{windows_folder_from_ruby_dist.rb → windows_wrapped.rb} +24 -22
- data/lib/releasy/cli/install_sfx.rb +3 -3
- data/lib/releasy/deployers.rb +12 -0
- data/lib/releasy/deployers/deployer.rb +28 -0
- data/lib/releasy/deployers/github.rb +109 -0
- data/lib/releasy/mixins/can_exclude_encoding.rb +22 -0
- data/lib/releasy/mixins/exec.rb +2 -2
- data/lib/releasy/mixins/has_gemspecs.rb +6 -6
- data/lib/releasy/mixins/has_packagers.rb +37 -0
- data/lib/releasy/mixins/log.rb +39 -0
- data/lib/releasy/mixins/register.rb +0 -1
- data/lib/releasy/packagers.rb +12 -0
- data/lib/releasy/{archivers → packagers}/dmg.rb +4 -4
- data/lib/releasy/{archivers → packagers}/exe.rb +4 -4
- data/lib/releasy/{archivers/archiver.rb → packagers/packager.rb} +20 -11
- data/lib/releasy/packagers/seven_zip.rb +12 -0
- data/lib/releasy/{archivers → packagers}/tar_bzip2.rb +4 -4
- data/lib/releasy/{archivers → packagers}/tar_gzip.rb +4 -4
- data/lib/releasy/{archivers/tar_archiver.rb → packagers/tar_packager.rb} +4 -4
- data/lib/releasy/{archivers → packagers}/zip.rb +4 -4
- data/lib/releasy/project.rb +105 -46
- data/lib/releasy/version.rb +1 -1
- data/lib/releasy/windows_wrapper_maker.rb +0 -3
- data/releasy.gemspec +1 -0
- data/test/releasy/builders/helpers/helper.rb +0 -1
- data/test/releasy/builders/osx_app_test.rb +18 -8
- data/test/releasy/builders/{windows_folder_from_ruby_dist_test.rb → windows_wrapped_test.rb} +16 -14
- data/test/releasy/deployers/github_test.rb +133 -0
- data/test/releasy/deployers/helpers/helper.rb +19 -0
- data/test/releasy/integration/source_test.rb +25 -6
- data/test/releasy/mixins/log_test.rb +15 -0
- data/test/releasy/mixins/register_test.rb +0 -1
- data/test/releasy/{archivers_test.rb → packagers_test.rb} +16 -19
- data/test/releasy/project_test.rb +33 -29
- data/test/teststrap.rb +3 -1
- data/test/yard_test.rb +1 -1
- metadata +55 -34
- data/lib/releasy/archivers.rb +0 -12
- data/lib/releasy/archivers/seven_zip.rb +0 -12
- data/lib/releasy/mixins/has_archivers.rb +0 -37
@@ -0,0 +1,37 @@
|
|
1
|
+
module Releasy
|
2
|
+
module Mixins
|
3
|
+
# An object that owns one or more instances of {Packagers::Packager}
|
4
|
+
module HasPackagers
|
5
|
+
# Add an archive type to be generated for each of your outputs.
|
6
|
+
# @see Project#initialize
|
7
|
+
# @param type [:exe, :"7z", :tar_bz2, :tar_gz, :zip]
|
8
|
+
# @return [Project] self
|
9
|
+
def add_package(type, &block)
|
10
|
+
raise ArgumentError, "Unsupported archive format #{type.inspect}" unless Packagers.has_type? type
|
11
|
+
raise ArgumentError, "Already have archive format #{type.inspect}" if packagers.any? {|a| a.type == type }
|
12
|
+
|
13
|
+
packager = Packagers[type].new(respond_to?(:project) ? project : self)
|
14
|
+
packagers << packager
|
15
|
+
|
16
|
+
if block_given?
|
17
|
+
if block.arity == 0
|
18
|
+
DSLWrapper.new(packager, &block)
|
19
|
+
else
|
20
|
+
yield packager
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
packager
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
def packagers; @packagers ||= []; end
|
29
|
+
|
30
|
+
protected
|
31
|
+
# @return [Array<Packager>]
|
32
|
+
def active_packagers
|
33
|
+
packagers
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Releasy::Mixins::Log
|
2
|
+
class << self
|
3
|
+
LOG_LEVELS = [:silent, :quiet, :verbose]
|
4
|
+
DEFAULT_LOG_LEVEL = :quiet
|
5
|
+
|
6
|
+
def log_level; @log_level ||= DEFAULT_LOG_LEVEL; end
|
7
|
+
def log_level=(level)
|
8
|
+
raise ArgumentError, "Bad log_level: #{level.inspect}" unless LOG_LEVELS.include? level
|
9
|
+
@log_level = level
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def log_level; Releasy::Mixins::Log.log_level; end
|
14
|
+
|
15
|
+
# Options for fileutils commands, based on log_level.
|
16
|
+
def fileutils_options
|
17
|
+
{ :verbose => log_level == :verbose }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Heading message shown unless :silent
|
21
|
+
def heading(str)
|
22
|
+
puts "=== #{str}" unless log_level == :silent
|
23
|
+
end
|
24
|
+
|
25
|
+
# Heading message shown if :verbose
|
26
|
+
def info(str)
|
27
|
+
puts str if log_level == :verbose
|
28
|
+
end
|
29
|
+
|
30
|
+
# Warning message shown unless :silent
|
31
|
+
def warn(str)
|
32
|
+
puts "=== WARNING: #{str}" unless log_level == :silent
|
33
|
+
end
|
34
|
+
|
35
|
+
# Error message always shown.
|
36
|
+
def error(str)
|
37
|
+
puts "=== ERROR: #{str}"
|
38
|
+
end
|
39
|
+
end
|
@@ -35,7 +35,6 @@ module Releasy
|
|
35
35
|
# @param klass [Object] Object, which is defined within the namespace being registered with.
|
36
36
|
def register(klass)
|
37
37
|
raise TypeError, "Can only register classes" unless klass.is_a? Class
|
38
|
-
raise ArgumentError, "Can't register a class not within this module" unless klass.name.split('::')[0...-1].join('::') == name
|
39
38
|
raise ArgumentError, "To register, a class must have TYPE defined" unless klass.const_defined? :TYPE
|
40
39
|
registered[klass::TYPE] = klass
|
41
40
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'releasy/mixins/register'
|
2
|
+
|
3
|
+
module Releasy
|
4
|
+
# Contains all {Packager} types.
|
5
|
+
module Packagers
|
6
|
+
extend Mixins::Register
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
%w[dmg exe seven_zip tar_bzip2 tar_gzip zip].each do |packager|
|
11
|
+
require "releasy/packagers/#{packager}"
|
12
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
4
|
+
module Packagers
|
5
5
|
# OS X .dmg format (self-extractor).
|
6
|
-
class Dmg <
|
6
|
+
class Dmg < Packager
|
7
7
|
TYPE = :dmg
|
8
8
|
DEFAULT_EXTENSION = ".dmg"
|
9
9
|
|
10
|
-
|
10
|
+
Packagers.register self
|
11
11
|
|
12
12
|
protected
|
13
13
|
def command(folder)
|
@@ -1,18 +1,18 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
4
|
+
module Packagers
|
5
5
|
# Windows self-extracting archive.
|
6
6
|
#
|
7
7
|
# If not on Windows, run "releasy install-sfx" after installing 7z, before you can use this.
|
8
|
-
class Exe <
|
8
|
+
class Exe < Packager
|
9
9
|
TYPE = :exe
|
10
10
|
DEFAULT_EXTENSION = ".exe"
|
11
11
|
|
12
12
|
SFX_NAME = "7z.sfx"
|
13
13
|
SFX_FILE = File.expand_path("../../../../bin/#{SFX_NAME}", __FILE__)
|
14
14
|
|
15
|
-
|
15
|
+
Packagers.register self
|
16
16
|
|
17
17
|
protected
|
18
18
|
def command(folder)
|
@@ -1,22 +1,30 @@
|
|
1
1
|
require 'digest/md5'
|
2
2
|
|
3
3
|
require "releasy/mixins/exec"
|
4
|
+
require "releasy/mixins/log"
|
4
5
|
|
5
6
|
module Releasy
|
6
|
-
module
|
7
|
+
module Packagers
|
7
8
|
# Archives a build folder.
|
8
9
|
#
|
9
10
|
# @abstract
|
10
|
-
|
11
|
+
# @attr extension [String] Extension of archive to be created (such as ".zip").
|
12
|
+
class Packager
|
11
13
|
include Rake::DSL
|
12
14
|
include Mixins::Exec
|
15
|
+
include Mixins::Log
|
13
16
|
|
14
17
|
MD5_READ_SIZE = 128 * 64 # MD5 likes 128 byte chunks.
|
15
18
|
|
16
|
-
# @return [Project] Project this
|
19
|
+
# @return [Project] Project this Packager was created by.
|
17
20
|
attr_reader :project
|
18
|
-
|
19
|
-
|
21
|
+
|
22
|
+
attr_reader :extension
|
23
|
+
def extension=(extension)
|
24
|
+
raise TypeError "extension must be a String" unless extension.is_a? String
|
25
|
+
raise ArgumentError, "extension must be valid, such as '.zip'" unless extension =~ /^\.[a-z0-9\.]+$/
|
26
|
+
@extension = extension
|
27
|
+
end
|
20
28
|
|
21
29
|
def type; self.class::TYPE; end
|
22
30
|
|
@@ -27,10 +35,12 @@ module Archivers
|
|
27
35
|
|
28
36
|
protected
|
29
37
|
# Generate tasks to create the archive of this file.
|
30
|
-
def generate_tasks(output_task, folder)
|
38
|
+
def generate_tasks(output_task, folder, deployers)
|
31
39
|
pkg = package folder
|
32
40
|
|
33
|
-
|
41
|
+
deployers.each {|d| d.send :generate_tasks, "#{output_task}:#{type}", folder, extension }
|
42
|
+
|
43
|
+
desc "Package #{output_task.tr(":", " ")} #{extension}"
|
34
44
|
task "package:#{output_task}:#{type}" => pkg
|
35
45
|
|
36
46
|
file pkg => folder do
|
@@ -41,10 +51,9 @@ module Archivers
|
|
41
51
|
protected
|
42
52
|
def archive(folder)
|
43
53
|
pkg = package folder
|
44
|
-
Rake::FileUtilsExt.verbose project.verbose?
|
45
54
|
|
46
|
-
|
47
|
-
rm pkg if File.exist? pkg
|
55
|
+
heading "Creating #{pkg}"
|
56
|
+
rm pkg, fileutils_options if File.exist? pkg
|
48
57
|
cd project.output_path do
|
49
58
|
exec command(File.basename folder)
|
50
59
|
end
|
@@ -53,7 +62,7 @@ module Archivers
|
|
53
62
|
end
|
54
63
|
|
55
64
|
protected
|
56
|
-
def package(folder); "#{folder}#{extension
|
65
|
+
def package(folder); "#{folder}#{extension}"; end
|
57
66
|
|
58
67
|
protected
|
59
68
|
def command(folder)
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/tar_packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
4
|
+
module Packagers
|
5
5
|
# Archives with tar and Bzip2 formats.
|
6
|
-
class TarBzip2 <
|
6
|
+
class TarBzip2 < TarPackager
|
7
7
|
TYPE = :tar_bz2
|
8
8
|
DEFAULT_EXTENSION = ".tar.bz2"
|
9
9
|
FORMAT = "bzip2"
|
10
|
-
|
10
|
+
Packagers.register self
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/tar_packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
4
|
+
module Packagers
|
5
5
|
# Archives with tar and Gzip formats.
|
6
|
-
class TarGzip <
|
6
|
+
class TarGzip < TarPackager
|
7
7
|
TYPE = :tar_gz
|
8
8
|
DEFAULT_EXTENSION = ".tar.gz"
|
9
9
|
FORMAT = "gzip"
|
10
|
-
|
10
|
+
Packagers.register self
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
5
|
-
# An
|
4
|
+
module Packagers
|
5
|
+
# An packager that tars and then compresses the folder.
|
6
6
|
# @abstract
|
7
|
-
class
|
7
|
+
class TarPackager < Packager
|
8
8
|
protected
|
9
9
|
def command(folder)
|
10
10
|
%[7z a -so -mmt -bd -ttar "#{folder}.tar" "#{folder}" | 7z a -si -bd -t#{self.class::FORMAT} -mx9 "#{folder}#{extension}"]
|
@@ -1,12 +1,12 @@
|
|
1
|
-
require "releasy/
|
1
|
+
require "releasy/packagers/packager"
|
2
2
|
|
3
3
|
module Releasy
|
4
|
-
module
|
4
|
+
module Packagers
|
5
5
|
# Archives with zip format. This isn't efficient, but can be decompressed on Windows Vista or later without requiring a 3rd party tool.
|
6
|
-
class Zip <
|
6
|
+
class Zip < Packager
|
7
7
|
TYPE = :zip
|
8
8
|
DEFAULT_EXTENSION = ".zip"
|
9
|
-
|
9
|
+
Packagers.register self
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
data/lib/releasy/project.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
require 'releasy/dsl_wrapper'
|
2
2
|
require 'releasy/builders'
|
3
|
-
require 'releasy/
|
4
|
-
require
|
3
|
+
require 'releasy/packagers'
|
4
|
+
require 'releasy/deployers'
|
5
|
+
require "releasy/mixins/has_packagers"
|
6
|
+
require "releasy/mixins/can_exclude_encoding"
|
7
|
+
require "releasy/mixins/log"
|
5
8
|
|
6
9
|
module Releasy
|
7
10
|
# A description of the Ruby application that is being build for release and what packages to make from it.
|
@@ -14,7 +17,9 @@ module Releasy
|
|
14
17
|
# @attr exposed_files [Rake::FileList] Files which should always be copied into the archive folder root, so they are always visible to the user. e.g readme, change-log and/or license files.
|
15
18
|
class Project
|
16
19
|
include Rake::DSL
|
17
|
-
include Mixins::
|
20
|
+
include Mixins::HasPackagers
|
21
|
+
include Mixins::CanExcludeEncoding
|
22
|
+
include Mixins::Log
|
18
23
|
|
19
24
|
DEFAULT_PACKAGE_FOLDER = "pkg"
|
20
25
|
|
@@ -29,11 +34,10 @@ module Releasy
|
|
29
34
|
|
30
35
|
# Make the tasks give more detailed output.
|
31
36
|
# @return [nil]
|
32
|
-
def verbose;
|
33
|
-
# Make the tasks give
|
37
|
+
def verbose; Mixins::Log.log_level = :verbose; end
|
38
|
+
# Make the tasks give no output at all.
|
34
39
|
# @return [nil]
|
35
|
-
def
|
36
|
-
def verbose?; @verbose; end
|
40
|
+
def silent; Mixins::Log.log_level = :silent; end
|
37
41
|
|
38
42
|
# Create MD5 hashes for created archives.
|
39
43
|
# @return [nil]
|
@@ -41,10 +45,6 @@ module Releasy
|
|
41
45
|
def create_md5s?; @create_md5s; end
|
42
46
|
protected :create_md5s?
|
43
47
|
|
44
|
-
# Verbosity of the console output.
|
45
|
-
# @return [Boolean] True to make the tasks output more information.
|
46
|
-
def verbose?; @verbose; end
|
47
|
-
|
48
48
|
def exposed_files; @exposed_files; end
|
49
49
|
def exposed_files=(files); @exposed_files = Rake::FileList.new files; end
|
50
50
|
|
@@ -89,7 +89,7 @@ module Releasy
|
|
89
89
|
# name "My Application"
|
90
90
|
# version "1.2.4"
|
91
91
|
# add_build :source do
|
92
|
-
#
|
92
|
+
# add_package :tar_gz do
|
93
93
|
# extension ".tgz"
|
94
94
|
# end
|
95
95
|
# end
|
@@ -106,7 +106,7 @@ module Releasy
|
|
106
106
|
# p.name = "My Application"
|
107
107
|
# p.version = "1.2.4"
|
108
108
|
# p.add_build :source do |b|
|
109
|
-
# b.
|
109
|
+
# b.add_package :tar_gz do |a|
|
110
110
|
# a.extension = ".tgz"
|
111
111
|
# end
|
112
112
|
# end
|
@@ -122,19 +122,19 @@ module Releasy
|
|
122
122
|
# project.name = "My Application"
|
123
123
|
# project.version = "1.2.4"
|
124
124
|
# builder = project.add_build :source
|
125
|
-
#
|
126
|
-
#
|
125
|
+
# packager = builder.add_package :zip
|
126
|
+
# packager.extension = ".tgz"
|
127
127
|
# project.generate_tasks # This has to be done manually.
|
128
128
|
#
|
129
129
|
def initialize(&block)
|
130
130
|
super()
|
131
131
|
|
132
132
|
@builders = []
|
133
|
+
@deployers = []
|
133
134
|
@links = {}
|
134
135
|
@files = Rake::FileList.new
|
135
136
|
@exposed_files = Rake::FileList.new
|
136
137
|
@output_path = DEFAULT_PACKAGE_FOLDER
|
137
|
-
@verbose = true
|
138
138
|
@create_md5s = false
|
139
139
|
@name = @underscored_name = @underscored_version = nil
|
140
140
|
@version = @executable = nil
|
@@ -152,13 +152,13 @@ module Releasy
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
# Add a type of
|
155
|
+
# Add a type of build to produce. Must define at least one of these.
|
156
156
|
# @see #initialize
|
157
|
-
# @param type [:osx_app, :source, :windows_folder, :
|
157
|
+
# @param type [:osx_app, :source, :windows_folder, :windows_wrapped, :windows_installer, :windows_standalone]
|
158
158
|
# @return [Project] self
|
159
159
|
def add_build(type, &block)
|
160
160
|
raise ArgumentError, "Unsupported output type #{type}" unless Builders.has_type? type
|
161
|
-
raise
|
161
|
+
raise ArgumentError, "Already have output #{type.inspect}" if @builders.any? {|b| b.type == type }
|
162
162
|
|
163
163
|
builder = Builders[type].new(self)
|
164
164
|
@builders << builder
|
@@ -174,6 +174,28 @@ module Releasy
|
|
174
174
|
builder
|
175
175
|
end
|
176
176
|
|
177
|
+
# Add a deployment method for archived packages.
|
178
|
+
# @see #initialize
|
179
|
+
# @param type [:github]
|
180
|
+
# @return [Project] self
|
181
|
+
def add_deploy(type, &block)
|
182
|
+
raise ArgumentError, "Unsupported deploy type #{type}" unless Deployers.has_type? type
|
183
|
+
raise ArgumentError, "Already have deploy #{type.inspect}" if @deployers.any? {|b| b.type == type }
|
184
|
+
|
185
|
+
deployer = Deployers[type].new(self)
|
186
|
+
@deployers << deployer
|
187
|
+
|
188
|
+
if block_given?
|
189
|
+
if block.arity == 0
|
190
|
+
DSLWrapper.new(deployer, &block)
|
191
|
+
else
|
192
|
+
yield deployer
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
deployer
|
197
|
+
end
|
198
|
+
|
177
199
|
# Add a link file to be included in the win32 releases. Will create the file _title.url_ for you.
|
178
200
|
#
|
179
201
|
# @param url [String] Url to link to.
|
@@ -188,7 +210,7 @@ module Releasy
|
|
188
210
|
# Generates all tasks required by the user. Automatically called at the end of the block, if {#initialize} is given a block.
|
189
211
|
# @return [Project] self
|
190
212
|
def generate_tasks
|
191
|
-
raise ConfigError, "Must
|
213
|
+
raise ConfigError, "Must use #add_build at least once before tasks can be generated" if @builders.empty?
|
192
214
|
|
193
215
|
# Even if there are builders specified, none may work on this platform.
|
194
216
|
return if active_builders.empty?
|
@@ -210,11 +232,11 @@ module Releasy
|
|
210
232
|
end
|
211
233
|
|
212
234
|
build_groups.each_pair do |group, tasks|
|
213
|
-
desc "Build all #{group}
|
235
|
+
desc "Build all #{group}"
|
214
236
|
task "build:#{group}" => tasks
|
215
237
|
end
|
216
238
|
|
217
|
-
desc "Build
|
239
|
+
desc "Build #{description}"
|
218
240
|
task "build" => build_outputs
|
219
241
|
|
220
242
|
generate_archive_tasks
|
@@ -222,10 +244,12 @@ module Releasy
|
|
222
244
|
self
|
223
245
|
end
|
224
246
|
|
225
|
-
|
226
|
-
def
|
227
|
-
|
228
|
-
end
|
247
|
+
# Full name of the project, including the version name E.g. "My Application" or "My Application 0.1"
|
248
|
+
def description; name ? "#{name}#{version ? " #{version}" : ""}" : nil; end
|
249
|
+
# Full underscored name of the project. E.g. "my_application" or "my_application_0_1"
|
250
|
+
def underscored_description; underscored_name ? "#{underscored_name}#{version ? "_#{underscored_version}" : ""}" : nil; end
|
251
|
+
# Base name of folders that will be created, such as "pkg/my_application" or "pkg/my_application_0_1"
|
252
|
+
def folder_base; File.join(output_path, underscored_description.to_s); end
|
229
253
|
|
230
254
|
protected
|
231
255
|
# Only allow access to this from Builder
|
@@ -249,52 +273,87 @@ module Releasy
|
|
249
273
|
windows_tasks = []
|
250
274
|
osx_tasks = []
|
251
275
|
top_level_tasks = []
|
276
|
+
|
252
277
|
active_builders.each do |builder|
|
253
278
|
output_task = builder.type.to_s.sub '_', ':'
|
254
279
|
|
255
|
-
|
256
|
-
|
257
|
-
|
280
|
+
packagers = active_packagers(builder)
|
281
|
+
packagers.each do |packager|
|
282
|
+
packager.send :generate_tasks, output_task, builder.send(:folder), @deployers
|
283
|
+
|
284
|
+
task "deploy:#{output_task}:#{packager.type}" => @deployers.map {|d| "deploy:#{output_task}:#{packager.type}:#{d.type}" }
|
258
285
|
end
|
259
286
|
|
260
|
-
|
261
|
-
|
287
|
+
@deployers.each do |deployer|
|
288
|
+
task "deploy:#{output_task}:#{deployer.type}" => packagers.map {|a| "deploy:#{output_task}:#{a.type}:#{deployer.type}" }
|
289
|
+
end
|
290
|
+
|
291
|
+
task "package:#{output_task}" => packagers.map {|a| "package:#{output_task}:#{a.type}" }
|
262
292
|
|
263
293
|
case output_task
|
264
294
|
when /^windows:/
|
265
|
-
windows_tasks << "
|
266
|
-
top_level_tasks << "
|
295
|
+
windows_tasks << "#{output_task}"
|
296
|
+
top_level_tasks << "windows" unless top_level_tasks.include? "windows"
|
267
297
|
when /^osx:/
|
268
298
|
osx_tasks << "package:#{output_task}"
|
269
|
-
top_level_tasks << "
|
299
|
+
top_level_tasks << "osx" unless top_level_tasks.include? "osx"
|
270
300
|
else
|
271
|
-
top_level_tasks << "
|
301
|
+
top_level_tasks << "#{output_task}"
|
272
302
|
end
|
273
303
|
end
|
274
304
|
|
305
|
+
# Windows tasks.
|
275
306
|
unless windows_tasks.empty?
|
276
|
-
|
277
|
-
|
307
|
+
task "package:windows" => windows_tasks.map {|t| "package:#{t}" }
|
308
|
+
|
309
|
+
generate_deploy_tasks "windows", windows_tasks
|
278
310
|
end
|
279
311
|
|
312
|
+
# OS X tasks.
|
280
313
|
unless osx_tasks.empty?
|
281
|
-
|
282
|
-
|
314
|
+
task "package:osx" => osx_tasks.map {|t| "package:#{t}" }
|
315
|
+
|
316
|
+
generate_deploy_tasks "osx", osx_tasks
|
283
317
|
end
|
284
318
|
|
285
|
-
|
286
|
-
|
319
|
+
# Top level tasks.
|
320
|
+
desc "Package #{description}"
|
321
|
+
task "package" => top_level_tasks.map {|t| "package:#{t}" }
|
322
|
+
|
323
|
+
unless @deployers.empty?
|
324
|
+
desc "Deploy #{description}"
|
325
|
+
task "deploy" => top_level_tasks.map {|t| "deploy:#{t}" }
|
326
|
+
|
327
|
+
generate_deploy_tasks "", top_level_tasks
|
328
|
+
end
|
287
329
|
|
288
330
|
self
|
289
331
|
end
|
290
332
|
|
291
333
|
protected
|
292
|
-
def
|
293
|
-
|
294
|
-
|
295
|
-
|
334
|
+
def generate_deploy_tasks(task_name, tasks)
|
335
|
+
deploy_task = task_name.empty? ? "deploy" : "deploy:#{task_name}"
|
336
|
+
|
337
|
+
unless @deployers.empty?
|
338
|
+
task deploy_task => tasks.map {|t| "deploy:#{t}" }
|
339
|
+
|
340
|
+
@deployers.each do |deployer|
|
341
|
+
task "#{deploy_task}:#{deployer.type}" => tasks.map {|t| "deploy:#{t}:#{deployer.type}" }
|
342
|
+
end
|
343
|
+
|
344
|
+
tasks.each do |t|
|
345
|
+
task "deploy:#{t}" => @deployers.map {|d| "deploy:#{t}:#{d.type}" }
|
346
|
+
end
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
protected
|
351
|
+
def active_packagers(builder)
|
352
|
+
# Use packagers specifically set on the builder and those set globally that aren't on the builder.
|
353
|
+
packagers = builder.send(:active_packagers)
|
354
|
+
packager_types = packagers.map(&:type)
|
296
355
|
|
297
|
-
|
356
|
+
packagers + super().reject {|a| packager_types.include? a.type }
|
298
357
|
end
|
299
358
|
end
|
300
359
|
end
|