class GitObjectBrowser::Server::GitServlet

Constants

SEARCH_PACKED_OBJECT

Public Class Methods

new(server, target) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 9
def initialize(server, target)
  @target = File.expand_path(target)
end

Public Instance Methods

do_GET(request, response) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 13
def do_GET(request, response)
  @params = parse_params(request, response)
  unless @params
    not_found(response)
    return
  end

  unless File.exist?(@params[:abspath])
    not_found unless redirect_to_packed_object
    return
  end

  [:response_directory,
   :response_index,
   :response_object,
   :response_ref,
   :response_reflog,
   :response_packed_object,
   :response_pack_file,
   :response_pack_index,
   :response_info_refs,
   :response_packed_refs,
   :response_file
  ].each { |action| return if send(action) }
end

Private Instance Methods

index_to_pack_path() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 235
def index_to_pack_path
  File.join(@target, @params[:relpath].sub(/\.idx\z/, '.pack'))
end
not_found(response = nil) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 228
def not_found(response = nil)
  response ||= @params[:response]
  response.status = 404
  response['Content-Type'] = 'application/json'
  response.body = '{}'
end
ok(response = nil) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 222
def ok(response = nil)
  response ||= @params[:response]
  response.status = 200
  response['Content-Type'] = 'application/json'
end
pack_to_index_path() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 239
def pack_to_index_path
  File.join(@target, @params[:relpath].sub(/\.pack\z/, '.idx'))
end
parse_params(request, response) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 42
def parse_params(request, response)
  params = { :request => request, :response => response }

  path = request.path
  return nil unless path =~ %r{\A/json/(.+)\.json\z}
  params[:relpath] = $1.to_s

  pack_rex = 'objects/pack/pack-[0-9a-f]{40}'
  if params[:relpath] == '_git'
    params[:relpath] = ''
  elsif params[:relpath] =~ %r{\A(#{ pack_rex }\.pack)/\d{2}/\d{2}/(\d+)\z}
    params[:relpath] = $1
    params[:offset]  = $2.to_i
  elsif params[:relpath] =~ %r{\A(#{ pack_rex }\.idx)\z}
    params[:relpath] = $1
    params[:order]   = 'digest'
  elsif params[:relpath] =~ %r{\A(#{ pack_rex }\.idx)/(sha1|offset)/(\d+)\z}
    params[:relpath] = $1
    params[:order]   = $2
    params[:page]    = $3.to_i
  end
  return nil if params[:relpath] =~ /\.\./

  params[:abspath] = File.join(@target, params[:relpath])

  return params
end
redirect_to_packed_object() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 70
def redirect_to_packed_object
  return false unless SEARCH_PACKED_OBJECT
  return false unless GitObjectBrowser::Models::GitObject.path?(@params[:relpath])
  sha1 = @params[:relpath].gsub(%r{\A.*/([0-9a-f]{2})/([0-9a-f]{38})\z}, '\1\2')

  Dir.chdir(@target) do
    Dir.glob('objects/pack/*.idx') do |path|
      File.open(path) do |input|
        index = GitObjectBrowser::Models::PackIndex.new(input)
        result = index.find(sha1)
        unless result.nil?
          packfile = path.sub(/\.idx\z/, '.pack')
          @params[:response].status = 302
          ostr = "0000#{ result[:offset] }"
          @params[:response]['Location'] = "/json/#{ packfile }/#{ ostr[-2,2] }/#{ ostr[-4,2] }/#{ result[:offset] }.json"
          return true
        end
      end
    end
  end
  false
end
response_directory() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 93
def response_directory
  return false unless File.directory?(@params[:abspath])

  obj = GitObjectBrowser::Models::Directory.new(@target, @params[:relpath])
  response_wrapped_object(obj)
  return true
end
response_file() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 206
def response_file
  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::PlainFile.new(input).parse
  end
  response_wrapped_object(obj)
  return true
end
response_index() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 101
def response_index
  return false unless @params[:relpath] == 'index'

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::Index.new(input).parse
  end
  response_wrapped_object(obj)
  return true
end
response_info_refs() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 184
def response_info_refs
  return false unless GitObjectBrowser::Models::InfoRefs.path?(@params[:relpath])

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::InfoRefs.new(input)
  end
  response_wrapped_object(obj)
  return true
end
response_object() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 112
def response_object
  return false unless GitObjectBrowser::Models::GitObject.path?(@params[:relpath])

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::GitObject.new(input).parse
  end
  response_wrapped_object(obj)
  return true
end
response_pack_file() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 160
def response_pack_file
  return false unless GitObjectBrowser::Models::PackFile.path?(@params[:relpath])
  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::PackFile.new(input).parse
  end
  response_wrapped_object(obj)
  return true
end
response_pack_index() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 145
def response_pack_index
  return false unless GitObjectBrowser::Models::PackIndex.path?(@params[:relpath])
  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::PackIndex.new(input).parse(@params[:order], @params[:page])
  end
  if @params[:order] != 'digest'
    File.open(index_to_pack_path) do |input|
      obj.load_object_types(input)
    end
  end
  response_wrapped_object(obj)
  return true
end
response_packed_object() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 170
def response_packed_object
  return false if @params[:offset].nil?
  return false unless GitObjectBrowser::Models::PackedObject.path?(@params[:relpath])
  obj = {}
  File.open(pack_to_index_path) do |index_input|
    index = GitObjectBrowser::Models::PackIndex.new(index_input)
    File.open(@params[:abspath]) do |input|
      obj = GitObjectBrowser::Models::PackedObject.new(index, input).parse(@params[:offset])
    end
  end
  response_wrapped_object(obj)
  return true
end
response_packed_refs() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 195
def response_packed_refs
  return false unless GitObjectBrowser::Models::PackedRefs.path?(@params[:relpath])

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::PackedRefs.new(input)
  end
  response_wrapped_object(obj)
  return true
end
response_ref() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 123
def response_ref
  return false unless GitObjectBrowser::Models::Ref.path?(@params[:relpath])

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::Ref.new(input)
  end
  response_wrapped_object(obj)
  return true
end
response_reflog() click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 134
def response_reflog
  return false unless GitObjectBrowser::Models::Reflog.path?(@params[:relpath])

  obj = {}
  File.open(@params[:abspath]) do |input|
    obj = GitObjectBrowser::Models::Reflog.new(input).parse
  end
  response_wrapped_object(obj)
  return true
end
response_wrapped_object(obj) click to toggle source
# File lib/git-object-browser/server/git_servlet.rb, line 216
def response_wrapped_object(obj)
  wrapped = GitObjectBrowser::Models::WrappedObject.new(@target, @params[:relpath], obj)
  @params[:response].body = ::JSON.generate(wrapped)
  ok
end