docker-sync 0.4.6 → 0.5.0.pre.beta1

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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/console +6 -0
  4. data/lib/docker-sync.rb +2 -1
  5. data/lib/docker-sync/config/project_config.rb +13 -12
  6. data/lib/docker-sync/dependencies.rb +39 -0
  7. data/lib/docker-sync/dependencies/docker.rb +23 -0
  8. data/lib/docker-sync/dependencies/docker_driver.rb +20 -0
  9. data/lib/docker-sync/dependencies/fswatch.rb +14 -0
  10. data/lib/docker-sync/dependencies/package_manager.rb +24 -0
  11. data/lib/docker-sync/dependencies/package_managers/apt.rb +24 -0
  12. data/lib/docker-sync/dependencies/package_managers/base.rb +47 -0
  13. data/lib/docker-sync/dependencies/package_managers/brew.rb +24 -0
  14. data/lib/docker-sync/dependencies/package_managers/none.rb +23 -0
  15. data/lib/docker-sync/dependencies/package_managers/pkg.rb +24 -0
  16. data/lib/docker-sync/dependencies/package_managers/yum.rb +24 -0
  17. data/lib/docker-sync/dependencies/rsync.rb +14 -0
  18. data/lib/docker-sync/dependencies/unison.rb +15 -0
  19. data/lib/docker-sync/dependencies/unox.rb +40 -0
  20. data/lib/docker-sync/environment.rb +19 -0
  21. data/lib/docker-sync/execution.rb +11 -35
  22. data/lib/docker-sync/sync_manager.rb +10 -3
  23. data/lib/docker-sync/sync_process.rb +16 -18
  24. data/lib/docker-sync/sync_strategy/native.rb +3 -4
  25. data/lib/docker-sync/sync_strategy/native_osx.rb +11 -11
  26. data/lib/docker-sync/sync_strategy/rsync.rb +15 -7
  27. data/lib/docker-sync/sync_strategy/unison.rb +13 -12
  28. data/lib/docker-sync/update_check.rb +5 -0
  29. data/lib/docker-sync/upgrade_check.rb +2 -1
  30. data/lib/docker-sync/watch_strategy/dummy.rb +1 -1
  31. data/lib/docker-sync/watch_strategy/fswatch.rb +4 -5
  32. data/lib/docker-sync/watch_strategy/remotelogs.rb +3 -3
  33. data/lib/docker-sync/watch_strategy/unison.rb +2 -2
  34. data/tasks/daemon/daemon.thor +0 -1
  35. data/tasks/stack/stack.thor +8 -9
  36. data/tasks/sync/sync.thor +16 -19
  37. metadata +21 -9
  38. data/lib/docker-sync/preconditions/preconditions_linux.rb +0 -51
  39. data/lib/docker-sync/preconditions/preconditions_osx.rb +0 -174
  40. data/lib/docker-sync/preconditions/strategy.rb +0 -65
@@ -11,6 +11,7 @@ class UpgradeChecker
11
11
  end
12
12
 
13
13
  def run
14
+ return if ENV['DOCKER_SYNC_SKIP_UPGRADE']
14
15
  unless should_run
15
16
  return
16
17
  end
@@ -50,6 +51,7 @@ class UpgradeChecker
50
51
  end
51
52
 
52
53
  def check_and_warn
54
+ return if ENV['DOCKER_SYNC_SKIP_UPGRADE']
53
55
  # this is the upgrade hook for the unison-unox introduction / rename of unison
54
56
  if Gem::Version.new(last_upgraded_version) < Gem::Version.new('0.1.0')
55
57
  Thor::Shell::Basic.new.say_status 'warning', 'Please be aware that with the strategy "unison" is now called unison-onesided and you might need to migrate. See https://github.com/EugenMayer/docker-sync/wiki/Migration-Guide for more informations', :red
@@ -75,7 +77,6 @@ class UpgradeChecker
75
77
  system cmd1
76
78
  else
77
79
  raise('Please reinstall docker-sync yourself')
78
- exit 1
79
80
  end
80
81
  end
81
82
 
@@ -1,7 +1,7 @@
1
1
  require 'thor/shell'
2
2
  require 'docker-sync/execution'
3
3
 
4
- module Docker_Sync
4
+ module DockerSync
5
5
  module WatchStrategy
6
6
  class Dummy
7
7
  include Thor::Shell
@@ -1,9 +1,8 @@
1
1
  require 'thor/shell'
2
2
  require 'docker-sync/execution'
3
- require 'docker-sync/preconditions/strategy'
4
3
  require 'pathname'
5
4
 
6
- module Docker_Sync
5
+ module DockerSync
7
6
  module WatchStrategy
8
7
  class Fswatch
9
8
  include Thor::Shell
@@ -19,8 +18,8 @@ module Docker_Sync
19
18
  @events_to_watch = %w(AttributeModified Created Link MovedFrom MovedTo Renamed Removed Updated)
20
19
 
21
20
  begin
22
- DockerSync::Preconditions::Strategy.instance.fswatch_available
23
- rescue Exception => e
21
+ Dependencies::Fswatch.ensure!
22
+ rescue StandardError => e
24
23
  say_status 'error', e.message, :red
25
24
  exit 1
26
25
  end
@@ -43,7 +42,7 @@ module Docker_Sync
43
42
  say_status 'command', cmd, :white if @options['verbose']
44
43
 
45
44
  # run a thread here, since it is blocking
46
- @watch_thread = threadexec(cmd, "Sync #{@sync_name}", :blue)
45
+ @watch_thread = thread_exec(cmd, "Sync #{@sync_name}", :blue)
47
46
  end
48
47
 
49
48
  def watch_options
@@ -1,7 +1,7 @@
1
1
  require 'thor/shell'
2
2
  require 'docker-sync/execution'
3
3
 
4
- module Docker_Sync
4
+ module DockerSync
5
5
  module WatchStrategy
6
6
  class Remote_logs
7
7
  include Thor::Shell
@@ -17,13 +17,13 @@ module Docker_Sync
17
17
  @sync_name = sync_name
18
18
  @watch_fork = nil
19
19
  @watch_thread = nil
20
- @unison = Docker_Sync::SyncStrategy::NativeOsx.new(@sync_name, @options)
20
+ @unison = DockerSync::SyncStrategy::NativeOsx.new(@sync_name, @options)
21
21
  end
22
22
 
23
23
  def run
24
24
  say_status 'success', "Showing unison logs from your sync container: #{@unison.get_container_name}", :green
25
25
  cmd = "docker exec #{@unison.get_container_name} tail -F /tmp/unison.log"
26
- @watch_thread = threadexec(cmd, 'Sync Log:')
26
+ @watch_thread = thread_exec(cmd, 'Sync Log:')
27
27
  end
28
28
 
29
29
  def stop
@@ -2,7 +2,7 @@ require 'thor/shell'
2
2
  require 'docker-sync/execution'
3
3
  require 'docker-sync/sync_strategy/unison'
4
4
 
5
- module Docker_Sync
5
+ module DockerSync
6
6
  module WatchStrategy
7
7
  class Unison
8
8
  include Execution
@@ -19,7 +19,7 @@ module Docker_Sync
19
19
  # unison sync and watch
20
20
  # basically unison watch is the command with the additionnal -repeat watch option
21
21
  # note: this doesn't run a sync
22
- @unison = Docker_Sync::SyncStrategy::Unison.new(@sync_name, @options)
22
+ @unison = DockerSync::SyncStrategy::Unison.new(@sync_name, @options)
23
23
  end
24
24
 
25
25
  def run
@@ -1,6 +1,5 @@
1
1
  require 'docker-sync'
2
2
  require 'docker-sync/sync_manager'
3
- require 'docker-sync/preconditions/strategy'
4
3
  require 'docker-sync/update_check'
5
4
  require 'docker-sync/upgrade_check'
6
5
  require 'daemons'
@@ -1,6 +1,5 @@
1
1
  require 'docker-sync'
2
2
  require 'docker-sync/sync_manager'
3
- require 'docker-sync/preconditions/strategy'
4
3
  require 'docker-sync/update_check'
5
4
  require 'docker-sync/upgrade_check'
6
5
  require 'docker/compose'
@@ -35,15 +34,15 @@ class Stack < Thor
35
34
 
36
35
  begin
37
36
  config = DockerSync::ProjectConfig.new(config_path: options[:config])
38
- DockerSync::Preconditions::Strategy.instance.check_all_preconditions(config)
39
- rescue Exception => e
37
+ DockerSync::Dependencies.ensure_all!(config)
38
+ rescue StandardError => e
40
39
  say_status 'error', e.message, :red
41
40
  exit(1)
42
41
  end
43
42
 
44
- say_status 'note:', 'You can also run docker-sync in the background with docker-sync --daemon'
43
+ say_status 'note:', 'You can also run docker-sync in the background with docker-sync start'
45
44
 
46
- @sync_manager = Docker_sync::SyncManager.new(config: config)
45
+ @sync_manager = DockerSync::SyncManager.new(config: config)
47
46
  @sync_manager.run(options[:sync_name])
48
47
  global_options = @sync_manager.global_options
49
48
  @compose_manager = ComposeManager.new(global_options)
@@ -60,7 +59,7 @@ class Stack < Thor
60
59
 
61
60
  @sync_manager.stop
62
61
  @compose_manager.stop
63
- rescue Exception => e
62
+ rescue StandardError => e
64
63
  puts "EXCEPTION: #{e.inspect}"
65
64
  puts "MESSAGE: #{e.message}"
66
65
  end
@@ -76,13 +75,13 @@ class Stack < Thor
76
75
 
77
76
  begin
78
77
  config = DockerSync::ProjectConfig.new(config_path: options[:config])
79
- DockerSync::Preconditions::Strategy.instance.check_all_preconditions(config)
80
- rescue Exception => e
78
+ DockerSync::Dependencies.ensure_all!(config)
79
+ rescue StandardError => e
81
80
  say_status 'error', e.message, :red
82
81
  exit(1)
83
82
  end
84
83
 
85
- @sync_manager = Docker_sync::SyncManager.new(config: config)
84
+ @sync_manager = DockerSync::SyncManager.new(config: config)
86
85
  global_options = @sync_manager.global_options
87
86
  # shutdown compose first
88
87
  @compose_manager = ComposeManager.new(global_options)
data/tasks/sync/sync.thor CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'docker-sync'
2
2
  require 'docker-sync/sync_manager'
3
- require 'docker-sync/preconditions/strategy'
4
3
  require 'docker-sync/update_check'
5
4
  require 'docker-sync/upgrade_check'
6
5
  require 'daemons'
@@ -34,7 +33,7 @@ class Sync < Thor
34
33
  UpgradeChecker.new.run
35
34
 
36
35
  config = config_preconditions
37
- @sync_manager = Docker_sync::SyncManager.new(config: config)
36
+ @sync_manager = DockerSync::SyncManager.new(config: config)
38
37
 
39
38
  start_dir = Dir.pwd # Set start_dir variable to be equal to pre-daemonized folder, since daemonizing will change dir to '/'
40
39
 
@@ -61,7 +60,7 @@ class Sync < Thor
61
60
  print_version if options[:version]
62
61
 
63
62
  config = config_preconditions
64
- sync_manager = Docker_sync::SyncManager.new(config: config)
63
+ sync_manager = DockerSync::SyncManager.new(config: config)
65
64
  sync_manager.stop
66
65
  pid_file_path="#{options['dir']}/#{options['app_name']}.pid"
67
66
  if File.exist?(pid_file_path)
@@ -86,7 +85,7 @@ class Sync < Thor
86
85
 
87
86
  config = config_preconditions
88
87
 
89
- @sync_manager = Docker_sync::SyncManager.new(config: config)
88
+ @sync_manager = DockerSync::SyncManager.new(config: config)
90
89
  @sync_manager.sync(options[:sync_name])
91
90
  end
92
91
 
@@ -107,7 +106,7 @@ class Sync < Thor
107
106
  # Remove the .docker-sync directory
108
107
  FileUtils.rm_r dir if File.directory?(dir)
109
108
 
110
- @sync_manager = Docker_sync::SyncManager.new(config: config)
109
+ @sync_manager = DockerSync::SyncManager.new(config: config)
111
110
  @sync_manager.clean(options[:sync_name])
112
111
  say_status 'success', 'Finished cleanup. Removed stopped, removed sync container and removed their volumes', :green
113
112
  end
@@ -129,27 +128,25 @@ class Sync < Thor
129
128
  def list
130
129
  print_version if options[:version]
131
130
 
132
- config = config_preconditions
131
+ project_config = config_preconditions
133
132
 
134
- say_status 'ok',"Found configuration at #{config.config_path}"
135
- @sync_manager = Docker_sync::SyncManager.new(config: config)
136
- @sync_manager.get_sync_points.each do |name, config|
137
- say_status name, "On address #{config['sync_host_ip']}:#{config['sync_host_port']}",:white unless options['verbose']
138
- puts "\n---------------[#{name}] #{config['sync_host_ip']}:#{config['sync_host_port']} ---------------\n" if options['verbose']
139
- print_table(config) if options['verbose']
133
+ say_status 'ok',"Found configuration at #{project_config.config_path}"
134
+ @sync_manager = DockerSync::SyncManager.new(config: project_config)
135
+ @sync_manager.get_sync_points.each do |name, sync_config|
136
+ say_status name, "On address #{sync_config['sync_host_ip']}:#{sync_config['sync_host_port']}",:white unless options['verbose']
137
+ puts "\n---------------[#{name}] #{sync_config['sync_host_ip']}:#{sync_config['sync_host_port']} ---------------\n" if options['verbose']
138
+ print_table(sync_config) if options['verbose']
140
139
  end
141
140
  end
142
141
 
143
142
  no_tasks do
144
143
  def config_preconditions # Moved shared preconditions block into separate method to have less/cleaner code
145
- begin
146
- DockerSync::ProjectConfig.new(config_path: options[:config]).tap do |config|
147
- DockerSync::Preconditions::Strategy.instance.check_all_preconditions(config)
148
- end
149
- rescue Exception => e
150
- say_status 'error', e.message, :red
151
- exit 1
144
+ DockerSync::ProjectConfig.new(config_path: options[:config]).tap do |config|
145
+ DockerSync::Dependencies.ensure_all!(config)
152
146
  end
147
+ rescue StandardError => e
148
+ say_status 'error', e.message, :red
149
+ exit 1
153
150
  end
154
151
 
155
152
  def daemonize
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: docker-sync
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.6
4
+ version: 0.5.0.pre.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eugen Mayer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-15 00:00:00.000000000 Z
11
+ date: 2017-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -174,10 +174,22 @@ files:
174
174
  - lib/docker-sync/config/config_serializer.rb
175
175
  - lib/docker-sync/config/global_config.rb
176
176
  - lib/docker-sync/config/project_config.rb
177
+ - lib/docker-sync/dependencies.rb
178
+ - lib/docker-sync/dependencies/docker.rb
179
+ - lib/docker-sync/dependencies/docker_driver.rb
180
+ - lib/docker-sync/dependencies/fswatch.rb
181
+ - lib/docker-sync/dependencies/package_manager.rb
182
+ - lib/docker-sync/dependencies/package_managers/apt.rb
183
+ - lib/docker-sync/dependencies/package_managers/base.rb
184
+ - lib/docker-sync/dependencies/package_managers/brew.rb
185
+ - lib/docker-sync/dependencies/package_managers/none.rb
186
+ - lib/docker-sync/dependencies/package_managers/pkg.rb
187
+ - lib/docker-sync/dependencies/package_managers/yum.rb
188
+ - lib/docker-sync/dependencies/rsync.rb
189
+ - lib/docker-sync/dependencies/unison.rb
190
+ - lib/docker-sync/dependencies/unox.rb
191
+ - lib/docker-sync/environment.rb
177
192
  - lib/docker-sync/execution.rb
178
- - lib/docker-sync/preconditions/preconditions_linux.rb
179
- - lib/docker-sync/preconditions/preconditions_osx.rb
180
- - lib/docker-sync/preconditions/strategy.rb
181
193
  - lib/docker-sync/sync_manager.rb
182
194
  - lib/docker-sync/sync_process.rb
183
195
  - lib/docker-sync/sync_strategy/native.rb
@@ -195,7 +207,7 @@ files:
195
207
  - tasks/sync/sync.thor
196
208
  homepage: https://github.com/EugenMayer/docker_sync
197
209
  licenses:
198
- - GPL
210
+ - GPL-3.0
199
211
  metadata: {}
200
212
  post_install_message:
201
213
  rdoc_options: []
@@ -208,12 +220,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
208
220
  version: '2.0'
209
221
  required_rubygems_version: !ruby/object:Gem::Requirement
210
222
  requirements:
211
- - - ">="
223
+ - - ">"
212
224
  - !ruby/object:Gem::Version
213
- version: '0'
225
+ version: 1.3.1
214
226
  requirements: []
215
227
  rubyforge_project:
216
- rubygems_version: 2.4.5.1
228
+ rubygems_version: 2.5.2
217
229
  signing_key:
218
230
  specification_version: 4
219
231
  summary: Docker Sync - Fast and efficient way to sync code to docker-containers
@@ -1,51 +0,0 @@
1
- module DockerSync
2
- module Preconditions
3
- class Linux
4
- def check_all_preconditions(config)
5
- return unless should_run_precondition?
6
-
7
- docker_available
8
- docker_running
9
-
10
- if config.unison_required?
11
- unison_available
12
- end
13
-
14
- if config.rsync_required?
15
- rsync_available
16
- fswatch_available
17
- end
18
- end
19
-
20
- def docker_available
21
- end
22
-
23
- def docker_running
24
- end
25
-
26
- def fswatch_available
27
- end
28
-
29
- def rsync_available
30
- end
31
-
32
- def unison_available
33
- end
34
-
35
- def is_driver_docker_for_mac?
36
- return false
37
- end
38
-
39
- def is_driver_docker_toolbox?
40
- return false
41
- end
42
- private
43
-
44
- def should_run_precondition?(silent: false)
45
- true
46
- end
47
-
48
-
49
- end
50
- end
51
- end
@@ -1,174 +0,0 @@
1
- require 'mkmf'
2
- module DockerSync
3
- module Preconditions
4
- class Osx
5
- def check_all_preconditions(config)
6
- return unless should_run_precondition?
7
-
8
- docker_available
9
- docker_running
10
-
11
- if config.unison_required?
12
- unison_available
13
- end
14
-
15
- if config.rsync_required?
16
- rsync_available
17
- fswatch_available
18
- end
19
- end
20
-
21
- def docker_available
22
- if (find_executable0 'docker').nil?
23
- raise('Could not find docker binary in path. Please install it, e.g. using "brew install docker" or install docker-for-mac')
24
- end
25
- end
26
-
27
- def docker_running
28
- `docker ps`
29
- if $?.exitstatus > 0
30
- raise('No docker daemon seems to be running. Did you start your docker-for-mac / docker-machine?')
31
- end
32
- end
33
-
34
- def rsync_available
35
- if should_run_precondition?
36
- if (find_executable0 'rsync').nil?
37
- raise('Could not find rsync binary in path. Please install it, e.g. using "brew install rsync"')
38
- end
39
- end
40
- end
41
-
42
- def unison_available
43
- if should_run_precondition?
44
- if (find_executable0 'unison').nil?
45
- cmd1 = 'brew install unison'
46
-
47
- Thor::Shell::Basic.new.say_status 'warning', 'Could not find unison binary in $PATH. Trying to install now', :red
48
- Thor::Shell::Basic.new.say_status 'command', cmd1, :white
49
- if Thor::Shell::Basic.new.yes?('I will install unison using brew for you? (y/N)')
50
- system cmd1
51
- else
52
- raise('Please install it yourself using: brew install unison')
53
- end
54
- end
55
-
56
- unox_available
57
- end
58
- end
59
-
60
- def fswatch_available
61
- if should_run_precondition?
62
- if (find_executable0 'fswatch').nil?
63
- cmd1 = 'brew install fswatch'
64
-
65
- Thor::Shell::Basic.new.say_status 'warning', 'No fswatch available. Install it by "brew install fswatch Trying to install now', :red
66
- if Thor::Shell::Basic.new.yes?('I will install fswatch using brew for you? (y/N)')
67
- system cmd1
68
- else
69
- raise('Please install it yourself using: brew install fswatch')
70
- end
71
- end
72
- end
73
-
74
- end
75
-
76
- def is_driver_docker_for_mac?
77
- `docker info | grep 'Docker Root Dir: /var/lib/docker' && docker info | grep 'Operating System: Alpine Linux'`
78
- $?.success?
79
- end
80
-
81
- def is_driver_docker_toolbox?
82
- return false unless find_executable0('docker-machine')
83
- `docker info | grep 'Operating System: Boot2Docker'`
84
- $?.success?
85
- end
86
-
87
- private
88
-
89
- def should_run_precondition?(silent = false)
90
- unless has_brew?
91
- Thor::Shell::Basic.new.say_status 'info', 'Not running any precondition checks since you have no brew and that is unsupported. Is all up to you know.', :white unless silent
92
- return false
93
- end
94
- return true
95
- end
96
-
97
- def has_brew?
98
- return find_executable0 'brew'
99
- end
100
-
101
-
102
- def unox_available
103
- if should_run_precondition?
104
- if defined? Bundler
105
- Bundler.with_clean_env { `brew list unox` }
106
- else
107
- `brew list unox`
108
- end
109
-
110
- unless $?.success?
111
- # unox installed, but not using brew, we do not allow that anymore
112
- if File.exist?('/usr/local/bin/unison-fsmonitor')
113
- Thor::Shell::Basic.new.say_status 'error', 'You installed unison-fsmonitor (unox) not using brew-method - the old legacy way. We need to fix that.', :red
114
-
115
- uninstall_cmd='sudo rm /usr/local/bin/unison-fsmonitor'
116
- Thor::Shell::Basic.new.say_status 'command', uninstall_cmd, :white
117
- if Thor::Shell::Basic.new.yes?('Should i uninstall the legacy /usr/local/bin/unison-fsmonitor for you ? (y/N)')
118
- system uninstall_cmd
119
- else
120
- Thor::Shell::Basic.new.say_status 'error', 'Uninstall /usr/local/bin/unison-fsmonitor manually please', :white
121
- exit 1
122
- end
123
- end
124
-
125
- cmd1 = 'brew tap eugenmayer/dockersync && brew install eugenmayer/dockersync/unox'
126
- Thor::Shell::Basic.new.say_status 'warning', 'Could not find unison-fsmonitor (unox) binary in $PATH. Trying to install now', :red
127
- Thor::Shell::Basic.new.say_status 'command', cmd1, :white
128
- if Thor::Shell::Basic.new.yes?('I will install unox through brew for you? (y/N)')
129
- system cmd1
130
- else
131
- raise("Please install it yourself using: #{cmd1}")
132
- end
133
- end
134
- end
135
- end
136
-
137
- def install_pip(package, test = nil)
138
- test ? `python -c 'import #{test}'` : `python -c 'import #{package}'`
139
-
140
- unless $?.success?
141
- Thor::Shell::Basic.new.say_status 'warning', "Could not find #{package}. Will try to install it using pip", :red
142
- if find_executable0('python') == '/usr/bin/python'
143
- Thor::Shell::Basic.new.say_status 'ok', 'You seem to use the system python, we will need sudo below'
144
- sudo = true
145
- cmd2 = "sudo easy_install pip && sudo pip install #{package}"
146
- else
147
- Thor::Shell::Basic.new.say_status 'ok', 'You seem to have a custom python, using non-sudo commands'
148
- sudo = false
149
- cmd2 = "easy_install pip && pip install #{package}"
150
- end
151
- if sudo
152
- question = "I will ask you for you root password to install #{package} by running (This will ask for sudo, since we use the system python)"
153
- else
154
- question = "I will now install #{package} for you by running"
155
- end
156
-
157
- Thor::Shell::Basic.new.say_status 'info', "#{question}: `#{cmd2}\n\n"
158
- if Thor::Shell::Basic.new.yes?('Shall I continue? (y/N)')
159
- system cmd2
160
- if $?.exitstatus > 0
161
- raise("Failed to install #{package}, please file an issue with the output of the error")
162
- end
163
- test ? `python -c 'import #{test}'` : `python -c 'import #{package}'`
164
- unless $?.success?
165
- raise("Somehow I could not successfully install #{package} even though I tried. Please report this issue.")
166
- end
167
- else
168
- raise("Please install #{package} manually, see https://github.com/EugenMayer/docker-sync/wiki/1.-Installation")
169
- end
170
- end
171
- end
172
- end
173
- end
174
- end