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 +4 -4
- data/lib/imap/backup/account/backup.rb +52 -53
- data/lib/imap/backup/account/backup_folders.rb +2 -0
- data/lib/imap/backup/cli/backup.rb +6 -1
- data/lib/imap/backup/serializer/delayed_metadata_serializer.rb +1 -10
- data/lib/imap/backup/serializer/imap.rb +1 -0
- data/lib/imap/backup/serializer/mbox.rb +5 -4
- data/lib/imap/backup/serializer.rb +0 -3
- data/lib/imap/backup/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 12d5752520f0b47c240fe8bc3ac7e600bea9229804c9f2c22c2b5c5218818e79
|
|
4
|
+
data.tar.gz: 67da4a6a56f0914ad18f44340c52b759d0a5a74a70f32aafd0bb0600fd34c4e9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
+
Logger.logger.debug "[#{folder.name}] running backup"
|
|
43
56
|
|
|
44
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
|
@@ -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)
|
|
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
|
|
@@ -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
|
|
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?
|
data/lib/imap/backup/version.rb
CHANGED
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.
|
|
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-
|
|
11
|
+
date: 2023-08-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: highline
|