./lib/dolt/sinatra/actions.rb in dolt-0.27.0 vs ./lib/dolt/sinatra/actions.rb in dolt-0.28.0
- old
+ new
@@ -16,178 +16,39 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#++
require "json"
require "time"
require "cgi"
+require "libdolt/controller_actions"
module Dolt
module Sinatra
class Actions
def initialize(app, lookup, renderer)
@app = app
- @lookup = lookup
- @renderer = renderer
+ @dolt = Dolt::ControllerActions.new(app, lookup, renderer)
end
- def redirect(url, status = 302)
- app.response.status = status
- app.response["Location"] = url
- app.body("")
+ def respond_to?(method)
+ dolt.respond_to?(method)
end
- def render_error(error, repo, ref, data = {})
- $stderr.puts(error.message)
- $stderr.puts(error.backtrace)
-
- if error.class.to_s == "Rugged::ReferenceError" && ref == "HEAD"
- return app.body(renderer.render("empty", {
- :repository => repo,
- :ref => ref
- }.merge(data)))
+ def method_missing(method, *args, &block)
+ if dolt.respond_to?(method)
+ return respond(dolt.send(method, *args, &block))
end
- template = error.class.to_s == "Rugged::IndexerError" ? :"404" : :"500"
- add_headers(app.response)
- app.body(renderer.render(template, {
- :error => error,
- :repository_slug => repo,
- :ref => ref
- }.merge(data)))
- rescue Exception => err
- err_backtrace = err.backtrace.map { |s| "<li>#{s}</li>" }
- error_backtrace = error.backtrace.map { |s| "<li>#{s}</li>" }
-
- app.body(<<-HTML)
- <h1>Fatal Dolt Error</h1>
- <p>
- Dolt encountered an exception, and additionally
- triggered another exception trying to render the error.
- </p>
- <p>Tried to render the #{template} template with the following data:</p>
- <dl>
- <dt>Repository</dt>
- <dd>#{repo}</dd>
- <dt>Ref</dt>
- <dd>#{ref}</dd>
- </dl>
- <h2>Error: #{err.class} #{err.message}</h2>
- <ul>#{err_backtrace.join()}</ul>
- <h2>Original error: #{error.class} #{error.message}</h2>
- <ul>#{error_backtrace.join()}</ul>
- HTML
+ super
end
- def raw(repo, ref, path, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.raw_url(repo, oid, path), 307) and return
- end
-
- blob(repo, ref, path, custom_data, {
- :template => :raw,
- :content_type => "text/plain",
- :template_options => { :layout => nil }
- })
- end
-
- def blob(repo, ref, path, custom_data = {}, options = { :template => :blob })
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.blob_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.blob(repo, u(ref), path))
- blob = data[:blob]
- return redirect(app.tree_url(repo, ref, path)) if blob.class.to_s !~ /\bBlob/
- add_headers(app.response, options.merge(:ref => ref))
- tpl_options = options[:template_options] || {}
- app.body(renderer.render(options[:template], data, tpl_options))
- end
-
- def tree(repo, ref, path, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.tree_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.tree(repo, u(ref), path))
- tree = data[:tree]
- return redirect(app.blob_url(repo, ref, path)) if tree.class.to_s !~ /\bTree/
- add_headers(app.response, :ref => ref)
- app.body(renderer.render(:tree, data))
- end
-
- def tree_entry(repo, ref, path, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.tree_entry_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.tree_entry(repo, u(ref), path))
- add_headers(app.response, :ref => ref)
- app.body(renderer.render(data.key?(:tree) ? :tree : :blob, data))
- end
-
- def blame(repo, ref, path, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.blame_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.blame(repo, u(ref), path))
- add_headers(app.response, :ref => ref)
- app.body(renderer.render(:blame, data))
- end
-
- def history(repo, ref, path, count, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.history_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.history(repo, u(ref), path, count))
- add_headers(app.response, :ref => ref)
- app.body(renderer.render(:commits, data))
- end
-
- def refs(repo, custom_data = {})
- data = (custom_data || {}).merge(lookup.refs(repo))
- add_headers(app.response, :content_type => "application/json")
- app.body(renderer.render(:refs, data, :layout => nil))
- end
-
- def tree_history(repo, ref, path, count = 1, custom_data = {})
- if oid = lookup_ref_oid(repo, ref)
- redirect(app.tree_history_url(repo, oid, path), 307) and return
- end
-
- data = (custom_data || {}).merge(lookup.tree_history(repo, u(ref), path, count))
- add_headers(app.response, :content_type => "application/json", :ref => ref)
- app.body(renderer.render(:tree_history, data, :layout => nil))
- end
-
- def resolve_repository(repo)
- @cache ||= {}
- @cache[repo] ||= lookup.resolve_repository(repo)
- end
-
- def lookup_ref_oid(repo, ref)
- return if !app.respond_to?(:redirect_refs?) || !app.redirect_refs? || ref.length == 40
- lookup.rev_parse_oid(repo, ref)
- end
-
private
- attr_reader :app, :lookup, :renderer
+ attr_reader :app, :dolt
- def u(str)
- # Temporarily swap the + out with a magic byte, so
- # filenames/branches with +'s won't get unescaped to a space
- CGI.unescape(str.gsub("+", "\001")).gsub("\001", '+')
- end
-
- def add_headers(response, headers = {})
- default_ct = "text/html; charset=utf-8"
- app.response["Content-Type"] = headers[:content_type] || default_ct
- app.response["X-UA-Compatible"] = "IE=edge"
-
- if headers[:ref] && headers[:ref].length == 40
- app.response["Cache-Control"] = "max-age=315360000, public"
- year = 60*60*24*365
- app.response["Expires"] = (Time.now + year).httpdate
+ def respond(response)
+ app.response.status = response[0]
+ response[1].keys.each do |header|
+ app.response[header] = response[1][header]
end
+ app.body(response[2].join("\n"))
end
end
end
end