guard-remote-sync 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +102 -5
- data/lib/guard/remote-sync.rb +7 -2
- data/lib/guard/remote-sync/command.rb +49 -10
- data/lib/guard/remote-sync/version.rb +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -1,12 +1,35 @@
|
|
1
|
-
guard-remote-sync
|
2
|
-
|
1
|
+
#Guard::RemoteSync [![Build Status](https://secure.travis-ci.org/pmcjury/guard-remote-sync.png)](http://travis-ci.org/pmcjury/guard-remote-sync)
|
2
|
+
|
3
|
+
## Install
|
4
|
+
|
5
|
+
Please be sure to have [Guard](https://github.com/guard/guard) installed before continuing.
|
6
|
+
|
7
|
+
Please be sure to have the rsync command in your path.
|
8
|
+
|
9
|
+
It's recommended that you set up a ssh key if you're going to do remote syncing.
|
10
|
+
Alterantively your can use a password file as per rsync default option --password-file=FILE, the drawback with this is you might commit your information to the repo, and that ain't no good.
|
11
|
+
Lastly, you can just type in your password everytime, but that's too much work. Add a ssh key!
|
12
|
+
|
13
|
+
Install the gem:
|
3
14
|
|
4
|
-
**Usage**
|
5
15
|
```
|
6
|
-
|
16
|
+
$ gem install guard-remote-sync
|
7
17
|
```
|
8
18
|
|
9
|
-
|
19
|
+
Add guard definition to your Guardfile by running this command:
|
20
|
+
|
21
|
+
```
|
22
|
+
$ guard init rspec
|
23
|
+
```
|
24
|
+
|
25
|
+
## Usage
|
26
|
+
|
27
|
+
Please read [Guard usage doc](https://github.com/guard/guard#readme)
|
28
|
+
|
29
|
+
## Guardfile
|
30
|
+
|
31
|
+
### Any directory you need to rsync
|
32
|
+
|
10
33
|
```ruby
|
11
34
|
guard 'remote-sync',
|
12
35
|
:source => ".",
|
@@ -20,3 +43,77 @@ guard 'remote-sync',
|
|
20
43
|
watch(%r{^.+\.(js|xml|php|class|config)$})
|
21
44
|
end
|
22
45
|
```
|
46
|
+
Please read [Guard doc](https://github.com/guard/guard#readme) for more information about the Guardfile DSL.
|
47
|
+
|
48
|
+
## Options
|
49
|
+
|
50
|
+
### There are only two required options
|
51
|
+
|
52
|
+
```ruby
|
53
|
+
guard 'remote-sync', :source => '.', :destination => './tmp' do
|
54
|
+
# ...
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
### Syncing to a remote machine required additional options
|
59
|
+
```ruby
|
60
|
+
guard 'remote-sync',
|
61
|
+
:source => "." # the directory to start the remote sync guard in
|
62
|
+
:destination => '/export/home/user' # the directory to sync to
|
63
|
+
:user => "someone" # the user to user ex: {USER}@somehost.com
|
64
|
+
:remote_address => 'company.com' # the remote address ip or url
|
65
|
+
do
|
66
|
+
# ...
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
### Using your own rsync command. This bypasses all validations, etc.
|
71
|
+
```ruby
|
72
|
+
guard 'remote-sync', :cli_options => 'rsync -Carv . user@company.com:/export/home/user' do
|
73
|
+
# ...
|
74
|
+
end
|
75
|
+
```
|
76
|
+
|
77
|
+
### List of available options:
|
78
|
+
|
79
|
+
Most of these options are human readable and correspond to rsync's options. Long options are used wherever
|
80
|
+
possible to be more verbose
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
:source => nil # the source directory to start in
|
84
|
+
:destination => nil # the directory to sync to
|
85
|
+
:user => nil # the user to use if remote syncing to another machine
|
86
|
+
:remote_address => nil # the remote address to the other machine ip|url
|
87
|
+
:ssh => false # see rsync options : "$ man rsync"
|
88
|
+
:cli_options => nil # used if you want to pass your own rsyn command
|
89
|
+
:archive => true # see rsync options : "$ man rsync"
|
90
|
+
:recursive => true # see rsync options : "$ man rsync"
|
91
|
+
:verbose => true # see rsync options : "$ man rsync"
|
92
|
+
:delete => true # see rsync options : "$ man rsync"
|
93
|
+
:include => nil # see rsync options : "$ man rsync"
|
94
|
+
:include_from => nil # see rsync options : "$ man rsync"
|
95
|
+
:exclude => nil # see rsync options : "$ man rsync"
|
96
|
+
:exclude_from => ".rsync-filter" # see rsync options : "$ man rsync"
|
97
|
+
:progress => true # see rsync options : "$ man rsync"
|
98
|
+
:sync_on_start => false # rsycn when the guard starts instead of waiting for a watcher to trigger guard
|
99
|
+
:dry_run => false # see rsync options : "$ man rsync"
|
100
|
+
:cvs_exclude => true # see rsync options : "$ man rsync"
|
101
|
+
:password_file => nil # see rsync options : "$ man rsync"
|
102
|
+
:timeout => 10 # see rsync options : "$ man rsync"
|
103
|
+
```
|
104
|
+
|
105
|
+
Development
|
106
|
+
-----------
|
107
|
+
|
108
|
+
* Source hosted at [GitHub](https://github.com/pmcjury/guard-remote-sync)
|
109
|
+
* Report issues/Questions/Feature requests on [GitHub Issues](https://github.com/pmcjury/guard-remote-sync/issues)
|
110
|
+
|
111
|
+
Testing
|
112
|
+
-------
|
113
|
+
|
114
|
+
Please run `bundle exec rake spec` to test the source
|
115
|
+
|
116
|
+
Author
|
117
|
+
------
|
118
|
+
|
119
|
+
[Patrick H. McJury](https://github.com/pmcjury)
|
data/lib/guard/remote-sync.rb
CHANGED
@@ -33,7 +33,8 @@ module Guard
|
|
33
33
|
:sync_on_start => false,
|
34
34
|
:dry_run => false,
|
35
35
|
:cvs_exclude => true,
|
36
|
-
:password_file => nil
|
36
|
+
:password_file => nil,
|
37
|
+
:timeout => 10
|
37
38
|
}.merge(options)
|
38
39
|
|
39
40
|
@source = Source.new(options[:source])
|
@@ -48,7 +49,11 @@ module Guard
|
|
48
49
|
throw([:task_has_failed], "Guard::RemoteSync options invalid") unless options_valid?
|
49
50
|
UI.info "Guard::RemoteSync started in source directory '#{File.expand_path @source.directory}'"
|
50
51
|
Notifier.notify("Guard::RemoteSync is running in directory #{File.expand_path @source.directory}", notifier_options)
|
51
|
-
|
52
|
+
if @command.test
|
53
|
+
@command.sync if options[:sync_on_start]
|
54
|
+
else
|
55
|
+
throw([:task_has_failed], "Guard::RemoteSync rsync failed, please check your configurations, directories, permissions, and maybe even your ssh details ( set up a public key possibly )")
|
56
|
+
end
|
52
57
|
|
53
58
|
end
|
54
59
|
|
@@ -4,6 +4,26 @@ module Guard
|
|
4
4
|
|
5
5
|
attr_accessor :command, :source, :destination
|
6
6
|
|
7
|
+
CLEAR = "\e[0m"
|
8
|
+
# The start of an ANSI bold sequence.
|
9
|
+
BOLD = "\e[1m"
|
10
|
+
# Set the terminal's foreground ANSI color to black.
|
11
|
+
BLACK = "\e[30m"
|
12
|
+
# Set the terminal's foreground ANSI color to red.
|
13
|
+
RED = "\e[31m"
|
14
|
+
# Set the terminal's foreground ANSI color to green.
|
15
|
+
GREEN = "\e[32m"
|
16
|
+
# Set the terminal's foreground ANSI color to yellow.
|
17
|
+
YELLOW = "\e[33m"
|
18
|
+
# Set the terminal's foreground ANSI color to blue.
|
19
|
+
BLUE = "\e[34m"
|
20
|
+
# Set the terminal's foreground ANSI color to magenta.
|
21
|
+
MAGENTA = "\e[35m"
|
22
|
+
# Set the terminal's foreground ANSI color to cyan.
|
23
|
+
CYAN = "\e[36m"
|
24
|
+
# Set the terminal's foreground ANSI color to white.
|
25
|
+
WHITE = "\e[37m"
|
26
|
+
|
7
27
|
def initialize(source, destination, options = {})
|
8
28
|
@options = options
|
9
29
|
@source = source
|
@@ -13,28 +33,47 @@ module Guard
|
|
13
33
|
|
14
34
|
def sync
|
15
35
|
UI.info "Guard::RemoteSync `#{@command}`"
|
16
|
-
|
17
|
-
UI.info "Guard::RemoteSync Status : \n #{r}" if @options[:verbose]
|
36
|
+
run_command @command
|
18
37
|
end
|
19
38
|
|
20
39
|
def test
|
40
|
+
$stderr.puts("\r\e[0m")
|
41
|
+
$stderr.puts "#{BOLD}Testing rsync with a dry run and stats. Verifying the results...#{CLEAR}"
|
42
|
+
opts = @options
|
21
43
|
@options[:dry_run] = true
|
44
|
+
@options[:stats] = true
|
22
45
|
test_command = build_command
|
23
|
-
@options
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
$?.exitstatus
|
46
|
+
@options = opts
|
47
|
+
result = run_command test_command, {:suppress_output => false}
|
48
|
+
$stderr.puts("\r\e[0m")
|
49
|
+
result.to_i == 0
|
28
50
|
end
|
29
51
|
|
30
52
|
private
|
31
53
|
|
54
|
+
def run_command(cmd, opts = {})
|
55
|
+
options = {:color => CYAN, :suppress_output => false}.merge(opts)
|
56
|
+
$stderr.puts "\r\e[0m" unless options[:suppress_output]
|
57
|
+
exit_value = nil
|
58
|
+
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
|
59
|
+
stdout.read.split("\n").each do |line|
|
60
|
+
$stderr.puts "\t#{options[:color]}#{line}#{CLEAR}" unless options[:suppress_output]
|
61
|
+
end
|
62
|
+
stderr.read.split("\n").each do |line|
|
63
|
+
$stderr.puts "\t#{BOLD}#{RED}ERROR:#{line}#{CLEAR}"
|
64
|
+
end
|
65
|
+
exit_value = wait_thr.value.to_s.split.last
|
66
|
+
end
|
67
|
+
$stderr.puts "\t#{BOLD}#{YELLOW}Result Code #{exit_value}#{CLEAR}"
|
68
|
+
exit_value
|
69
|
+
end
|
70
|
+
|
32
71
|
def build_command
|
33
72
|
unless @options[:cli_options].nil?
|
34
|
-
UI.
|
73
|
+
UI.debug "Guard::RemoteSync ':cli' option was given so ignoring all other options, and outputting as is..." if @options[:verbose]
|
35
74
|
command = "#{rsync_command} #{@options[:cli_options]}"
|
36
75
|
else
|
37
|
-
UI.debug "building rsync options from specified options"
|
76
|
+
UI.debug "Guard::RemoteSync building rsync options from specified options" if @options[:verbose]
|
38
77
|
@command_options = build_options
|
39
78
|
@remote_options = check_remote_options
|
40
79
|
destination = @remote_options.nil? ? "#{@destination.directory}" : "#{@remote_options}:#{@destination.directory}"
|
@@ -56,7 +95,7 @@ module Guard
|
|
56
95
|
value = check_boolean_option(o)
|
57
96
|
opts.concat "#{value} " unless value.nil?
|
58
97
|
end
|
59
|
-
[:include, :include_from, :exclude, :exclude_from, :password_file].each do |o|
|
98
|
+
[:include, :include_from, :exclude, :exclude_from, :password_file, :timeout].each do |o|
|
60
99
|
value = check_nil_option(o)
|
61
100
|
opts.concat "#{value} " unless value.nil?
|
62
101
|
end
|