imap-backup 13.4.0 → 14.0.0
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/README.md +36 -59
 - data/docs/development.md +10 -1
 - data/docs/performance.md +53 -0
 - data/lib/imap/backup/cli/helpers.rb +10 -0
 - data/lib/imap/backup/cli/local.rb +1 -0
 - data/lib/imap/backup/cli/single/backup.rb +131 -0
 - data/lib/imap/backup/cli/single.rb +179 -0
 - data/lib/imap/backup/cli.rb +5 -6
 - data/lib/imap/backup/version.rb +2 -2
 - metadata +5 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: c98349e8780fc3170e7ca735e6469fb38c9eeb3b7f023eec8d5f7d1e80e7258b
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 3ebb575e74b72ac190f52b192cf8a5af54302799f4feec7d707cb438b4e5f542
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 11a1f328334d32eaf54ec2b013bf444f9434704c9e218bf51e34798a675b33be1569a0293ddacd521d923528e8dbb534c836877e302af11ad5fd8be0ceb764a3
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 8f40f2ed79c32716b366a678da2c065b1df83a206901411bb3667ee31183779e668bd2619dd252cbaee46683a65ab9c5c3374afa30fa73cc0dc5b03aa83efa43
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -2,6 +2,7 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            [][CI Status]
         
     | 
| 
       3 
3 
     | 
    
         
             
            
         
     | 
| 
       4 
4 
     | 
    
         
             
            
         
     | 
| 
      
 5 
     | 
    
         
            +
            [][GitHub Stars]
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
            # imap-backup
         
     | 
| 
       7 
8 
     | 
    
         | 
| 
         @@ -11,7 +12,7 @@ Backup, restore and migrate email accounts. 
     | 
|
| 
       11 
12 
     | 
    
         | 
| 
       12 
13 
     | 
    
         
             
            ```sh
         
     | 
| 
       13 
14 
     | 
    
         
             
            brew install imap-backup # for macOS
         
     | 
| 
       14 
     | 
    
         
            -
            gem install imap-backup # for Linux
         
     | 
| 
      
 15 
     | 
    
         
            +
            gem install imap-backup --no-document # for Linux
         
     | 
| 
       15 
16 
     | 
    
         
             
            imap-backup setup
         
     | 
| 
       16 
17 
     | 
    
         
             
            imap-backup
         
     | 
| 
       17 
18 
     | 
    
         
             
            ```
         
     | 
| 
         @@ -35,6 +36,8 @@ See below for a [full list of commands](#Commands). 
     | 
|
| 
       35 
36 
     | 
    
         | 
| 
       36 
37 
     | 
    
         
             
            ## Homebrew (macOS)
         
     | 
| 
       37 
38 
     | 
    
         | 
| 
      
 39 
     | 
    
         
            +
            
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
       38 
41 
     | 
    
         
             
            If you have [Homebrew](https://brew.sh/), do this:
         
     | 
| 
       39 
42 
     | 
    
         | 
| 
       40 
43 
     | 
    
         
             
            ```sh
         
     | 
| 
         @@ -44,7 +47,7 @@ brew install imap-backup 
     | 
|
| 
       44 
47 
     | 
    
         
             
            ## As a Ruby Gem
         
     | 
| 
       45 
48 
     | 
    
         | 
| 
       46 
49 
     | 
    
         
             
            ```sh
         
     | 
| 
       47 
     | 
    
         
            -
            gem install imap-backup
         
     | 
| 
      
 50 
     | 
    
         
            +
            gem install imap-backup --no-document
         
     | 
| 
       48 
51 
     | 
    
         
             
            ```
         
     | 
| 
       49 
52 
     | 
    
         | 
| 
       50 
53 
     | 
    
         
             
            If that doesn't work, see the [detailed installation instructions](docs/installation/rubygem.md).
         
     | 
| 
         @@ -55,8 +58,10 @@ If you want to use imap-backup directly from the source code, see [here](docs/in 
     | 
|
| 
       55 
58 
     | 
    
         | 
| 
       56 
59 
     | 
    
         
             
            # Setup
         
     | 
| 
       57 
60 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
             
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
      
 61 
     | 
    
         
            +
            Normally you will want to backup a number of email accounts.
         
     | 
| 
      
 62 
     | 
    
         
            +
            Doing so requires the creation of a config file.
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            You do this via a menu-driven command line program:
         
     | 
| 
       60 
65 
     | 
    
         | 
| 
       61 
66 
     | 
    
         
             
            Run:
         
     | 
| 
       62 
67 
     | 
    
         | 
| 
         @@ -64,6 +69,10 @@ Run: 
     | 
|
| 
       64 
69 
     | 
    
         
             
            imap-backup setup
         
     | 
| 
       65 
70 
     | 
    
         
             
            ```
         
     | 
| 
       66 
71 
     | 
    
         | 
| 
      
 72 
     | 
    
         
            +
            As an alternative, if you only want to backup a single account,
         
     | 
| 
      
 73 
     | 
    
         
            +
            you can pass all the necessary parameters directly to the `single backup` command
         
     | 
| 
      
 74 
     | 
    
         
            +
            (see the [`single backup`](docs/commands/single-backup.md) docs).
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
       67 
76 
     | 
    
         
             
            ## GMail
         
     | 
| 
       68 
77 
     | 
    
         | 
| 
       69 
78 
     | 
    
         
             
            To use imap-backup with GMail, Office 365 and other services that require
         
     | 
| 
         @@ -80,24 +89,25 @@ imap-backup 
     | 
|
| 
       80 
89 
     | 
    
         | 
| 
       81 
90 
     | 
    
         
             
            Alternatively, add it to your crontab.
         
     | 
| 
       82 
91 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
            Backups can also be inspected, for example via [local show](docs/commands/local-show.md)
         
     | 
| 
       84 
     | 
    
         
            -
            and exported via [utils export-to-thunderbird](docs/commands/utils-export-to-thunderbird.md).
         
     | 
| 
      
 92 
     | 
    
         
            +
            Backups can also be inspected, for example via [`local show`](docs/commands/local-show.md)
         
     | 
| 
      
 93 
     | 
    
         
            +
            and exported via [`utils export-to-thunderbird`](docs/commands/utils-export-to-thunderbird.md).
         
     | 
| 
       85 
94 
     | 
    
         | 
| 
       86 
95 
     | 
    
         
             
            # Commands
         
     | 
| 
       87 
96 
     | 
    
         | 
| 
       88 
     | 
    
         
            -
            * [backup](docs/commands/backup.md)
         
     | 
| 
       89 
     | 
    
         
            -
            * [local accounts](docs/commands/local-accounts.md)
         
     | 
| 
       90 
     | 
    
         
            -
            * [local check](docs/commands/local-check.md)
         
     | 
| 
       91 
     | 
    
         
            -
            * [local folders](docs/commands/local-folders.md)
         
     | 
| 
       92 
     | 
    
         
            -
            * [local list](docs/commands/local-list.md)
         
     | 
| 
       93 
     | 
    
         
            -
            * [local show](docs/commands/local-show.md)
         
     | 
| 
       94 
     | 
    
         
            -
            * [migrate](docs/commands/migrate.md)
         
     | 
| 
       95 
     | 
    
         
            -
            * [mirror](docs/commands/mirror.md)
         
     | 
| 
       96 
     | 
    
         
            -
            * [remote folders](docs/commands/remote-folders.md)
         
     | 
| 
       97 
     | 
    
         
            -
            * [restore](docs/commands/restore.md)
         
     | 
| 
       98 
     | 
    
         
            -
            * [setup](docs/commands/setup.md)
         
     | 
| 
       99 
     | 
    
         
            -
            * [ 
     | 
| 
       100 
     | 
    
         
            -
            * [utils  
     | 
| 
      
 97 
     | 
    
         
            +
            * [`backup`](docs/commands/backup.md)
         
     | 
| 
      
 98 
     | 
    
         
            +
            * [`local accounts`](docs/commands/local-accounts.md)
         
     | 
| 
      
 99 
     | 
    
         
            +
            * [`local check`](docs/commands/local-check.md)
         
     | 
| 
      
 100 
     | 
    
         
            +
            * [`local folders`](docs/commands/local-folders.md)
         
     | 
| 
      
 101 
     | 
    
         
            +
            * [`local list`](docs/commands/local-list.md)
         
     | 
| 
      
 102 
     | 
    
         
            +
            * [`local show`](docs/commands/local-show.md)
         
     | 
| 
      
 103 
     | 
    
         
            +
            * [`migrate`](docs/commands/migrate.md)
         
     | 
| 
      
 104 
     | 
    
         
            +
            * [`mirror`](docs/commands/mirror.md)
         
     | 
| 
      
 105 
     | 
    
         
            +
            * [`remote folders`](docs/commands/remote-folders.md)
         
     | 
| 
      
 106 
     | 
    
         
            +
            * [`restore`](docs/commands/restore.md)
         
     | 
| 
      
 107 
     | 
    
         
            +
            * [`setup`](docs/commands/setup.md)
         
     | 
| 
      
 108 
     | 
    
         
            +
            * [`single backup`](docs/commands/single-backup.md)
         
     | 
| 
      
 109 
     | 
    
         
            +
            * [`utils export-to-thunderbird`](docs/commands/utils-export-to-thunderbird.md)
         
     | 
| 
      
 110 
     | 
    
         
            +
            * [`utils ignore-history`](docs/commands/utils-ignore-history.md)
         
     | 
| 
       101 
111 
     | 
    
         | 
| 
       102 
112 
     | 
    
         
             
            For a full list of available commands, run
         
     | 
| 
       103 
113 
     | 
    
         | 
| 
         @@ -118,46 +128,10 @@ to improve backup speed. 
     | 
|
| 
       118 
128 
     | 
    
         | 
| 
       119 
129 
     | 
    
         
             
            These are activated via two settings:
         
     | 
| 
       120 
130 
     | 
    
         | 
| 
       121 
     | 
    
         
            -
            * Global setting "Delay download writes"
         
     | 
| 
       122 
     | 
    
         
            -
            * Account setting "Multi-fetch size"
         
     | 
| 
       123 
     | 
    
         
            -
             
     | 
| 
       124 
     | 
    
         
            -
            As with all performance tweaks, there are trade-offs.
         
     | 
| 
       125 
     | 
    
         
            -
            If you are using a small virtual server or Raspberry Pi
         
     | 
| 
       126 
     | 
    
         
            -
            to run your backups, you will probably want to leave
         
     | 
| 
       127 
     | 
    
         
            -
            the default settings.
         
     | 
| 
       128 
     | 
    
         
            -
            If, on the other hand, you are using a computer with a
         
     | 
| 
       129 
     | 
    
         
            -
            fair bit of RAM, and you are dealing with a *lot* of email,
         
     | 
| 
       130 
     | 
    
         
            -
            then changing these settings may be worthwhile.
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
            ## Delay download writes
         
     | 
| 
       133 
     | 
    
         
            -
             
     | 
| 
       134 
     | 
    
         
            -
            This setting affects all account backups.
         
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
            By default, `imap-backup` uses the "delay metadata" strategy.
         
     | 
| 
       137 
     | 
    
         
            -
            As messages are being backed-up, the message *text*
         
     | 
| 
       138 
     | 
    
         
            -
            is written to disk, while the related metadata is stored in memory.
         
     | 
| 
      
 131 
     | 
    
         
            +
            * Global setting "Delay download writes",
         
     | 
| 
      
 132 
     | 
    
         
            +
            * Account setting "Multi-fetch size".
         
     | 
| 
       139 
133 
     | 
    
         | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
       141 
     | 
    
         
            -
            file for every message, speeding things up and reducing disk wear.
         
     | 
| 
       142 
     | 
    
         
            -
             
     | 
| 
       143 
     | 
    
         
            -
            The alternative strategy, called "direct", writes everything to disk
         
     | 
| 
       144 
     | 
    
         
            -
            as it is received. This method is slower, but has the advantage
         
     | 
| 
       145 
     | 
    
         
            -
            of using slightly less memory, which may be important on very
         
     | 
| 
       146 
     | 
    
         
            -
            resource-limited systems, like Raspberry Pis.
         
     | 
| 
       147 
     | 
    
         
            -
             
     | 
| 
       148 
     | 
    
         
            -
            ## Multi-fetch Size
         
     | 
| 
       149 
     | 
    
         
            -
             
     | 
| 
       150 
     | 
    
         
            -
            By default, during backup, each message is downloaded one-by-one.
         
     | 
| 
       151 
     | 
    
         
            -
             
     | 
| 
       152 
     | 
    
         
            -
            Using this setting, you can download chunks of emails at a time,
         
     | 
| 
       153 
     | 
    
         
            -
            potentially speeding up the process.
         
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
            Using multi-fetch *will* mean that the backup process will use
         
     | 
| 
       156 
     | 
    
         
            -
            more memory - equivalent to the size of the groups of messages
         
     | 
| 
       157 
     | 
    
         
            -
            that are downloaded.
         
     | 
| 
       158 
     | 
    
         
            -
             
     | 
| 
       159 
     | 
    
         
            -
            This behaviour may also exceed the rate limits on your email provider,
         
     | 
| 
       160 
     | 
    
         
            -
            so it's best to check before cranking it up!
         
     | 
| 
      
 134 
     | 
    
         
            +
            See [the performance document](docs/performance.md) for more information.
         
     | 
| 
       161 
135 
     | 
    
         | 
| 
       162 
136 
     | 
    
         
             
            # Troubleshooting
         
     | 
| 
       163 
137 
     | 
    
         | 
| 
         @@ -168,10 +142,12 @@ If you have problems: 
     | 
|
| 
       168 
142 
     | 
    
         | 
| 
       169 
143 
     | 
    
         
             
            # Development
         
     | 
| 
       170 
144 
     | 
    
         | 
| 
      
 145 
     | 
    
         
            +
            
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
       171 
147 
     | 
    
         
             
            See the [Development documentation](./docs/development.md) for notes
         
     | 
| 
       172 
148 
     | 
    
         
             
            on development and testing.
         
     | 
| 
       173 
149 
     | 
    
         | 
| 
       174 
     | 
    
         
            -
            See [the CHANGELOG](./CHANGELOG.md)  
     | 
| 
      
 150 
     | 
    
         
            +
            See [the CHANGELOG](./CHANGELOG.md) for a list of changes that have been
         
     | 
| 
       175 
151 
     | 
    
         
             
            made in each release.
         
     | 
| 
       176 
152 
     | 
    
         | 
| 
       177 
153 
     | 
    
         
             
            * [Source Code]
         
     | 
| 
         @@ -180,6 +156,7 @@ made in each release. 
     | 
|
| 
       180 
156 
     | 
    
         
             
            * [CI Status]
         
     | 
| 
       181 
157 
     | 
    
         | 
| 
       182 
158 
     | 
    
         
             
            [Source Code]: https://github.com/joeyates/imap-backup "Source code at GitHub"
         
     | 
| 
      
 159 
     | 
    
         
            +
            [GitHub Stars]: https://github.com/joeyates/imap-backup/stargazers "GitHub Stars"
         
     | 
| 
       183 
160 
     | 
    
         
             
            [Code Documentation]: https://rubydoc.info/gems/imap-backup/frames "Code Documentation at Rubydoc.info"
         
     | 
| 
       184 
161 
     | 
    
         
             
            [Rubygem]: https://rubygems.org/gems/imap-backup "Ruby gem at rubygems.org"
         
     | 
| 
       185 
162 
     | 
    
         
             
            [CI Status]: https://github.com/joeyates/imap-backup/actions/workflows/main.yml
         
     | 
    
        data/docs/development.md
    CHANGED
    
    | 
         @@ -1,6 +1,15 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Repository
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            After cloning the repo, run the following command to get
         
     | 
| 
      
 4 
     | 
    
         
            +
            better `git blame` output:
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            ```sh
         
     | 
| 
      
 7 
     | 
    
         
            +
            git config --local blame.ignoreRevsFile .git-blame-ignore-revs
         
     | 
| 
      
 8 
     | 
    
         
            +
            ```
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       1 
10 
     | 
    
         
             
            # Design Goals
         
     | 
| 
       2 
11 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
            * Secure - use a local file protected by permissions
         
     | 
| 
      
 12 
     | 
    
         
            +
            * Secure - use a local configuration file protected by permissions
         
     | 
| 
       4 
13 
     | 
    
         
             
            * Restartable - calculate start point based on already downloaded messages
         
     | 
| 
       5 
14 
     | 
    
         
             
            * Standalone - do not rely on an email client or MTA
         
     | 
| 
       6 
15 
     | 
    
         | 
    
        data/docs/performance.md
    ADDED
    
    | 
         @@ -0,0 +1,53 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Performace
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            The two performance-related settings are "Download strategy",
         
     | 
| 
      
 4 
     | 
    
         
            +
            which is a global setting,
         
     | 
| 
      
 5 
     | 
    
         
            +
            and "Multi-fetch size", which is an Account-level setting.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            As with all performance tweaks, there are trade-offs.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            # Overview
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            The defaults, which suit most machines and plays nice with servers is:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            * Download strategy: "delay writing metadata",
         
     | 
| 
      
 14 
     | 
    
         
            +
            * Multi-fetch size: 1.
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            If you are using a resource-limited machine like 
         
     | 
| 
      
 17 
     | 
    
         
            +
            a small virtual server or Raspberry Pi
         
     | 
| 
      
 18 
     | 
    
         
            +
            to run your backups, you can change "Download strategy".
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            If your email provider supports it,
         
     | 
| 
      
 21 
     | 
    
         
            +
            and you don't have tight memeory limits,
         
     | 
| 
      
 22 
     | 
    
         
            +
            increase "Multi-fetch size" for faster backups.
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            # Delay download writes
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            This is a global setting, affecting all account backups.
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            By default, `imap-backup` uses the "delay writing metadata" strategy.
         
     | 
| 
      
 29 
     | 
    
         
            +
            As messages are being backed-up, the message *text*
         
     | 
| 
      
 30 
     | 
    
         
            +
            is written to disk, while the related metadata is stored in memory.
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            While this uses a *little* more memory, it avoids rewiting a growing JSON
         
     | 
| 
      
 33 
     | 
    
         
            +
            file for every message, speeding things up and reducing disk wear.
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            The alternative strategy, called "write straight to disk",
         
     | 
| 
      
 36 
     | 
    
         
            +
            writes everything to disk as it is received.
         
     | 
| 
      
 37 
     | 
    
         
            +
            This method is slower, but has the advantage
         
     | 
| 
      
 38 
     | 
    
         
            +
            of using slightly less memory, which may be important on very
         
     | 
| 
      
 39 
     | 
    
         
            +
            resource-limited systems, like Raspberry Pis.
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            # Multi-fetch Size
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            By default, during backup, each message is downloaded one-by-one.
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
            Using this setting, you can download chunks of emails at a time,
         
     | 
| 
      
 46 
     | 
    
         
            +
            potentially speeding up the process.
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
            Using multi-fetch *will* mean that the backup process will use
         
     | 
| 
      
 49 
     | 
    
         
            +
            more memory - equivalent to the size of the groups of messages
         
     | 
| 
      
 50 
     | 
    
         
            +
            that are downloaded.
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            This behaviour may also exceed the rate limits on your email provider,
         
     | 
| 
      
 53 
     | 
    
         
            +
            so it's best to check before cranking it up!
         
     | 
| 
         @@ -47,6 +47,16 @@ module Imap::Backup 
     | 
|
| 
       47 
47 
     | 
    
         
             
                      )
         
     | 
| 
       48 
48 
     | 
    
         
             
                    end
         
     | 
| 
       49 
49 
     | 
    
         | 
| 
      
 50 
     | 
    
         
            +
                    def self.refresh_option
         
     | 
| 
      
 51 
     | 
    
         
            +
                      method_option(
         
     | 
| 
      
 52 
     | 
    
         
            +
                        "refresh",
         
     | 
| 
      
 53 
     | 
    
         
            +
                        type: :boolean,
         
     | 
| 
      
 54 
     | 
    
         
            +
                        desc: "in the default 'keep all emails' mode, " \
         
     | 
| 
      
 55 
     | 
    
         
            +
                              "updates flags for messages that are already downloaded",
         
     | 
| 
      
 56 
     | 
    
         
            +
                        aliases: ["-r"]
         
     | 
| 
      
 57 
     | 
    
         
            +
                      )
         
     | 
| 
      
 58 
     | 
    
         
            +
                    end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
       50 
60 
     | 
    
         
             
                    def self.verbose_option
         
     | 
| 
       51 
61 
     | 
    
         
             
                      method_option(
         
     | 
| 
       52 
62 
     | 
    
         
             
                        "verbose",
         
     | 
| 
         @@ -0,0 +1,131 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "thor"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "imap/backup/account"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "imap/backup/account/backup"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "imap/backup/configuration"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Imap; end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module Imap::Backup
         
     | 
| 
      
 10 
     | 
    
         
            +
              class CLI < Thor; end
         
     | 
| 
      
 11 
     | 
    
         
            +
              class CLI::Single < Thor; end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
              class CLI::Single::Backup
         
     | 
| 
      
 14 
     | 
    
         
            +
                attr_reader :options
         
     | 
| 
      
 15 
     | 
    
         
            +
                attr_reader :password
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                def initialize(options)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @options = options
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @password = nil
         
     | 
| 
      
 20 
     | 
    
         
            +
                end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                def run
         
     | 
| 
      
 23 
     | 
    
         
            +
                  process_options!
         
     | 
| 
      
 24 
     | 
    
         
            +
                  account = Account.new(
         
     | 
| 
      
 25 
     | 
    
         
            +
                    username: email,
         
     | 
| 
      
 26 
     | 
    
         
            +
                    password: password,
         
     | 
| 
      
 27 
     | 
    
         
            +
                    server: server,
         
     | 
| 
      
 28 
     | 
    
         
            +
                    download_strategy: download_strategy,
         
     | 
| 
      
 29 
     | 
    
         
            +
                    folder_blacklist: folder_blacklist,
         
     | 
| 
      
 30 
     | 
    
         
            +
                    local_path: local_path,
         
     | 
| 
      
 31 
     | 
    
         
            +
                    mirror: mirror,
         
     | 
| 
      
 32 
     | 
    
         
            +
                    reset_seen_flags_after_fetch: reset_seen_flags_after_fetch
         
     | 
| 
      
 33 
     | 
    
         
            +
                  )
         
     | 
| 
      
 34 
     | 
    
         
            +
                  account.connection_options = connection_options if connection_options
         
     | 
| 
      
 35 
     | 
    
         
            +
                  account.folders = folders if folders.any?
         
     | 
| 
      
 36 
     | 
    
         
            +
                  account.multi_fetch_size = multi_fetch_size if multi_fetch_size
         
     | 
| 
      
 37 
     | 
    
         
            +
                  backup = Account::Backup.new(account: account, refresh: refresh)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  backup.run
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                private
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                def process_options!
         
     | 
| 
      
 44 
     | 
    
         
            +
                  if !email
         
     | 
| 
      
 45 
     | 
    
         
            +
                    raise Thor::RequiredArgumentMissingError,
         
     | 
| 
      
 46 
     | 
    
         
            +
                          "No value provided for required options '--email'"
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  if !server
         
     | 
| 
      
 49 
     | 
    
         
            +
                    raise Thor::RequiredArgumentMissingError,
         
     | 
| 
      
 50 
     | 
    
         
            +
                          "No value provided for required options '--server'"
         
     | 
| 
      
 51 
     | 
    
         
            +
                  end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  handle_password_options!
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                def handle_password_options!
         
     | 
| 
      
 56 
     | 
    
         
            +
                  plain = options[:password]
         
     | 
| 
      
 57 
     | 
    
         
            +
                  env = options[:password_environment_variable]
         
     | 
| 
      
 58 
     | 
    
         
            +
                  file = options[:password_file]
         
     | 
| 
      
 59 
     | 
    
         
            +
                  case [plain, env, file]
         
     | 
| 
      
 60 
     | 
    
         
            +
                  when [nil, nil, nil]
         
     | 
| 
      
 61 
     | 
    
         
            +
                    raise Thor::RequiredArgumentMissingError,
         
     | 
| 
      
 62 
     | 
    
         
            +
                          "Supply one of the --password... parameters"
         
     | 
| 
      
 63 
     | 
    
         
            +
                  when [plain, nil, nil]
         
     | 
| 
      
 64 
     | 
    
         
            +
                    @password = plain
         
     | 
| 
      
 65 
     | 
    
         
            +
                  when [nil, env, nil]
         
     | 
| 
      
 66 
     | 
    
         
            +
                    @password = ENV.fetch(env)
         
     | 
| 
      
 67 
     | 
    
         
            +
                  when [nil, nil, file]
         
     | 
| 
      
 68 
     | 
    
         
            +
                    @password = File.read(file).gsub(/\n$/, "")
         
     | 
| 
      
 69 
     | 
    
         
            +
                  else
         
     | 
| 
      
 70 
     | 
    
         
            +
                    raise ArgumentError, "Supply only one of the --password... parameters"
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                def connection_options
         
     | 
| 
      
 75 
     | 
    
         
            +
                  options[:connection_options]
         
     | 
| 
      
 76 
     | 
    
         
            +
                end
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
                def download_strategy
         
     | 
| 
      
 79 
     | 
    
         
            +
                  @download_strategy =
         
     | 
| 
      
 80 
     | 
    
         
            +
                    case options[:download_strategy]
         
     | 
| 
      
 81 
     | 
    
         
            +
                    when nil
         
     | 
| 
      
 82 
     | 
    
         
            +
                      Configuration::DEFAULT_STRATEGY
         
     | 
| 
      
 83 
     | 
    
         
            +
                    when "delay"
         
     | 
| 
      
 84 
     | 
    
         
            +
                      "delay_metadata"
         
     | 
| 
      
 85 
     | 
    
         
            +
                    when "direct"
         
     | 
| 
      
 86 
     | 
    
         
            +
                      "direct"
         
     | 
| 
      
 87 
     | 
    
         
            +
                    else
         
     | 
| 
      
 88 
     | 
    
         
            +
                      raise ArgumentError, "Unknown download_strategy: '#{options[:download_strategy]}'"
         
     | 
| 
      
 89 
     | 
    
         
            +
                    end
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                def email
         
     | 
| 
      
 93 
     | 
    
         
            +
                  options[:email]
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                def folder_blacklist
         
     | 
| 
      
 97 
     | 
    
         
            +
                  options[:folder_blacklist] ? true : false
         
     | 
| 
      
 98 
     | 
    
         
            +
                end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                def folders
         
     | 
| 
      
 101 
     | 
    
         
            +
                  @folders ||= options[:folder] || []
         
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                def local_path
         
     | 
| 
      
 105 
     | 
    
         
            +
                  return options[:path] if options.key?(:path)
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                  for_account = email.tr("@", "_")
         
     | 
| 
      
 108 
     | 
    
         
            +
                  File.join(Dir.pwd, for_account)
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                def mirror
         
     | 
| 
      
 112 
     | 
    
         
            +
                  options[:mirror] ? true : false
         
     | 
| 
      
 113 
     | 
    
         
            +
                end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                def multi_fetch_size
         
     | 
| 
      
 116 
     | 
    
         
            +
                  options[:multi_fetch_size]
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                def refresh
         
     | 
| 
      
 120 
     | 
    
         
            +
                  options[:refresh] ? true : false
         
     | 
| 
      
 121 
     | 
    
         
            +
                end
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
                def reset_seen_flags_after_fetch
         
     | 
| 
      
 124 
     | 
    
         
            +
                  options[:reset_seen_flags_after_fetch] ? true : false
         
     | 
| 
      
 125 
     | 
    
         
            +
                end
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                def server
         
     | 
| 
      
 128 
     | 
    
         
            +
                  options[:server]
         
     | 
| 
      
 129 
     | 
    
         
            +
                end
         
     | 
| 
      
 130 
     | 
    
         
            +
              end
         
     | 
| 
      
 131 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,179 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "thor"
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "imap/backup/logger"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "imap/backup/cli/helpers"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "imap/backup/cli/single/backup"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module Imap; end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module Imap::Backup
         
     | 
| 
      
 10 
     | 
    
         
            +
              class CLI < Thor; end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              class CLI::Single < Thor
         
     | 
| 
      
 13 
     | 
    
         
            +
                include CLI::Helpers
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                desc "backup", "Backup a single email account based on command-line parameters"
         
     | 
| 
      
 16 
     | 
    
         
            +
                long_desc <<~DESC
         
     | 
| 
      
 17 
     | 
    
         
            +
                  This is a "stand-alone" backup command that doesn't require
         
     | 
| 
      
 18 
     | 
    
         
            +
                  a configuration file.
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  At a minimum, you need to supply the email, the server and the
         
     | 
| 
      
 21 
     | 
    
         
            +
                  password. (There are three ways of specifying the password)
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  $ imap-backup single backup
         
     | 
| 
      
 24 
     | 
    
         
            +
                    --email me@example.com
         
     | 
| 
      
 25 
     | 
    
         
            +
                    --password MyS3kr1t
         
     | 
| 
      
 26 
     | 
    
         
            +
                    --server imap.example.com
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  Instead of supplying the password directly on the command line,
         
     | 
| 
      
 29 
     | 
    
         
            +
                  there are two alternatives.
         
     | 
| 
      
 30 
     | 
    
         
            +
                  You can set an environment variable (with any name) to your
         
     | 
| 
      
 31 
     | 
    
         
            +
                  password, then pass the name of the environment variable.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  For example, if MY_IMAP_PASSWORD is set to your password,
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                  $ imap-backup single backup
         
     | 
| 
      
 36 
     | 
    
         
            +
                    --email me@example.com
         
     | 
| 
      
 37 
     | 
    
         
            +
                    --password-environment-variable MY_IMAP_PASSWORD
         
     | 
| 
      
 38 
     | 
    
         
            +
                    --server imap.example.com
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                  Alternatively, you can supply the name of a file that contains
         
     | 
| 
      
 41 
     | 
    
         
            +
                  the password.
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                  For example, in `~/imap-password`:
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  `MyS3kr1t`
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  $ imap-backup single backup
         
     | 
| 
      
 48 
     | 
    
         
            +
                    --email me@example.com
         
     | 
| 
      
 49 
     | 
    
         
            +
                    --password-file ~/imap-password
         
     | 
| 
      
 50 
     | 
    
         
            +
                    --server imap.example.com
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  If you need to use an insecure connection (this normally happens
         
     | 
| 
      
 53 
     | 
    
         
            +
                  when running an OAuth2 proxy), you can specify server connection options
         
     | 
| 
      
 54 
     | 
    
         
            +
                  in JSON:
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
                  $ imap-backup single backup
         
     | 
| 
      
 57 
     | 
    
         
            +
                    --email me@example.com
         
     | 
| 
      
 58 
     | 
    
         
            +
                    --password MyS3kr1t
         
     | 
| 
      
 59 
     | 
    
         
            +
                    --server imap.example.com
         
     | 
| 
      
 60 
     | 
    
         
            +
                    --connection-options '{"ssl":{"verify_mode":0}}'
         
     | 
| 
      
 61 
     | 
    
         
            +
                DESC
         
     | 
| 
      
 62 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 63 
     | 
    
         
            +
                  "email",
         
     | 
| 
      
 64 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 65 
     | 
    
         
            +
                  desc: "the email address",
         
     | 
| 
      
 66 
     | 
    
         
            +
                  aliases: ["-e"]
         
     | 
| 
      
 67 
     | 
    
         
            +
                )
         
     | 
| 
      
 68 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 69 
     | 
    
         
            +
                  "server",
         
     | 
| 
      
 70 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 71 
     | 
    
         
            +
                  desc: "the address of the IMAP server",
         
     | 
| 
      
 72 
     | 
    
         
            +
                  aliases: ["-s"]
         
     | 
| 
      
 73 
     | 
    
         
            +
                )
         
     | 
| 
      
 74 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 75 
     | 
    
         
            +
                  "password",
         
     | 
| 
      
 76 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 77 
     | 
    
         
            +
                  desc: "your password. " \
         
     | 
| 
      
 78 
     | 
    
         
            +
                        "As an alternative, use the --password-environment-variable " \
         
     | 
| 
      
 79 
     | 
    
         
            +
                        "or --password-file parameter. " \
         
     | 
| 
      
 80 
     | 
    
         
            +
                        "You need to pass exactly one of these parameters. " \
         
     | 
| 
      
 81 
     | 
    
         
            +
                        "If you pass more than one of the --password... parameters together " \
         
     | 
| 
      
 82 
     | 
    
         
            +
                        "you will get an error.",
         
     | 
| 
      
 83 
     | 
    
         
            +
                  aliases: ["-p"]
         
     | 
| 
      
 84 
     | 
    
         
            +
                )
         
     | 
| 
      
 85 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 86 
     | 
    
         
            +
                  "password-environment-variable",
         
     | 
| 
      
 87 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 88 
     | 
    
         
            +
                  desc: "an environment variable that is set to your password",
         
     | 
| 
      
 89 
     | 
    
         
            +
                  aliases: ["-e"]
         
     | 
| 
      
 90 
     | 
    
         
            +
                )
         
     | 
| 
      
 91 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 92 
     | 
    
         
            +
                  "password-file",
         
     | 
| 
      
 93 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 94 
     | 
    
         
            +
                  desc: "a file containing your password. " \
         
     | 
| 
      
 95 
     | 
    
         
            +
                        "Note that to make it easier to create such files, " \
         
     | 
| 
      
 96 
     | 
    
         
            +
                        "trailing newlines will be removed. " \
         
     | 
| 
      
 97 
     | 
    
         
            +
                        "If you happen to have a password that ends in a newline (!), " \
         
     | 
| 
      
 98 
     | 
    
         
            +
                        "you can't use this parameter.",
         
     | 
| 
      
 99 
     | 
    
         
            +
                  aliases: ["-W"]
         
     | 
| 
      
 100 
     | 
    
         
            +
                )
         
     | 
| 
      
 101 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 102 
     | 
    
         
            +
                  "path",
         
     | 
| 
      
 103 
     | 
    
         
            +
                  type: "string",
         
     | 
| 
      
 104 
     | 
    
         
            +
                  desc: "the path of the directory where backups are to be saved. " \
         
     | 
| 
      
 105 
     | 
    
         
            +
                        "If the directory does not exists, it will be created. " \
         
     | 
| 
      
 106 
     | 
    
         
            +
                        "If not set, this is set to a diretory under the current path " \
         
     | 
| 
      
 107 
     | 
    
         
            +
                        "which is derived from the username, by replacing '@' with '_'.",
         
     | 
| 
      
 108 
     | 
    
         
            +
                  aliases: ["-P"]
         
     | 
| 
      
 109 
     | 
    
         
            +
                )
         
     | 
| 
      
 110 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 111 
     | 
    
         
            +
                  "folder",
         
     | 
| 
      
 112 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 113 
     | 
    
         
            +
                  desc: "a folder (this option can be given any number of times). " \
         
     | 
| 
      
 114 
     | 
    
         
            +
                        "By default, all of an account's folders are backed up. " \
         
     | 
| 
      
 115 
     | 
    
         
            +
                        "If you supply any --folder parameters, " \
         
     | 
| 
      
 116 
     | 
    
         
            +
                        "only **those** folders are backed up. " \
         
     | 
| 
      
 117 
     | 
    
         
            +
                        "See also --folder-blacklist.",
         
     | 
| 
      
 118 
     | 
    
         
            +
                  repeatable: true,
         
     | 
| 
      
 119 
     | 
    
         
            +
                  aliases: ["-F"]
         
     | 
| 
      
 120 
     | 
    
         
            +
                )
         
     | 
| 
      
 121 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 122 
     | 
    
         
            +
                  "folder-blacklist",
         
     | 
| 
      
 123 
     | 
    
         
            +
                  type: :boolean,
         
     | 
| 
      
 124 
     | 
    
         
            +
                  desc: "if this option is given, the list of --folders specified " \
         
     | 
| 
      
 125 
     | 
    
         
            +
                        "will treated as a blacklist - " \
         
     | 
| 
      
 126 
     | 
    
         
            +
                        "those folders will be skipped and " \
         
     | 
| 
      
 127 
     | 
    
         
            +
                        "all others will be backed up.",
         
     | 
| 
      
 128 
     | 
    
         
            +
                  default: false,
         
     | 
| 
      
 129 
     | 
    
         
            +
                  aliases: ["-b"]
         
     | 
| 
      
 130 
     | 
    
         
            +
                )
         
     | 
| 
      
 131 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 132 
     | 
    
         
            +
                  "mirror",
         
     | 
| 
      
 133 
     | 
    
         
            +
                  type: :boolean,
         
     | 
| 
      
 134 
     | 
    
         
            +
                  desc: "if this option is given, " \
         
     | 
| 
      
 135 
     | 
    
         
            +
                        "emails that are removed from the server " \
         
     | 
| 
      
 136 
     | 
    
         
            +
                        "will be removed from the local backup.",
         
     | 
| 
      
 137 
     | 
    
         
            +
                  aliases: ["-m"]
         
     | 
| 
      
 138 
     | 
    
         
            +
                )
         
     | 
| 
      
 139 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 140 
     | 
    
         
            +
                  "multi-fetch-size",
         
     | 
| 
      
 141 
     | 
    
         
            +
                  type: :numeric,
         
     | 
| 
      
 142 
     | 
    
         
            +
                  desc: "the number of emails to download at a time",
         
     | 
| 
      
 143 
     | 
    
         
            +
                  default: 1,
         
     | 
| 
      
 144 
     | 
    
         
            +
                  aliases: ["-n"]
         
     | 
| 
      
 145 
     | 
    
         
            +
                )
         
     | 
| 
      
 146 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 147 
     | 
    
         
            +
                  "connection-options",
         
     | 
| 
      
 148 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 149 
     | 
    
         
            +
                  desc: "an optional JSON string with options for the IMAP connection",
         
     | 
| 
      
 150 
     | 
    
         
            +
                  aliases: ["-o"]
         
     | 
| 
      
 151 
     | 
    
         
            +
                )
         
     | 
| 
      
 152 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 153 
     | 
    
         
            +
                  "download-strategy",
         
     | 
| 
      
 154 
     | 
    
         
            +
                  type: :string,
         
     | 
| 
      
 155 
     | 
    
         
            +
                  desc: "the download strategy to adopt. " \
         
     | 
| 
      
 156 
     | 
    
         
            +
                        "For details, see the documentation for this setting " \
         
     | 
| 
      
 157 
     | 
    
         
            +
                        "in the setup program.",
         
     | 
| 
      
 158 
     | 
    
         
            +
                  enum: %w(delay direct),
         
     | 
| 
      
 159 
     | 
    
         
            +
                  default: "delay",
         
     | 
| 
      
 160 
     | 
    
         
            +
                  aliases: ["-S"]
         
     | 
| 
      
 161 
     | 
    
         
            +
                )
         
     | 
| 
      
 162 
     | 
    
         
            +
                refresh_option
         
     | 
| 
      
 163 
     | 
    
         
            +
                method_option(
         
     | 
| 
      
 164 
     | 
    
         
            +
                  "reset-seen-flags-after-fetch",
         
     | 
| 
      
 165 
     | 
    
         
            +
                  type: :boolean,
         
     | 
| 
      
 166 
     | 
    
         
            +
                  desc: "reset 'Seen' flags after backup. " \
         
     | 
| 
      
 167 
     | 
    
         
            +
                        "For details, see the documentation for this setting " \
         
     | 
| 
      
 168 
     | 
    
         
            +
                        "in the setup program.",
         
     | 
| 
      
 169 
     | 
    
         
            +
                  aliases: ["-R"]
         
     | 
| 
      
 170 
     | 
    
         
            +
                )
         
     | 
| 
      
 171 
     | 
    
         
            +
                quiet_option
         
     | 
| 
      
 172 
     | 
    
         
            +
                verbose_option
         
     | 
| 
      
 173 
     | 
    
         
            +
                def backup
         
     | 
| 
      
 174 
     | 
    
         
            +
                  non_logging_options = Imap::Backup::Logger.setup_logging(options)
         
     | 
| 
      
 175 
     | 
    
         
            +
                  direct = Backup.new(non_logging_options)
         
     | 
| 
      
 176 
     | 
    
         
            +
                  direct.run
         
     | 
| 
      
 177 
     | 
    
         
            +
                end
         
     | 
| 
      
 178 
     | 
    
         
            +
              end
         
     | 
| 
      
 179 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/imap/backup/cli.rb
    CHANGED
    
    | 
         @@ -14,6 +14,7 @@ module Imap::Backup 
     | 
|
| 
       14 
14 
     | 
    
         
             
                autoload :Remote, "imap/backup/cli/remote"
         
     | 
| 
       15 
15 
     | 
    
         
             
                autoload :Restore, "imap/backup/cli/restore"
         
     | 
| 
       16 
16 
     | 
    
         
             
                autoload :Setup, "imap/backup/cli/setup"
         
     | 
| 
      
 17 
     | 
    
         
            +
                autoload :Single, "imap/backup/cli/single"
         
     | 
| 
       17 
18 
     | 
    
         
             
                autoload :Stats, "imap/backup/cli/stats"
         
     | 
| 
       18 
19 
     | 
    
         
             
                autoload :Transfer, "imap/backup/cli/transfer"
         
     | 
| 
       19 
20 
     | 
    
         
             
                autoload :Utils, "imap/backup/cli/utils"
         
     | 
| 
         @@ -78,13 +79,8 @@ module Imap::Backup 
     | 
|
| 
       78 
79 
     | 
    
         
             
                accounts_option
         
     | 
| 
       79 
80 
     | 
    
         
             
                config_option
         
     | 
| 
       80 
81 
     | 
    
         
             
                quiet_option
         
     | 
| 
      
 82 
     | 
    
         
            +
                refresh_option
         
     | 
| 
       81 
83 
     | 
    
         
             
                verbose_option
         
     | 
| 
       82 
     | 
    
         
            -
                method_option(
         
     | 
| 
       83 
     | 
    
         
            -
                  "refresh",
         
     | 
| 
       84 
     | 
    
         
            -
                  type: :boolean,
         
     | 
| 
       85 
     | 
    
         
            -
                  desc: "in 'keep all emails' mode, update flags for messages that are already downloaded",
         
     | 
| 
       86 
     | 
    
         
            -
                  aliases: ["-r"]
         
     | 
| 
       87 
     | 
    
         
            -
                )
         
     | 
| 
       88 
84 
     | 
    
         
             
                def backup
         
     | 
| 
       89 
85 
     | 
    
         
             
                  non_logging_options = Imap::Backup::Logger.setup_logging(options)
         
     | 
| 
       90 
86 
     | 
    
         
             
                  Backup.new(non_logging_options).run
         
     | 
| 
         @@ -239,6 +235,9 @@ module Imap::Backup 
     | 
|
| 
       239 
235 
     | 
    
         
             
                  CLI::Setup.new(non_logging_options).run
         
     | 
| 
       240 
236 
     | 
    
         
             
                end
         
     | 
| 
       241 
237 
     | 
    
         | 
| 
      
 238 
     | 
    
         
            +
                desc "single SUBCOMMAND [OPTIONS]", "Run actions on a single account"
         
     | 
| 
      
 239 
     | 
    
         
            +
                subcommand "single", Single
         
     | 
| 
      
 240 
     | 
    
         
            +
             
     | 
| 
       242 
241 
     | 
    
         
             
                desc "stats EMAIL [OPTIONS]", "Print stats for each account folder"
         
     | 
| 
       243 
242 
     | 
    
         
             
                long_desc <<~DESC
         
     | 
| 
       244 
243 
     | 
    
         
             
                  For each account folder, lists three counts of emails:
         
     | 
    
        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:  
     | 
| 
      
 4 
     | 
    
         
            +
              version: 14.0.0
         
     | 
| 
       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-10- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2023-10-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: highline
         
     | 
| 
         @@ -136,6 +136,7 @@ files: 
     | 
|
| 
       136 
136 
     | 
    
         
             
            - docs/delimiters-and-prefixes.md
         
     | 
| 
       137 
137 
     | 
    
         
             
            - docs/development.md
         
     | 
| 
       138 
138 
     | 
    
         
             
            - docs/migrate-server-keep-address.md
         
     | 
| 
      
 139 
     | 
    
         
            +
            - docs/performance.md
         
     | 
| 
       139 
140 
     | 
    
         
             
            - imap-backup.gemspec
         
     | 
| 
       140 
141 
     | 
    
         
             
            - lib/cli_coverage.rb
         
     | 
| 
       141 
142 
     | 
    
         
             
            - lib/email/mboxrd/message.rb
         
     | 
| 
         @@ -165,6 +166,8 @@ files: 
     | 
|
| 
       165 
166 
     | 
    
         
             
            - lib/imap/backup/cli/remote.rb
         
     | 
| 
       166 
167 
     | 
    
         
             
            - lib/imap/backup/cli/restore.rb
         
     | 
| 
       167 
168 
     | 
    
         
             
            - lib/imap/backup/cli/setup.rb
         
     | 
| 
      
 169 
     | 
    
         
            +
            - lib/imap/backup/cli/single.rb
         
     | 
| 
      
 170 
     | 
    
         
            +
            - lib/imap/backup/cli/single/backup.rb
         
     | 
| 
       168 
171 
     | 
    
         
             
            - lib/imap/backup/cli/stats.rb
         
     | 
| 
       169 
172 
     | 
    
         
             
            - lib/imap/backup/cli/transfer.rb
         
     | 
| 
       170 
173 
     | 
    
         
             
            - lib/imap/backup/cli/utils.rb
         
     |