entangler 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3fce99ceae57ea4c4ffcde6dda904c6bb030f98e
4
- data.tar.gz: 9a9d36b04315449753ab3752053330e9e6f2e10f
3
+ metadata.gz: e3ef95e28e08db3d7ba05137821bfdf2ac9e0b45
4
+ data.tar.gz: 63c508ce43601ee0911e9027671ace3ec89e39cc
5
5
  SHA512:
6
- metadata.gz: a2315af430ac4814b443e51ee0ae7433531475ccffeb283680c1604515b7e5dd41a17871fb1a9a72062fcc04a3568dd1c33caf8270828eec392dd5ce8d910c0c
7
- data.tar.gz: 583b0a09e0abc0a211e020292e5a2eb2a149f12786d84f74ca1b05a412db212fef05081736d32273829f9f7e44a9e114ee16156b97ec0e8e39f3a5cc881a1152
6
+ metadata.gz: 4a78ef9e6108412dd28877afc9bfd423286d6ee4c61a83c63363311664bcac9cb9f50552ee4f44d70069d8a89adba3605f0e619505d6128c2c56087f6e767805
7
+ data.tar.gz: 89c9a6bb2c136167f29ff94783cc78f6e307b3987ae67d63629e8ce70f040ea277f83a2d299add9ce6c2103c457b4f4dbbd352801febd7dfff31531ccad30110
data/README.md CHANGED
@@ -15,19 +15,32 @@ $ gem install entangler
15
15
 
16
16
  ```shell
17
17
  entangler master /some/base/path user@remote:/some/remote/path
18
+ ```
18
19
 
20
+ ```
19
21
  entangler -h
22
+ Entangler v0.3.0
23
+
20
24
  Usage:
21
25
  entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
22
26
  entangler slave <base_dir> [options]
23
27
 
24
28
  Options:
29
+ -i, --ignore '/.git' Ignore folder when syncing, string is regex if surrounded by '/'
30
+ All folders should be relative to the base sync directory, but should start with a '/'.
25
31
  -p, --port PORT Overwrite the SSH port (usually 22)
26
32
  (doesn't do anything in slave mode)
27
33
  -v, --version Show version number
28
34
  -h, --help Show this message
29
35
  ```
30
36
 
37
+ ### Ignoring folders
38
+
39
+ If you specify string, instead of regex, it will match any folder path starting with that string, i.e. `-i '/.git'` will ignore the `.git` folder and all its sub-directories.
40
+ If you want to just ignore the the `.git` sub-directories but not the content in the git folder, you can use `-i '/^\/\.git\/[^\/]*/'` which will match any path starting with `/.git/`, but not `/.git` itself.
41
+
42
+ You can specify multiple `-i` or `--ignore` flags to ignore multiple directories.
43
+
31
44
  ## Development
32
45
 
33
46
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
data/entangler.gemspec CHANGED
@@ -23,4 +23,5 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
  spec.add_dependency "lib_ruby_diff", "~> 0.1"
26
+ spec.add_dependency "to_regexp", "~> 0.2"
26
27
  end
data/exe/entangler CHANGED
@@ -1,14 +1,25 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'entangler'
3
3
  require 'optparse'
4
+ require 'to_regexp'
4
5
 
5
6
  options = {}
6
7
  OptionParser.new do |opts|
7
- opts.banner = "Usage:\n entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]\n entangler slave <base_dir> [options]"
8
+ opts.banner = %Q(Entangler v#{Entangler::VERSION}
9
+
10
+ Usage:
11
+ entangler master <base_dir> <remote_user>@<remote_host>:<remote_base_dir> [options]
12
+ entangler slave <base_dir> [options])
8
13
 
9
14
  opts.separator ""
10
15
  opts.separator "Options:"
11
16
 
17
+ opts.on("-i", "--ignore '/.git'", "Ignore folder when syncing, string is regex if surrounded by '/'",
18
+ "All folders should be relative to the base sync directory, but should start with a '/'.") do |ignore|
19
+ options[:ignore] ||= []
20
+ options[:ignore] << ignore
21
+ end
22
+
12
23
  opts.on("-p", "--port PORT", "Overwrite the SSH port (usually 22)", "(doesn't do anything in slave mode)") do |port|
13
24
  options[:port] = port
14
25
  end
@@ -62,4 +73,10 @@ else
62
73
  opts = {mode: 'slave'}
63
74
  end
64
75
 
76
+ if options[:ignore]
77
+ opts[:ignore] = options[:ignore].map do |opt|
78
+ opt.to_regexp(detect: true)
79
+ end
80
+ end
81
+
65
82
  Entangler.run(base_dir, opts)
@@ -5,7 +5,8 @@ module Entangler
5
5
  protected
6
6
  def start_remote_slave
7
7
  require 'open3'
8
- @remote_writer, @remote_reader, remote_err, @remote_thread = Open3.popen3("ssh -q #{@opts[:remote_user]}@#{@opts[:remote_host]} -p #{@opts[:remote_port]} -C \"source ~/.rvm/environments/default && entangler slave #{@opts[:remote_base_dir]}\"")
8
+ ignore_opts = @opts[:ignore].map{|regexp| "-i '#{regexp.inspect}'"}.join(' ')
9
+ @remote_writer, @remote_reader, remote_err, @remote_thread = Open3.popen3("ssh -q #{@opts[:remote_user]}@#{@opts[:remote_host]} -p #{@opts[:remote_port]} -C \"source ~/.rvm/environments/default && entangler slave #{@opts[:remote_base_dir]} #{ignore_opts}\"")
9
10
  remote_err.close
10
11
  end
11
12
 
@@ -16,7 +16,9 @@ module Entangler
16
16
  @notify_sleep = 0
17
17
  @exported_at = 0
18
18
  @opts = opts
19
- @opts[:ignore] = [/^\/\.git.*/, /^\/\.entangler.*/, /^\/\.idea.*/, /^\/log.*/, /^\/tmp.*/] unless @opts.has_key?(:ignore)
19
+ @opts[:ignore] = [/^\/\.git.*/] unless @opts.has_key?(:ignore)
20
+ @opts[:ignore] << /^\/\.entangler.*/
21
+
20
22
  validate_opts
21
23
  logger.info("Starting executor")
22
24
  end
@@ -28,7 +28,13 @@ module Entangler
28
28
 
29
29
  def perform_initial_rsync
30
30
  logger.info 'Running initial sync'
31
- IO.popen("rsync -azv --exclude .git --exclude log --exclude .entangler --exclude tmp -e \"ssh -p #{@opts[:remote_port]}\" --delete #{base_dir}/ #{@opts[:remote_user]}@#{@opts[:remote_host]}:#{@opts[:remote_base_dir]}/").each do |line|
31
+ all_folders = Dir.glob("#{base_dir}/**/*/", File::FNM_DOTMATCH).tap{|a| a.shift(1) }.find_all{|path| !path.end_with?("/./")}
32
+ all_ignore_matches = all_folders.map{|path| @opts[:ignore].map{|regexp| regexp.match("/#{path[0..-2]}")}.compact.first}.compact
33
+ exclude_folders = all_ignore_matches.map{|match| match[0]}.uniq.map{|path| path[1..-1]}
34
+ exclude_args = exclude_folders.map{|path| "--exclude #{path}"}.join(' ')
35
+ rsync_cmd = "rsync -azv #{exclude_args} -e \"ssh -p #{@opts[:remote_port]}\" --delete #{base_dir}/ #{@opts[:remote_user]}@#{@opts[:remote_host]}:#{@opts[:remote_base_dir]}/"
36
+
37
+ IO.popen(rsync_cmd).each do |line|
32
38
  logger.debug line.chomp
33
39
  end
34
40
  logger.debug 'Initial sync complete'
@@ -1,3 +1,3 @@
1
1
  module Entangler
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
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: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Allie
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0.1'
69
+ - !ruby/object:Gem::Dependency
70
+ name: to_regexp
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.2'
69
83
  description: Two way file syncer using platform native notify and rdiff syncing.
70
84
  email:
71
85
  - dave@daveallie.com