imap-backup 5.2.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -2
  3. data/docs/development.md +10 -4
  4. data/imap-backup.gemspec +5 -1
  5. data/lib/cli_coverage.rb +11 -11
  6. data/lib/email/provider/base.rb +2 -0
  7. data/lib/email/provider/unknown.rb +2 -0
  8. data/lib/email/provider.rb +2 -0
  9. data/lib/imap/backup/account/connection/backup_folders.rb +27 -0
  10. data/lib/imap/backup/account/connection/client_factory.rb +54 -0
  11. data/lib/imap/backup/account/connection/folder_names.rb +26 -0
  12. data/lib/imap/backup/account/connection.rb +17 -105
  13. data/lib/imap/backup/account/folder.rb +9 -6
  14. data/lib/imap/backup/account.rb +36 -16
  15. data/lib/imap/backup/cli/backup.rb +1 -3
  16. data/lib/imap/backup/cli/folders.rb +3 -3
  17. data/lib/imap/backup/cli/helpers.rb +24 -22
  18. data/lib/imap/backup/cli/local.rb +20 -13
  19. data/lib/imap/backup/cli/migrate.rb +5 -11
  20. data/lib/imap/backup/cli/restore.rb +8 -7
  21. data/lib/imap/backup/cli/setup.rb +10 -8
  22. data/lib/imap/backup/cli/stats.rb +78 -0
  23. data/lib/imap/backup/cli/status.rb +2 -2
  24. data/lib/imap/backup/cli/utils.rb +6 -8
  25. data/lib/imap/backup/cli.rb +24 -3
  26. data/lib/imap/backup/configuration.rb +9 -21
  27. data/lib/imap/backup/downloader.rb +56 -34
  28. data/lib/imap/backup/migrator.rb +5 -5
  29. data/lib/imap/backup/sanitizer.rb +3 -2
  30. data/lib/imap/backup/serializer/appender.rb +49 -0
  31. data/lib/imap/backup/serializer/directory.rb +37 -0
  32. data/lib/imap/backup/serializer/imap.rb +144 -0
  33. data/lib/imap/backup/serializer/mbox.rb +33 -88
  34. data/lib/imap/backup/serializer/mbox_enumerator.rb +2 -0
  35. data/lib/imap/backup/serializer/message_enumerator.rb +29 -0
  36. data/lib/imap/backup/serializer/unused_name_finder.rb +25 -0
  37. data/lib/imap/backup/serializer.rb +160 -3
  38. data/lib/imap/backup/setup/account/header.rb +75 -0
  39. data/lib/imap/backup/setup/account.rb +41 -95
  40. data/lib/imap/backup/setup/asker.rb +4 -15
  41. data/lib/imap/backup/setup/backup_path.rb +41 -0
  42. data/lib/imap/backup/setup/email.rb +45 -0
  43. data/lib/imap/backup/setup/folder_chooser.rb +3 -3
  44. data/lib/imap/backup/setup/helpers.rb +2 -2
  45. data/lib/imap/backup/setup.rb +5 -4
  46. data/lib/imap/backup/thunderbird/mailbox_exporter.rb +41 -22
  47. data/lib/imap/backup/uploader.rb +46 -8
  48. data/lib/imap/backup/utils.rb +1 -1
  49. data/lib/imap/backup/version.rb +3 -3
  50. data/lib/imap/backup.rb +0 -2
  51. metadata +31 -105
  52. data/lib/imap/backup/serializer/mbox_store.rb +0 -217
  53. data/spec/features/backup_spec.rb +0 -108
  54. data/spec/features/configuration/minimal_configuration.rb +0 -15
  55. data/spec/features/configuration/missing_configuration.rb +0 -14
  56. data/spec/features/folders_spec.rb +0 -36
  57. data/spec/features/helper.rb +0 -2
  58. data/spec/features/local/list_accounts_spec.rb +0 -12
  59. data/spec/features/local/list_emails_spec.rb +0 -21
  60. data/spec/features/local/list_folders_spec.rb +0 -21
  61. data/spec/features/local/show_an_email_spec.rb +0 -34
  62. data/spec/features/migrate_spec.rb +0 -35
  63. data/spec/features/remote/list_account_folders_spec.rb +0 -16
  64. data/spec/features/restore_spec.rb +0 -162
  65. data/spec/features/status_spec.rb +0 -43
  66. data/spec/features/support/aruba.rb +0 -77
  67. data/spec/features/support/backup_directory.rb +0 -43
  68. data/spec/features/support/email_server.rb +0 -110
  69. data/spec/features/support/shared/connection_context.rb +0 -14
  70. data/spec/features/support/shared/message_fixtures.rb +0 -16
  71. data/spec/fixtures/connection.yml +0 -7
  72. data/spec/spec_helper.rb +0 -15
  73. data/spec/support/fixtures.rb +0 -11
  74. data/spec/support/higline_test_helpers.rb +0 -8
  75. data/spec/support/silence_logging.rb +0 -7
  76. data/spec/unit/email/mboxrd/message_spec.rb +0 -177
  77. data/spec/unit/email/provider/apple_mail_spec.rb +0 -7
  78. data/spec/unit/email/provider/base_spec.rb +0 -11
  79. data/spec/unit/email/provider/fastmail_spec.rb +0 -7
  80. data/spec/unit/email/provider/gmail_spec.rb +0 -7
  81. data/spec/unit/email/provider_spec.rb +0 -27
  82. data/spec/unit/imap/backup/account/connection_spec.rb +0 -405
  83. data/spec/unit/imap/backup/account/folder_spec.rb +0 -251
  84. data/spec/unit/imap/backup/cli/accounts_spec.rb +0 -47
  85. data/spec/unit/imap/backup/cli/helpers_spec.rb +0 -87
  86. data/spec/unit/imap/backup/cli/local_spec.rb +0 -81
  87. data/spec/unit/imap/backup/cli/utils_spec.rb +0 -62
  88. data/spec/unit/imap/backup/client/default_spec.rb +0 -22
  89. data/spec/unit/imap/backup/configuration_spec.rb +0 -238
  90. data/spec/unit/imap/backup/downloader_spec.rb +0 -44
  91. data/spec/unit/imap/backup/logger_spec.rb +0 -48
  92. data/spec/unit/imap/backup/migrator_spec.rb +0 -58
  93. data/spec/unit/imap/backup/serializer/mbox_enumerator_spec.rb +0 -45
  94. data/spec/unit/imap/backup/serializer/mbox_spec.rb +0 -222
  95. data/spec/unit/imap/backup/serializer/mbox_store_spec.rb +0 -329
  96. data/spec/unit/imap/backup/setup/account_spec.rb +0 -366
  97. data/spec/unit/imap/backup/setup/asker_spec.rb +0 -137
  98. data/spec/unit/imap/backup/setup/connection_tester_spec.rb +0 -51
  99. data/spec/unit/imap/backup/setup/folder_chooser_spec.rb +0 -146
  100. data/spec/unit/imap/backup/setup_spec.rb +0 -301
  101. data/spec/unit/imap/backup/uploader_spec.rb +0 -54
  102. data/spec/unit/imap/backup/utils_spec.rb +0 -92
@@ -1,11 +1,19 @@
1
- require "imap/backup/setup/helpers"
1
+ require "imap/backup/setup/account/header"
2
+ require "imap/backup/setup/backup_path"
3
+ require "imap/backup/setup/email"
2
4
 
3
5
  module Imap::Backup
4
6
  class Setup; end
5
7
 
6
- Setup::Account = Struct.new(:config, :account, :highline) do
8
+ class Setup::Account
9
+ attr_reader :account
10
+ attr_reader :config
11
+ attr_reader :highline
12
+
7
13
  def initialize(config, account, highline)
8
- super
14
+ @account = account
15
+ @config = config
16
+ @highline = highline
9
17
  end
10
18
 
11
19
  def run
@@ -26,6 +34,7 @@ module Imap::Backup
26
34
  modify_password menu
27
35
  modify_backup_path menu
28
36
  choose_folders menu
37
+ modify_multi_fetch_size menu
29
38
  modify_server menu
30
39
  modify_connection_options menu
31
40
  test_connection menu
@@ -36,47 +45,12 @@ module Imap::Backup
36
45
  end
37
46
 
38
47
  def header(menu)
39
- modified = account.modified? ? "*" : ""
40
- connection_options =
41
- if account.connection_options
42
- escaped =
43
- JSON.generate(account.connection_options).
44
- gsub('"', '\"')
45
- "\n connection options #{escaped}"
46
- end
47
- menu.header = <<~HEADER.chomp
48
- #{helpers.title_prefix} Account#{modified}
49
-
50
- email #{account.username}
51
- password #{masked_password}
52
- path #{account.local_path}
53
- folders #{folders.map { |f| f[:name] }.join(', ')}
54
- server #{account.server}#{connection_options}
55
-
56
- Choose an action
57
- HEADER
48
+ Setup::Account::Header.new(menu: menu, account: account).run
58
49
  end
59
50
 
60
51
  def modify_email(menu)
61
52
  menu.choice("modify email") do
62
- username = Setup::Asker.email(username)
63
- Kernel.puts "username: #{username}"
64
- other_accounts = config.accounts.reject { |a| a == account }
65
- others = other_accounts.map { |a| a.username }
66
- Kernel.puts "others: #{others.inspect}"
67
- if others.include?(username)
68
- Kernel.puts(
69
- "There is already an account set up with that email address"
70
- )
71
- else
72
- account.username = username
73
- # rubocop:disable Style/IfUnlessModifier
74
- default = default_server(username)
75
- if default && (account.server.nil? || (account.server == ""))
76
- account.server = default
77
- end
78
- # rubocop:enable Style/IfUnlessModifier
79
- end
53
+ Setup::Email.new(account: account, config: config).run
80
54
  end
81
55
  end
82
56
 
@@ -88,45 +62,44 @@ module Imap::Backup
88
62
  end
89
63
  end
90
64
 
91
- def modify_server(menu)
92
- menu.choice("modify server") do
93
- server = highline.ask("server: ")
94
- account.server = server if !server.nil?
65
+ def modify_backup_path(menu)
66
+ menu.choice("modify backup path") do
67
+ Setup::BackupPath.new(account: account, config: config).run
95
68
  end
96
69
  end
97
70
 
98
- def modify_connection_options(menu)
99
- menu.choice("modify connection options") do
100
- connection_options = highline.ask("connections options (as JSON): ")
101
- account.connection_options = connection_options if !connection_options.nil?
71
+ def choose_folders(menu)
72
+ menu.choice("choose backup folders") do
73
+ Setup::FolderChooser.new(account).run
102
74
  end
103
75
  end
104
76
 
105
- def path_modification_validator(path)
106
- same = config.accounts.find do |a|
107
- a.username != account.username && a.local_path == path
108
- end
109
- if same
110
- Kernel.puts "The path '#{path}' is used to backup " \
111
- "the account '#{same.username}'"
112
- false
113
- else
114
- true
77
+ def modify_multi_fetch_size(menu)
78
+ menu.choice("modify multi-fetch size (number of emails to fetch at a time)") do
79
+ size = highline.ask("size: ")
80
+ int = size.to_i
81
+ account.multi_fetch_size = int if int.positive?
115
82
  end
116
83
  end
117
84
 
118
- def modify_backup_path(menu)
119
- menu.choice("modify backup path") do
120
- existing = account.local_path.clone
121
- account.local_path = Setup::Asker.backup_path(
122
- account.local_path, ->(path) { path_modification_validator(path) }
123
- )
85
+ def modify_server(menu)
86
+ menu.choice("modify server") do
87
+ server = highline.ask("server: ")
88
+ account.server = server if !server.nil?
124
89
  end
125
90
  end
126
91
 
127
- def choose_folders(menu)
128
- menu.choice("choose backup folders") do
129
- Setup::FolderChooser.new(account).run
92
+ def modify_connection_options(menu)
93
+ menu.choice("modify connection options") do
94
+ connection_options = highline.ask("connections options (as JSON): ")
95
+ if !connection_options.nil?
96
+ begin
97
+ account.connection_options = connection_options
98
+ rescue JSON::ParserError
99
+ Kernel.puts "Malformed JSON, please try again"
100
+ highline.ask "Press a key "
101
+ end
102
+ end
130
103
  end
131
104
  end
132
105
 
@@ -141,37 +114,10 @@ module Imap::Backup
141
114
  def delete_account(menu)
142
115
  menu.choice("delete") do
143
116
  if highline.agree("Are you sure? (y/n) ")
144
- account.mark_for_deletion!
117
+ account.mark_for_deletion
145
118
  throw :done
146
119
  end
147
120
  end
148
121
  end
149
-
150
- def folders
151
- account.folders || []
152
- end
153
-
154
- def masked_password
155
- if (account.password == "") || account.password.nil?
156
- "(unset)"
157
- else
158
- account.password.gsub(/./, "x")
159
- end
160
- end
161
-
162
- def default_server(username)
163
- provider = Email::Provider.for_address(username)
164
-
165
- if provider.is_a?(Email::Provider::Unknown)
166
- Kernel.puts "Can't decide provider for email address '#{username}'"
167
- return nil
168
- end
169
-
170
- provider.host
171
- end
172
-
173
- def helpers
174
- Setup::Helpers.new
175
- end
176
122
  end
177
123
  end
@@ -1,11 +1,13 @@
1
1
  module Imap::Backup
2
2
  class Setup; end
3
3
 
4
- Setup::Asker = Struct.new(:highline) do
4
+ class Setup::Asker
5
5
  EMAIL_MATCHER = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$/i.freeze
6
6
 
7
+ attr_reader :highline
8
+
7
9
  def initialize(highline)
8
- super
10
+ @highline = highline
9
11
  end
10
12
 
11
13
  def email(default = "")
@@ -30,15 +32,6 @@ module Imap::Backup
30
32
  password
31
33
  end
32
34
 
33
- def backup_path(default, validator)
34
- highline.ask("backup directory: ") do |q|
35
- q.default = default
36
- q.readline = true
37
- q.validate = validator
38
- q.responses[:not_valid] = "Choose a different directory "
39
- end
40
- end
41
-
42
35
  def self.email(default = "")
43
36
  new(Setup.highline).email(default)
44
37
  end
@@ -46,9 +39,5 @@ module Imap::Backup
46
39
  def self.password
47
40
  new(Setup.highline).password
48
41
  end
49
-
50
- def self.backup_path(default, validator)
51
- new(Setup.highline).backup_path(default, validator)
52
- end
53
42
  end
54
43
  end
@@ -0,0 +1,41 @@
1
+ module Imap::Backup
2
+ class Setup; end
3
+
4
+ class Setup::BackupPath
5
+ attr_reader :account
6
+ attr_reader :config
7
+
8
+ def initialize(account:, config:)
9
+ @account = account
10
+ @config = config
11
+ end
12
+
13
+ def run
14
+ account.local_path = highline.ask("backup directory: ") do |q|
15
+ q.default = account.local_path
16
+ q.readline = true
17
+ q.validate = ->(path) { path_modification_validator(path) }
18
+ q.responses[:not_valid] = "Choose a different directory "
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def highline
25
+ Setup.highline
26
+ end
27
+
28
+ def path_modification_validator(path)
29
+ same = config.accounts.find do |a|
30
+ a.username != account.username && a.local_path == path
31
+ end
32
+ if same
33
+ Kernel.puts "The path '#{path}' is used to backup " \
34
+ "the account '#{same.username}'"
35
+ false
36
+ else
37
+ true
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,45 @@
1
+ require "email/provider"
2
+
3
+ module Imap::Backup
4
+ class Setup; end
5
+
6
+ class Setup::Email
7
+ attr_reader :account
8
+ attr_reader :config
9
+
10
+ def initialize(account:, config:)
11
+ @account = account
12
+ @config = config
13
+ end
14
+
15
+ def run
16
+ username = Setup::Asker.email(account.username)
17
+ other_accounts = config.accounts.reject { |a| a == account }
18
+ others = other_accounts.map(&:username)
19
+ if others.include?(username)
20
+ Kernel.puts(
21
+ "There is already an account set up with that email address"
22
+ )
23
+ else
24
+ account.username = username
25
+ if account.server.nil? || (account.server == "")
26
+ default = default_server(username)
27
+ account.server = default if default
28
+ end
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def default_server(username)
35
+ provider = Email::Provider.for_address(username)
36
+
37
+ if provider.is_a?(Email::Provider::Unknown)
38
+ Kernel.puts "Can't decide provider for email address '#{username}'"
39
+ return nil
40
+ end
41
+
42
+ provider.host
43
+ end
44
+ end
45
+ end
@@ -12,13 +12,13 @@ module Imap::Backup
12
12
 
13
13
  def run
14
14
  if connection.nil?
15
- Imap::Backup::Logger.logger.warn "Connection failed"
15
+ Logger.logger.warn "Connection failed"
16
16
  highline.ask "Press a key "
17
17
  return
18
18
  end
19
19
 
20
20
  if imap_folders.nil?
21
- Imap::Backup::Logger.logger.warn "Unable to get folder list"
21
+ Logger.logger.warn "Unable to get folder list"
22
22
  highline.ask "Press a key "
23
23
  return
24
24
  end
@@ -90,7 +90,7 @@ module Imap::Backup
90
90
 
91
91
  def toggle_selection(folder_name)
92
92
  if selected?(folder_name)
93
- new_list = account.folders.select { |f| f[:name] != folder_name }
93
+ new_list = account.folders.reject { |f| f[:name] == folder_name }
94
94
  account.folders = new_list
95
95
  else
96
96
  existing = account.folders || []
@@ -5,11 +5,11 @@ module Imap::Backup
5
5
 
6
6
  class Setup::Helpers
7
7
  def title_prefix
8
- "imap-backup "
8
+ "imap-backup -"
9
9
  end
10
10
 
11
11
  def version
12
- Version::VERSION
12
+ VERSION
13
13
  end
14
14
  end
15
15
  end
@@ -1,5 +1,6 @@
1
1
  require "highline"
2
2
 
3
+ require "email/provider"
3
4
  require "imap/backup/account"
4
5
  require "imap/backup/setup/helpers"
5
6
 
@@ -36,7 +37,7 @@ module Imap::Backup
36
37
  config.save
37
38
  throw :done
38
39
  end
39
- menu.choice("exit without saving changes") { throw :done }
40
+ menu.choice("exit without saving changes") { throw :done }
40
41
  else
41
42
  menu.choice("quit") { throw :done }
42
43
  end
@@ -67,7 +68,7 @@ module Imap::Backup
67
68
  new_setting = !config.debug?
68
69
  menu.choice(menu_item) do
69
70
  config.debug = new_setting
70
- Imap::Backup::Logger.setup_logging(config)
71
+ Logger.setup_logging(config)
71
72
  end
72
73
  end
73
74
 
@@ -76,13 +77,13 @@ module Imap::Backup
76
77
  end
77
78
 
78
79
  def default_account_config(username)
79
- ::Imap::Backup::Account.new(
80
+ Imap::Backup::Account.new(
80
81
  username: username,
81
82
  password: "",
82
83
  local_path: File.join(config.path, username.tr("@", "_")),
83
84
  folders: []
84
85
  ).tap do |a|
85
- server = Email::Provider.for_address(username)
86
+ server = ::Email::Provider.for_address(username)
86
87
  a.server = server.host if server.host
87
88
  end
88
89
  end
@@ -19,30 +19,53 @@ module Imap::Backup
19
19
 
20
20
  def run
21
21
  local_folder_ok = local_folder.set_up
22
- return if !local_folder_ok
23
-
24
- if local_folder.msf_exists?
25
- if force
26
- Kernel.puts "Deleting '#{local_folder.msf_path}' as --force option was supplied"
27
- File.unlink local_folder.msf_path
28
- else
29
- Kernel.puts "Skipping export of '#{serializer.folder}' as '#{local_folder.msf_path}' exists"
30
- return false
31
- end
22
+ return false if !local_folder_ok
23
+
24
+ skip_for_msf = check_msf
25
+ return false if skip_for_msf
26
+
27
+ skip_for_local_folder = check_local_folder
28
+ return false if skip_for_local_folder
29
+
30
+ copy_messages
31
+
32
+ true
33
+ end
34
+
35
+ private
36
+
37
+ def check_local_folder
38
+ return false if !local_folder.exists?
39
+
40
+ if force
41
+ Kernel.puts "Overwriting '#{local_folder.path}' as --force option was supplied"
42
+ return false
32
43
  end
33
44
 
34
- if local_folder.exists?
35
- if force
36
- Kernel.puts "Overwriting '#{local_folder.path}' as --force option was supplied"
37
- else
38
- Kernel.puts "Skipping export of '#{serializer.folder}' as '#{local_folder.path}' exists"
39
- return false
40
- end
45
+ Kernel.puts "Skipping export of '#{serializer.folder}' as '#{local_folder.path}' exists"
46
+ true
47
+ end
48
+
49
+ def check_msf
50
+ return false if !local_folder.msf_exists?
51
+
52
+ if force
53
+ Kernel.puts "Deleting '#{local_folder.msf_path}' as --force option was supplied"
54
+ File.unlink local_folder.msf_path
55
+ return false
41
56
  end
42
57
 
58
+ Kernel.puts(
59
+ "Skipping export of '#{serializer.folder}' " \
60
+ "as '#{local_folder.msf_path}' exists"
61
+ )
62
+ true
63
+ end
64
+
65
+ def copy_messages
43
66
  File.open(local_folder.full_path, "w") do |f|
44
67
  enumerator = Serializer::MboxEnumerator.new(serializer.mbox_pathname)
45
- enumerator.each.with_index do |raw, i|
68
+ enumerator.each do |raw|
46
69
  clean = Email::Mboxrd::Message.clean_serialized(raw)
47
70
  timestamp = Time.now.strftime("%a %b %d %H:%M:%S %Y")
48
71
  thunderbird_fom_line = "From - #{timestamp}"
@@ -50,12 +73,8 @@ module Imap::Backup
50
73
  f.write output
51
74
  end
52
75
  end
53
-
54
- true
55
76
  end
56
77
 
57
- private
58
-
59
78
  def local_folder
60
79
  @local_folder ||= begin
61
80
  top_level_folders = [EXPORT_PREFIX, email]
@@ -9,27 +9,65 @@ module Imap::Backup
9
9
  end
10
10
 
11
11
  def run
12
- count = missing_uids.count
12
+ if folder.uids.any?
13
+ rename_serialized_folder
14
+ else
15
+ folder.create
16
+ serializer.force_uid_validity(folder.uid_validity)
17
+ end
18
+
13
19
  return if count.zero?
14
20
 
15
- Imap::Backup::Logger.logger.debug "[#{folder.name}] #{count} to restore"
21
+ Logger.logger.debug "[#{folder.name}] #{count} to restore"
16
22
  serializer.each_message(missing_uids).with_index do |(uid, message), i|
17
- next if message.nil?
23
+ upload_message uid, message, i + 1
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def upload_message(uid, message, index)
30
+ return if message.nil?
18
31
 
19
- log_prefix = "[#{folder.name}] uid: #{uid} (#{i + 1}/#{count}) -"
20
- Imap::Backup::Logger.logger.debug(
21
- "#{log_prefix} #{message.supplied_body.size} bytes"
22
- )
32
+ log_prefix = "[#{folder.name}] uid: #{uid} (#{index}/#{count}) -"
33
+ Logger.logger.debug(
34
+ "#{log_prefix} #{message.supplied_body.size} bytes"
35
+ )
23
36
 
37
+ begin
24
38
  new_uid = folder.append(message)
25
39
  serializer.update_uid(uid, new_uid)
40
+ rescue StandardError => e
41
+ Logger.logger.warn "#{log_prefix} append error: #{e}"
26
42
  end
27
43
  end
28
44
 
29
- private
45
+ def count
46
+ @count ||= missing_uids.count
47
+ end
30
48
 
31
49
  def missing_uids
32
50
  serializer.uids - folder.uids
33
51
  end
52
+
53
+ def rename_serialized_folder
54
+ Logger.logger.debug(
55
+ "There's already a '#{folder.name}' folder with emails"
56
+ )
57
+
58
+ # Rename the local folder to a unique name
59
+ new_name = serializer.apply_uid_validity(folder.uid_validity)
60
+
61
+ return if !new_name
62
+
63
+ # Restore the renamed folder
64
+ Logger.logger.debug(
65
+ "Backup '#{serializer.folder}' renamed and restored to '#{new_name}'"
66
+ )
67
+ @folder = Account::Folder.new(folder.connection, new_name)
68
+ folder.create
69
+ @serializer = Serializer.new(serializer.path, new_name)
70
+ serializer.force_uid_validity(@folder.uid_validity)
71
+ end
34
72
  end
35
73
  end
@@ -11,7 +11,7 @@ module Imap::Backup
11
11
 
12
12
  message = format(
13
13
  "Permissions on '%<filename>s' " \
14
- "should be 0%<limit>o, not 0%<actual>o",
14
+ "should be 0%<limit>o, not 0%<actual>o",
15
15
  filename: filename, limit: limit, actual: actual
16
16
  )
17
17
  raise message
@@ -1,9 +1,9 @@
1
1
  module Imap; end
2
2
 
3
3
  module Imap::Backup
4
- MAJOR = 5
5
- MINOR = 2
6
- REVISION = 0
4
+ MAJOR = 6
5
+ MINOR = 0
6
+ REVISION = 1
7
7
  PRE = nil
8
8
  VERSION = [MAJOR, MINOR, REVISION, PRE].compact.map(&:to_s).join(".")
9
9
  end
data/lib/imap/backup.rb CHANGED
@@ -8,14 +8,12 @@ require "imap/backup/downloader"
8
8
  require "imap/backup/logger"
9
9
  require "imap/backup/uploader"
10
10
  require "imap/backup/serializer"
11
- require "imap/backup/serializer/mbox"
12
11
  require "imap/backup/setup"
13
12
  require "imap/backup/setup/account"
14
13
  require "imap/backup/setup/asker"
15
14
  require "imap/backup/setup/connection_tester"
16
15
  require "imap/backup/setup/folder_chooser"
17
16
  require "imap/backup/version"
18
- require "email/provider"
19
17
 
20
18
  module Imap::Backup
21
19
  class ConfigurationNotFound < StandardError; end