From 701976e0815c273ff4a4c6e4d3489db0ce2f0860 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 24 Mar 2016 12:28:43 +0100 Subject: Add uploads rewriter and use it when moving issue --- lib/gitlab/gfm/uploads_rewriter.rb | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 lib/gitlab/gfm/uploads_rewriter.rb (limited to 'lib') diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb new file mode 100644 index 00000000000..778b6fe9f9d --- /dev/null +++ b/lib/gitlab/gfm/uploads_rewriter.rb @@ -0,0 +1,56 @@ +module Gitlab + module Gfm + ## + # Class that rewrites markdown links for uploads + # + # Using a pattern defined in `FileUploader` copies files to a new project + # and rewrites all links to uploads in ain a given text. + # + class UploadsRewriter + def initialize(text, source_project, _current_user) + @text = text + @source_project = source_project + @pattern = FileUploader::MARKDOWN_PATTERN + end + + def rewrite(target_project) + return unless @text + + new_uploader = file_uploader(target_project) + @text.gsub(@pattern) do |markdown_link| + old_file = find_file(@source_project, $~[:secret], $~[:file]) + return markdown_link unless old_file.exists? + + new_uploader.store!(old_file) + new_uploader.to_h[:markdown] + end + end + + def has_uploads? + !(@text =~ @pattern).nil? + end + + def files + referenced_files = @text.scan(@pattern).map do + find_file(@source_project, $~[:secret], $~[:file]) + end + + referenced_files.compact.select(&:exists?) + end + + private + + def find_file(project, secret, file) + uploader = file_uploader(project, secret) + uploader.retrieve_from_store!(file) + uploader.file + end + + def file_uploader(*args) + uploader = FileUploader.new(*args) + uploader.define_singleton_method(:move_to_store) { false } + uploader + end + end + end +end -- cgit v1.2.1 From f2674c7b98c69668093583e4590223b7040b5b33 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 29 Mar 2016 13:21:57 +0200 Subject: Refactor uploads rewriter used when moving issue --- lib/gitlab/gfm/reference_rewriter.rb | 9 ++++++--- lib/gitlab/gfm/uploads_rewriter.rb | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index a1c6ee7bd69..5f906d07177 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -34,16 +34,19 @@ module Gitlab @source_project = source_project @current_user = current_user @original_html = markdown(text) + @pattern = Gitlab::ReferenceExtractor.references_pattern end def rewrite(target_project) - pattern = Gitlab::ReferenceExtractor.references_pattern - - @text.gsub(pattern) do |reference| + @text.gsub(@pattern) do |reference| unfold_reference(reference, Regexp.last_match, target_project) end end + def needs_rewrite? + !(@text =~ @pattern).nil? + end + private def unfold_reference(reference, match, target_project) diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb index 778b6fe9f9d..5818766c974 100644 --- a/lib/gitlab/gfm/uploads_rewriter.rb +++ b/lib/gitlab/gfm/uploads_rewriter.rb @@ -3,8 +3,9 @@ module Gitlab ## # Class that rewrites markdown links for uploads # - # Using a pattern defined in `FileUploader` copies files to a new project - # and rewrites all links to uploads in ain a given text. + # Using a pattern defined in `FileUploader` it copies files to a new + # project and rewrites all links to uploads in in a given text. + # # class UploadsRewriter def initialize(text, source_project, _current_user) @@ -17,17 +18,17 @@ module Gitlab return unless @text new_uploader = file_uploader(target_project) - @text.gsub(@pattern) do |markdown_link| - old_file = find_file(@source_project, $~[:secret], $~[:file]) - return markdown_link unless old_file.exists? + @text.gsub(@pattern) do |markdown| + file = find_file(@source_project, $~[:secret], $~[:file]) + return markdown unless file.try(:exists?) - new_uploader.store!(old_file) + new_uploader.store!(file) new_uploader.to_h[:markdown] end end - def has_uploads? - !(@text =~ @pattern).nil? + def needs_rewrite? + files.any? end def files @@ -46,8 +47,8 @@ module Gitlab uploader.file end - def file_uploader(*args) - uploader = FileUploader.new(*args) + def file_uploader(project, secret = nil) + uploader = FileUploader.new(project, secret) uploader.define_singleton_method(:move_to_store) { false } uploader end -- cgit v1.2.1 From e64b1e52a23016e51d581b87c08beaa4b18da689 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 30 Mar 2016 10:42:39 +0200 Subject: Check if GFM rewriters need rewrite internally --- lib/gitlab/gfm/reference_rewriter.rb | 2 ++ lib/gitlab/gfm/uploads_rewriter.rb | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index 5f906d07177..47e1aa67976 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -38,6 +38,8 @@ module Gitlab end def rewrite(target_project) + return @text unless needs_rewrite? + @text.gsub(@pattern) do |reference| unfold_reference(reference, Regexp.last_match, target_project) end diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb index 5818766c974..bdf054a6192 100644 --- a/lib/gitlab/gfm/uploads_rewriter.rb +++ b/lib/gitlab/gfm/uploads_rewriter.rb @@ -15,7 +15,7 @@ module Gitlab end def rewrite(target_project) - return unless @text + return @text unless needs_rewrite? new_uploader = file_uploader(target_project) @text.gsub(@pattern) do |markdown| -- cgit v1.2.1 From 99ee822857cf3fdf0a2ac91c0d13ea68c79e8ba8 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 30 Mar 2016 10:56:25 +0200 Subject: Add method that returns markdown in file uploader --- lib/gitlab/gfm/reference_rewriter.rb | 2 +- lib/gitlab/gfm/uploads_rewriter.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/reference_rewriter.rb b/lib/gitlab/gfm/reference_rewriter.rb index 47e1aa67976..78d7a4f27cf 100644 --- a/lib/gitlab/gfm/reference_rewriter.rb +++ b/lib/gitlab/gfm/reference_rewriter.rb @@ -46,7 +46,7 @@ module Gitlab end def needs_rewrite? - !(@text =~ @pattern).nil? + @text =~ @pattern end private diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb index bdf054a6192..2e61f799a03 100644 --- a/lib/gitlab/gfm/uploads_rewriter.rb +++ b/lib/gitlab/gfm/uploads_rewriter.rb @@ -23,7 +23,7 @@ module Gitlab return markdown unless file.try(:exists?) new_uploader.store!(file) - new_uploader.to_h[:markdown] + new_uploader.to_markdown end end -- cgit v1.2.1 From b9f57192853d100c90b1d46491838a98d5ae4bae Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 30 Mar 2016 12:11:27 +0200 Subject: Remove reduntant `move_to_store` override --- lib/gitlab/gfm/uploads_rewriter.rb | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/gfm/uploads_rewriter.rb b/lib/gitlab/gfm/uploads_rewriter.rb index 2e61f799a03..abc8c8c55e6 100644 --- a/lib/gitlab/gfm/uploads_rewriter.rb +++ b/lib/gitlab/gfm/uploads_rewriter.rb @@ -17,11 +17,11 @@ module Gitlab def rewrite(target_project) return @text unless needs_rewrite? - new_uploader = file_uploader(target_project) @text.gsub(@pattern) do |markdown| file = find_file(@source_project, $~[:secret], $~[:file]) return markdown unless file.try(:exists?) + new_uploader = FileUploader.new(target_project) new_uploader.store!(file) new_uploader.to_markdown end @@ -42,16 +42,10 @@ module Gitlab private def find_file(project, secret, file) - uploader = file_uploader(project, secret) + uploader = FileUploader.new(project, secret) uploader.retrieve_from_store!(file) uploader.file end - - def file_uploader(project, secret = nil) - uploader = FileUploader.new(project, secret) - uploader.define_singleton_method(:move_to_store) { false } - uploader - end end end end -- cgit v1.2.1