synchrotron 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/synchrotron +1 -1
- data/lib/synchrotron/ignore.rb +5 -5
- data/lib/synchrotron/logger.rb +6 -6
- data/lib/synchrotron/version.rb +1 -1
- data/lib/synchrotron.rb +15 -7
- metadata +48 -61
data/bin/synchrotron
CHANGED
@@ -24,7 +24,7 @@ BANNER
|
|
24
24
|
opt :exclude, "Pathname or pattern to exclude", :short => :none, :multi => true, :type => :string
|
25
25
|
opt :exclude_from, "File containing pathnames and patterns to exclude", :short => :none, :multi => true, :type => :string
|
26
26
|
opt :rsync_path, "Path to the rsync binary", :short => :none, :default => '/usr/bin/rsync'
|
27
|
-
opt :verbosity, "Output verbosity: debug, info, warn, error, or fatal", :short => '-V', :default => 'info'
|
27
|
+
opt :verbosity, "Output verbosity: debug, verbose, info, warn, error, or fatal", :short => '-V', :default => 'info'
|
28
28
|
end
|
29
29
|
|
30
30
|
config[:remote_path] = ARGV.shift or abort("Error: Remote path not specified")
|
data/lib/synchrotron/ignore.rb
CHANGED
@@ -4,13 +4,13 @@ module Synchrotron; class Ignore
|
|
4
4
|
REGEX_COMMENT = /#.*$/
|
5
5
|
REGEX_REGEX = /^\s*(%r(.).*\2[imxouesn]*)\s*$/i
|
6
6
|
|
7
|
-
def initialize(list = [])
|
7
|
+
def initialize(list = [], logger)
|
8
8
|
@cache = {}
|
9
9
|
@globs = []
|
10
10
|
@regexes = []
|
11
11
|
|
12
12
|
@list = list.to_a
|
13
|
-
@log =
|
13
|
+
@log = logger
|
14
14
|
|
15
15
|
compile(@list)
|
16
16
|
end
|
@@ -31,7 +31,7 @@ module Synchrotron; class Ignore
|
|
31
31
|
@cache[_path] = match = @globs.any? {|glob| _path =~ glob } ||
|
32
32
|
@regexes.any? {|regex| _path =~ regex }
|
33
33
|
|
34
|
-
@log.
|
34
|
+
@log.verbose "Ignoring #{_path}" if match
|
35
35
|
match
|
36
36
|
end
|
37
37
|
|
@@ -46,7 +46,7 @@ module Synchrotron; class Ignore
|
|
46
46
|
lineno += 1
|
47
47
|
|
48
48
|
# Strip comments.
|
49
|
-
line.sub
|
49
|
+
line = line.sub(REGEX_COMMENT, '')
|
50
50
|
line.strip!
|
51
51
|
|
52
52
|
# Skip empty lines.
|
@@ -66,7 +66,7 @@ module Synchrotron; class Ignore
|
|
66
66
|
|
67
67
|
def glob_to_regex(str)
|
68
68
|
regex = str.gsub(/(.)/) {|c| GLOB_PATTERNS[$1] || Regexp.escape(c) }
|
69
|
-
Regexp.new("#{regex}
|
69
|
+
Regexp.new("#{regex}\\Z")
|
70
70
|
end
|
71
71
|
|
72
72
|
end; end
|
data/lib/synchrotron/logger.rb
CHANGED
@@ -4,12 +4,12 @@ class Logger
|
|
4
4
|
attr_reader :level, :output
|
5
5
|
|
6
6
|
LEVELS = {
|
7
|
-
:fatal
|
8
|
-
:error
|
9
|
-
:warn
|
10
|
-
:info
|
11
|
-
:
|
12
|
-
:
|
7
|
+
:fatal => 0,
|
8
|
+
:error => 1,
|
9
|
+
:warn => 2,
|
10
|
+
:info => 3,
|
11
|
+
:verbose => 4,
|
12
|
+
:debug => 5
|
13
13
|
}
|
14
14
|
|
15
15
|
def initialize(level = :info, output = $stdout)
|
data/lib/synchrotron/version.rb
CHANGED
data/lib/synchrotron.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'find'
|
2
2
|
require 'pathname'
|
3
|
+
require 'thread'
|
3
4
|
|
4
5
|
require 'rb-fsevent'
|
5
6
|
|
@@ -21,19 +22,21 @@ module Synchrotron; class << self
|
|
21
22
|
|
22
23
|
:rsync_options => [
|
23
24
|
'--compress',
|
25
|
+
'--delete',
|
24
26
|
'--human-readable',
|
25
27
|
'--links',
|
28
|
+
'--out-format="--> [%o] %n %L"',
|
29
|
+
'--perms',
|
26
30
|
'--recursive',
|
27
|
-
'--times'
|
28
|
-
'--verbose'
|
31
|
+
'--times'
|
29
32
|
],
|
30
33
|
|
31
34
|
:rsync_path => '/usr/bin/rsync',
|
32
35
|
:verbosity => :info
|
33
36
|
}.merge(config)
|
34
37
|
|
35
|
-
@ignore = Ignore.new(@config[:exclude])
|
36
38
|
@log = Logger.new(@config[:verbosity])
|
39
|
+
@ignore = Ignore.new(@config[:exclude], @log)
|
37
40
|
@regex_rel = Regexp.new("^#{Regexp.escape(@config[:local_path].chomp('/'))}/?")
|
38
41
|
@queue = Queue.new
|
39
42
|
|
@@ -69,13 +72,15 @@ module Synchrotron; class << self
|
|
69
72
|
|
70
73
|
@sync_thread = Thread.new do
|
71
74
|
while changed = @queue.pop do
|
72
|
-
@log.
|
75
|
+
@log.verbose "Change detected"
|
76
|
+
|
77
|
+
changed.each {|path| @log.verbose "--> #{path}" }
|
73
78
|
changed.each {|path| sync(path) if File.exist?(path) }
|
74
79
|
end
|
75
80
|
end
|
76
81
|
|
77
82
|
fsevent = FSEvent.new
|
78
|
-
fsevent.watch(@config[:local_path], {:latency =>
|
83
|
+
fsevent.watch(@config[:local_path], {:latency => 1}) do |paths|
|
79
84
|
changed = coalesce_changes(paths.reject {|path| @ignore.match(path) })
|
80
85
|
@queue << changed unless changed.empty?
|
81
86
|
end
|
@@ -96,8 +101,11 @@ module Synchrotron; class << self
|
|
96
101
|
@config[:exclude].each {|p| rsync_options << " --exclude #{escape_arg(p)}" }
|
97
102
|
@config[:exclude_from].each {|f| rsync_options << " --exclude-from #{escape_arg(f)}"}
|
98
103
|
|
99
|
-
|
100
|
-
|
104
|
+
rsync_cmd = "#{@config[:rsync_path]} #{rsync_options} #{rsync_local} #{rsync_remote}"
|
105
|
+
|
106
|
+
@log.debug rsync_cmd
|
107
|
+
|
108
|
+
`#{rsync_cmd}`.each_line {|line| @log.info line }
|
101
109
|
end
|
102
110
|
|
103
111
|
private
|
metadata
CHANGED
@@ -1,58 +1,55 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: synchrotron
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 0
|
8
|
-
- 2
|
9
|
-
version: 0.0.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Ryan Grove
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-06-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: rb-fsevent
|
22
|
-
|
23
|
-
|
24
|
-
requirements:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
25
19
|
- - ~>
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 0
|
29
|
-
- 9
|
30
|
-
- 1
|
20
|
+
- !ruby/object:Gem::Version
|
31
21
|
version: 0.9.1
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: trollop
|
36
23
|
prerelease: false
|
37
|
-
|
38
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: trollop
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
39
35
|
- - ~>
|
40
|
-
- !ruby/object:Gem::Version
|
41
|
-
|
42
|
-
- 1
|
43
|
-
- 13
|
44
|
-
version: "1.13"
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.13'
|
45
38
|
type: :runtime
|
46
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.13'
|
47
46
|
description:
|
48
47
|
email: ryan@wonko.com
|
49
|
-
executables:
|
48
|
+
executables:
|
50
49
|
- synchrotron
|
51
50
|
extensions: []
|
52
|
-
|
53
51
|
extra_rdoc_files: []
|
54
|
-
|
55
|
-
files:
|
52
|
+
files:
|
56
53
|
- bin/synchrotron
|
57
54
|
- lib/synchrotron/ignore.rb
|
58
55
|
- lib/synchrotron/logger.rb
|
@@ -60,39 +57,29 @@ files:
|
|
60
57
|
- lib/synchrotron/stream.rb
|
61
58
|
- lib/synchrotron/version.rb
|
62
59
|
- lib/synchrotron.rb
|
63
|
-
has_rdoc: true
|
64
60
|
homepage: http://github.com/rgrove/synchrotron/
|
65
61
|
licenses: []
|
66
|
-
|
67
62
|
post_install_message:
|
68
63
|
rdoc_options: []
|
69
|
-
|
70
|
-
require_paths:
|
64
|
+
require_paths:
|
71
65
|
- lib
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
- 1
|
78
|
-
- 8
|
79
|
-
- 7
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ! '>='
|
70
|
+
- !ruby/object:Gem::Version
|
80
71
|
version: 1.8.7
|
81
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
- 1
|
87
|
-
- 2
|
88
|
-
- 0
|
72
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
89
77
|
version: 1.2.0
|
90
78
|
requirements: []
|
91
|
-
|
92
79
|
rubyforge_project:
|
93
|
-
rubygems_version: 1.
|
80
|
+
rubygems_version: 1.8.24
|
94
81
|
signing_key:
|
95
82
|
specification_version: 3
|
96
|
-
summary: Synchrotron monitors a local directory tree and performs nearly instantaneous
|
83
|
+
summary: Synchrotron monitors a local directory tree and performs nearly instantaneous
|
84
|
+
one-way synchronization of changes to a remote directory using rsync.
|
97
85
|
test_files: []
|
98
|
-
|