entangler 1.1.1 → 1.2.2
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 +5 -5
- data/Gemfile +2 -0
- data/README.md +3 -2
- data/entangler.gemspec +12 -7
- data/exe/entangler +3 -3
- data/lib/entangler/entangled_file.rb +2 -0
- data/lib/entangler/errors.rb +2 -0
- data/lib/entangler/executor/background/base.rb +8 -3
- data/lib/entangler/executor/background/master.rb +3 -1
- data/lib/entangler/executor/base.rb +3 -2
- data/lib/entangler/executor/helpers.rb +2 -0
- data/lib/entangler/executor/master.rb +3 -1
- data/lib/entangler/executor/slave.rb +8 -6
- data/lib/entangler/executor/validation/base.rb +2 -0
- data/lib/entangler/executor/validation/master.rb +7 -0
- data/lib/entangler/logger.rb +3 -1
- data/lib/entangler/version.rb +3 -1
- data/lib/entangler.rb +2 -0
- metadata +48 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: a4f98e12ff87f2be01e5370bc2142b4bed7154535481d33a95c6f43591e47de4
|
4
|
+
data.tar.gz: 27868bae2c5fd085b4f28466e26934d57c84d37ed1f70aeb44899636fd39e14c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d02e37d871284a999f90a0f93e94a4235317c4adb5d3a222e6c53187d8c2503e32af6aabc3118e95700df768c745e6924ee53672c47f956698b80a52513e6b1
|
7
|
+
data.tar.gz: ebeccb202a07a95e63160aca13d08e3533a5e92470b7d3b1c14ead7acd405f6a4a6d82b4ee3f7c8d1a7fc60b46bbc8ff5b099f8eabbeca80aaa531e1ce4a9f4d
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
<p align="center" style="width: 50px;"><img src="https://vignette1.wikia.nocookie.net/pokemon/images/e/ef/114Tangela_Dream.png/revision/latest/scale-to-width-down/185?cb=20141203054028"/></p>
|
2
|
+
<h1 align="center">Entangler</h1>
|
2
3
|
|
3
4
|
[](https://travis-ci.org/daveallie/entangler)
|
4
5
|
|
@@ -18,7 +19,7 @@ $ entangler master /some/base/path user@remote:/some/remote/path
|
|
18
19
|
|
19
20
|
```
|
20
21
|
$ entangler -h
|
21
|
-
Entangler v1.
|
22
|
+
Entangler v1.2.2
|
22
23
|
|
23
24
|
Usage:
|
24
25
|
entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
|
data/entangler.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'entangler/version'
|
4
6
|
|
@@ -18,11 +20,14 @@ Gem::Specification.new do |spec|
|
|
18
20
|
spec.bindir = 'exe'
|
19
21
|
spec.executables = ['entangler']
|
20
22
|
spec.require_paths = ['lib']
|
23
|
+
spec.required_ruby_version = '>= 2.5'
|
21
24
|
|
22
|
-
spec.add_development_dependency 'bundler', '
|
23
|
-
spec.add_development_dependency 'rake', '
|
24
|
-
spec.add_development_dependency 'rspec', '
|
25
|
-
spec.add_development_dependency 'rubocop', '~>
|
26
|
-
spec.
|
27
|
-
spec.
|
25
|
+
spec.add_development_dependency 'bundler', '>= 2.1'
|
26
|
+
spec.add_development_dependency 'rake', '>= 13.0.1'
|
27
|
+
spec.add_development_dependency 'rspec', '>= 3.9'
|
28
|
+
spec.add_development_dependency 'rubocop', '~> 1.6'
|
29
|
+
spec.add_development_dependency 'rubocop-rake', '~> 0.5.1'
|
30
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.0'
|
31
|
+
spec.add_dependency 'listen', '~> 3.7'
|
32
|
+
spec.add_dependency 'to_regexp', '~> 0.2.1'
|
28
33
|
end
|
data/exe/entangler
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
2
4
|
require 'entangler'
|
3
5
|
require 'optparse'
|
4
6
|
require 'to_regexp'
|
@@ -99,9 +101,7 @@ end
|
|
99
101
|
|
100
102
|
if options[:ignore]
|
101
103
|
opts[:ignore] = options[:ignore].map do |opt|
|
102
|
-
if opt.start_with?('"') && opt.end_with?('"') || opt.start_with?("'") && opt.end_with?("'")
|
103
|
-
opt = opt[1..-2]
|
104
|
-
end
|
104
|
+
opt = opt[1..-2] if opt.start_with?('"') && opt.end_with?('"') || opt.start_with?("'") && opt.end_with?("'")
|
105
105
|
|
106
106
|
if ToRegexp::String.literal? opt
|
107
107
|
source, *rest = opt.as_regexp(detect: true)
|
data/lib/entangler/errors.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'listen'
|
2
4
|
require 'entangler/entangled_file'
|
3
5
|
require 'benchmark'
|
@@ -56,6 +58,7 @@ module Entangler
|
|
56
58
|
def remove_recently_changed_files(entangled_files)
|
57
59
|
@recently_received_paths.select! { |_, time| Time.now.to_f < time + 0.5 }
|
58
60
|
paths = @recently_received_paths.map(&:first)
|
61
|
+
logger.debug("Skipping paths #{paths.join(', ')} as they have changed recently") if paths.any?
|
59
62
|
entangled_files.reject { |ef| paths.include?(ef.path) }
|
60
63
|
end
|
61
64
|
|
@@ -75,6 +78,7 @@ module Entangler
|
|
75
78
|
def process_remote_changes(changes)
|
76
79
|
with_listener_pause(1) do
|
77
80
|
return if changes.nil?
|
81
|
+
|
78
82
|
logger.info("Processing - #{changes.length} remote changes")
|
79
83
|
logger.debug("File List:\n#{changes.map(&:path).join("\n")}")
|
80
84
|
with_log_time("Completed - #{changes.length} remote changes") do
|
@@ -97,9 +101,9 @@ module Entangler
|
|
97
101
|
|
98
102
|
def with_kill_threads_rescue
|
99
103
|
yield
|
100
|
-
rescue => e
|
101
|
-
|
102
|
-
|
104
|
+
rescue StandardError => e
|
105
|
+
warn e.message
|
106
|
+
warn e.backtrace.join("\n")
|
103
107
|
kill_off_threads
|
104
108
|
end
|
105
109
|
|
@@ -107,6 +111,7 @@ module Entangler
|
|
107
111
|
@listener_pauses[idx] = true
|
108
112
|
listener.pause
|
109
113
|
yield
|
114
|
+
ensure
|
110
115
|
@listener_pauses[idx] = false
|
111
116
|
listener.start if @listener_pauses.none?
|
112
117
|
end
|
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'logger'
|
2
4
|
require 'fileutils'
|
3
|
-
require 'thread'
|
4
5
|
require_relative 'background/base'
|
5
6
|
require_relative 'validation/base'
|
6
7
|
|
@@ -52,7 +53,7 @@ module Entangler
|
|
52
53
|
end
|
53
54
|
|
54
55
|
def logger
|
55
|
-
@logger ||= Entangler::Logger.new(log_outputs, @opts[:verbose])
|
56
|
+
@logger ||= Entangler::Logger.new(log_outputs, verbose: @opts[:verbose])
|
56
57
|
end
|
57
58
|
|
58
59
|
def log_outputs
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'helpers'
|
2
4
|
require_relative 'background/master'
|
3
5
|
require_relative 'validation/master'
|
@@ -21,7 +23,7 @@ module Entangler
|
|
21
23
|
|
22
24
|
def log_outputs
|
23
25
|
outs = [Entangler::Logger.log_file_path(base_dir)]
|
24
|
-
outs <<
|
26
|
+
outs << $stdout unless @opts[:quiet]
|
25
27
|
end
|
26
28
|
|
27
29
|
def perform_initial_rsync
|
@@ -1,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Entangler
|
2
4
|
module Executor
|
3
5
|
class Slave < Base
|
4
6
|
def initialize(base_dir, opts = {})
|
5
7
|
super(base_dir, opts)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
$stdin.binmode
|
9
|
+
$stdout.binmode
|
10
|
+
$stdin.sync = true
|
11
|
+
$stdout.sync = true
|
10
12
|
|
11
|
-
@remote_reader =
|
12
|
-
@remote_writer =
|
13
|
+
@remote_reader = $stdin
|
14
|
+
@remote_writer = $stdout
|
13
15
|
$stderr.reopen(File.join(Entangler::Logger.log_file_path(base_dir, 'entangler.err')), 'w')
|
14
16
|
end
|
15
17
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Entangler
|
2
4
|
module Executor
|
3
5
|
module Validation
|
@@ -21,8 +23,10 @@ module Entangler
|
|
21
23
|
unless File.directory?(@opts[:remote_base_dir])
|
22
24
|
raise Entangler::ValidationError, 'Destination directory is a file'
|
23
25
|
end
|
26
|
+
|
24
27
|
@opts[:remote_base_dir] = File.realpath(File.expand_path(@opts[:remote_base_dir]))
|
25
28
|
return unless @opts[:remote_base_dir] == base_dir
|
29
|
+
|
26
30
|
raise Entangler::ValidationError, "Destination directory can't be the same as the base directory"
|
27
31
|
end
|
28
32
|
|
@@ -31,6 +35,7 @@ module Entangler
|
|
31
35
|
raise Entangler::ValidationError, 'Missing remote base dir' unless keys.include?(:remote_base_dir)
|
32
36
|
raise Entangler::ValidationError, 'Missing remote user' unless keys.include?(:remote_user)
|
33
37
|
raise Entangler::ValidationError, 'Missing remote host' unless keys.include?(:remote_host)
|
38
|
+
|
34
39
|
validate_remote_base_dir
|
35
40
|
validate_remote_entangler_version
|
36
41
|
end
|
@@ -43,10 +48,12 @@ module Entangler
|
|
43
48
|
|
44
49
|
def validate_remote_entangler_version
|
45
50
|
return unless @opts[:remote_mode]
|
51
|
+
|
46
52
|
res = `#{generate_ssh_command('source ~/.rvm/environments/default && entangler --version')}`
|
47
53
|
remote_version = Gem::Version.new(res.strip)
|
48
54
|
local_version = Gem::Version.new(Entangler::VERSION)
|
49
55
|
return unless major_version_mismatch?(local_version, remote_version)
|
56
|
+
|
50
57
|
msg = 'Entangler version too far apart, please update either local or remote Entangler.' \
|
51
58
|
" Local version is #{local_version} and remote version is #{remote_version}."
|
52
59
|
raise Entangler::VersionMismatchError, msg
|
data/lib/entangler/logger.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'logger'
|
3
5
|
|
@@ -11,7 +13,7 @@ module Entangler
|
|
11
13
|
File.join(base_dir, '.entangler', 'log', log_file_name)
|
12
14
|
end
|
13
15
|
|
14
|
-
def initialize(outputs, verbose
|
16
|
+
def initialize(outputs, verbose: false)
|
15
17
|
@loggers = Array(outputs).map do |output|
|
16
18
|
logger = ::Logger.new(output)
|
17
19
|
|
data/lib/entangler/version.rb
CHANGED
data/lib/entangler.rb
CHANGED
metadata
CHANGED
@@ -1,99 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: entangler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dave Allie
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
19
|
+
version: '2.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '2.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 13.0.1
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 13.0.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.9'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.9'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
29
57
|
requirement: !ruby/object:Gem::Requirement
|
30
58
|
requirements:
|
31
59
|
- - "~>"
|
32
60
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
61
|
+
version: '1.6'
|
34
62
|
type: :development
|
35
63
|
prerelease: false
|
36
64
|
version_requirements: !ruby/object:Gem::Requirement
|
37
65
|
requirements:
|
38
66
|
- - "~>"
|
39
67
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
68
|
+
version: '1.6'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
70
|
+
name: rubocop-rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
73
|
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
75
|
+
version: 0.5.1
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
80
|
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
82
|
+
version: 0.5.1
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
|
-
name: rubocop
|
84
|
+
name: rubocop-rspec
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0
|
89
|
+
version: '2.0'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
94
|
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0
|
96
|
+
version: '2.0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: listen
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '3.
|
103
|
+
version: '3.7'
|
76
104
|
type: :runtime
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '3.
|
110
|
+
version: '3.7'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: to_regexp
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
115
|
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: 0.2.
|
117
|
+
version: 0.2.1
|
90
118
|
type: :runtime
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
122
|
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: 0.2.
|
124
|
+
version: 0.2.1
|
97
125
|
description: Two way file syncer using platform native notify.
|
98
126
|
email:
|
99
127
|
- dave@daveallie.com
|
@@ -133,15 +161,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
133
161
|
requirements:
|
134
162
|
- - ">="
|
135
163
|
- !ruby/object:Gem::Version
|
136
|
-
version: '
|
164
|
+
version: '2.5'
|
137
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
138
166
|
requirements:
|
139
167
|
- - ">="
|
140
168
|
- !ruby/object:Gem::Version
|
141
169
|
version: '0'
|
142
170
|
requirements: []
|
143
|
-
|
144
|
-
rubygems_version: 2.6.12
|
171
|
+
rubygems_version: 3.0.3.1
|
145
172
|
signing_key:
|
146
173
|
specification_version: 4
|
147
174
|
summary: Two way file syncer using platform native notify.
|