entangler 1.0.0.beta2 → 1.0.0.beta3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/exe/entangler +5 -2
- data/lib/entangler/errors.rb +5 -0
- data/lib/entangler/executor/background/base.rb +1 -3
- data/lib/entangler/executor/base.rb +10 -5
- data/lib/entangler/executor/master.rb +15 -8
- data/lib/entangler/version.rb +1 -1
- data/lib/entangler.rb +1 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4502e99a42282d8f8c48f7c2cd1097bece8b357
|
4
|
+
data.tar.gz: 291923c77737fa3922341d61124085f23e7ddae9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ef8fc38e33759d2b88e65d4348a6bc60d9f0ae2e9777b7b2e812ae874205401ea2010346bf46375be6680d03eddb1b18483f462da3a4e5a56c6f26fea5e5652
|
7
|
+
data.tar.gz: 7809f15d79a760d0ad1273080ac66c018c2778319ad0d1f744bfe6ed9b5007402a46ca2f7d35e2cfa1bb7cacd578a261b56d297f220854d106013a9242d90f98
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ $ entangler master /some/base/path user@remote:/some/remote/path
|
|
18
18
|
|
19
19
|
```
|
20
20
|
$ entangler -h
|
21
|
-
Entangler v1.0.0.
|
21
|
+
Entangler v1.0.0.beta3
|
22
22
|
|
23
23
|
Usage:
|
24
24
|
entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
|
@@ -38,7 +38,7 @@ Options:
|
|
38
38
|
|
39
39
|
If you specify a string, instead of a regex, it will match any path starting with that string, i.e. `-i '.git'` will ignore the `.git`
|
40
40
|
folder and all its sub-directories. If you want to just ignore the the `.git` sub-directories but not the content in the git folder, you'll
|
41
|
-
have to use regex. `-i '/^\.git(?:\/[^\/]+)
|
41
|
+
have to use regex. `-i '/^\.git(?:\/[^\/]+)+$/'` will match all sub-directories of `.git/`, but not the files in `.git`.
|
42
42
|
|
43
43
|
You can specify multiple `-i` or `--ignore` flags to ignore multiple paths.
|
44
44
|
|
data/exe/entangler
CHANGED
@@ -54,7 +54,10 @@ end
|
|
54
54
|
if mode == 'master'
|
55
55
|
remote_information = ARGV.shift
|
56
56
|
|
57
|
-
|
57
|
+
unless remote_information
|
58
|
+
puts 'Missing destination information'
|
59
|
+
exit 1
|
60
|
+
end
|
58
61
|
|
59
62
|
user = host = path = error = nil
|
60
63
|
remote_mode = false
|
@@ -89,7 +92,7 @@ if options[:ignore]
|
|
89
92
|
opts[:ignore] = options[:ignore].map do |opt|
|
90
93
|
if ToRegexp::String.literal? opt
|
91
94
|
source, *rest = opt.as_regexp(detect: true)
|
92
|
-
::Regexp.new "^#{source}(?:/[^/]+)
|
95
|
+
::Regexp.new "^#{source}(?:/[^/]+)*$", *rest
|
93
96
|
else
|
94
97
|
opt.to_regexp(detect: true)
|
95
98
|
end
|
@@ -40,13 +40,11 @@ module Entangler
|
|
40
40
|
|
41
41
|
def listener
|
42
42
|
@listener ||= begin
|
43
|
-
|
43
|
+
Listen::Listener.new(base_dir, ignore!: @opts[:ignore]) do |modified, added, removed|
|
44
44
|
process_local_changes(generate_entangled_files(added, :create) +
|
45
45
|
generate_entangled_files(modified, :update) +
|
46
46
|
generate_entangled_files(removed, :delete))
|
47
47
|
end
|
48
|
-
l.ignore!(@opts[:ignore])
|
49
|
-
l
|
50
48
|
end
|
51
49
|
end
|
52
50
|
|
@@ -11,15 +11,15 @@ module Entangler
|
|
11
11
|
attr_reader :base_dir
|
12
12
|
|
13
13
|
def initialize(base_dir, opts = {})
|
14
|
+
validate_base_dir(base_dir)
|
14
15
|
@base_dir = File.realpath(File.expand_path(base_dir))
|
15
16
|
@recently_received_paths = []
|
16
17
|
@listener_pauses = [false, false]
|
17
18
|
@opts = opts
|
18
|
-
@opts[:ignore] = [
|
19
|
+
@opts[:ignore] = [%r{^\.git(?:/[^/]+)*$}] unless @opts.key?(:ignore)
|
19
20
|
@opts[:ignore] << /^\.entangler.*/
|
20
21
|
|
21
22
|
validate_opts
|
22
|
-
logger.info('Starting executor')
|
23
23
|
end
|
24
24
|
|
25
25
|
def generate_abs_path(rel_path)
|
@@ -31,19 +31,19 @@ module Entangler
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def run
|
34
|
+
logger.info('Starting executor')
|
34
35
|
start_listener
|
35
36
|
start_remote_io
|
36
37
|
Signal.trap('INT') { kill_off_threads }
|
37
38
|
wait_for_threads
|
38
39
|
ensure
|
39
40
|
stop_listener
|
41
|
+
logger.info('Stopping entangler')
|
40
42
|
end
|
41
43
|
|
42
44
|
protected
|
43
45
|
|
44
|
-
def validate_opts
|
45
|
-
raise "Base directory doesn't exist" unless Dir.exist?(base_dir)
|
46
|
-
end
|
46
|
+
def validate_opts; end
|
47
47
|
|
48
48
|
def send_to_remote(msg = {})
|
49
49
|
Marshal.dump(msg, @remote_writer)
|
@@ -61,6 +61,11 @@ module Entangler
|
|
61
61
|
def log_dir
|
62
62
|
File.join(base_dir, '.entangler', 'log')
|
63
63
|
end
|
64
|
+
|
65
|
+
def validate_base_dir(base_dir)
|
66
|
+
raise Entangler::ValidationError, "Base directory doesn't exist" unless File.exist?(base_dir)
|
67
|
+
raise Entangler::ValidationError, 'Base directory is a file' unless File.directory?(base_dir)
|
68
|
+
end
|
64
69
|
end
|
65
70
|
end
|
66
71
|
end
|
@@ -27,24 +27,30 @@ module Entangler
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def validate_local_opts
|
30
|
+
unless File.exist?(@opts[:remote_base_dir])
|
31
|
+
raise Entangler::ValidationError, "Destination directory doesn't exist"
|
32
|
+
end
|
33
|
+
unless File.directory?(@opts[:remote_base_dir])
|
34
|
+
raise Entangler::ValidationError, 'Destination directory is a file'
|
35
|
+
end
|
30
36
|
@opts[:remote_base_dir] = File.realpath(File.expand_path(@opts[:remote_base_dir]))
|
31
|
-
|
32
|
-
raise "Destination directory
|
37
|
+
return unless @opts[:remote_base_dir] == base_dir
|
38
|
+
raise Entangler::ValidationError, "Destination directory can't be the same as the base directory"
|
33
39
|
end
|
34
40
|
|
35
41
|
def validate_remote_opts
|
36
42
|
keys = @opts.keys
|
37
|
-
raise 'Missing remote base dir' unless keys.include?(:remote_base_dir)
|
38
|
-
raise 'Missing remote user' unless keys.include?(:remote_user)
|
39
|
-
raise 'Missing remote host' unless keys.include?(:remote_host)
|
43
|
+
raise Entangler::ValidationError, 'Missing remote base dir' unless keys.include?(:remote_base_dir)
|
44
|
+
raise Entangler::ValidationError, 'Missing remote user' unless keys.include?(:remote_user)
|
45
|
+
raise Entangler::ValidationError, 'Missing remote host' unless keys.include?(:remote_host)
|
40
46
|
validate_remote_base_dir
|
41
47
|
validate_remote_entangler_version
|
42
48
|
end
|
43
49
|
|
44
50
|
def validate_remote_base_dir
|
45
51
|
res = `#{generate_ssh_command("[[ -d '#{@opts[:remote_base_dir]}' ]] && echo 'ok' || echo 'missing'")}`
|
46
|
-
raise 'Cannot connect to remote' if res.empty?
|
47
|
-
raise 'Remote base dir invalid' unless res.strip == 'ok'
|
52
|
+
raise Entangler::ValidationError, 'Cannot connect to remote' if res.empty?
|
53
|
+
raise Entangler::ValidationError, 'Remote base dir invalid' unless res.strip == 'ok'
|
48
54
|
end
|
49
55
|
|
50
56
|
def validate_remote_entangler_version
|
@@ -53,8 +59,9 @@ module Entangler
|
|
53
59
|
remote_version = Gem::Version.new(res.strip)
|
54
60
|
local_version = Gem::Version.new(Entangler::VERSION)
|
55
61
|
return unless major_version_mismatch?(local_version, remote_version)
|
56
|
-
|
62
|
+
msg = 'Entangler version too far apart, please update either local or remote Entangler.' \
|
57
63
|
" Local version is #{local_version} and remote version is #{remote_version}."
|
64
|
+
raise Entangler::VersionMismatchError, msg
|
58
65
|
end
|
59
66
|
|
60
67
|
def major_version_mismatch?(version1, version2)
|
data/lib/entangler/version.rb
CHANGED
data/lib/entangler.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: entangler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Allie
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- exe/entangler
|
118
118
|
- lib/entangler.rb
|
119
119
|
- lib/entangler/entangled_file.rb
|
120
|
+
- lib/entangler/errors.rb
|
120
121
|
- lib/entangler/executor/background/base.rb
|
121
122
|
- lib/entangler/executor/background/master.rb
|
122
123
|
- lib/entangler/executor/base.rb
|