From 93d1b2e0a43982f37b60f6b15b36bc46e3c79f9b Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Mon, 17 Mar 2008 17:45:01 +0000 Subject: [PATCH] Add Redmine links for repository files using source: and export: keyworkds (#867). git-svn-id: http://redmine.rubyforge.org/svn/trunk@1267 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/controllers/repositories_controller.rb | 3 +- app/helpers/application_helper.rb | 22 ++++++++-- app/views/repositories/entry.rhtml | 17 ++++---- test/unit/helpers/application_helper_test.rb | 43 +++++++++++++------- test/unit/mailer_test.rb | 2 +- 5 files changed, 57 insertions(+), 30 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index bce5f66a9..349d0a505 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -97,7 +97,8 @@ class RepositoriesController < ApplicationController def entry @content = @repository.scm.cat(@path, @rev) show_error_not_found and return unless @content - if 'raw' == params[:format] + if 'raw' == params[:format] || @content.is_binary_data? + # Force the download if it's a binary file send_data @content, :filename => @path.split('/').last else # Prevent empty lines when displaying a file with Windows style eol diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index aa19ce7d4..4e2a10445 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -281,13 +281,19 @@ module ApplicationHelper # version:"1.0 beta 2" -> Link to version named "1.0 beta 2" # Attachments: # attachment:file.zip -> Link to the attachment of the current object named file.zip - text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit)?((#|r)(\d+)|(:)([^"][^\s<>]+|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m| + # Source files: + # source:some/file -> Link to the file located at /some/file in the project's repository + # source:some/file@52 -> Link to the file's revision 52 + # source:some/file#L120 -> Link to line 120 of the file + # source:some/file@52#L120 -> Link to line 120 of the file's revision 52 + # export:some/file -> Force the download of the file + text = text.gsub(%r{([\s\(,-^])(!)?(attachment|document|version|commit|source|export)?((#|r)(\d+)|(:)([^"][^\s<>]+|"[^"]+"))(?=[[:punct:]]|\s|<|$)}) do |m| leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8 link = nil if esc.nil? if prefix.nil? && sep == 'r' if project && (changeset = project.changesets.find_by_revision(oid)) - link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project.id, :rev => oid}, + link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid}, :class => 'changeset', :title => truncate(changeset.comments, 100)) end @@ -328,7 +334,17 @@ module ApplicationHelper end when 'commit' if project && (changeset = project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"])) - link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project.id, :rev => changeset.revision}, :class => 'changeset', :title => truncate(changeset.comments, 100) + link = link_to h("#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => changeset.revision}, :class => 'changeset', :title => truncate(changeset.comments, 100) + end + when 'source', 'export' + if project && project.repository + name =~ %r{^[/\\]*(.*?)(@([0-9a-f]+))?(#(L\d+))?$} + path, rev, anchor = $1, $3, $5 + link = link_to h("#{prefix}:#{name}"), {:controller => 'repositories', :action => 'entry', :id => project, :path => path, + :rev => rev, + :anchor => anchor, + :format => (prefix == 'export' ? 'raw' : nil)}, + :class => (prefix == 'export' ? 'source download' : 'source') end when 'attachment' if attachments && attachment = attachments.detect {|a| a.filename == name } diff --git a/app/views/repositories/entry.rhtml b/app/views/repositories/entry.rhtml index 41565a232..309da76fc 100644 --- a/app/views/repositories/entry.rhtml +++ b/app/views/repositories/entry.rhtml @@ -2,16 +2,13 @@
- - <% line_num = 1 %> - <% syntax_highlight(@path, to_utf8(@content)).each_line do |line| %> - - - - - <% line_num += 1 %> - <% end %> - + +<% line_num = 1 %> +<% syntax_highlight(@path, to_utf8(@content)).each_line do |line| %> + +<% line_num += 1 %> +<% end %> +
<%= line_num %>
<%= line %>
<%= line_num %>
<%= line %>
diff --git a/test/unit/helpers/application_helper_test.rb b/test/unit/helpers/application_helper_test.rb index 4e617f699..f34a587a2 100644 --- a/test/unit/helpers/application_helper_test.rb +++ b/test/unit/helpers/application_helper_test.rb @@ -67,7 +67,7 @@ class ApplicationHelperTest < HelperTestCase issue_link = link_to('#3', {:controller => 'issues', :action => 'show', :id => 3}, :class => 'issue', :title => 'Error 281 when updating a recipe (New)') - changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 1, :rev => 1}, + changeset_link = link_to('r1', {:controller => 'repositories', :action => 'revision', :id => 'ecookbook', :rev => 1}, :class => 'changeset', :title => 'My very first commit') document_link = link_to('Test document', {:controller => 'documents', :action => 'show', :id => 1}, @@ -75,23 +75,36 @@ class ApplicationHelperTest < HelperTestCase version_link = link_to('1.0', {:controller => 'versions', :action => 'show', :id => 2}, :class => 'version') + + source_url = {:controller => 'repositories', :action => 'entry', :id => 'ecookbook', :path => 'some/file'} to_test = { - '#3, #3 and #3.' => "#{issue_link}, #{issue_link} and #{issue_link}.", - 'r1' => changeset_link, - 'document#1' => document_link, - 'document:"Test document"' => document_link, - 'version#2' => version_link, - 'version:1.0' => version_link, - 'version:"1.0"' => version_link, + # tickets + '#3, #3 and #3.' => "#{issue_link}, #{issue_link} and #{issue_link}.", + # changesets + 'r1' => changeset_link, + # documents + 'document#1' => document_link, + 'document:"Test document"' => document_link, + # versions + 'version#2' => version_link, + 'version:1.0' => version_link, + 'version:"1.0"' => version_link, + # source + 'source:/some/file' => link_to('source:/some/file', source_url, :class => 'source'), + 'source:/some/file@52' => link_to('source:/some/file@52', source_url.merge(:rev => 52), :class => 'source'), + 'source:/some/file#L110' => link_to('source:/some/file#L110', source_url.merge(:anchor => 'L110'), :class => 'source'), + 'source:/some/file@52#L110' => link_to('source:/some/file@52#L110', source_url.merge(:rev => 52, :anchor => 'L110'), :class => 'source'), + 'export:/some/file' => link_to('export:/some/file', source_url.merge(:format => 'raw'), :class => 'source download'), # escaping - '!#3.' => '#3.', - '!r1' => 'r1', - '!document#1' => 'document#1', - '!document:"Test document"' => 'document:"Test document"', - '!version#2' => 'version#2', - '!version:1.0' => 'version:1.0', - '!version:"1.0"' => 'version:"1.0"', + '!#3.' => '#3.', + '!r1' => 'r1', + '!document#1' => 'document#1', + '!document:"Test document"' => 'document:"Test document"', + '!version#2' => 'version#2', + '!version:1.0' => 'version:1.0', + '!version:"1.0"' => 'version:"1.0"', + '!source:/some/file' => 'source:/some/file', } @project = Project.find(1) to_test.each { |text, result| assert_equal "

#{result}

", textilizable(text) } diff --git a/test/unit/mailer_test.rb b/test/unit/mailer_test.rb index dc3fde414..64648b94c 100644 --- a/test/unit/mailer_test.rb +++ b/test/unit/mailer_test.rb @@ -36,7 +36,7 @@ class MailerTest < Test::Unit::TestCase # link to a referenced ticket assert mail.body.include?('#2') # link to a changeset - assert mail.body.include?('r2') + assert mail.body.include?('r2') end # test mailer methods for each language