entangler 1.3.2 → 1.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ede22d7fd84575aa02eea914dc7eef35eb35bce727db9b03bbcd25f6b975a30d
4
- data.tar.gz: c71f387c5a1859fc2c2931d4d4acbc5c7251d87491a604d7ac157f8a67b4cef2
3
+ metadata.gz: caeaeab73f12f452f171a80fc4c202f4e3bfcafea5f7c1509057175e6bec0c1f
4
+ data.tar.gz: 950085ffeb8d56d5d5d23163f5024ee09ae173ae5d95dbb5981ee2274e24189d
5
5
  SHA512:
6
- metadata.gz: 34a0de48ff67103ff238d2fae9aad59b90fe86b5999b36b6d73dbe2372b4dc9afc1d47ecbaa6798818d94cc00770a73d16b148c1451d588c4cd136a0ee215844
7
- data.tar.gz: f4f1664744f0b8647cc4f94bbf9cc106879c71950acaddf0a1836a100f74961251604caef3540a44a73d05a1e0ad28836e8e00a3ecc33745a4f82a037c69407b
6
+ metadata.gz: 9ccbc2db0d327844b0a78f52468bb11582d55c53a986ddb7158102017d229448cdb34b7ed4c16449338eb2d00f231b44ff949edebb2b40eaa0fa52d8f896b87c
7
+ data.tar.gz: 6f89e593575e7120bfc897f213219c1174eef54dcdc16c8a5a125cd363fceecd4fc6cd820abca981da4e9d7f1bf974a16cac0e0a2a55217194040094631485b1
data/entangler.gemspec CHANGED
@@ -30,4 +30,5 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency 'rubocop-rspec', '~> 2.0'
31
31
  spec.add_dependency 'listen', '~> 3.7'
32
32
  spec.add_dependency 'to_regexp', '~> 0.2.1'
33
+ spec.metadata['rubygems_mfa_required'] = 'true'
33
34
  end
data/exe/entangler CHANGED
@@ -18,12 +18,15 @@ def value_opt(options, opts, key, *args)
18
18
  end
19
19
 
20
20
  options = {}
21
+ # rubocop:disable Metrics/BlockLength
21
22
  OptionParser.new do |opts|
22
- opts.banner = %(Entangler v#{Entangler::VERSION}
23
+ opts.banner = <<~BANNER
24
+ Entangler v#{Entangler::VERSION}
23
25
 
24
- Usage:
25
- entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
26
- entangler master <base_dir> <other_synced_base_dir> [options])
26
+ Usage:
27
+ entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
28
+ entangler master <base_dir> <other_synced_base_dir> [options]
29
+ BANNER
27
30
 
28
31
  opts.separator ''
29
32
  opts.separator 'Options:'
@@ -36,8 +39,14 @@ Usage:
36
39
 
37
40
  value_opt(options, opts, :port, '-p', '--port PORT', 'Overwrite the SSH port (usually 22)',
38
41
  "(doesn't do anything in slave mode)")
42
+
43
+ bool_opt(options, opts, :force_polling, '--force-polling',
44
+ 'Forces the use of the listen polling adapter (works cross-platform, generally slower)')
45
+
39
46
  bool_opt(options, opts, :no_rvm, '--no-rvm', 'Skip attempting to load RVM on remote')
47
+
40
48
  bool_opt(options, opts, :verbose, '-v', '--verbose', 'Log Debug lines')
49
+
41
50
  bool_opt(options, opts, :quiet, '-q', '--quiet', "Don't log to stdout in master process")
42
51
 
43
52
  opts.on_tail('--version', 'Show version number') do
@@ -50,6 +59,7 @@ Usage:
50
59
  exit
51
60
  end
52
61
  end.parse!
62
+ # rubocop:enable Metrics/BlockLength
53
63
 
54
64
  mode = ARGV.shift
55
65
  unless mode && %w[master slave].include?(mode)
@@ -102,17 +112,18 @@ end
102
112
 
103
113
  if options[:ignore]
104
114
  opts[:ignore] = options[:ignore].map do |opt|
105
- opt = opt[1..-2] if opt.start_with?('"') && opt.end_with?('"') || opt.start_with?("'") && opt.end_with?("'")
115
+ opt = opt[1..-2] if (opt.start_with?('"') && opt.end_with?('"')) || (opt.start_with?("'") && opt.end_with?("'"))
106
116
 
107
117
  if ToRegexp::String.literal? opt
108
118
  source, *rest = opt.as_regexp(detect: true)
109
- ::Regexp.new "^#{source}(?:/[^/]+)*$", *rest
119
+ Regexp.new "^#{source}(?:/[^/]+)*$", *rest
110
120
  else
111
121
  opt.to_regexp(detect: true)
112
122
  end
113
123
  end
114
124
  end
115
125
 
126
+ opts[:force_polling] = options[:force_polling]
116
127
  opts[:no_rvm] = options[:no_rvm]
117
128
  opts[:quiet] = options[:quiet]
118
129
  opts[:verbose] = options[:verbose]
@@ -18,10 +18,6 @@ module Entangler
18
18
  Entangler.executor.generate_abs_path(@path)
19
19
  end
20
20
 
21
- def not_a_directory?
22
- !File.directory?(full_path)
23
- end
24
-
25
21
  def file_exists?
26
22
  File.exist?(full_path)
27
23
  end
@@ -51,7 +47,7 @@ module Entangler
51
47
 
52
48
  def write_contents
53
49
  delete_file if file_exists? && File.directory?(full_path)
54
- File.open(full_path, 'w') { |f| f.write(contents) }
50
+ File.write(full_path, contents)
55
51
  File.utime(File.atime(full_path), desired_modtime, full_path)
56
52
  end
57
53
 
@@ -60,7 +56,7 @@ module Entangler
60
56
  end
61
57
 
62
58
  def marshal_dump
63
- if file_exists? && not_a_directory? && (action == :create || action == :update)
59
+ if file_exists? && (action == :create || action == :update)
64
60
  @desired_modtime = File.mtime(full_path).to_i
65
61
  @contents = File.read(full_path)
66
62
  end
@@ -42,12 +42,12 @@ module Entangler
42
42
  private
43
43
 
44
44
  def listener
45
- @listener ||= begin
46
- Listen::Listener.new(base_dir, ignore!: @opts[:ignore]) do |modified, added, removed|
47
- process_local_changes(generate_entangled_files(added, :create) +
48
- generate_entangled_files(modified, :update) +
49
- generate_entangled_files(removed, :delete))
50
- end
45
+ @listener ||= Listen::Listener.new(base_dir,
46
+ ignore!: @opts[:ignore],
47
+ force_polling: @opts[:force_polling]) do |modified, added, removed|
48
+ process_local_changes(generate_entangled_files(added, :create) +
49
+ generate_entangled_files(modified, :update) +
50
+ generate_entangled_files(removed, :delete))
51
51
  end
52
52
  end
53
53
 
@@ -11,6 +11,9 @@ module Entangler
11
11
  include Entangler::Executor::Background::Base
12
12
  include Entangler::Executor::Validation::Base
13
13
 
14
+ GIT_IGNORE_REGEX = %r{^\.git(?:/[^/]+)*$}.freeze
15
+ ENTANGLER_IGNORE_REGEX = /^\.entangler.*/.freeze
16
+
14
17
  attr_reader :base_dir
15
18
 
16
19
  def initialize(base_dir, opts = {})
@@ -19,8 +22,9 @@ module Entangler
19
22
  @recently_received_paths = []
20
23
  @listener_pauses = [false, false]
21
24
  @opts = opts
22
- @opts[:ignore] = [%r{^\.git(?:/[^/]+)*$}] unless @opts.key?(:ignore)
23
- @opts[:ignore] << /^\.entangler.*/
25
+ @opts[:ignore] = [GIT_IGNORE_REGEX] unless @opts.key?(:ignore)
26
+ @opts[:ignore] << ENTANGLER_IGNORE_REGEX
27
+ @opts[:force_polling] ||= false
24
28
 
25
29
  validate_opts
26
30
  Entangler::Logger.create_log_dir(base_dir)
@@ -56,6 +60,8 @@ module Entangler
56
60
  @logger ||= Entangler::Logger.new(log_outputs, verbose: @opts[:verbose])
57
61
  end
58
62
 
63
+ private
64
+
59
65
  def log_outputs
60
66
  [Entangler::Logger.log_file_path(base_dir)]
61
67
  end
@@ -51,8 +51,8 @@ module Entangler
51
51
 
52
52
  res = `#{generate_ssh_command('entangler --version', source_rvm: true)}`
53
53
  if res.empty?
54
- msg = 'Entangler is not installed on the remote server.' \
55
- ' Install Entangler on the remote server (SSH in, then `gem install entangler`), then try again.'
54
+ msg = 'Entangler is not installed on the remote server. ' \
55
+ 'Install Entangler on the remote server (SSH in, then `gem install entangler`), then try again.'
56
56
  raise Entangler::NotInstalledOnRemoteError, msg
57
57
  end
58
58
 
@@ -60,8 +60,8 @@ module Entangler
60
60
  local_version = Gem::Version.new(Entangler::VERSION)
61
61
  return unless major_version_mismatch?(local_version, remote_version)
62
62
 
63
- msg = 'Entangler version too far apart, please update either local or remote Entangler.' \
64
- " Local version is #{local_version} and remote version is #{remote_version}."
63
+ msg = 'Entangler version too far apart, please update either local or remote Entangler. ' \
64
+ "Local version is #{local_version} and remote version is #{remote_version}."
65
65
  raise Entangler::VersionMismatchError, msg
66
66
  end
67
67
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Entangler
4
- VERSION = '1.3.2'
4
+ VERSION = '1.4.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: entangler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Allie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-08 00:00:00.000000000 Z
11
+ date: 2024-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -152,7 +152,8 @@ files:
152
152
  homepage: https://github.com/daveallie/entangler
153
153
  licenses:
154
154
  - MIT
155
- metadata: {}
155
+ metadata:
156
+ rubygems_mfa_required: 'true'
156
157
  post_install_message:
157
158
  rdoc_options: []
158
159
  require_paths: