imap-backup 11.0.1 → 11.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12d5752520f0b47c240fe8bc3ac7e600bea9229804c9f2c22c2b5c5218818e79
4
- data.tar.gz: 67da4a6a56f0914ad18f44340c52b759d0a5a74a70f32aafd0bb0600fd34c4e9
3
+ metadata.gz: fce713a5edcf2115c1f8636cfe7b6521aae0403a9bb79dfaf05b484363dbb7ad
4
+ data.tar.gz: 68544128dba3ade90077683c14d454596a514368cb40a46094934ec94220a606
5
5
  SHA512:
6
- metadata.gz: 0ab9fe8ce61dcfe6efcbf77415eab8bc6fb4813f10cf4b7f33f7378ac00977a5bb106086e201168bfb8117be3957c7aa9b4bdb513255ab0100fa8b7064f3b2b8
7
- data.tar.gz: 14f878065e0603ca18d298f6d209ad1df51d9814487c11fee7ab31b05212a29ad162052831fc95b848abf65ec1ef4152d263f8ae4478e21e6873f2d509c13fb8
6
+ metadata.gz: f5b467457df7840d8cf69cc4ace9758cfc2b38242acdb3f4c75a9dd0327c996995aa0986f649725c57e8b058ad0be4d386d9760720a20d505c3154e2a82aa59c
7
+ data.tar.gz: 3dd8a7f189e0d313e487b63fd64d7c57a647d384360e4128f2787cb7673f1db35a05ffb4853603e7bafbe17537a1b309a43a825180a910e45abc202630283eb9
@@ -28,7 +28,9 @@ module Email::Mboxrd
28
28
  end
29
29
 
30
30
  def to_serialized
31
- "From #{from}\n" + mboxrd_body
31
+ from_line = "From #{from}\n"
32
+ body = mboxrd_body.dup.force_encoding(Encoding::UTF_8)
33
+ from_line + body
32
34
  end
33
35
 
34
36
  def date
@@ -1,10 +1,7 @@
1
+ require "imap/backup/account/backup_folders"
2
+ require "imap/backup/account/folder_backup"
1
3
  require "imap/backup/account/folder_ensurer"
2
4
  require "imap/backup/account/local_only_folder_deleter"
3
- require "imap/backup/account/serialized_folders"
4
- require "imap/backup/serializer/delayed_metadata_serializer"
5
- require "imap/backup/downloader"
6
- require "imap/backup/flag_refresher"
7
- require "imap/backup/local_only_message_deleter"
8
5
 
9
6
  module Imap; end
10
7
 
@@ -35,58 +32,8 @@ module Imap::Backup
35
32
  return
36
33
  end
37
34
  backup_folders.each do |folder|
38
- backup_folder folder
35
+ Account::FolderBackup.new(account: account, folder: folder, refresh: refresh).run
39
36
  end
40
37
  end
41
-
42
- private
43
-
44
- def backup_folder(folder)
45
- serializer = Serializer.new(account.local_path, folder.name)
46
- begin
47
- return if !folder.exist?
48
- rescue Encoding::UndefinedConversionError
49
- message = "Skipping backup for '#{folder.name}' " \
50
- "as it is not UTF-7 encoded correctly"
51
- Logger.logger.info message
52
- return
53
- end
54
-
55
- Logger.logger.debug "[#{folder.name}] running backup"
56
-
57
- serializer.apply_uid_validity(folder.uid_validity)
58
-
59
- download_serializer =
60
- case account.download_strategy
61
- when "direct"
62
- serializer
63
- when "delay_metadata"
64
- Serializer::DelayedMetadataSerializer.new(serializer: serializer)
65
- else
66
- raise "Unknown download strategy '#{account.download_strategy}'"
67
- end
68
-
69
- downloader = Downloader.new(
70
- folder,
71
- download_serializer,
72
- multi_fetch_size: account.multi_fetch_size,
73
- reset_seen_flags_after_fetch: account.reset_seen_flags_after_fetch
74
- )
75
- download_serializer.transaction do
76
- downloader.run
77
- rescue StandardError => e
78
- message = <<~ERROR
79
- #{self.class} error #{e}
80
- #{e.backtrace.join("\n")}
81
- ERROR
82
- Logger.logger.error message
83
- raise e
84
- end
85
- if account.mirror_mode
86
- Logger.logger.info "Mirror mode - Deleting messages only present locally"
87
- LocalOnlyMessageDeleter.new(folder, serializer).run
88
- end
89
- FlagRefresher.new(folder, serializer).run if account.mirror_mode || refresh
90
- end
91
38
  end
92
39
  end
@@ -0,0 +1,85 @@
1
+ require "imap/backup/serializer/delayed_metadata_serializer"
2
+ require "imap/backup/downloader"
3
+ require "imap/backup/flag_refresher"
4
+ require "imap/backup/local_only_message_deleter"
5
+
6
+ module Imap; end
7
+
8
+ module Imap::Backup
9
+ class Account; end
10
+
11
+ class Account::FolderBackup
12
+ attr_reader :account
13
+ attr_reader :folder
14
+ attr_reader :refresh
15
+
16
+ def initialize(account:, folder:, refresh: false)
17
+ @account = account
18
+ @folder = folder
19
+ @refresh = refresh
20
+ end
21
+
22
+ def run
23
+ folder_ok = folder_ok?
24
+ return if !folder_ok
25
+
26
+ Logger.logger.debug "[#{folder.name}] running backup"
27
+
28
+ serializer.apply_uid_validity(folder.uid_validity)
29
+
30
+ download_serializer.transaction do
31
+ downloader.run
32
+ end
33
+
34
+ clean_up
35
+ end
36
+
37
+ private
38
+
39
+ def folder_ok?
40
+ begin
41
+ return false if !folder.exist?
42
+ rescue Encoding::UndefinedConversionError
43
+ message = "Skipping backup for '#{folder.name}' " \
44
+ "as it is not UTF-7 encoded correctly"
45
+ Logger.logger.info message
46
+ return false
47
+ end
48
+
49
+ true
50
+ end
51
+
52
+ def clean_up
53
+ if account.mirror_mode
54
+ Logger.logger.info "Mirror mode - Deleting messages only present locally"
55
+ LocalOnlyMessageDeleter.new(folder, serializer).run
56
+ end
57
+ FlagRefresher.new(folder, serializer).run if account.mirror_mode || refresh
58
+ end
59
+
60
+ def downloader
61
+ @downloader ||= Downloader.new(
62
+ folder,
63
+ download_serializer,
64
+ multi_fetch_size: account.multi_fetch_size,
65
+ reset_seen_flags_after_fetch: account.reset_seen_flags_after_fetch
66
+ )
67
+ end
68
+
69
+ def download_serializer
70
+ @download_serializer ||=
71
+ case account.download_strategy
72
+ when "direct"
73
+ serializer
74
+ when "delay_metadata"
75
+ Serializer::DelayedMetadataSerializer.new(serializer: serializer)
76
+ else
77
+ raise "Unknown download strategy '#{account.download_strategy}'"
78
+ end
79
+ end
80
+
81
+ def serializer
82
+ @serializer ||= Serializer.new(account.local_path, folder.name)
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,62 @@
1
+ module Imap; end
2
+
3
+ module Imap::Backup
4
+ class CLI; end
5
+ class CLI::Local < Thor; end
6
+
7
+ class CLI::Local::Check
8
+ include CLI::Helpers
9
+
10
+ attr_reader :options
11
+
12
+ def initialize(options)
13
+ @options = options
14
+ end
15
+
16
+ def run
17
+ results = requested_accounts(config).map do |account|
18
+ serialized_folders = Account::SerializedFolders.new(account: account)
19
+ folder_results = serialized_folders.map do |serializer, _folder|
20
+ serializer.check_integrity!
21
+ {name: serializer.folder, result: "OK"}
22
+ rescue Serializer::FolderIntegrityError => e
23
+ message = e.to_s
24
+ if options[:delete_corrupt]
25
+ serializer.delete
26
+ message << " and has been deleted"
27
+ end
28
+
29
+ {
30
+ name: serializer.folder,
31
+ result: message
32
+ }
33
+ end
34
+ {account: account.username, folders: folder_results}
35
+ end
36
+
37
+ case options[:format]
38
+ when "json"
39
+ print_check_results_as_json(results)
40
+ else
41
+ print_check_results_as_text(results)
42
+ end
43
+ end
44
+
45
+ def print_check_results_as_json(results)
46
+ Kernel.puts results.to_json
47
+ end
48
+
49
+ def print_check_results_as_text(results)
50
+ results.each do |account_results|
51
+ Kernel.puts "Account: #{account_results[:account]}"
52
+ account_results[:folders].each do |folder_results|
53
+ Kernel.puts "\t#{folder_results[:name]}: #{folder_results[:result]}"
54
+ end
55
+ end
56
+ end
57
+
58
+ def config
59
+ @config ||= load_config(**options)
60
+ end
61
+ end
62
+ end
@@ -1,3 +1,6 @@
1
+ require "imap/backup/account/serialized_folders"
2
+ require "imap/backup/cli/local/check"
3
+
1
4
  module Imap; end
2
5
 
3
6
  module Imap::Backup
@@ -38,32 +41,8 @@ module Imap::Backup
38
41
  quiet_option
39
42
  verbose_option
40
43
  def check
41
- results = requested_accounts(config).map do |account|
42
- serialized_folders = Account::SerializedFolders.new(account: account)
43
- folder_results = serialized_folders.map do |serializer, _folder|
44
- serializer.check_integrity!
45
- {name: serializer.folder, result: "OK"}
46
- rescue Serializer::FolderIntegrityError => e
47
- message = e.to_s
48
- if options[:delete_corrupt]
49
- serializer.delete
50
- message << " and has been deleted"
51
- end
52
-
53
- {
54
- name: serializer.folder,
55
- result: message
56
- }
57
- end
58
- {account: account.username, folders: folder_results}
59
- end
60
-
61
- case options[:format]
62
- when "json"
63
- print_check_results_as_json(results)
64
- else
65
- print_check_results_as_text(results)
66
- end
44
+ non_logging_options = Imap::Backup::Logger.setup_logging(options)
45
+ Check.new(non_logging_options).run
67
46
  end
68
47
 
69
48
  desc "folders EMAIL", "List backed up folders"
@@ -138,19 +117,6 @@ module Imap::Backup
138
117
  end
139
118
 
140
119
  no_commands do
141
- def print_check_results_as_json(results)
142
- Kernel.puts results.to_json
143
- end
144
-
145
- def print_check_results_as_text(results)
146
- results.each do |account_results|
147
- Kernel.puts "Account: #{account_results[:account]}"
148
- account_results[:folders].each do |folder_results|
149
- Kernel.puts "\t#{folder_results[:name]}: #{folder_results[:result]}"
150
- end
151
- end
152
- end
153
-
154
120
  def list_emails_as_json(serializer)
155
121
  emails = serializer.each_message.map do |message|
156
122
  {
@@ -18,11 +18,6 @@ module Imap::Backup
18
18
  tsx.begin({savepoint: {length: length}}) do
19
19
  block.call
20
20
  rescue StandardError => e
21
- message = <<~ERROR
22
- #{self.class} error #{e}
23
- #{e.backtrace.join("\n")}
24
- ERROR
25
- Logger.logger.error message
26
21
  rollback
27
22
  raise e
28
23
  rescue SignalException => e
@@ -2,8 +2,8 @@ module Imap; end
2
2
 
3
3
  module Imap::Backup
4
4
  MAJOR = 11
5
- MINOR = 0
6
- REVISION = 1
7
- PRE = nil
5
+ MINOR = 1
6
+ REVISION = 0
7
+ PRE = "rc1".freeze
8
8
  VERSION = [MAJOR, MINOR, REVISION, PRE].compact.map(&:to_s).join(".")
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imap-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 11.0.1
4
+ version: 11.1.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-01 00:00:00.000000000 Z
11
+ date: 2023-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -236,6 +236,7 @@ files:
236
236
  - lib/imap/backup/account/backup_folders.rb
237
237
  - lib/imap/backup/account/client_factory.rb
238
238
  - lib/imap/backup/account/folder.rb
239
+ - lib/imap/backup/account/folder_backup.rb
239
240
  - lib/imap/backup/account/folder_ensurer.rb
240
241
  - lib/imap/backup/account/local_only_folder_deleter.rb
241
242
  - lib/imap/backup/account/restore.rb
@@ -245,6 +246,7 @@ files:
245
246
  - lib/imap/backup/cli/folder_enumerator.rb
246
247
  - lib/imap/backup/cli/helpers.rb
247
248
  - lib/imap/backup/cli/local.rb
249
+ - lib/imap/backup/cli/local/check.rb
248
250
  - lib/imap/backup/cli/migrate.rb
249
251
  - lib/imap/backup/cli/mirror.rb
250
252
  - lib/imap/backup/cli/remote.rb
@@ -310,9 +312,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
310
312
  version: '2.6'
311
313
  required_rubygems_version: !ruby/object:Gem::Requirement
312
314
  requirements:
313
- - - ">="
315
+ - - ">"
314
316
  - !ruby/object:Gem::Version
315
- version: '0'
317
+ version: 1.3.1
316
318
  requirements: []
317
319
  rubygems_version: 3.3.7
318
320
  signing_key: