imap-backup 11.0.0 → 11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1392301e243a9affe750a9361f14622228879596b8cb0a29e4944dd91af52d44
4
- data.tar.gz: d85f59f5387d5f3c5ac1f6ce97a4a2e5a685ca675b02be3982c914774485d5fc
3
+ metadata.gz: 12d5752520f0b47c240fe8bc3ac7e600bea9229804c9f2c22c2b5c5218818e79
4
+ data.tar.gz: 67da4a6a56f0914ad18f44340c52b759d0a5a74a70f32aafd0bb0600fd34c4e9
5
5
  SHA512:
6
- metadata.gz: ef636f637cf6ab48a173439e6d4c908fa7bf0b8a171a7ba60a80b83062e95d30aafba0e52a4647b5c74b23a40b7504132803ad4ddc57907e3b08298e11b9a26c
7
- data.tar.gz: 1274d7462c5e302bd1ea84529b12d74e6cc0ebe47ba6d755e2f23cdb5829dfde6fdde858c2640abea5f6f13eab8e5867334e82f5e4b7649ae41385a49f5706ca
6
+ metadata.gz: 0ab9fe8ce61dcfe6efcbf77415eab8bc6fb4813f10cf4b7f33f7378ac00977a5bb106086e201168bfb8117be3957c7aa9b4bdb513255ab0100fa8b7064f3b2b8
7
+ data.tar.gz: 14f878065e0603ca18d298f6d209ad1df51d9814487c11fee7ab31b05212a29ad162052831fc95b848abf65ec1ef4152d263f8ae4478e21e6873f2d509c13fb8
@@ -27,67 +27,66 @@ module Imap::Backup
27
27
 
28
28
  Account::FolderEnsurer.new(account: account).run
29
29
  Account::LocalOnlyFolderDeleter.new(account: account).run if account.mirror_mode
30
- each_folder do |folder, serializer|
31
- begin
32
- next if !folder.exist?
33
- rescue Encoding::UndefinedConversionError
34
- message = "Skipping backup for '#{folder.name}' " \
35
- "as it is not UTF-7 encoded correctly"
36
- Logger.logger.info message
37
- next
38
- end
30
+ backup_folders = Account::BackupFolders.new(
31
+ client: account.client, account: account
32
+ )
33
+ if backup_folders.none?
34
+ Logger.logger.warn "Account #{account.username}: No folders found to backup"
35
+ return
36
+ end
37
+ backup_folders.each do |folder|
38
+ backup_folder folder
39
+ end
40
+ end
41
+
42
+ private
39
43
 
40
- Logger.logger.debug "[#{folder.name}] running backup"
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
41
54
 
42
- serializer.apply_uid_validity(folder.uid_validity)
55
+ Logger.logger.debug "[#{folder.name}] running backup"
43
56
 
44
- download_serializer =
45
- case account.download_strategy
46
- when "direct"
47
- serializer
48
- when "delay_metadata"
49
- Serializer::DelayedMetadataSerializer.new(serializer: serializer)
50
- else
51
- raise "Unknown download strategy '#{account.download_strategy}'"
52
- end
57
+ serializer.apply_uid_validity(folder.uid_validity)
53
58
 
54
- downloader = Downloader.new(
55
- folder,
56
- download_serializer,
57
- multi_fetch_size: account.multi_fetch_size,
58
- reset_seen_flags_after_fetch: account.reset_seen_flags_after_fetch
59
- )
60
- # rubocop:disable Lint/RescueException
61
- download_serializer.transaction do
62
- downloader.run
63
- rescue Exception => e
64
- message = <<~ERROR
65
- #{self.class} error #{e}
66
- #{e.backtrace.join("\n")}
67
- ERROR
68
- Logger.logger.error message
69
- download_serializer.rollback
70
- raise e
71
- end
72
- # rubocop:enable Lint/RescueException
73
- if account.mirror_mode
74
- Logger.logger.info "Mirror mode - Deleting messages only present locally"
75
- LocalOnlyMessageDeleter.new(folder, serializer).run
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}'"
76
67
  end
77
- FlagRefresher.new(folder, serializer).run if account.mirror_mode || refresh
78
- end
79
- end
80
-
81
- private
82
68
 
83
- def each_folder
84
- backup_folders = Account::BackupFolders.new(
85
- client: account.client, account: account
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
86
74
  )
87
- backup_folders.each do |folder|
88
- serializer = Serializer.new(account.local_path, folder.name)
89
- yield folder, serializer
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
90
88
  end
89
+ FlagRefresher.new(folder, serializer).run if account.mirror_mode || refresh
91
90
  end
92
91
  end
93
92
  end
@@ -4,6 +4,8 @@ module Imap::Backup
4
4
  class Account; end
5
5
 
6
6
  class Account::BackupFolders
7
+ include Enumerable
8
+
7
9
  attr_reader :account
8
10
  attr_reader :client
9
11
 
@@ -19,7 +19,12 @@ module Imap::Backup
19
19
  def run
20
20
  config = load_config(**options)
21
21
  exit_code = nil
22
- requested_accounts(config).each do |account|
22
+ accounts = requested_accounts(config)
23
+ if accounts.none?
24
+ Logger.logger.warn "No matching accounts found to backup"
25
+ return
26
+ end
27
+ accounts.each do |account|
23
28
  backup = Account::Backup.new(account: account, refresh: refresh)
24
29
  backup.run
25
30
  rescue StandardError => e
@@ -20,23 +20,13 @@ module Imap::Backup
20
20
  def transaction(&block)
21
21
  tsx.fail_in_transaction!(:transaction, message: "nested transactions are not supported")
22
22
 
23
- # rubocop:disable Lint/RescueException
24
23
  tsx.begin({metadata: []}) do
25
24
  mbox.transaction do
26
25
  block.call
27
26
 
28
27
  commit
29
- rescue Exception => e
30
- message = <<~ERROR
31
- #{self.class} error #{e}
32
- #{e.backtrace.join("\n")}
33
- ERROR
34
- Logger.logger.error message
35
- mbox.rollback
36
- raise e
37
28
  end
38
29
  end
39
- # rubocop:enable Lint/RescueException
40
30
  end
41
31
 
42
32
  def append(uid, message, flags)
@@ -56,6 +46,7 @@ module Imap::Backup
56
46
  imap.append m[:uid], m[:length], flags: m[:flags]
57
47
  end
58
48
  rescue Exception => e
49
+ Logger.logger.error "#{self.class} handling #{e.class}"
59
50
  imap.rollback
60
51
  raise e
61
52
  end
@@ -31,6 +31,7 @@ module Imap::Backup
31
31
 
32
32
  save_internal(version: version, uid_validity: uid_validity, messages: messages) if tsx.data
33
33
  rescue Exception => e
34
+ Logger.logger.error "#{self.class} handling #{e.class}"
34
35
  rollback
35
36
  raise e
36
37
  end
@@ -15,10 +15,9 @@ module Imap::Backup
15
15
  def transaction(&block)
16
16
  tsx.fail_in_transaction!(:transaction, message: "nested transactions are not supported")
17
17
 
18
- # rubocop:disable Lint/RescueException
19
18
  tsx.begin({savepoint: {length: length}}) do
20
19
  block.call
21
- rescue Exception => e
20
+ rescue StandardError => e
22
21
  message = <<~ERROR
23
22
  #{self.class} error #{e}
24
23
  #{e.backtrace.join("\n")}
@@ -26,15 +25,17 @@ module Imap::Backup
26
25
  Logger.logger.error message
27
26
  rollback
28
27
  raise e
28
+ rescue SignalException => e
29
+ Logger.logger.error "#{self.class} handling #{e.class}"
30
+ rollback
31
+ raise e
29
32
  end
30
- # rubocop:enable Lint/RescueException
31
33
  end
32
34
 
33
35
  def rollback
34
36
  tsx.fail_outside_transaction!(:rollback)
35
37
 
36
38
  rewind(tsx.data[:savepoint][:length])
37
- tsx.clear
38
39
  end
39
40
 
40
41
  def valid?
@@ -37,9 +37,6 @@ module Imap::Backup
37
37
  block.call
38
38
  end
39
39
 
40
- def rollback
41
- end
42
-
43
40
  # Returns true if there are existing, valid files
44
41
  # false otherwise (in which case any existing files are deleted)
45
42
  def validate!
@@ -3,7 +3,7 @@ module Imap; end
3
3
  module Imap::Backup
4
4
  MAJOR = 11
5
5
  MINOR = 0
6
- REVISION = 0
6
+ REVISION = 1
7
7
  PRE = nil
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.0
4
+ version: 11.0.1
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-07-25 00:00:00.000000000 Z
11
+ date: 2023-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline