diff options
author | Alejandro RodrÃguez <alejandroluis24@gmail.com> | 2016-03-30 23:12:34 -0300 |
---|---|---|
committer | Alejandro RodrÃguez <alejandroluis24@gmail.com> | 2016-04-20 22:12:43 -0300 |
commit | 077f9a4eeef3c64c5f3e9cc5df5442c8817ee1d6 (patch) | |
tree | ddc6a32813a1c417e8aa1ccd315c8c73ba9c0958 /app/models | |
parent | 2ade37e2534108c72d28605cb131dacf771d27d3 (diff) | |
download | gitlab-ce-077f9a4eeef3c64c5f3e9cc5df5442c8817ee1d6.tar.gz |
Implementing special GitLab markdown reference for milestones
Using the syntax proposed in #13829 [project_reference]%(milestone_id | milestone_name)
to get a link to the referred milestone.
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/milestone.rb | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/app/models/milestone.rb b/app/models/milestone.rb index 986184dd301..39dc8d89614 100644 --- a/app/models/milestone.rb +++ b/app/models/milestone.rb @@ -74,8 +74,22 @@ class Milestone < ActiveRecord::Base end end + def self.reference_prefix + '%' + end + def self.reference_pattern - nil + %r{ + (#{Project.reference_pattern})? + #{Regexp.escape(reference_prefix)} + (?: + (?<milestone_id>\d+) | # Integer-based milestone ID, or + (?<milestone_name> + [A-Za-z0-9_-]+ | # String-based single-word milestone title, or + "[^"]+" # String-based multi-word milestone surrounded in quotes + ) + ) + }x end def self.link_reference_pattern @@ -86,13 +100,15 @@ class Milestone < ActiveRecord::Base self.where('due_date > ?', Time.now).reorder(due_date: :asc).first end - def to_reference(from_project = nil) - escaped_title = self.title.gsub("]", "\\]") + def to_reference(from_project = nil, format: :id) + format_reference = milestone_format_reference(format) + reference = "#{self.class.reference_prefix}#{format_reference}" - h = Gitlab::Routing.url_helpers - url = h.namespace_project_milestone_url(self.project.namespace, self.project, self) - - "[#{escaped_title}](#{url})" + if cross_project_reference?(from_project) + project.to_reference + reference + else + reference + end end def reference_link_text(from_project = nil) @@ -160,4 +176,16 @@ class Milestone < ActiveRecord::Base issues.where(id: ids). update_all(["position = CASE #{conditions} ELSE position END", *pairs]) end + + private + + def milestone_format_reference(format = :id) + raise StandardError, 'Unknown format' unless [:id, :name].include?(format) + + if format == :name && !name.include?('"') + %("#{name}") + else + id + end + end end |