0
+require 'gitjour/version'
0
Thread.abort_on_exception = true
0
@@ -9,17 +11,16 @@ module Gitjour
0
- @@verbose = options.verbose
0
- serve(
options.name, options.path, options.port)
0
@@ -28,35 +29,73 @@ module Gitjour
0
service_list.each do |service|
0
- puts "=== #{service.name} on #{service.host}
==="
0
+ puts "=== #{service.name} on #{service.host}
:#{service.port} ==="
0
puts " gitjour clone #{service.name}"
0
- puts " #{service.description}" if service.description && service.description != '' && service.description !~ /^Unnamed repository/
0
+ if service.description != '' && service.description !~ /^Unnamed repository/
0
+ puts " #{service.description}"
0
- def get_host_and_share(repository_name)
0
- name_of_share = repository_name || fail("You have to pass in a name")
0
- host = service_list(name_of_share).detect{|service| service.name == name_of_share}.host rescue exit_with!("Couldn't find #{name_of_share}")
0
- system("git clone git://#{host}/ #{name_of_share}/")
0
+ def clone(repository_name, *rest)
0
+ dir = rest.shift || repository_name
0
+ exit_with! "ERROR: Clone directory '#{dir}' already exists."
0
- service = service_list(name).detect{|service| service.name == name} rescue exit_with!("Couldn't find #{name}")
0
- cl("git clone git://#{service.host}:#{service.port}/ #{name}/")
0
+ puts "Cloning '#{repository_name}' into directory '#{dir}'..."
0
+ service = locate_repo repository_name
0
+ puts "Connecting to #{service.host}:#{service.port}"
0
+ system "git clone git://#{service.host}:#{service.port}/ #{dir}/"
0
- def remote(repository_name,*rest)
0
- host, name_of_share = get_host_and_share(repository_name)
0
- system("git remote add #{name_of_share} git://#{host}/")
0
+ def remote(repository_name, *rest)
0
+ dir = rest.shift || repository_name
0
+ service = locate_repo repository_name
0
+ system "git remote add #{dir} git://#{service.host}:#{service.port}/"
0
+ def serve(path=Dir.pwd, *rest)
0
path = File.expand_path(path)
0
- File.exists?("#{path}/.git") ? announce_repo(path, port) : Dir["#{path}/*"].each_with_index{|dir,i| announce_repo(dir, port+i) if File.directory?(dir)}
0
- cl("git-daemon --verbose --export-all --port=#{port} --base-path=#{path} --base-path-relaxed")
0
+ name = rest.shift || File.basename(path)
0
+ port = rest.shift || 9418
0
+ if File.exists?("#{path}/.git")
0
+ announce_repo(path, name, port.to_i)
0
+ Dir["#{path}/*"].each do |dir|
0
+ if File.directory?(dir)
0
+ name = File.basename(dir)
0
+ announce_repo(dir, name, 9418)
0
+ `git-daemon --verbose --export-all --port=#{port} --base-path=#{path} --base-path-relaxed`
0
+ puts "Gitjour #{Gitjour::VERSION::STRING}"
0
+ puts "Serve up and use git repositories via Bonjour/DNSSD."
0
+ puts "\nUsage: gitjour <command> [args]"
0
+ puts " Lists available repositories."
0
+ puts " clone <project> [<directory>]"
0
+ puts " Clone a gitjour served repository."
0
+ puts " serve <path_to_project> [<name_of_project>] [<port>] or"
0
+ puts " <path_to_projects>"
0
+ puts " Serve up the current directory or projects via gitjour."
0
+ puts " remote <project> [<name>]"
0
+ puts " Add a Bonjour remote into your current repository."
0
+ puts " Optionally pass name to not use pwd."
0
def exit_with!(message)
0
@@ -64,43 +103,61 @@ module Gitjour
0
- def service_list(looking_for = nil)
0
+ class Done < RuntimeError; end
0
- service_list = Set.new
0
- waiting_thread = Thread.new { sleep wait_seconds }
0
+ def discover(timeout=5)
0
+ waiting_thread = Thread.current
0
-
service = DNSSD.browse "_git._tcp" do |reply|
0
+
dns = DNSSD.browse "_git._tcp" do |reply|
0
DNSSD.resolve reply.name, reply.type, reply.domain do |resolve_reply|
0
- service_list << GitService.new(reply.name, resolve_reply.target, resolve_reply.port, resolve_reply.text_record['description'])
0
- if looking_for && reply.name == looking_for
0
+ service = GitService.new(reply.name,
0
+ resolve_reply.text_record['description'].to_s)
0
- puts "Gathering for up to #{wait_seconds} seconds..."
0
+ puts "Gathering for up to #{timeout} seconds..."
0
- def announce_repo(name, path, port)
0
- return unless File.exists?("#{path}/.git")
0
- name = share_name || File.basename(path)
0
- tr = DNSSD::TextRecord.new
0
- tr['description'] = File.read(".git/description") rescue "a git project"
0
- DNSSD.register(name, "_git._tcp", 'local', port, tr.encode) do |register_reply|
0
- puts "Registered #{name}. Starting service."
0
+ discover { |obj| list << obj }
0
+ def announce_repo(path, name, port)
0
+ return unless File.exists?("#{path}/.git")
0
+ tr = DNSSD::TextRecord.new
0
+ tr['description'] = File.read("#{path}/.git/description") rescue "a git project"
0
+ DNSSD.register(name, "_git._tcp", 'local', port, tr.encode) do |rr|
0
+ puts "Registered #{name} on port #{port}. Starting service."
Comments
No one has commented yet.