about summary refs log tree commit diff
path: root/lib/mastodon/migration_warning.rb
blob: 227f6705d3fc3557620b869618225989d36dfda5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# frozen_string_literal: true

module Mastodon
  module MigrationWarning
    WARNING_SECONDS = 10

    DEFAULT_WARNING = <<~WARNING_MESSAGE
      WARNING: This migration may take a *long* time for large instances.
      It will *not* lock tables for any significant time, but it may run
      for a very long time. We will pause for #{WARNING_SECONDS} seconds to allow you to
      interrupt this migration if you are not ready.
    WARNING_MESSAGE

    def migration_duration_warning(explanation = nil)
      return unless valid_environment?

      announce_warning(explanation)

      announce_countdown
    end

    private

    def announce_countdown
      WARNING_SECONDS.downto(1) do |i|
        say "Continuing in #{i} second#{i == 1 ? '' : 's'}...", true
        sleep 1
      end
    end

    def valid_environment?
      $stdout.isatty && Rails.env.production?
    end

    def announce_warning(explanation)
      announce_message prepare_message(explanation)
    end

    def announce_message(text)
      say ''
      text.each_line do |line|
        say(line)
      end
      say ''
    end

    def prepare_message(explanation)
      if explanation.blank?
        DEFAULT_WARNING
      else
        DEFAULT_WARNING + "\n#{explanation}"
      end
    end
  end
end