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
@@ -1,4 +1,5 @@
|
|
1
1
|
require "releasy/builders/builder"
|
2
|
+
require "releasy/mixins/can_exclude_encoding"
|
2
3
|
|
3
4
|
module Releasy
|
4
5
|
module Builders
|
@@ -6,20 +7,13 @@ module Builders
|
|
6
7
|
# @abstract
|
7
8
|
# @attr icon [String] Optional filename of icon to show on executable/installer (.ico).
|
8
9
|
class WindowsBuilder < Builder
|
10
|
+
include Mixins::CanExcludeEncoding
|
11
|
+
|
9
12
|
EXECUTABLE_TYPES = [:auto, :windows, :console]
|
10
13
|
|
11
14
|
# @return [:auto, :windows, :console] Type of ruby to run executable with. :console means run with 'ruby.exe', :windows means run with 'rubyw.exe', :auto means determine type from executable extension (.rb => :console or .rbw => :windows).
|
12
15
|
attr_accessor :executable_type
|
13
16
|
|
14
|
-
# Excludes encoding files from 1.9 releases (equivalent to using '--no-enc' in Ocra).
|
15
|
-
def exclude_encoding
|
16
|
-
@exclude_encoding = true
|
17
|
-
end
|
18
|
-
|
19
|
-
# Should encoding files be excluded?
|
20
|
-
def encoding_excluded?; @exclude_encoding; end
|
21
|
-
protected :encoding_excluded?
|
22
|
-
|
23
17
|
# Executable type, resolving :auto if possible.
|
24
18
|
# @return [:windows, :console]
|
25
19
|
def effective_executable_type
|
@@ -39,7 +33,6 @@ module Builders
|
|
39
33
|
|
40
34
|
protected
|
41
35
|
def setup
|
42
|
-
@exclude_encoding = false
|
43
36
|
@executable_type = :auto
|
44
37
|
super
|
45
38
|
end
|
@@ -16,27 +16,25 @@ module Releasy
|
|
16
16
|
directory project.output_path
|
17
17
|
|
18
18
|
file folder => project.files do
|
19
|
-
Rake::FileUtilsExt.verbose project.verbose?
|
20
|
-
|
21
19
|
tmp_ocra_executable = "#{folder}.exe"
|
22
20
|
|
23
21
|
exec %[#{ocra_command} --output "#{tmp_ocra_executable}" --debug-extract]
|
24
22
|
|
25
23
|
# Extract the files from the executable.
|
26
24
|
system tmp_ocra_executable
|
27
|
-
rm tmp_ocra_executable
|
25
|
+
rm tmp_ocra_executable, fileutils_options
|
28
26
|
|
29
|
-
mv Dir["#{File.dirname(folder)}/ocr*\.tmp"].first, folder
|
27
|
+
mv Dir["#{File.dirname(folder)}/ocr*\.tmp"].first, folder, fileutils_options
|
30
28
|
|
31
29
|
maker = Releasy::WindowsWrapperMaker.new
|
32
30
|
maker.build_executable("#{folder}/#{executable_name}", "src/#{project.executable}",
|
33
31
|
:icon => icon, :windows => (effective_executable_type == :windows))
|
34
32
|
|
35
33
|
create_link_files folder
|
36
|
-
project.exposed_files.each {|file| cp file, folder }
|
34
|
+
project.exposed_files.each {|file| cp file, folder, fileutils_options }
|
37
35
|
end
|
38
36
|
|
39
|
-
desc "Build
|
37
|
+
desc "Build windows folder"
|
40
38
|
task "build:windows:folder" => folder
|
41
39
|
end
|
42
40
|
|
@@ -24,17 +24,15 @@ module Releasy
|
|
24
24
|
directory folder
|
25
25
|
|
26
26
|
file folder => project.files do
|
27
|
-
Rake::FileUtilsExt.verbose project.verbose?
|
28
|
-
|
29
27
|
create_link_files folder
|
30
|
-
project.exposed_files.each {|file| cp file, folder }
|
28
|
+
project.exposed_files.each {|file| cp file, folder, fileutils_options }
|
31
29
|
|
32
30
|
create_installer installer_name, :links => true
|
33
31
|
|
34
|
-
rm temp_installer_script
|
32
|
+
rm temp_installer_script, fileutils_options
|
35
33
|
end
|
36
34
|
|
37
|
-
desc "Build installer
|
35
|
+
desc "Build windows installer"
|
38
36
|
task "build:windows:installer" => folder
|
39
37
|
end
|
40
38
|
|
@@ -17,9 +17,7 @@ module Releasy
|
|
17
17
|
directory folder
|
18
18
|
|
19
19
|
file folder => project.files do
|
20
|
-
|
21
|
-
|
22
|
-
project.exposed_files.each {|file| cp file, folder }
|
20
|
+
project.exposed_files.each {|file| cp file, folder, fileutils_options }
|
23
21
|
|
24
22
|
create_link_files folder
|
25
23
|
|
@@ -11,10 +11,10 @@ module Releasy
|
|
11
11
|
# Limitations:
|
12
12
|
# * Does not DLLs loaded from the system, which will have to be included manually if any are required by the application and no universally available in Windows installations.
|
13
13
|
# * Unless a gem is in pure Ruby or available as a pre-compiled binary gem, it won't work!
|
14
|
-
class
|
14
|
+
class WindowsWrapped < WindowsBuilder
|
15
15
|
include Mixins::HasGemspecs
|
16
16
|
|
17
|
-
TYPE = :
|
17
|
+
TYPE = :windows_wrapped
|
18
18
|
DEFAULT_FOLDER_SUFFIX = "WIN32"
|
19
19
|
|
20
20
|
# Files that are required for Tcl/Tk, but which are unlikely to be used in many applications.
|
@@ -28,10 +28,12 @@ module Releasy
|
|
28
28
|
# Encoding files that are required, even if we don't need most of them if we select to {#exclude_encoding}.
|
29
29
|
REQUIRED_ENCODING_FILES = %w[encdb.so iso_8859_1.so utf_16le.so trans/single_byte.so trans/transdb.so trans/utf_16_32.so]
|
30
30
|
|
31
|
+
VALID_RUBY_DIST = /ruby-1\.[89]\.\d-p\d+-i386-mingw32.7z/
|
32
|
+
|
31
33
|
Builders.register self
|
32
34
|
|
33
35
|
# @return [String] Path to windows distribution archive that has been manually downloaded from http://rubyinstaller.org/downloads/ (e.g. "rubies/ruby-1.9.2-p290-i386-mingw32.7z").
|
34
|
-
attr_accessor :
|
36
|
+
attr_accessor :wrapper
|
35
37
|
|
36
38
|
# Remove TCL/TK from package, which can save a significant amount of space if the application does not require them.
|
37
39
|
# This is over 6MB uncompressed, which is a saving of 1.6MB when compressed with 7z format (LZMA).
|
@@ -43,22 +45,22 @@ module Releasy
|
|
43
45
|
protected
|
44
46
|
# FOLDER containing EXE, Ruby + source.
|
45
47
|
def generate_tasks
|
46
|
-
raise ConfigError, "#
|
47
|
-
raise ConfigError, "#
|
48
|
+
raise ConfigError, "#wrapper not set" unless wrapper
|
49
|
+
raise ConfigError, "#wrapper not valid wrapper: #{wrapper}" unless File.basename(wrapper) =~ VALID_RUBY_DIST
|
48
50
|
|
49
51
|
directory project.output_path
|
50
52
|
|
51
|
-
file folder => project.files + [
|
53
|
+
file folder => project.files + [wrapper] do
|
52
54
|
build
|
53
55
|
end
|
54
56
|
|
55
57
|
desc "Build source/exe folder #{project.version} from wrapper"
|
56
|
-
task "build:windows:
|
58
|
+
task "build:windows:wrapped" => folder
|
57
59
|
end
|
58
60
|
|
59
61
|
protected
|
60
62
|
def build
|
61
|
-
|
63
|
+
raise ConfigError, "#wrapper does not exist: #{wrapper}" unless File.exist?(wrapper)
|
62
64
|
|
63
65
|
copy_ruby_distribution
|
64
66
|
delete_excluded_files
|
@@ -66,7 +68,7 @@ module Releasy
|
|
66
68
|
copy_files_relative project.files, File.join(folder, 'src')
|
67
69
|
|
68
70
|
create_link_files folder
|
69
|
-
project.exposed_files.each {|file| cp file, folder }
|
71
|
+
project.exposed_files.each {|file| cp file, folder, fileutils_options }
|
70
72
|
|
71
73
|
create_executable
|
72
74
|
|
@@ -79,20 +81,20 @@ module Releasy
|
|
79
81
|
protected
|
80
82
|
def delete_excluded_files
|
81
83
|
# Remove TCL/TK dlls, lib folder and source.
|
82
|
-
rm_r Dir[*(TCL_TK_FILES.map {|f| File.join(folder, f) })].uniq.sort if @exclude_tcl_tk
|
84
|
+
rm_r Dir[*(TCL_TK_FILES.map {|f| File.join(folder, f) })].uniq.sort, fileutils_options if @exclude_tcl_tk
|
83
85
|
|
84
86
|
# Remove Encoding files on Ruby 1.9
|
85
|
-
if encoding_excluded? and
|
87
|
+
if encoding_excluded? and wrapper =~ /1\.9\.\d/
|
86
88
|
encoding_files = Dir[File.join folder, "lib/ruby/1.9.1/i386-mingw32/enc/**/*.so"]
|
87
89
|
required_encoding_files = REQUIRED_ENCODING_FILES.map {|f| File.join folder, "lib/ruby/1.9.1/i386-mingw32/enc", f }
|
88
|
-
rm_r encoding_files - required_encoding_files
|
90
|
+
rm_r encoding_files - required_encoding_files, fileutils_options
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
92
94
|
protected
|
93
95
|
def setup
|
94
96
|
@exclude_tcl_tk = false
|
95
|
-
@
|
97
|
+
@wrapper = nil
|
96
98
|
super
|
97
99
|
end
|
98
100
|
|
@@ -101,13 +103,13 @@ module Releasy
|
|
101
103
|
|
102
104
|
protected
|
103
105
|
def copy_ruby_distribution
|
104
|
-
archive_name = File.basename(
|
105
|
-
exec %[7z x "#{
|
106
|
-
mv File.join(File.dirname(folder), archive_name), folder
|
107
|
-
rm_r File.join(folder, "share")
|
108
|
-
rm_r File.join(folder, "include") if File.exists? File.join(folder, "include")
|
106
|
+
archive_name = File.basename(wrapper).chomp(File.extname(wrapper))
|
107
|
+
exec %[7z x "#{wrapper}" -o"#{File.dirname folder}"]
|
108
|
+
mv File.join(File.dirname(folder), archive_name), folder, fileutils_options
|
109
|
+
rm_r File.join(folder, "share"), fileutils_options
|
110
|
+
rm_r File.join(folder, "include"), fileutils_options if File.exists? File.join(folder, "include")
|
109
111
|
unused_exe = effective_executable_type == :windows ? "ruby.exe" : "rubyw.exe"
|
110
|
-
rm File.join(folder, "bin", unused_exe)
|
112
|
+
rm File.join(folder, "bin", unused_exe), fileutils_options
|
111
113
|
end
|
112
114
|
|
113
115
|
protected
|
@@ -119,10 +121,10 @@ module Releasy
|
|
119
121
|
|
120
122
|
protected
|
121
123
|
def install_binary_gems(destination)
|
122
|
-
|
124
|
+
info "Checking gems to see if any are binary"
|
123
125
|
binary_gems = []
|
124
126
|
gemspecs.reject {|s| false }.each do |spec|
|
125
|
-
|
127
|
+
info "Checking gem #{spec.name} #{spec.version} to see if there is a Windows binary version"
|
126
128
|
# Find out what versions are available and if the required version is available as a windows binary, download and install that.
|
127
129
|
versions = %x[gem list "#{spec.name}" --remote --all --prerelease]
|
128
130
|
if versions =~ /#{spec.name} \(([^\)]*)\)/m
|
@@ -132,7 +134,7 @@ module Releasy
|
|
132
134
|
raise "Gem #{spec.name} is binary, but #{spec.version} does not have a published binary" if version_string =~ /mingw|mswin/ and not windows_platform
|
133
135
|
|
134
136
|
if windows_platform
|
135
|
-
|
137
|
+
info "Installing Windows version of binary gem #{spec.name} #{spec.version}"
|
136
138
|
# If we have a bundle file specified, then gem will _only_ install the version specified by it and not the one we request.
|
137
139
|
bundle_gemfile = ENV['BUNDLE_GEMFILE']
|
138
140
|
ENV['BUNDLE_GEMFILE'] = ''
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'cri'
|
2
|
-
require "releasy/
|
2
|
+
require "releasy/packagers/exe"
|
3
3
|
|
4
4
|
command = 'install-sfx'
|
5
|
-
sfx_file = Releasy::
|
6
|
-
sfx_path = Releasy::
|
5
|
+
sfx_file = Releasy::Packagers::Exe::SFX_NAME
|
6
|
+
sfx_path = Releasy::Packagers::Exe::SFX_FILE
|
7
7
|
|
8
8
|
Releasy::Cli.define_command do
|
9
9
|
name command
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "releasy/mixins/log"
|
2
|
+
|
3
|
+
module Releasy
|
4
|
+
module Deployers
|
5
|
+
# @abstract
|
6
|
+
class Deployer
|
7
|
+
include Rake::DSL
|
8
|
+
include Mixins::Log
|
9
|
+
|
10
|
+
attr_reader :project
|
11
|
+
|
12
|
+
def type; self.class::TYPE; end
|
13
|
+
|
14
|
+
def initialize(project)
|
15
|
+
@project = project
|
16
|
+
setup
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
def generate_tasks(archive_task, folder, extension)
|
21
|
+
desc "#{type} <= #{archive_task.split(":")[0..-2].join(" ")} #{extension}"
|
22
|
+
task "deploy:#{archive_task}:#{type}" => "package:#{archive_task}" do
|
23
|
+
deploy(folder + extension)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'releasy/deployers/deployer'
|
2
|
+
|
3
|
+
module Releasy
|
4
|
+
module Deployers
|
5
|
+
# Deploys to a Github project's downloads page.
|
6
|
+
#
|
7
|
+
# @attr description [String] Description of file (defaults to: "#{project.description")
|
8
|
+
# @attr login [String] Github user name that has write access to {#repository} (defaults to: `git config github.user` or user name in `git config remote.origin.url`).
|
9
|
+
# @attr repository [String] Name of Github repository (defaults to: the repository name in `git config remote.origin.url` or _project.underscored_name_).
|
10
|
+
# @attr token [String] Github token associated with {#login} - a 32-digit hexadecimal string - DO NOT COMMIT A FILE CONTAINING YOUR GITHUB TOKEN (defaults to: `git config github.token`)
|
11
|
+
class Github < Deployer
|
12
|
+
TYPE = :github
|
13
|
+
|
14
|
+
Deployers.register self
|
15
|
+
|
16
|
+
def repository
|
17
|
+
@repository || project.underscored_name
|
18
|
+
end
|
19
|
+
def repository=(repository)
|
20
|
+
raise TypeError, "repository must be a String, but received #{repository.class}" unless repository.is_a? String
|
21
|
+
@repository = repository
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :user
|
25
|
+
def user=(user)
|
26
|
+
raise TypeError, "user must be a String, but received #{user.class}" unless user.is_a? String
|
27
|
+
@user = user
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :token
|
31
|
+
def token=(token)
|
32
|
+
raise TypeError, "token must be a String, but received #{token.class}" unless token.is_a? String
|
33
|
+
raise ArgumentError, "token invalid (expected 32-character hex string)" unless token =~ /^[0-9a-f]{32}$/i
|
34
|
+
@token = token
|
35
|
+
end
|
36
|
+
|
37
|
+
def description
|
38
|
+
@description || project.description
|
39
|
+
end
|
40
|
+
def description=(description)
|
41
|
+
raise TypeError, "description must be a String, but received #{description.class}" unless description.is_a? String
|
42
|
+
@description = description
|
43
|
+
end
|
44
|
+
|
45
|
+
# Force replacement of existing uploaded files.
|
46
|
+
def replace!
|
47
|
+
@force_replace = true
|
48
|
+
end
|
49
|
+
|
50
|
+
protected
|
51
|
+
def setup
|
52
|
+
@force_replace = false
|
53
|
+
@description = nil
|
54
|
+
|
55
|
+
# Get username from github.user, otherwise use the name taken from the git_url.
|
56
|
+
@user = from_config 'github.user'
|
57
|
+
@token = from_config 'github.token'
|
58
|
+
|
59
|
+
# Try to guess the repository name from git config.
|
60
|
+
git_url = from_config 'remote.origin.url'
|
61
|
+
if git_url and git_url =~ %r<^git@github.com:(.+)/([^/]+)\.git$>
|
62
|
+
@user ||= $1 # May have already been set from github.user
|
63
|
+
@repository = $2
|
64
|
+
else
|
65
|
+
@repository = nil
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
protected
|
70
|
+
# Get a value from git config.
|
71
|
+
#
|
72
|
+
# @param key [String] Name of setting in git config.
|
73
|
+
# @return [String, nil] Value of setting, else nil if it isn't defined.
|
74
|
+
def from_config(key)
|
75
|
+
`git config #{key}`.chomp rescue nil
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
# @param file [String] Path to file to deploy.
|
80
|
+
# @return [String] A link to download the file.
|
81
|
+
# @raise SystemError If file fails to upload.
|
82
|
+
def deploy(file)
|
83
|
+
raise ConfigError, "#user must be set manually if it is not configured on the system" unless user
|
84
|
+
raise ConfigError, "#token must be set manually if it is not configured on the system" unless token
|
85
|
+
|
86
|
+
require 'net/github-upload' # Hold off requiring this unless needed, so it doesn't slow down creating tasks.
|
87
|
+
|
88
|
+
uploader = Net::GitHub::Upload.new(:login => user, :token => token)
|
89
|
+
|
90
|
+
heading "Deploying #{file} (#{(File.size(file).fdiv 1024).ceil}k) to Github"
|
91
|
+
|
92
|
+
t = Time.now
|
93
|
+
|
94
|
+
begin
|
95
|
+
uploader.upload(:repos => repository, :file => file, :description => description, :replace => @force_replace)
|
96
|
+
rescue => ex
|
97
|
+
# Probably failed to overwrite an existing file.
|
98
|
+
error "Error uploading file #{file}: #{ex.message}"
|
99
|
+
exit 1 # This is bad. Lets just die, die, die at this point.
|
100
|
+
end
|
101
|
+
|
102
|
+
link = "https://github.com/downloads/#{user}/#{repository}/#{File.basename(file)}"
|
103
|
+
heading %[Successfully uploaded to "#{link}" in #{(Time.now - t).ceil}s]
|
104
|
+
|
105
|
+
link
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Releasy
|
2
|
+
module Mixins
|
3
|
+
module CanExcludeEncoding
|
4
|
+
# Exclude unnecessary encoding files, only keeping those that sufficient for basic use of Ruby.
|
5
|
+
def exclude_encoding
|
6
|
+
@encoding_excluded = true
|
7
|
+
end
|
8
|
+
|
9
|
+
protected
|
10
|
+
# Has encoding been excluded from builds?
|
11
|
+
def encoding_excluded?
|
12
|
+
@encoding_excluded ||= false
|
13
|
+
|
14
|
+
if is_a? Project
|
15
|
+
@encoding_excluded
|
16
|
+
else
|
17
|
+
@encoding_excluded || project.send(:encoding_excluded?)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/releasy/mixins/exec.rb
CHANGED
@@ -21,20 +21,20 @@ module Mixins
|
|
21
21
|
|
22
22
|
protected
|
23
23
|
def copy_gems(gems, destination)
|
24
|
-
|
24
|
+
info "Copying source gems from system"
|
25
25
|
|
26
26
|
gems_dir = "#{destination}/gems"
|
27
27
|
specs_dir = "#{destination}/specifications"
|
28
|
-
mkdir_p gems_dir
|
29
|
-
mkdir_p specs_dir
|
28
|
+
mkdir_p gems_dir, fileutils_options
|
29
|
+
mkdir_p specs_dir, fileutils_options
|
30
30
|
|
31
31
|
gems.each do |gem|
|
32
32
|
spec = gemspecs.find {|g| g.name == gem }
|
33
33
|
gem_dir = spec.full_gem_path
|
34
|
-
|
35
|
-
cp_r gem_dir, gems_dir
|
34
|
+
info "Copying gem: #{spec.name} #{spec.version}"
|
35
|
+
cp_r gem_dir, gems_dir, fileutils_options
|
36
36
|
spec_file = File.expand_path("../../specifications/#{File.basename gem_dir}.gemspec", gem_dir)
|
37
|
-
cp_r spec_file, specs_dir
|
37
|
+
cp_r spec_file, specs_dir, fileutils_options
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|