vagrant-scp-sync 0.5.14 → 0.5.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11e117ab4ab00e45911fd5b03030c4d533109adb73eac10cf0de89e813ba6485
4
- data.tar.gz: 29f64a74a37a7fe640b22d8b16a481aa08b67a57322e5f6822d9b6e52eac4790
3
+ metadata.gz: 39eb1408a8d8e620bac881ec74ac17bab6834e2d0a5506278aa88922c0481585
4
+ data.tar.gz: 3239d37962771cc1a7e330a633617fce7f6fb96bbb4a522569389d10f9595beb
5
5
  SHA512:
6
- metadata.gz: 2c1f8ad98eed1f467d3d263e918527d5f326a11561be2ed0224a866aae72eb258b4fa90e91ab1831055672ac5030448860fb11913db8b18558988f68697b64d5
7
- data.tar.gz: 19080ca8a5a4f742f41882cd4fbee4d58e67dcfae5320c2a35a527e7e883f6c8ebbda2421a5d6a85732e7c10c5f8d22ae3c7e316c8a6f41712ca442720426436
6
+ metadata.gz: 1b0cf61de8a0475b78eb94db00cf064be8e135924ec6760c8e7b21330900fe6451c450854c2257051bf2d9db588b8976cfa56013c6196a01392d2f7e76de97bc
7
+ data.tar.gz: 2a295ad03d2082d32fbc5ac8dfea8753f44431c79315faaad0394f82f7d5b57856000ec59c817e8f02b5043da6bd61f0ceb4c3e41a92711f3c5989abffc86d5a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.16](https://github.com/STARTcloud/vagrant-scp-sync/compare/v0.5.15...v0.5.16) (2024-12-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * single file sync - lint ([d953d76](https://github.com/STARTcloud/vagrant-scp-sync/commit/d953d761e37668f77d2b8d2c4417a3351bd260e8))
9
+ * single file sync - lint ([9d179eb](https://github.com/STARTcloud/vagrant-scp-sync/commit/9d179eb36d01b85c75aade4a04a59eae8280264b))
10
+ * single file sync - lint ([dad006f](https://github.com/STARTcloud/vagrant-scp-sync/commit/dad006fa9da87ac57a79a95124a741f9183a67f0))
11
+
12
+ ## [0.5.15](https://github.com/STARTcloud/vagrant-scp-sync/compare/v0.5.14...v0.5.15) (2024-12-23)
13
+
14
+
15
+ ### Bug Fixes
16
+
17
+ * single file sync - lint ([3f77284](https://github.com/STARTcloud/vagrant-scp-sync/commit/3f772846fee7d2a42b7ffa6cfcc4bf4547e09466))
18
+ * single file sync - lint ([029372f](https://github.com/STARTcloud/vagrant-scp-sync/commit/029372fbb906281ee70d0bcae800f71b73f88f73))
19
+
3
20
  ## [0.5.14](https://github.com/STARTcloud/vagrant-scp-sync/compare/v0.5.13...v0.5.14) (2024-12-23)
4
21
 
5
22
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'vagrant/util/platform'
4
4
  require 'vagrant/util/subprocess'
5
+ require 'vagrant-scp-sync/ssh_options'
5
6
 
6
7
  module VagrantPlugins
7
8
  module ScpSync
@@ -17,32 +18,75 @@ module VagrantPlugins
17
18
  opts[:owner] ||= ssh_info[:username]
18
19
  opts[:group] ||= ssh_info[:username]
19
20
 
20
- ssh_opts = build_ssh_options(ssh_info)
21
+ ssh_opts = SshOptions.build(ssh_info)
21
22
  scp_opts = build_scp_options(opts)
22
23
 
23
24
  delete = scp_opts.include?('--delete')
24
25
 
26
+ # Handle source and target path behaviors
27
+ has_trailing_slash_source = opts[:map].end_with?('/')
28
+ has_trailing_slash_target = opts[:to].end_with?('/')
29
+ is_source_directory = File.directory?(source_files)
30
+
25
31
  if opts[:direction] == :upload || opts[:direction].nil?
26
- source = source_files
27
- target = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{target_files}"
28
- target_dir = File.dirname(target_files)
32
+ # For upload direction
33
+ target_check = build_ssh_command(ssh_opts, "test -e #{target_files} && echo 'EXISTS' || echo 'NOT_EXISTS'", ssh_info)
34
+ target_type_check = build_ssh_command(ssh_opts, "test -d #{target_files} && echo 'DIR' || echo 'FILE'", ssh_info)
35
+
36
+ # Check if target exists and its type
37
+ target_exists = execute_command_with_output(machine, target_check).strip == 'EXISTS'
38
+ target_is_dir = target_exists && execute_command_with_output(machine, target_type_check).strip == 'DIR'
39
+
40
+ # Determine source path based on trailing slash and directory status
41
+ source = if is_source_directory && has_trailing_slash_source
42
+ "#{source_files}/*" # Copy contents of directory
43
+ else
44
+ source_files # Copy directory itself or single file
45
+ end
46
+
47
+ # Determine target path based on existence and trailing slash
48
+ target_base = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{target_files}"
49
+ target = if target_exists && target_is_dir && !has_trailing_slash_target
50
+ # If target exists as directory but no trailing slash, put source inside it
51
+ "#{target_base}/#{File.basename(source_files)}"
52
+ else
53
+ target_base
54
+ end
55
+
56
+ # Prepare remote target directory with proper permissions
57
+ target_dir = target_files
58
+ target_dir = File.dirname(target_files) unless target_is_dir || has_trailing_slash_target
59
+
29
60
  make_dir = build_ssh_command(ssh_opts, "sudo mkdir -p #{target_dir}", ssh_info)
30
61
  change_ownership = build_ssh_command(ssh_opts, "sudo chown -R #{opts[:owner]}:#{opts[:group]} #{target_dir}", ssh_info)
31
- change_permissions = build_ssh_command(ssh_opts, "sudo chmod 777 #{target_dir}", ssh_info)
32
- remove_dir = build_ssh_command(ssh_opts, "sudo rm -rf #{target_files}", ssh_info)
62
+ change_permissions = build_ssh_command(ssh_opts, "sudo chmod -R 777 #{target_dir}", ssh_info)
63
+ remove_dir = build_ssh_command(ssh_opts, "sudo rm -rf #{target_files}", ssh_info) if delete
64
+
33
65
  elsif opts[:direction] == :download
66
+ # For download direction
34
67
  source = "#{ssh_info[:username]}@#{ssh_info[:host]}:#{source_files}"
68
+ source = "#{source}/*" if has_trailing_slash_source
69
+
70
+ # Create local target directory without sudo
35
71
  target = target_files
36
- target_dir = File.dirname(target_files)
37
- make_dir = target_dir == '.' ? nil : "mkdir -p #{target_dir}"
72
+ target_dir = target_files
73
+ target_dir = File.dirname(target_files) unless File.directory?(target_files) || has_trailing_slash_target
74
+ make_dir = "mkdir -p #{target_dir}"
75
+ end
76
+
77
+ # Execute commands with proper error messages
78
+ execute_command(machine, remove_dir, true, 'scp_sync_error_delete_directory', opts) if delete
79
+ execute_command(machine, make_dir, true, 'scp_sync_error_make_directory', opts)
80
+
81
+ # For upload, ensure remote directory permissions
82
+ if opts[:direction] == :upload || opts[:direction].nil?
83
+ execute_command(machine, change_ownership, true, 'scp_sync_error_change_ownership_directory', opts)
84
+ execute_command(machine, change_permissions, true, 'scp_sync_error_change_permissions_directory', opts)
38
85
  end
39
86
 
87
+ # Build and execute the scp command
40
88
  synchronize = build_scp_command(scp_path, ssh_opts, source, target)
41
- execute_command(machine, remove_dir, delete, nil, opts)
42
- execute_command(machine, make_dir, false, nil, opts)
43
- execute_command(machine, change_ownership, false, nil, opts)
44
- execute_command(machine, change_permissions, false, nil, opts)
45
- execute_command(machine, synchronize, true, 'scp_sync_folder', opts)
89
+ execute_command(machine, synchronize, true, 'scp_sync_folder_error', opts)
46
90
  end
47
91
 
48
92
  def self.expand_path(path, machine)
@@ -50,17 +94,6 @@ module VagrantPlugins
50
94
  Vagrant::Util::Platform.fs_real_path(expanded_path).to_s
51
95
  end
52
96
 
53
- def self.build_ssh_options(ssh_info)
54
- opts = %w[
55
- -o StrictHostKeyChecking=no
56
- -o UserKnownHostsFile=/dev/null
57
- -o LogLevel=ERROR
58
- ]
59
- opts << "-o port=#{ssh_info[:port]}"
60
- opts << ssh_info[:private_key_path].map { |k| "-i #{k}" }.join(' ')
61
- opts
62
- end
63
-
64
97
  def self.build_scp_options(opts)
65
98
  opts[:scp__args] ? Array(opts[:scp__args]).dup : ['--verbose']
66
99
  end
@@ -92,13 +125,22 @@ module VagrantPlugins
92
125
  raise_scp_error(message_key, command, result.stderr) if raise_error && !result.exit_code.zero?
93
126
  end
94
127
 
128
+ def self.execute_command_with_output(_machine, command)
129
+ return '' if command.nil?
130
+
131
+ result = Vagrant::Util::Subprocess.execute('sh', '-c', command)
132
+ result.stdout
133
+ end
134
+
95
135
  def self.raise_scp_error(message_key, command, stderr)
96
136
  raise Errors.const_get("SyncedFolderScpSync#{message_key.split('_').map(&:capitalize).join}Error"),
97
137
  command: command,
98
138
  stderr: stderr
99
139
  end
100
140
 
101
- private_class_method :expand_path, :build_ssh_options, :build_scp_options, :build_ssh_command, :build_scp_command, :execute_command, :raise_scp_error
141
+ private_class_method :expand_path, :build_scp_options,
142
+ :build_ssh_command, :build_scp_command, :execute_command,
143
+ :execute_command_with_output, :raise_scp_error
102
144
  end
103
145
  end
104
146
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module VagrantPlugins
4
+ module ScpSync
5
+ # Helper class for building SSH options
6
+ class SshOptions
7
+ def self.build(ssh_info)
8
+ opts = %w[
9
+ -o StrictHostKeyChecking=no
10
+ -o UserKnownHostsFile=/dev/null
11
+ -o LogLevel=ERROR
12
+ ]
13
+ opts << "-o port=#{ssh_info[:port]}"
14
+ opts << ssh_info[:private_key_path].map { |k| "-i #{k}" }.join(' ')
15
+ opts
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Vagrant
4
4
  module ScpSync
5
- VERSION = '0.5.14'
5
+ VERSION = '0.5.16'
6
6
  NAME = 'vagrant-scp-sync'
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-scp-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.14
4
+ version: 0.5.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mark Gilbert
@@ -143,6 +143,7 @@ files:
143
143
  - lib/vagrant-scp-sync/command/scp.rb
144
144
  - lib/vagrant-scp-sync/errors.rb
145
145
  - lib/vagrant-scp-sync/plugin.rb
146
+ - lib/vagrant-scp-sync/ssh_options.rb
146
147
  - lib/vagrant-scp-sync/synced_folder.rb
147
148
  - lib/vagrant-scp-sync/version.rb
148
149
  - locales/en.yml