winrm-fs 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -5
- data/VERSION +1 -1
- data/benchmark.rb +20 -0
- data/bin/rwinrmcp +1 -1
- data/changelog.md +10 -1
- data/lib/winrm-fs.rb +1 -0
- data/lib/winrm-fs/core/temp_zip_file.rb +128 -37
- data/lib/winrm-fs/core/upload_orchestrator.rb +9 -8
- data/lib/winrm-fs/file_manager.rb +11 -16
- data/spec/file_manager_spec.rb +59 -37
- data/spec/matchers.rb +7 -3
- data/spec/temp_zip_file_spec.rb +26 -42
- metadata +28 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73ccc66738cd3d2154cdebcaf723ce05f8856cc9
|
4
|
+
data.tar.gz: b1495a0c00c6dd45dd1d590a6af8cef13217fe0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5bb6b796cc8b459f5f8c42b72df1e05c65978289d237d0aaa4d4b871473caac73324d91da73ac3fa13a0568b740e048195b72e29298e6241b96c26c621e73e59
|
7
|
+
data.tar.gz: 186861cd7b45f773f350b781e2f2563f820e7db3ae01696fa011e8856ec2b1caabe1e5d36729c0bf93d0ed5dff6eda1480e63b876aacb4b913481fd3422e54f3
|
data/README.md
CHANGED
@@ -10,11 +10,15 @@ require 'winrm-fs'
|
|
10
10
|
|
11
11
|
service = WinRM::WinRMWebService.new(...
|
12
12
|
file_manager = WinRM::FS::FileManager.new(service)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
13
|
+
|
14
|
+
# upload file.txt from the current working directory
|
15
|
+
file_manager.upload('file.txt', 'c:/file.txt')
|
16
|
+
|
17
|
+
# upload the entire contents of my_dir to c:/foo/my_dir
|
18
|
+
file_manager.upload('/Users/sneal/my_dir', 'c:/foo/my_dir')
|
19
|
+
|
20
|
+
# upload the entire directory contents of foo to c:\program files\bar
|
21
|
+
file_manager.upload('/Users/sneal/foo', '$env:ProgramFiles/bar')
|
18
22
|
```
|
19
23
|
|
20
24
|
### Handling progress events
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/benchmark.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
require 'winrm-fs'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
def files
|
6
|
+
# This is a fairly short list of small files, may also want a benchmark with larger files
|
7
|
+
`git ls-files`.lines.map(&:strip)
|
8
|
+
end
|
9
|
+
|
10
|
+
def create_zip(factory, file)
|
11
|
+
WinRM::FS::Core::TempZipFile.new(Dir.pwd, zip_file: file, via: factory, X: true) do | temp_zip |
|
12
|
+
temp_zip.add(*files)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Benchmark.bm do | benchmark |
|
17
|
+
benchmark.report('zip cmd') { `git ls-files | zip zip_command.zip -X --names-stdin` }
|
18
|
+
benchmark.report('shell') { create_zip(:shell, 'shell.zip') }
|
19
|
+
benchmark.report('ruby') { create_zip(:rubyzip, 'ruby.zip') }
|
20
|
+
end
|
data/bin/rwinrmcp
CHANGED
@@ -36,7 +36,7 @@ def parse_options
|
|
36
36
|
fail "Cannot find source file: #{options[:source_path]}" unless \
|
37
37
|
File.exist?(options[:source_path])
|
38
38
|
|
39
|
-
m = /^(?<user
|
39
|
+
m = /^(?<user>[a-z0-9\.\!\$ _-]+)@{1}(?<host>[a-z0-9\.\-]+)(?<port>:[0-9]+)?:{1}(?<file>.+)/i.match(ARGV[1])
|
40
40
|
fail "#{ARGV[1]} is an invalid destination" unless m
|
41
41
|
options[:user] = m[:user]
|
42
42
|
options[:endpoint] = "http://#{m[:host]}#{m[:port] || ':5985'}/wsman"
|
data/changelog.md
CHANGED
@@ -1 +1,10 @@
|
|
1
|
-
|
1
|
+
# WinRM-fs Gem Changelog
|
2
|
+
|
3
|
+
# 0.2.0
|
4
|
+
- Redesigned temp zip file creation system
|
5
|
+
- Fixed lots of small edge case issues especially with directory uploads
|
6
|
+
- Simplified file manager upload method API to take only a single source file or directory
|
7
|
+
- Expanded acceptable username and hostnames for rwinrmcp
|
8
|
+
|
9
|
+
# 0.1.0
|
10
|
+
- Initial alpha quality release
|
data/lib/winrm-fs.rb
CHANGED
@@ -14,72 +14,163 @@
|
|
14
14
|
# See the License for the specific language governing permissions and
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
|
+
require 'English'
|
17
18
|
require 'zip'
|
19
|
+
require 'fileutils'
|
20
|
+
require 'pathname'
|
18
21
|
|
19
22
|
module WinRM
|
20
23
|
module FS
|
21
24
|
module Core
|
22
25
|
# Temporary zip file on the local system
|
23
26
|
class TempZipFile
|
24
|
-
attr_reader :path
|
27
|
+
attr_reader :zip_file, :path, :paths, :basedir, :options
|
25
28
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@
|
29
|
+
# Creates a new local temporary zip file
|
30
|
+
# @param [String] Base directory to use when expanding out files passed to add
|
31
|
+
# @param [Hash] Options: zip_file, via, recurse_paths
|
32
|
+
def initialize(basedir = Dir.pwd, options = {})
|
33
|
+
@basedir = Pathname.new(basedir)
|
34
|
+
@options = options
|
35
|
+
@zip_file = options[:zip_file] || Tempfile.new(['winrm_upload', '.zip'])
|
36
|
+
@path = Pathname.new(@zip_file)
|
31
37
|
end
|
32
38
|
|
33
39
|
# Adds a file or directory to the temporary zip file
|
34
|
-
# @param [String] Directory or file path to add into zip
|
35
|
-
def add(
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
else
|
41
|
-
fail "#{path} doesn't exist"
|
40
|
+
# @param [String] Directory or file path relative to basedir to add into zip
|
41
|
+
def add(*new_paths)
|
42
|
+
new_paths.each do | path |
|
43
|
+
absolute_path = File.expand_path(path, basedir)
|
44
|
+
fail "#{path} must exist relative to #{basedir}" unless File.exist? absolute_path
|
45
|
+
paths << Pathname.new(absolute_path).relative_path_from(basedir)
|
42
46
|
end
|
43
47
|
end
|
44
48
|
|
45
|
-
|
46
|
-
|
47
|
-
def add_directory(dir)
|
48
|
-
fail "#{dir} isn't a directory" unless File.directory?(dir)
|
49
|
-
glob = File.join(dir, '**/*')
|
50
|
-
Dir.glob(glob).each do |file|
|
51
|
-
add_file_entry(file, dir)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def add_file(file)
|
56
|
-
fail "#{file} isn't a file" unless File.file?(file)
|
57
|
-
add_file_entry(file, File.dirname(file))
|
49
|
+
def paths
|
50
|
+
@paths ||= []
|
58
51
|
end
|
59
52
|
|
60
53
|
def delete
|
61
54
|
@zip_file.delete
|
62
55
|
end
|
63
56
|
|
57
|
+
def build
|
58
|
+
factory.new(self).build
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def factory
|
64
|
+
@factory ||= case options[:via]
|
65
|
+
when nil, :rubyzip
|
66
|
+
RubyZipFactory
|
67
|
+
when :shell
|
68
|
+
ShellZipFactory
|
69
|
+
else
|
70
|
+
fail "Unknown zip factory: #{factory}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Creates a zip file by shelling out to the zip command
|
76
|
+
class ShellZipFactory
|
77
|
+
attr_reader :zip_definition, :basedir, :zip_file, :paths, :options
|
78
|
+
|
79
|
+
def initialize(zip_definition)
|
80
|
+
@zip_definition = zip_definition
|
81
|
+
@zip_file = zip_definition.zip_file
|
82
|
+
@basedir = zip_definition.basedir
|
83
|
+
@paths = zip_definition.paths
|
84
|
+
@options = build_options.push('--names-stdin').join(' ')
|
85
|
+
end
|
86
|
+
|
87
|
+
def build
|
88
|
+
Dir.chdir(basedir) do
|
89
|
+
# zip doesn't like the file that already exists
|
90
|
+
output = `zip #{zip_definition.path}.tmp #{options} < #{write_file_list.path}`
|
91
|
+
fail "zip command failed: #{output}" unless $CHILD_STATUS.success?
|
92
|
+
|
93
|
+
FileUtils.mv("#{zip_definition.path}.tmp", "#{zip_definition.path}")
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
64
97
|
private
|
65
98
|
|
66
|
-
def
|
67
|
-
|
68
|
-
|
69
|
-
|
99
|
+
def write_file_list
|
100
|
+
file_list = Tempfile.new('file_list')
|
101
|
+
file_list.puts paths.join("\n")
|
102
|
+
file_list.close
|
103
|
+
file_list
|
70
104
|
end
|
71
105
|
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
106
|
+
def build_options
|
107
|
+
zip_definition.options.map do | key, value |
|
108
|
+
prefix = key.length > 1 ? '--' : '-'
|
109
|
+
if value == true
|
110
|
+
"#{prefix}#{key}"
|
111
|
+
else
|
112
|
+
"#{prefix}#{key} #{value}"
|
113
|
+
end
|
77
114
|
end
|
78
115
|
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Creates a zip file using RubyZip
|
119
|
+
class RubyZipFactory
|
120
|
+
attr_reader :zip_definition, :basedir
|
121
|
+
|
122
|
+
def initialize(zip_definition)
|
123
|
+
@zip_definition = zip_definition
|
124
|
+
@basedir = zip_definition.basedir
|
125
|
+
@zip = Zip::File.open(zip_definition.path, Zip::File::CREATE)
|
126
|
+
end
|
127
|
+
|
128
|
+
def build
|
129
|
+
@zip_definition.paths.each do | path |
|
130
|
+
absolute_path = File.expand_path(path, basedir)
|
131
|
+
fail "#{path} doesn't exist" unless File.exist? absolute_path
|
132
|
+
|
133
|
+
if File.directory?(absolute_path)
|
134
|
+
add_directory(path)
|
135
|
+
else
|
136
|
+
add_file(path)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
close
|
140
|
+
end
|
141
|
+
|
142
|
+
def close
|
143
|
+
@zip.close if @zip
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
# Adds all files in the specified directory recursively into the zip file
|
149
|
+
# @param [String] Directory to add into zip
|
150
|
+
def add_directory(dir)
|
151
|
+
glob_pattern = '*'
|
152
|
+
glob_pattern = '**/*' if zip_definition.options[:recurse_paths]
|
153
|
+
|
154
|
+
glob = File.join(basedir, dir, glob_pattern)
|
155
|
+
Dir.glob(glob).each do |file|
|
156
|
+
add_file(file)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def add_file(file)
|
161
|
+
write_zip_entry(file, basedir)
|
162
|
+
end
|
163
|
+
|
164
|
+
def write_zip_entry(file, _file_entry_path)
|
165
|
+
absolute_file = File.expand_path(file, basedir)
|
166
|
+
relative_file = Pathname.new(absolute_file).relative_path_from(basedir).to_s
|
167
|
+
entry = new_zip_entry(relative_file)
|
168
|
+
@zip.add(entry, absolute_file)
|
169
|
+
end
|
79
170
|
|
80
171
|
def new_zip_entry(file_entry_path)
|
81
172
|
Zip::Entry.new(
|
82
|
-
@
|
173
|
+
@zip,
|
83
174
|
file_entry_path,
|
84
175
|
nil,
|
85
176
|
nil,
|
@@ -42,8 +42,8 @@ module WinRM
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
def upload_directory(
|
46
|
-
with_local_zip(
|
45
|
+
def upload_directory(local_path, remote_path)
|
46
|
+
with_local_zip(local_path) do |local_zip|
|
47
47
|
temp_path = temp_file_path(local_zip.path)
|
48
48
|
with_command_executor do |cmd_executor|
|
49
49
|
return 0 unless out_of_date?(cmd_executor, local_zip.path, temp_path)
|
@@ -74,8 +74,8 @@ module WinRM
|
|
74
74
|
cmd_executor.close
|
75
75
|
end
|
76
76
|
|
77
|
-
def with_local_zip(
|
78
|
-
local_zip = create_temp_zip_file(
|
77
|
+
def with_local_zip(local_path)
|
78
|
+
local_zip = create_temp_zip_file(local_path)
|
79
79
|
yield local_zip
|
80
80
|
ensure
|
81
81
|
local_zip.delete if local_zip
|
@@ -107,10 +107,11 @@ module WinRM
|
|
107
107
|
"$env:TEMP/winrm-upload/#{local_checksum(local_path)}#{ext}"
|
108
108
|
end
|
109
109
|
|
110
|
-
def create_temp_zip_file(
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
def create_temp_zip_file(local_path)
|
111
|
+
zip = WinRM::FS::Core::TempZipFile.new(local_path, recurse_paths: true)
|
112
|
+
zip.add(local_path)
|
113
|
+
zip.build
|
114
|
+
zip
|
114
115
|
end
|
115
116
|
end
|
116
117
|
end
|
@@ -86,16 +86,16 @@ module WinRM
|
|
86
86
|
end
|
87
87
|
|
88
88
|
# Upload one or more local files and directories to a remote directory
|
89
|
-
# @example copy a single
|
89
|
+
# @example copy a single file to a winrm endpoint
|
90
90
|
#
|
91
|
-
# file_manager.upload('
|
91
|
+
# file_manager.upload('/Users/sneal/myfile.txt', 'c:/foo/myfile.txt')
|
92
92
|
#
|
93
|
-
# @example copy
|
93
|
+
# @example copy a single directory to a winrm endpoint
|
94
94
|
#
|
95
|
-
# file_manager.upload(
|
95
|
+
# file_manager.upload('c:/dev/my_dir', '$env:AppData')
|
96
96
|
#
|
97
|
-
# @param [
|
98
|
-
#
|
97
|
+
# @param [String] A path to a local directory or file that will be copied
|
98
|
+
# to the remote Windows box.
|
99
99
|
# @param [String] The target directory or file
|
100
100
|
# This path may contain powershell style environment variables
|
101
101
|
# @yieldparam [Fixnum] Number of bytes copied in current payload sent to the winrm endpoint
|
@@ -103,21 +103,16 @@ module WinRM
|
|
103
103
|
# @yieldparam [String] Path of file being copied
|
104
104
|
# @yieldparam [String] Target path on the winrm endpoint
|
105
105
|
# @return [Fixnum] The total number of bytes copied
|
106
|
-
def upload(
|
107
|
-
@logger.debug("uploading: #{
|
108
|
-
local_paths = [local_paths] if local_paths.is_a? String
|
106
|
+
def upload(local_path, remote_path, &block)
|
107
|
+
@logger.debug("uploading: #{local_path} -> #{remote_path}")
|
109
108
|
|
110
109
|
upload_orchestrator = WinRM::FS::Core::UploadOrchestrator.new(@service)
|
111
|
-
if
|
112
|
-
upload_orchestrator.upload_file(
|
110
|
+
if File.file?(local_path)
|
111
|
+
upload_orchestrator.upload_file(local_path, remote_path, &block)
|
113
112
|
else
|
114
|
-
upload_orchestrator.upload_directory(
|
113
|
+
upload_orchestrator.upload_directory(local_path, remote_path, &block)
|
115
114
|
end
|
116
115
|
end
|
117
|
-
|
118
|
-
def self.src_is_single_file?(local_paths)
|
119
|
-
local_paths.count == 1 && File.file?(local_paths[0])
|
120
|
-
end
|
121
116
|
end
|
122
117
|
end
|
123
118
|
end
|
data/spec/file_manager_spec.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
+
require 'pathname'
|
3
|
+
|
2
4
|
describe WinRM::FS::FileManager, integration: true do
|
3
5
|
let(:dest_dir) { File.join(subject.temp_dir, "winrm_#{rand(2**16)}") }
|
4
6
|
let(:temp_upload_dir) { '$env:TEMP/winrm-upload' }
|
5
|
-
let(:
|
7
|
+
let(:this_dir) { File.expand_path(File.dirname(__FILE__)) }
|
8
|
+
let(:this_file) { __FILE__ }
|
6
9
|
let(:service) { winrm_connection }
|
7
10
|
|
8
11
|
subject { WinRM::FS::FileManager.new(service) }
|
@@ -37,57 +40,73 @@ describe WinRM::FS::FileManager, integration: true do
|
|
37
40
|
end
|
38
41
|
|
39
42
|
context 'upload file' do
|
40
|
-
let(:
|
41
|
-
let(:dest_file) { File.join(dest_dir, File.basename(src_file)) }
|
43
|
+
let(:dest_file) { File.join(dest_dir, File.basename(this_file)) }
|
42
44
|
|
43
45
|
before(:each) do
|
44
46
|
expect(subject.delete(dest_dir)).to be true
|
45
47
|
end
|
46
48
|
|
47
|
-
it 'should upload the
|
48
|
-
subject.upload(
|
49
|
-
expect(subject).to have_created(dest_file).with_content(
|
49
|
+
it 'should upload the specified file' do
|
50
|
+
subject.upload(this_file, dest_file)
|
51
|
+
expect(subject).to have_created(dest_file).with_content(this_file)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should upload to root of the c: drive' do
|
55
|
+
subject.upload(this_file, 'c:/winrmtest.rb')
|
56
|
+
expect(subject).to have_created('c:/winrmtest.rb').with_content(this_file)
|
57
|
+
subject.delete('c:/winrmtest.rb')
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should upload using relative file path' do
|
61
|
+
subject.upload('./spec/file_manager_spec.rb', dest_file)
|
62
|
+
expect(subject).to have_created(dest_file).with_content(this_file)
|
50
63
|
end
|
51
64
|
|
52
|
-
it 'should upload
|
53
|
-
subject.upload(
|
54
|
-
expect(subject).to have_created(dest_file).with_content(
|
65
|
+
it 'should upload to the specified directory' do
|
66
|
+
subject.upload(this_file, dest_dir)
|
67
|
+
expect(subject).to have_created(dest_file).with_content(this_file)
|
55
68
|
end
|
56
69
|
|
57
|
-
it 'should upload
|
58
|
-
subject.upload(
|
59
|
-
expected_dest_file = File.join(subject.temp_dir, File.basename(
|
60
|
-
expect(subject).to have_created(expected_dest_file).with_content(
|
70
|
+
it 'should upload to the specified directory with env var' do
|
71
|
+
subject.upload(this_file, '$env:Temp')
|
72
|
+
expected_dest_file = File.join(subject.temp_dir, File.basename(this_file))
|
73
|
+
expect(subject).to have_created(expected_dest_file).with_content(this_file)
|
61
74
|
end
|
62
75
|
|
63
|
-
it 'should upload
|
76
|
+
it 'should upload to Program Files sub dir' do
|
77
|
+
subject.upload(this_file, '$env:ProgramFiles/foo')
|
78
|
+
expect(subject).to have_created('c:/Program Files/foo/file_manager_spec.rb') \
|
79
|
+
.with_content(this_file)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should upload to the specified nested directory' do
|
64
83
|
dest_sub_dir = File.join(dest_dir, 'subdir')
|
65
|
-
dest_sub_dir_file = File.join(dest_sub_dir, File.basename(
|
66
|
-
subject.upload(
|
67
|
-
expect(subject).to have_created(dest_sub_dir_file).with_content(
|
84
|
+
dest_sub_dir_file = File.join(dest_sub_dir, File.basename(this_file))
|
85
|
+
subject.upload(this_file, dest_sub_dir)
|
86
|
+
expect(subject).to have_created(dest_sub_dir_file).with_content(this_file)
|
68
87
|
end
|
69
88
|
|
70
89
|
it 'yields progress data' do
|
71
|
-
total = subject.upload(
|
90
|
+
total = subject.upload(this_file, dest_file) do \
|
72
91
|
|bytes_copied, total_bytes, local_path, remote_path|
|
73
92
|
expect(total_bytes).to be > 0
|
74
93
|
expect(bytes_copied).to eq(total_bytes)
|
75
|
-
expect(local_path).to eq(
|
94
|
+
expect(local_path).to eq(this_file)
|
76
95
|
expect(remote_path).to eq(dest_file)
|
77
96
|
end
|
78
97
|
expect(total).to be > 0
|
79
98
|
end
|
80
99
|
|
81
|
-
it 'should not upload
|
82
|
-
subject.upload(
|
83
|
-
bytes_uploaded = subject.upload(
|
100
|
+
it 'should not upload when content matches' do
|
101
|
+
subject.upload(this_file, dest_dir)
|
102
|
+
bytes_uploaded = subject.upload(this_file, dest_dir)
|
84
103
|
expect(bytes_uploaded).to eq 0
|
85
104
|
end
|
86
105
|
|
87
|
-
it 'should upload
|
88
|
-
|
89
|
-
subject.upload(
|
90
|
-
bytes_uploaded = subject.upload(
|
106
|
+
it 'should upload when content differs' do
|
107
|
+
matchers_file = File.join(this_dir, 'matchers.rb')
|
108
|
+
subject.upload(matchers_file, dest_file)
|
109
|
+
bytes_uploaded = subject.upload(this_file, dest_file)
|
91
110
|
expect(bytes_uploaded).to be > 0
|
92
111
|
end
|
93
112
|
|
@@ -97,7 +116,6 @@ describe WinRM::FS::FileManager, integration: true do
|
|
97
116
|
end
|
98
117
|
|
99
118
|
context 'upload empty file' do
|
100
|
-
let(:src_file) { __FILE__ }
|
101
119
|
let(:empty_src_file) { Tempfile.new('empty').path }
|
102
120
|
let(:dest_file) { File.join(dest_dir, 'emptyfile.txt') }
|
103
121
|
|
@@ -107,33 +125,37 @@ describe WinRM::FS::FileManager, integration: true do
|
|
107
125
|
end
|
108
126
|
|
109
127
|
it 'overwrites an existing file' do
|
110
|
-
expect(subject.upload(
|
128
|
+
expect(subject.upload(this_file, dest_file)).to be > 0
|
111
129
|
expect(subject.upload(empty_src_file, dest_file)).to be 0
|
112
130
|
expect(subject).to have_created(dest_file).with_content('')
|
113
131
|
end
|
114
132
|
end
|
115
133
|
|
116
134
|
context 'upload directory' do
|
117
|
-
|
118
|
-
|
135
|
+
let(:root_dir) { File.expand_path('../', File.dirname(__FILE__)) }
|
136
|
+
let(:winrm_fs_dir) { File.join(root_dir, 'lib/winrm-fs') }
|
137
|
+
let(:core_dir) { File.join(root_dir, 'lib/winrm-fs/core') }
|
138
|
+
|
139
|
+
it 'copies the entire directory recursively' do
|
140
|
+
bytes_uploaded = subject.upload(winrm_fs_dir, dest_dir)
|
119
141
|
expect(bytes_uploaded).to be > 0
|
120
|
-
|
121
|
-
|
142
|
+
|
143
|
+
Dir.glob(winrm_fs_dir + '/**/*.rb').each do |host_file|
|
144
|
+
host_file_rel = Pathname.new(host_file).relative_path_from(Pathname.new(winrm_fs_dir)).to_s
|
122
145
|
remote_file = File.join(dest_dir, host_file_rel)
|
123
146
|
expect(subject).to have_created(remote_file).with_content(host_file)
|
124
147
|
end
|
125
148
|
end
|
126
149
|
|
127
150
|
it 'does not copy the directory when content is the same' do
|
128
|
-
subject.upload(
|
129
|
-
bytes_uploaded = subject.upload(
|
151
|
+
subject.upload(winrm_fs_dir, dest_dir)
|
152
|
+
bytes_uploaded = subject.upload(winrm_fs_dir, dest_dir)
|
130
153
|
expect(bytes_uploaded).to eq 0
|
131
154
|
end
|
132
155
|
|
133
156
|
it 'copies the directory when content differs' do
|
134
|
-
subject.upload(
|
135
|
-
|
136
|
-
bytes_uploaded = subject.upload(another_dir, dest_dir)
|
157
|
+
subject.upload(winrm_fs_dir, dest_dir)
|
158
|
+
bytes_uploaded = subject.upload(core_dir, dest_dir)
|
137
159
|
expect(bytes_uploaded).to be > 0
|
138
160
|
end
|
139
161
|
end
|
data/spec/matchers.rb
CHANGED
@@ -41,14 +41,18 @@ end
|
|
41
41
|
RSpec::Matchers.define :contain_zip_entries do |zip_entries|
|
42
42
|
match do |temp_zip_file|
|
43
43
|
zip_entries = [zip_entries] if zip_entries.is_a? String
|
44
|
-
zip_file = Zip::File.open(temp_zip_file.path)
|
44
|
+
@zip_file = Zip::File.open(temp_zip_file.path)
|
45
45
|
@missing_entries = []
|
46
46
|
zip_entries.each do |entry|
|
47
|
-
@missing_entries << entry unless zip_file.find_entry(entry)
|
47
|
+
@missing_entries << entry unless @zip_file.find_entry(entry)
|
48
48
|
end
|
49
49
|
@missing_entries.empty?
|
50
50
|
end
|
51
51
|
failure_message do |temp_zip_file|
|
52
|
-
"Expected #{temp_zip_file.path} to contain zip entries: #{@missing_entries}"
|
52
|
+
msg = "Expected #{temp_zip_file.path} to contain zip entries: #{@missing_entries}\n Got: "
|
53
|
+
@zip_file.each do |entry|
|
54
|
+
msg << entry.name << ', '
|
55
|
+
end
|
56
|
+
msg
|
53
57
|
end
|
54
58
|
end
|
data/spec/temp_zip_file_spec.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
# encoding: UTF-8
|
2
|
-
require 'zip'
|
3
2
|
require_relative '../lib/winrm-fs/core/temp_zip_file'
|
4
3
|
|
5
4
|
describe WinRM::FS::Core::TempZipFile, integration: true do
|
6
|
-
let(:
|
7
|
-
let(:
|
5
|
+
let(:winrm_fs_dir) { File.expand_path('../lib/winrm-fs', File.dirname(__FILE__)) }
|
6
|
+
let(:temp_zip_file_spec) { __FILE__ }
|
7
|
+
let(:spec_helper) { File.expand_path('spec_helper.rb', File.dirname(__FILE__)) }
|
8
8
|
|
9
9
|
subject { WinRM::FS::Core::TempZipFile.new }
|
10
|
-
after(:each) { subject.delete }
|
11
10
|
|
12
11
|
context 'temp file creation' do
|
13
12
|
it 'should create a temp file on disk' do
|
@@ -17,55 +16,40 @@ describe WinRM::FS::Core::TempZipFile, integration: true do
|
|
17
16
|
end
|
18
17
|
end
|
19
18
|
|
20
|
-
context '
|
19
|
+
context 'create zip' do
|
21
20
|
it 'should raise error when file doesn not exist' do
|
22
|
-
expect { subject.
|
23
|
-
raise_error('/etc/foo/does/not/exist isn\'t a file')
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should raise error when file is a directory' do
|
27
|
-
dir = File.dirname(subject.path)
|
28
|
-
expect { subject.add_file(dir) }.to \
|
29
|
-
raise_error("#{dir} isn\'t a file")
|
21
|
+
expect { subject.add('/etc/foo/does/not/exist') }.to raise_error
|
30
22
|
end
|
31
23
|
|
32
24
|
it 'should add a file to the zip' do
|
33
|
-
subject.
|
34
|
-
|
25
|
+
subject.add(temp_zip_file_spec)
|
26
|
+
subject.build
|
27
|
+
expect(subject).to contain_zip_entries('spec/temp_zip_file_spec.rb')
|
35
28
|
end
|
36
|
-
end
|
37
29
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
30
|
+
it 'should add multiple files to the zip' do
|
31
|
+
subject.add(temp_zip_file_spec)
|
32
|
+
subject.add(spec_helper)
|
33
|
+
subject.build
|
34
|
+
expect(subject).to contain_zip_entries([
|
35
|
+
'spec/temp_zip_file_spec.rb',
|
36
|
+
'spec/spec_helper.rb'])
|
42
37
|
end
|
43
38
|
|
44
|
-
it 'should
|
45
|
-
|
46
|
-
|
39
|
+
it 'should add all files in directory' do
|
40
|
+
subject.add(winrm_fs_dir)
|
41
|
+
subject.build
|
42
|
+
expect(subject).to contain_zip_entries('lib/winrm-fs/exceptions.rb')
|
47
43
|
end
|
48
44
|
|
49
45
|
it 'should add all files in directory to the zip recursively' do
|
50
|
-
subject.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
subject.add(src_dir)
|
58
|
-
expect(subject).to contain_zip_entries(['exceptions.rb', 'core/temp_zip_file.rb'])
|
59
|
-
end
|
60
|
-
|
61
|
-
it 'should add a file when given only a file' do
|
62
|
-
subject.add(src_file)
|
63
|
-
expect(subject).to contain_zip_entries(File.basename(src_file))
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'should raise error when given a non-path' do
|
67
|
-
expect { subject.add('garbage') }.to \
|
68
|
-
raise_error("garbage doesn't exist")
|
46
|
+
subject = WinRM::FS::Core::TempZipFile.new(Dir.pwd, recurse_paths: true)
|
47
|
+
subject.add(winrm_fs_dir)
|
48
|
+
subject.build
|
49
|
+
expect(subject).to contain_zip_entries([
|
50
|
+
'lib/winrm-fs/exceptions.rb',
|
51
|
+
'lib/winrm-fs/core/temp_zip_file.rb',
|
52
|
+
'lib/winrm-fs/scripts/checksum.ps1.erb'])
|
69
53
|
end
|
70
54
|
end
|
71
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: winrm-fs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shawn Neal
|
@@ -9,110 +9,110 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-05-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: erubis
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - ~>
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '2.7'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - ~>
|
25
|
+
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '2.7'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: logging
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '1.6'
|
35
|
-
- -
|
35
|
+
- - ">="
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: 1.6.1
|
38
38
|
type: :runtime
|
39
39
|
prerelease: false
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
|
-
- - ~>
|
42
|
+
- - "~>"
|
43
43
|
- !ruby/object:Gem::Version
|
44
44
|
version: '1.6'
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 1.6.1
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: rubyzip
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '1.1'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.1'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: winrm
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.3.0
|
69
69
|
type: :runtime
|
70
70
|
prerelease: false
|
71
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 1.3.0
|
76
76
|
- !ruby/object:Gem::Dependency
|
77
77
|
name: rspec
|
78
78
|
requirement: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 3.0.0
|
83
83
|
type: :development
|
84
84
|
prerelease: false
|
85
85
|
version_requirements: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: 3.0.0
|
90
90
|
- !ruby/object:Gem::Dependency
|
91
91
|
name: rake
|
92
92
|
requirement: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - ~>
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 10.3.2
|
97
97
|
type: :development
|
98
98
|
prerelease: false
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - ~>
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: 10.3.2
|
104
104
|
- !ruby/object:Gem::Dependency
|
105
105
|
name: rubocop
|
106
106
|
requirement: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - ~>
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.28.0
|
111
111
|
type: :development
|
112
112
|
prerelease: false
|
113
113
|
version_requirements: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - ~>
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 0.28.0
|
118
118
|
description: |2
|
@@ -127,16 +127,17 @@ extra_rdoc_files:
|
|
127
127
|
- README.md
|
128
128
|
- LICENSE
|
129
129
|
files:
|
130
|
-
- .gitignore
|
131
|
-
- .rspec
|
132
|
-
- .rubocop.yml
|
133
|
-
- .travis.yml
|
130
|
+
- ".gitignore"
|
131
|
+
- ".rspec"
|
132
|
+
- ".rubocop.yml"
|
133
|
+
- ".travis.yml"
|
134
134
|
- Gemfile
|
135
135
|
- LICENSE
|
136
136
|
- README.md
|
137
137
|
- Rakefile
|
138
138
|
- VERSION
|
139
139
|
- Vagrantfile
|
140
|
+
- benchmark.rb
|
140
141
|
- bin/rwinrmcp
|
141
142
|
- changelog.md
|
142
143
|
- lib/winrm-fs.rb
|
@@ -164,25 +165,25 @@ licenses: []
|
|
164
165
|
metadata: {}
|
165
166
|
post_install_message:
|
166
167
|
rdoc_options:
|
167
|
-
- -x
|
168
|
+
- "-x"
|
168
169
|
- test/
|
169
|
-
- -x
|
170
|
+
- "-x"
|
170
171
|
- examples/
|
171
172
|
require_paths:
|
172
173
|
- lib
|
173
174
|
required_ruby_version: !ruby/object:Gem::Requirement
|
174
175
|
requirements:
|
175
|
-
- -
|
176
|
+
- - ">="
|
176
177
|
- !ruby/object:Gem::Version
|
177
178
|
version: 1.9.0
|
178
179
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
180
|
requirements:
|
180
|
-
- -
|
181
|
+
- - ">="
|
181
182
|
- !ruby/object:Gem::Version
|
182
183
|
version: '0'
|
183
184
|
requirements: []
|
184
185
|
rubyforge_project:
|
185
|
-
rubygems_version: 2.
|
186
|
+
rubygems_version: 2.2.2
|
186
187
|
signing_key:
|
187
188
|
specification_version: 4
|
188
189
|
summary: WinRM File System
|