From 3c493c24c70f7c8dc8e1f3bcf29e18d1ef0944a7 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 26 Feb 2016 12:04:29 +0100 Subject: Add reference unfold pipeline used when moving issue --- lib/banzai/filter/reference_unfold_filter.rb | 46 ++++++++++++++++++++++++ lib/banzai/pipeline/reference_unfold_pipeline.rb | 9 +++++ 2 files changed, 55 insertions(+) create mode 100644 lib/banzai/filter/reference_unfold_filter.rb create mode 100644 lib/banzai/pipeline/reference_unfold_pipeline.rb (limited to 'lib') diff --git a/lib/banzai/filter/reference_unfold_filter.rb b/lib/banzai/filter/reference_unfold_filter.rb new file mode 100644 index 00000000000..a6145261651 --- /dev/null +++ b/lib/banzai/filter/reference_unfold_filter.rb @@ -0,0 +1,46 @@ +module Banzai + module Filter + ## + # Filter than unfolds local references. + # + # Replaces all local references with project cross reference version + # in all objects passed to this filter in context. + # + # Requires objects array with each element implementing `Referable`. + # + class ReferenceUnfoldFilter < ReferenceFilter + def initialize(*) + super + + @objects = context[:objects] + @project = context[:project] + + unless @objects.all? { |object| object.respond_to?(:to_reference) } + raise StandardError, "No `to_reference` method implemented in one of the objects !" + end + + unless @project.kind_of?(Project) + raise StandardError, 'No valid project passed in context!' + end + end + + def call + @objects.each do |object| + pattern = /#{Regexp.escape(object.to_reference)}/ + replace_text_nodes_matching(pattern) do |content| + content.gsub(pattern, object.to_reference(@project)) + end + end + + doc + end + + private + + def validate + needs :project + needs :objects + end + end + end +end diff --git a/lib/banzai/pipeline/reference_unfold_pipeline.rb b/lib/banzai/pipeline/reference_unfold_pipeline.rb new file mode 100644 index 00000000000..5b555d7c2d7 --- /dev/null +++ b/lib/banzai/pipeline/reference_unfold_pipeline.rb @@ -0,0 +1,9 @@ +module Banzai + module Pipeline + class ReferenceUnfoldPipeline < BasePipeline + def self.filters + [Filter::ReferenceUnfoldFilter] + end + end + end +end -- cgit v1.2.1 From 9124ebce982981b74ae644793a680b2b6060ce21 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 29 Feb 2016 09:49:22 +0100 Subject: Use internal reference extractor in banzai unfold pipeline --- lib/banzai/filter/reference_unfold_filter.rb | 34 ++++++++++-------------- lib/banzai/pipeline/reference_unfold_pipeline.rb | 14 +++++++++- 2 files changed, 27 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/lib/banzai/filter/reference_unfold_filter.rb b/lib/banzai/filter/reference_unfold_filter.rb index a6145261651..d8ed44a0e4e 100644 --- a/lib/banzai/filter/reference_unfold_filter.rb +++ b/lib/banzai/filter/reference_unfold_filter.rb @@ -1,45 +1,39 @@ +require 'html/pipeline/filter' + module Banzai module Filter ## # Filter than unfolds local references. # - # Replaces all local references with project cross reference version - # in all objects passed to this filter in context. - # - # Requires objects array with each element implementing `Referable`. # - class ReferenceUnfoldFilter < ReferenceFilter + class ReferenceUnfoldFilter < HTML::Pipeline::Filter def initialize(*) super - @objects = context[:objects] - @project = context[:project] - - unless @objects.all? { |object| object.respond_to?(:to_reference) } - raise StandardError, "No `to_reference` method implemented in one of the objects !" + unless result[:references].is_a?(Hash) + raise StandardError, 'References not processed!' end - unless @project.kind_of?(Project) - raise StandardError, 'No valid project passed in context!' - end + @text = context[:text].dup + @new_project = context[:new_project] + @referables = result[:references].values.flatten end def call - @objects.each do |object| - pattern = /#{Regexp.escape(object.to_reference)}/ - replace_text_nodes_matching(pattern) do |content| - content.gsub(pattern, object.to_reference(@project)) - end + @referables.each do |referable| + pattern = /#{Regexp.escape(referable.to_reference)}/ + @text.gsub!(pattern, referable.to_reference(@new_project)) end - doc + @text end private def validate needs :project - needs :objects + needs :new_project + needs :text end end end diff --git a/lib/banzai/pipeline/reference_unfold_pipeline.rb b/lib/banzai/pipeline/reference_unfold_pipeline.rb index 5b555d7c2d7..597bf7befd1 100644 --- a/lib/banzai/pipeline/reference_unfold_pipeline.rb +++ b/lib/banzai/pipeline/reference_unfold_pipeline.rb @@ -2,7 +2,19 @@ module Banzai module Pipeline class ReferenceUnfoldPipeline < BasePipeline def self.filters - [Filter::ReferenceUnfoldFilter] + FullPipeline.filters + + [Filter::ReferenceGathererFilter, + Filter::ReferenceUnfoldFilter] + end + + def self.call(text, context = {}) + context = context.merge(text: text) + super + end + + class << self + alias_method :to_document, :call + alias_method :to_html, :call end end end -- cgit v1.2.1 From cd0f19450843b5b9245ae82302d3f9d9003cb899 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 1 Mar 2016 14:18:51 +0100 Subject: Do not unfold non-referables when moving an issue --- lib/banzai/filter/reference_unfold_filter.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/banzai/filter/reference_unfold_filter.rb b/lib/banzai/filter/reference_unfold_filter.rb index d8ed44a0e4e..70a485ba2ae 100644 --- a/lib/banzai/filter/reference_unfold_filter.rb +++ b/lib/banzai/filter/reference_unfold_filter.rb @@ -21,6 +21,8 @@ module Banzai def call @referables.each do |referable| + next unless referable.respond_to?(:to_reference) + pattern = /#{Regexp.escape(referable.to_reference)}/ @text.gsub!(pattern, referable.to_reference(@new_project)) end -- cgit v1.2.1 From fd8394faae25b54c4d9ac485a0ce746cffec3a0f Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 7 Mar 2016 13:09:53 +0100 Subject: Move reference unfolder for GFM to separate class --- lib/banzai/filter/reference_unfold_filter.rb | 42 ------------------------ lib/banzai/pipeline/reference_unfold_pipeline.rb | 21 ------------ lib/gitlab/gfm/reference_unfolder.rb | 31 +++++++++++++++++ lib/gitlab/reference_extractor.rb | 8 ++++- 4 files changed, 38 insertions(+), 64 deletions(-) delete mode 100644 lib/banzai/filter/reference_unfold_filter.rb delete mode 100644 lib/banzai/pipeline/reference_unfold_pipeline.rb create mode 100644 lib/gitlab/gfm/reference_unfolder.rb (limited to 'lib') diff --git a/lib/banzai/filter/reference_unfold_filter.rb b/lib/banzai/filter/reference_unfold_filter.rb deleted file mode 100644 index 70a485ba2ae..00000000000 --- a/lib/banzai/filter/reference_unfold_filter.rb +++ /dev/null @@ -1,42 +0,0 @@ -require 'html/pipeline/filter' - -module Banzai - module Filter - ## - # Filter than unfolds local references. - # - # - class ReferenceUnfoldFilter < HTML::Pipeline::Filter - def initialize(*) - super - - unless result[:references].is_a?(Hash) - raise StandardError, 'References not processed!' - end - - @text = context[:text].dup - @new_project = context[:new_project] - @referables = result[:references].values.flatten - end - - def call - @referables.each do |referable| - next unless referable.respond_to?(:to_reference) - - pattern = /#{Regexp.escape(referable.to_reference)}/ - @text.gsub!(pattern, referable.to_reference(@new_project)) - end - - @text - end - - private - - def validate - needs :project - needs :new_project - needs :text - end - end - end -end diff --git a/lib/banzai/pipeline/reference_unfold_pipeline.rb b/lib/banzai/pipeline/reference_unfold_pipeline.rb deleted file mode 100644 index 597bf7befd1..00000000000 --- a/lib/banzai/pipeline/reference_unfold_pipeline.rb +++ /dev/null @@ -1,21 +0,0 @@ -module Banzai - module Pipeline - class ReferenceUnfoldPipeline < BasePipeline - def self.filters - FullPipeline.filters + - [Filter::ReferenceGathererFilter, - Filter::ReferenceUnfoldFilter] - end - - def self.call(text, context = {}) - context = context.merge(text: text) - super - end - - class << self - alias_method :to_document, :call - alias_method :to_html, :call - end - end - end -end diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb new file mode 100644 index 00000000000..4969e8ebe85 --- /dev/null +++ b/lib/gitlab/gfm/reference_unfolder.rb @@ -0,0 +1,31 @@ +module Gitlab + module Gfm + ## + # Class than unfolds local references in text. + # + # + class ReferenceUnfolder + def initialize(text, project) + @text = text + @project = project + end + + def unfold(from_project) + referables.each_with_object(@text.dup) do |referable, text| + next unless referable.respond_to?(:to_reference) + + pattern = /#{Regexp.escape(referable.to_reference)}/ + text.gsub!(pattern, referable.to_reference(from_project)) + end + end + + private + + def referables + extractor = Gitlab::ReferenceExtractor.new(@project) + extractor.analyze(@text) + extractor.all + end + end + end +end diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb index 4d830aa45e1..8c698d43bef 100644 --- a/lib/gitlab/reference_extractor.rb +++ b/lib/gitlab/reference_extractor.rb @@ -1,6 +1,7 @@ module Gitlab # Extract possible GFM references from an arbitrary String for further processing. class ReferenceExtractor < Banzai::ReferenceExtractor + REFERABLES = %i(user issue label milestone merge_request snippet commit commit_range) attr_accessor :project, :current_user, :author def initialize(project, current_user = nil, author = nil) @@ -17,7 +18,7 @@ module Gitlab super(text, context.merge(project: project)) end - %i(user label milestone merge_request snippet commit commit_range).each do |type| + REFERABLES.each do |type| define_method("#{type}s") do @references[type] ||= references(type, reference_context) end @@ -31,6 +32,11 @@ module Gitlab end end + def all + REFERABLES.each { |referable| send(referable.to_s.pluralize) } + @references.values.flatten + end + private def reference_context -- cgit v1.2.1 From 4354bfaba55c9238d5245fe2f5823665790c9817 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 11 Mar 2016 11:49:04 +0100 Subject: Add implementation of reference unfolder using banzai --- lib/banzai/filter/reference_filter.rb | 1 + lib/gitlab/gfm/reference_unfolder.rb | 53 +++++++++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/banzai/filter/reference_filter.rb b/lib/banzai/filter/reference_filter.rb index 3637b1bac94..132f0a4bd93 100644 --- a/lib/banzai/filter/reference_filter.rb +++ b/lib/banzai/filter/reference_filter.rb @@ -47,6 +47,7 @@ module Banzai # Returns a String def data_attribute(attributes = {}) attributes[:reference_filter] = self.class.name.demodulize + attributes.delete(:original) if context[:no_original_data] attributes.map { |key, value| %Q(data-#{key.to_s.dasherize}="#{escape_once(value)}") }.join(" ") end diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb index 4969e8ebe85..57871c36eb4 100644 --- a/lib/gitlab/gfm/reference_unfolder.rb +++ b/lib/gitlab/gfm/reference_unfolder.rb @@ -8,23 +8,66 @@ module Gitlab def initialize(text, project) @text = text @project = project + @original = markdown(text) end def unfold(from_project) - referables.each_with_object(@text.dup) do |referable, text| - next unless referable.respond_to?(:to_reference) + return @text unless @text =~ references_pattern - pattern = /#{Regexp.escape(referable.to_reference)}/ - text.gsub!(pattern, referable.to_reference(from_project)) + unfolded = @text.gsub(references_pattern) do |reference| + unfold_reference(reference, Regexp.last_match, from_project) end + + unless substitution_valid?(unfolded) + raise StandardError, 'Invalid references unfolding!' + end + + unfolded end private + def unfold_reference(reference, match, from_project) + before = @text[0...match.begin(0)] + after = @text[match.end(0)...@text.length] + referable = find_referable(reference) + + return reference unless referable + cross_reference = referable.to_reference(from_project) + new_text = before + cross_reference + after + + substitution_valid?(new_text) ? cross_reference : reference + end + + def references_pattern + return @pattern if @pattern + + patterns = Gitlab::ReferenceExtractor::REFERABLES.map do |ref| + ref.to_s.classify.constantize.try(:reference_pattern) + end + + @pattern = Regexp.union(patterns.compact) + end + def referables + return @referables if @referables + extractor = Gitlab::ReferenceExtractor.new(@project) extractor.analyze(@text) - extractor.all + @referables = extractor.all + end + + def find_referable(reference) + referables.find { |ref| ref.to_reference == reference } + end + + def substitution_valid?(substituted) + @original == markdown(substituted) + end + + def markdown(text) + helper = Class.new.extend(GitlabMarkdownHelper) + helper.markdown(text, project: @project, no_original_data: true) end end end -- cgit v1.2.1 From 5e3c9475a9332d7104a791f7bdfef30e069dd848 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 16 Mar 2016 10:24:44 +0100 Subject: Add minor improvements in code related to issue move --- lib/gitlab/gfm/reference_unfolder.rb | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb index 57871c36eb4..0a68d6f977f 100644 --- a/lib/gitlab/gfm/reference_unfolder.rb +++ b/lib/gitlab/gfm/reference_unfolder.rb @@ -1,8 +1,30 @@ module Gitlab module Gfm ## - # Class than unfolds local references in text. + # Class that unfolds local references in text. # + # The initializer takes text in Markdown and project this text is valid + # in context of. + # + # `unfold` method tries to find all local references and unfold each of + # those local references to cross reference format. + # + # Examples: + # + # 'Hello, this issue is related to #123 and + # other issues labeled with ~"label"', will be converted to: + # + # 'Hello, this issue is related to gitlab-org/gitlab-ce#123 and + # other issue labeled with gitlab-org/gitlab-ce~"label"'. + # + # It does respect markdown lexical rules, so text in code block will not be + # replaced, see another example: + # + # 'Merge request for issue #1234, see also link: + # http://gitlab.com/some/link/#1234, and code `puts #1234`' => + # + # 'Merge request for issue gitlab-org/gitlab-ce#1234, se also link: + # http://gitlab.com/some/link/#1234, and code `puts #1234`' # class ReferenceUnfolder def initialize(text, project) @@ -66,8 +88,7 @@ module Gitlab end def markdown(text) - helper = Class.new.extend(GitlabMarkdownHelper) - helper.markdown(text, project: @project, no_original_data: true) + Banzai.render(text, project: @project, no_original_data: true) end end end -- cgit v1.2.1 From 9b13ce0b7a50e65dfba31d4865a728c725daa3fe Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 18 Mar 2016 14:48:55 +0100 Subject: Improvements in issue move feaure (refactoring) According to endbosses' suggestions. --- lib/gitlab/gfm/reference_unfolder.rb | 25 ++++++------------------- lib/gitlab/reference_extractor.rb | 10 ++++++++++ 2 files changed, 16 insertions(+), 19 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb index 0a68d6f977f..cf8de88b856 100644 --- a/lib/gitlab/gfm/reference_unfolder.rb +++ b/lib/gitlab/gfm/reference_unfolder.rb @@ -7,7 +7,9 @@ module Gitlab # in context of. # # `unfold` method tries to find all local references and unfold each of - # those local references to cross reference format. + # those local references to cross reference format, assuming that the + # argument passed to this method is a project that references will be + # viewed from (see `Referable#to_reference method). # # Examples: # @@ -34,17 +36,12 @@ module Gitlab end def unfold(from_project) - return @text unless @text =~ references_pattern + pattern = Gitlab::ReferenceExtractor.references_pattern + return @text unless @text =~ pattern - unfolded = @text.gsub(references_pattern) do |reference| + @text.gsub(pattern) do |reference| unfold_reference(reference, Regexp.last_match, from_project) end - - unless substitution_valid?(unfolded) - raise StandardError, 'Invalid references unfolding!' - end - - unfolded end private @@ -61,16 +58,6 @@ module Gitlab substitution_valid?(new_text) ? cross_reference : reference end - def references_pattern - return @pattern if @pattern - - patterns = Gitlab::ReferenceExtractor::REFERABLES.map do |ref| - ref.to_s.classify.constantize.try(:reference_pattern) - end - - @pattern = Regexp.union(patterns.compact) - end - def referables return @referables if @referables diff --git a/lib/gitlab/reference_extractor.rb b/lib/gitlab/reference_extractor.rb index 8c698d43bef..13c4d64c99b 100644 --- a/lib/gitlab/reference_extractor.rb +++ b/lib/gitlab/reference_extractor.rb @@ -37,6 +37,16 @@ module Gitlab @references.values.flatten end + def self.references_pattern + return @pattern if @pattern + + patterns = REFERABLES.map do |ref| + ref.to_s.classify.constantize.try(:reference_pattern) + end + + @pattern = Regexp.union(patterns.compact) + end + private def reference_context -- cgit v1.2.1 From 18f25bc94282a29029721ceeb9b9c6db354ce45f Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Sat, 19 Mar 2016 18:58:52 +0100 Subject: Update reference unfolder according to recent ability changes Commit 43d8bdb4f048cbeb5675ed9120cb1aeb415b9586 introduced additional checks for permissions to read issue in references extractor. --- lib/gitlab/gfm/reference_unfolder.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb index cf8de88b856..94c09761960 100644 --- a/lib/gitlab/gfm/reference_unfolder.rb +++ b/lib/gitlab/gfm/reference_unfolder.rb @@ -29,9 +29,10 @@ module Gitlab # http://gitlab.com/some/link/#1234, and code `puts #1234`' # class ReferenceUnfolder - def initialize(text, project) + def initialize(text, project, user) @text = text @project = project + @user = user @original = markdown(text) end @@ -61,7 +62,7 @@ module Gitlab def referables return @referables if @referables - extractor = Gitlab::ReferenceExtractor.new(@project) + extractor = Gitlab::ReferenceExtractor.new(@project, @user) extractor.analyze(@text) @referables = extractor.all end -- cgit v1.2.1 From 212e83bab3f1f9055f1321c3e934b4f4659250bf Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Fri, 26 Feb 2016 09:55:43 +0100 Subject: Soft delete issuables --- lib/api/issues.rb | 9 +++++++-- lib/api/merge_requests.rb | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/api/issues.rb b/lib/api/issues.rb index fda6f841438..5b47bbc0b1b 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -191,7 +191,7 @@ module API end end - # Delete a project issue (deprecated) + # Delete a project issue # # Parameters: # id (required) - The ID of a project @@ -199,7 +199,12 @@ module API # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - not_allowed! + authenticated_as_admin! + + issue = user_project.issues.find(params[:issue_id]) + issue.destroy + + present issue, with: Entities::Issue end end end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index c5e5d57ed4d..09ce02b0912 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -100,6 +100,20 @@ module API end end + # Delete a MR + # + # Parameters: + # id (required) - The ID of the project + # merge_request_id (required) - The MR id + delete ":id/merge_requests/:merge_request_id" do + authenticated_as_admin! + + merge_request = user_project.merge_requests.find(params[:merge_request_id]) + merge_request.destroy + + present merge_request, with: Entities::MergeRequest + end + # Routing "merge_request/:merge_request_id/..." is DEPRECATED and WILL BE REMOVED in version 9.0 # Use "merge_requests/:merge_request_id/..." instead. # -- cgit v1.2.1 From 7342a4566cc2eef0e434f3aea0eac48674baaaf1 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Mon, 14 Mar 2016 21:46:44 +0100 Subject: Dry destroy action on issuables --- lib/api/issues.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 5b47bbc0b1b..539f00d37fe 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -199,11 +199,12 @@ module API # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - authenticated_as_admin! + issue = user_project.issues.find(params[:issue_id]) + !JLJsdf sdfijsf current_user.can?(:remove_issue, issue) issue = user_project.issues.find(params[:issue_id]) issue.destroy - + present issue, with: Entities::Issue end end -- cgit v1.2.1 From 1d7782281693a94b2d8efcdd9d05f81fefae75f9 Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Fri, 18 Mar 2016 19:11:25 +0100 Subject: minor improvements and fixed specs --- lib/api/helpers.rb | 4 +--- lib/api/issues.rb | 3 ++- lib/api/merge_requests.rb | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index a72044e8058..4921ae99e78 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -118,9 +118,7 @@ module API end def authorize!(action, subject) - unless abilities.allowed?(current_user, action, subject) - forbidden! - end + forbidden! unless abilities.allowed?(current_user, action, subject) end def authorize_push_project diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 539f00d37fe..8c753e9f2ff 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -200,7 +200,8 @@ module API # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do issue = user_project.issues.find(params[:issue_id]) - !JLJsdf sdfijsf current_user.can?(:remove_issue, issue) + + authorize!(:remove_issue, issue) issue = user_project.issues.find(params[:issue_id]) issue.destroy diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 09ce02b0912..dc94cc5c85f 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -106,9 +106,9 @@ module API # id (required) - The ID of the project # merge_request_id (required) - The MR id delete ":id/merge_requests/:merge_request_id" do - authenticated_as_admin! - merge_request = user_project.merge_requests.find(params[:merge_request_id]) + + authorize!(:remove_merge_request, merge_request) merge_request.destroy present merge_request, with: Entities::MergeRequest -- cgit v1.2.1 From 323d328c8644e3ff01b806f7754d33c0c7dedd7b Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Sun, 20 Mar 2016 10:11:26 +0100 Subject: Rename reference unfolder to rewriter, minor refactorings --- lib/gitlab/gfm/reference_rewriter.rb | 83 ++++++++++++++++++++++++++++++++++++ lib/gitlab/gfm/reference_unfolder.rb | 83 ------------------------------------ 2 files changed, 83 insertions(+), 83 deletions(-) create mode 100644 lib/gitlab/gfm/reference_rewriter.rb delete mode 100644 lib/gitlab/gfm/reference_unfolder.rb (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb new file mode 100644 index 00000000000..91069732d44 --- /dev/null +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -0,0 +1,83 @@ +module Gitlab + module Gfm + ## + # Class that unfolds local references in text. + # + # The initializer takes text in Markdown and project this text is valid + # in context of. + # + # `unfold` method tries to find all local references and unfold each of + # those local references to cross reference format, assuming that the + # argument passed to this method is a project that references will be + # viewed from (see `Referable#to_reference method). + # + # Examples: + # + # 'Hello, this issue is related to #123 and + # other issues labeled with ~"label"', will be converted to: + # + # 'Hello, this issue is related to gitlab-org/gitlab-ce#123 and + # other issue labeled with gitlab-org/gitlab-ce~"label"'. + # + # It does respect markdown lexical rules, so text in code block will not be + # replaced, see another example: + # + # 'Merge request for issue #1234, see also link: + # http://gitlab.com/some/link/#1234, and code `puts #1234`' => + # + # 'Merge request for issue gitlab-org/gitlab-ce#1234, se also link: + # http://gitlab.com/some/link/#1234, and code `puts #1234`' + # + class ReferenceRewriter + def initialize(text, source_project, current_user) + @text = text + @source_project = source_project + @current_user = current_user + @original_html = markdown(text) + end + + def rewrite(target_project) + pattern = Gitlab::ReferenceExtractor.references_pattern + + @text.gsub(pattern) do |reference| + unfold_reference(reference, Regexp.last_match, target_project) + end + end + + private + + def unfold_reference(reference, match, target_project) + before = @text[0...match.begin(0)] + after = @text[match.end(0)..-1] + referable = find_local_referable(reference) + + return reference unless referable + cross_reference = referable.to_reference(target_project) + new_text = before + cross_reference + after + + substitution_valid?(new_text) ? cross_reference : reference + end + + def referables + return @referables if @referables + + extractor = Gitlab::ReferenceExtractor.new(@source_project, + @current_user) + extractor.analyze(@text) + @referables = extractor.all + end + + def find_local_referable(reference) + referables.find { |ref| ref.to_reference == reference } + end + + def substitution_valid?(substituted) + @original_html == markdown(substituted) + end + + def markdown(text) + Banzai.render(text, project: @source_project, no_original_data: true) + end + end + end +end diff --git a/lib/gitlab/gfm/reference_unfolder.rb b/lib/gitlab/gfm/reference_unfolder.rb deleted file mode 100644 index 94c09761960..00000000000 --- a/lib/gitlab/gfm/reference_unfolder.rb +++ /dev/null @@ -1,83 +0,0 @@ -module Gitlab - module Gfm - ## - # Class that unfolds local references in text. - # - # The initializer takes text in Markdown and project this text is valid - # in context of. - # - # `unfold` method tries to find all local references and unfold each of - # those local references to cross reference format, assuming that the - # argument passed to this method is a project that references will be - # viewed from (see `Referable#to_reference method). - # - # Examples: - # - # 'Hello, this issue is related to #123 and - # other issues labeled with ~"label"', will be converted to: - # - # 'Hello, this issue is related to gitlab-org/gitlab-ce#123 and - # other issue labeled with gitlab-org/gitlab-ce~"label"'. - # - # It does respect markdown lexical rules, so text in code block will not be - # replaced, see another example: - # - # 'Merge request for issue #1234, see also link: - # http://gitlab.com/some/link/#1234, and code `puts #1234`' => - # - # 'Merge request for issue gitlab-org/gitlab-ce#1234, se also link: - # http://gitlab.com/some/link/#1234, and code `puts #1234`' - # - class ReferenceUnfolder - def initialize(text, project, user) - @text = text - @project = project - @user = user - @original = markdown(text) - end - - def unfold(from_project) - pattern = Gitlab::ReferenceExtractor.references_pattern - return @text unless @text =~ pattern - - @text.gsub(pattern) do |reference| - unfold_reference(reference, Regexp.last_match, from_project) - end - end - - private - - def unfold_reference(reference, match, from_project) - before = @text[0...match.begin(0)] - after = @text[match.end(0)...@text.length] - referable = find_referable(reference) - - return reference unless referable - cross_reference = referable.to_reference(from_project) - new_text = before + cross_reference + after - - substitution_valid?(new_text) ? cross_reference : reference - end - - def referables - return @referables if @referables - - extractor = Gitlab::ReferenceExtractor.new(@project, @user) - extractor.analyze(@text) - @referables = extractor.all - end - - def find_referable(reference) - referables.find { |ref| ref.to_reference == reference } - end - - def substitution_valid?(substituted) - @original == markdown(substituted) - end - - def markdown(text) - Banzai.render(text, project: @project, no_original_data: true) - end - end - end -end -- cgit v1.2.1 From 6eb31056346ed07db4f66e4ba2369ff9779230c5 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Sun, 20 Mar 2016 10:52:01 +0100 Subject: Find referable for each ref found in references rewriter --- lib/gitlab/gfm/reference_rewriter.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index 91069732d44..edc96a5e83b 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -49,7 +49,7 @@ module Gitlab def unfold_reference(reference, match, target_project) before = @text[0...match.begin(0)] after = @text[match.end(0)..-1] - referable = find_local_referable(reference) + referable = find_referable(reference) return reference unless referable cross_reference = referable.to_reference(target_project) @@ -58,17 +58,11 @@ module Gitlab substitution_valid?(new_text) ? cross_reference : reference end - def referables - return @referables if @referables - + def find_referable(reference) extractor = Gitlab::ReferenceExtractor.new(@source_project, @current_user) - extractor.analyze(@text) - @referables = extractor.all - end - - def find_local_referable(reference) - referables.find { |ref| ref.to_reference == reference } + extractor.analyze(reference) + extractor.all.first end def substitution_valid?(substituted) -- cgit v1.2.1 From db8f70d5088cc1e0172fd6b94fc4628bd83aa4a4 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 21 Mar 2016 14:12:49 +0100 Subject: Do not rewrite reference if already a cross reference --- lib/gitlab/gfm/reference_rewriter.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index edc96a5e83b..a1c6ee7bd69 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -49,12 +49,14 @@ module Gitlab def unfold_reference(reference, match, target_project) before = @text[0...match.begin(0)] after = @text[match.end(0)..-1] - referable = find_referable(reference) + referable = find_referable(reference) return reference unless referable + cross_reference = referable.to_reference(target_project) - new_text = before + cross_reference + after + return reference if reference == cross_reference + new_text = before + cross_reference + after substitution_valid?(new_text) ? cross_reference : reference end -- cgit v1.2.1 From 3b088fc5b53f03605484ebef1945b8839abe19de Mon Sep 17 00:00:00 2001 From: Zeger-Jan van de Weg Date: Mon, 21 Mar 2016 14:12:52 +0100 Subject: Minor improvements on IssuableActions --- lib/api/issues.rb | 8 ++------ lib/api/merge_requests.rb | 6 ++---- 2 files changed, 4 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 8c753e9f2ff..e5ae88eb96f 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -199,14 +199,10 @@ module API # Example Request: # DELETE /projects/:id/issues/:issue_id delete ":id/issues/:issue_id" do - issue = user_project.issues.find(params[:issue_id]) - - authorize!(:remove_issue, issue) + issue = user_project.issues.find_by(id: params[:issue_id]) - issue = user_project.issues.find(params[:issue_id]) + authorize!(:destroy_issue, issue) issue.destroy - - present issue, with: Entities::Issue end end end diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index dc94cc5c85f..93052fba06b 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -106,12 +106,10 @@ module API # id (required) - The ID of the project # merge_request_id (required) - The MR id delete ":id/merge_requests/:merge_request_id" do - merge_request = user_project.merge_requests.find(params[:merge_request_id]) + merge_request = user_project.merge_requests.find_by(id: params[:merge_request_id]) - authorize!(:remove_merge_request, merge_request) + authorize!(:destroy_merge_request, merge_request) merge_request.destroy - - present merge_request, with: Entities::MergeRequest end # Routing "merge_request/:merge_request_id/..." is DEPRECATED and WILL BE REMOVED in version 9.0 -- cgit v1.2.1