releasy 0.2.0 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +3 -1
- data/CHANGELOG.md +9 -0
- data/README.md +114 -41
- data/Rakefile +1 -1
- data/bin/7z_sfx_LICENSE.txt +56 -0
- data/bin/7za.exe +0 -0
- data/bin/7za_exe_LICENSE.txt +29 -0
- data/lib/releasy.rb +4 -1
- data/lib/releasy/builders/builder.rb +14 -6
- data/lib/releasy/builders/ocra_builder.rb +4 -2
- data/lib/releasy/builders/osx_app.rb +18 -6
- data/lib/releasy/builders/source.rb +9 -2
- data/lib/releasy/builders/windows_folder.rb +12 -3
- data/lib/releasy/builders/windows_installer.rb +2 -3
- data/lib/releasy/builders/windows_standalone.rb +13 -3
- data/lib/releasy/builders/windows_wrapped.rb +14 -4
- data/lib/releasy/cli/install_sfx.rb +1 -1
- data/lib/releasy/deployers.rb +1 -1
- data/lib/releasy/deployers/deployer.rb +22 -1
- data/lib/releasy/deployers/github.rb +31 -124
- data/lib/releasy/deployers/local.rb +55 -0
- data/lib/releasy/deployers/rsync.rb +59 -0
- data/lib/releasy/mixins/has_packagers.rb +1 -1
- data/lib/releasy/mixins/utilities.rb +34 -0
- data/lib/releasy/packagers/dmg.rb +17 -0
- data/lib/releasy/packagers/exe.rb +18 -1
- data/lib/releasy/packagers/packager.rb +22 -6
- data/lib/releasy/packagers/seven_zip.rb +17 -0
- data/lib/releasy/packagers/tar_bzip2.rb +19 -0
- data/lib/releasy/packagers/tar_gzip.rb +19 -0
- data/lib/releasy/packagers/tar_packager.rb +2 -1
- data/lib/releasy/packagers/zip.rb +17 -0
- data/lib/releasy/project.rb +45 -4
- data/lib/releasy/version.rb +1 -1
- data/releasy.gemspec +1 -1
- data/test/releasy/builders/data/Main.rb +3 -2
- data/test/releasy/builders/helpers/builder_helper.rb +35 -0
- data/test/releasy/builders/helpers/ocra_builder_helper.rb +31 -0
- data/test/releasy/builders/helpers/windows_builder_helper.rb +25 -0
- data/test/releasy/builders/osx_app_test.rb +6 -4
- data/test/releasy/builders/source_test.rb +7 -4
- data/test/releasy/builders/windows_folder_test.rb +3 -1
- data/test/releasy/builders/windows_installer_test.rb +6 -4
- data/test/releasy/builders/windows_standalone_test.rb +6 -4
- data/test/releasy/builders/windows_wrapped_test.rb +3 -1
- data/test/releasy/cli/install_sfx_test.rb +1 -1
- data/test/releasy/deployers/github_test.rb +30 -32
- data/test/releasy/deployers/local_test.rb +93 -0
- data/test/releasy/deployers/rsync_test.rb +55 -0
- data/test/releasy/integration/source_test.rb +6 -6
- data/test/releasy/mixins/utilities_test.rb +50 -0
- data/test/releasy/packagers/packager_test.rb +79 -0
- data/test/releasy/packagers_test.rb +12 -6
- data/test/releasy/project_test.rb +5 -5
- data/test/teststrap.rb +6 -0
- data/test/yard_test.rb +1 -1
- metadata +40 -28
- data/lib/releasy/mixins/exec.rb +0 -14
- data/test/releasy/builders/ocra_builder_test.rb +0 -37
- data/test/releasy/builders/windows_builder_test.rb +0 -26
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'releasy/deployers/deployer'
|
2
|
+
|
3
|
+
module Releasy
|
4
|
+
module Deployers
|
5
|
+
# Deploys (copies) to a local destination, such as into your Dropbox folder.
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source
|
11
|
+
# add_package :zip
|
12
|
+
# add_deploy :local do
|
13
|
+
# path "C:/Users/X/Dropbox/Public" # Required.
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @attr path [String] Path to copy files to.
|
18
|
+
class Local < Deployer
|
19
|
+
TYPE = :local
|
20
|
+
|
21
|
+
Deployers.register self
|
22
|
+
|
23
|
+
attr_reader :path
|
24
|
+
def path=(path)
|
25
|
+
raise TypeError, "path must be a String, but received #{path.class}" unless path.is_a? String
|
26
|
+
@path = path
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def setup
|
31
|
+
@path = nil
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
# @param file [String] Path to file to deploy.
|
36
|
+
# @return [nil]
|
37
|
+
def deploy(file)
|
38
|
+
raise ConfigError, "#path must be set" unless path
|
39
|
+
|
40
|
+
destination = File.join path, File.basename(file)
|
41
|
+
raise ConfigError, "#path is same as build directory" if File.expand_path(destination) == File.expand_path(file)
|
42
|
+
|
43
|
+
# If destination file already exists or is as new as the one we are going to copy over it, don't bother.
|
44
|
+
if (not File.exists?(destination)) or (File.ctime(destination) < File.ctime(file))
|
45
|
+
mkdir_p path, fileutils_options unless File.exists? path
|
46
|
+
cp file, path, fileutils_options.merge(:force => File.exists?(destination))
|
47
|
+
else
|
48
|
+
warn "Skipping '#{File.basename(file)}' because it already exists in '#{path}'"
|
49
|
+
end
|
50
|
+
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'releasy/deployers/deployer'
|
2
|
+
require "releasy/mixins/utilities"
|
3
|
+
|
4
|
+
module Releasy
|
5
|
+
module Deployers
|
6
|
+
# Deploys to a remote server, using the rsync command.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# Releasy::Project.new do
|
10
|
+
# name "My App"
|
11
|
+
# add_build :source
|
12
|
+
# add_package :zip
|
13
|
+
# add_deploy :rsync do
|
14
|
+
# destination "example.com:/var/www/sites/mysite/downloads" # Required.
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# @attr destination [String] Location to deploy to, such as "example.com:/var/www/sites/mysite/downloads".
|
19
|
+
# @attr options [String] ('-glpPrtvz') Options to pass to rsync.
|
20
|
+
class Rsync < Deployer
|
21
|
+
include Mixins::Utilities
|
22
|
+
|
23
|
+
TYPE = :rsync
|
24
|
+
DEFAULT_OPTIONS = '-glpPrtvz'
|
25
|
+
|
26
|
+
Deployers.register self
|
27
|
+
|
28
|
+
attr_reader :destination
|
29
|
+
def destination=(destination)
|
30
|
+
raise TypeError, "destination must be a String, but received #{destination.inspect}" unless destination.is_a? String
|
31
|
+
raise ArgumentError, 'destination requires no trailing slash' if destination[-1,1] == '/'
|
32
|
+
@destination = destination
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :options
|
36
|
+
def options=(options)
|
37
|
+
raise TypeError, "options must be a String, but received #{options.inspect}" unless options.is_a? String
|
38
|
+
@options = options
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
def setup
|
43
|
+
@destination = nil
|
44
|
+
@options = DEFAULT_OPTIONS
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
# @param file [String] Path to file to deploy.
|
49
|
+
# @return [nil]
|
50
|
+
def deploy(file)
|
51
|
+
raise ConfigError, "#destination must be set" unless destination
|
52
|
+
|
53
|
+
execute_command %[rsync #{options} "#{File.expand_path file}" "#{destination.chomp "/"}"]
|
54
|
+
|
55
|
+
nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Releasy
|
2
|
+
module Mixins
|
3
|
+
module Utilities
|
4
|
+
protected
|
5
|
+
# Executes command, and prints out command and result only if the project is verbose.
|
6
|
+
# Requires {Log} to be included.
|
7
|
+
# Returns true if the command succeeded. False if it failed.
|
8
|
+
def execute_command(command)
|
9
|
+
info command
|
10
|
+
|
11
|
+
begin
|
12
|
+
IO.popen command do |output|
|
13
|
+
info output.gets.strip until output.eof?
|
14
|
+
end
|
15
|
+
|
16
|
+
true
|
17
|
+
rescue Errno::ENOENT
|
18
|
+
false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
# Is a particular command available on this system?
|
24
|
+
def command_available?(command)
|
25
|
+
find = Releasy.win_platform? ? "where" : "which"
|
26
|
+
!!Kernel.`("#{find} #{command}")
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def null_file; Releasy.win_platform? ? "NUL" : "/dev/null"; end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -3,6 +3,23 @@ require "releasy/packagers/packager"
|
|
3
3
|
module Releasy
|
4
4
|
module Packagers
|
5
5
|
# OS X .dmg format (self-extractor).
|
6
|
+
#
|
7
|
+
# @example Package a particular build.
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source do
|
11
|
+
# add_package :dmg
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# @example Package all builds.
|
16
|
+
# Releasy::Project.new do
|
17
|
+
# name "My App"
|
18
|
+
# add_build :source
|
19
|
+
# add_build :windows_folder
|
20
|
+
# add_package :dmg
|
21
|
+
# end
|
22
|
+
#
|
6
23
|
class Dmg < Packager
|
7
24
|
TYPE = :dmg
|
8
25
|
DEFAULT_EXTENSION = ".dmg"
|
@@ -5,6 +5,23 @@ module Releasy
|
|
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
|
+
#
|
9
|
+
# @example Package a particular build.
|
10
|
+
# Releasy::Project.new do
|
11
|
+
# name "My App"
|
12
|
+
# add_build :source do
|
13
|
+
# add_package :exe
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example Package all builds.
|
18
|
+
# Releasy::Project.new do
|
19
|
+
# name "My App"
|
20
|
+
# add_build :source
|
21
|
+
# add_build :windows_folder
|
22
|
+
# add_package :exe
|
23
|
+
# end
|
24
|
+
#
|
8
25
|
class Exe < Packager
|
9
26
|
TYPE = :exe
|
10
27
|
DEFAULT_EXTENSION = ".exe"
|
@@ -16,7 +33,7 @@ module Releasy
|
|
16
33
|
|
17
34
|
protected
|
18
35
|
def command(folder)
|
19
|
-
%[
|
36
|
+
%[#{seven_zip_command} a -mmt -bd -t7z -mx9 -sfx#{SFX_NAME} "#{package(folder)}" "#{folder}"]
|
20
37
|
end
|
21
38
|
end
|
22
39
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'digest/md5'
|
2
2
|
|
3
|
-
require "releasy/mixins/
|
3
|
+
require "releasy/mixins/utilities"
|
4
4
|
require "releasy/mixins/log"
|
5
5
|
|
6
6
|
module Releasy
|
@@ -11,7 +11,7 @@ module Packagers
|
|
11
11
|
# @attr extension [String] Extension of archive to be created (such as ".zip").
|
12
12
|
class Packager
|
13
13
|
include Rake::DSL
|
14
|
-
include Mixins::
|
14
|
+
include Mixins::Utilities
|
15
15
|
include Mixins::Log
|
16
16
|
|
17
17
|
MD5_READ_SIZE = 128 * 64 # MD5 likes 128 byte chunks.
|
@@ -21,7 +21,7 @@ module Packagers
|
|
21
21
|
|
22
22
|
attr_reader :extension
|
23
23
|
def extension=(extension)
|
24
|
-
raise TypeError "extension must be a String" unless extension.is_a? String
|
24
|
+
raise TypeError, "extension must be a String" unless extension.is_a? String
|
25
25
|
raise ArgumentError, "extension must be valid, such as '.zip'" unless extension =~ /^\.[a-z0-9\.]+$/
|
26
26
|
@extension = extension
|
27
27
|
end
|
@@ -33,6 +33,22 @@ module Packagers
|
|
33
33
|
@extension = self.class::DEFAULT_EXTENSION
|
34
34
|
end
|
35
35
|
|
36
|
+
protected
|
37
|
+
# Finds
|
38
|
+
def seven_zip_command
|
39
|
+
@seven_zip_command ||= begin
|
40
|
+
if command_available? "7za"
|
41
|
+
"7za" # Installed standalone command line version. Included with CLI and GUI releases.
|
42
|
+
elsif command_available? "7z"
|
43
|
+
"7z" # Installed CLI version only included with gui version.
|
44
|
+
elsif Releasy.win_platform?
|
45
|
+
%["#{File.expand_path("../../../../bin/7za.exe", __FILE__)}"]
|
46
|
+
else
|
47
|
+
raise CommandNotFoundError, "Failed to find 7-ZIP; see readme for details of how to install"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
36
52
|
protected
|
37
53
|
# Generate tasks to create the archive of this file.
|
38
54
|
def generate_tasks(output_task, folder, deployers)
|
@@ -54,8 +70,8 @@ module Packagers
|
|
54
70
|
|
55
71
|
heading "Creating #{pkg}"
|
56
72
|
rm pkg, fileutils_options if File.exist? pkg
|
57
|
-
cd project.output_path do
|
58
|
-
|
73
|
+
cd project.output_path, fileutils_options do
|
74
|
+
execute_command command(File.basename folder)
|
59
75
|
end
|
60
76
|
|
61
77
|
File.open("#{pkg}.MD5", "w") {|f| f.puts checksum(pkg) } if project.send :create_md5s?
|
@@ -66,7 +82,7 @@ module Packagers
|
|
66
82
|
|
67
83
|
protected
|
68
84
|
def command(folder)
|
69
|
-
%[
|
85
|
+
%[#{seven_zip_command} a -mmt -bd -t#{type} -mx9 "#{package(folder)}" "#{folder}"]
|
70
86
|
end
|
71
87
|
|
72
88
|
protected
|
@@ -3,6 +3,23 @@ require "releasy/packagers/packager"
|
|
3
3
|
module Releasy
|
4
4
|
module Packagers
|
5
5
|
# 7z archive format (LZMA)
|
6
|
+
#
|
7
|
+
# @example Package a particular build.
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source do
|
11
|
+
# add_package :"7z"
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# @example Package all builds.
|
16
|
+
# Releasy::Project.new do
|
17
|
+
# name "My App"
|
18
|
+
# add_build :source
|
19
|
+
# add_build :windows_folder
|
20
|
+
# add_package :"7z"
|
21
|
+
# end
|
22
|
+
#
|
6
23
|
class SevenZip < Packager
|
7
24
|
TYPE = :"7z"
|
8
25
|
DEFAULT_EXTENSION = ".7z"
|
@@ -3,6 +3,25 @@ require "releasy/packagers/tar_packager"
|
|
3
3
|
module Releasy
|
4
4
|
module Packagers
|
5
5
|
# Archives with tar and Bzip2 formats.
|
6
|
+
#
|
7
|
+
# @example Package a particular build and change extension.
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source do
|
11
|
+
# add_package :tar_bz2 do
|
12
|
+
# extension ".tbz"
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example Package all builds.
|
18
|
+
# Releasy::Project.new do
|
19
|
+
# name "My App"
|
20
|
+
# add_build :source
|
21
|
+
# add_build :windows_folder
|
22
|
+
# add_package :tar_bz2
|
23
|
+
# end
|
24
|
+
#
|
6
25
|
class TarBzip2 < TarPackager
|
7
26
|
TYPE = :tar_bz2
|
8
27
|
DEFAULT_EXTENSION = ".tar.bz2"
|
@@ -3,6 +3,25 @@ require "releasy/packagers/tar_packager"
|
|
3
3
|
module Releasy
|
4
4
|
module Packagers
|
5
5
|
# Archives with tar and Gzip formats.
|
6
|
+
#
|
7
|
+
# @example Package a particular build and change extension.
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source do
|
11
|
+
# add_package :tar_gz do
|
12
|
+
# extension ".tgz"
|
13
|
+
# end
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example Package all builds.
|
18
|
+
# Releasy::Project.new do
|
19
|
+
# name "My App"
|
20
|
+
# add_build :source
|
21
|
+
# add_build :windows_folder
|
22
|
+
# add_package :tar_gz
|
23
|
+
# end
|
24
|
+
#
|
6
25
|
class TarGzip < TarPackager
|
7
26
|
TYPE = :tar_gz
|
8
27
|
DEFAULT_EXTENSION = ".tar.gz"
|
@@ -7,7 +7,8 @@ module Packagers
|
|
7
7
|
class TarPackager < Packager
|
8
8
|
protected
|
9
9
|
def command(folder)
|
10
|
-
|
10
|
+
|
11
|
+
%[#{seven_zip_command} a -so -mmt -bd -ttar "#{folder}.tar" "#{folder}" 2>#{null_file} | #{seven_zip_command} a -si -bd -t#{self.class::FORMAT} -mx9 "#{folder}#{extension}"]
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -3,6 +3,23 @@ require "releasy/packagers/packager"
|
|
3
3
|
module Releasy
|
4
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
|
+
#
|
7
|
+
# @example Package a particular build.
|
8
|
+
# Releasy::Project.new do
|
9
|
+
# name "My App"
|
10
|
+
# add_build :source do
|
11
|
+
# add_package :zip
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# @example Package all builds.
|
16
|
+
# Releasy::Project.new do
|
17
|
+
# name "My App"
|
18
|
+
# add_build :source
|
19
|
+
# add_build :windows_folder
|
20
|
+
# add_package :zip
|
21
|
+
# end
|
22
|
+
#
|
6
23
|
class Zip < Packager
|
7
24
|
TYPE = :zip
|
8
25
|
DEFAULT_EXTENSION = ".zip"
|
data/lib/releasy/project.rb
CHANGED
@@ -11,6 +11,47 @@ require "releasy/mixins/log"
|
|
11
11
|
module Releasy
|
12
12
|
# A description of the Ruby application that is being build for release and what packages to make from it.
|
13
13
|
#
|
14
|
+
# @example
|
15
|
+
# Releasy::Project.new do
|
16
|
+
# name "My Application"
|
17
|
+
# version MyApplication::VERSION
|
18
|
+
#
|
19
|
+
# executable "bin/my_application.rbw"
|
20
|
+
# files `git ls-files`.split("\n")
|
21
|
+
# files.exclude '.gitignore'
|
22
|
+
#
|
23
|
+
# exposed_files ["README.html", "LICENSE.txt"]
|
24
|
+
# add_link "http://my_application.github.com", "My Application website"
|
25
|
+
# exclude_encoding
|
26
|
+
#
|
27
|
+
# # Create a variety of releases, for all platforms.
|
28
|
+
# add_build :osx_app do
|
29
|
+
# url "com.github.my_application"
|
30
|
+
# wrapper "../osx_app/gosu-mac-wrapper-0.7.41.tar.gz"
|
31
|
+
# icon "media/icon.icns"
|
32
|
+
# add_package :tar_gz
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# add_build :source do
|
36
|
+
# add_package :"7z"
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# add_build :windows_folder do
|
40
|
+
# icon "media/icon.ico"
|
41
|
+
# add_package :exe
|
42
|
+
# end
|
43
|
+
#
|
44
|
+
# add_build :windows_installer do
|
45
|
+
# icon "media/icon.ico"
|
46
|
+
# start_menu_group "Spooner Games"
|
47
|
+
# readme "README.html" # User asked if they want to view readme after install.
|
48
|
+
# license "LICENSE.txt" # User asked to read this and confirm before installing.
|
49
|
+
# add_package :zip
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# add_deploy :github # Upload to a github project.
|
53
|
+
# end
|
54
|
+
#
|
14
55
|
# @attr underscored_name [String] Project name underscored (as used in file names), which will be derived from {#name}, but can be manually set.
|
15
56
|
# @attr underscored_version [String] Version number, underscored so it can be used in file names, which will be derived from {#version}, but can be manually set.
|
16
57
|
# @attr executable [String] Name of executable to run (defaults to 'bin/<underscored_name>')
|
@@ -144,7 +185,7 @@ module Releasy
|
|
144
185
|
setup
|
145
186
|
|
146
187
|
if block_given?
|
147
|
-
if block.arity
|
188
|
+
if block.arity <= 0
|
148
189
|
DSLWrapper.new(self, &block)
|
149
190
|
else
|
150
191
|
yield self
|
@@ -166,7 +207,7 @@ module Releasy
|
|
166
207
|
@builders << builder
|
167
208
|
|
168
209
|
if block_given?
|
169
|
-
if block.arity
|
210
|
+
if block.arity <= 0
|
170
211
|
DSLWrapper.new(builder, &block)
|
171
212
|
else
|
172
213
|
yield builder
|
@@ -178,7 +219,7 @@ module Releasy
|
|
178
219
|
|
179
220
|
# Add a deployment method for archived packages.
|
180
221
|
# @see #initialize
|
181
|
-
# @param type [:github]
|
222
|
+
# @param type [:github, :local, :rsync]
|
182
223
|
# @return [Project] self
|
183
224
|
def add_deploy(type, &block)
|
184
225
|
raise ArgumentError, "Unsupported deploy type #{type}" unless Deployers.has_type? type
|
@@ -188,7 +229,7 @@ module Releasy
|
|
188
229
|
@deployers << deployer
|
189
230
|
|
190
231
|
if block_given?
|
191
|
-
if block.arity
|
232
|
+
if block.arity <= 0
|
192
233
|
DSLWrapper.new(deployer, &block)
|
193
234
|
else
|
194
235
|
yield deployer
|