]> git.g-eek.se Git - interimap.git/commitdiff
interimap: Refactor --target handling.
authorGuilhem Moulin <guilhem@fripost.org>
Sun, 19 May 2019 12:53:08 +0000 (14:53 +0200)
committerGuilhem Moulin <guilhem@fripost.org>
Sun, 26 May 2019 22:07:30 +0000 (00:07 +0200)
Also, accept comma-separated values for --target.

Changelog
interimap

index 4dd8800d2c4ab14d9ea6f80843e90d9fe237864e..791df24ba63d727f90037e75ffd77e7d5ff83d30 100644 (file)
--- a/Changelog
+++ b/Changelog
@@ -24,6 +24,7 @@ interimap (0.5) upstream;
    one selector could be used for the initial LIST command.
  - interimap: unlike what the documentation said, 'ignore-mailbox' was
    not ignored when names were specified as command line arguments.
+ - interimap: accept comma-separated values for --target.
 
  -- Guilhem Moulin <guilhem@fripost.org>  Fri, 10 May 2019 00:58:14 +0200
 
index c09d51f5fdb7b856e6bb891f9a8f5018514c0f25..07c2b24691497e2ae9c95e2f4773cf1ffeba273b 100755 (executable)
--- a/interimap
+++ b/interimap
@@ -129,6 +129,15 @@ my ($DBFILE, $LOGGER_FD, %LIST);
             # RFC 5819 - Returning STATUS Information in Extended LIST
             unless $CONFIG{notify};
     }
+    if (defined (my $t = $CONFIG{target})) {
+        @$t = map { split(",", $_) } @$t;
+        die "Invalid target $_\n" foreach grep !/^(?:local|remote|database)$/, @$t;
+        $CONFIG{target} = {};
+        $CONFIG{target}->{$_} = 1 foreach @$t;
+    } else {
+        $CONFIG{target} = {};
+        $CONFIG{target}->{$_} = 1 foreach qw/local remote database/;
+    }
 }
 my $DBH;
 
@@ -384,11 +393,11 @@ if (defined $COMMAND and $COMMAND eq 'delete') {
         # there is a race condition where the mailbox could have
         # appeared meanwhile
         foreach my $name (qw/local remote/) {
-            next if defined $CONFIG{target} and !grep {$_ eq $name} @{$CONFIG{target}};
+            next unless $CONFIG{target}->{$name};
             $IMAP->{$name}->{client}->delete($mailbox) if mbx_exists($name, $mailbox);
         }
 
-        if (defined $idx and (!defined $CONFIG{target} or grep {$_ eq 'database'} @{$CONFIG{target}})) {
+        if (defined $idx and $CONFIG{target}->{database}) {
             my $r1 = $sth_delete_mapping->execute($idx);
             msg('database', "WARNING: `DELETE FROM mapping WHERE idx = $idx` failed") unless $r1;
             my $r2 = $sth_delete_local->execute($idx);
@@ -422,7 +431,7 @@ elsif (defined $COMMAND and $COMMAND eq 'rename') {
     # issue the RENAME command, then the server would reply with a
     # tagged NO response
     foreach my $name (qw/local remote/) {
-        next if defined $CONFIG{target} and !grep {$_ eq $name} @{$CONFIG{target}};
+        next unless $CONFIG{target}->{$name};
         fail($name, "Mailbox $to exists.  Run `$NAME --target=$name --delete $to` to delete.")
             if mbx_exists($name, $to);
     }
@@ -430,20 +439,19 @@ elsif (defined $COMMAND and $COMMAND eq 'rename') {
     # ensure the target name doesn't already exist in the database
     $STH_GET_INDEX->execute($to);
     fail("database", "Mailbox $to exists.  Run `$NAME --target=database --delete $to` to delete.")
-        if defined $STH_GET_INDEX->fetch()
-            and (!defined $CONFIG{target} or grep {$_ eq 'database'} @{$CONFIG{target}});
+        if defined $STH_GET_INDEX->fetch() and $CONFIG{target}->{database};
 
 
     # rename $from to $to on servers where $from exists.  again there is
     # a race condition, but if $to has been created meanwhile the server
     # will reply with a tagged NO response
     foreach my $name (qw/local remote/) {
-        next if defined $CONFIG{target} and !grep {$_ eq $name} @{$CONFIG{target}};
+        next unless $CONFIG{target}->{$name};
         $IMAP->{$name}->{client}->rename($from, $to) if mbx_exists($name, $from);
     }
 
     # rename from to $to in the database
-    if (defined $idx and (!defined $CONFIG{target} or grep {$_ eq 'database'} @{$CONFIG{target}})) {
+    if (defined $idx and $CONFIG{target}->{database}) {
         my $sth_rename_mailbox = $DBH->prepare(q{UPDATE mailboxes SET mailbox = ? WHERE idx = ?});
         my $r = $sth_rename_mailbox->execute($to, $idx);
         msg('database', "WARNING: `UPDATE mailboxes SET mailbox = ".$DBH->quote($to)." WHERE idx = $idx` failed") unless $r;