git-fyncy 0.6.2 → 0.7.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/bin/git-fyncy +1 -1
- data/lib/git-fyncy/logger.rb +11 -0
- data/lib/git-fyncy/remote.rb +16 -9
- data/lib/git-fyncy/repo.rb +18 -13
- data/lib/git-fyncy/synchronizer.rb +23 -8
- data/lib/git-fyncy/version.rb +1 -1
- data/lib/git-fyncy.rb +32 -6
- metadata +11 -5
data/bin/git-fyncy
CHANGED
data/lib/git-fyncy/remote.rb
CHANGED
@@ -4,25 +4,32 @@ module GitFyncy
|
|
4
4
|
class Remote
|
5
5
|
include Utils
|
6
6
|
|
7
|
-
def initialize(remote, path, rsync_args)
|
7
|
+
def initialize(logger, remote, path, rsync_args)
|
8
|
+
@logger = logger
|
8
9
|
@remote = remote
|
9
10
|
@path = slashify path
|
10
11
|
@rsync_flags = rsync_args.join(" ")
|
12
|
+
|
13
|
+
# COMMANDS
|
14
|
+
@rm_cmd = "cd #{@path}; rm -f %{paths}"
|
15
|
+
@rm_cmd = "ssh #{@remote} '#{@rm_cmd}'" if @remote
|
16
|
+
path = @remote ? "#{@remote}:#{@path}" : @path
|
17
|
+
@rsync_cmd = "rsync -zpR --checksum #{@rsync_flags} %{paths} #{path}"
|
11
18
|
end
|
12
19
|
|
13
|
-
def command(cmd)
|
14
|
-
|
20
|
+
def command(cmd, paths)
|
21
|
+
return if paths.empty?
|
22
|
+
cmd = cmd % {paths: paths.to_a.join(' ')}
|
23
|
+
@logger.log cmd
|
15
24
|
system cmd
|
16
25
|
end
|
17
26
|
|
18
|
-
def
|
19
|
-
|
20
|
-
command "rsync -zpR --checksum #{@rsync_flags} #{paths.to_a.join ' '} #{@remote}:#{@path}"
|
27
|
+
def rsync(paths)
|
28
|
+
command @rsync_cmd, paths
|
21
29
|
end
|
22
30
|
|
23
|
-
def
|
24
|
-
|
25
|
-
command "ssh #{@remote} 'cd #{@path}; rm -f #{paths.to_a.join ' '}'"
|
31
|
+
def rm(paths)
|
32
|
+
command @rm_cmd, paths
|
26
33
|
end
|
27
34
|
end
|
28
35
|
end
|
data/lib/git-fyncy/repo.rb
CHANGED
@@ -15,13 +15,13 @@ module GitFyncy
|
|
15
15
|
end
|
16
16
|
|
17
17
|
module ClassMethods
|
18
|
-
|
18
|
+
GIT_CONFIG.each do |name, key|
|
19
19
|
define_method("#{name}_from_config") do
|
20
|
-
get_stdout_str "git config --get #{
|
20
|
+
get_stdout_str "git config --get #{key}"
|
21
21
|
end
|
22
22
|
|
23
23
|
define_method("configure_fyncy_#{name}") do |val|
|
24
|
-
system "git config --add #{
|
24
|
+
system "git config --add #{key} '#{val}'"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
@@ -46,6 +46,11 @@ module GitFyncy
|
|
46
46
|
|
47
47
|
def self.host_and_path_from_url(url)
|
48
48
|
md = SSH_URL_REGEX.match url
|
49
|
+
user = nil
|
50
|
+
host = nil
|
51
|
+
remote = nil
|
52
|
+
path = url
|
53
|
+
|
49
54
|
if md
|
50
55
|
user = md[1]
|
51
56
|
host = md[2]
|
@@ -56,15 +61,15 @@ module GitFyncy
|
|
56
61
|
path = md[4]
|
57
62
|
else
|
58
63
|
md = SCP_REGEX.match url
|
59
|
-
|
60
|
-
|
64
|
+
if md
|
65
|
+
user = md[1]
|
66
|
+
host = md[2]
|
67
|
+
path = slashify remove_trailing_git md[3]
|
61
68
|
end
|
62
|
-
user = md[1]
|
63
|
-
host = md[2]
|
64
|
-
path = slashify remove_trailing_git md[3]
|
65
69
|
end
|
66
70
|
|
67
|
-
|
71
|
+
remote = "#{user}#{host}" if user && host
|
72
|
+
[remote, path]
|
68
73
|
end
|
69
74
|
|
70
75
|
def self.host_and_path_for_remote(remote_name)
|
@@ -77,14 +82,14 @@ module GitFyncy
|
|
77
82
|
prompt = <<-EOS
|
78
83
|
No remote configured. git fyncy looks under the fyncy section of your git
|
79
84
|
config for a remote name or a url (i.e. at fyncy.remote and fyncy.url). If a
|
80
|
-
remote name is specified, that remote's url be used with
|
81
|
-
removed.
|
85
|
+
remote name is specified, that remote's url will be used with the ".git" suffix
|
86
|
+
removed if it exists.
|
82
87
|
|
83
88
|
Enter a remote name to use (or press return to use #{DEFAULT_REMOTE}):
|
84
89
|
EOS
|
85
90
|
print prompt.chomp
|
86
91
|
|
87
|
-
remote_name = gets.chomp
|
92
|
+
remote_name = STDIN.gets.chomp
|
88
93
|
remote_name = DEFAULT_REMOTE if remote_name.empty?
|
89
94
|
if remote_defined?(remote_name)
|
90
95
|
puts
|
@@ -105,7 +110,7 @@ EOS
|
|
105
110
|
return host_and_path_from_url url if url
|
106
111
|
|
107
112
|
remote_name = remote_name_from_config
|
108
|
-
remote_name = prompt_user_for_remote_name
|
113
|
+
remote_name = prompt_user_for_remote_name if STDIN.tty? && !remote_name
|
109
114
|
res = nil
|
110
115
|
res = host_and_path_for_remote remote_name if remote_name
|
111
116
|
res = host_and_path_for_remote DEFAULT_REMOTE unless res
|
@@ -1,24 +1,30 @@
|
|
1
1
|
require 'git-fyncy/utils'
|
2
2
|
require 'git-fyncy/repo'
|
3
3
|
require 'git-fyncy/remote'
|
4
|
+
require 'git-fyncy/logger'
|
4
5
|
require 'listen'
|
5
6
|
|
6
7
|
module GitFyncy
|
7
8
|
class Synchronizer
|
8
9
|
include Utils
|
9
10
|
|
10
|
-
def initialize(extra_rsync_args)
|
11
|
+
def initialize(background, extra_rsync_args)
|
11
12
|
remote, path = Repo.host_and_path_from_current_repo
|
12
|
-
pexit 'A remote and path must be specified' unless
|
13
|
-
@
|
13
|
+
pexit 'A remote and path must be specified' unless path
|
14
|
+
@background = background
|
15
|
+
@logger = Logger.new background
|
16
|
+
@remote = Remote.new @logger, remote, path, extra_rsync_args
|
14
17
|
end
|
15
18
|
|
16
19
|
def sync
|
17
|
-
@remote.
|
20
|
+
@remote.rsync Repo.git_aware_files
|
18
21
|
end
|
19
22
|
|
23
|
+
# Listen to file changes, forking to the background first if background is
|
24
|
+
# true.
|
20
25
|
def listen
|
21
|
-
|
26
|
+
daemonize if @background
|
27
|
+
@logger.log "GIT FYNCY: Listening @ #{Time.now.ctime}"
|
22
28
|
relpath = method :relative_path
|
23
29
|
files_to_remove = Set.new
|
24
30
|
begin
|
@@ -27,20 +33,29 @@ module GitFyncy
|
|
27
33
|
self.sync
|
28
34
|
rel_removed = removed.map(&relpath)
|
29
35
|
files_to_remove.merge rel_removed
|
30
|
-
files_to_remove.clear if @remote.
|
36
|
+
files_to_remove.clear if @remote.rm files_to_remove
|
31
37
|
rescue => e
|
32
|
-
|
38
|
+
@logger.log e.inspect
|
33
39
|
end
|
34
40
|
end
|
35
41
|
rescue SignalException
|
36
42
|
exit 42
|
37
43
|
ensure
|
38
|
-
|
44
|
+
@logger.log "\n"
|
39
45
|
end
|
40
46
|
end
|
41
47
|
|
42
48
|
private
|
43
49
|
|
50
|
+
def daemonize
|
51
|
+
pid = fork
|
52
|
+
if pid # parent
|
53
|
+
File.write ".git-fyncy-pid", pid
|
54
|
+
Process.detach pid
|
55
|
+
exit 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
44
59
|
def relative_path(path)
|
45
60
|
path.slice! slashify(Dir.pwd)
|
46
61
|
path
|
data/lib/git-fyncy/version.rb
CHANGED
data/lib/git-fyncy.rb
CHANGED
@@ -1,23 +1,49 @@
|
|
1
1
|
require "git-fyncy/version"
|
2
|
-
require
|
2
|
+
require 'git-fyncy/synchronizer'
|
3
3
|
require 'listen'
|
4
4
|
|
5
5
|
module GitFyncy
|
6
6
|
extend Utils
|
7
|
+
PID_FNAME = ".git-fyncy-pid".freeze
|
7
8
|
|
8
|
-
def self.
|
9
|
-
|
9
|
+
def self.already_running?
|
10
|
+
File.exists? PID_FNAME
|
11
|
+
end
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
+
def self.kill
|
14
|
+
if already_running?
|
15
|
+
pid = File.read(PID_FNAME).to_i
|
16
|
+
if Process.kill "TERM", pid
|
17
|
+
File.delete PID_FNAME
|
18
|
+
else
|
19
|
+
pexit "Failed to kill process with id #{pid}"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
pexit "No process to kill. No #{PID_FNAME} file."
|
13
23
|
end
|
24
|
+
end
|
25
|
+
|
26
|
+
FLAGS = %w(--fork --kill).to_set.freeze
|
27
|
+
def self.main(args)
|
28
|
+
working_dir = `git rev-parse --show-toplevel`.chomp
|
29
|
+
|
30
|
+
pexit 'Must be in a git repository' if working_dir.empty?
|
14
31
|
|
15
32
|
Dir.chdir working_dir
|
33
|
+
return kill if args.include? "--kill"
|
34
|
+
if already_running?
|
35
|
+
pexit "#{PID_FNAME} exists. Is git fyncy already running?"
|
36
|
+
end
|
16
37
|
|
17
|
-
|
38
|
+
rsync_args = args.reject { |arg| FLAGS.include? arg }
|
39
|
+
# Listen in the background if one of the args was '--fork'.
|
40
|
+
background = args.include? "--fork"
|
41
|
+
|
42
|
+
synchronizer = Synchronizer.new background, rsync_args
|
18
43
|
unless synchronizer.sync
|
19
44
|
pexit "\nGIT FYNCY: First remote command failed, exiting"
|
20
45
|
end
|
46
|
+
|
21
47
|
synchronizer.listen
|
22
48
|
end
|
23
49
|
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.7.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: 2015-
|
12
|
+
date: 2015-03-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: listen
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,12 @@ dependencies:
|
|
21
21
|
version: '1.3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
25
30
|
description: The funky git aware syncer.
|
26
31
|
email:
|
27
32
|
- ryan@ryanmcg.com
|
@@ -39,6 +44,7 @@ files:
|
|
39
44
|
- bin/git-fyncy
|
40
45
|
- git-fyncy.gemspec
|
41
46
|
- lib/git-fyncy.rb
|
47
|
+
- lib/git-fyncy/logger.rb
|
42
48
|
- lib/git-fyncy/remote.rb
|
43
49
|
- lib/git-fyncy/repo.rb
|
44
50
|
- lib/git-fyncy/synchronizer.rb
|
@@ -65,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
71
|
version: '0'
|
66
72
|
requirements: []
|
67
73
|
rubyforge_project:
|
68
|
-
rubygems_version: 1.8.
|
74
|
+
rubygems_version: 1.8.25
|
69
75
|
signing_key:
|
70
76
|
specification_version: 3
|
71
77
|
summary: Want to sync the working directories of your git directory with a remote
|