winrm-fs 0.1.0 → 0.2.0
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.
- 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
|