FIX: Backups should use relative paths for local uploads
This also ensures that restoring a backup works when it was created with the wrong upload paths in the time between ab4c0a4970
(shortly after v2.6.0.beta1) and this fix.
This commit is contained in:
parent
2fac77cc48
commit
f51ccea028
|
@ -67,6 +67,8 @@ module BackupRestore
|
|||
log "Unzipping archive, this may take a while..."
|
||||
Discourse::Utils.execute_command(
|
||||
'tar', '--extract', '--gzip', '--file', @archive_path, '--directory', @tmp_directory,
|
||||
'--transform', 's|var/www/discourse/public/uploads/|uploads/|',
|
||||
# the transformation is a workaround for a bug which existed between v2.6.0.beta1 and v2.6.0.beta2
|
||||
failure_message: "Failed to decompress archive."
|
||||
)
|
||||
end
|
||||
|
|
|
@ -234,15 +234,17 @@ module BackupRestore
|
|||
log "Archiving uploads..."
|
||||
|
||||
if has_local_uploads?
|
||||
upload_directory = Discourse.store.upload_path
|
||||
|
||||
if SiteSetting.include_thumbnails_in_backups
|
||||
exclude_optimized = ""
|
||||
else
|
||||
optimized_path = File.join(local_uploads_directory, 'optimized')
|
||||
optimized_path = File.join(upload_directory, 'optimized')
|
||||
exclude_optimized = "--exclude=#{optimized_path}"
|
||||
end
|
||||
|
||||
Discourse::Utils.execute_command(
|
||||
'tar', '--append', '--dereference', exclude_optimized, '--file', tar_filename, local_uploads_directory,
|
||||
'tar', '--append', '--dereference', exclude_optimized, '--file', tar_filename, upload_directory,
|
||||
failure_message: "Failed to archive uploads.", success_status_codes: [0, 1],
|
||||
chdir: File.join(Rails.root, "public")
|
||||
)
|
||||
|
|
Binary file not shown.
|
@ -7,7 +7,7 @@ describe BackupRestore::BackupFileHandler do
|
|||
include_context "shared stuff"
|
||||
|
||||
def expect_decompress_and_clean_up_to_work(backup_filename:, expected_dump_filename: "dump.sql",
|
||||
require_metadata_file:, require_uploads:)
|
||||
require_metadata_file:, require_uploads:, expected_upload_paths: nil)
|
||||
|
||||
freeze_time(DateTime.parse('2019-12-24 14:31:48'))
|
||||
|
||||
|
@ -31,8 +31,13 @@ describe BackupRestore::BackupFileHandler do
|
|||
expect(File.exist?(File.join(tmp_directory, "meta.json"))).to eq(require_metadata_file)
|
||||
|
||||
if require_uploads
|
||||
upload_filename = "uploads/default/original/3X/b/d/bd269860bb508aebcb6f08fe7289d5f117830383.png"
|
||||
expect(File.exist?(File.join(tmp_directory, upload_filename))).to eq(true)
|
||||
expected_upload_paths ||= ["uploads/default/original/3X/b/d/bd269860bb508aebcb6f08fe7289d5f117830383.png"]
|
||||
|
||||
expected_upload_paths.each do |upload_path|
|
||||
absolute_upload_path = File.join(tmp_directory, upload_path)
|
||||
expect(File.exist?(absolute_upload_path)).to eq(true), "expected file #{upload_path} does not exist"
|
||||
yield(absolute_upload_path) if block_given?
|
||||
end
|
||||
else
|
||||
expect(Dir.exist?(File.join(tmp_directory, "uploads"))).to eq(false)
|
||||
end
|
||||
|
@ -74,4 +79,26 @@ describe BackupRestore::BackupFileHandler do
|
|||
require_uploads: false
|
||||
)
|
||||
end
|
||||
|
||||
it "works with backup file which uses wrong upload path" do
|
||||
expect_decompress_and_clean_up_to_work(
|
||||
backup_filename: "backup_with_wrong_upload_path.tar.gz",
|
||||
require_metadata_file: false,
|
||||
require_uploads: true,
|
||||
expected_upload_paths: [
|
||||
"uploads/default/original/1X/both.txt",
|
||||
"uploads/default/original/1X/only-uploads.txt",
|
||||
"uploads/default/original/1X/only-var.txt"
|
||||
]
|
||||
) do |upload_path|
|
||||
content = File.read(upload_path).chomp
|
||||
|
||||
case File.basename(upload_path)
|
||||
when "both.txt", "only-var.txt"
|
||||
expect(content).to eq("var")
|
||||
when "only-uploads.txt"
|
||||
expect(content).to eq("uploads")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue