imap-backup 11.0.0 → 11.0.1

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: 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