git-fyncy 0.3.4 → 0.5.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.
- data/lib/git-fyncy/remote.rb +28 -0
- data/lib/git-fyncy/repo.rb +97 -0
- data/lib/git-fyncy/synchronizer.rb +49 -0
- data/lib/git-fyncy/utils.rb +12 -0
- data/lib/git-fyncy/version.rb +1 -1
- data/lib/git-fyncy.rb +7 -61
- metadata +9 -16
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'git-fyncy/utils'
|
2
|
+
|
3
|
+
module GitFyncy
|
4
|
+
class Remote
|
5
|
+
include Utils
|
6
|
+
|
7
|
+
def initialize(remote, path, rsync_args)
|
8
|
+
@remote = remote
|
9
|
+
@path = slashify path
|
10
|
+
@rsync_flags = rsync_args.join(" ")
|
11
|
+
end
|
12
|
+
|
13
|
+
def command(cmd)
|
14
|
+
puts cmd.length < 80 ? cmd : cmd[0...77] + '...'
|
15
|
+
system cmd
|
16
|
+
end
|
17
|
+
|
18
|
+
def scp(paths, rsync_args=[])
|
19
|
+
return if paths.empty?
|
20
|
+
command "rsync -zpR --checksum #{@rsync_flags} #{paths.to_a.join ' '} #{@remote}:#{@path}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def ssh_rm(paths)
|
24
|
+
return if paths.empty?
|
25
|
+
command "ssh #{@remote} 'cd #{@path}; rm -f #{paths.to_a.join ' '}'"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'git-fyncy/utils'
|
2
|
+
|
3
|
+
module GitFyncy
|
4
|
+
module Repo
|
5
|
+
extend Utils
|
6
|
+
GIT_CONFIG_NAME = "fyncy.remote"
|
7
|
+
DEFAULT_REMOTE = "origin".freeze
|
8
|
+
|
9
|
+
|
10
|
+
def self.get_stdout_str(cmd)
|
11
|
+
out = `#{cmd}`.chomp
|
12
|
+
out.empty? ? nil : out
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.fyncy_remote_name_from_config
|
16
|
+
get_stdout_str "git config --get #{GIT_CONFIG_NAME}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.configure_fyncy_remote(remote_name)
|
20
|
+
system "git config --add #{GIT_CONFIG_NAME} '#{remote_name}'"
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.lookup_remote_url(remote_name)
|
24
|
+
get_stdout_str "git config --get remote.#{remote_name}.url"
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.remote_defined?(remote_name)
|
28
|
+
system "git config --get remote.#{remote_name}.url"
|
29
|
+
end
|
30
|
+
|
31
|
+
TRAILING_GIT_REGEX = %r{^(.*)(s\.git/?$)}.freeze
|
32
|
+
def self.remove_trailing_git(str)
|
33
|
+
md = TRAILING_GIT_REGEX.match str
|
34
|
+
md ? md[1] : str
|
35
|
+
end
|
36
|
+
|
37
|
+
SSH_URL_REGEX = %r{ssh://(\w+@)?([\w\.]+)(:\d+)?([/\w\.]*)$}.freeze
|
38
|
+
SCP_REGEX = /^(\w+@)?([\.\w]+):(.*)$/.freeze
|
39
|
+
|
40
|
+
def self.host_and_path_for_remote(remote_name)
|
41
|
+
url = lookup_remote_url remote_name
|
42
|
+
return unless url
|
43
|
+
|
44
|
+
md = SSH_URL_REGEX.match url
|
45
|
+
if md
|
46
|
+
user = md[1]
|
47
|
+
host = md[2]
|
48
|
+
port = md[3]
|
49
|
+
if port && port[1..-1].to_i != 22
|
50
|
+
STDERR.puts "WARNING: git-fyncy does not currently support port numbers in remote names. Yeah, it is lame. Sorry. Please contribute to fix this!"
|
51
|
+
end
|
52
|
+
path = md[4]
|
53
|
+
else
|
54
|
+
md = SCP_REGEX.match url
|
55
|
+
unless md
|
56
|
+
pexit "Could not determine host and path from url (#{url}). To work with git-fyncy, the remote's url should be an ssh (i.e. start with \"ssh://\") or scp (i.e. USER@HOST:PATH) style url."
|
57
|
+
end
|
58
|
+
user = md[1]
|
59
|
+
host = md[2]
|
60
|
+
path = slashify remove_trailing_git md[3]
|
61
|
+
end
|
62
|
+
|
63
|
+
["#{user}#{host}", path]
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.prompt_user_for_remote_name
|
67
|
+
print "No remote specified for git fyncy. Enter the name of the remote to use (or press return to use the default, #{DEFAULT_REMOTE}):"
|
68
|
+
remote_name = gets.chomp
|
69
|
+
remote_name = DEFAULT_REMOTE if remote_name.empty?
|
70
|
+
if remote_defined?(remote_name)
|
71
|
+
puts
|
72
|
+
else
|
73
|
+
pexit "A remote by the name of #{remote_name} is not defined in this repo."
|
74
|
+
end
|
75
|
+
|
76
|
+
if configure_fyncy_remote remote_name
|
77
|
+
remote_name
|
78
|
+
else
|
79
|
+
pexit "Failed to set #{GIT_CONFIG_NAME} to #{remote_name}. Perhaps there was a permissions error?"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.host_and_path_from_current_repo
|
84
|
+
# Determine remote fyncy should use
|
85
|
+
remote_name = fyncy_remote_name_from_config
|
86
|
+
remote_name = prompt_user_for_remote_name unless remote_name
|
87
|
+
res = nil
|
88
|
+
res = host_and_path_for_remote remote_name if remote_name
|
89
|
+
res = host_and_path_for_remote DEFAULT_REMOTE unless res
|
90
|
+
res
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.git_aware_files
|
94
|
+
`git ls-files -cmo --exclude-standard`.split("\n")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'git-fyncy/utils'
|
2
|
+
require 'git-fyncy/repo'
|
3
|
+
require 'git-fyncy/remote'
|
4
|
+
require 'listen'
|
5
|
+
|
6
|
+
module GitFyncy
|
7
|
+
class Synchronizer
|
8
|
+
include Utils
|
9
|
+
|
10
|
+
def initialize(extra_rsync_args)
|
11
|
+
remote, path = Repo.host_and_path_from_current_repo
|
12
|
+
pexit 'A remote and path must be specified' unless remote && path
|
13
|
+
@remote = Remote.new remote, path, extra_rsync_args
|
14
|
+
end
|
15
|
+
|
16
|
+
def sync
|
17
|
+
@remote.scp Repo.git_aware_files
|
18
|
+
end
|
19
|
+
|
20
|
+
def listen
|
21
|
+
puts "GIT FYNCY: Listening @ #{Time.now.ctime}"
|
22
|
+
relpath = method :relative_path
|
23
|
+
files_to_remove = Set.new
|
24
|
+
begin
|
25
|
+
Listen.to!('.') do |modified, added, removed|
|
26
|
+
begin
|
27
|
+
self.sync
|
28
|
+
rel_removed = removed.map(&relpath)
|
29
|
+
files_to_remove.merge rel_removed
|
30
|
+
files_to_remove.clear if @remote.ssh_rm files_to_remove
|
31
|
+
rescue => e
|
32
|
+
puts e.inspect
|
33
|
+
end
|
34
|
+
end
|
35
|
+
rescue SignalException
|
36
|
+
exit 42
|
37
|
+
ensure
|
38
|
+
puts "\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def relative_path(path)
|
45
|
+
path.slice! slashify(Dir.pwd)
|
46
|
+
path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/git-fyncy/version.rb
CHANGED
data/lib/git-fyncy.rb
CHANGED
@@ -1,72 +1,18 @@
|
|
1
1
|
require "git-fyncy/version"
|
2
|
+
require "git-fyncy/synchronizer"
|
2
3
|
require 'listen'
|
3
4
|
|
4
5
|
module GitFyncy
|
5
|
-
|
6
|
-
path[-1] == '/' ? path : path + '/'
|
7
|
-
end
|
8
|
-
|
9
|
-
class Remote
|
10
|
-
def initialize(remote, path)
|
11
|
-
@remote = remote
|
12
|
-
@path = GitFyncy.slashify path
|
13
|
-
end
|
14
|
-
|
15
|
-
def command(cmd)
|
16
|
-
puts cmd.length < 80 ? cmd : cmd[0...77] + '...'
|
17
|
-
system cmd
|
18
|
-
end
|
19
|
-
|
20
|
-
def scp(paths)
|
21
|
-
return if paths.empty?
|
22
|
-
command "rsync -zpR #{paths.to_a.join ' '} #{@remote}:#{@path}"
|
23
|
-
end
|
24
|
-
|
25
|
-
def ssh_rm(paths)
|
26
|
-
return if paths.empty?
|
27
|
-
command "ssh #{@remote} 'cd #{@path}; rm -f #{paths.to_a.join ' '}'"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.relative_path(path)
|
32
|
-
path.slice! GitFyncy.slashify(Dir.pwd)
|
33
|
-
path
|
34
|
-
end
|
35
|
-
|
36
|
-
def self.git_aware_files
|
37
|
-
`git ls-files -cmo --exclude-standard`.split("\n")
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.pexit(error)
|
41
|
-
puts error
|
42
|
-
exit 1
|
43
|
-
end
|
6
|
+
extend Utils
|
44
7
|
|
45
|
-
def self.main(
|
8
|
+
def self.main(*extra_rsync_args)
|
46
9
|
working_dir ||= Dir.pwd
|
47
10
|
Dir.chdir working_dir
|
48
|
-
pexit 'A remote and path must be specified' unless remote && path
|
49
|
-
remote = Remote.new remote, path
|
50
|
-
remote.scp git_aware_files
|
51
|
-
relpath = method :relative_path
|
52
11
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
Listen.to!('.') do |modified, added, removed|
|
57
|
-
begin
|
58
|
-
remote.scp git_aware_files
|
59
|
-
rel_removed = removed.map(&relpath)
|
60
|
-
files_to_remove.merge rel_removed
|
61
|
-
files_to_remove.clear if remote.ssh_rm files_to_remove
|
62
|
-
rescue => e
|
63
|
-
puts e.inspect
|
64
|
-
end
|
65
|
-
end
|
66
|
-
rescue SignalException
|
67
|
-
exit 42
|
68
|
-
ensure
|
69
|
-
puts "\n"
|
12
|
+
synchronizer = Synchronizer.new extra_rsync_args
|
13
|
+
unless synchronizer.sync
|
14
|
+
pexit "\nGIT FYNCY: First remote command failed, exiting"
|
70
15
|
end
|
16
|
+
synchronizer.listen
|
71
17
|
end
|
72
18
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-fyncy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2014-11-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: listen
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirement: &21773540 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,12 +21,7 @@ dependencies:
|
|
21
21
|
version: '1.3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.3'
|
24
|
+
version_requirements: *21773540
|
30
25
|
description: The funky git aware syncer.
|
31
26
|
email:
|
32
27
|
- ryan@ryanmcg.com
|
@@ -44,6 +39,10 @@ files:
|
|
44
39
|
- bin/git-fyncy
|
45
40
|
- git-fyncy.gemspec
|
46
41
|
- lib/git-fyncy.rb
|
42
|
+
- lib/git-fyncy/remote.rb
|
43
|
+
- lib/git-fyncy/repo.rb
|
44
|
+
- lib/git-fyncy/synchronizer.rb
|
45
|
+
- lib/git-fyncy/utils.rb
|
47
46
|
- lib/git-fyncy/version.rb
|
48
47
|
homepage: https://github.com/RyanMcG/git-fyncy
|
49
48
|
licenses:
|
@@ -58,21 +57,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
58
57
|
- - ! '>='
|
59
58
|
- !ruby/object:Gem::Version
|
60
59
|
version: '0'
|
61
|
-
segments:
|
62
|
-
- 0
|
63
|
-
hash: -1348310610279710193
|
64
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
61
|
none: false
|
66
62
|
requirements:
|
67
63
|
- - ! '>='
|
68
64
|
- !ruby/object:Gem::Version
|
69
65
|
version: '0'
|
70
|
-
segments:
|
71
|
-
- 0
|
72
|
-
hash: -1348310610279710193
|
73
66
|
requirements: []
|
74
67
|
rubyforge_project:
|
75
|
-
rubygems_version: 1.8.
|
68
|
+
rubygems_version: 1.8.11
|
76
69
|
signing_key:
|
77
70
|
specification_version: 3
|
78
71
|
summary: Want to sync the working directories of your git directory with a remote
|