summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2018-02-06 15:19:35 +0000
committerSean McGivern <sean@mcgivern.me.uk>2018-02-06 15:19:35 +0000
commit9ab4c5b735e0e121996b092cb20bcdc423045c5e (patch)
tree981ea32cf01d5261e9956439ce9745c5e2ae6dcf /app
parent86342966a1b61d30dca019e983235aadc14a36ef (diff)
parent939391af7bc471f1588ab75ab0cf08d8e4286a05 (diff)
downloadgitlab-ce-9ab4c5b735e0e121996b092cb20bcdc423045c5e.tar.gz
Merge branch '14256-upload-destroy-removes-file' into 'master'
Uploads should delete files when destroyed Closes #14256 See merge request gitlab-org/gitlab-ce!16799
Diffstat (limited to 'app')
-rw-r--r--app/models/upload.rb8
-rw-r--r--app/uploaders/file_uploader.rb6
2 files changed, 14 insertions, 0 deletions
diff --git a/app/models/upload.rb b/app/models/upload.rb
index 2024228537a..99ad37dc892 100644
--- a/app/models/upload.rb
+++ b/app/models/upload.rb
@@ -12,6 +12,10 @@ class Upload < ActiveRecord::Base
before_save :calculate_checksum!, if: :foreground_checksummable?
after_commit :schedule_checksum, if: :checksummable?
+ # as the FileUploader is not mounted, the default CarrierWave ActiveRecord
+ # hooks are not executed and the file will not be deleted
+ after_destroy :delete_file!, if: -> { uploader_class <= FileUploader }
+
def self.hexdigest(path)
Digest::SHA256.file(path).hexdigest
end
@@ -49,6 +53,10 @@ class Upload < ActiveRecord::Base
private
+ def delete_file!
+ build_uploader.remove!
+ end
+
def checksummable?
checksum.nil? && local? && exist?
end
diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb
index 2310e67cb2e..bde1161dfa8 100644
--- a/app/uploaders/file_uploader.rb
+++ b/app/uploaders/file_uploader.rb
@@ -15,6 +15,8 @@ class FileUploader < GitlabUploader
storage :file
+ after :remove, :prune_store_dir
+
def self.root
File.join(options.storage_path, 'uploads')
end
@@ -140,6 +142,10 @@ class FileUploader < GitlabUploader
end
end
+ def prune_store_dir
+ storage.delete_dir!(store_dir) # only remove when empty
+ end
+
def markdown_name
(image_or_video? ? File.basename(filename, File.extname(filename)) : filename).gsub("]", "\\]")
end