diff --git a/lib/backup/database.rb b/lib/backup/database.rb index e3686947164d07123a9a5c71351f6485a5623e20..851445f703d10e9ed4cde1605b0fa629b9f468bb 100644 --- a/lib/backup/database.rb +++ b/lib/backup/database.rb @@ -8,6 +8,14 @@ class Database attr_reader :progress attr_reader :config, :db_file_name + IGNORED_ERRORS = [ + # Ignore the DROP errors; recent database dumps will use --if-exists with pg_dump + /does not exist$/, + # User may not have permissions to drop extensions or schemas + /must be owner of/ + ].freeze + IGNORED_ERRORS_REGEXP = Regexp.union(IGNORED_ERRORS).freeze + def initialize(progress, filename: nil) @progress = progress @config = YAML.load_file(File.join(Rails.root, 'config', 'database.yml'))[Rails.env] @@ -49,6 +57,8 @@ def dump end report_success(success) + progress.flush + raise Backup::Error, 'Backup failed' unless success end @@ -83,6 +93,10 @@ def restore protected + def ignore_error?(line) + IGNORED_ERRORS_REGEXP.match?(line) + end + def execute_and_track_errors(cmd, decompress_rd) errors = [] @@ -97,8 +111,7 @@ def execute_and_track_errors(cmd, decompress_rd) err_reader = Thread.new do until (raw_line = stderr.gets).nil? warn(raw_line) - # Recent database dumps will use --if-exists with pg_dump - errors << raw_line unless raw_line =~ /does not exist$/ + errors << raw_line unless ignore_error?(raw_line) end end diff --git a/spec/lib/backup/database_spec.rb b/spec/lib/backup/database_spec.rb index 95883062fa0129f055feab717e8c42499bae857d..fccd6db00184db139c25d688d6fce7bec7c01b18 100644 --- a/spec/lib/backup/database_spec.rb +++ b/spec/lib/backup/database_spec.rb @@ -38,7 +38,7 @@ context 'when the restore command prints errors' do let(:visible_error) { "This is a test error\n" } - let(:noise) { "Table projects does not exist\n" } + let(:noise) { "Table projects does not exist\nmust be owner of extension pg_trgm\n" } let(:cmd) { %W[#{Gem.ruby} -e $stderr.write("#{noise}#{visible_error}")] } it 'filters out noise from errors' do