lib/gitdocs/server.rb in gitdocs-0.4.15 vs lib/gitdocs/server.rb in gitdocs-0.5.0.pre1

- old
+ new

@@ -2,35 +2,37 @@ require 'renee' require 'coderay' require 'uri' require 'haml' require 'mimetype_fu' +require 'launchy' module Gitdocs class Server - def initialize(manager, *gitdocs) + def initialize(manager, port = 8888, *gitdocs) @manager = manager + @port = port.to_i @gitdocs = gitdocs end - def start(port = 8888) - gds = @gitdocs + def start + gds = @gitdocs manager = @manager Thin::Logging.debug = @manager.debug - Thin::Server.start('127.0.0.1', port) do - use Rack::Static, :urls => ['/css', '/js', '/img', '/doc'], :root => File.expand_path("../public", __FILE__) + Thin::Server.start('127.0.0.1', @port) do + use Rack::Static, urls: ['/css', '/js', '/img', '/doc'], root: File.expand_path('../public', __FILE__) use Rack::MethodOverride run Renee { if request.path_info == '/' if manager.config.shares.size == 1 - redirect! "/0" + redirect! '/0' else - render! "home", :layout => 'app', :locals => {:conf => manager.config, :nav_state => "home" } + render! 'home', layout: 'app', locals: { conf: manager.config, nav_state: 'home' } end else path 'settings' do - get.render! 'settings', :layout => 'app', :locals => {:conf => manager.config, :nav_state => "settings" } + get.render! 'settings', layout: 'app', locals: { conf: manager.config, nav_state: 'settings' } post do shares = manager.config.shares manager.config.global.update_attributes(request.POST['config']) request.POST['share'].each do |idx, share| if remote_branch = share.delete('remote_branch') @@ -45,11 +47,11 @@ redirect! '/settings' end end path('search').get do - render! "search", :layout => 'app', :locals => {:conf => manager.config, :results => manager.search(request.GET['q']), :nav_state => nil} + render! 'search', layout: 'app', locals: { conf: manager.config, results: manager.search(request.GET['q']), nav_state: nil } end path('shares') do post do Configuration::Share.create @@ -68,80 +70,102 @@ var :int do |idx| gd = gds[idx] halt 404 if gd.nil? file_path = URI.unescape(request.path_info) - file_ext = File.extname(file_path) expanded_path = File.expand_path(".#{file_path}", gd.root) - message_file = File.expand_path(".gitmessage~", gd.root) + message_file = File.expand_path('.gitmessage~', gd.root) halt 400 unless expanded_path[/^#{Regexp.quote(gd.root)}/] parent = File.dirname(file_path) parent = '' if parent == '/' parent = nil if parent == '.' - locals = {:idx => idx, :parent => parent, :root => gd.root, :file_path => expanded_path, :nav_state => nil } + locals = { idx: idx, parent: parent, root: gd.root, file_path: expanded_path, nav_state: nil } mime = File.mime_type?(File.open(expanded_path)) if File.file?(expanded_path) mode = request.params['mode'] if mode == 'meta' # Meta halt 200, { 'Content-Type' => 'application/json' }, [gd.file_meta(file_path).to_json] elsif mode == 'save' # Saving File.open(expanded_path, 'w') { |f| f.print request.params['data'] } File.open(message_file, 'w') { |f| f.print request.params['message'] } unless request.params['message'] == '' - redirect! "/" + idx.to_s + file_path + redirect! '/' + idx.to_s + file_path elsif mode == 'upload' # Uploading halt 404 unless file = request.params['file'] tempfile, filename = file[:tempfile], file[:filename] FileUtils.mv(tempfile.path, File.expand_path(filename, expanded_path)) - redirect! "/" + idx.to_s + file_path + "/" + filename + redirect! '/' + idx.to_s + file_path + '/' + filename elsif !File.exist?(expanded_path) && !request.params['dir'] # edit for non-existent file FileUtils.mkdir_p(File.dirname(expanded_path)) FileUtils.touch(expanded_path) - redirect! "/" + idx.to_s + file_path + "?mode=edit" + redirect! '/' + idx.to_s + file_path + '?mode=edit' elsif !File.exist?(expanded_path) && request.params['dir'] # create directory FileUtils.mkdir_p(expanded_path) - redirect! "/" + idx.to_s + file_path + redirect! '/' + idx.to_s + file_path elsif File.directory?(expanded_path) # list directory contents = gd.dir_files(expanded_path) rendered_readme = nil - if readme = Dir[File.expand_path("README.{md,txt}", expanded_path)].first + if readme = Dir[File.expand_path('README.{md}', expanded_path)].first rendered_readme = '<h3>' + File.basename(readme) + '</h3><div class="tilt">' + render(readme) + '</div>' end - render! "dir", :layout => 'app', :locals => locals.merge(:contents => contents, :rendered_readme => rendered_readme) - elsif mode == "revisions" # list revisions + render! 'dir', layout: 'app', locals: locals.merge(contents: contents, rendered_readme: rendered_readme) + elsif mode == 'revisions' # list revisions revisions = gd.file_revisions(file_path) - render! "revisions", :layout => 'app', :locals => locals.merge(:revisions => revisions) - elsif mode == "revert" # revert file + render! 'revisions', layout: 'app', locals: locals.merge(revisions: revisions) + elsif mode == 'revert' # revert file if revision = request.params['revision'] File.open(message_file, 'w') { |f| f.print "Reverting '#{file_path}' to #{revision}" } gd.file_revert(file_path, revision) end - redirect! "/" + idx.to_s + file_path + redirect! '/' + idx.to_s + file_path elsif mode == 'delete' # delete file FileUtils.rm(expanded_path) - redirect! "/" + idx.to_s + parent + redirect! '/' + idx.to_s + parent elsif mode == 'edit' && (mime.match(%r{text/}) || mime.match(%r{x-empty})) # edit file contents = File.read(expanded_path) - render! "edit", :layout => 'app', :locals => locals.merge(:contents => contents) + render! 'edit', layout: 'app', locals: locals.merge(contents: contents) elsif mode != 'raw' # render file revision = request.params['revision'] expanded_path = gd.file_revision_at(file_path, revision) if revision begin # attempting to render file contents = '<div class="tilt">' + render(expanded_path) + '</div>' - rescue RuntimeError => e # not tilt supported + rescue RuntimeError # not tilt supported contents = if mime.match(%r{text/}) '<pre class="CodeRay">' + CodeRay.scan_file(expanded_path).encode(:html) + '</pre>' else %|<embed class="inline-file" src="/#{idx}#{request.path_info}?mode=raw"></embed>| end end - render! "file", :layout => 'app', :locals => locals.merge(:contents => contents) + render! 'file', layout: 'app', locals: locals.merge(contents: contents) else # other file run! Rack::File.new(gd.root) end end end }.setup { - views_path File.expand_path("../views", __FILE__) + views_path File.expand_path('../views', __FILE__) } end + end + + def wait_for_start_and_open(restarting) + wait_for_web_server = proc do + i = 0 + begin + TCPSocket.open('127.0.0.1', @port).close + @manager.log('Web server running!') + if !restarting && @manager.config.global.load_browser_on_startup + Launchy.open("http://localhost:#{@port}/") + end + rescue Errno::ECONNREFUSED + sleep 0.2 + i += 1 + if i <= 20 + @manager.log('Retrying web server loop...') + retry + else + @manager.log('Web server failed to start') + end + end + end + EM.defer(wait_for_web_server) end end end