guard-remote-sync 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Patrick McJury
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ guard-rsync-remote
2
+ ============
3
+
4
+ **Usage**
5
+ ```
6
+ bundle exec guard
7
+ ```
8
+
9
+ **Example Guardfile**
10
+ ```
11
+ guard 'rsync-remote',
12
+ :source => ".",
13
+ :destination => '/export/home/{username}/tmp',
14
+ :user => '{user}',
15
+ :remote_address => '{address}',
16
+ :verbose => true,
17
+ :cli => "--color",
18
+ :sync_on_start => true do
19
+
20
+ watch(%r{^.+\.(js|xml|php|class|config)$})
21
+ end
22
+ ```
23
+
24
+ A more extensive and tested rsync guard
@@ -0,0 +1,96 @@
1
+ module Guard
2
+ class RemoteSync
3
+ class Command
4
+
5
+ attr_accessor :command, :source, :destination
6
+
7
+ def initialize(source, destination, options = {})
8
+ @options = options
9
+ @source = source
10
+ @destination = destination
11
+ @command = build_command
12
+ end
13
+
14
+ def sync
15
+ UI.info "Guard::RsyncX `#{@command}`"
16
+ r = `#{@command}`
17
+ UI.info "Guard::RsyncX Status : \n #{r}" if @options[:verbose]
18
+ end
19
+
20
+ def test
21
+ @options[:dry_run] = true
22
+ test_command = build_command
23
+ @options[:dry_run] = false
24
+ $stdout.sync = true
25
+ `#{test_command}`
26
+ $stdout.sync = false
27
+ $?.exitstatus
28
+ end
29
+
30
+ private
31
+
32
+ def build_command
33
+ unless @options[:cli_options].nil?
34
+ UI.info "':cli' option was given so ignoring all other options, and outputting as is..."
35
+ command = "#{rsync_command} #{@options[:cli_options]}"
36
+ else
37
+ UI.debug "building rsync options from specified options"
38
+ @command_options = build_options
39
+ @remote_options = check_remote_options
40
+ destination = @remote_options.nil? ? "#{@destination.directory}" : "#{@remote_options}:#{@destination.directory}"
41
+ command = "#{rsync_command} #{@command_options}#{@source.directory} #{destination}"
42
+ end
43
+ command
44
+ end
45
+
46
+ def build_options
47
+ opts = ""
48
+ simple_opts = ""
49
+ [:archive, :recursive, :verbose].each do |o|
50
+ value = check_simple_option(o)
51
+ simple_opts.concat "#{value}" unless value.nil?
52
+ end
53
+ opts.concat "-#{simple_opts} " unless simple_opts.empty?
54
+
55
+ [:progress, :delete, :stats, :dry_run, :cvs_exclude].each do |o|
56
+ value = check_boolean_option(o)
57
+ opts.concat "#{value} " unless value.nil?
58
+ end
59
+ [:include, :include_from, :exclude, :exclude_from, :password_file].each do |o|
60
+ value = check_nil_option(o)
61
+ opts.concat "#{value} " unless value.nil?
62
+ end
63
+
64
+ opts
65
+ end
66
+
67
+ def rsync_command
68
+ "rsync"
69
+ end
70
+
71
+ def check_remote_options
72
+ unless @options[:user].nil? && @options[:remote_address].nil?
73
+ raise "A remote address is required if you specify a user" if !@options[:user].nil? && @options[:remote_address].nil?
74
+ raise "A user is required if you specify a remote address" if @options[:user].nil? && !@options[:remote_address].nil?
75
+ value = "#{@options[:user]}@#{@options[:remote_address]}"
76
+ else
77
+ value = nil
78
+ end
79
+ value
80
+ end
81
+
82
+ def check_boolean_option(option)
83
+ @options[option] ? "--#{option.to_s.gsub(/_/, '-')}" : nil
84
+ end
85
+
86
+ def check_nil_option(option)
87
+ @options[option].nil? ? nil : "--#{option.to_s.gsub(/_/, '-')} '#{@options[option]}'"
88
+ end
89
+
90
+ def check_simple_option(option)
91
+ @options[option] ? "#{option.to_s[0, 1]}" : nil
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,13 @@
1
+ module Guard
2
+ class RemoteSync
3
+ class Source
4
+
5
+ attr_accessor :directory
6
+
7
+ def initialize(directory)
8
+ @directory = directory
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ guard 'remote-sync',
2
+ :source => ".",
3
+ :destination => '/export/home/{username}/tmp',
4
+ :user => '{user}',
5
+ :remote_address => '{address}',
6
+ :verbose => true,
7
+ :cli => "--color",
8
+ :sync_on_start => true do
9
+
10
+ watch(%r{^.+\.(js|xml|php|class|config)$})
11
+ end
@@ -0,0 +1,5 @@
1
+ module Guard
2
+ module RemoteSyncVersion
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,121 @@
1
+ require 'guard'
2
+ require 'guard/guard'
3
+
4
+ module Guard
5
+ class RemoteSync < Guard
6
+
7
+ autoload :Command, 'guard/remote-sync/command'
8
+ autoload :Source, 'guard/remote-sync/source'
9
+
10
+ attr_accessor :command
11
+
12
+ # Initialize a Guard.
13
+ # @param [Array<Guard::Watcher>] watchers the Guard file watchers
14
+ # @param [Hash] options the custom Guard options
15
+ def initialize(watchers = [], options = {})
16
+ super
17
+ @options = {
18
+ :source => nil,
19
+ :destination => nil,
20
+ :user => nil,
21
+ :remote_address => nil,
22
+ :ssh => false,
23
+ :cli_options => nil,
24
+ :archive => true,
25
+ :recursive => true,
26
+ :verbose => true,
27
+ :delete => true,
28
+ :include => nil,
29
+ :include_from => nil,
30
+ :exclude => nil,
31
+ :exclude_from => ".rsync-filter",
32
+ :progress => true,
33
+ :sync_on_start => false,
34
+ :dry_run => false,
35
+ :cvs_exclude => true,
36
+ :password_file => nil
37
+ }.merge(options)
38
+
39
+ @source = Source.new(options[:source])
40
+ @destination = Source.new(options[:destination])
41
+ @command = Command.new(@source, @destination, @options)
42
+
43
+ end
44
+
45
+ # Call once when Guard starts. Please override initialize method to init stuff.
46
+ # @raise [:task_has_failed] when start has failed
47
+ def start
48
+ throw([:task_has_failed], "Guard::RsyncX options invalid") unless options_valid?
49
+ UI.info "Guard::RsyncX started in source directory '#{File.expand_path @source.directory}'"
50
+ Notifier.notify("Guard::RsyncX is running in directory #{File.expand_path @source.directory}", notifier_options)
51
+ @command.sync if options[:sync_on_start] && @command.test
52
+
53
+ end
54
+
55
+ # Called when `stop|quit|exit|s|q|e + enter` is pressed (when Guard quits).
56
+ # @raise [:task_has_failed] when stop has failed
57
+
58
+ def stop
59
+ UI.info "Guard::RsyncX stopped."
60
+ Notifier.notify("Guard::RsyncX stopped.",notifier_options)
61
+ end
62
+
63
+ # Called when `reload|r|z + enter` is pressed.
64
+ # This method should be mainly used for "reload" (really!) actions like reloading passenger/spork/bundler/...
65
+ # @raise [:task_has_failed] when reload has failed
66
+ def reload
67
+ Notifier.notify("Manual Guard::RsyncX synchronize #{File.expand_path @source.directory} to #{@destination.directory}",notifier_options)
68
+ @command.sync
69
+ end
70
+
71
+ # Called when just `enter` is pressed
72
+ # This method should be principally used for long action like running all specs/tests/...
73
+ # @raise [:task_has_failed] when run_all has failed
74
+ def run_all
75
+ Notifier.notify("Manual Guard::RsyncX synchronize #{@source.directory} to #{@destination.directory}",notifier_options)
76
+ @command.sync
77
+ end
78
+
79
+ # Called on file(s) modifications that the Guard watches.
80
+ # @param [Array<String>] paths the changes files or paths
81
+ # @raise [:task_has_failed] when run_on_change has failed
82
+ def run_on_changes(paths)
83
+ #paths.each do |p| ::Guard::UI.info("Files effect : #{p}") end
84
+ @command.sync
85
+ end
86
+
87
+ # Called on file(s) deletions that the Guard watches.
88
+ # @param [Array<String>] paths the deleted files or paths
89
+ # @raise [:task_has_failed] when run_on_removals has failed
90
+ def run_on_removals(paths)
91
+ @command.sync
92
+ end
93
+
94
+ # Called on file(s) additions that the Guard watches.
95
+ # @param [Array<String>] paths the added files or paths
96
+ # @raise [:task_has_failed] when run_on_additions has failed
97
+ def run_on_additions(paths)
98
+ @command.sync
99
+ end
100
+
101
+ private
102
+
103
+ def options_valid?
104
+ valid = true
105
+ if options[:source].nil? && options[:cli_options].nil?
106
+ UI.error("Guard::RsyncX a source directory is required")
107
+ valid = false
108
+ end
109
+ if options[:destination].nil? && options[:cli_options].nil?
110
+ UI.error("Guard::RsyncX a source directory is required")
111
+ valid = false
112
+ end
113
+ valid
114
+ end
115
+
116
+ def notifier_options
117
+ {:title => "Guard::RsyncX", :image => :success}
118
+ end
119
+
120
+ end
121
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guard-remote-sync
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Patrick McJury
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-08-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: guard
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 1.1.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 1.1.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.2.2
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2.2
62
+ - !ruby/object:Gem::Dependency
63
+ name: guard-rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ description: Guard::RemoteSync to automatically rsync your files.
79
+ email:
80
+ - pmcjury@mcjent.com
81
+ executables: []
82
+ extensions: []
83
+ extra_rdoc_files: []
84
+ files:
85
+ - lib/guard/remote-sync/command.rb
86
+ - lib/guard/remote-sync/source.rb
87
+ - lib/guard/remote-sync/templates/Guardfile
88
+ - lib/guard/remote-sync/version.rb
89
+ - lib/guard/remote-sync.rb
90
+ - LICENSE
91
+ - README.md
92
+ homepage: https://github.com/pmcjury/guard-remote-sync
93
+ licenses: []
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ! '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.3.6
110
+ requirements: []
111
+ rubyforge_project: guard-remote-synch
112
+ rubygems_version: 1.8.24
113
+ signing_key:
114
+ specification_version: 3
115
+ summary: Guard gem for Remote Syncing through rsync
116
+ test_files: []