From 505119a569f91f3c38f738db3becab019adbd4ca Mon Sep 17 00:00:00 2001 From: Bron Gondwana Date: Thu, 19 Oct 2023 15:50:56 -0400 Subject: [PATCH 1/2] DList: non-destructive sort order code (from Rob M review) --- perl/imap/Cyrus/DList.pm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/perl/imap/Cyrus/DList.pm b/perl/imap/Cyrus/DList.pm index 1aa737c452..18d4d29ef9 100644 --- a/perl/imap/Cyrus/DList.pm +++ b/perl/imap/Cyrus/DList.pm @@ -93,16 +93,19 @@ sub add_perl { elsif (ref($val) eq 'HASH') { my $child = $Self->add_kvlist($key); - my $order = delete $val->{__kvlist_order}; + my %keys = map { $_ => 1 } grep { not m/^_/ } keys %$val; - if ($order) { - die "Unknown order " . ref($order) if ref($order) ne 'ARRAY'; - foreach my $k (grep { exists $val->{$_} } @{$order}) { - $child->add_perl($k, delete $val->{$k}); - } + my $order = $val->{__kvlist_order} || []; + die "Unknown order " . ref($order) if ref($order) ne 'ARRAY'; + + # if there's a pre-defined key order, add all those keys first, in order + foreach my $k (grep { exists $val->{$_} } @$order) { + $child->add_perl($k, $val->{$k}); + delete $keys{$k}; } - $child->add_perl($_, $val->{$_}) for sort keys %$val; + # add the remaining keys in sort order + $child->add_perl($_, $val->{$_}) for sort keys %keys; } elsif (ref($val) eq 'REF') { @@ -327,7 +330,7 @@ sub as_perl { $kvlist->{$datum->{key}} = $datum->as_perl(); } - $kvlist->{__kvlist_order} = [ @order ]; + $kvlist->{__kvlist_order} = \@order; return $kvlist; } elsif ($Self->{type} eq 'list') { From 529c0b87fec486baa93fe6d585626b408cd6720f Mon Sep 17 00:00:00 2001 From: Bron Gondwana Date: Thu, 19 Oct 2023 16:22:07 -0400 Subject: [PATCH 2/2] Cyrus::AccountSync - skip any mailbox that went away during fetch --- perl/imap/Cyrus/AccountSync.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/perl/imap/Cyrus/AccountSync.pm b/perl/imap/Cyrus/AccountSync.pm index bf63aef454..fc3ba0fb71 100644 --- a/perl/imap/Cyrus/AccountSync.pm +++ b/perl/imap/Cyrus/AccountSync.pm @@ -92,6 +92,7 @@ sub dump_user { for my $folder (@{$info->{MAILBOX}}) { next if $folder->{MBOXTYPE}; # don't dump special folders my $fi = $self->{sync}->dlwrite("GET", "FULLMAILBOX", $folder->{MBOXNAME}); + next unless $fi->{MAILBOX}; # folder went away? my @emails; for my $record (@{$fi->{MAILBOX}[0]{RECORD}||[]}) { my $res = $self->{sync}->dlwrite("GET", "FETCH", {