diff options
author | Douwe Maan <douwe@gitlab.com> | 2016-05-20 21:08:57 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2016-05-20 21:08:57 +0000 |
commit | ba5b47c2e36d284df6827fed8e59876619aa9501 (patch) | |
tree | 50d6e05041157dea95d57eaf9b16d50501727901 /lib | |
parent | 983b592cb7cbf3369e1af9e26f527876c6cca360 (diff) | |
parent | 129bb6c2a71c8499daeb5d55f657b0eda8366bc8 (diff) | |
download | gitlab-ce-ba5b47c2e36d284df6827fed8e59876619aa9501.tar.gz |
Merge branch 'eReGeBe/gitlab-ce-feature/milestone-md' into 'master'
Implement special GitLab markdown reference for milestones
https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3453 by @eReGeBe, with two additions:
- Move changelog item to 8.8
- Fix cross-project milestone ref with invalid project, like https://gitlab.com/gitlab-org/gitlab-ce/commit/f7348cd348ad8f4a18d74dd668283a4e236f5790 did for labels
Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/13829
See merge request !3897
Diffstat (limited to 'lib')
-rw-r--r-- | lib/banzai/filter/milestone_reference_filter.rb | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/lib/banzai/filter/milestone_reference_filter.rb b/lib/banzai/filter/milestone_reference_filter.rb index 4cb82178024..dad0768f51b 100644 --- a/lib/banzai/filter/milestone_reference_filter.rb +++ b/lib/banzai/filter/milestone_reference_filter.rb @@ -10,11 +10,53 @@ module Banzai project.milestones.find_by(iid: id) end - def url_for_object(issue, project) + def references_in(text, pattern = Milestone.reference_pattern) + # We'll handle here the references that follow the `reference_pattern`. + # Other patterns (for example, the link pattern) are handled by the + # default implementation. + return super(text, pattern) if pattern != Milestone.reference_pattern + + text.gsub(pattern) do |match| + milestone = find_milestone($~[:project], $~[:milestone_iid], $~[:milestone_name]) + + if milestone + yield match, milestone.iid, $~[:project], $~ + else + match + end + end + end + + def find_milestone(project_ref, milestone_id, milestone_name) + project = project_from_ref(project_ref) + return unless project + + milestone_params = milestone_params(milestone_id, milestone_name) + project.milestones.find_by(milestone_params) + end + + def milestone_params(iid, name) + if name + { name: name.tr('"', '') } + else + { iid: iid.to_i } + end + end + + def url_for_object(milestone, project) h = Gitlab::Routing.url_helpers h.namespace_project_milestone_url(project.namespace, project, milestone, only_path: context[:only_path]) end + + def object_link_text(object, matches) + if context[:project] == object.project + super + else + "#{escape_once(super)} <i>in #{escape_once(object.project.path_with_namespace)}</i>". + html_safe + end + end end end end |