summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/controllers/repositories_controller.rb34
-rw-r--r--app/views/repositories/diff.rhtml5
2 files changed, 27 insertions, 12 deletions
diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb
index 5fb2fdd75..ef49cf248 100644
--- a/app/controllers/repositories_controller.rb
+++ b/app/controllers/repositories_controller.rb
@@ -142,19 +142,29 @@ class RepositoriesController < ApplicationController
end
def diff
- @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
- @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
-
- # Save diff type as user preference
- if User.current.logged? && @diff_type != User.current.pref[:diff_type]
- User.current.pref[:diff_type] = @diff_type
- User.current.preference.save
- end
-
- @cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}")
- unless read_fragment(@cache_key)
+ if params[:format] == 'diff'
@diff = @repository.diff(@path, @rev, @rev_to)
- show_error_not_found unless @diff
+ show_error_not_found and return unless @diff
+ filename = "changeset_r#{@rev}"
+ filename << "_r#{@rev_to}" if @rev_to
+ send_data @diff.join, :filename => "#{filename}.diff",
+ :type => 'text/x-patch',
+ :disposition => 'attachment'
+ else
+ @diff_type = params[:type] || User.current.pref[:diff_type] || 'inline'
+ @diff_type = 'inline' unless %w(inline sbs).include?(@diff_type)
+
+ # Save diff type as user preference
+ if User.current.logged? && @diff_type != User.current.pref[:diff_type]
+ User.current.pref[:diff_type] = @diff_type
+ User.current.preference.save
+ end
+
+ @cache_key = "repositories/diff/#{@repository.id}/" + Digest::MD5.hexdigest("#{@path}-#{@rev}-#{@rev_to}-#{@diff_type}")
+ unless read_fragment(@cache_key)
+ @diff = @repository.diff(@path, @rev, @rev_to)
+ show_error_not_found unless @diff
+ end
end
rescue Redmine::Scm::Adapters::CommandFailed => e
show_error_command_failed(e.message)
diff --git a/app/views/repositories/diff.rhtml b/app/views/repositories/diff.rhtml
index 953c7c02a..802082740 100644
--- a/app/views/repositories/diff.rhtml
+++ b/app/views/repositories/diff.rhtml
@@ -84,6 +84,11 @@
<% end -%>
<% end -%>
+<p class="other-formats">
+<%= l(:label_export_to) %>
+<span><%= link_to 'Unified diff', params.merge(:format => 'diff') %></span>
+</p>
+
<% html_title(with_leading_slash(@path), 'Diff') -%>
<% content_for :header_tags do %>