entangler 1.0.0.beta2 → 1.0.0.beta3
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.
- 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
|