Index: app/helpers/application_helper.rb =================================================================== --- app/helpers/application_helper.rb (revision 2879) +++ app/helpers/application_helper.rb (working copy) @@ -29,8 +29,8 @@ def_delegators :wiki_helper, :wikitoolbar_for, :heads_for_wiki_formatter # Return true if user is authorized for controller/action, otherwise false - def authorize_for(controller, action) - User.current.allowed_to?({:controller => controller, :action => action}, @project) + def authorize_for(controller, action, project = @project) + User.current.allowed_to?({:controller => controller, :action => action}, project) end # Display a link if user is authorized @@ -443,7 +443,12 @@ # #52 -> Link to issue #52 # Changesets: # r52 -> Link to revision 52 + # project:r52 -> Link to revision 52 of an other project, using project name or identifier # commit:a85130f -> Link to scmid starting with a85130f + # project:commit:a85130f -> Link to scmid starting with a85130f of an other project, using project name or identifier + # If your project name contains spaces, use quotation marks : + # "My Project":r52 + # "My Project":commit:a85130f # Documents: # document#17 -> Link to document with id 17 # document:Greetings -> Link to the document with title "Greetings" @@ -455,22 +460,39 @@ # Attachments: # attachment:file.zip -> Link to the attachment of the current object named file.zip # Source files: + # ["Link alternate display title"=][project:]source:some/path[/file][@52][#L120] + # ["Link alternate display title"=][project:]export:some/path/file[@52] # 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 + # "click here"=source:some/file#L120 -> Link to line 120 of the file + # "click here"=wizbang:source:some/file#L120 -> Link to line 120 of the file in the repo for the wizbang project # source:some/file@52#L120 -> Link to line 120 of the file's revision 52 # export:some/file -> Force the download of the file + # "Download This File"=export:some/file -> Force the download of the file + # "Download This File"=myproject:export:some/file -> Force the download of the file in repository for myproject project # Forum messages: # message#1218 -> Link to message with id 1218 - text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(attachment|document|version|commit|source|export|message)?((#|r)(\d+)|(:)([^"\s<>][^\s<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|<|$)}) do |m| - leading, esc, prefix, sep, oid = $1, $2, $3, $5 || $7, $6 || $8 + text = text.gsub(%r{([\s\(,\-\>]|^)(!)?(\"[^\"\n]+\"=)?(attachment|document|version|(\"[^:<>\r\n\b]+\":|[^:<>\s\r\n\b]+:)?(commit|source|export)|message)?((#|(\"[^:<>\r\n\b]+\":|[^:<>\s\r\n\b]+:)?(r))(\d+)|(:)([^"\s<>][^:\s\r\n\b<>]*?|"[^"]+?"))(?=(?=[[:punct:]]\W)|,|\s|<|$)}) do |m| + leading, esc, linktitle, prefix, sep, revproj, oid = $1, $2, $3, $6 || $3, $12 || $10 || $8, $5 || $9, $11 || $13 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, :rev => oid}, - :class => 'changeset', - :title => truncate_single_line(changeset.comments, :length => 100)) + if revproj.nil? + if project && (changeset = project.changesets.find_by_revision(oid)) + link = link_to("r#{oid}", {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => project, :rev => oid}, + :class => 'changeset', + :title => truncate_single_line(changeset.comments, :length => 100)) + end + else + revproj.gsub!(/[\:"]/,'') + link_project = Project.find_by_name(h(revproj)) || Project.find_by_identifier(h(revproj)) + if link_project && (changeset = link_project.changesets.find_by_revision(oid)) + title = truncate_single_line(changeset.comments, :length => 100) if authorize_for('repositories', 'revision', link_project) + link = link_to h("#{revproj}:r#{oid}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => link_project, :rev => oid}, + :class => 'changeset', + :title => title + end end elsif sep == '#' oid = oid.to_i @@ -518,16 +540,34 @@ :class => 'version' 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, :rev => changeset.revision}, - :class => 'changeset', - :title => truncate_single_line(changeset.comments, :length => 100) + if revproj.nil? + 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, :rev => changeset.revision}, + :class => 'changeset', + :title => truncate_single_line(changeset.comments, :length => 100) + end + else + revproj.gsub!(/[\:"]/,'') + link_project = Project.find_by_name(h(revproj)) || Project.find_by_identifier(h(revproj)) + if link_project && (changeset = link_project.changesets.find(:first, :conditions => ["scmid LIKE ?", "#{name}%"])) + title = truncate_single_line(changeset.comments, :length => 100) if authorize_for('repositories', 'revision', link_project) + link = link_to h("#{revproj}:#{name}"), {:only_path => only_path, :controller => 'repositories', :action => 'revision', :id => link_project, :rev => changeset.revision}, + :class => 'changeset', + :title => title + end end when 'source', 'export' - if project && project.repository + if revproj.nil? + link_project = project + else + revproj.gsub!(/[\:"]/,'') + link_project = Project.find_by_name(h(revproj)) || Project.find_by_identifier(h(revproj)) + end + if link_project && link_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, + link_title = linktitle ? linktitle.gsub!(/[\"=]/,'') : (link_project != project ? "#{revproj}:" : "") + "#{prefix}:#{name}" + link = link_to h(link_title), {:only_path => only_path, :controller => 'repositories', :action => 'entry', :id => link_project, :path => to_path_param(path), :rev => rev, :anchor => anchor, @@ -542,7 +582,7 @@ end end end - leading + (link || "#{prefix}#{sep}#{oid}") + leading + (link || (revproj ? "#{revproj}:" : "") + "#{prefix}#{sep}#{oid}") end text Index: public/help/wiki_syntax.html =================================================================== --- public/help/wiki_syntax.html (revision 2879) +++ public/help/wiki_syntax.html (working copy) @@ -52,8 +52,13 @@ Link to a Wiki page[[Wiki page]]Wiki page Issue #12Issue #12 Revision r43Revision r43 +myproj:r43myproj:r43 commit:f30e13e43f30e13e4 +proj:commit:f30e13e43proj:f30e13e4 source:some/filesource:some/file +proj:source:some/fileproj:source:some/file +"File Src"=source:some/fileFile Src +"Download"=proj:export:some/fileDownload Inline images Image!image_url! Index: public/help/wiki_syntax_detailed.html =================================================================== --- public/help/wiki_syntax_detailed.html (revision 2879) +++ public/help/wiki_syntax_detailed.html (working copy) @@ -49,6 +49,14 @@
  • Link to a changeset with a non-numeric hash: commit:c6f4d0fd (displays c6f4d0fd). Added in r1236.
  • +

    You can also link to changesets of an other project repository:

    + + +

    Wiki links: