Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-03-24 14:28:43 +0300
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2016-03-30 11:44:18 +0300
commit701976e0815c273ff4a4c6e4d3489db0ce2f0860 (patch)
treee519cfebe16a9684bb6162421c2be159243142ba /lib/gitlab/gfm
parentcff3497f2c06dd4e1785af3c844040ed7939dcb0 (diff)
Add uploads rewriter and use it when moving issue
Diffstat (limited to 'lib/gitlab/gfm')
-rw-r--r--lib/gitlab/gfm/uploads_rewriter.rb56
1 files changed, 56 insertions, 0 deletions
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