forked from chad/gitjour
/
gitjour
77 lines (64 loc) · 2.32 KB
/
gitjour
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env ruby
require 'rubygems'
require 'dnssd'
require 'set'
require 'cooloptions'
Thread.abort_on_exception = true
GitService = Struct.new(:name, :host, :port, :description)
def service_list(looking_for = nil)
wait_seconds = 5
service_list = Set.new
waiting_thread = Thread.new { sleep wait_seconds }
service = DNSSD.browse "_git._tcp" do |reply|
DNSSD.resolve reply.name, reply.type, reply.domain do |resolve_reply|
service_list << GitService.new(reply.name, resolve_reply.target, resolve_reply.port, resolve_reply.text_record['description'])
if looking_for && reply.name == looking_for
waiting_thread.kill
end
end
end
puts "Gathering for up to #{wait_seconds} seconds..."
waiting_thread.join
service.stop
service_list
end
COMMANDS = {
'list' => 'Lists available repositories.',
'clone' => 'Clone a gitjour served repository.',
'serve' => 'Serve up the current directory via gitjour.'
}
options = CoolOptions.parse!("[options] command [name]") do |o|
o.desc 'Serve up and use git repositories via Bonjour/DNSSD.'
o.desc "\n"
o.desc "Commands:"
COMMANDS.each do |c, help|
o.desc " #{c.ljust(5)} #{help}"
end
o.desc "\n"
o.desc "Options:"
o.on 'port PORT', "Pass to serve to serve on a different port.", 9148
o.after do |result|
(result.command = ARGV.shift) || o.error("Command is required.")
o.error("Unknown command.") if !COMMANDS.keys.include?(result.command)
result.name = ARGV.shift
o.error("Name is required.") if result.command == "clone" && !result.name
end
end
case options.command
when "list"
service_list.each do |service|
puts "#{service.name} on #{service.host}: gitjour clone #{service.name}"
end
when "clone"
name_of_share = options.name
service = service_list(options.name).detect{|service| service.name == options.name}
system("git clone git://#{service.host}:#{service.port}/ #{options.name}")
when "serve"
name = options.name || File.basename(Dir.pwd)
tr = DNSSD::TextRecord.new
tr['description'] = File.read(".git/description") rescue "a git project"
DNSSD.register(name, "_git._tcp", 'local', options.port.to_i, tr.encode) do |register_reply|
p register_reply
end
`git-daemon --verbose --export-all --base-path=#{Dir.pwd} --port=#{options.port}`
end